diff --git a/config/bonusnames.json b/config/bonusnames.json new file mode 100644 index 000000000..27c657a85 --- /dev/null +++ b/config/bonusnames.json @@ -0,0 +1,56 @@ +{ + "bonuses": + [ + { "id": "ADDITIONAL_RETALIATION", "name": "Additional retaliations", "description": "May Retaliate %d extra times" }, + { "id": "ATTACKS_ALL_ADJACENT", "name": "Attack all around", "description": "Attacks all adjacent enemies" }, + { "id": "RETURN_AFTER_STRIKE", "name": "Attack and Return", "description": "Returns after melee attack" }, + { "id": "SPELL_RESISTANCE_AURA", "name": "Aura of Resistance", "description": "Nearby stacks get %d% resistance" }, + { "id": "TWO_HEX_ATTACK_BREATH", "name": "Breath", "description": "Breath Attack (2-hex range)" }, + { "id": "SPELL_AFTER_ATTACK", "name": "Caster - %s", "description": "%d% chance to cast after attack" }, + { "id": "SPELL_BEFORE_ATTACK", "name": "Caster - %s", "description": "%d% chance to cast before attack" }, + { "id": "CATAPULT", "name": "Catapult", "description": "Attacks siege walls" }, + { "id": "JOUSTING", "name": "Champion Charge", "description": "+5% damage per hex travelled" }, + { "id": "DOUBLE_DAMAGE_CHANCE", "name": "Death Blow", "description": "%d% chance for double damage" }, + { "id": "DEFENSIVE_STANCE", "name": "Defense Bonus", "description": "+%d Defense when defending" }, + { "id": "ADDITIONAL_ATTACK", "name": "Double Strike", "description": "Attacks twice" }, + { "id": "DRAGON_NATURE", "name": "Dragon", "description": "Creature has a Dragon Nature" }, + { "id": "LIFE_DRAIN", "name": "Drain life", "description": "Drains life equal to damage dealt" }, + { "id": "FEAR", "name": "Fear", "description": "Causes Fear on an enemy stack" }, + { "id": "FEARLESS", "name": "Fearless", "description": "Immune to Fear ability" }, + { "id": "FLYING", "name": "Fly", "description": "Can Fly (ignores obstacles)" }, + { "id": "HATE", "name": "Hates %s", "description": "Does %d% more damage" }, + { "id": "HEALER", "name": "Healer", "description": "Heals allied units" }, + { "id": "SPELL_IMMUNITY", "name": "Immune to %s", "description": "" }, + { "id": "CHARGE_IMMUNITY", "name": "Immune to Charge", "description": "Immune to Champion charge" }, + { "id": "MANA_CHANNELING", "name": "Magic Channel %d%", "description": "Gives mana spent by enemy" }, + { "id": "CHANGES_SPELL_COST_FOR_ENEMY", "name": "Magic Damper (%d)", "description": "Increase Cost of enemy spells" }, + { "id": "MAGIC_MIRROR", "name": "Magic Mirror (%d%)", "description": "Redirects offensive spell to enemy" }, + { "id": "MAGIC_RESISTANCE", "name": "Magic Resistance", "description": "%d% chance to resist enemy spell" }, + { "id": "NO_DISTANCE_PENALTY", "name": "No distance penalty", "description": "Full damage from any distance" }, + { "id": "NO_MELEE_PENALTY", "name": "No melee penalty", "description": "Creature has no Melee Penalty" }, + { "id": "NO_OBSTACLES_PENALTY", "name": "No obstacle penalty", "description": "Creature has no Obstacle Penalty" }, + { "id": "BLOCKS_RETALIATION", "name": "No retaliation", "description": "Enemy cannot Retaliate" }, + { "id": "NON_LIVING", "name": "Non living", "description": "Immunity to many effects" }, + { "id": "SELF_LUCK", "name": "Positive luck", "description": "Always has Positive Luck" }, + { "id": "SELF_MORALE", "name": "Positive morale", "description": "Always has Positive Morale" }, + { "id": "SHOOTER", "name": "Ranged", "description": "Creature can shoot" }, + { "id": "CHANGES_SPELL_COST_FOR_ALLY", "name": "Reduce Casting Cost (%d)", "description": "Reduce Casting Cost for hero" }, + { "id": "ENEMY_DEFENCE_REDUCTION", "name": "Reduce Enemy Defense (%d%)", "description": "Reduces Defense for one attack" }, + { "id": "FULL_HP_REGENERATION", "name": "Regeneration", "description": "May Regenerate full Health" }, + { "id": "HP_REGENERATION", "name": "Regeneration", "description": "Heals %d hit points every round" }, + { "id": "FREE_SHOOTING", "name": "Shoot Close", "description": "Can shoot in Close Combat" }, + { "id": "LEVEL_SPELL_IMMUNITY", "name": "Spell immunity 1-%d", "description": "Immune to spells levels 1-%d" }, + { "id": "SPELL_DAMAGE_REDUCTION", "name": "Spell Resistance", "description": "Damage from spells reduced %d%." }, + { "id": "THREE_HEADED_ATTACK", "name": "Three-headed attack", "description": "Attacks three adjacent units" }, + { "id": "UNDEAD", "name": "Undead", "description": "Creature is Undead" }, + { "id": "UNLIMITED_RETALIATIONS", "name": "Unlimited retaliations", "description": "Retaliate any number of attacks" }, + { "id": "DEATH_STARE", "name": "Death Stare (%d%)", "description": "Chance to kill single creature" }, + { "id": "FIRE_IMMUNITY", "name": "Immune to Fire", "description": "" }, + { "id": "WATER_IMMUNITY", "name": "Immune to Water", "description": "" }, + { "id": "AIR_IMMUNITY", "name": "Immune to Air", "description": "" }, + { "id": "EARTH_IMMUNITY", "name": "Immune to Earth", "description": "" }, + { "id": "DIRECT_DAMAGE_IMMUNITY", "name": "Direct Damage Immunity", "description": "Immune to direct damage spells" }, + { "id": "RECEPTIVE", "name": "Receptive", "description": "No Immunity to Friendly Spells" }, + { "id": "REBIRTH", "name": "Rebirth (%d%)", "description": "Stack will rise after death" } + ] +} diff --git a/config/bonusnames.txt b/config/bonusnames.txt deleted file mode 100644 index 7ae379e83..000000000 --- a/config/bonusnames.txt +++ /dev/null @@ -1,52 +0,0 @@ -Bonus Name (30 characters?) Description (30) -ADDITIONAL_RETALIATION Additional retaliations May Retaliate %d extra times -ATTACKS_ALL_ADJACENT Attack all around Attacks all adjacent enemies -RETURN_AFTER_STRIKE Attack and Return Returns after melee attack -SPELL_RESISTANCE_AURA Aura of Resistance Nearby stacks get %d% resistance -TWO_HEX_ATTACK_BREATH Breath Breath Attack (2-hex range) -SPELL_AFTER_ATTACK Caster - %s %d% chance to cast after attack -SPELL_BEFORE_ATTACK Caster - %s %d% chance to cast before attack -CATAPULT Catapult Attacks siege walls -JOUSTING Champion Charge +5% damage per hex travelled -DOUBLE_DAMAGE_CHANCE Death Blow %d% chance for double damage -DEFENSIVE_STANCE Defense Bonus +%d Defense when defending -ADDITIONAL_ATTACK Double Strike Attacks twice -DRAGON_NATURE Dragon Creature has a Dragon Nature -LIFE_DRAIN Drain life Drains life equal to damage dealt -FEAR Fear Causes Fear on an enemy stack -FEARLESS Fearless Immune to Fear ability -FLYING Fly Can Fly (ignores obstacles) -HATE Hates %s Does %d% more damage -HEALER Healer Heals allied units -SPELL_IMMUNITY Immune to %s -CHARGE_IMMUNITY Immune to Charge Immune to Champion charge -MANA_CHANNELING Magic Channel %d% Gives mana spent by enemy -CHANGES_SPELL_COST_FOR_ENEMY Magic Damper (%d) Increase Cost of enemy spells -MAGIC_MIRROR Magic Mirror (%d%) Redirects offensive spell to enemy -MAGIC_RESISTANCE Magic Resistance %d% chance to resist enemy spell -NO_DISTANCE_PENALTY No distance penalty Full damage from any distance -NO_MELEE_PENALTY No melee penalty Creature has no Melee Penalty -NO_OBSTACLES_PENALTY No obstacle penalty Creature has no Obstacle Penalty -BLOCKS_RETALIATION No retaliation Enemy cannot Retaliate -NON_LIVING Non living Immunity to many effects -SELF_LUCK Positive luck Always has Positive Luck -SELF_MORALE Positive morale Always has Positive Morale -SHOOTER Ranged Creature can shoot -CHANGES_SPELL_COST_FOR_ALLY Reduce Casting Cost (%d) Reduce Casting Cost for hero -ENEMY_DEFENCE_REDUCTION Reduce Enemy Defense (%d%) Reduces Defense for one attack -FULL_HP_REGENERATION Regeneration May Regenerate full Health -HP_REGENERATION Regeneration Heals %d hit points every round -FREE_SHOOTING Shoot Close Can shoot in Close Combat -LEVEL_SPELL_IMMUNITY Spell immunity 1-%d Immune to spells levels 1-%d -SPELL_DAMAGE_REDUCTION Spell Resistance Damage from spells reduced %d%. -THREE_HEADED_ATTACK Three-headed attack Attacks three adjacent units -UNDEAD Undead Creature is Undead -UNLIMITED_RETALIATIONS Unlimited retaliations Retaliate any number of attacks -DEATH_STARE Death Stare (%d%) Chance to kill single creature -FIRE_IMMUNITY Immune to Fire -WATER_IMMUNITY Immune to Water -AIR_IMMUNITY Immune to Air -EARTH_IMMUNITY Immune to Earth -DIRECT_DAMAGE_IMMUNITY Direct Damage Immunity Immune to direct damage spells -RECEPTIVE Receptive No Immunity to Friendly Spells -REBIRTH Rebirth (%d%) Stack will rise after death diff --git a/lib/CCreatureHandler.cpp b/lib/CCreatureHandler.cpp index 905da7aec..8b1b72992 100644 --- a/lib/CCreatureHandler.cpp +++ b/lib/CCreatureHandler.cpp @@ -504,35 +504,25 @@ void CCreatureHandler::loadCreatures() factionToTurretCreature[c->faction] = creatureID; } - std::ifstream ifs; - std::string dump2; - buildBonusTreeForTiers(); loadAnimationInfo(); //reading creature ability names - ifs.open(DATA_DIR "/config/bonusnames.txt"); - { - std::string buf2, buf3, line; - std::map::const_iterator it; - getline(ifs, line); //skip 1st line - while(!ifs.eof()) - { - getline(ifs, buf, '\t'); - getline(ifs, buf2, '\t'); - getline(ifs, buf3); + const JsonNode config2(DATA_DIR "/config/bonusnames.json"); + const JsonVector &bonuses_vec = config2["bonuses"].Vector(); - if (ifs.eof() || ifs.fail()) - break; + for (JsonVector::const_iterator it = bonuses_vec.begin(); it!=bonuses_vec.end(); ++it) { + const JsonNode &bonus = *it; + std::map::const_iterator it_map; + std::string bonusID = bonus["id"].String(); - it = bonusNameMap.find(buf); - if (it != bonusNameMap.end()) - stackBonuses[it->second] = std::pair(buf2,buf3); - else - tlog2 << "Bonus " << buf << " not recognized, ignoring\n"; - } + it_map = bonusNameMap.find(bonusID); + if (it_map != bonusNameMap.end()) { + stackBonuses[it_map->second] = std::pair(bonus["name"].String(), bonus["description"].String()); + } else + tlog2 << "Bonus " << bonusID << " not recognized, ignoring\n"; } - ifs.close(); + //handle magic resistance secondary skill premy, potentialy may be buggy std::map >::iterator it = stackBonuses.find(Bonus::MAGIC_RESISTANCE); stackBonuses[Bonus::SECONDARY_SKILL_PREMY] = std::pair(it->second.first, it->second.second); @@ -550,6 +540,7 @@ void CCreatureHandler::loadCreatures() b.additionalInfo = 0; b.turnsRemain = 0; BonusList bl; + std::string dump2; loadToIt (dump2, buf, it, 3); //ignore first line loadToIt (dump2, buf, it, 4); //ignore index