aboutsummaryrefslogtreecommitdiff
path: root/engines/cge
diff options
context:
space:
mode:
authorPaul Gilbert2011-07-10 09:44:46 +1000
committerPaul Gilbert2011-07-10 09:44:46 +1000
commit989e071bb9d101696f5498d1eeea5e32c7291e5d (patch)
tree4391491dcb98c027bd867330044be27436f2a4c7 /engines/cge
parentcf1a45f8a8ecfe758dfb6a420b004821528a19cc (diff)
downloadscummvm-rg350-989e071bb9d101696f5498d1eeea5e32c7291e5d.tar.gz
scummvm-rg350-989e071bb9d101696f5498d1eeea5e32c7291e5d.tar.bz2
scummvm-rg350-989e071bb9d101696f5498d1eeea5e32c7291e5d.zip
CGE: Implemented code for saving games, removing the need for the SavTab array
Diffstat (limited to 'engines/cge')
-rw-r--r--engines/cge/cge.cpp51
-rw-r--r--engines/cge/cge.h5
-rw-r--r--engines/cge/cge_main.cpp83
3 files changed, 57 insertions, 82 deletions
diff --git a/engines/cge/cge.cpp b/engines/cge/cge.cpp
index 2c173b8990..25fc4f7c00 100644
--- a/engines/cge/cge.cpp
+++ b/engines/cge/cge.cpp
@@ -116,57 +116,6 @@ void CGEEngine::setup() {
_volume[0] = 0;
_volume[1] = 0;
- _savTab[0]._ptr = &_now;
- _savTab[0]._len = sizeof(_now);
- _savTab[0]._flag = true;
- _savTab[1]._ptr = &_oldLev;
- _savTab[1]._len = sizeof(_oldLev);
- _savTab[1]._flag = true;
- _savTab[2]._ptr = &_demoText;
- _savTab[2]._len = sizeof(_demoText);
- _savTab[2]._flag = true;
- _savTab[3]._ptr = &_game;
- _savTab[3]._len = sizeof(_game);
- _savTab[3]._flag = true;
- _savTab[4]._ptr = &_game;
- _savTab[4]._len = sizeof(_game);
- _savTab[4]._flag = true;
- _savTab[5]._ptr = &_game;
- _savTab[5]._len = sizeof(_game);
- _savTab[5]._flag = true;
- _savTab[6]._ptr = &_game;
- _savTab[6]._len = sizeof(_game);
- _savTab[6]._flag = true;
- _savTab[7]._ptr = &_game;
- _savTab[7]._len = sizeof(_game);
- _savTab[7]._flag = true;
- _savTab[8]._ptr = &_vga->_mono;
- _savTab[8]._len = sizeof(_vga->_mono);
- _savTab[8]._flag = false;
- _savTab[9]._ptr = &_music;
- _savTab[9]._len = sizeof(_music);
- _savTab[9]._flag = true;
- _savTab[10]._ptr = _volume;
- _savTab[10]._len = sizeof(_volume);
- _savTab[10]._flag = true;
- _savTab[11]._ptr = _flag;
- _savTab[11]._len = sizeof(_flag);
- _savTab[11]._flag = true;
- _savTab[12]._ptr = _heroXY;
-// _savTab[12]._len = sizeof(_heroXY); FIXME: illegal sizeof
- _savTab[12]._len = 0;
- _savTab[12]._flag = true;
- _savTab[13]._ptr = _barriers;
-// _savTab[13]._len = sizeof(_barriers); FIXME: illegal sizeof
- _savTab[13]._len = 0;
- _savTab[13]._flag = true;
- _savTab[14]._ptr = _pocref;
- _savTab[14]._len = sizeof(_pocref);
- _savTab[14]._flag = true;
- _savTab[15]._ptr = NULL;
- _savTab[15]._len = 0;
- _savTab[15]._flag = false;
-
if (_isDemo) {
_maxCaveArr[0] = CAVE_MAX;
_maxCaveArr[1] = -1;
diff --git a/engines/cge/cge.h b/engines/cge/cge.h
index 4f6b452850..49f2c46e40 100644
--- a/engines/cge/cge.h
+++ b/engines/cge/cge.h
@@ -25,6 +25,7 @@
#include "cge/general.h"
#include "common/random.h"
+#include "common/serializer.h"
#include "engines/engine.h"
#include "gui/debugger.h"
#include "graphics/surface.h"
@@ -58,6 +59,7 @@ class CGEEngine : public Engine {
private:
uint32 _lastFrame;
void tick();
+ void syncHeader(Common::Serializer &s);
public:
CGEEngine(OSystem *syst, const ADGameDescription *gameDescription);
~CGEEngine();
@@ -69,7 +71,6 @@ public:
int _oldLev;
bool _jbw;
int _pocPtr;
- SavTab _savTab[16];
bool _music;
int _pocref[POCKET_NX];
uint8 _volume[2];
@@ -124,7 +125,7 @@ public:
void setIRQ();
void setDMA();
void mainLoop();
- void saveGame(XFile &file);
+ void saveGame(Common::WriteStream *file);
void switchMusic();
void selectPocket(int n);
void expandSprite(Sprite *spr);
diff --git a/engines/cge/cge_main.cpp b/engines/cge/cge_main.cpp
index 0135b0441a..256cee6795 100644
--- a/engines/cge/cge_main.cpp
+++ b/engines/cge/cge_main.cpp
@@ -27,6 +27,7 @@
#include "common/scummsys.h"
#include "common/memstream.h"
+#include "common/savefile.h"
#include "common/serializer.h"
#include "cge/general.h"
#include "cge/sound.h"
@@ -176,18 +177,9 @@ Cluster XZ(Couple xy) {
return XZ(x, y);
}
-void CGEEngine::loadGame(XFile &file, bool tiny = false) {
- Sprite *spr;
+void CGEEngine::syncHeader(Common::Serializer &s) {
int i;
- // Read the data into a data buffer
- int size = file.size() - file.mark();
- byte *dataBuffer = new byte[size];
- file.read(dataBuffer, size);
- Common::MemoryReadStream readStream(dataBuffer, size, DisposeAfterUse::YES);
- Common::Serializer s(&readStream, NULL);
-
- // Synchronise header data
s.syncAsUint16LE(_now);
s.syncAsUint16LE(_oldLev);
s.syncAsUint16LE(_demoText);
@@ -210,10 +202,32 @@ void CGEEngine::loadGame(XFile &file, bool tiny = false) {
for (i = 0; i < POCKET_NX; ++i)
s.syncAsUint16LE(_pocref[i]);
- uint16 checksum;
- s.syncAsUint16LE(checksum);
- if (checksum != SVGCHKSUM)
- error("%s", _text->getText(BADSVG_TEXT));
+ if (s.isSaving()) {
+ // Write checksum
+ int checksum = SVGCHKSUM;
+ s.syncAsUint16LE(checksum);
+ } else {
+ // Read checksum and validate it
+ uint16 checksum;
+ s.syncAsUint16LE(checksum);
+ if (checksum != SVGCHKSUM)
+ error("%s", _text->getText(BADSVG_TEXT));
+ }
+}
+
+void CGEEngine::loadGame(XFile &file, bool tiny = false) {
+ Sprite *spr;
+ int i;
+
+ // Read the data into a data buffer
+ int size = file.size() - file.mark();
+ byte *dataBuffer = new byte[size];
+ file.read(dataBuffer, size);
+ Common::MemoryReadStream readStream(dataBuffer, size, DisposeAfterUse::YES);
+ Common::Serializer s(&readStream, NULL);
+
+ // Synchronise header data
+ syncHeader(s);
if (Startup::_core < CORE_HIG)
_music = false;
@@ -253,7 +267,7 @@ void CGEEngine::saveSound() {
}
-void CGEEngine::saveGame(XFile &file) {
+void CGEEngine::saveGame(Common::WriteStream *file) {
SavTab *st;
Sprite *spr;
int i;
@@ -266,18 +280,19 @@ void CGEEngine::saveGame(XFile &file) {
_volume[0] = _sndDrvInfo.Vol2._d;
_volume[1] = _sndDrvInfo.Vol2._m;
- for (st = _savTab; st->_ptr; st++) {
- if (file._error)
- error("Bad SVG");
- file.write((uint8 *) st->_ptr, st->_len);
- }
+ Common::Serializer s(NULL, file);
+
+ // Synchronise header data
+ syncHeader(s);
- file.write((uint8 *) & (i = SVGCHKSUM), sizeof(i));
+ // Loop through saving the sprite data
+ for (spr = _vga->_spareQ->first(); spr; spr = spr->_next) {
+ if ((spr->_ref >= 1000) && !s.err())
+ spr->sync(s);
+ }
- for (spr = _vga->_spareQ->first(); spr; spr = spr->_next)
- if (spr->_ref >= 1000)
- if (!file._error)
- file.write((uint8 *)spr, sizeof(*spr));
+ // Finish writing out game data
+ file->finalize();
}
void CGEEngine::heroCover(int cvr) {
@@ -715,8 +730,12 @@ void CGEEngine::qGame() {
caveDown();
_oldLev = _lev;
saveSound();
- CFile file = CFile(usrPath(_usrFnam), WRI, RCrypt);
- saveGame(file);
+
+ // Write out the user's progress
+ Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(Common::String(_usrFnam));
+ saveGame(saveFile);
+ delete saveFile;
+
_vga->sunset();
_finis = true;
}
@@ -1531,10 +1550,16 @@ void CGEEngine::loadUser() {
SVG0FILE file = SVG0FILE(SVG0NAME);
loadGame(file);
} else {
+ // TODO: I think this was only used by the original developers to create the initial
+ // game state savegame. Verify this is the case, and if so remove this block
loadScript(progName(INI_EXT));
_music = true;
- CFile file = CFile(SVG0NAME, WRI);
- saveGame(file);
+
+ Common::OutSaveFile *saveFile = g_system->getSavefileManager()->openForSaving(
+ Common::String(SVG0NAME));
+ saveGame(saveFile);
+ delete saveFile;
+
error("Ok [%s]", SVG0NAME);
}
}