aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorRichieSams2013-10-26 21:56:16 -0500
committerRichieSams2013-10-31 23:38:03 -0500
commit992f43cc9c926364e50c88d33980d1a6830440fa (patch)
treec8a40596f4e86633f15517807db878865006c097 /engines
parent6fa1b6fd4f3e5c2596774da497ed6d273829692a (diff)
downloadscummvm-rg350-992f43cc9c926364e50c88d33980d1a6830440fa.tar.gz
scummvm-rg350-992f43cc9c926364e50c88d33980d1a6830440fa.tar.bz2
scummvm-rg350-992f43cc9c926364e50c88d33980d1a6830440fa.zip
ZVISION: Move Puzzle flags to a ScriptManager HashMap
This can be used to enable/disable Controls as well. Also, enabling/disabling should be somewhat faster now as well as checking for enabled/disabled.
Diffstat (limited to 'engines')
-rw-r--r--engines/zvision/actions.cpp12
-rw-r--r--engines/zvision/puzzle.h9
-rw-r--r--engines/zvision/scr_file_handling.cpp8
-rw-r--r--engines/zvision/script_manager.cpp42
-rw-r--r--engines/zvision/script_manager.h18
5 files changed, 48 insertions, 41 deletions
diff --git a/engines/zvision/actions.cpp b/engines/zvision/actions.cpp
index 1fa9fcf334..0bb553a559 100644
--- a/engines/zvision/actions.cpp
+++ b/engines/zvision/actions.cpp
@@ -124,7 +124,8 @@ ActionDisableControl::ActionDisableControl(const Common::String &line) {
bool ActionDisableControl::execute(ZVision *engine) {
debug("Disabling control %u", _key);
- engine->getScriptManager()->disableControl(_key);
+ ScriptManager *scriptManager = engine->getScriptManager();
+ scriptManager->setStateFlags(_key, scriptManager->getStateFlags(_key) | StateFlags::DISABLED);
return true;
}
@@ -141,7 +142,8 @@ ActionEnableControl::ActionEnableControl(const Common::String &line) {
bool ActionEnableControl::execute(ZVision *engine) {
debug("Enabling control %u", _key);
- engine->getScriptManager()->enableControl(_key);
+ ScriptManager *scriptManager = engine->getScriptManager();
+ scriptManager->setStateFlags(_key, scriptManager->getStateFlags(_key) & ~StateFlags::DISABLED);
return true;
}
@@ -223,8 +225,10 @@ bool ActionPreloadAnimation::execute(ZVision *engine) {
// TODO: Check if the Control already exists
// Create the control, but disable it until PlayPreload is called
- engine->getScriptManager()->addControl(new AnimationControl(engine, _key, _fileName));
- engine->getScriptManager()->disableControl(_key);
+ ScriptManager *scriptManager = engine->getScriptManager();
+ scriptManager->addControl(new AnimationControl(engine, _key, _fileName));
+ scriptManager->setStateFlags(_key, scriptManager->getStateFlags(_key) | StateFlags::DISABLED);
+
return true;
}
diff --git a/engines/zvision/puzzle.h b/engines/zvision/puzzle.h
index 1e730365dc..d468da1886 100644
--- a/engines/zvision/puzzle.h
+++ b/engines/zvision/puzzle.h
@@ -32,7 +32,7 @@
namespace ZVision {
struct Puzzle {
- Puzzle() : key(0), flags(0) {}
+ Puzzle() : key(0) {}
~Puzzle() {
for (Common::List<ResultAction *>::iterator iter = resultActions.begin(); iter != resultActions.end(); ++iter) {
@@ -63,17 +63,10 @@ struct Puzzle {
bool argumentIsAKey;
};
- enum StateFlags {
- ONCE_PER_INST = 0x01,
- DO_ME_NOW = 0x02, // Somewhat useless flag since anything that needs to be done immediately has no criteria
- DISABLED = 0x04
- };
-
uint32 key;
Common::List<Common::List <CriteriaEntry> > criteriaList;
// This has to be list of pointers because ResultAction is abstract
Common::List<ResultAction *> resultActions;
- uint flags;
};
} // End of namespace ZVision
diff --git a/engines/zvision/scr_file_handling.cpp b/engines/zvision/scr_file_handling.cpp
index e90408cf0d..0c952ae0ce 100644
--- a/engines/zvision/scr_file_handling.cpp
+++ b/engines/zvision/scr_file_handling.cpp
@@ -81,7 +81,7 @@ void ScriptManager::parsePuzzle(Puzzle *puzzle, Common::SeekableReadStream &stre
} else if (line.matchString("results {", true)) {
parseResults(stream, puzzle->resultActions);
} else if (line.matchString("flags {", true)) {
- puzzle->flags = parseFlags(stream);
+ setStateFlags(puzzle->key, parseFlags(stream));
}
line = stream.readLine();
@@ -259,11 +259,11 @@ uint ScriptManager::parseFlags(Common::SeekableReadStream &stream) const {
while (!stream.eos() && !line.contains('}')) {
if (line.matchString("ONCE_PER_INST", true)) {
- flags |= Puzzle::ONCE_PER_INST;
+ flags |= ONCE_PER_INST;
} else if (line.matchString("DO_ME_NOW", true)) {
- flags |= Puzzle::DO_ME_NOW;
+ flags |= DO_ME_NOW;
} else if (line.matchString("DISABLED", true)) {
- flags |= Puzzle::DISABLED;
+ flags |= DISABLED;
}
line = stream.readLine();
diff --git a/engines/zvision/script_manager.cpp b/engines/zvision/script_manager.cpp
index 66a54088fd..0e08345f07 100644
--- a/engines/zvision/script_manager.cpp
+++ b/engines/zvision/script_manager.cpp
@@ -126,8 +126,7 @@ void ScriptManager::checkPuzzleCriteria() {
// Check if the puzzle is already finished
// Also check that the puzzle isn't disabled
- if (getStateValue(puzzle->key) == 1 &&
- (puzzle->flags & Puzzle::DISABLED) == 0) {
+ if (getStateValue(puzzle->key) == 1 && (getStateFlags(puzzle->key) & DISABLED) == 0) {
continue;
}
@@ -223,6 +222,23 @@ void ScriptManager::setStateValue(uint32 key, uint value) {
}
}
+uint ScriptManager::getStateFlags(uint32 key) {
+ if (_globalStateFlags.contains(key))
+ return _globalStateFlags[key];
+ else
+ return 0;
+}
+
+void ScriptManager::setStateFlags(uint32 key, uint flags) {
+ _globalStateFlags[key] = flags;
+
+ if (_referenceTable.contains(key)) {
+ for (Common::Array<Puzzle *>::iterator iter = _referenceTable[key].begin(); iter != _referenceTable[key].end(); ++iter) {
+ _puzzlesToCheck.push((*iter));
+ }
+ }
+}
+
void ScriptManager::addToStateValue(uint32 key, uint valueToAdd) {
_globalState[key] += valueToAdd;
}
@@ -241,24 +257,6 @@ Control *ScriptManager::getControl(uint32 key) {
return nullptr;
}
-void ScriptManager::enableControl(uint32 key) {
- for (ControlList::iterator iter = _activeControls.begin(); iter != _activeControls.end(); ++iter) {
- if ((*iter)->getKey() == key) {
- (*iter)->enable();
- break;
- }
- }
-}
-
-void ScriptManager::disableControl(uint32 key) {
- for (ControlList::iterator iter = _activeControls.begin(); iter != _activeControls.end(); ++iter) {
- if ((*iter)->getKey() == key) {
- (*iter)->disable();
- break;
- }
- }
-}
-
void ScriptManager::focusControl(uint32 key) {
for (ControlList::iterator iter = _activeControls.begin(); iter != _activeControls.end(); ++iter) {
uint32 controlKey = (*iter)->getKey();
@@ -352,7 +350,7 @@ void ScriptManager::changeLocation(char world, char room, char node, char view,
// Add all the local puzzles to the queue to be checked
for (PuzzleList::iterator iter = _activePuzzles.begin(); iter != _activePuzzles.end(); ++iter) {
// Reset any Puzzles that have the flag ONCE_PER_INST
- if (((*iter)->flags & Puzzle::ONCE_PER_INST) == Puzzle::ONCE_PER_INST) {
+ if ((getStateFlags((*iter)->key) & ONCE_PER_INST) == ONCE_PER_INST) {
setStateValue((*iter)->key, 0);
}
@@ -362,7 +360,7 @@ void ScriptManager::changeLocation(char world, char room, char node, char view,
// Add all the global puzzles to the queue to be checked
for (PuzzleList::iterator iter = _globalPuzzles.begin(); iter != _globalPuzzles.end(); ++iter) {
// Reset any Puzzles that have the flag ONCE_PER_INST
- if (((*iter)->flags & Puzzle::ONCE_PER_INST) == Puzzle::ONCE_PER_INST) {
+ if ((getStateFlags((*iter)->key) & ONCE_PER_INST) == ONCE_PER_INST) {
setStateValue((*iter)->key, 0);
}
diff --git a/engines/zvision/script_manager.h b/engines/zvision/script_manager.h
index 388d0805e0..a5079e3332 100644
--- a/engines/zvision/script_manager.h
+++ b/engines/zvision/script_manager.h
@@ -49,11 +49,18 @@ struct Location {
uint32 offset;
};
+enum StateFlags {
+ ONCE_PER_INST = 0x01,
+ DO_ME_NOW = 0x02, // Somewhat useless flag since anything that needs to be done immediately has no criteria
+ DISABLED = 0x04
+};
+
typedef Common::HashMap<uint32, Common::Array<Puzzle *> > PuzzleMap;
typedef Common::List<Puzzle *> PuzzleList;
typedef Common::Queue<Puzzle *> PuzzleQueue;
typedef Common::List<Control *> ControlList;
typedef Common::HashMap<uint32, uint32> StateMap;
+typedef Common::HashMap<uint32, uint> StateFlagMap;
class ScriptManager {
public:
@@ -68,6 +75,11 @@ private:
* particular state key are checked after the key is modified.
*/
StateMap _globalState;
+ /**
+ * Holds the flags for the global states. This is used to enable/disable puzzles and/or
+ * controls as well as which puzzles should are allowed to be re-executed
+ */
+ StateFlagMap _globalStateFlags;
/** References _globalState keys to Puzzles */
PuzzleMap _referenceTable;
/** Holds the Puzzles that should be checked this frame */
@@ -91,12 +103,12 @@ public:
void setStateValue(uint32 key, uint value);
void addToStateValue(uint32 key, uint valueToAdd);
+ uint getStateFlags(uint32 key);
+ void setStateFlags(uint32 key, uint flags);
+
void addControl(Control *control);
Control *getControl(uint32 key);
- void enableControl(uint32 key);
- void disableControl(uint32 key);
-
void focusControl(uint32 key);
/**