aboutsummaryrefslogtreecommitdiff
path: root/engines/tinsel/saveload.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/tinsel/saveload.cpp')
-rw-r--r--engines/tinsel/saveload.cpp145
1 files changed, 119 insertions, 26 deletions
diff --git a/engines/tinsel/saveload.cpp b/engines/tinsel/saveload.cpp
index 73a3faf602..3d532300c2 100644
--- a/engines/tinsel/saveload.cpp
+++ b/engines/tinsel/saveload.cpp
@@ -25,8 +25,9 @@
*/
#include "tinsel/actors.h"
+#include "tinsel/dialogs.h"
+#include "tinsel/drives.h"
#include "tinsel/dw.h"
-#include "tinsel/inventory.h"
#include "tinsel/rince.h"
#include "tinsel/savescn.h"
#include "tinsel/serializer.h"
@@ -63,7 +64,11 @@ namespace Tinsel {
#define VER(x) x
+//----------------- GLOBAL GLOBAL DATA --------------------
+int thingHeld = 0;
+int restoreCD = 0;
+SRSTATE SRstate = SR_IDLE;
//----------------- EXTERN FUNCTIONS --------------------
@@ -79,9 +84,6 @@ extern void syncGlobInfo(Serializer &s);
// in POLYGONS.C
extern void syncPolyInfo(Serializer &s);
-// in SAVESCN.CPP
-extern void RestoreScene(SAVED_DATA *sd, bool bFadeOut);
-
//----------------- LOCAL DEFINES --------------------
struct SaveGameHeader {
@@ -93,15 +95,17 @@ struct SaveGameHeader {
};
enum {
- SAVEGAME_ID = 0x44575399, // = 'DWSc' = "DiscWorld ScummVM"
+ DW1_SAVEGAME_ID = 0x44575399, // = 'DWSc' = "DiscWorld 1 ScummVM"
+ DW2_SAVEGAME_ID = 0x44573253, // = 'DW2S' = "DiscWOrld 2 ScummVM"
SAVEGAME_HEADER_SIZE = 4 + 4 + 4 + SG_DESC_LEN + 7
};
+#define SAVEGAME_ID (TinselV2 ? (uint32)DW2_SAVEGAME_ID : (uint32)DW1_SAVEGAME_ID)
//----------------- LOCAL GLOBAL DATA --------------------
static int numSfiles = 0;
-static SFILES savedFiles[MAX_SFILES];
+static SFILES savedFiles[MAX_SAVED_FILES];
static bool NeedLoad = true;
@@ -112,8 +116,6 @@ static const char *SaveSceneDesc = 0;
static int *SaveSceneSsCount = 0;
static char *SaveSceneSsData = 0; // points to 'SAVED_DATA ssdata[MAX_NEST]'
-static SRSTATE SRstate = SR_IDLE;
-
//------------- SAVE/LOAD SUPPORT METHODS ----------------
static void syncTime(Serializer &s, struct tm &t) {
@@ -153,29 +155,38 @@ static bool syncSaveGameHeader(Serializer &s, SaveGameHeader &hdr) {
}
static void syncSavedMover(Serializer &s, SAVED_MOVER &sm) {
- SCNHANDLE *pList[3] = { (SCNHANDLE *)&sm.WalkReels, (SCNHANDLE *)&sm.StandReels, (SCNHANDLE *)&sm.TalkReels };
+ SCNHANDLE *pList[3] = { (SCNHANDLE *)&sm.walkReels,
+ (SCNHANDLE *)&sm.standReels, (SCNHANDLE *)&sm.talkReels };
- s.syncAsUint32LE(sm.MActorState);
+ s.syncAsUint32LE(sm.bActive);
s.syncAsSint32LE(sm.actorID);
- s.syncAsSint32LE(sm.objx);
- s.syncAsSint32LE(sm.objy);
- s.syncAsUint32LE(sm.lastfilm);
+ s.syncAsSint32LE(sm.objX);
+ s.syncAsSint32LE(sm.objY);
+ s.syncAsUint32LE(sm.hLastfilm);
for (int pIndex = 0; pIndex < 3; ++pIndex) {
SCNHANDLE *p = pList[pIndex];
for (int i = 0; i < TOTAL_SCALES * 4; ++i)
s.syncAsUint32LE(*p++);
}
+
+ if (TinselV2) {
+ s.syncAsByte(sm.bHidden);
+
+ s.syncAsSint32LE(sm.brightness);
+ s.syncAsSint32LE(sm.startColour);
+ s.syncAsSint32LE(sm.paletteLength);
+ }
}
static void syncSavedActor(Serializer &s, SAVED_ACTOR &sa) {
s.syncAsUint16LE(sa.actorID);
- s.syncAsUint16LE(sa.z);
+ s.syncAsUint16LE(sa.zFactor);
s.syncAsUint32LE(sa.bAlive);
s.syncAsUint32LE(sa.presFilm);
s.syncAsUint16LE(sa.presRnum);
- s.syncAsUint16LE(sa.presX);
- s.syncAsUint16LE(sa.presY);
+ s.syncAsUint16LE(sa.presPlayX);
+ s.syncAsUint16LE(sa.presPlayY);
}
extern void syncAllActorsAlive(Serializer &s);
@@ -186,6 +197,24 @@ static void syncNoScrollB(Serializer &s, NOSCROLLB &ns) {
s.syncAsSint32LE(ns.c2);
}
+static void syncZPosition(Serializer &s, Z_POSITIONS &zp) {
+ s.syncAsSint16LE(zp.actor);
+ s.syncAsSint16LE(zp.column);
+ s.syncAsSint32LE(zp.z);
+}
+
+static void syncPolyVolatile(Serializer &s, POLY_VOLATILE &p) {
+ s.syncAsByte(p.bDead);
+ s.syncAsSint16LE(p.xoff);
+ s.syncAsSint16LE(p.yoff);
+}
+
+static void syncSoundReel(Serializer &s, SOUNDREELS &sr) {
+ s.syncAsUint32LE(sr.hFilm);
+ s.syncAsSint32LE(sr.column);
+ s.syncAsSint32LE(sr.actorCol);
+}
+
static void syncSavedData(Serializer &s, SAVED_DATA &sd) {
s.syncAsUint32LE(sd.SavedSceneHandle);
s.syncAsUint32LE(sd.SavedBgroundHandle);
@@ -197,7 +226,7 @@ static void syncSavedData(Serializer &s, SAVED_DATA &sd) {
s.syncAsSint32LE(sd.NumSavedActors);
s.syncAsSint32LE(sd.SavedLoffset);
s.syncAsSint32LE(sd.SavedToffset);
- for (int i = 0; i < MAX_INTERPRET; ++i)
+ for (int i = 0; i < NUM_INTERPRET; ++i)
sd.SavedICInfo[i].syncWithSerializer(s);
for (int i = 0; i < MAX_POLY; ++i)
s.syncAsUint32LE(sd.SavedDeadPolys[i]);
@@ -213,6 +242,32 @@ static void syncSavedData(Serializer &s, SAVED_DATA &sd) {
syncNoScrollB(s, sd.SavedNoScrollData.NoHScroll[i]);
s.syncAsUint32LE(sd.SavedNoScrollData.NumNoV);
s.syncAsUint32LE(sd.SavedNoScrollData.NumNoH);
+
+ // Tinsel 2 fields
+ if (TinselV2) {
+ // SavedNoScrollData
+ s.syncAsUint32LE(sd.SavedNoScrollData.xTrigger);
+ s.syncAsUint32LE(sd.SavedNoScrollData.xDistance);
+ s.syncAsUint32LE(sd.SavedNoScrollData.xSpeed);
+ s.syncAsUint32LE(sd.SavedNoScrollData.yTriggerTop);
+ s.syncAsUint32LE(sd.SavedNoScrollData.yTriggerBottom);
+ s.syncAsUint32LE(sd.SavedNoScrollData.yDistance);
+ s.syncAsUint32LE(sd.SavedNoScrollData.ySpeed);
+
+ for (int i = 0; i < NUM_ZPOSITIONS; ++i)
+ syncZPosition(s, sd.zPositions[i]);
+ s.syncBytes(sd.savedActorZ, MAX_SAVED_ACTOR_Z);
+ for (int i = 0; i < MAX_POLY; ++i)
+ syncPolyVolatile(s, sd.SavedPolygonStuff[i]);
+ for (int i = 0; i < 3; ++i)
+ s.syncAsUint32LE(sd.SavedTune[i]);
+ s.syncAsByte(sd.bTinselDim);
+ s.syncAsSint32LE(sd.SavedScrollFocus);
+ for (int i = 0; i < SV_TOPVALID; ++i)
+ s.syncAsSint32LE(sd.SavedSystemVars[i]);
+ for (int i = 0; i < MAX_SOUNDREELS; ++i)
+ syncSoundReel(s, sd.SavedSoundReels[i]);
+ }
}
@@ -247,6 +302,11 @@ static char *NewName(void) {
* the number of files found).
*/
int getList(Common::SaveFileManager *saveFileMan, const Common::String &target) {
+ // No change since last call?
+ // TODO/FIXME: Just always reload this data? Be careful about slow downs!!!
+ if (!NeedLoad)
+ return numSfiles;
+
int i;
const Common::String pattern = target + ".???";
@@ -255,7 +315,7 @@ int getList(Common::SaveFileManager *saveFileMan, const Common::String &target)
numSfiles = 0;
for (Common::StringList::const_iterator file = files.begin(); file != files.end(); ++file) {
- if (numSfiles >= MAX_SFILES)
+ if (numSfiles >= MAX_SAVED_FILES)
break;
const Common::String &fname = *file;
@@ -304,11 +364,10 @@ int getList(void) {
// TODO/FIXME: Just always reload this data? Be careful about slow downs!!!
if (!NeedLoad)
return numSfiles;
-
+
return getList(_vm->getSaveFileMan(), _vm->getTargetName());
}
-
char *ListEntry(int i, letype which) {
if (i == -1)
i = numSfiles;
@@ -322,7 +381,16 @@ char *ListEntry(int i, letype which) {
}
static void DoSync(Serializer &s) {
- int sg = 0;
+ int sg;
+
+ if (TinselV2) {
+ if (s.isSaving())
+ restoreCD = GetCurrentCD();
+ s.syncAsSint16LE(restoreCD);
+ }
+
+ if (TinselV2 && s.isLoading())
+ HoldItem(INV_NOICON);
syncSavedData(s, *srsd);
syncGlobInfo(s); // Glitter globals
@@ -332,11 +400,16 @@ static void DoSync(Serializer &s) {
if (s.isSaving())
sg = WhichItemHeld();
s.syncAsSint32LE(sg);
- if (s.isLoading())
- HoldItem(sg);
+ if (s.isLoading()) {
+ if (TinselV2)
+ thingHeld = sg;
+ else
+ HoldItem(sg);
+ }
syncTimerInfo(s); // Timer data
- syncPolyInfo(s); // Dead polygon data
+ if (!TinselV2)
+ syncPolyInfo(s); // Dead polygon data
syncSCdata(s); // Hook Scene and delayed scene
s.syncAsSint32LE(*SaveSceneSsCount);
@@ -347,7 +420,8 @@ static void DoSync(Serializer &s) {
syncSavedData(s, *sdPtr);
}
- syncAllActorsAlive(s);
+ if (!TinselV2)
+ syncAllActorsAlive(s);
}
/**
@@ -440,7 +514,7 @@ void ProcessSRQueue(void) {
switch (SRstate) {
case SR_DORESTORE:
if (DoRestore()) {
- RestoreScene(srsd, false);
+ DoRestoreScene(srsd, false);
}
SRstate = SR_IDLE;
break;
@@ -467,6 +541,15 @@ void RequestSaveGame(char *name, char *desc, SAVED_DATA *sd, int *pSsCount, SAVE
}
void RequestRestoreGame(int num, SAVED_DATA *sd, int *pSsCount, SAVED_DATA *pSsData) {
+ if (TinselV2) {
+ if (num == -1)
+ return;
+ else if (num == -2) {
+ // From CD change for restore
+ num = RestoreGameNumber;
+ }
+ }
+
assert(num >= 0);
RestoreGameNumber = num;
@@ -476,4 +559,14 @@ void RequestRestoreGame(int num, SAVED_DATA *sd, int *pSsCount, SAVED_DATA *pSsD
SRstate = SR_DORESTORE;
}
+/**
+ * Returns the index of the most recently saved savegame. This will always be
+ * the file at the first index, since the list is sorted by date/time
+ */
+int NewestSavedGame(void) {
+ int numFiles = getList();
+
+ return (numFiles == 0) ? -1 : 0;
+}
+
} // end of namespace Tinsel