Prechádzať zdrojové kódy

Support for smart pointer serialization. Fixed creature banks serialization. Minor fixes.

Michał W. Urbańczyk 16 rokov pred
rodič
commit
eb6f7fffc9

+ 1 - 1
AI/GeniusAI/CGeniusAI.cpp

@@ -1025,7 +1025,7 @@ void CGeniusAI::yourTurn()
 {
 	static boost::mutex mutex;
 	boost::mutex::scoped_lock lock(mutex);
-	m_cb->waitTillRealize = true;
+	m_cb->waitTillRealize = false;
 	static int seed = rand();
 	srand(seed);
 // 	if (m_cb->getDate() == 1) {

+ 1 - 1
client/CAdvmapInterface.cpp

@@ -2037,7 +2037,7 @@ void CAdvMapInt::mouseMoved( const SDL_MouseMotionEvent & sEvent )
 
 bool CAdvMapInt::isActive()
 {
-	return active & ~CIntObject.KEYBOARD;
+	return active & ~CIntObject::KEYBOARD;
 }
 
 CAdventureOptions::CAdventureOptions()

+ 6 - 6
hch/CObjectHandler.cpp

@@ -167,7 +167,9 @@ void CObjectHandler::loadObjects()
 
 		for(int i=0; i<4; ++i) //reading levels
 		{
-			BankConfig bc;
+			banksInfo[g].push_back(new BankConfig);
+
+			BankConfig &bc = *banksInfo[g].back();
 			std::string buf;
 			char dump;
 			//bc.level is of type char and thus we cannot read directly to it; same for some othre variables
@@ -210,8 +212,6 @@ void CObjectHandler::loadObjects()
 			istr >> bc.rewardDifficulty;
 			istr >> buf;
 			bc.easiest = atoi(buf.c_str());
-
-			banksInfo[g].push_back(bc);
 		}
 	}
 }
@@ -4076,9 +4076,9 @@ void CBank::reset(ui16 var1) //prevents desync
 	ui8 chance = 0;
 	for (ui8 i = 0; i < VLC->objh->banksInfo[index].size(); i++)
 	{	
-		if (var1 < (chance += VLC->objh->banksInfo[index][i].chance))
+		if (var1 < (chance += VLC->objh->banksInfo[index][i]->chance))
 		{
- 			bc = &VLC->objh->banksInfo[index][i];
+ 			bc = VLC->objh->banksInfo[index][i];
 			break;
 		}
 	}
@@ -4125,7 +4125,7 @@ void CBank::setPropertyDer (ui8 what, ui32 val)
 			multiplier = ((float)val)/100;
 			break;
 		case 13: //bank preset
-			bc = &VLC->objh->banksInfo[index][val];
+			bc = VLC->objh->banksInfo[index][val];
 			break;
 		case 14:
 			reset (val%100);

+ 2 - 2
hch/CObjectHandler.h

@@ -938,7 +938,7 @@ class DLL_EXPORT CBank : public CArmedInstance
 	template <typename Handler> void serialize(Handler &h, const int version)
 	{
 		h & static_cast<CGObjectInstance&>(*this);
-		h & index & multiplier & artifacts & daycounter;
+		h & index & multiplier & artifacts & daycounter & bc;
 	}
 };
 class DLL_EXPORT CGPyramid : public CBank
@@ -1057,7 +1057,7 @@ class DLL_EXPORT CObjectHandler
 {
 public:
 	std::vector<si32> cregens; //type 17. dwelling subid -> creature ID
-	std::map <ui32, std::vector <BankConfig> > banksInfo; //[index][preset]
+	std::map <ui32, std::vector <BankConfig*> > banksInfo; //[index][preset]
 	std::map <ui32, std::string> creBanksNames; //[crebank index] -> name of this creature bank
 
 	void loadObjects();

+ 2 - 0
lib/Connection.cpp

@@ -47,6 +47,8 @@ CTypeList typeList;
 
 void CConnection::init()
 {
+	CISer::smartPointerSerialization = false;
+	COSer::smartPointerSerialization = false;
 	registerTypes(static_cast<CISer<CConnection>&>(*this));
 	registerTypes(static_cast<COSer<CConnection>&>(*this));
 #ifdef LIL_ENDIAN

+ 43 - 1
lib/Connection.h

@@ -20,7 +20,7 @@
 #include <boost/mpl/identity.hpp>
 
 #include <boost/type_traits/is_array.hpp>
-const ui32 version = 713;
+const ui32 version = 714;
 class CConnection;
 class CGObjectInstance;
 class CGameState;
@@ -255,9 +255,13 @@ public:
 	bool saving;
 	std::map<ui16,CBasicPointerSaver*> savers; // typeID => CPointerSaver<serializer,type>
 
+	std::map<const void*, ui32> savedPointers;
+	bool smartPointerSerialization;
+
 	COSer()
 	{
 		saving=true;
+		smartPointerSerialization = true;
 	}
 
 	template<typename T> void registerType(const T * t=NULL)
@@ -304,6 +308,22 @@ public:
 		if(!hlp)
 			return;
 
+		if(smartPointerSerialization)
+		{
+			std::map<const void*,ui32>::iterator i = savedPointers.find(data);
+			if(i != savedPointers.end())
+			{
+				//this pointer has been already serialized - write only it's id
+				*this << i->second;
+				return;
+			}
+
+			//give id to this pointer
+			ui32 pid = (ui32)savedPointers.size();
+			savedPointers[data] = pid;
+			*this << pid;
+		}
+
 		//write type identifier
 		ui16 tid = typeList.getTypeID(data);
 		*this << tid;
@@ -438,10 +458,14 @@ public:
 	std::map<ui16,CBasicPointerLoader*> loaders; // typeID => CPointerSaver<serializer,type>
 	ui32 myVersion;
 
+	std::map<ui32, void*> loadedPointers;
+	bool smartPointerSerialization;
+
 	CISer()
 	{
 		saving = false;
 		myVersion = version;
+		smartPointerSerialization = true;
 	}
 
 	~CISer()
@@ -533,10 +557,28 @@ public:
 			return;
 		}
 
+		ui32 pid = -1; //pointer id (or maybe rather pointee id) 
+		std::map<ui32, void*>::iterator i = loadedPointers.end();
+		if(smartPointerSerialization)
+		{
+			*this >> pid; //get the id
+			i = loadedPointers.find(pid); //lookup
+
+			if(i != loadedPointers.end())
+			{
+				//we already got this pointer
+				data = static_cast<T>(i->second);
+				return;
+			}
+		}
+
 		//get type id
 		ui16 tid;
 		*this >> tid;
 		This()->loadPointerHlp(tid, data);
+
+		if(smartPointerSerialization && i == loadedPointers.end())
+			loadedPointers[pid] = data; //add loaded pointer to our lookup map
 	}
 
 	//that part of ptr deserialization was extracted to allow customization of its behavior in derived classes