aboutsummaryrefslogtreecommitdiff
path: root/engines/zvision/script_manager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/zvision/script_manager.cpp')
-rw-r--r--engines/zvision/script_manager.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/engines/zvision/script_manager.cpp b/engines/zvision/script_manager.cpp
index 13438d4fa6..b4ad1cc003 100644
--- a/engines/zvision/script_manager.cpp
+++ b/engines/zvision/script_manager.cpp
@@ -22,19 +22,103 @@
#include "common/scummsys.h"
+#include "common/algorithm.h"
+#include "common/hashmap.h"
+
#include "zvision/script_manager.h"
+#include "zvision/actions.h"
+#include "zvision/action_node.h"
+#include "zvision/utility.h"
namespace ZVision {
+ScriptManager::ScriptManager(ZVision *engine) : _engine(engine) {}
+
// TODO: Actually do something in the initialize or remove it
void ScriptManager::initialize() {
}
+void ScriptManager::createReferenceTable() {
+ // Iterate through each Puzzle
+ for (Common::List<Puzzle>::iterator activePuzzleIter = _activePuzzles.begin(); activePuzzleIter != _activePuzzles.end(); activePuzzleIter++) {
+ Puzzle *puzzlePtr = &(*activePuzzleIter);
+
+ // Iterate through each Criteria and add a reference from the criteria key to the Puzzle
+ for (Common::List<Criteria>::iterator criteriaIter = activePuzzleIter->criteriaList.begin(); criteriaIter != (*activePuzzleIter).criteriaList.end(); criteriaIter++) {
+ _referenceTable[criteriaIter->key].push_back(puzzlePtr);
+
+ // If the argument is a key, add a reference to it as well
+ if (criteriaIter->argument)
+ _referenceTable[criteriaIter->argument].push_back(puzzlePtr);
+ }
+ }
+
+ // Remove duplicate entries
+ for (Common::HashMap<uint32, Common::Array<Puzzle *>>::iterator referenceTableIter; referenceTableIter != _referenceTable.end(); referenceTableIter++) {
+ removeDuplicateEntries(&(referenceTableIter->_value));
+ }
+}
+
+void ScriptManager::updateNodes(uint32 deltaTimeMillis) {
+ // If process() returns true, it means the node can be deleted
+ for (Common::List<ActionNode *>::iterator iter = _activeNodes.begin(); iter != _activeNodes.end();) {
+ if ((*iter)->process(_engine, deltaTimeMillis)) {
+ // Remove the node from _activeNodes, then delete it
+ ActionNode *node = *iter;
+ iter = _activeNodes.erase(iter);
+ delete node;
+ } else {
+ iter++;
+ }
+ }
+}
+
+void ScriptManager::checkPuzzleCriteria() {
+ while (!_puzzlesToCheck.empty()) {
+ Puzzle *puzzle = _puzzlesToCheck.pop();
+ // Check each Criteria
+ for (Common::List<Criteria>::iterator iter = puzzle->criteriaList.begin(); iter != puzzle->criteriaList.end(); iter++) {
+ bool criteriaMet = false;
+
+ // Get the value to compare against
+ byte argumentValue;
+ if ((*iter).argument)
+ argumentValue = getStateValue(iter->argument);
+ else
+ argumentValue = iter->argument;
+
+ // Do the comparison
+ switch ((*iter).criteriaOperator) {
+ case EQUAL_TO:
+ criteriaMet = getStateValue(iter->key) == argumentValue;
+ break;
+ case NOT_EQUAL_TO:
+ criteriaMet = getStateValue(iter->key) != argumentValue;
+ break;
+ case GREATER_THAN:
+ criteriaMet = getStateValue(iter->key) > argumentValue;
+ break;
+ case LESS_THAN:
+ criteriaMet = getStateValue(iter->key) < argumentValue;
+ break;
+ }
+
+ // TODO: Add logic for the different Flags (aka, ONCE_PER_INST)
+ if (criteriaMet) {
+ for (Common::List<ResultAction *>::iterator resultIter = puzzle->resultActions.begin(); resultIter != puzzle->resultActions.end(); resultIter++) {
+ (*resultIter)->execute(_engine);
+ }
+ }
+ }
+ }
+}
+
byte ScriptManager::getStateValue(uint32 key) {
return _globalState[key];
}
+// TODO: Add logic to check _referenceTable and add to _puzzlesToCheck if necessary
void ScriptManager::setStateValue(uint32 key, byte value) {
_globalState[key] = value;
}
@@ -43,4 +127,8 @@ void ScriptManager::addToStateValue(uint32 key, byte valueToAdd) {
_globalState[key] += valueToAdd;
}
+void ScriptManager::addActionNode(ActionNode *node) {
+ _activeNodes.push_back(node);
+}
+
} // End of namespace ZVision