int BonusList::valOfBonuses(const CSelector &select) const { BonusList ret; CSelector limit = nullptr; getBonuses(ret, select, limit); ret.eliminateDuplicates(); return ret.totalValue(); }
void BonusList::getBonuses(BonusList & out, const CSelector &selector, const CSelector &limit) const { for (auto & elem : bonuses) { Bonus *b = elem; //add matching bonuses that matches limit predicate or have NO_LIMIT if no given predicate if(selector(b) && ((!limit && b->effectRange == Bonus::NO_LIMIT) || ((bool)limit && limit(b)))) out.push_back(b); } }
void BonusList::getBonuses(BonusList & out, const CSelector &selector, const CSelector &limit) const { for (ui32 i = 0; i < bonuses.size(); i++) { Bonus *b = bonuses[i]; //add matching bonuses that matches limit predicate or have NO_LIMIT if no given predicate if(selector(b) && ((!limit && b->effectRange == Bonus::NO_LIMIT) || (limit && limit(b)))) out.push_back(b); } }
BonusList::BonusList(const BonusList &bonusList) { bonuses.resize(bonusList.size()); std::copy(bonusList.begin(), bonusList.end(), bonuses.begin()); belongsToTree = false; }
void BonusList::getAllBonuses(BonusList &out) const { for(Bonus *b : bonuses) out.push_back(b); }
void CCreatureHandler::loadCreatures() { tlog5 << "\t\tReading config/cr_abils.json and ZCRTRAIT.TXT" << std::endl; ////////////reading ZCRTRAIT.TXT /////////////////// CLegacyConfigParser parser("DATA/ZCRTRAIT.TXT"); parser.endLine(); // header parser.endLine(); do { //loop till non-empty line while (parser.isNextEntryEmpty()) parser.endLine(); CCreature &ncre = *new CCreature; ncre.idNumber = CreatureID(creatures.size()); ncre.cost.resize(GameConstants::RESOURCE_QUANTITY); ncre.level=0; ncre.iconIndex = ncre.idNumber + 2; // +2 for empty\selection images ncre.nameSing = parser.readString(); ncre.namePl = parser.readString(); for(int v=0; v<7; ++v) { ncre.cost[v] = parser.readNumber(); } ncre.fightValue = parser.readNumber(); ncre.AIValue = parser.readNumber(); ncre.growth = parser.readNumber(); ncre.hordeGrowth = parser.readNumber(); ncre.addBonus(parser.readNumber(), Bonus::STACK_HEALTH); ncre.addBonus(parser.readNumber(), Bonus::STACKS_SPEED); ncre.addBonus(parser.readNumber(), Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK); ncre.addBonus(parser.readNumber(), Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE); ncre.addBonus(parser.readNumber(), Bonus::CREATURE_DAMAGE, 1); ncre.addBonus(parser.readNumber(), Bonus::CREATURE_DAMAGE, 2); ncre.addBonus(parser.readNumber(), Bonus::SHOTS); //spells - not used? parser.readNumber(); ncre.ammMin = parser.readNumber(); ncre.ammMax = parser.readNumber(); ncre.abilityText = parser.readString(); ncre.abilityRefs = parser.readString(); { //adding abilities from ZCRTRAIT.TXT if(boost::algorithm::find_first(ncre.abilityRefs, "DOUBLE_WIDE")) ncre.doubleWide = true; if(boost::algorithm::find_first(ncre.abilityRefs, "FLYING_ARMY")) ncre.addBonus(0, Bonus::FLYING); if(boost::algorithm::find_first(ncre.abilityRefs, "SHOOTING_ARMY")) ncre.addBonus(0, Bonus::SHOOTER); if(boost::algorithm::find_first(ncre.abilityRefs, "SIEGE_WEAPON")) ncre.addBonus(0, Bonus::SIEGE_WEAPON); if(boost::algorithm::find_first(ncre.abilityRefs, "const_free_attack")) ncre.addBonus(0, Bonus::BLOCKS_RETALIATION); if(boost::algorithm::find_first(ncre.abilityRefs, "IS_UNDEAD")) ncre.addBonus(0, Bonus::UNDEAD); if(boost::algorithm::find_first(ncre.abilityRefs, "const_no_melee_penalty")) ncre.addBonus(0, Bonus::NO_MELEE_PENALTY); if(boost::algorithm::find_first(ncre.abilityRefs, "const_jousting")) ncre.addBonus(0, Bonus::JOUSTING); if(boost::algorithm::find_first(ncre.abilityRefs, "const_raises_morale")) { ncre.addBonus(+1, Bonus::MORALE);; ncre.getBonusList().back()->addPropagator(make_shared<CPropagatorNodeType>(CBonusSystemNode::HERO)); } if(boost::algorithm::find_first(ncre.abilityRefs, "const_lowers_morale")) { ncre.addBonus(-1, Bonus::MORALE);; ncre.getBonusList().back()->effectRange = Bonus::ONLY_ENEMY_ARMY; } if(boost::algorithm::find_first(ncre.abilityRefs, "KING_1")) ncre.addBonus(0, Bonus::KING1); if(boost::algorithm::find_first(ncre.abilityRefs, "KING_2")) ncre.addBonus(0, Bonus::KING2); if(boost::algorithm::find_first(ncre.abilityRefs, "KING_3")) ncre.addBonus(0, Bonus::KING3); if(boost::algorithm::find_first(ncre.abilityRefs, "const_no_wall_penalty")) ncre.addBonus(0, Bonus::NO_WALL_PENALTY); if(boost::algorithm::find_first(ncre.abilityRefs, "CATAPULT")) ncre.addBonus(0, Bonus::CATAPULT); if(boost::algorithm::find_first(ncre.abilityRefs, "MULTI_HEADED")) ncre.addBonus(0, Bonus::ATTACKS_ALL_ADJACENT); if(boost::algorithm::find_first(ncre.abilityRefs, "IMMUNE_TO_MIND_SPELLS")) ncre.addBonus(0, Bonus::MIND_IMMUNITY); if(boost::algorithm::find_first(ncre.abilityRefs, "IMMUNE_TO_FIRE_SPELLS")) ncre.addBonus(0, Bonus::FIRE_IMMUNITY); if(boost::algorithm::find_first(ncre.abilityRefs, "HAS_EXTENDED_ATTACK")) ncre.addBonus(0, Bonus::TWO_HEX_ATTACK_BREATH);; } creatures.push_back(&ncre); } while (parser.endLine()); // loading creatures properties tlog5 << "\t\tReading creatures json configs" << std::endl; const JsonNode gameConf(ResourceID("config/gameConfig.json")); const JsonNode config(JsonUtils::assembleFromFiles(gameConf["creatures"].convertTo<std::vector<std::string> >())); BOOST_FOREACH(auto & node, config.Struct()) { int creatureID = node.second["id"].Float(); CCreature *c = creatures[creatureID]; BOOST_FOREACH(const JsonNode &ability, node.second["ability_remove"].Vector()) { RemoveAbility(c, ability); } BOOST_FOREACH(const JsonNode &ability, node.second["abilities"].Vector()) { if (ability.getType() == JsonNode::DATA_VECTOR) AddAbility(c, ability.Vector()); else c->addNewBonus(JsonUtils::parseBonus(ability)); } loadCreatureJson(c, node.second); // Main reference name, e.g. royalGriffin c->nameRef = node.first; VLC->modh->identifiers.registerObject("creature." + node.first, c->idNumber); // Alternative names, if any BOOST_FOREACH(const JsonNode &name, node.second["extraNames"].Vector()) { VLC->modh->identifiers.registerObject("creature." + name.String(), c->idNumber); } } loadAnimationInfo(); //reading creature ability names const JsonNode config2(ResourceID("config/bonusnames.json")); BOOST_FOREACH(const JsonNode &bonus, config2["bonuses"].Vector()) { std::map<std::string,int>::const_iterator it_map; std::string bonusID = bonus["id"].String(); it_map = bonusNameMap.find(bonusID); if (it_map != bonusNameMap.end()) stackBonuses[it_map->second] = std::pair<std::string, std::string>(bonus["name"].String(), bonus["description"].String()); else tlog2 << "Bonus " << bonusID << " not recognized, ignoring\n"; } //handle magic resistance secondary skill premy, potentialy may be buggy //std::map<TBonusType, std::pair<std::string, std::string> >::iterator it = stackBonuses.find(Bonus::MAGIC_RESISTANCE); //stackBonuses[Bonus::SECONDARY_SKILL_PREMY] = std::pair<std::string, std::string>(it->second.first, it->second.second); if (VLC->modh->modules.STACK_EXP) //reading default stack experience bonuses { CLegacyConfigParser parser("DATA/CREXPBON.TXT"); Bonus b; //prototype with some default properties b.source = Bonus::STACK_EXPERIENCE; b.duration = Bonus::PERMANENT; b.valType = Bonus::ADDITIVE_VALUE; b.effectRange = Bonus::NO_LIMIT; b.additionalInfo = 0; b.turnsRemain = 0; BonusList bl; parser.endLine(); parser.readString(); //ignore index loadStackExp(b, bl, parser); BOOST_FOREACH(Bonus * b, bl) addBonusForAllCreatures(b); //health bonus is common for all parser.endLine(); for (int i = 1; i < 7; ++i) { for (int j = 0; j < 4; ++j) //four modifiers common for tiers { parser.readString(); //ignore index bl.clear(); loadStackExp(b, bl, parser); BOOST_FOREACH(Bonus * b, bl) addBonusForTier(i, b); parser.endLine(); } } for (int j = 0; j < 4; ++j) //tier 7 { parser.readString(); //ignore index bl.clear(); loadStackExp(b, bl, parser); BOOST_FOREACH(Bonus * b, bl) { addBonusForTier(7, b); creaturesOfLevel[0].addNewBonus(b); //bonuses from level 7 are given to high-level creatures } parser.endLine(); }
void CCreatureHandler::load() { tlog5 << "\t\tReading ZCRTRAIT.TXT" << std::endl; ////////////reading ZCRTRAIT.TXT /////////////////// CLegacyConfigParser parser("DATA/ZCRTRAIT.TXT"); parser.endLine(); // header parser.endLine(); do { //loop till non-empty line while (parser.isNextEntryEmpty()) parser.endLine(); CCreature &ncre = *new CCreature; ncre.idNumber = CreatureID(creatures.size()); ncre.cost.resize(GameConstants::RESOURCE_QUANTITY); ncre.level=0; ncre.iconIndex = ncre.idNumber + 2; // +2 for empty\selection images ncre.nameSing = parser.readString(); ncre.namePl = parser.readString(); for(int v=0; v<7; ++v) { ncre.cost[v] = parser.readNumber(); } ncre.fightValue = parser.readNumber(); ncre.AIValue = parser.readNumber(); ncre.growth = parser.readNumber(); ncre.hordeGrowth = parser.readNumber(); ncre.addBonus(parser.readNumber(), Bonus::STACK_HEALTH); ncre.addBonus(parser.readNumber(), Bonus::STACKS_SPEED); ncre.addBonus(parser.readNumber(), Bonus::PRIMARY_SKILL, PrimarySkill::ATTACK); ncre.addBonus(parser.readNumber(), Bonus::PRIMARY_SKILL, PrimarySkill::DEFENSE); ncre.addBonus(parser.readNumber(), Bonus::CREATURE_DAMAGE, 1); ncre.addBonus(parser.readNumber(), Bonus::CREATURE_DAMAGE, 2); ncre.addBonus(parser.readNumber(), Bonus::SHOTS); //spells - not used? parser.readNumber(); ncre.ammMin = parser.readNumber(); ncre.ammMax = parser.readNumber(); ncre.abilityText = parser.readString(); loadBonuses(ncre, parser.readString()); //Attributes creatures.push_back(&ncre); } while (parser.endLine()); // loading creatures properties tlog5 << "\t\tReading creatures json configs" << std::endl; const JsonNode gameConf(ResourceID("config/gameConfig.json")); const JsonNode config(JsonUtils::assembleFromFiles(gameConf["creatures"].convertTo<std::vector<std::string> >())); BOOST_FOREACH(auto & node, config.Struct()) { int creatureID = node.second["id"].Float(); CCreature *c = creatures[creatureID]; loadCreatureJson(c, node.second); // Main reference name, e.g. royalGriffin c->nameRef = node.first; registerCreature(node.first, c->idNumber); // Alternative names, if any BOOST_FOREACH(const JsonNode &name, node.second["extraNames"].Vector()) { registerCreature(name.String(), c->idNumber); } } loadAnimationInfo(); if (VLC->modh->modules.STACK_EXP) //reading default stack experience bonuses { CLegacyConfigParser parser("DATA/CREXPBON.TXT"); Bonus b; //prototype with some default properties b.source = Bonus::STACK_EXPERIENCE; b.duration = Bonus::PERMANENT; b.valType = Bonus::ADDITIVE_VALUE; b.effectRange = Bonus::NO_LIMIT; b.additionalInfo = 0; b.turnsRemain = 0; BonusList bl; parser.endLine(); parser.readString(); //ignore index loadStackExp(b, bl, parser); BOOST_FOREACH(Bonus * b, bl) addBonusForAllCreatures(b); //health bonus is common for all parser.endLine(); for (int i = 1; i < 7; ++i) { for (int j = 0; j < 4; ++j) //four modifiers common for tiers { parser.readString(); //ignore index bl.clear(); loadStackExp(b, bl, parser); BOOST_FOREACH(Bonus * b, bl) addBonusForTier(i, b); parser.endLine(); } } for (int j = 0; j < 4; ++j) //tier 7 { parser.readString(); //ignore index bl.clear(); loadStackExp(b, bl, parser); BOOST_FOREACH(Bonus * b, bl) { addBonusForTier(7, b); creaturesOfLevel[0].addNewBonus(b); //bonuses from level 7 are given to high-level creatures } parser.endLine(); }
void BonusList::getAllBonuses(BonusList &out) const { BOOST_FOREACH(Bonus *b, bonuses) out.push_back(b); }