aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction/exec_ns.cpp
diff options
context:
space:
mode:
authorNicola Mettifogo2008-06-01 14:05:39 +0000
committerNicola Mettifogo2008-06-01 14:05:39 +0000
commit22d63345e33795c3ce2de4bb67db160ef8b8ea6d (patch)
tree1d8d0bb87406e1f60f3591abec74f7e3ad82a948 /engines/parallaction/exec_ns.cpp
parentec93c8957b95b0ad633cf342094ad0c25db42b18 (diff)
downloadscummvm-rg350-22d63345e33795c3ce2de4bb67db160ef8b8ea6d.tar.gz
scummvm-rg350-22d63345e33795c3ce2de4bb67db160ef8b8ea6d.tar.bz2
scummvm-rg350-22d63345e33795c3ce2de4bb67db160ef8b8ea6d.zip
Got rid of the static arrays for initialization of parsers and exec opcodes, to make returning to launcher easier. The code has been borrowed by Kyra, after suggestion by LordHoto.
svn-id: r32465
Diffstat (limited to 'engines/parallaction/exec_ns.cpp')
-rw-r--r--engines/parallaction/exec_ns.cpp99
1 files changed, 46 insertions, 53 deletions
diff --git a/engines/parallaction/exec_ns.cpp b/engines/parallaction/exec_ns.cpp
index 68ae91c73e..a4b372f42a 100644
--- a/engines/parallaction/exec_ns.cpp
+++ b/engines/parallaction/exec_ns.cpp
@@ -50,12 +50,13 @@ namespace Parallaction {
#define INST_MOVE 18
#define INST_ENDSCRIPT 19
+#define SetOpcodeTable(x) table = &x;
-typedef OpcodeImpl<Parallaction_ns> OpcodeV1;
-#define COMMAND_OPCODE(op) OpcodeV1(this, &Parallaction_ns::cmdOp_##op)
+typedef Common::Functor0Mem<void, Parallaction_ns> OpcodeV2;
+#define COMMAND_OPCODE(op) table->push_back(new OpcodeV2(this, &Parallaction_ns::cmdOp_##op))
#define DECLARE_COMMAND_OPCODE(op) void Parallaction_ns::cmdOp_##op()
-#define INSTRUCTION_OPCODE(op) OpcodeV1(this, &Parallaction_ns::instOp_##op)
+#define INSTRUCTION_OPCODE(op) table->push_back(new OpcodeV2(this, &Parallaction_ns::instOp_##op))
#define DECLARE_INSTRUCTION_OPCODE(op) void Parallaction_ns::instOp_##op()
@@ -653,56 +654,48 @@ ZonePtr Parallaction::hitZone(uint32 type, uint16 x, uint16 y) {
void Parallaction_ns::initOpcodes() {
- static const OpcodeV1 op1[] = {
- INSTRUCTION_OPCODE(invalid),
- INSTRUCTION_OPCODE(on),
- INSTRUCTION_OPCODE(off),
- INSTRUCTION_OPCODE(set), // x
- INSTRUCTION_OPCODE(set), // y
- INSTRUCTION_OPCODE(set), // z
- INSTRUCTION_OPCODE(set), // f
- INSTRUCTION_OPCODE(loop),
- INSTRUCTION_OPCODE(endloop),
- INSTRUCTION_OPCODE(null),
- INSTRUCTION_OPCODE(inc),
- INSTRUCTION_OPCODE(inc), // dec
- INSTRUCTION_OPCODE(set),
- INSTRUCTION_OPCODE(put),
- INSTRUCTION_OPCODE(call),
- INSTRUCTION_OPCODE(wait),
- INSTRUCTION_OPCODE(start),
- INSTRUCTION_OPCODE(sound),
- INSTRUCTION_OPCODE(move),
- INSTRUCTION_OPCODE(endscript)
- };
-
- uint i;
- for (i = 0; i < ARRAYSIZE(op1); i++)
- _instructionOpcodes.push_back(&op1[i]);
-
- static const OpcodeV1 op3[] = {
- COMMAND_OPCODE(invalid),
- COMMAND_OPCODE(set),
- COMMAND_OPCODE(clear),
- COMMAND_OPCODE(start),
- COMMAND_OPCODE(speak),
- COMMAND_OPCODE(get),
- COMMAND_OPCODE(location),
- COMMAND_OPCODE(open),
- COMMAND_OPCODE(close),
- COMMAND_OPCODE(on),
- COMMAND_OPCODE(off),
- COMMAND_OPCODE(call),
- COMMAND_OPCODE(toggle),
- COMMAND_OPCODE(drop),
- COMMAND_OPCODE(quit),
- COMMAND_OPCODE(move),
- COMMAND_OPCODE(stop)
- };
-
- for (i = 0; i < ARRAYSIZE(op3); i++)
- _commandOpcodes.push_back(&op3[i]);
-
+ Common::Array<const Opcode*> *table = 0;
+
+ SetOpcodeTable(_instructionOpcodes);
+ INSTRUCTION_OPCODE(invalid);
+ INSTRUCTION_OPCODE(on);
+ INSTRUCTION_OPCODE(off);
+ INSTRUCTION_OPCODE(set); // x
+ INSTRUCTION_OPCODE(set); // y
+ INSTRUCTION_OPCODE(set); // z
+ INSTRUCTION_OPCODE(set); // f
+ INSTRUCTION_OPCODE(loop);
+ INSTRUCTION_OPCODE(endloop);
+ INSTRUCTION_OPCODE(null);
+ INSTRUCTION_OPCODE(inc);
+ INSTRUCTION_OPCODE(inc); // dec
+ INSTRUCTION_OPCODE(set);
+ INSTRUCTION_OPCODE(put);
+ INSTRUCTION_OPCODE(call);
+ INSTRUCTION_OPCODE(wait);
+ INSTRUCTION_OPCODE(start);
+ INSTRUCTION_OPCODE(sound);
+ INSTRUCTION_OPCODE(move);
+ INSTRUCTION_OPCODE(endscript);
+
+ SetOpcodeTable(_commandOpcodes);
+ COMMAND_OPCODE(invalid);
+ COMMAND_OPCODE(set);
+ COMMAND_OPCODE(clear);
+ COMMAND_OPCODE(start);
+ COMMAND_OPCODE(speak);
+ COMMAND_OPCODE(get);
+ COMMAND_OPCODE(location);
+ COMMAND_OPCODE(open);
+ COMMAND_OPCODE(close);
+ COMMAND_OPCODE(on);
+ COMMAND_OPCODE(off);
+ COMMAND_OPCODE(call);
+ COMMAND_OPCODE(toggle);
+ COMMAND_OPCODE(drop);
+ COMMAND_OPCODE(quit);
+ COMMAND_OPCODE(move);
+ COMMAND_OPCODE(stop);
}