dosinabox / g2_classic

Проект переноса чистого оригинала Готики 2 без аддона на движок Г2НВ версии 2.6 с максимальной адаптацией скриптов.
https://worldofplayers.ru/threads/41796
The Unlicense
4 stars 2 forks source link

Большой огненный шар / урон #34

Closed Kor-Angar closed 3 years ago

Kor-Angar commented 5 years ago

надо проверить в скриптах урон от большого огненного шара и Большой Огненный Шторм а так же посмотреть как он считается image

dosinabox commented 5 years ago

В скриптах: Большой огненный шар: 100-300 Большая огненная буря: 100-300

Kor-Angar commented 5 years ago

Он убивает  аксимальным зарядом элитного орка. А огненный дождь элитного орка не убивает. Т. Е. У него ущерб фактический больше 300. 350 или 400.Я не успел протестить нормально(с марвином) на драконе. Но дракона огненного он убивал с двух. 

Kor-Angar commented 5 years ago

А по манне нет инфы? Быстрый каст со 100 ушербом по ощущениям происходит за 15 маны. Хотя иногда мне кажется и за 5 маны.Какой шаг ущерба идёт у этого закла?100-125-150-175 и так далееИли 100-150-200 и так далееИли 100-175-250 и так далееИли 100-200-300 Или ещё как то? Вообщем вот эти заклинания они прям рабочие, рабочие. Я через них все время магом играл в Готики 2 классик.  Вчера прям что называется "прочувствовал" 😀Очень хочется понять их логику работы. P. S. И шаровая молния накопительная очень хороша так как у неё ущерб выше чем у молнии с быстрым кастом. 

Kor-Angar commented 4 years ago

попробовал шарахнуть по герою

Большой Огненный Шар image 350+50=400

Большой Огненный Шторм image 335+65=400


а можешь показать в скриптах как рассчитывается урон?

Kor-Angar commented 4 years ago

это из Ночь Ворона

// ******************
// SPL_ChargeFireball
// ******************

const int SPL_Cost_ChargeFireball       = 160; //4*40
const int STEP_ChargeFireball           = 40;
const int SPL_Damage_ChargeFireball     = 75;

INSTANCE Spell_ChargeFireball (C_Spell_Proto)
{
    time_per_mana           = 30;
    damage_per_level        = SPL_Damage_ChargeFireball;
    damageType              = DAM_MAGIC;    
    canTurnDuringInvest     = TRUE;
};

func int Spell_Logic_ChargeFireball (var int manaInvested) 
{
    if (self.attribute[ATR_MANA]<STEP_ChargeFireball) 
    {
        return SPL_DONTINVEST;  
    };

    if (manaInvested <= STEP_ChargeFireball*1)
    {
        self.aivar[AIV_SpellLevel] = 1; //Start mit Level 1
        return SPL_STATUS_CANINVEST_NO_MANADEC;
    }
    else if (manaInvested > (STEP_ChargeFireball*1))
    && (self.aivar[AIV_SpellLevel] <= 1)
    {
        self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball);

        if (self.attribute[ATR_MANA]<0) 
        {
            self.attribute[ATR_MANA]=0;
        };

        self.aivar[AIV_SpellLevel] = 2;
        return SPL_NEXTLEVEL; //Lev2 erreicht
    }
    else if (manaInvested > (STEP_ChargeFireball*2))
    && (self.aivar[AIV_SpellLevel] <= 2)
    {
        self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball);

        if (self.attribute[ATR_MANA]<0) 
        {
            self.attribute[ATR_MANA]=0;
        };
        self.aivar[AIV_SpellLevel] = 3;
        return SPL_NEXTLEVEL; //Lev3 erreicht
    }
    else if (manaInvested > (STEP_ChargeFireball*3))
    && (self.aivar[AIV_SpellLevel] <= 3)
    {
        self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball);

        if (self.attribute[ATR_MANA]<0) 
        {
            self.attribute[ATR_MANA]=0;
        };  
        self.aivar[AIV_SpellLevel] = 4;
        return SPL_NEXTLEVEL; //Lev4 erreicht
    }
    else if (manaInvested > (STEP_ChargeFireball*3))
    && (self.aivar[AIV_SpellLevel] == 4)
    {
        return SPL_DONTINVEST;  
    };

    return SPL_STATUS_CANINVEST_NO_MANADEC; 
};

func void Spell_Cast_ChargeFireball(var int spellLevel)
{
    self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball);

    if (self.attribute[ATR_MANA]<0) 
    {
        self.attribute[ATR_MANA]=0;
    };

    self.aivar[AIV_SelectSpell] += 1;
};
Kor-Angar commented 4 years ago

Готика 2 Классик

const int SPL_COST_CHARGEFIREBALL = 75; // 75 на 4 не делится :-) 
const int SPL_DAMAGE_CHARGEFIREBALL = 100;

instance SPELL_CHARGEFIREBALL(C_SPELL_PROTO)
{
    time_per_mana = 120;
    damage_per_level = SPL_DAMAGE_CHARGEFIREBALL;
    damagetype = DAM_MAGIC;
    canturnduringinvest = TRUE;
};

func int spell_logic_chargefireball(var int manainvested)
{
    if(manainvested == 0)
    {
        return SPL_FORCEINVEST + ((SPL_COST_CHARGEFIREBALL * 2) / 10); // 15 маны?
    };
    if((manainvested == ((SPL_COST_CHARGEFIREBALL * 3) / 10))  // 22,5? 
|| (manainvested == ((SPL_COST_CHARGEFIREBALL * 5) / 10))  // 37,5?
|| (manainvested == ((SPL_COST_CHARGEFIREBALL * 8) / 10)))  // 60 маны?
    {
        return SPL_NEXTLEVEL;
    };
    if(manainvested >= SPL_COST_CHARGEFIREBALL)
    {
        return SPL_DONTINVEST;
    };
    return SPL_RECEIVEINVEST;
};

