[Scummvm-cvs-logs] SF.net SVN: scummvm:[35418] scummvm/trunk/engines/gob
drmccoy at users.sourceforge.net
drmccoy at users.sourceforge.net
Thu Dec 18 03:48:15 CET 2008
Revision: 35418
http://scummvm.svn.sourceforge.net/scummvm/?rev=35418&view=rev
Author: drmccoy
Date: 2008-12-18 02:48:15 +0000 (Thu, 18 Dec 2008)
Log Message:
-----------
Preliminary save/load support for Urban Runner
Modified Paths:
--------------
scummvm/trunk/engines/gob/inter.cpp
scummvm/trunk/engines/gob/inter.h
scummvm/trunk/engines/gob/inter_bargon.cpp
scummvm/trunk/engines/gob/inter_v2.cpp
scummvm/trunk/engines/gob/inter_v3.cpp
scummvm/trunk/engines/gob/inter_v4.cpp
scummvm/trunk/engines/gob/inter_v5.cpp
scummvm/trunk/engines/gob/inter_v6.cpp
scummvm/trunk/engines/gob/saveload.h
scummvm/trunk/engines/gob/saveload_v6.cpp
scummvm/trunk/engines/gob/variables.cpp
scummvm/trunk/engines/gob/variables.h
Modified: scummvm/trunk/engines/gob/inter.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter.cpp 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/inter.cpp 2008-12-18 02:48:15 UTC (rev 35418)
@@ -55,9 +55,9 @@
_soundEndTimeKey = 0;
_soundStopVal = 0;
- memset(_pasteBuf, 0, 300);
- memset(_pasteSizeBuf, 0, 300);
- _pastePos = 0;
+ memset(_varStack, 0, 300);
+ memset(_varSizesStack, 0, 300);
+ _varStackPos = 0;
_noBusyWait = false;
Modified: scummvm/trunk/engines/gob/inter.h
===================================================================
--- scummvm/trunk/engines/gob/inter.h 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/inter.h 2008-12-18 02:48:15 UTC (rev 35418)
@@ -89,9 +89,9 @@
int16 _animPalHighIndex[8];
int16 _animPalDir[8];
- byte _pasteBuf[300];
- byte _pasteSizeBuf[300];
- int16 _pastePos;
+ byte _varStack[300];
+ byte _varSizesStack[300];
+ int16 _varStackPos;
// The busy-wait detection in o1_keyFunc breaks fast scrolling in Ween
bool _noBusyWait;
@@ -364,8 +364,8 @@
void o2_loadFontToSprite();
void o2_totSub();
void o2_switchTotSub();
- void o2_copyVars();
- void o2_pasteVars();
+ void o2_pushVars();
+ void o2_popVars();
void o2_loadMapObjects();
void o2_freeGoblins();
void o2_moveGoblin();
Modified: scummvm/trunk/engines/gob/inter_bargon.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_bargon.cpp 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/inter_bargon.cpp 2008-12-18 02:48:15 UTC (rev 35418)
@@ -204,8 +204,8 @@
/* 40 */
OPCODE(o2_totSub),
OPCODE(o2_switchTotSub),
- OPCODE(o2_copyVars),
- OPCODE(o2_pasteVars),
+ OPCODE(o2_pushVars),
+ OPCODE(o2_popVars),
/* 44 */
{NULL, ""},
{NULL, ""},
Modified: scummvm/trunk/engines/gob/inter_v2.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v2.cpp 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/inter_v2.cpp 2008-12-18 02:48:15 UTC (rev 35418)
@@ -212,8 +212,8 @@
/* 40 */
OPCODE(o2_totSub),
OPCODE(o2_switchTotSub),
- OPCODE(o2_copyVars),
- OPCODE(o2_pasteVars),
+ OPCODE(o2_pushVars),
+ OPCODE(o2_popVars),
/* 44 */
{NULL, ""},
{NULL, ""},
@@ -1178,39 +1178,40 @@
_vm->_game->switchTotSub(index, skipPlay);
}
-void Inter_v2::o2_copyVars() {
+void Inter_v2::o2_pushVars() {
byte count;
int16 varOff;
count = *_vm->_global->_inter_execPtr++;
- for (int i = 0; i < count; i++, _pastePos++) {
+ for (int i = 0; i < count; i++, _varStackPos++) {
if ((*_vm->_global->_inter_execPtr == 25) ||
(*_vm->_global->_inter_execPtr == 28)) {
varOff = _vm->_parse->parseVarIndex();
_vm->_global->_inter_execPtr++;
- _variables->copyTo(varOff, _pasteBuf + _pastePos, _pasteSizeBuf + _pastePos,
+ _variables->copyTo(varOff, _varStack + _varStackPos,
+ _varSizesStack + _varStackPos,
_vm->_global->_inter_animDataSize * 4);
- _pastePos += _vm->_global->_inter_animDataSize * 4;
- _pasteBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
- _pasteSizeBuf[_pastePos] = _vm->_global->_inter_animDataSize * 4;
+ _varStackPos += _vm->_global->_inter_animDataSize * 4;
+ _varStack[_varStackPos] = _vm->_global->_inter_animDataSize * 4;
+ _varSizesStack[_varStackPos] = _vm->_global->_inter_animDataSize * 4;
} else {
- if (evalExpr(&varOff) == 20)
+ if (!evalExpr(&varOff) == 20)
_vm->_global->_inter_resVal = 0;
- memcpy(_pasteBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
- memcpy(_pasteSizeBuf + _pastePos, &_vm->_global->_inter_resVal, 4);
- _pastePos += 4;
- _pasteBuf[_pastePos] = 4;
- _pasteSizeBuf[_pastePos] = 4;
+ memcpy(_varStack + _varStackPos, &_vm->_global->_inter_resVal, 4);
+ memcpy(_varSizesStack + _varStackPos, &_vm->_global->_inter_resVal, 4);
+ _varStackPos += 4;
+ _varStack[_varStackPos] = 4;
+ _varSizesStack[_varStackPos] = 4;
}
}
}
-void Inter_v2::o2_pasteVars() {
+void Inter_v2::o2_popVars() {
byte count;
int16 varOff;
int16 sizeV;
@@ -1219,12 +1220,13 @@
count = *_vm->_global->_inter_execPtr++;
for (int i = 0; i < count; i++) {
varOff = _vm->_parse->parseVarIndex();
- sizeV = _pasteBuf[--_pastePos];
- sizeS = _pasteSizeBuf[_pastePos];
+ sizeV = _varStack[--_varStackPos];
+ sizeS = _varSizesStack[_varStackPos];
assert(sizeV == sizeS);
- _pastePos -= sizeV;
- _variables->copyFrom(varOff, _pasteBuf + _pastePos, _pasteSizeBuf + _pastePos, sizeV);
+ _varStackPos -= sizeV;
+ _variables->copyFrom(varOff, _varStack + _varStackPos,
+ _varSizesStack + _varStackPos, sizeV);
}
}
Modified: scummvm/trunk/engines/gob/inter_v3.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v3.cpp 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/inter_v3.cpp 2008-12-18 02:48:15 UTC (rev 35418)
@@ -201,8 +201,8 @@
/* 40 */
OPCODE(o2_totSub),
OPCODE(o2_switchTotSub),
- OPCODE(o2_copyVars),
- OPCODE(o2_pasteVars),
+ OPCODE(o2_pushVars),
+ OPCODE(o2_popVars),
/* 44 */
{NULL, ""},
{NULL, ""},
Modified: scummvm/trunk/engines/gob/inter_v4.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v4.cpp 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/inter_v4.cpp 2008-12-18 02:48:15 UTC (rev 35418)
@@ -202,8 +202,8 @@
/* 40 */
OPCODE(o2_totSub),
OPCODE(o2_switchTotSub),
- OPCODE(o2_copyVars),
- OPCODE(o2_pasteVars),
+ OPCODE(o2_pushVars),
+ OPCODE(o2_popVars),
/* 44 */
{NULL, ""},
{NULL, ""},
Modified: scummvm/trunk/engines/gob/inter_v5.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v5.cpp 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/inter_v5.cpp 2008-12-18 02:48:15 UTC (rev 35418)
@@ -156,8 +156,8 @@
/* 40 */
OPCODE(o2_totSub),
OPCODE(o2_switchTotSub),
- OPCODE(o2_copyVars),
- OPCODE(o2_pasteVars),
+ OPCODE(o2_pushVars),
+ OPCODE(o2_popVars),
/* 44 */
{NULL, ""},
{NULL, ""},
Modified: scummvm/trunk/engines/gob/inter_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/inter_v6.cpp 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/inter_v6.cpp 2008-12-18 02:48:15 UTC (rev 35418)
@@ -135,8 +135,8 @@
/* 40 */
OPCODE(o6_totSub),
OPCODE(o2_switchTotSub),
- OPCODE(o2_copyVars),
- OPCODE(o2_pasteVars),
+ OPCODE(o2_pushVars),
+ OPCODE(o2_popVars),
/* 44 */
{NULL, ""},
{NULL, ""},
Modified: scummvm/trunk/engines/gob/saveload.h
===================================================================
--- scummvm/trunk/engines/gob/saveload.h 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/saveload.h 2008-12-18 02:48:15 UTC (rev 35418)
@@ -414,6 +414,7 @@
public:
enum SaveType {
kSaveNone,
+ kSaveGame,
kSaveNoCD
};
@@ -431,6 +432,32 @@
};
static SaveFile _saveFiles[];
+
+ int32 _varSize;
+
+ StagedSave *_save;
+
+ byte _indexBuffer[2900];
+ bool _hasIndex;
+
+ virtual int getSaveType(const char *fileName);
+
+ virtual int32 getSizeVersioned(int type);
+ virtual bool loadVersioned(int type, int16 dataVar, int32 size, int32 offset);
+ virtual bool saveVersioned(int type, int16 dataVar, int32 size, int32 offset);
+
+ int getSlot(int32 offset) const;
+ int getSlotRemainder(int32 offset) const;
+
+ int32 getSizeGame(SaveFile &saveFile);
+
+ bool loadGame(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
+
+ bool saveGame(SaveFile &saveFile, int16 dataVar, int32 size, int32 offset);
+
+ void assertInited();
+
+ void refreshIndex();
};
} // End of namespace Gob
Modified: scummvm/trunk/engines/gob/saveload_v6.cpp
===================================================================
--- scummvm/trunk/engines/gob/saveload_v6.cpp 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/saveload_v6.cpp 2008-12-18 02:48:15 UTC (rev 35418)
@@ -28,19 +28,35 @@
#include "gob/gob.h"
#include "gob/saveload.h"
#include "gob/game.h"
+#include "gob/inter.h"
namespace Gob {
SaveLoad_v6::SaveFile SaveLoad_v6::_saveFiles[] = {
- {"mdo.def", 0, kSaveModeExists, kSaveNone},
- {"NO_CD.TXT", 0, kSaveModeExists, kSaveNoCD}
+ { "cat.inf", 0, kSaveModeSave, kSaveGame},
+ { "mdo.def", 0, kSaveModeExists, kSaveNone},
+ {"no_cd.txt", 0, kSaveModeExists, kSaveNoCD},
};
SaveLoad_v6::SaveLoad_v6(GobEngine *vm, const char *targetName) :
SaveLoad(vm, targetName) {
+
+ _save = new StagedSave(_vm->getEndianness());
+
+ _saveFiles[0].destName = new char[strlen(targetName) + 5];
+ _saveFiles[1].destName = 0;
+ _saveFiles[2].destName = 0;
+
+ sprintf(_saveFiles[0].destName, "%s.s00", targetName);
+
+ _varSize = 0;
+ _hasIndex = false;
}
SaveLoad_v6::~SaveLoad_v6() {
+ delete _save;
+
+ delete[] _saveFiles[0].destName;
}
SaveLoad::SaveMode SaveLoad_v6::getSaveMode(const char *fileName) {
@@ -63,4 +79,228 @@
return kSaveModeNone;
}
+int SaveLoad_v6::getSaveType(const char *fileName) {
+ for (int i = 0; i < ARRAYSIZE(_saveFiles); i++)
+ if (!scumm_stricmp(fileName, _saveFiles[i].sourceName))
+ return i;
+
+ return -1;
+}
+
+int32 SaveLoad_v6::getSizeVersioned(int type) {
+ assertInited();
+
+ switch (_saveFiles[type].type) {
+ case kSaveGame:
+ return getSizeGame(_saveFiles[type]);
+ default:
+ return -1;
+ }
+
+ return -1;
+}
+
+bool SaveLoad_v6::loadVersioned(int type, int16 dataVar, int32 size, int32 offset) {
+ assertInited();
+
+ switch (_saveFiles[type].type) {
+ case kSaveGame:
+ if (loadGame(_saveFiles[type], dataVar, size, offset))
+ return true;
+
+ warning("While loading from slot %d", getSlot(offset));
+ break;
+
+ default:
+ return -1;
+ }
+
+ return false;
+}
+
+bool SaveLoad_v6::saveVersioned(int type, int16 dataVar, int32 size, int32 offset) {
+ assertInited();
+
+ switch (_saveFiles[type].type) {
+ case kSaveGame:
+ if (saveGame(_saveFiles[type], dataVar, size, offset))
+ return true;
+
+ warning("While saving to slot %d", getSlot(offset));
+ break;
+
+ default:
+ return -1;
+ }
+
+ return false;
+}
+
+int SaveLoad_v6::getSlot(int32 offset) const {
+ return ((offset - 2900) / _varSize);
+}
+
+int SaveLoad_v6::getSlotRemainder(int32 offset) const {
+ return ((offset - 2900) % _varSize);
+}
+
+int32 SaveLoad_v6::getSizeGame(SaveFile &saveFile) {
+ if (!_hasIndex)
+ return -1;
+
+ Common::SaveFileManager *saveMan = g_system->getSavefileManager();
+ Common::InSaveFile *in;
+
+ for (int i = 60; i >= 0; i--) {
+ in = saveMan->openForLoading(setCurrentSlot(saveFile.destName, i));
+ if (in) {
+ delete in;
+ return (i + 1) * _varSize + 2900;
+ }
+ }
+
+ return -1;
+}
+
+bool SaveLoad_v6::loadGame(SaveFile &saveFile,
+ int16 dataVar, int32 size, int32 offset) {
+
+ if (size == 0) {
+ dataVar = 0;
+ size = _varSize;
+ }
+
+ if (offset < 2900) {
+ debugC(3, kDebugSaveLoad, "Saving save index");
+
+ if ((offset + size) > 2900) {
+ warning("Wrong index size (%d, %d)", size, offset);
+ return false;
+ }
+
+ if (!_hasIndex) {
+ warning("No index written yet");
+ return false;
+ }
+
+ refreshIndex();
+
+ byte *sizes = new byte[size];
+ memset(sizes, 0, size);
+
+ _vm->_inter->_variables->copyFrom(dataVar, _indexBuffer + offset, sizes, size);
+
+ delete[] sizes;
+
+
+ } else {
+ int slot = getSlot(offset);
+ int slotRem = getSlotRemainder(offset);
+
+ debugC(2, kDebugSaveLoad, "Loading from slot %d", slot);
+
+ if ((slot >= 60) || (slotRem != 0)) {
+ warning("Invalid loading procedure (%d, %d, %d, %d, %d)",
+ dataVar, size, offset, slot, slotRem);
+ return false;
+ }
+
+ refreshIndex();
+ SaveLoad::setCurrentSlot(saveFile.destName, slot);
+
+ if (!_save->load(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
+ return false;
+
+ refreshIndex();
+ }
+
+ return true;
+}
+
+bool SaveLoad_v6::saveGame(SaveFile &saveFile,
+ int16 dataVar, int32 size, int32 offset) {
+
+ if (size == 0) {
+ dataVar = 0;
+ size = _varSize;
+ }
+
+ if (offset < 2900) {
+ debugC(3, kDebugSaveLoad, "Saving save index");
+
+ if ((offset + size) > 2900) {
+ warning("Wrong index size (%d, %d)", size, offset);
+ return false;
+ }
+
+ _vm->_inter->_variables->copyTo(dataVar, _indexBuffer + offset, 0, size);
+ _hasIndex = true;
+
+ } else {
+ int slot = getSlot(offset);
+ int slotRem = getSlotRemainder(offset);
+
+ debugC(2, kDebugSaveLoad, "Saving to slot %d", slot);
+
+ if ((slot >= 60) || (slotRem != 0)) {
+ warning("Invalid saving procedure (%d, %d, %d, %d, %d)",
+ dataVar, size, offset, slot, slotRem);
+ return false;
+ }
+
+ if (!_hasIndex) {
+ warning("No index written yet");
+ return false;
+ }
+
+ SaveLoad::setCurrentSlot(saveFile.destName, slot);
+
+ byte sizes[40];
+ memset(sizes, 0, 40);
+ if(!_save->save(0, 40, 0, saveFile.destName, _indexBuffer + 500 + (slot * 40), sizes))
+ return false;
+
+ if (!_save->save(dataVar, size, 40, saveFile.destName, _vm->_inter->_variables))
+ return false;
+
+ refreshIndex();
+ }
+
+ return true;
+}
+
+void SaveLoad_v6::assertInited() {
+ if (_varSize > 0)
+ return;
+
+ _varSize = _vm->_inter->_variables->getSize();
+
+ _save->addStage(40);
+ _save->addStage(_varSize);
+}
+
+void SaveLoad_v6::refreshIndex() {
+ Common::SaveFileManager *saveMan = g_system->getSavefileManager();
+ Common::InSaveFile *in;
+
+ int32 max = -1;
+ byte *names = _indexBuffer + 500;
+ for (int i = 0; i < 60; i++, names += 40) {
+ in = saveMan->openForLoading(setCurrentSlot(_saveFiles[0].destName, i));
+ if (in) {
+ max = i;
+ in->read(names, 40);
+ delete in;
+ } else
+ memset(names, 0, 40);
+ }
+
+ WRITE_LE_UINT32(_indexBuffer + 160, max + 1);
+
+ Common::OutSaveFile *out = saveMan->openForSaving("Foobar");
+ out->write(_indexBuffer, 2900);
+ out->flush();
+ delete out;
+}
+
} // End of namespace Gob
Modified: scummvm/trunk/engines/gob/variables.cpp
===================================================================
--- scummvm/trunk/engines/gob/variables.cpp 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/variables.cpp 2008-12-18 02:48:15 UTC (rev 35418)
@@ -44,6 +44,10 @@
delete[] _sizes;
}
+uint32 Variables::getSize() const {
+ return _size;
+}
+
void Variables::clear() {
memset(_vars, 0, _size);
Modified: scummvm/trunk/engines/gob/variables.h
===================================================================
--- scummvm/trunk/engines/gob/variables.h 2008-12-17 21:29:56 UTC (rev 35417)
+++ scummvm/trunk/engines/gob/variables.h 2008-12-18 02:48:15 UTC (rev 35418)
@@ -39,6 +39,8 @@
Variables(uint32 size);
virtual ~Variables();
+ uint32 getSize() const;
+
void writeVar8(uint32 var, uint8 value);
void writeVar16(uint32 var, uint16 value);
void writeVar32(uint32 var, uint32 value);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list