|
|
@@ -1684,171 +1684,172 @@ const Bonus * CStack::getEffect( ui16 id, int turn /*= 0*/ ) const
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-void CStack::stackEffectToFeature(BonusList & sf, const Bonus & sse)
|
|
|
+void CStack::stackEffectToFeature(std::vector<Bonus> & sf, const Bonus & sse)
|
|
|
{
|
|
|
- // si32 power = VLC->spellh->spells[sse.id]->powers[sse.val];
|
|
|
- // Bonus * bonus = getBonus(Selector::typeSybtype(Bonus::SPECIAL_PECULIAR_ENCHANT, sse.id));
|
|
|
- // if (bonus)
|
|
|
- // {
|
|
|
- // switch(bonus->additionalInfo)
|
|
|
- // {
|
|
|
- // case 0: //normal
|
|
|
- // switch(type->level)
|
|
|
- // {
|
|
|
- // case 1: case 2:
|
|
|
- // power += 3; //it doesn't necessarily make sense for some spells, use it wisely
|
|
|
- // break;
|
|
|
- // case 3: case 4:
|
|
|
- // power += 2;
|
|
|
- // break;
|
|
|
- // case 5: case 6:
|
|
|
- // power += 1;
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // break;
|
|
|
- // case 1: //only Coronius as yet
|
|
|
- // power = std::max(5 - type->level, 0);
|
|
|
- // break;
|
|
|
- // }
|
|
|
- // }
|
|
|
- //
|
|
|
- // switch(sse.id)
|
|
|
- // {
|
|
|
- // case 27: //shield
|
|
|
- // sf.push_back(featureGenerator(Bonus::GENERAL_DAMAGE_REDUCTION, 0, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 28: //air shield
|
|
|
- // sf.push_back(featureGenerator(Bonus::GENERAL_DAMAGE_REDUCTION, 1, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 29: //fire shield
|
|
|
- // sf.push_back(featureGenerator(Bonus::FIRE_SHIELD, 0, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 30: //protection from air
|
|
|
- // sf.push_back(featureGenerator(Bonus::SPELL_DAMAGE_REDUCTION, 0, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 31: //protection from fire
|
|
|
- // sf.push_back(featureGenerator(Bonus::SPELL_DAMAGE_REDUCTION, 1, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 32: //protection from water
|
|
|
- // sf.push_back(featureGenerator(Bonus::SPELL_DAMAGE_REDUCTION, 2, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 33: //protection from earth
|
|
|
- // sf.push_back(featureGenerator(Bonus::SPELL_DAMAGE_REDUCTION, 3, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 34: //anti-magic
|
|
|
- // sf.push_back(featureGenerator(Bonus::LEVEL_SPELL_IMMUNITY, 0, power - 1, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 41: //bless
|
|
|
- // if (hasBonusOfType(Bonus::SPECIAL_BLESS_DAMAGE, 41)) //TODO: better handling of bonus percentages
|
|
|
- // {
|
|
|
- // int damagePercent = dynamic_cast<const CGHeroInstance*>(armyObj)->level * valOfBonuses(Bonus::SPECIAL_BLESS_DAMAGE, 41) / type->level;
|
|
|
- // sf.push_back(featureGenerator(Bonus::CREATURE_DAMAGE, 0, damagePercent, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // sf.back().valType = Bonus::PERCENT_TO_ALL;
|
|
|
- // }
|
|
|
- // sf.push_back(featureGenerator(Bonus::ALWAYS_MAXIMUM_DAMAGE, -1, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 42: //curse
|
|
|
- // sf.push_back(featureGenerator(Bonus::ALWAYS_MINIMUM_DAMAGE, -1, -1 * power, sse.turnsRemain, sse.val >= 2 ? 20 : 0));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 43: //bloodlust
|
|
|
- // sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, power, sse.turnsRemain, 0, Bonus::ONLY_MELEE_FIGHT));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 44: //precision
|
|
|
- // sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, power, sse.turnsRemain, 0, Bonus::ONLY_DISTANCE_FIGHT));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 45: //weakness
|
|
|
- // sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, -1 * power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 46: //stone skin
|
|
|
- // sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 47: //disrupting ray
|
|
|
- // sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE, -1 * power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 48: //prayer
|
|
|
- // sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // sf.push_back(featureGenerator(Bonus::STACKS_SPEED, 0, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 49: //mirth
|
|
|
- // sf.push_back(featureGenerator(Bonus::MORALE, 0, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 50: //sorrow
|
|
|
- // sf.push_back(featureGenerator(Bonus::MORALE, 0, -1 * power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 51: //fortune
|
|
|
- // sf.push_back(featureGenerator(Bonus::LUCK, 0, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 52: //misfortune
|
|
|
- // sf.push_back(featureGenerator(Bonus::LUCK, 0, -1 * power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 53: //haste
|
|
|
- // sf.push_back(featureGenerator(Bonus::STACKS_SPEED, 0, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 54: //slow
|
|
|
- // sf.push_back(featureGeneratorVT(Bonus::STACKS_SPEED, 0, -1 * ( 100 - power ), sse.turnsRemain, Bonus::PERCENT_TO_ALL));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 55: //slayer
|
|
|
- // if (bonus) //Coronius
|
|
|
- // {
|
|
|
- // sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // }
|
|
|
- // sf.push_back(featureGenerator(Bonus::SLAYER, 0, sse.val, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 56: //frenzy
|
|
|
- // sf.push_back(featureGenerator(Bonus::IN_FRENZY, 0, VLC->spellh->spells[56]->powers[sse.val]/100.0, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 58: //counterstrike
|
|
|
- // sf.push_back(featureGenerator(Bonus::ADDITIONAL_RETALIATION, 0, power, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 59: //bersek
|
|
|
- // sf.push_back(featureGenerator(Bonus::ATTACKS_NEAREST_CREATURE, 0, sse.val, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 60: //hypnotize
|
|
|
- // sf.push_back(featureGenerator(Bonus::HYPNOTIZED, 0, sse.val, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 61: //forgetfulness
|
|
|
- // sf.push_back(featureGenerator(Bonus::FORGETFULL, 0, sse.val, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // case 62: //blind
|
|
|
- // sf.push_back(makeFeature(Bonus::NOT_ACTIVE, Bonus::UNITL_BEING_ATTACKED | Bonus::N_TURNS, 0, 0, Bonus::SPELL_EFFECT, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // sf.push_back(makeFeature(Bonus::GENERAL_ATTACK_REDUCTION, Bonus::UNTIL_ATTACK | Bonus::N_TURNS, 0, power, Bonus::SPELL_EFFECT, sse.turnsRemain));
|
|
|
- // sf.back().id = sse.id;
|
|
|
- // break;
|
|
|
- // }
|
|
|
+ si32 power = VLC->spellh->spells[sse.id]->powers[sse.val];
|
|
|
+ //why, why, WHY this code is here?!?
|
|
|
+// Bonus * bonus = getBonus(Selector::typeSybtype(Bonus::SPECIAL_PECULIAR_ENCHANT, sse.id));
|
|
|
+// if (bonus)
|
|
|
+// {
|
|
|
+// switch(bonus->additionalInfo)
|
|
|
+// {
|
|
|
+// case 0: //normal
|
|
|
+// switch(type->level)
|
|
|
+// {
|
|
|
+// case 1: case 2:
|
|
|
+// power += 3; //it doesn't necessarily make sense for some spells, use it wisely
|
|
|
+// break;
|
|
|
+// case 3: case 4:
|
|
|
+// power += 2;
|
|
|
+// break;
|
|
|
+// case 5: case 6:
|
|
|
+// power += 1;
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// break;
|
|
|
+// case 1: //only Coronius as yet
|
|
|
+// power = std::max(5 - type->level, 0);
|
|
|
+// break;
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+ switch(sse.id)
|
|
|
+ {
|
|
|
+ case 27: //shield
|
|
|
+ sf.push_back(featureGenerator(Bonus::GENERAL_DAMAGE_REDUCTION, 0, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 28: //air shield
|
|
|
+ sf.push_back(featureGenerator(Bonus::GENERAL_DAMAGE_REDUCTION, 1, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 29: //fire shield
|
|
|
+ sf.push_back(featureGenerator(Bonus::FIRE_SHIELD, 0, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 30: //protection from air
|
|
|
+ sf.push_back(featureGenerator(Bonus::SPELL_DAMAGE_REDUCTION, 0, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 31: //protection from fire
|
|
|
+ sf.push_back(featureGenerator(Bonus::SPELL_DAMAGE_REDUCTION, 1, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 32: //protection from water
|
|
|
+ sf.push_back(featureGenerator(Bonus::SPELL_DAMAGE_REDUCTION, 2, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 33: //protection from earth
|
|
|
+ sf.push_back(featureGenerator(Bonus::SPELL_DAMAGE_REDUCTION, 3, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 34: //anti-magic
|
|
|
+ sf.push_back(featureGenerator(Bonus::LEVEL_SPELL_IMMUNITY, 0, power - 1, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 41: //bless
|
|
|
+// if (hasBonusOfType(Bonus::SPECIAL_BLESS_DAMAGE, 41)) //TODO: better handling of bonus percentages
|
|
|
+// {
|
|
|
+// int damagePercent = dynamic_cast<const CGHeroInstance*>(armyObj)->level * valOfBonuses(Bonus::SPECIAL_BLESS_DAMAGE, 41) / type->level;
|
|
|
+// sf.push_back(featureGenerator(Bonus::CREATURE_DAMAGE, 0, damagePercent, sse.turnsRemain));
|
|
|
+// sf.back().id = sse.id;
|
|
|
+// sf.back().valType = Bonus::PERCENT_TO_ALL;
|
|
|
+// }
|
|
|
+ sf.push_back(featureGenerator(Bonus::ALWAYS_MAXIMUM_DAMAGE, -1, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 42: //curse
|
|
|
+ sf.push_back(featureGenerator(Bonus::ALWAYS_MINIMUM_DAMAGE, -1, -1 * power, sse.turnsRemain, sse.val >= 2 ? 20 : 0));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 43: //bloodlust
|
|
|
+ sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, power, sse.turnsRemain, 0, Bonus::ONLY_MELEE_FIGHT));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 44: //precision
|
|
|
+ sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, power, sse.turnsRemain, 0, Bonus::ONLY_DISTANCE_FIGHT));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 45: //weakness
|
|
|
+ sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, -1 * power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 46: //stone skin
|
|
|
+ sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 47: //disrupting ray
|
|
|
+ sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE, -1 * power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 48: //prayer
|
|
|
+ sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ sf.push_back(featureGenerator(Bonus::STACKS_SPEED, 0, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 49: //mirth
|
|
|
+ sf.push_back(featureGenerator(Bonus::MORALE, 0, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 50: //sorrow
|
|
|
+ sf.push_back(featureGenerator(Bonus::MORALE, 0, -1 * power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 51: //fortune
|
|
|
+ sf.push_back(featureGenerator(Bonus::LUCK, 0, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 52: //misfortune
|
|
|
+ sf.push_back(featureGenerator(Bonus::LUCK, 0, -1 * power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 53: //haste
|
|
|
+ sf.push_back(featureGenerator(Bonus::STACKS_SPEED, 0, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 54: //slow
|
|
|
+ sf.push_back(featureGeneratorVT(Bonus::STACKS_SPEED, 0, -1 * ( 100 - power ), sse.turnsRemain, Bonus::PERCENT_TO_ALL));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 55: //slayer
|
|
|
+// if (bonus) //Coronius
|
|
|
+// {
|
|
|
+// sf.push_back(featureGenerator(Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK, power, sse.turnsRemain));
|
|
|
+// sf.back().id = sse.id;
|
|
|
+// }
|
|
|
+ sf.push_back(featureGenerator(Bonus::SLAYER, 0, sse.val, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 56: //frenzy
|
|
|
+ sf.push_back(featureGenerator(Bonus::IN_FRENZY, 0, VLC->spellh->spells[56]->powers[sse.val]/100.0, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 58: //counterstrike
|
|
|
+ sf.push_back(featureGenerator(Bonus::ADDITIONAL_RETALIATION, 0, power, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 59: //bersek
|
|
|
+ sf.push_back(featureGenerator(Bonus::ATTACKS_NEAREST_CREATURE, 0, sse.val, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 60: //hypnotize
|
|
|
+ sf.push_back(featureGenerator(Bonus::HYPNOTIZED, 0, sse.val, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 61: //forgetfulness
|
|
|
+ sf.push_back(featureGenerator(Bonus::FORGETFULL, 0, sse.val, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ case 62: //blind
|
|
|
+ sf.push_back(makeFeatureVal(Bonus::NOT_ACTIVE, Bonus::UNITL_BEING_ATTACKED | Bonus::N_TURNS, 0, 0, Bonus::SPELL_EFFECT, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ sf.push_back(makeFeatureVal(Bonus::GENERAL_ATTACK_REDUCTION, Bonus::UNTIL_ATTACK | Bonus::N_TURNS, 0, power, Bonus::SPELL_EFFECT, sse.turnsRemain));
|
|
|
+ sf.back().id = sse.id;
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
ui8 CStack::howManyEffectsSet(ui16 id) const
|
|
|
@@ -1904,7 +1905,7 @@ THex CStack::occupiedHex() const
|
|
|
}
|
|
|
BonusList CStack::getSpellBonuses() const
|
|
|
{
|
|
|
- return getBonuses(Selector::sourceTypeSel(Bonus::CASTED_SPELL));
|
|
|
+ return getBonuses(Selector::sourceTypeSel(Bonus::SPELL_EFFECT));
|
|
|
}
|
|
|
|
|
|
std::vector<si32> CStack::activeSpells() const
|