aboutsummaryrefslogtreecommitdiff
path: root/engines/adl/adl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/adl/adl.cpp')
-rw-r--r--engines/adl/adl.cpp40
1 files changed, 15 insertions, 25 deletions
diff --git a/engines/adl/adl.cpp b/engines/adl/adl.cpp
index 7128928664..31c448570c 100644
--- a/engines/adl/adl.cpp
+++ b/engines/adl/adl.cpp
@@ -724,10 +724,9 @@ bool AdlEngine::canSaveGameStateCurrently() {
// "SAVE GAME". This prevents saving via the GMM in situations where
// it wouldn't otherwise be possible to do so.
for (cmd = _roomCommands.begin(); cmd != _roomCommands.end(); ++cmd) {
- ScriptEnv env(*cmd, _saveVerb, _saveNoun);
- uint offset;
- if (matchCommand(env, &offset))
- return cmd->script[offset] == IDO_ACT_SAVE;
+ ScriptEnv env(*cmd, _state.room, _saveVerb, _saveNoun);
+ if (matchCommand(env))
+ return env.op() == IDO_ACT_SAVE;
}
return false;
@@ -1009,12 +1008,12 @@ int AdlEngine::o1_goDirection(ScriptEnv &e) {
}
int AdlEngine::o1_takeItem(ScriptEnv &e) {
- takeItem(e.noun);
+ takeItem(e.getNoun());
return 0;
}
int AdlEngine::o1_dropItem(ScriptEnv &e) {
- dropItem(e.noun);
+ dropItem(e.getNoun());
return 0;
}
@@ -1023,18 +1022,12 @@ int AdlEngine::o1_setRoomPic(ScriptEnv &e) {
return 2;
}
-bool AdlEngine::matchCommand(ScriptEnv &env, uint *actions) const {
- if (env.cmd.room != IDI_NONE && env.cmd.room != _state.room)
- return false;
-
- if (env.cmd.verb != IDI_NONE && env.cmd.verb != env.verb)
+bool AdlEngine::matchCommand(ScriptEnv &env) const {
+ if (!env.isMatch())
return false;
- if (env.cmd.noun != IDI_NONE && env.cmd.noun != env.noun)
- return false;
-
- for (uint i = 0; i < env.cmd.numCond; ++i) {
- byte op = env.cmd.script[env.ip];
+ for (uint i = 0; i < env.getCondCount(); ++i) {
+ byte op = env.op();
if (!_condOpcodes[op] || !_condOpcodes[op]->isValid())
error("Unimplemented condition opcode %02x", op);
@@ -1044,18 +1037,15 @@ bool AdlEngine::matchCommand(ScriptEnv &env, uint *actions) const {
if (numArgs < 0)
return false;
- env.ip += numArgs + 1;
+ env.skip(numArgs + 1);
}
- if (actions)
- *actions = env.ip;
-
return true;
}
void AdlEngine::doActions(ScriptEnv &env) {
- for (uint i = 0; i < env.cmd.numAct; ++i) {
- byte op = env.cmd.script[env.ip];
+ for (uint i = 0; i < env.getActCount(); ++i) {
+ byte op = env.op();
if (!_actOpcodes[op] || !_actOpcodes[op]->isValid())
error("Unimplemented action opcode %02x", op);
@@ -1065,7 +1055,7 @@ void AdlEngine::doActions(ScriptEnv &env) {
if (numArgs < 0)
return;
- env.ip += numArgs + 1;
+ env.skip(numArgs + 1);
}
}
@@ -1073,7 +1063,7 @@ bool AdlEngine::doOneCommand(const Commands &commands, byte verb, byte noun) {
Commands::const_iterator cmd;
for (cmd = commands.begin(); cmd != commands.end(); ++cmd) {
- ScriptEnv env(*cmd, verb, noun);
+ ScriptEnv env(*cmd, _state.room, verb, noun);
if (matchCommand(env)) {
doActions(env);
return true;
@@ -1087,7 +1077,7 @@ void AdlEngine::doAllCommands(const Commands &commands, byte verb, byte noun) {
Commands::const_iterator cmd;
for (cmd = commands.begin(); cmd != commands.end(); ++cmd) {
- ScriptEnv env(*cmd, verb, noun);
+ ScriptEnv env(*cmd, _state.room, verb, noun);
if (matchCommand(env))
doActions(env);
}