diff --git a/config/bonusnames.txt b/config/bonusnames.txt index a73d6d309..f4ec66bd9 100644 --- a/config/bonusnames.txt +++ b/config/bonusnames.txt @@ -21,11 +21,11 @@ FEAR Fear Has a chance to cause Fear on an enemy stack FEARLESS Fearless Immune to Fear ability CHARGE_IMMUNITY Immune to Charge Immune to Champion charge bonus HEALER Healer Heals allied units -CATAPULT Catapult Attacks siege walls +CATAPULT Catapult Attacks siege walls DRAGON_NATURE Dragon Creature has a Dragon Nature NON_LIVING Non living Creature is immune to effects affecting Living units UNDEAD Undead Creature is Undead -HATE Hates %s Does more damage to %s +HATE Hates %s Does %d% more damage to %s DOUBLE_DAMAGE_CHANCE Death Blow Has %d% chance to deal double damage MAGIC_RESISTANCE Magic Resistance Has %d% chance to resist enemy spell SPELL_DAMAGE_REDUCTION Spell Resistance Damage from spells reduced 50%. diff --git a/lib/CCreatureHandler.cpp b/lib/CCreatureHandler.cpp index 1390ff9a1..93d02a2c7 100644 --- a/lib/CCreatureHandler.cpp +++ b/lib/CCreatureHandler.cpp @@ -766,6 +766,8 @@ void CCreatureHandler::loadStackExp(stackExperience & b, std::string & src, int b.type = Bonus::DOUBLE_DAMAGE_CHANCE; break; case 'g': b.type = Bonus::SPELL_DAMAGE_REDUCTION; break; + case 'R': + b.type = Bonus::ADDITIONAL_RETALIATION; break; case 'f': //on-off skill b.enable = true; //sometimes format is: 2 -> 0, 1 -> 1 @@ -812,6 +814,54 @@ void CCreatureHandler::loadStackExp(stackExperience & b, std::string & src, int break; } break; + case 'w': //specific spell immunities, enabled/disabled + b.enable = true; + switch (mod[0]) + { + case 'B': //Blind + b.type = Bonus::SPELL_IMMUNITY; + b.subtype = 74; + break; + case 'H': //Hypnotize + b.type = Bonus::SPELL_IMMUNITY; + b.subtype = 60; + break; + case 'I': //Implosion + b.type = Bonus::SPELL_IMMUNITY; + b.subtype = 18; + break; + case 'K': //Berserk + b.type = Bonus::SPELL_IMMUNITY; + b.subtype = 59; + break; + case 'M': //Meteor Shower + b.type = Bonus::SPELL_IMMUNITY; + b.subtype = 23; + break; + case 'R': //Armageddon + b.type = Bonus::SPELL_IMMUNITY; + b.subtype = 26; + break; + case 'S': //Slow + b.type = Bonus::SPELL_IMMUNITY; + b.subtype = 54; + break; + case '6': //problem - in VCMI value represents level, here it represents on/off + case '7': + case '8': + case '9': + b.type = Bonus::LEVEL_SPELL_IMMUNITY; //TODO - value can't be read afterwards + b.val = std::atoi(mod.c_str()) - 5; + break; + case ':': + b.type = Bonus::LEVEL_SPELL_IMMUNITY; + b.val = SPELL_LEVELS; //in case someone adds higher level spells? + break; + default: + tlog3 << "Not parsed bonus " << buf << mod << "\n"; + } + break; + case 'i': b.enable = true; b.type = Bonus::NO_DISTANCE_PENALTY; @@ -820,6 +870,16 @@ void CCreatureHandler::loadStackExp(stackExperience & b, std::string & src, int b.enable = true; b.type = Bonus::NO_OBSTACLES_PENALTY; break; + + case 'a': + //case 'c': //some special abilities are threated as spells, will cause bugs + b.type = Bonus::SPELL_AFTER_ATTACK; + b.subtype = stringToNumber(mod); + break; + case 'h': + b.type= Bonus::HATE; + b.subtype = stringToNumber(mod); + break; default: tlog3 << "Not parsed bonus " << buf << mod << "\n"; break; @@ -874,6 +934,12 @@ void CCreatureHandler::loadMindImmunity(stackExperience & b, std::string & src, } } +int CCreatureHandler::stringToNumber(std::string & s) +{ + boost::algorithm::replace_first(s,"#",""); //drop hash character + return std::atoi(s.c_str()); +} + CCreatureHandler::~CCreatureHandler() { } diff --git a/lib/CCreatureHandler.h b/lib/CCreatureHandler.h index 0f2fb017f..a0bcf50ff 100644 --- a/lib/CCreatureHandler.h +++ b/lib/CCreatureHandler.h @@ -121,6 +121,7 @@ public: void loadUnitAnimInfo(CCreature & unit, std::string & src, int & i); void loadStackExp(stackExperience & b, std::string & src, int & it); void loadMindImmunity(stackExperience & b, std::string & src, int & it); //multiple bonuses at once + int stringToNumber(std::string & s);//help function for parsing CREXPBON.txt bool isGood (si8 faction) const; bool isEvil (si8 faction) const; diff --git a/lib/CCreatureSet.cpp b/lib/CCreatureSet.cpp index 20d26bfa5..d21210073 100644 --- a/lib/CCreatureSet.cpp +++ b/lib/CCreatureSet.cpp @@ -502,7 +502,8 @@ std::string CStackInstance::bonusToString(Bonus *bonus, bool description) const boost::algorithm::replace_first(text, "%d", boost::lexical_cast(bonus->val)); break; //Complex descriptions - case Bonus::HATE: //TODO: customize damage percent + case Bonus::HATE: + boost::algorithm::replace_first(text, "%d", boost::lexical_cast(bonus->val)); boost::algorithm::replace_first(text, "%s", VLC->creh->creatures[bonus->subtype]->namePl); break; case Bonus::SPELL_IMMUNITY: diff --git a/lib/HeroBonus.h b/lib/HeroBonus.h index 1230e2775..0329106f1 100644 --- a/lib/HeroBonus.h +++ b/lib/HeroBonus.h @@ -87,7 +87,7 @@ namespace PrimarySkill BONUS_NAME(UNLIMITED_RETALIATIONS) \ BONUS_NAME(NO_MELEE_PENALTY) \ BONUS_NAME(JOUSTING) /*for champions*/ \ - BONUS_NAME(HATE) /*eg. angels hate devils, subtype - ID of hated creature*/ \ + BONUS_NAME(HATE) /*eg. angels hate devils, subtype - ID of hated creature, val - damage bonus percent */ \ BONUS_NAME(KING1) \ BONUS_NAME(KING2) \ BONUS_NAME(KING3) \