Browse Source

- Fixed some issues and crashes
- Simplified projectile handling. New creatures can now shoot.

DjWarmonger 13 years ago
parent
commit
e2bfd53c98

+ 1 - 7
client/BattleInterface/CBattleAnimations.cpp

@@ -768,13 +768,7 @@ bool CShootingAnimation::init()
 
 	spi.step = 0;
 	spi.frameNum = 0;
-	if(vstd::contains(CGI->creh->idToProjectileSpin, shooterInfo->idNumber))
-		spi.spin = CGI->creh->idToProjectileSpin[shooterInfo->idNumber];
-	else
-	{
-		tlog2 << "Warning - no projectile spin for spi.creID " << shooterInfo->idNumber << std::endl;
-		spi.spin = false;
-	}
+	spi.spin = shooterInfo->projectileSpin;
 
 	Point xycoord = CClickableHex::getXYUnitAnim(shooter->position, true, shooter, owner);
 	Point destcoord;

+ 2 - 2
client/BattleInterface/CBattleInterface.cpp

@@ -284,10 +284,10 @@ CBattleInterface::CBattleInterface(const CCreatureSet * army1, const CCreatureSe
 	BOOST_FOREACH(const CStack *s, stacks)
 	{
 		int creID = (s->getCreature()->idNumber == 149) ? CGI->creh->factionToTurretCreature[siegeH->town->town->typeID] : s->getCreature()->idNumber; //id of creature whose shots should be loaded
-		if(s->getCreature()->isShooting() && vstd::contains(CGI->creh->idToProjectile, creID))
+		if(s->getCreature()->isShooting())
 		{
 			CDefHandler *&projectile = idToProjectile[s->getCreature()->idNumber];
-			projectile = CDefHandler::giveDef(CGI->creh->idToProjectile[creID]);
+			projectile = CDefHandler::giveDef(s->getCreature()->projectile);
 
 			if(projectile->ourImages.size() > 2) //add symmetric images
 			{

+ 3 - 1
client/CMT.cpp

@@ -33,6 +33,7 @@
 #include "../lib/VCMIDirs.h"
 #include "../lib/NetPacks.h"
 #include "CMessage.h"
+#include "../lib/CModHandler.h"
 #include "../lib/CObjectHandler.h"
 #include "../lib/CArtHandler.h"
 #include "../lib/CScriptingModule.h"
@@ -758,8 +759,9 @@ static void listenForEvents()
 				vstd::clear_pointer(client);
 
 				delete CGI->dobjinfo.get();
-				const_cast<CGameInfo*>(CGI)->dobjinfo = new CDefObjInfoHandler;
+				const_cast<CGameInfo*>(CGI)->dobjinfo = new CDefObjInfoHandler; 
 				const_cast<CGameInfo*>(CGI)->dobjinfo->load();
+				const_cast<CGameInfo*>(CGI)->modh->recreateAdvMapDefs(); //add info about new creatures to dobjinfo
 			};
 
 			switch(ev.user.code)

+ 2 - 2
lib/CCreatureHandler.cpp

@@ -432,10 +432,10 @@ void CCreatureHandler::loadCreatures()
 		value = &creature["projectile_defname"];
 		if (!value->isNull())
 		{
-			idToProjectile[creatureID] = value->String();
+			c->projectile = value->String();
 
 			value = &creature["projectile_spin"];
-			idToProjectileSpin[creatureID] = value->Bool();
+			c->projectileSpin = value->Bool();
 		}
 
 		value = &creature["turret_shooter"];

+ 3 - 4
lib/CCreatureHandler.h

@@ -47,6 +47,7 @@ public:
 	double missleFrameAngles[12];
 	int troopCountLocationOffset, attackClimaxFrame;
 	std::string projectile;
+	ui8 projectileSpin; //if true, appropriate projectile is spinning during flight
 	///end of anim info
 
 	//sound info
@@ -109,7 +110,7 @@ public:
 			& timeBetweenFidgets & walkAnimationTime & attackAnimationTime & flightAnimationDistance
 			& upperRightMissleOffsetX & rightMissleOffsetX & lowerRightMissleOffsetX & upperRightMissleOffsetY & rightMissleOffsetY & lowerRightMissleOffsetY
 			& missleFrameAngles & troopCountLocationOffset & attackClimaxFrame;
-		h & sounds & projectile;
+		h & sounds & projectile & projectileSpin;
 
 		h & doubleWide;
 	}
@@ -129,8 +130,6 @@ public:
 	std::set<TCreature> doubledCreatures; //they get double week
 	std::vector<ConstTransitivePtr<CCreature> > creatures; //creature ID -> creature info
 	bmap<std::string,int> nameToID;
-	bmap<int,std::string> idToProjectile;
-	bmap<int,bool> idToProjectileSpin; //if true, appropriate projectile is spinning during flight
 	std::vector<si8> factionAlignments; //1 for good, 0 for neutral and -1 for evil with faction ID as index
 	int factionToTurretCreature[GameConstants::F_NUMBER]; //which creature's animation should be used to dispaly creature in turret while siege
 
@@ -168,7 +167,7 @@ public:
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 		//TODO: should be optimized, not all these informations needs to be serialized (same for ccreature)
-		h & notUsedMonsters & creatures & nameToID & idToProjectile & idToProjectileSpin & factionToTurretCreature;
+		h & notUsedMonsters & creatures & nameToID & factionToTurretCreature;
 		h & stackBonuses & expRanks & maxExpPerBattle & expAfterUpgrade;
 		h & factionCommanders & skillLevels & skillRequirements & commanderLevelPremy;
 		h & allCreatures;

+ 14 - 7
lib/CModHandler.cpp

@@ -234,10 +234,10 @@ CCreature * CModHandler::loadCreature (const JsonNode &node)
 		cre->missleFrameAngles[i++] = angle.Float();
 	}
 	cre->advMapDef = graphics["map"].String();
-	//TODO: we need to know creature id to add it
-	//FIXME: creature handler is not yet initialized
-	//VLC->creh->idToProjectile[cre->idNumber] = "PLCBOWX.DEF";
+	
+	//TODO: parse
 	cre->projectile = "PLCBOWX.DEF";
+	cre->projectileSpin = false;
 
 	const JsonNode & sounds = node["sound"];
 
@@ -257,6 +257,16 @@ CCreature * CModHandler::loadCreature (const JsonNode &node)
 	creatures.push_back(cre);
 	return cre;
 }
