From 9fd7c561986357ea539391cb0d4be238b27ac96d Mon Sep 17 00:00:00 2001 From: Bendegúz Nagy Date: Mon, 25 Jul 2016 19:30:11 +0200 Subject: DM: Finish f433_processCommand140_saveGame --- engines/dm/dungeonman.h | 2 ++ engines/dm/loadsave.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/engines/dm/dungeonman.h b/engines/dm/dungeonman.h index 95f8a1abf4..34aef8d5c4 100644 --- a/engines/dm/dungeonman.h +++ b/engines/dm/dungeonman.h @@ -650,6 +650,8 @@ public: class Group; +extern byte g235_ThingDataWordCount[16]; + class DungeonMan { DMEngine *_vm; diff --git a/engines/dm/loadsave.cpp b/engines/dm/loadsave.cpp index a19cef20b9..86060d5c9b 100644 --- a/engines/dm/loadsave.cpp +++ b/engines/dm/loadsave.cpp @@ -139,6 +139,8 @@ LoadgameResponse DMEngine::f435_loadgame(int16 slot) { void DMEngine::f433_processCommand140_saveGame(uint16 slot, const Common::String desc) { + warning(false, "DUMMY CODE in f433_processCommand140_saveGame, saveAndPlayChoice is always 0"); + int16 saveAndPlayChoice = 0; char *message = nullptr; _menuMan->f456_drawDisabledMenu(); @@ -150,7 +152,7 @@ void DMEngine::f433_processCommand140_saveGame(uint16 slot, const Common::String // F0427_DIALOG_Draw(0, G0551_pc_SAVINGGAME, 0, 0, 0, 0, false, false, false); - uint16 champHandObjWeight; + uint16 champHandObjWeight = 0; if (!_championMan->_g415_leaderEmptyHanded) { champHandObjWeight = _dungeonMan->f140_getObjectWeight(_championMan->_g414_leaderHandObject); _championMan->_gK71_champions[_championMan->_g411_leaderIndex]._load -= champHandObjWeight; @@ -202,11 +204,81 @@ void DMEngine::f433_processCommand140_saveGame(uint16 slot, const Common::String file->writeSint16BE(_g527_platform); file->writeUint16BE(_g526_dungeonId); - warning(false, "MISSING CODE in save game"); + file->writeSint16BE(saveAndPlayChoice); + + // save _g278_dungeonFileHeader + { + DungeonFileHeader &header = _dungeonMan->_g278_dungeonFileHeader; + file->writeUint16BE(header._dungeonId); + file->writeUint16BE(header._ornamentRandomSeed); + file->writeUint32BE(header._rawMapDataSize); + file->writeByte(header._mapCount); + file->writeUint16BE(header._textDataWordCount); + file->writeUint16BE(header._partyStartDir); + file->writeUint16BE(header._partyStartPosX); + file->writeUint16BE(header._partyStartPosY); + file->writeUint16BE(header._squareFirstThingCount); + for (uint16 i = 0; i < 16; ++i) + file->writeUint16BE(header._thingCounts[i]); + } + + // save _g277_dungeonMaps + for (uint16 i = 0; i < _dungeonMan->_g278_dungeonFileHeader._mapCount; ++i) { + Map &map = _dungeonMan->_g277_dungeonMaps[i]; + file->writeUint32BE(map._rawDunDataOffset); + file->writeByte(map._offsetMapX); + file->writeByte(map._offsetMapY); + file->writeByte(map._level); + file->writeByte(map._width); + file->writeByte(map._height); + file->writeByte(map._wallOrnCount); + file->writeByte(map._randWallOrnCount); + file->writeByte(map._floorOrnCount); + file->writeByte(map._randFloorOrnCount); + file->writeByte(map._doorOrnCount); + file->writeByte(map._creatureTypeCount); + file->writeByte(map._difficulty); + file->writeSint16BE(map._floorSet); + file->writeSint16BE(map._wallSet); + file->writeByte(map._doorSet0); + file->writeByte(map._doorSet1); + } + +// save _g280_dungeonColumnsCumulativeSquareThingCount + for (uint16 i = 0; i < _dungeonMan->_g282_dungeonColumCount; ++i) + file->writeUint16BE(_dungeonMan->_g280_dungeonColumnsCumulativeSquareThingCount[i]); + + // save _g283_squareFirstThings + for (uint16 i = 0; i < _dungeonMan->_g278_dungeonFileHeader._squareFirstThingCount; ++i) + file->writeUint16BE(_dungeonMan->_g283_squareFirstThings[i].toUint16()); + + // save _g260_dungeonTextData + for (uint16 i = 0; i < _dungeonMan->_g278_dungeonFileHeader._textDataWordCount; ++i) + file->writeUint16BE(_dungeonMan->_g260_dungeonTextData[i]); + + // save _g284_thingData + for (uint16 thingIndex = 0; thingIndex < 16; ++thingIndex) + for (uint16 i = 0; i < g235_ThingDataWordCount[thingIndex] * _dungeonMan->_g278_dungeonFileHeader._thingCounts[thingIndex]; ++i) + file->writeUint16BE(_dungeonMan->_g284_thingData[thingIndex][i]); + + // save _g276_dungeonRawMapData + for (uint16 i = 0; i < _dungeonMan->_g278_dungeonFileHeader._rawMapDataSize; ++i) + file->writeByte(_dungeonMan->_g276_dungeonRawMapData[i]); file->flush(); file->finalize(); delete file; + + if (!saveAndPlayChoice) { + _eventMan->f77_hideMouse(); + warning(false, "MISSING CODE: F0444_STARTEND_Endgame"); + } + if (!_championMan->_g415_leaderEmptyHanded) { + _championMan->_gK71_champions[_championMan->_g411_leaderIndex]._load += champHandObjWeight; + } + _g524_restartGameAllowed = true; + _menuMan->f457_drawEnabledMenus(); + _eventMan->f77_hideMouse(); } Common::String DMEngine::getSavefileName(uint16 slot) { -- cgit v1.2.3