Add support for saving/loading Arrays/Strings in SCI32. It's possible to save a game in GK1 now via the console, but not load (yet).
svn-id: r47696
This commit is contained in:
parent
b01a793e55
commit
da46fc9b35
5 changed files with 115 additions and 7 deletions
|
@ -284,7 +284,7 @@ SciKernelFunction kfunct_mappers[] = {
|
||||||
/*60*/ DEFUN("SetMenu", kSetMenu, "i.*"),
|
/*60*/ DEFUN("SetMenu", kSetMenu, "i.*"),
|
||||||
/*61*/ DEFUN("GetSaveFiles", kGetSaveFiles, "rrr"),
|
/*61*/ DEFUN("GetSaveFiles", kGetSaveFiles, "rrr"),
|
||||||
/*62*/ DEFUN("GetCWD", kGetCWD, "r"),
|
/*62*/ DEFUN("GetCWD", kGetCWD, "r"),
|
||||||
/*63*/ DEFUN("CheckFreeSpace", kCheckFreeSpace, "r"),
|
/*63*/ DEFUN("CheckFreeSpace", kCheckFreeSpace, "r.*"),
|
||||||
/*64*/ DEFUN("ValidPath", kValidPath, "r"),
|
/*64*/ DEFUN("ValidPath", kValidPath, "r"),
|
||||||
/*65*/ DEFUN("CoordPri", kCoordPri, "ii*"),
|
/*65*/ DEFUN("CoordPri", kCoordPri, "ii*"),
|
||||||
/*66*/ DEFUN("StrAt", kStrAt, "rii*"),
|
/*66*/ DEFUN("StrAt", kStrAt, "rii*"),
|
||||||
|
|
|
@ -425,6 +425,12 @@ reg_t kGetSaveDir(EngineState *s, int argc, reg_t *argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
reg_t kCheckFreeSpace(EngineState *s, int argc, reg_t *argv) {
|
reg_t kCheckFreeSpace(EngineState *s, int argc, reg_t *argv) {
|
||||||
|
#ifdef ENABLE_SCI32
|
||||||
|
// TODO: SCI32 uses a parameter here.
|
||||||
|
if (argc > 1)
|
||||||
|
warning("kCheckFreeSpace called with %d parameter(s): %04x:%04x", argc, PRINT_REG(argv[1]));
|
||||||
|
#endif
|
||||||
|
|
||||||
Common::String path = s->_segMan->getString(argv[0]);
|
Common::String path = s->_segMan->getString(argv[0]);
|
||||||
|
|
||||||
debug(3, "kCheckFreeSpace(%s)", path.c_str());
|
debug(3, "kCheckFreeSpace(%s)", path.c_str());
|
||||||
|
|
|
@ -46,6 +46,10 @@
|
||||||
#include "sci/sound/music.h"
|
#include "sci/sound/music.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_SCI32
|
||||||
|
#include "sci/graphics/gui32.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Sci {
|
namespace Sci {
|
||||||
|
|
||||||
|
|
||||||
|
@ -356,10 +360,11 @@ void EngineState::saveLoadWithSerializer(Common::Serializer &s) {
|
||||||
s.skip(4, VER(12), VER(12)); // obsolete: used to be status_bar_foreground
|
s.skip(4, VER(12), VER(12)); // obsolete: used to be status_bar_foreground
|
||||||
s.skip(4, VER(12), VER(12)); // obsolete: used to be status_bar_background
|
s.skip(4, VER(12), VER(12)); // obsolete: used to be status_bar_background
|
||||||
|
|
||||||
if (s.getVersion() >= 13) {
|
if (s.getVersion() >= 13 && _gui) {
|
||||||
// Save/Load picPort as well (cause sierra sci also does this)
|
// Save/Load picPort as well (cause sierra sci also does this)
|
||||||
int16 picPortTop, picPortLeft;
|
int16 picPortTop, picPortLeft;
|
||||||
Common::Rect picPortRect;
|
Common::Rect picPortRect;
|
||||||
|
|
||||||
if (s.isSaving())
|
if (s.isSaving())
|
||||||
picPortRect = _gui->getPortPic(picPortTop, picPortLeft);
|
picPortRect = _gui->getPortPic(picPortTop, picPortLeft);
|
||||||
|
|
||||||
|
@ -422,6 +427,72 @@ void syncWithSerializer(Common::Serializer &s, Table<Node>::Entry &obj) {
|
||||||
sync_reg_t(s, obj.value);
|
sync_reg_t(s, obj.value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ENABLE_SCI32
|
||||||
|
template <>
|
||||||
|
void syncWithSerializer(Common::Serializer &s, Table<SciArray<reg_t> >::Entry &obj) {
|
||||||
|
s.syncAsSint32LE(obj.next_free);
|
||||||
|
|
||||||
|
byte type = 0;
|
||||||
|
uint32 size = 0;
|
||||||
|
|
||||||
|
if (s.isSaving()) {
|
||||||
|
type = (byte)obj.getType();
|
||||||
|
size = obj.getSize();
|
||||||
|
s.syncAsByte(type);
|
||||||
|
s.syncAsUint32LE(size);
|
||||||
|
} else {
|
||||||
|
s.syncAsByte(type);
|
||||||
|
s.syncAsUint32LE(size);
|
||||||
|
obj.setType((int8)type);
|
||||||
|
|
||||||
|
// HACK: Skip arrays that have a negative type
|
||||||
|
if ((int8)type < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
obj.setSize(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < size; i++) {
|
||||||
|
reg_t value;
|
||||||
|
|
||||||
|
if (s.isSaving())
|
||||||
|
value = obj.getValue(i);
|
||||||
|
|
||||||
|
sync_reg_t(s, value);
|
||||||
|
|
||||||
|
if (s.isLoading())
|
||||||
|
obj.setValue(i, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
void syncWithSerializer(Common::Serializer &s, Table<SciString>::Entry &obj) {
|
||||||
|
s.syncAsSint32LE(obj.next_free);
|
||||||
|
|
||||||
|
uint32 size = 0;
|
||||||
|
|
||||||
|
if (s.isSaving()) {
|
||||||
|
size = obj.getSize();
|
||||||
|
s.syncAsUint32LE(size);
|
||||||
|
} else {
|
||||||
|
s.syncAsUint32LE(size);
|
||||||
|
obj.setSize(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (uint32 i = 0; i < size; i++) {
|
||||||
|
char value;
|
||||||
|
|
||||||
|
if (s.isSaving())
|
||||||
|
value = obj.getValue(i);
|
||||||
|
|
||||||
|
s.syncAsByte(value);
|
||||||
|
|
||||||
|
if (s.isLoading())
|
||||||
|
obj.setValue(i, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void sync_Table(Common::Serializer &s, T &obj) {
|
void sync_Table(Common::Serializer &s, T &obj) {
|
||||||
s.syncAsSint32LE(obj.first_free);
|
s.syncAsSint32LE(obj.first_free);
|
||||||
|
@ -616,6 +687,22 @@ void SciMusic::saveLoadWithSerializer(Common::Serializer &s) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ENABLE_SCI32
|
||||||
|
void ArrayTable::saveLoadWithSerializer(Common::Serializer &ser) {
|
||||||
|
if (ser.getVersion() < 18)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sync_Table<ArrayTable>(ser, *this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StringTable::saveLoadWithSerializer(Common::Serializer &ser) {
|
||||||
|
if (ser.getVersion() < 18)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sync_Table<StringTable>(ser, *this);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
|
|
||||||
|
|
||||||
|
@ -862,6 +949,12 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
|
||||||
retval = new EngineState(s->resMan, s->_kernel, s->_voc, s->_segMan, s->_gui, s->_audio);
|
retval = new EngineState(s->resMan, s->_kernel, s->_voc, s->_segMan, s->_gui, s->_audio);
|
||||||
retval->_event = new SciEvent();
|
retval->_event = new SciEvent();
|
||||||
|
|
||||||
|
#ifdef ENABLE_SCI32
|
||||||
|
// Copy the Gui32 pointer over to the new EngineState, if it exists
|
||||||
|
if (s->_gui32)
|
||||||
|
retval->_gui32 = s->_gui32;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Copy some old data
|
// Copy some old data
|
||||||
retval->_soundCmd = s->_soundCmd;
|
retval->_soundCmd = s->_soundCmd;
|
||||||
|
|
||||||
|
@ -923,8 +1016,17 @@ EngineState *gamestate_restore(EngineState *s, Common::SeekableReadStream *fh) {
|
||||||
// Message state:
|
// Message state:
|
||||||
retval->_msgState = new MessageState(retval->_segMan);
|
retval->_msgState = new MessageState(retval->_segMan);
|
||||||
|
|
||||||
|
#ifdef ENABLE_SCI32
|
||||||
|
if (retval->_gui32) {
|
||||||
|
retval->_gui32->resetEngineState(retval);
|
||||||
|
retval->_gui32->init();
|
||||||
|
} else {
|
||||||
|
#endif
|
||||||
retval->_gui->resetEngineState(retval);
|
retval->_gui->resetEngineState(retval);
|
||||||
retval->_gui->init(retval->usesOldGfxFunctions());
|
retval->_gui->init(retval->usesOldGfxFunctions());
|
||||||
|
#ifdef ENABLE_SCI32
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ namespace Sci {
|
||||||
struct EngineState;
|
struct EngineState;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CURRENT_SAVEGAME_VERSION = 17,
|
CURRENT_SAVEGAME_VERSION = 18,
|
||||||
MINIMUM_SAVEGAME_VERSION = 9
|
MINIMUM_SAVEGAME_VERSION = 9
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -801,14 +801,14 @@ public:
|
||||||
struct ArrayTable : public Table<SciArray<reg_t> > {
|
struct ArrayTable : public Table<SciArray<reg_t> > {
|
||||||
ArrayTable() : Table<SciArray<reg_t> >(SEG_TYPE_ARRAY) {}
|
ArrayTable() : Table<SciArray<reg_t> >(SEG_TYPE_ARRAY) {}
|
||||||
|
|
||||||
virtual void saveLoadWithSerializer(Common::Serializer &ser) {}
|
void saveLoadWithSerializer(Common::Serializer &ser);
|
||||||
SegmentRef dereference(reg_t pointer);
|
SegmentRef dereference(reg_t pointer);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct StringTable : public Table<SciString> {
|
struct StringTable : public Table<SciString> {
|
||||||
StringTable() : Table<SciString>(SEG_TYPE_STRING) {}
|
StringTable() : Table<SciString>(SEG_TYPE_STRING) {}
|
||||||
|
|
||||||
virtual void saveLoadWithSerializer(Common::Serializer &ser) {}
|
void saveLoadWithSerializer(Common::Serializer &ser);
|
||||||
SegmentRef dereference(reg_t pointer);
|
SegmentRef dereference(reg_t pointer);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue