Bladeren bron

- Commanders are now a part of faction config
- Support for external dwellings for new towns

DjWarmonger 13 jaren geleden
bovenliggende
commit
0e06ac15ad

+ 1 - 0
config/factions/castle.json

@@ -4,6 +4,7 @@
 		"index" : 0,
 		"nativeTerrain": "grass",
 		"alignment" : "good",
+		"commander" : "Paladin1",
 		"creatureBackground" :
 		{
 			"120px" : "TPCASCAS",

+ 1 - 0
config/factions/conflux.json

@@ -4,6 +4,7 @@
 		"index" : 8,
 		"nativeTerrain": "grass",
 		"alignment" : "neutral",
+		"commander" : "AstralSpirit1",
 		"creatureBackground" :
 		{
 			"120px" : "TPCASELE",

+ 1 - 0
config/factions/dungeon.json

@@ -4,6 +4,7 @@
 		"index" : 5,
 		"nativeTerrain": "subterra",
 		"alignment" : "evil",
+		"commander" : "Brute1",
 		"creatureBackground" :
 		{
 			"120px" : "TPCASDUN",

+ 1 - 0
config/factions/fortress.json

@@ -4,6 +4,7 @@
 		"index" : 7,
 		"nativeTerrain": "swamp",
 		"alignment" : "neutral",
+		"commander" : "Shaman1",
 		"creatureBackground" :
 		{
 			"120px" : "TPCASFOR",

+ 1 - 0
config/factions/inferno.json

@@ -4,6 +4,7 @@
 		"index" : 3,
 		"nativeTerrain": "lava",
 		"alignment" : "evil",
+		"commander" : "Succubus1",
 		"creatureBackground" :
 		{
 			"120px" : "TPCASINF",

+ 1 - 0
config/factions/necropolis.json

@@ -4,6 +4,7 @@
 		"index" : 4,
 		"nativeTerrain": "dirt",
 		"alignment" : "evil",
+		"commander" : "SoulEater1",
 		"creatureBackground" :
 		{
 			"120px" : "TPCASNEC",

+ 2 - 1
config/factions/neutral.json

@@ -7,6 +7,7 @@
 		{
 			"120px" : "TPCASNEU",
 			"130px" : "CRBKGNEU"
-		}
+		},
+		"commander" : "Enchanter" //just in case
 	}
 }

+ 1 - 0
config/factions/rampart.json

@@ -4,6 +4,7 @@
 		"index" : 1,
 		"nativeTerrain": "grass",
 		"alignment" : "good",
+		"commander" : "Hierophant1",
 		"creatureBackground" :
 		{
 			"120px" : "TPCASRAM",

+ 1 - 0
config/factions/stronghold.json

@@ -4,6 +4,7 @@
 		"index" : 6,
 		"nativeTerrain": "rough",
 		"alignment" : "neutral",
+		"commander" : "OgreLeader1",
 		"creatureBackground" :
 		{
 			"120px" : "TPCASSTR",

+ 1 - 0
config/factions/tower.json

@@ -4,6 +4,7 @@
 		"index" : 2,
 		"nativeTerrain" : "snow",
 		"alignment" : "good",
+		"commander" : "TempleGuardian1",
 		"creatureBackground" :
 		{
 			"120px" : "TPCASTOW",

+ 0 - 4
lib/CCreatureHandler.cpp

@@ -502,10 +502,6 @@ void CCreatureHandler::loadCreatures()
 	tlog5 << "\t\tReading config/commanders.json" << std::endl;
 	const JsonNode config3(ResourceID("config/commanders.json"));
 
-	BOOST_FOREACH (auto creature, config3["factionCreatures"].Vector())
-	{
-		factionCommanders[creature["faction"].Float()] =  creature["id"].Float();
-	}
 	BOOST_FOREACH (auto bonus, config3["bonusPerLevel"].Vector())
 	{
 		commanderLevelPremy.push_back(JsonUtils::parseBonus (bonus.Vector()));

+ 1 - 2
lib/CCreatureHandler.h

@@ -139,7 +139,6 @@ public:
 	si8 expAfterUpgrade;//multiplier in %
 
 	//Commanders
-	std::map <TFaction, TCreature> factionCommanders;
 	BonusList commanderLevelPremy; //bonus values added with each level-up
 	std::vector< std::vector <ui8> > skillLevels; //how much of a bonus will be given to commander with every level. SPELL_POWER also gives CASTS and RESISTANCE
 	std::vector <std::pair <Bonus, std::pair <ui8, ui8> > > skillRequirements; // first - Bonus, second - which two skills are needed to use it
@@ -179,7 +178,7 @@ public:
 		//TODO: should be optimized, not all these informations needs to be serialized (same for ccreature)
 		h & notUsedMonsters & creatures;
 		h & stackBonuses & expRanks & maxExpPerBattle & expAfterUpgrade;
-		h & factionCommanders & skillLevels & skillRequirements & commanderLevelPremy;
+		h & skillLevels & skillRequirements & commanderLevelPremy;
 		h & allCreatures;
 		h & creaturesOfLevel;
 		BONUS_TREE_DESERIALIZATION_FIX

+ 1 - 1
lib/CGameState.cpp

@@ -582,7 +582,7 @@ std::pair<int,int> CGameState::pickObject (CGObjectInstance *obj)
 			//if castle alignment available
 			if (auto info = dynamic_cast<CCreGenAsCastleInfo*>(dwl->info))
 			{
-				faction = ran()%GameConstants::F_NUMBER;
+				faction = ran() % VLC->townh->factions.size();
 				if (info->asCastle)
 				{
 					for(ui32 i=0;i<map->objects.size();i++)

+ 16 - 0
lib/CModHandler.cpp

@@ -9,6 +9,7 @@
 #include "CArtHandler.h"
 #include "CTownHandler.h"
 #include "CHeroHandler.h"
+#include "CObjectHandler.h"
 
 /*
  * CModHandler.h, part of VCMI engine
@@ -224,6 +225,21 @@ void CModHandler::reload()
 
 			VLC->dobjinfo->capitols[town.first] = new CGDefInfo(*townInfos[town.first]);
 			VLC->dobjinfo->capitols[town.first]->name = cientInfo.advMapCapitol;
+
+			for (int i = 0; i < town.second.dwellings.size(); ++i)
+			{
+				const CGDefInfo * baseInfo = VLC->dobjinfo->gobjs[Obj::CREATURE_GENERATOR1][i]; //get same blockmap as first dwelling of tier i
+
+				BOOST_FOREACH (auto cre, town.second.creatures[i]) //both unupgraded and upgraded get same dwelling
+				{
+					CGDefInfo * info = new CGDefInfo(*baseInfo);
+					info->subid = cre;
+					info->name = town.second.dwellings[i];
+					VLC->dobjinfo->gobjs[Obj::CREATURE_GENERATOR1][cre] = info;
+
+					VLC->objh->cregens[cre] = cre; //map of dwelling -> creature id
+				}
+			}
 		}
 	}
 }

+ 9 - 2
lib/CObjectHandler.cpp

@@ -762,7 +762,7 @@ void CGHeroInstance::initHero()
 
 	if (VLC->modh->modules.COMMANDERS)
 	{
-		commander = new CCommanderInstance (VLC->creh->factionCommanders[type->heroClass->faction]);
+		commander = new CCommanderInstance (VLC->townh->factions[type->heroClass->faction].commander);
 		commander->setArmyObj (castToArmyObj()); //TODO: separate function for setting commanders
 	}
 
@@ -1531,7 +1531,14 @@ void CGDwelling::initObj()
 
 			creatures.resize(1);
 			creatures[0].second.push_back(crid);
-			hoverName = VLC->generaltexth->creGens[subID];
+			if (subID >= VLC->generaltexth->creGens.size()) //very messy workaround
+			{
+				int faction = VLC->creh->creatures[subID]->faction;
+				assert (VLC->townh->towns[faction].dwellingNames.size());
+				hoverName = VLC->townh->towns[faction].dwellingNames[VLC->creh->creatures[subID]->level - 1];
+			}
+			else
+				hoverName = VLC->generaltexth->creGens[subID];
 			if(crs->level > 4)
 				putStack(0, new CStackInstance(crs, (crs->growth) * 3));
 			if (getOwner() != GameConstants::NEUTRAL_PLAYER)

+ 16 - 0
lib/CTownHandler.cpp

@@ -392,6 +392,16 @@ void CTownHandler::loadClientData(CTown &town, const JsonNode & source)
 	town.clientInfo.advMapCastle  = source["adventureMap"]["castle"].String();
 	town.clientInfo.advMapCapitol = source["adventureMap"]["capitol"].String();
 
+	const JsonNode *value = &source["adventureMap"]["dwellings"];
+	if (!value->isNull())
+	{
+		BOOST_FOREACH (const JsonNode &d, value->Vector())
+		{
+			town.dwellings.push_back (d["graphics"].String());
+			town.dwellingNames.push_back (d["name"].String());
+		}
+	}
+
 	loadTownHall(town,   source["hallSlots"]);
 	loadStructures(town, source["structures"]);
 	loadSiegeScreen(town, source["siege"]);
@@ -506,6 +516,12 @@ void CTownHandler::load(const JsonNode &source)
 		faction.factionID = id;
 		faction.name = node.second["name"].String();
 
+		VLC->modh->identifiers.requestIdentifier ("creature." + node.second["commander"].String(),
+			[=](si32 commanderID)
+			{
+				factions[id].commander = commanderID;
+			}); //TODO: resolve string id
+
 		faction.creatureBg120 = node.second["creatureBackground"]["120px"].String();
 		faction.creatureBg130 = node.second["creatureBackground"]["130px"].String();
 

+ 7 - 1
lib/CTownHandler.h

@@ -94,6 +94,9 @@ public:
 
 	bmap<int, ConstTransitivePtr<CBuilding> > buildings;
 
+	std::vector<std::string> dwellings; //defs for adventure map dwellings for new towns, [0] means tier 1 creatures etc.
+	std::vector<std::string> dwellingNames;
+
 	// should be removed at least from configs in favour of auto-detection
 	std::map<int,int> hordeLvl; //[0] - first horde building creature level; [1] - second horde building (-1 if not present)
 	ui32 mageLevel; //max available mage guild level
@@ -145,7 +148,7 @@ public:
 
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
-		h & names & typeID & creatures & buildings & hordeLvl & mageLevel
+		h & names & typeID & creatures & dwellings & dwellingNames & buildings & hordeLvl & mageLevel
 			& primaryRes & warMachine & clientInfo;
 	}
 };
@@ -173,6 +176,9 @@ public:
 	ui8 nativeTerrain;
 	ui8 alignment; // uses EAlignment enum
 
+	//std::string commanderClass;
+	TCreature commander;
+
 	std::string creatureBg120;
 	std::string creatureBg130;