aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--saga/saga.cpp2
-rw-r--r--saga/saga.h3
-rw-r--r--saga/saveload.cpp12
-rw-r--r--saga/sfuncs.cpp30
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) {