[Scummvm-git-logs] scummvm master -> a7650b1039732ad6cbe5762ae33a7d22ab17f306

a-yyg 76591232+a-yyg at users.noreply.github.com
Tue Jul 6 15:16:05 UTC 2021


This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
6c857c3318 SAGA2: Add more debug output for saveload
2c7416f99a SAGA2: Implement Timers and Calender saveloading
a7650b1039 SAGA2: Implement Worlds loading


Commit: 6c857c3318fcfdf146d11a825a1977157fb8fee7
    https://github.com/scummvm/scummvm/commit/6c857c3318fcfdf146d11a825a1977157fb8fee7
Author: a/ (yuri.kgpps at gmail.com)
Date: 2021-07-07T00:13:15+09:00

Commit Message:
SAGA2: Add more debug output for saveload

Changed paths:
    engines/saga2/main.cpp


diff --git a/engines/saga2/main.cpp b/engines/saga2/main.cpp
index 2b4edb2a68..8130d2e4d2 100644
--- a/engines/saga2/main.cpp
+++ b/engines/saga2/main.cpp
@@ -691,6 +691,8 @@ void saveGlobals(SaveFileConstructor &saveGame) {
 }
 
 void saveGlobals(Common::OutSaveFile *out) {
+	debugC(2, kDebugSaveload, "Saving globals");
+
 	out->write("GLOB", 4);
 	out->writeUint32LE(sizeof(GlobalsArchive));
 
@@ -704,6 +706,17 @@ void saveGlobals(Common::OutSaveFile *out) {
 	out->writeByte(actorTasksPaused);
 	out->writeByte(combatBehaviorEnabled);
 	out->writeByte(backgroundSimulationPaused);
+
+	debugC(3, kDebugSaveload, "... objectIndex = %d", objectIndex);
+	debugC(3, kDebugSaveload, "... actorIndex = %d", actorIndex);
+	debugC(3, kDebugSaveload, "... brotherBandingEnabled = %d", brotherBandingEnabled);
+	debugC(3, kDebugSaveload, "... centerActorIndicatorEnabled = %d", centerActorIndicatorEnabled);
+	debugC(3, kDebugSaveload, "... interruptableMotionsPaused = %d", interruptableMotionsPaused);
+	debugC(3, kDebugSaveload, "... objectStatesPaused = %d", objectStatesPaused);
+	debugC(3, kDebugSaveload, "... actorStatesPaused = %d", actorStatesPaused);
+	debugC(3, kDebugSaveload, "... actorTasksPaused = %d", actorTasksPaused);
+	debugC(3, kDebugSaveload, "... combatBehaviorEnabled = %d", combatBehaviorEnabled);
+	debugC(3, kDebugSaveload, "... backgroundSimulationPaused = %d", backgroundSimulationPaused);
 }
 
 //-----------------------------------------------------------------------
@@ -727,6 +740,8 @@ void loadGlobals(SaveFileReader &saveGame) {
 }
 
 void loadGlobals(Common::InSaveFile *in) {
+	debugC(2, kDebugSaveload, "Loading globals");
+
 	objectIndex = in->readUint32LE();
 	actorIndex = in->readUint32LE();
 	brotherBandingEnabled = in->readByte();
@@ -737,6 +752,17 @@ void loadGlobals(Common::InSaveFile *in) {
 	actorTasksPaused = in->readByte();
 	combatBehaviorEnabled = in->readByte();
 	backgroundSimulationPaused = in->readByte();
+
+	debugC(3, kDebugSaveload, "... objectIndex = %d", objectIndex);
+	debugC(3, kDebugSaveload, "... actorIndex = %d", actorIndex);
+	debugC(3, kDebugSaveload, "... brotherBandingEnabled = %d", brotherBandingEnabled);
+	debugC(3, kDebugSaveload, "... centerActorIndicatorEnabled = %d", centerActorIndicatorEnabled);
+	debugC(3, kDebugSaveload, "... interruptableMotionsPaused = %d", interruptableMotionsPaused);
+	debugC(3, kDebugSaveload, "... objectStatesPaused = %d", objectStatesPaused);
+	debugC(3, kDebugSaveload, "... actorStatesPaused = %d", actorStatesPaused);
+	debugC(3, kDebugSaveload, "... actorTasksPaused = %d", actorTasksPaused);
+	debugC(3, kDebugSaveload, "... combatBehaviorEnabled = %d", combatBehaviorEnabled);
+	debugC(3, kDebugSaveload, "... backgroundSimulationPaused = %d", backgroundSimulationPaused);
 }
 
 /********************************************************************/


Commit: 2c7416f99a2ddb90b8e3297efee2ad6469d774e3
    https://github.com/scummvm/scummvm/commit/2c7416f99a2ddb90b8e3297efee2ad6469d774e3
Author: a/ (yuri.kgpps at gmail.com)
Date: 2021-07-07T00:13:15+09:00

Commit Message:
SAGA2: Implement Timers and Calender saveloading

Changed paths:
    engines/saga2/calender.cpp
    engines/saga2/calender.h
    engines/saga2/fta.h
    engines/saga2/loadsave.cpp
    engines/saga2/timers.cpp


diff --git a/engines/saga2/calender.cpp b/engines/saga2/calender.cpp
index 2ef086f60a..6326305518 100644
--- a/engines/saga2/calender.cpp
+++ b/engines/saga2/calender.cpp
@@ -233,6 +233,31 @@ void saveCalender(SaveFileConstructor &saveGame) {
 	}
 }
 
+void saveCalender(Common::OutSaveFile *out) {
+	debugC(2, kDebugSaveload, "Saving calender");
+
+	out->write("CALE", 4);
+	out->writeUint32LE(sizeof(calenderPaused + sizeof(calender)));
+
+	out->writeByte(calenderPaused);
+	out->writeUint16LE(calender.years);
+	out->writeUint16LE(calender.weeks);
+	out->writeUint16LE(calender.days);
+	out->writeUint16LE(calender.dayInYear);
+	out->writeUint16LE(calender.dayInWeek);
+	out->writeUint16LE(calender.hour);
+	out->writeUint16LE(calender.frameInHour);
+
+	debugC(3, kDebugSaveload, "... calenderPaused = %d", calenderPaused);
+	debugC(3, kDebugSaveload, "... calender.years = %d", calender.years);
+	debugC(3, kDebugSaveload, "... calender.weeks = %d", calender.weeks);
+	debugC(3, kDebugSaveload, "... calender.days = %d", calender.days);
+	debugC(3, kDebugSaveload, "... calender.dayInYear = %d", calender.dayInYear);
+	debugC(3, kDebugSaveload, "... calender.dayInWeek = %d", calender.dayInWeek);
+	debugC(3, kDebugSaveload, "... calender.hour = %d", calender.hour);
+	debugC(3, kDebugSaveload, "... calender.frameInHour = %d", calender.frameInHour);
+}
+
 //-----------------------------------------------------------------------
 //	Read the calender data from a save file.  Assume the save file is at
 //	the correct chunk.
@@ -244,6 +269,28 @@ void loadCalender(SaveFileReader &saveGame) {
 	saveGame.read(&calender, sizeof(calender));
 }
 
+void loadCalender(Common::InSaveFile *in) {
+	debugC(2, kDebugSaveload, "Loading calender");
+
+	calenderPaused = in->readByte();
+	calender.years = in->readUint16LE();
+	calender.weeks = in->readUint16LE();
+	calender.days = in->readUint16LE();
+	calender.dayInYear = in->readUint16LE();
+	calender.dayInWeek = in->readUint16LE();
+	calender.hour = in->readUint16LE();
+	calender.frameInHour = in->readUint16LE();
+
+	debugC(3, kDebugSaveload, "... calenderPaused = %d", calenderPaused);
+	debugC(3, kDebugSaveload, "... calender.years = %d", calender.years);
+	debugC(3, kDebugSaveload, "... calender.weeks = %d", calender.weeks);
+	debugC(3, kDebugSaveload, "... calender.days = %d", calender.days);
+	debugC(3, kDebugSaveload, "... calender.dayInYear = %d", calender.dayInYear);
+	debugC(3, kDebugSaveload, "... calender.dayInWeek = %d", calender.dayInWeek);
+	debugC(3, kDebugSaveload, "... calender.hour = %d", calender.hour);
+	debugC(3, kDebugSaveload, "... calender.frameInHour = %d", calender.frameInHour);
+}
+
 CalenderTime    calender;
 
 bool isDayTime(void) {
diff --git a/engines/saga2/calender.h b/engines/saga2/calender.h
index 4e9d0b7356..b6aa1f58b5 100644
--- a/engines/saga2/calender.h
+++ b/engines/saga2/calender.h
@@ -95,7 +95,9 @@ uint32 operator - (const CalenderTime &time1, const CalenderTime &time2);
 void initCalender(void);
 
 void saveCalender(SaveFileConstructor &saveGame);
+void saveCalender(Common::OutSaveFile *out);
 void loadCalender(SaveFileReader &saveGame);
+void loadCalender(Common::InSaveFile *in);
 
 bool isDayTime(void);
 
diff --git a/engines/saga2/fta.h b/engines/saga2/fta.h
index 1412f18e0a..a21cf831ae 100644
--- a/engines/saga2/fta.h
+++ b/engines/saga2/fta.h
@@ -125,9 +125,11 @@ void initTimer(void);
 
 //  Save the timer to a save file
 void saveTimer(SaveFileConstructor &saveGame);
+void saveTimer(Common::OutSaveFile *out);
 
 //  Load the timer from a save file
 void loadTimer(SaveFileReader &saveGame);
+void loadTimer(Common::InSaveFile *in);
 
 //  Cleanup the timer -- nothing to do
 inline void cleanupTimer(void) {}
diff --git a/engines/saga2/loadsave.cpp b/engines/saga2/loadsave.cpp
index 33d1441b53..b657bc3454 100644
--- a/engines/saga2/loadsave.cpp
+++ b/engines/saga2/loadsave.cpp
@@ -145,10 +145,10 @@ Common::Error saveGameState(int16 saveNo, char *saveName) {
 	header.write(out);
 
 	saveGlobals(out);
+	saveTimer(out);
+	saveCalender(out);
 
 #if 0
-	saveTimer(saveGame);
-	saveCalender(saveGame);
 	saveWorlds(saveGame);
 	saveActors(saveGame);
 	saveObjects(saveGame);
@@ -241,16 +241,17 @@ void loadSavedGameState(int16 saveNo) {
 			loadGlobals(in);
 			loadFlags |= loadGlobalsFlag;
 			break;
-#if 0
+
 		case MKTAG('T', 'I', 'M', 'E'):
-			loadTimer(saveGame);
+			loadTimer(in);
 			loadFlags |= loadTimerFlag;
 			break;
 
 		case MKTAG('C', 'A', 'L', 'E'):
-			loadCalender(saveGame);
+			loadCalender(in);
 			loadFlags |= loadCalenderFlag;
 			break;
+#if 0
 
 		case MKTAG('W', 'R', 'L', 'D'):
 			loadWorlds(saveGame);
diff --git a/engines/saga2/timers.cpp b/engines/saga2/timers.cpp
index 6323661e3b..030e6a85c3 100644
--- a/engines/saga2/timers.cpp
+++ b/engines/saga2/timers.cpp
@@ -67,6 +67,18 @@ void saveTimer(SaveFileConstructor &saveGame) {
 	    sizeof(time));
 }
 
+void saveTimer(Common::OutSaveFile *out) {
+	debugC(2, kDebugSaveload, "Saving time");
+
+	int32 time = gameTime;
+
+	out->write("TIME", 4);
+	out->writeUint32LE(sizeof(time));
+	out->writeUint32LE(time);
+
+	debugC(3, kDebugSaveload, "... time = %d", time);
+}
+
 void loadTimer(SaveFileReader &saveGame) {
 	int32   time;
 
@@ -74,6 +86,14 @@ void loadTimer(SaveFileReader &saveGame) {
 	gameTime = time;
 }
 
+void loadTimer(Common::InSaveFile *in) {
+	debugC(2, kDebugSaveload, "Loading time");
+
+	gameTime = in->readUint32LE();
+
+	debugC(3, kDebugSaveload, "... time = %d", gameTime);
+}
+
 /* ====================================================================== *
    Alarms
  * ====================================================================== */


Commit: a7650b1039732ad6cbe5762ae33a7d22ab17f306
    https://github.com/scummvm/scummvm/commit/a7650b1039732ad6cbe5762ae33a7d22ab17f306
Author: a/ (yuri.kgpps at gmail.com)
Date: 2021-07-07T00:13:15+09:00

Commit Message:
SAGA2: Implement Worlds loading

Changed paths:
    engines/saga2/loadsave.cpp
    engines/saga2/objects.cpp
    engines/saga2/objects.h


diff --git a/engines/saga2/loadsave.cpp b/engines/saga2/loadsave.cpp
index b657bc3454..34033a7031 100644
--- a/engines/saga2/loadsave.cpp
+++ b/engines/saga2/loadsave.cpp
@@ -147,9 +147,9 @@ Common::Error saveGameState(int16 saveNo, char *saveName) {
 	saveGlobals(out);
 	saveTimer(out);
 	saveCalender(out);
+	saveWorlds(out);
 
 #if 0
-	saveWorlds(saveGame);
 	saveActors(saveGame);
 	saveObjects(saveGame);
 	saveBands(saveGame);
@@ -251,12 +251,12 @@ void loadSavedGameState(int16 saveNo) {
 			loadCalender(in);
 			loadFlags |= loadCalenderFlag;
 			break;
-#if 0
 
 		case MKTAG('W', 'R', 'L', 'D'):
-			loadWorlds(saveGame);
+			loadWorlds(in);
 			loadFlags |= loadWorldsFlag;
 			break;
+#if 0
 
 		case MKTAG('A', 'C', 'T', 'R'):
 			loadActors(saveGame);
diff --git a/engines/saga2/objects.cpp b/engines/saga2/objects.cpp
index 5f2d4217d2..c6ae0aa5d7 100644
--- a/engines/saga2/objects.cpp
+++ b/engines/saga2/objects.cpp
@@ -2374,6 +2374,35 @@ GameWorld::GameWorld(void **buf) {
 #endif
 }
 
+GameWorld::GameWorld(Common::SeekableReadStream *stream) {
+	size.u = size.v = stream->readSint16LE();
+	mapNum = stream->readSint16LE();
+
+	debugC(3, kDebugSaveload, "World %d", thisID());
+	debugC(3, kDebugSaveload, "... size.u = size.v = %d", size.u);
+	debugC(3, kDebugSaveload, "... mapNum = %d", mapNum);
+
+	if (size.u != 0) {
+		int32 sectorArrayCount;
+
+		sectorArraySize = size.u / kSectorSize;
+		sectorArrayCount = sectorArraySize * sectorArraySize;
+		sectorArray = new Sector[sectorArrayCount]();
+
+		if (sectorArray == nullptr)
+			error("Unable to allocate world %d sector array", mapNum);
+
+		for (int i = 0; i < sectorArrayCount; ++i) {
+			sectorArray[i].read(stream);
+			debugC(4, kDebugSaveload, "...... sectArray[%d].activationCount = %d", i, sectorArray[i].activationCount);
+			debugC(4, kDebugSaveload, "...... sectArray[%d].childID = %d", i, sectorArray[i].childID);
+		}
+	} else {
+		sectorArraySize = 0;
+		sectorArray = nullptr;
+	}
+}
+
 GameWorld::~GameWorld() {
 	if (sectorArray)
 		delete[] sectorArray;
@@ -2806,6 +2835,45 @@ void saveWorlds(SaveFileConstructor &saveGame) {
 	free(archiveBuffer);
 }
 
+void saveWorlds(Common::OutSaveFile *out) {
+	debugC(2, kDebugSaveload, "Saving worlds");
+
+	int32 archiveBufSize = 0;
+
+	//  Accumulate size of archive buffer
+
+	//  Add size of the current world's ID
+	archiveBufSize += sizeof(ObjectID);
+
+	for (int i = 0; i < worldCount; i++)
+		archiveBufSize += worldList[i].archiveSize();
+
+	out->write("WRLD", 4);
+	out->writeUint32LE(archiveBufSize);
+
+	out->writeUint16LE(currentWorld->thisID());
+
+	debugC(3, kDebugSaveload, "... currentWorld->thisID() = %d", currentWorld->thisID());
+
+	for (int i = 0; i < worldCount; ++i) {
+		Sector *sectArray = worldList[i].sectorArray;
+		int32 sectorArrayCount = worldList[i].sectorArraySize *
+		                         worldList[i].sectorArraySize;
+
+		out->writeSint16LE(worldList[i].size.u);
+		out->writeSint16LE(worldList[i].mapNum);
+
+		debugC(3, kDebugSaveload, "... worldList[%d].size.u = %d", i, worldList[i].size.u);
+		debugC(3, kDebugSaveload, "... worldList[%d].mapNum = %d", i, worldList[i].mapNum);
+
+		for (int j = 0; j < sectorArrayCount; ++j) {
+			sectArray[j].write(out);
+			debugC(4, kDebugSaveload, "...... sectArray[%d].activationCount = %d", j, sectArray[j].activationCount);
+			debugC(4, kDebugSaveload, "...... sectArray[%d].childID = %d", j, sectArray[j].childID);
+		}
+	}
+}
+
 //-------------------------------------------------------------------
 //	Load the worlds from a save game file
 
@@ -2848,6 +2916,27 @@ void loadWorlds(SaveFileReader &saveGame) {
 	setCurrentMap(currentWorld->mapNum);
 }
 
+void loadWorlds(Common::InSaveFile *in) {
+	debugC(2, kDebugSaveload, "Loading worlds");
+
+	ObjectID    currentWorldID;
+
+	worldList = new GameWorld[worldListSize]();
+	if (worldList == nullptr)
+		error("Unable to allocate world list");
+
+	currentWorldID = in->readUint16LE();
+
+	debugC(3, kDebugSaveload, "... currentWorldID = %d", currentWorldID);
+
+	for (int i = 0; i < worldCount; ++i)
+		new (&worldList[i]) GameWorld(in);
+
+	//  Reset the current world
+	currentWorld = (GameWorld *)GameObject::objectAddress(currentWorldID);
+	setCurrentMap(currentWorld->mapNum);
+}
+
 //-------------------------------------------------------------------
 //	Cleanup the GameWorld list
 
@@ -2858,7 +2947,10 @@ void cleanupWorlds(void) {
 		gw->cleanup();
 	}
 
-	if (worldList != nullptr) delete[] worldList;
+	if (worldList != nullptr) {
+		delete[] worldList;
+		worldList = nullptr;
+	}
 }
 
 //-------------------------------------------------------------------
@@ -3140,6 +3232,17 @@ void Sector::deactivate(void) {
 	activationCount--;
 }
 
+void Sector::read(Common::InSaveFile *in) {
+	activationCount = in->readUint16LE();
+	childID = in->readUint16LE();
+}
+
+void Sector::write(Common::OutSaveFile *out) {
+	out->writeUint16LE(activationCount);
+	out->writeUint16LE(childID);
+}
+
+
 /* ======================================================================= *
    ActiveRegion member functions
  * ======================================================================= */
diff --git a/engines/saga2/objects.h b/engines/saga2/objects.h
index 78a0b6b84b..7f4d3b24aa 100644
--- a/engines/saga2/objects.h
+++ b/engines/saga2/objects.h
@@ -739,6 +739,9 @@ public:
 
 	void activate(void);
 	void deactivate(void);
+
+	void write(Common::OutSaveFile *out);
+	void read(Common::InSaveFile *in);
 };
 
 /* ======================================================================= *
@@ -761,10 +764,10 @@ class GameWorld : public GameObject {
 	friend class    GameObject;
 	friend class    ObjectIterator;
 
+public:
 	TilePoint       size;                   // size of world in U/V coords
 	int16           sectorArraySize;        // size of sector array
 	Sector          *sectorArray;          // array of sectors
-public:
 	int16           mapNum;                 // map number for this world.
 
 	//  Default constructor
@@ -776,6 +779,8 @@ public:
 	//  Constructor -- reconstruct from archive buffer
 	GameWorld(void **buf);
 
+	GameWorld(Common::SeekableReadStream *stream);
+
 	~GameWorld();
 
 	int32 archiveSize(void);
@@ -1405,9 +1410,11 @@ void initWorlds(void);
 
 //  Save worlds to the save file
 void saveWorlds(SaveFileConstructor &saveGame);
+void saveWorlds(Common::OutSaveFile *out);
 
 //  Load worlds from the save file
 void loadWorlds(SaveFileReader &saveGame);
+void loadWorlds(Common::InSaveFile *in);
 
 //  Cleanup game worlds
 void cleanupWorlds(void);




More information about the Scummvm-git-logs mailing list