DM: Add proper save header

This commit is contained in:
Bendegúz Nagy
2016-08-26 23:02:22 +02:00
parent f9323fe9fa
commit 2ee50eda35
4 changed files with 20 additions and 24 deletions
+2 -4
View File
@@ -14,10 +14,8 @@ Todo:
I forgot to add a bunch of warning for show/hide mouse pointer and other mouse functions
Code stuff todo:
Complete stub methods(blitShrink, blitmask, scroller, etc.)
Save file f433_processCommand140_saveGame fails silently, add error checking
Add loading from dungeon
Complete stub methods(blitShrink, blitmask, scroller)
Add proper save header, add error handling to it
Fix incorrect thumbnail
Add translations to f433_processCommand140_saveGame 'LOAD'
+1 -2
View File
@@ -166,8 +166,7 @@ DMEngine::DMEngine(OSystem *syst, const ADGameDescription *desc) : Engine(syst),
_sound = nullptr;
_engineShouldQuit = false;
_g528_saveFormat = 0;
_g527_platform = 0;
_g528_saveFormat = k_FORMAT_NONE;
_g526_dungeonId = 0;
_g298_newGame = 0;
+9 -2
View File
@@ -36,6 +36,7 @@
#include "console.h"
#include <common/memstream.h>
#include <advancedDetector.h>
struct ADGameDescription;
@@ -57,6 +58,13 @@ class ProjExpl;
class DialogMan;
class SoundMan;
enum SaveFormat {
k_FORMAT_NONE = 0,
k_FORMAT_DM_ATARI_ST = 1,
k_FORMAT_DM_AMIGA_2X_PC98_X68000_FM_TOWNS_CSB_ATARI_ST = 2,
k_FORMAT_DM_APPLE_IIGS = 3,
k_FORMAT_DM_AMIGA_36_PC_CSB_AMIGA_PC98_X68000_FM_TOWNS = 5,
};
void warning(bool repeat, const char *s, ...);
@@ -233,8 +241,7 @@ public:
Common::Language getGameLanguage();
private:
int16 _g528_saveFormat; // @ G0528_i_Format
int16 _g527_platform; // @ G0527_i_Platform
SaveFormat _g528_saveFormat; // @ G0528_i_Format
uint16 _g526_dungeonId; // @ G0526_ui_DungeonID
byte *_g562_entranceDoorAnimSteps[10]; // @ G0562_apuc_Bitmap_EntranceDoorAnimationSteps
byte *_g564_interfaceCredits; // @ G0564_puc_Graphic5_InterfaceCredits
+8 -16
View File
@@ -42,9 +42,6 @@
namespace DM {
#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(int16 slot) {
if (slot == -1 && _g298_newGame == k0_modeLoadSavedGame)
@@ -56,10 +53,9 @@ LoadgameResponse DMEngine::f435_loadgame(int16 slot) {
Common::InSaveFile *file = nullptr;
struct {
int16 _saveFormat;
int16 _saveAndPlayChoice;
SaveFormat _saveFormat;
int32 _saveVersion;
int32 _gameId;
int16 _platform;
uint16 _dungeonId;
} dmSaveHeader;
@@ -69,9 +65,8 @@ LoadgameResponse DMEngine::f435_loadgame(int16 slot) {
file = saveFileManager->openForLoading(fileName);
}
_g528_saveFormat = C2_FORMAT_DM_AMIGA_2X_PC98_X68000_FM_TOWNS_CSB_ATARI_ST;
_g527_platform = C3_PLATFORM_AMIGA;
_g526_dungeonId = C10_DUNGEON_DM;
dmSaveHeader._saveFormat = k_FORMAT_DM_AMIGA_2X_PC98_X68000_FM_TOWNS_CSB_ATARI_ST;
if (_g298_newGame) {
//L1366_B_FadePalette = !F0428_DIALOG_RequireGameDiskInDrive_NoDialogDrawn(C0_DO_NOT_FORCE_DIALOG_DM_CSB, true);
_g524_restartGameAllowed = false;
@@ -84,10 +79,9 @@ LoadgameResponse DMEngine::f435_loadgame(int16 slot) {
warning(false, "MISSING CODE: missing check for matching format and platform in save in f435_loadgame");
dmSaveHeader._saveFormat = file->readSint16BE();
dmSaveHeader._saveAndPlayChoice = file->readSint16BE();
dmSaveHeader._saveFormat = (SaveFormat)file->readSint32BE();
dmSaveHeader._saveVersion = file->readSint32BE();
dmSaveHeader._gameId = file->readSint32BE();
dmSaveHeader._platform = file->readSint16BE();
dmSaveHeader._dungeonId = file->readUint16BE();
_g525_gameId = dmSaveHeader._gameId;
@@ -142,7 +136,6 @@ LoadgameResponse DMEngine::f435_loadgame(int16 slot) {
}
} else {
_g528_saveFormat = dmSaveHeader._saveFormat;
_g527_platform = dmSaveHeader._platform;
_g526_dungeonId = dmSaveHeader._dungeonId;
_g524_restartGameAllowed = true;
@@ -302,10 +295,9 @@ bool DMEngine::writeCompleteSaveFile(int16 saveSlot, Common::String& saveDescrip
writeSaveGameHeader(file, saveDescription);
file->writeSint16BE(_g528_saveFormat);
file->writeSint16BE(saveAndPlayChoice);
file->writeSint32BE(_g528_saveFormat);
file->writeSint32BE(1); // save version
file->writeSint32BE(_g525_gameId);
file->writeSint16BE(_g527_platform);
file->writeUint16BE(_g526_dungeonId);
// write C0_SAVE_PART_GLOBAL_DATA part