aboutsummaryrefslogtreecommitdiff
path: root/engines/dm/loadsave.cpp
diff options
context:
space:
mode:
authorBendegúz Nagy2016-07-19 18:04:14 +0200
committerBendegúz Nagy2016-08-26 23:02:22 +0200
commit11704d0c509c1fc5af73c22bd64be60572ff4b8c (patch)
treeadc925a33b19b7feb6509eb8c882a7a33ffb3aa7 /engines/dm/loadsave.cpp
parentbd9fa3eb87a08dd7ba6387ac7c2d911a040cd9c4 (diff)
downloadscummvm-rg350-11704d0c509c1fc5af73c22bd64be60572ff4b8c.tar.gz
scummvm-rg350-11704d0c509c1fc5af73c22bd64be60572ff4b8c.tar.bz2
scummvm-rg350-11704d0c509c1fc5af73c22bd64be60572ff4b8c.zip
DM: Add savegame functions
Diffstat (limited to 'engines/dm/loadsave.cpp')
-rw-r--r--engines/dm/loadsave.cpp148
1 files changed, 130 insertions, 18 deletions
diff --git a/engines/dm/loadsave.cpp b/engines/dm/loadsave.cpp
index 81a914c040..9d705ef8e5 100644
--- a/engines/dm/loadsave.cpp
+++ b/engines/dm/loadsave.cpp
@@ -24,39 +24,45 @@
* Based on the Reverse Engineering work of Christophe Fontanel,
* maintainer of the Dungeon Master Encyclopaedia (http://dmweb.free.fr/)
*/
+#include "common/system.h"
+#include "common/savefile.h"
+#include "graphics/thumbnail.h"
-#include "loadsave.h"
+#include "dm.h"
#include "dungeonman.h"
-#include "champion.h"
-#include "group.h"
#include "timeline.h"
-
+#include "group.h"
+#include "champion.h"
+#include "menus.h"
+#include "eventman.h"
+#include "projexpl.h"
namespace DM {
-
-LoadsaveMan::LoadsaveMan(DMEngine *vm) : _vm(vm) {}
-
-
-LoadgameResponse LoadsaveMan::f435_loadgame() {
- bool newGame = _vm->_g298_newGame;
- ChampionMan &cm = *_vm->_championMan;
-
+#define C2_FORMAT_DM_AMIGA_2X_PC98_X68000_FM_TOWNS_CSB_ATARI_ST 2
+#define C3_PLATFORM_AMIGA 3
+#define C10_DUNGEON_DM 10
+LoadgameResponse DMEngine::f435_loadgame() {
+ bool newGame = _g298_newGame;
+ ChampionMan &cm = *_championMan;
+ _g528_saveFormat = C2_FORMAT_DM_AMIGA_2X_PC98_X68000_FM_TOWNS_CSB_ATARI_ST;
+ _g527_platform = C3_PLATFORM_AMIGA;
+ _g526_dungeonId = C10_DUNGEON_DM;
if (newGame) {
- _vm->_g524_restartGameAllowed = false;
+ _g524_restartGameAllowed = false;
cm._g305_partyChampionCount = 0;
cm._g414_leaderHandObject = Thing::_none;
- _vm->_g525_gameId = _vm->_rnd->getRandomNumber(65536) * _vm->_rnd->getRandomNumber(65536);
+ _g525_gameId = _rnd->getRandomNumber(65536) * _rnd->getRandomNumber(65536);
} else {
assert(false);
// MISSING CODE: load game
}
- _vm->_dungeonMan->f434_loadDungeonFile();
+ _dungeonMan->f434_loadDungeonFile();
if (newGame) {
- _vm->_timeline->f233_initTimeline();
- _vm->_groupMan->f196_initActiveGroups();
+ _timeline->f233_initTimeline();
+ _groupMan->f196_initActiveGroups();
} else {
assert(false);
// MISSING CODE: load game
@@ -65,4 +71,110 @@ LoadgameResponse LoadsaveMan::f435_loadgame() {
return k1_LoadgameSuccess;
}
-} \ No newline at end of file
+
+void DMEngine::f433_processCommand140_saveGame(uint16 slot, const Common::String desc) {
+ char *message = nullptr;
+
+ _menuMan->f456_drawDisabledMenu();
+ _eventMan->f78_showMouse();
+
+ // do {
+ // ask the play what he wants
+ // while
+
+ // F0427_DIALOG_Draw(0, G0551_pc_SAVINGGAME, 0, 0, 0, 0, false, false, false);
+
+ uint16 champHandObjWeight;
+ if (!_championMan->_g415_leaderEmptyHanded) {
+ champHandObjWeight = _dungeonMan->f140_getObjectWeight(_championMan->_g414_leaderHandObject);
+ _championMan->_gK71_champions[_championMan->_g411_leaderIndex]._load -= champHandObjWeight;
+ }
+
+
+ Common::String savefileName = getSavefileName(slot);
+ Common::SaveFileManager *saveFileManager = _system->getSavefileManager();
+ Common::OutSaveFile *file = saveFileManager->openForSaving(savefileName);
+
+ if (!file)
+ return; // TODO: silent fail
+
+ writeSaveGameHeader(file, desc);
+
+ // write C0_SAVE_PART_GLOBAL_DATA part
+ file->writeUint32BE(_g313_gameTime);
+ //L1348_s_GlobalData.LastRandomNumber = G0349_ul_LastRandomNumber;
+ file->writeUint16BE(_championMan->_g305_partyChampionCount);
+ file->writeSint16BE(_dungeonMan->_g306_partyMapX);
+ file->writeSint16BE(_dungeonMan->_g307_partyMapY);
+ file->writeUint16BE(_dungeonMan->_g308_partyDir);
+ file->writeByte(_dungeonMan->_g309_partyMapIndex);
+ file->writeSint16BE(_championMan->_g411_leaderIndex);
+ file->writeSint16BE(_championMan->_g514_magicCasterChampionIndex);
+ file->writeUint16BE(_timeline->_g372_eventCount);
+ file->writeUint16BE(_timeline->_g373_firstUnusedEventIndex);
+ file->writeUint16BE(_timeline->_g369_eventMaxCount);
+ file->writeUint16BE(_groupMan->_g377_currActiveGroupCount);
+ file->writeSint32BE(_projexpl->_g361_lastCreatureAttackTime);
+ file->writeSint32BE(_projexpl->_g362_lastPartyMovementTime);
+ file->writeSint16BE(_g310_disabledMovementTicks);
+ file->writeSint16BE(_g311_projectileDisableMovementTicks);
+ file->writeSint16BE(_g312_lastProjectileDisabledMovementDirection);
+ file->writeUint16BE(_championMan->_g414_leaderHandObject.toUint16());
+ file->writeUint16BE(_groupMan->_g376_maxActiveGroupCount);
+
+ // write C1_SAVE_PART_ACTIVE_GROUP part
+ _groupMan->save1_ActiveGroupPart(file);
+ // write C2_SAVE_PART_PARTY part
+ _championMan->save2_PartyPart(file);
+ // write C3_SAVE_PART_EVENTS part
+ _timeline->save3_eventsPart(file);
+ // write C4_SAVE_PART_TIMELINE part
+ _timeline->save4_timelinePart(file);
+
+ file->writeSint32BE(_g525_gameId);
+ file->writeSint16BE(_g528_saveFormat);
+ file->writeSint16BE(_g527_platform);
+ file->writeUint16BE(_g526_dungeonId);
+
+ warning(false, "MISSING CODE in save game");
+
+ file->flush();
+ file->finalize();
+ delete file;
+}
+
+Common::String DMEngine::getSavefileName(uint16 slot) {
+ return Common::String::format("%s.%03u", _targetName.c_str(), slot);
+}
+
+#define SAVEGAME_ID MKTAG('D', 'M', 'D', 'M')
+#define SAVEGAME_VERSION 1
+
+void DMEngine::writeSaveGameHeader(Common::OutSaveFile* out, const Common::String& saveName) {
+ out->writeUint32BE(SAVEGAME_ID);
+
+ // Write version
+ out->writeByte(SAVEGAME_VERSION);
+
+ // Write savegame name
+ out->writeString(saveName);
+ out->writeByte(0);
+
+ // Save the game thumbnail
+ Graphics::saveThumbnail(*out);
+
+ // Creation date/time
+ TimeDate curTime;
+ _system->getTimeAndDate(curTime);
+
+ uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF);
+ uint16 saveTime = ((curTime.tm_hour & 0xFF) << 8) | ((curTime.tm_min) & 0xFF);
+ uint32 playTime = getTotalPlayTime() / 1000;
+
+ out->writeUint32BE(saveDate);
+ out->writeUint16BE(saveTime);
+ out->writeUint32BE(playTime);
+}
+
+
+}