Exemple #1
0
int BonusList::valOfBonuses(const CSelector &select) const
{
	BonusList ret;
	CSelector limit = nullptr;
	getBonuses(ret, select, limit);
	ret.eliminateDuplicates();
	return ret.totalValue();
}
Exemple #2
0
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);
	}
}
Exemple #3
0
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);
	}
}
Exemple #4
0
BonusList::BonusList(const BonusList &bonusList)
{
	bonuses.resize(bonusList.size());
	std::copy(bonusList.begin(), bonusList.end(), bonuses.begin());
	belongsToTree = false;
}
Exemple #5
0
void BonusList::getAllBonuses(BonusList &out) const
{
	for(Bonus *b : bonuses)
		out.push_back(b);
}
Exemple #6
0
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();
		}
Exemple #8
0
void BonusList::getAllBonuses(BonusList &out) const
{
	BOOST_FOREACH(Bonus *b, bonuses)
		out.push_back(b);
}