Browse Source

Naive solution for endianess issues. Seems to allow loading a big-endian save on little-endian build.
Fixed compile issues with CEmptyAI. Removed unnecessary methods from its.

Michał W. Urbańczyk 13 years ago
parent
commit
4cd77a0192
4 changed files with 38 additions and 21 deletions
  1. 12 6
      AI/EmptyAI/CEmptyAI.cpp
  2. 4 11
      AI/EmptyAI/CEmptyAI.h
  3. 14 3
      lib/Connection.cpp
  4. 8 1
      lib/Connection.h

+ 12 - 6
AI/EmptyAI/CEmptyAI.cpp

@@ -12,16 +12,22 @@ void CEmptyAI::yourTurn()
 {
 	cb->endTurn();
 }
-void CEmptyAI::heroKilled(const CGHeroInstance *)
+void CEmptyAI::heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback)
 {
+	callback(rand()%skills.size());
 }
-void CEmptyAI::heroCreated(const CGHeroInstance *)
+
+void CEmptyAI::commanderGotLevel(const CCommanderInstance * commander, std::vector<ui32> skills, boost::function<void(ui32)> &callback)
 {
+	callback(0);
 }
-void CEmptyAI::heroMoved(const TryMoveHero& TMH)
+
+void CEmptyAI::showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, const int soundID, bool selection, bool cancel)
 {
+	cb->selectionMade(0, askID);
 }
-void CEmptyAI::heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback)
+
+void CEmptyAI::showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, boost::function<void()> &onEnd)
 {
-	callback(rand()%skills.size());
-}
+	onEnd();
+}

+ 4 - 11
AI/EmptyAI/CEmptyAI.h

@@ -12,17 +12,10 @@ class CEmptyAI : public CGlobalAI
 public:
 	void init(CCallback * CB) override;
 	void yourTurn() override;
-	void heroKilled(const CGHeroInstance *) override;
-	void heroCreated(const CGHeroInstance *) override;
-	void heroMoved(const TryMoveHero&) override;
-	void heroPrimarySkillChanged(const CGHeroInstance * hero, int which, si64 val) override {};
-	void showSelDialog(std::string text, std::vector<CSelectableComponent*> & components, int askID) override {};
-	void tileRevealed(const boost::unordered_set<int3, ShashInt3> &pos) override {};
-	void tileHidden(const boost::unordered_set<int3, ShashInt3> &pos) override {};
-	void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, int soundID, bool selection, bool cancel) override {};
-	void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, boost::function<void()> &onEnd) override {};
-	void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback) override;
-	void commanderGotLevel (const CCommanderInstance * commander, std::vector<ui32> skills, boost::function<void(ui32)> &callback) override {}; //TODO
+	void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback) override; 
+	void commanderGotLevel (const CCommanderInstance * commander, std::vector<ui32> skills, boost::function<void(ui32)> &callback) override;
+	void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, const int soundID, bool selection, bool cancel) override; 
+	void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, bool removableUnits, boost::function<void()> &onEnd) override;
 };
 
 #define NAME "EmptyAI 0.1"

+ 14 - 3
lib/Connection.cpp

@@ -302,7 +302,8 @@ CLoadFile::~CLoadFile()
 
 int CLoadFile::read( const void * data, unsigned size )
 {
-	sfile->read((char *)data,size);
+	char *bytePtr = (char *)data;
+	sfile->read(bytePtr, size);
 	return size;
 }
 
@@ -335,8 +336,18 @@ void CLoadFile::openNextFile(const std::string &fname, int minimalVersion)
 		}
 		if(myVersion > version)
 		{
-			tlog1 << "Error: Too new file format! (file " << fname << " )\n";
-			sfile.release();
+			auto versionptr = (char*)&myVersion;
+			std::reverse(versionptr, versionptr + 4);
+			if(myVersion == version)
+			{
+				reverseEndianess = true;
+				tlog3 << fname << " seems to have different endianess!\n";
+			}
+			else
+			{
+				tlog1 << "Error: Too new file format! (file " << fname << " )\n";
+				sfile.release();
+			}
 		}
 	}
 }

+ 8 - 1
lib/Connection.h

@@ -687,6 +687,7 @@ public:
 	bool saving;
 	std::map<ui16,CBasicPointerLoader*> loaders; // typeID => CPointerSaver<serializer,type>
 	ui32 myVersion;
+	bool reverseEndianess; //if source has different endianess than us, we reverse bytes
 
 	std::map<ui32, void*> loadedPointers;
 	bool smartPointerSerialization;
@@ -696,6 +697,7 @@ public:
 		saving = false;
 		myVersion = version;
 		smartPointerSerialization = true;
+		reverseEndianess = false;
 	}
 
 	~CISer()
@@ -758,7 +760,12 @@ public:
 	template <typename T>
 	void loadPrimitive(T &data)
 	{
-		this->This()->read(&data,sizeof(data));
+		char * dataPtr = (char*)&data;
+		unsigned length = sizeof(data);
+
+		this->This()->read(dataPtr,length);
+		if(reverseEndianess)
+			std::reverse(dataPtr, dataPtr + length);
 	}
 
 	template <typename T>