diff options
-rw-r--r-- | saga/saga.cpp | 2 | ||||
-rw-r--r-- | saga/saga.h | 3 | ||||
-rw-r--r-- | saga/saveload.cpp | 12 | ||||
-rw-r--r-- | saga/sfuncs.cpp | 30 |
4 files changed, 42 insertions, 5 deletions
diff --git a/saga/saga.cpp b/saga/saga.cpp index 026594b1b4..e8500e282b 100644 --- a/saga/saga.cpp +++ b/saga/saga.cpp @@ -118,6 +118,8 @@ SagaEngine::SagaEngine(GameDetector *detector, OSystem *syst) _puzzle = NULL; _frameCount = 0; + _globalFlags = 0; + memset(_ethicsPoints, 0, sizeof(_ethicsPoints)); // The Linux version of Inherit the Earth puts all data files in an // 'itedata' sub-directory, except for voices.rsc diff --git a/saga/saga.h b/saga/saga.h index adc6e93496..c8b928a06a 100644 --- a/saga/saga.h +++ b/saga/saga.h @@ -570,6 +570,9 @@ public: return isSaveListFull() ? _saveFilesCount : _saveFilesCount + 1; } + uint32 _globalFlags; + byte _ethicsPoints[5]; // TODO: Verify that this is large enough + int _soundVolume; int _musicVolume; bool _subtitlesEnabled; diff --git a/saga/saveload.cpp b/saga/saveload.cpp index a2c07fdde2..8560f4f10e 100644 --- a/saga/saveload.cpp +++ b/saga/saveload.cpp @@ -178,6 +178,12 @@ void SagaEngine::save(const char *fileName, const char *saveName) { // Inset scene out->writeSint32LE(_scene->currentSceneNumber()); + if (getGameType() != GType_ITE) { + out->writeUint32LE(_globalFlags); + for (int i = 0; i < ARRAYSIZE(_ethicsPoints); i++) + out->writeByte(_ethicsPoints[i]); + } + _interface->saveState(out); _actor->saveState(out); @@ -217,6 +223,12 @@ void SagaEngine::load(const char *fileName) { // Inset scene insetSceneNumber = in->readSint32LE(); + if (getGameType() != GType_ITE) { + _globalFlags = in->readUint32LE(); + for (int i = 0; i < ARRAYSIZE(_ethicsPoints); i++) + _ethicsPoints[i] = in->readByte(); + } + _interface->loadState(in); _actor->loadState(in); diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp index d969fa5005..b64be9bdc6 100644 --- a/saga/sfuncs.cpp +++ b/saga/sfuncs.cpp @@ -1921,23 +1921,43 @@ void Script::sfVsetTrack(SCRIPTFUNC_PARAMS) { } void Script::sfGetPoints(SCRIPTFUNC_PARAMS) { - SF_stub("sfGetPoints", thread, nArgs); + int16 index = thread->pop(); + + if (index >= 0 && index < ARRAYSIZE(_vm->_ethicsPoints)) + thread->_returnValue = _vm->_ethicsPoints[index]; + else + thread->_returnValue = 0; } void Script::sfSetGlobalFlag(SCRIPTFUNC_PARAMS) { - SF_stub("sfSetGlobalFlag", thread, nArgs); + int16 flag = thread->pop(); + + if (flag >= 0 && flag < 32) + _vm->_globalFlags |= (1 << flag); } void Script::sfClearGlobalFlag(SCRIPTFUNC_PARAMS) { - SF_stub("sfClearGlobalFlag", thread, nArgs); + int16 flag = thread->pop(); + + if (flag >= 0 && flag < 32) + _vm->_globalFlags &= ~(1 << flag); } void Script::sfTestGlobalFlag(SCRIPTFUNC_PARAMS) { - SF_stub("sfTestGlobalFlag", thread, nArgs); + int16 flag = thread->pop(); + + if (flag >= 0 && flag < 32 && _vm->_globalFlags & (1 << flag)) + thread->_returnValue = 1; + else + thread->_returnValue = 0; } void Script::sfSetPoints(SCRIPTFUNC_PARAMS) { - SF_stub("sfSetPoints", thread, nArgs); + int16 index = thread->pop(); + int16 points = thread->pop(); + + if (index >= 0 && index < ARRAYSIZE(_vm->_ethicsPoints)) + _vm->_ethicsPoints[index] = points; } void Script::sfSetSpeechBox(SCRIPTFUNC_PARAMS) { |