урон за уровень = 100 всего 4 уровня 1 уровень 100 урона за 15 маны 2 уровень 200 урона за 15+22,5 маны 3 уровень 300 урона за 15+37,5 маны 4 уровень 400 урона за 15+60 маны

так что ли?

https://github.com/dosinabox/g2_classic/blob/master/PrjGothic/AI/Magic/Spells/spell_chargefireball.d

upd всего 4 уровня 1 уровень 100 урона за 15 маны 2 уровень 200 урона за 23-36 маны 3 уровень 300 урона за 38-59 маны 4 уровень 400 урона за 60-72 маны

Kor-Angar commented 4 years ago

в игре мана отнимается минимальная цена каста 15

а потом бывало 26, 40, 72. и они все делятся на 8, т.е. соответствуют расходу 8 ману в секунду.

значит ли что manainvested всегда кратна 8?

как тогда работает вот эта часть ? if(manainvested >= SPL_COST_CHARGEFIREBALL)

Kor-Angar commented 4 years ago

4 уровень 400 урона за 15+60 маны

или фактически 400 урона можно нанести просто потратив 8*x > 60 т.е. шар за 64 маны и за 72 маны будут наносить одинаковый урон? пойду попробую проверить :-)

Kor-Angar commented 4 years ago

т.е. шар за 64 маны и за 72 маны будут наносить одинаковый урон? пойду попробую проверить :-)

image получилось за 61 ману нанести 400 урона

image

upd всего 4 уровня 1 уровень 100 урона за 15 маны 2 уровень 200 урона за 23-36 маны 3 уровень 300 урона за 38-59 маны 4 уровень 400 урона за 60-72 маны

Kor-Angar commented 3 years ago

попробую сделать баланс Готика 2 классик, а логику из Готика 2 НВ

// ******************
// SPL_ChargeFireball
// ******************
const int SPL_Cost_ChargeFireball       = 75;   // макс. стоимость маны. неиспользуется. 75 на 4 не делится :-(
const int STEP_ChargeFireball           = 19;   // мана за уровень. 19*4=76.
const int SPL_Damage_ChargeFireball     = 100;  // урон за уровень. макс урон 100*4

// Готика 2 НВ
INSTANCE Spell_ChargeFireball (C_Spell_Proto)
{

    // time_per_mana  - время в мс, требуемое для инвестирования маны на один уровень - 500м
    time_per_mana           = 120;  // Готика 2 Классик
    //time_per_mana         = 30;   // Готика 2 НВ

    damage_per_level        = SPL_Damage_ChargeFireball;
    damageType              = DAM_MAGIC;    
    canTurnDuringInvest     = TRUE;
};

func int Spell_Logic_ChargeFireball (var int manaInvested) 
{
    if (self.attribute[ATR_MANA]<STEP_ChargeFireball) 
    {
        return SPL_DONTINVEST;  
    };

    if (manaInvested <= STEP_ChargeFireball*1)
    {
        self.aivar[AIV_SpellLevel] = 1; //Start mit Level 1
        return SPL_STATUS_CANINVEST_NO_MANADEC;
    }
    else if (manaInvested > (STEP_ChargeFireball*1))
    && (self.aivar[AIV_SpellLevel] <= 1)
    {
        self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball);

        if (self.attribute[ATR_MANA]<0) 
        {
            self.attribute[ATR_MANA]=0;
        };

        self.aivar[AIV_SpellLevel] = 2;
        return SPL_NEXTLEVEL; //Lev2 erreicht
    }
    else if (manaInvested > (STEP_ChargeFireball*2))
    && (self.aivar[AIV_SpellLevel] <= 2)
    {
        self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball);

        if (self.attribute[ATR_MANA]<0) 
        {
            self.attribute[ATR_MANA]=0;
        };
        self.aivar[AIV_SpellLevel] = 3;
        return SPL_NEXTLEVEL; //Lev3 erreicht
    }
    else if (manaInvested > (STEP_ChargeFireball*3))
    && (self.aivar[AIV_SpellLevel] <= 3)
    {
        self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball);

        if (self.attribute[ATR_MANA]<0) 
        {
            self.attribute[ATR_MANA]=0;
        };  
        self.aivar[AIV_SpellLevel] = 4;
        return SPL_NEXTLEVEL; //Lev4 erreicht
    }
    else if (manaInvested > (STEP_ChargeFireball*3))
    && (self.aivar[AIV_SpellLevel] == 4)
    {
        return SPL_DONTINVEST;  
    };

    return SPL_STATUS_CANINVEST_NO_MANADEC; 
};

func void Spell_Cast_ChargeFireball(var int spellLevel)
{
    self.attribute[ATR_MANA] = (self.attribute[ATR_MANA] - STEP_ChargeFireball);

    if (self.attribute[ATR_MANA]<0) 
    {
        self.attribute[ATR_MANA]=0;
    };

    self.aivar[AIV_SelectSpell] += 1;
};
Kor-Angar commented 3 years ago

Kor-Angar commented on 13 Mar 2020 •

млин. надо было в субботу написать. был бы ровно год :-D

Kor-Angar commented 3 years ago

а это что такое?

    const int SPL_PYRO_DAMAGE_PER_SEC = 20; // wird in ZS_Pyro (Pyrokinese-Opfer) benutzt, dort KEIN Rьstungsschutz!

"догорание" ?