aboutsummaryrefslogtreecommitdiff
path: root/queen/queen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'queen/queen.cpp')
-rw-r--r--queen/queen.cpp110
1 files changed, 101 insertions, 9 deletions
diff --git a/queen/queen.cpp b/queen/queen.cpp
index e9ea1dbda7..82cc858956 100644
--- a/queen/queen.cpp
+++ b/queen/queen.cpp
@@ -114,7 +114,8 @@ QueenEngine::~QueenEngine() {
delete _logic;
delete _music;
delete _sound;
- delete _walk;
+ delete _walk;
+ delete _saveFileMan;
}
void QueenEngine::registerDefaultSettings() {
@@ -191,11 +192,11 @@ void QueenEngine::update(bool checkPlayerInput) {
if (!_input->cutawayRunning()) {
if (_input->quickSave()) {
_input->quickSaveReset();
- _logic->gameSave(0, "Quicksave");
+ saveGameState(0, "Quicksave");
}
if (_input->quickLoad()) {
_input->quickLoadReset();
- _logic->gameLoad(0);
+ loadGameState(0);
}
if (checkPlayerInput) {
_command->updatePlayer();
@@ -206,6 +207,99 @@ void QueenEngine::update(bool checkPlayerInput) {
}
}
+void QueenEngine::saveGameState(uint16 slot, const char *desc) {
+ debug(3, "Saving game to slot %d", slot);
+ char name[20];
+ makeGameStateName(slot, name);
+ SaveFile *file = _saveFileMan->open_savefile(name, getSavePath(), true);
+ if (file) {
+ // save data
+ byte *saveData = new byte[30000];
+ byte *p = saveData;
+ _bam->saveState(p);
+ _grid->saveState(p);
+ _logic->saveState(p);
+ _sound->saveState(p);
+ uint32 dataSize = p - saveData;
+
+ // write header
+ GameStateHeader header;
+ memset(&header, 0, sizeof(header));
+ file->writeUint32BE('SCVM');
+ header.version = TO_BE_32(SAVESTATE_CUR_VER);
+ header.flags = TO_BE_32(0);
+ header.dataSize = TO_BE_32(dataSize);
+ strncpy(header.description, desc, sizeof(header.description) - 1);
+ file->write(&header, sizeof(header));
+
+ // write save data
+ if (file->write(saveData, dataSize) != dataSize) {
+ warning("Can't write file '%s'. (Disk full?)", name);
+ }
+ delete saveData;
+ delete file;
+ } else {
+ warning("Can't create file '%s', game not saved", name);
+ }
+}
+
+void QueenEngine::loadGameState(uint16 slot) {
+ debug(3, "Loading game from slot %d", slot);
+ GameStateHeader header;
+ SaveFile *file = readGameStateHeader(slot, &header);
+ if (file && header.dataSize != 0) {
+ byte *saveData = new byte[header.dataSize];
+ byte *p = saveData;
+ if (file->read(saveData, header.dataSize) != header.dataSize) {
+ warning("Error reading savegame file");
+ } else {
+ _bam->loadState(header.version, p);
+ _grid->loadState(header.version, p);
+ _logic->loadState(header.version, p);
+ _sound->loadState(header.version, p);
+ assert(header.dataSize == (uint32)(p - saveData));
+ _logic->setupRestoredGame();
+ }
+ delete saveData;
+ delete file;
+ }
+}
+
+SaveFile *QueenEngine::readGameStateHeader(uint16 slot, GameStateHeader *gsh) {
+ char name[20];
+ makeGameStateName(slot, name);
+ SaveFile *file = _saveFileMan->open_savefile(name, getSavePath(), false);
+ if (file && file->readUint32BE() == 'SCVM') {
+ gsh->version = file->readUint32BE();
+ gsh->flags = file->readUint32BE();
+ gsh->dataSize = file->readUint32BE();
+ file->read(gsh->description, sizeof(gsh->description));
+ } else {
+ memset(gsh, 0, sizeof(GameStateHeader));
+ }
+ return file;
+}
+
+void QueenEngine::makeGameStateName(uint16 slot, char *buf) {
+ sprintf(buf, "queen.s%02d", slot);
+}
+
+void QueenEngine::findGameStateDescriptions(char descriptions[100][32]) {
+ char filename[20];
+ makeGameStateName(0, filename);
+ filename[strlen(filename) - 2] = 0;
+ bool marks[SAVESTATE_MAX];
+ _saveFileMan->list_savefiles(filename, getSavePath(), marks, SAVESTATE_MAX);
+ for (int i = 0; i < SAVESTATE_MAX; ++i) {
+ if (marks[i]) {
+ GameStateHeader header;
+ SaveFile *f = readGameStateHeader(i, &header);
+ strcpy(descriptions[i], header.description);
+ delete f;
+ }
+ }
+}
+
void QueenEngine::errorString(const char *buf1, char *buf2) {
strcpy(buf2, buf1);
}
@@ -245,7 +339,7 @@ void QueenEngine::go() {
void QueenEngine::initialise(void) {
_bam = new BamScene(this);
- _resource = new Resource(_gameDataPath, _system->get_savefile_manager(), getSavePath());
+ _resource = new Resource(_gameDataPath);
_bankMan = new BankManager(_resource);
_command = new Command(this);
_debugger = new Debugger(this);
@@ -270,14 +364,12 @@ void QueenEngine::initialise(void) {
_sound = Sound::giveSound(_mixer, this, _resource->compression());
_walk = new Walk(this);
_timer->installTimerProc(&timerHandler, 1000000 / 50, this); //call 50 times per second
+ _saveFileMan = _system->get_savefile_manager();
}
void QueenEngine::timerHandler(void *ptr) {
- ((QueenEngine *)ptr)->gotTimerTick();
-}
-
-void QueenEngine::gotTimerTick() {
- _display->handleTimer();
+ QueenEngine *vm = (QueenEngine *)ptr;
+ vm->_display->handleTimer();
}
} // End of namespace Queen