Closed Kor-Angar closed 3 years ago
В скриптах: Большой огненный шар: 100-300 Большая огненная буря: 100-300
Он убивает аксимальным зарядом элитного орка. А огненный дождь элитного орка не убивает. Т. Е. У него ущерб фактический больше 300. 350 или 400.Я не успел протестить нормально(с марвином) на драконе. Но дракона огненного он убивал с двух.
А по манне нет инфы? Быстрый каст со 100 ушербом по ощущениям происходит за 15 маны. Хотя иногда мне кажется и за 5 маны.Какой шаг ущерба идёт у этого закла?100-125-150-175 и так далееИли 100-150-200 и так далееИли 100-175-250 и так далееИли 100-200-300 Или ещё как то? Вообщем вот эти заклинания они прям рабочие, рабочие. Я через них все время магом играл в Готики 2 классик. Вчера прям что называется "прочувствовал" 😀Очень хочется понять их логику работы. P. S. И шаровая молния накопительная очень хороша так как у неё ущерб выше чем у молнии с быстрым кастом.
попробовал шарахнуть по герою
Большой Огненный Шар 350+50=400
Большой Огненный Шторм 335+65=400
а можешь показать в скриптах как рассчитывается урон?
это из Ночь Ворона
// ******************
// 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;
};
Готика 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 маны
в игре мана отнимается минимальная цена каста 15
а потом бывало 26, 40, 72. и они все делятся на 8, т.е. соответствуют расходу 8 ману в секунду.
значит ли что manainvested всегда кратна 8?
как тогда работает вот эта часть ? if(manainvested >= SPL_COST_CHARGEFIREBALL)
4 уровень 400 урона за 15+60 маны
или фактически 400 урона можно нанести просто потратив 8*x > 60 т.е. шар за 64 маны и за 72 маны будут наносить одинаковый урон? пойду попробую проверить :-)
т.е. шар за 64 маны и за 72 маны будут наносить одинаковый урон? пойду попробую проверить :-)
получилось за 61 ману нанести 400 урона
upd всего 4 уровня 1 уровень 100 урона за 15 маны 2 уровень 200 урона за 23-36 маны 3 уровень 300 урона за 38-59 маны 4 уровень 400 урона за 60-72 маны
попробую сделать баланс Готика 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 on 13 Mar 2020 •
млин. надо было в субботу написать. был бы ровно год :-D
а это что такое?
const int SPL_PYRO_DAMAGE_PER_SEC = 20; // wird in ZS_Pyro (Pyrokinese-Opfer) benutzt, dort KEIN Rьstungsschutz!
"догорание" ?
надо проверить в скриптах урон от большого огненного шара и Большой Огненный Шторм а так же посмотреть как он считается