+void CModHandler::recreateAdvMapDefs()
+{
+	BOOST_FOREACH (auto creature, creatures)
+	{
+		//generate adventure map object info & graphics
+		CGDefInfo* nobj = new CGDefInfo (*VLC->dobjinfo->gobjs[GameConstants::CREI_TYPE][0]);//copy all typical properties
+		nobj->name = creature->advMapDef; //change only def name (?)
+		VLC->dobjinfo->gobjs[GameConstants::CREI_TYPE][creature->idNumber] = nobj;
+	}
+}
 void CModHandler::recreateHandlers()
 {
 	//TODO: consider some template magic to unify all handlers?
@@ -273,11 +283,8 @@ void CModHandler::recreateHandlers()
 		//	VLC->creh->nameToID[creature->nameRef] = creature->idNumber;
 		VLC->creh->nameToID[creature->nameSing] = creature->idNumber;
 
-		//generate adventure map object info & graphics
-		CGDefInfo* nobj = new CGDefInfo (*VLC->dobjinfo->gobjs[GameConstants::CREI_TYPE][0]);//copy all typical properties
-		nobj->name = creature->advMapDef; //change only def name (?)
-		VLC->dobjinfo->gobjs[GameConstants::CREI_TYPE][creature->idNumber] = nobj;
 	}
+	recreateAdvMapDefs();
 	BOOST_FOREACH (auto creature, VLC->creh->creatures) //populate upgrades described with string
 	{
 		BOOST_FOREACH (auto upgradeName, creature->upgradeNames)

+ 2 - 1
lib/CModHandler.h

@@ -75,7 +75,8 @@ public:
 
 	void loadConfigFromFile (std::string name);
 	void saveConfigToFile (std::string name);
-	CCreature * loadCreature (const JsonNode &node); //TODO: handler collections now use ModHandler vector index. Should they be aligned according to mods actually used??
+	CCreature * loadCreature (const JsonNode &node);
+	void recreateAdvMapDefs();
 	void recreateHandlers();
 
 	struct DLL_LINKAGE hardcodedFeatures

+ 2 - 0
lib/VCMI_Lib.cpp

@@ -102,6 +102,7 @@ void LibClasses::init()
 	tlog0<<"\tSpell handler: "<<pomtime.getDiff()<<std::endl;
 
 	modh->recreateHandlers(); //load all new creatures parsed in the meantime.
+	//FIXME: make sure that everything is ok after game restart
 	//TODO: This should be done every time mod config changes
 
 	IS_AI_ENABLED = false;
@@ -145,6 +146,7 @@ void LibClasses::callWhenDeserializing()
 	generaltexth = new CGeneralTextHandler;
 	generaltexth->load();
 	arth->loadArtifacts(true);
+	//modh->recreateHandlers();
 	//modh->loadConfigFromFile ("defaultMods"); //TODO: remember last saved config
 }