diff options
-rw-r--r-- | engines/zvision/scripting/actions.cpp | 17 | ||||
-rw-r--r-- | engines/zvision/scripting/actions.h | 9 | ||||
-rw-r--r-- | engines/zvision/scripting/scr_file_handling.cpp | 2 | ||||
-rw-r--r-- | engines/zvision/scripting/script_manager.cpp | 40 | ||||
-rw-r--r-- | engines/zvision/scripting/script_manager.h | 4 |
5 files changed, 50 insertions, 22 deletions
diff --git a/engines/zvision/scripting/actions.cpp b/engines/zvision/scripting/actions.cpp index 1e1b3b2862..04f318b84e 100644 --- a/engines/zvision/scripting/actions.cpp +++ b/engines/zvision/scripting/actions.cpp @@ -42,6 +42,7 @@ #include "zvision/graphics/effects/fog.h" #include "zvision/graphics/effects/light.h" #include "zvision/graphics/effects/wave.h" +#include "zvision/core/save_manager.h" #include "common/file.h" @@ -722,6 +723,22 @@ bool ActionRandom::execute() { } ////////////////////////////////////////////////////////////////////////////// +// ActionRestoreGame +////////////////////////////////////////////////////////////////////////////// + +ActionRestoreGame::ActionRestoreGame(ZVision *engine, int32 slotkey, const Common::String &line) : + ResultAction(engine, slotkey) { + char buf[128]; + sscanf(line.c_str(), "%s", buf); + _fileName = Common::String(buf); +} + +bool ActionRestoreGame::execute() { + _engine->getSaveManager()->loadGame(_fileName); + return false; +} + +////////////////////////////////////////////////////////////////////////////// // ActionRotateTo ////////////////////////////////////////////////////////////////////////////// diff --git a/engines/zvision/scripting/actions.h b/engines/zvision/scripting/actions.h index dd771c1078..a6b5aa1290 100644 --- a/engines/zvision/scripting/actions.h +++ b/engines/zvision/scripting/actions.h @@ -385,6 +385,15 @@ private: ValueSlot *_max; }; +class ActionRestoreGame : public ResultAction { +public: + ActionRestoreGame(ZVision *engine, int32 slotkey, const Common::String &line); + bool execute(); + +private: + Common::String _fileName; +}; + class ActionRotateTo : public ResultAction { public: ActionRotateTo(ZVision *engine, int32 slotkey, const Common::String &line); diff --git a/engines/zvision/scripting/scr_file_handling.cpp b/engines/zvision/scripting/scr_file_handling.cpp index 06354feaae..d5f5704f2a 100644 --- a/engines/zvision/scripting/scr_file_handling.cpp +++ b/engines/zvision/scripting/scr_file_handling.cpp @@ -268,7 +268,7 @@ void ScriptManager::parseResults(Common::SeekableReadStream &stream, Common::Lis } else if (act.matchString("region", true)) { actionList.push_back(new ActionRegion(_engine, slot, args)); } else if (act.matchString("restore_game", true)) { - // TODO: Implement ActionRestoreGame + actionList.push_back(new ActionRestoreGame(_engine, slot, args)); } else if (act.matchString("rotate_to", true)) { actionList.push_back(new ActionRotateTo(_engine, slot, args)); } else if (act.matchString("save_game", true)) { diff --git a/engines/zvision/scripting/script_manager.cpp b/engines/zvision/scripting/script_manager.cpp index 28958dd972..457b491042 100644 --- a/engines/zvision/scripting/script_manager.cpp +++ b/engines/zvision/scripting/script_manager.cpp @@ -79,14 +79,18 @@ void ScriptManager::update(uint deltaTimeMillis) { do_changeLocation(); updateNodes(deltaTimeMillis); - execScope(nodeview); - execScope(room); - execScope(world); - execScope(universe); + if (! execScope(nodeview)) + return; + if (! execScope(room)) + return; + if (! execScope(world)) + return; + if (! execScope(universe)) + return; updateControls(deltaTimeMillis); } -void ScriptManager::execScope(script_scope &scope) { +bool ScriptManager::execScope(script_scope &scope) { // Swap queues PuzzleList *tmp = scope.exec_queue; scope.exec_queue = scope.scope_queue; @@ -98,15 +102,18 @@ void ScriptManager::execScope(script_scope &scope) { if (scope.proc_count < 2 || getStateValue(StateKey_ExecScopeStyle)) { for (PuzzleList::iterator PuzzleIter = scope._puzzles.begin(); PuzzleIter != scope._puzzles.end(); ++PuzzleIter) - checkPuzzleCriteria(*PuzzleIter, scope.proc_count); + if (!checkPuzzleCriteria(*PuzzleIter, scope.proc_count)) + return false; } else { for (PuzzleList::iterator PuzzleIter = scope.exec_queue->begin(); PuzzleIter != scope.exec_queue->end(); ++PuzzleIter) - checkPuzzleCriteria(*PuzzleIter, scope.proc_count); + if (!checkPuzzleCriteria(*PuzzleIter, scope.proc_count)) + return false; } if (scope.proc_count < 2) { scope.proc_count++; } + return true; } void ScriptManager::referenceTableAddPuzzle(uint32 key, puzzle_ref ref) { @@ -185,16 +192,16 @@ void ScriptManager::updateControls(uint deltaTimeMillis) { break; } -void ScriptManager::checkPuzzleCriteria(Puzzle *puzzle, uint counter) { +bool ScriptManager::checkPuzzleCriteria(Puzzle *puzzle, uint counter) { // Check if the puzzle is already finished // Also check that the puzzle isn't disabled if (getStateValue(puzzle->key) == 1 || (getStateFlag(puzzle->key) & Puzzle::DISABLED) == Puzzle::DISABLED) { - return; + return true; } // Check each Criteria if (counter == 0 && (getStateFlag(puzzle->key) & Puzzle::DO_ME_NOW) == 0) - return; + return true; bool criteriaMet = false; for (Common::List<Common::List<Puzzle::CriteriaEntry> >::iterator criteriaIter = puzzle->criteriaList.begin(); criteriaIter != puzzle->criteriaList.end(); ++criteriaIter) { @@ -243,18 +250,13 @@ void ScriptManager::checkPuzzleCriteria(Puzzle *puzzle, uint counter) { // Set the puzzle as completed setStateValue(puzzle->key, 1); - bool shouldContinue = true; for (Common::List<ResultAction *>::iterator resultIter = puzzle->resultActions.begin(); resultIter != puzzle->resultActions.end(); ++resultIter) { - shouldContinue = shouldContinue && (*resultIter)->execute(); - if (!shouldContinue) { - break; - } - } - - if (!shouldContinue) { - return; + if (!(*resultIter)->execute()) + return false; } } + + return true; } void ScriptManager::cleanStateTable() { diff --git a/engines/zvision/scripting/script_manager.h b/engines/zvision/scripting/script_manager.h index fb17077aa6..ddb8c885aa 100644 --- a/engines/zvision/scripting/script_manager.h +++ b/engines/zvision/scripting/script_manager.h @@ -253,10 +253,10 @@ private: void addPuzzlesToReferenceTable(script_scope &scope); void updateNodes(uint deltaTimeMillis); void updateControls(uint deltaTimeMillis); - void checkPuzzleCriteria(Puzzle *puzzle, uint counter); + bool checkPuzzleCriteria(Puzzle *puzzle, uint counter); void cleanStateTable(); void cleanScriptScope(script_scope &scope); - void execScope(script_scope &scope); + bool execScope(script_scope &scope); /** Perform change location */ void do_changeLocation(); |