aboutsummaryrefslogtreecommitdiff
path: root/engines/gob
diff options
context:
space:
mode:
authorSven Hesse2009-06-17 04:16:51 +0000
committerSven Hesse2009-06-17 04:16:51 +0000
commit6c47f9f4f886edb0d4aae34ea6f4e9fa9ff54e17 (patch)
tree4027d0d8ae8ca930f47fc6b3af4a3cb44cccec75 /engines/gob
parent8615c5779184d1715b1eefa6cc5477ce7c7eebaf (diff)
downloadscummvm-rg350-6c47f9f4f886edb0d4aae34ea6f4e9fa9ff54e17.tar.gz
scummvm-rg350-6c47f9f4f886edb0d4aae34ea6f4e9fa9ff54e17.tar.bz2
scummvm-rg350-6c47f9f4f886edb0d4aae34ea6f4e9fa9ff54e17.zip
Changed opcodeGob to be functor-based
svn-id: r41603
Diffstat (limited to 'engines/gob')
-rw-r--r--engines/gob/gob.cpp2
-rw-r--r--engines/gob/inter.cpp34
-rw-r--r--engines/gob/inter.h136
-rw-r--r--engines/gob/inter_bargon.cpp212
-rw-r--r--engines/gob/inter_fascin.cpp96
-rw-r--r--engines/gob/inter_v1.cpp274
-rw-r--r--engines/gob/inter_v2.cpp179
-rw-r--r--engines/gob/inter_v3.cpp205
-rw-r--r--engines/gob/inter_v4.cpp204
-rw-r--r--engines/gob/inter_v5.cpp196
-rw-r--r--engines/gob/inter_v6.cpp137
11 files changed, 221 insertions, 1454 deletions
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index 1de6245297..bea1df70a7 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -465,6 +465,8 @@ bool GobEngine::initGameParts() {
break;
}
+ _inter->setupOpcodes();
+
if (is640()) {
_video->_surfWidth = _width = 640;
_video->_surfHeight = _video->_splitHeight1 = _height = 480;
diff --git a/engines/gob/inter.cpp b/engines/gob/inter.cpp
index a10ebffacd..915553208f 100644
--- a/engines/gob/inter.cpp
+++ b/engines/gob/inter.cpp
@@ -67,9 +67,10 @@ Inter::~Inter() {
delocateVars();
}
-void Inter::NsetupOpcodes() {
+void Inter::setupOpcodes() {
setupOpcodesDraw();
setupOpcodesFunc();
+ setupOpcodesGob();
}
void Inter::executeOpcodeDraw(byte i) {
@@ -99,8 +100,30 @@ bool Inter::executeOpcodeFunc(byte i, byte j, OpFuncParams &params) {
return false;
}
+void Inter::executeOpcodeGob(int i, OpGobParams &params) {
+ debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
+ i, i, getDescOpcodeGob(i));
+
+ OpcodeEntry<OpcodeGob> *op = 0;
+
+ if (_opcodesGob.contains(i))
+ op = &_opcodesGob.getVal(i);
+
+ if (op && op->proc && op->proc->isValid()) {
+ (*op->proc)(params);
+ return;
+ }
+
+ int16 val;
+
+ _vm->_global->_inter_execPtr -= 2;
+ val = load16();
+ _vm->_global->_inter_execPtr += val << 1;
+ warning("unimplemented opcodeGob: %d [0x%X]", i, i);
+}
+
const char *Inter::getDescOpcodeDraw(byte i) {
- const char *desc = _opcodesDraw[i].desc;
+ const char *desc = _opcodesDraw[i].desc;
return ((desc) ? desc : "");
}
@@ -114,6 +137,13 @@ const char *Inter::getDescOpcodeFunc(byte i, byte j) {
return ((desc) ? desc : "");
}
+const char *Inter::getDescOpcodeGob(int i) {
+ if (_opcodesGob.contains(i))
+ return _opcodesGob.getVal(i).desc;
+
+ return "";
+}
+
void Inter::initControlVars(char full) {
*_nestLevel = 0;
*_breakFromLevel = -1;
diff --git a/engines/gob/inter.h b/engines/gob/inter.h
index 4dc67e4ade..a1f22fa930 100644
--- a/engines/gob/inter.h
+++ b/engines/gob/inter.h
@@ -27,6 +27,7 @@
#define GOB_INTER_H
#include "common/func.h"
+#include "common/hashmap.h"
#include "gob/goblin.h"
#include "gob/variables.h"
@@ -38,16 +39,20 @@ namespace Gob {
#ifndef REDUCE_MEMORY_USAGE
#define _OPCODEDRAW(ver, x) setProc(new Common::Functor0Mem<void, ver>(this, &ver::x), #x)
#define _OPCODEFUNC(ver, x) setProc(new Common::Functor1Mem<OpFuncParams &, bool, ver>(this, &ver::x), #x)
+ #define _OPCODEGOB(ver, x) setProc(new Common::Functor1Mem<OpGobParams &, void, ver>(this, &ver::x), #x)
#else
#define _OPCODEDRAW(ver, x) setProc(new Common::Functor0Mem<void, ver>(this, &ver::x), "")
#define _OPCODEFUNC(ver, x) setProc(new Common::Functor1Mem<OpFuncParams &, bool, ver>(this, &ver::x), "")
+ #define _OPCODEGOB(ver, x) setProc(new Common::Functor1Mem<OpGobParams &, void, ver>(this, &ver::x), "")
#endif
-#define CLEAROPCODEDRAW(i) _opcodesDraw[i].setProc(0, 0);
-#define CLEAROPCODEFUNC(i) _opcodesFunc[i].setProc(0, 0);
+#define CLEAROPCODEDRAW(i) _opcodesDraw[i].setProc(0, 0)
+#define CLEAROPCODEFUNC(i) _opcodesFunc[i].setProc(0, 0)
+#define CLEAROPCODEGOB(i) _opcodesGob.erase(i)
typedef Common::Functor0<void> OpcodeDraw;
typedef Common::Functor1<struct OpFuncParams &, bool> OpcodeFunc;
+typedef Common::Functor1<struct OpGobParams &, void> OpcodeGob;
struct OpFuncParams {
byte cmdCount;
@@ -79,14 +84,6 @@ struct OpcodeEntry : Common::NonCopyable {
}
};
-// This is to help devices with small memory (PDA, smartphones, ...)
-// to save abit of memory used by opcode names in the Scumm engine.
-#ifndef REDUCE_MEMORY_USAGE
-# define _OPCODE(ver, x) { &ver::x, #x }
-#else
-# define _OPCODE(ver, x) { &ver::x, "" }
-#endif
-
class Inter {
public:
uint8 _terminate;
@@ -99,6 +96,8 @@ public:
Variables *_variables;
+ void setupOpcodes();
+
void initControlVars(char full);
int16 load16();
char evalExpr(int16 *pRes);
@@ -124,6 +123,7 @@ public:
protected:
OpcodeEntry<OpcodeDraw> _opcodesDraw[256];
OpcodeEntry<OpcodeFunc> _opcodesFunc[256];
+ Common::HashMap<int, OpcodeEntry<OpcodeGob> > _opcodesGob;
bool _break;
@@ -139,19 +139,17 @@ protected:
GobEngine *_vm;
- void NsetupOpcodes();
void executeOpcodeDraw(byte i);
bool executeOpcodeFunc(byte i, byte j, OpFuncParams &params);
+ void executeOpcodeGob(int i, OpGobParams &params);
const char *getDescOpcodeDraw(byte i);
const char *getDescOpcodeFunc(byte i, byte j);
+ const char *getDescOpcodeGob(int i);
virtual void setupOpcodesDraw() = 0;
virtual void setupOpcodesFunc() = 0;
-
- virtual void setupOpcodes() = 0;
- virtual void executeGoblinOpcode(int i, OpGobParams &params) = 0;
- virtual const char *getOpcodeGoblinDesc(int i) = 0;
+ virtual void setupOpcodesGob() = 0;
virtual void checkSwitchTable(byte **ppExec) = 0;
@@ -169,20 +167,9 @@ public:
virtual void animPalette();
protected:
- typedef void (Inter_v1::*OpcodeGoblinProcV1)(OpGobParams &);
- struct OpcodeGoblinEntryV1 {
- OpcodeGoblinProcV1 proc;
- const char *desc;
- };
- const OpcodeGoblinEntryV1 *_opcodesGoblinV1;
- static const int _goblinFuncLookUp[][2];
-
virtual void setupOpcodesDraw();
virtual void setupOpcodesFunc();
-
- virtual void setupOpcodes();
- virtual void executeGoblinOpcode(int i, OpGobParams &params);
- virtual const char *getOpcodeGoblinDesc(int i);
+ virtual void setupOpcodesGob();
virtual void checkSwitchTable(byte **ppExec);
@@ -351,20 +338,9 @@ public:
virtual void animPalette();
protected:
- typedef void (Inter_v2::*OpcodeGoblinProcV2)(OpGobParams &);
- struct OpcodeGoblinEntryV2 {
- OpcodeGoblinProcV2 proc;
- const char *desc;
- };
- const OpcodeGoblinEntryV2 *_opcodesGoblinV2;
- static const int _goblinFuncLookUp[][2];
-
virtual void setupOpcodesDraw();
virtual void setupOpcodesFunc();
-
- virtual void setupOpcodes();
- virtual void executeGoblinOpcode(int i, OpGobParams &params);
- virtual const char *getOpcodeGoblinDesc(int i);
+ virtual void setupOpcodesGob();
virtual void checkSwitchTable(byte **ppExec);
@@ -430,20 +406,9 @@ public:
virtual ~Inter_Bargon() {}
protected:
- typedef void (Inter_Bargon::*OpcodeGoblinProcBargon)(OpGobParams &);
- struct OpcodeGoblinEntryBargon {
- OpcodeGoblinProcBargon proc;
- const char *desc;
- };
- const OpcodeGoblinEntryBargon *_opcodesGoblinBargon;
- static const int _goblinFuncLookUp[][2];
-
virtual void setupOpcodesDraw();
virtual void setupOpcodesFunc();
-
- virtual void setupOpcodes();
- virtual void executeGoblinOpcode(int i, OpGobParams &params);
- virtual const char *getOpcodeGoblinDesc(int i);
+ virtual void setupOpcodesGob();
void oBargon_intro0(OpGobParams &params);
void oBargon_intro1(OpGobParams &params);
@@ -463,20 +428,9 @@ public:
virtual ~Inter_Fascination() {}
protected:
- typedef void (Inter_Fascination::*OpcodeGoblinProcFascination)(OpGobParams &);
- struct OpcodeGoblinEntryFascination {
- OpcodeGoblinProcFascination proc;
- const char *desc;
- };
- const OpcodeGoblinEntryFascination *_opcodesGoblinFascination;
- static const int _goblinFuncLookUp[][2];
-
virtual void setupOpcodesDraw();
virtual void setupOpcodesFunc();
-
- virtual void setupOpcodes();
- virtual void executeGoblinOpcode(int i, OpGobParams &params);
- virtual const char *getOpcodeGoblinDesc(int i);
+ virtual void setupOpcodesGob();
void oFascin_playProtracker(OpGobParams &params);
@@ -511,20 +465,9 @@ public:
virtual ~Inter_v3() {}
protected:
- typedef void (Inter_v3::*OpcodeGoblinProcV3)(OpGobParams &);
- struct OpcodeGoblinEntryV3 {
- OpcodeGoblinProcV3 proc;
- const char *desc;
- };
- const OpcodeGoblinEntryV3 *_opcodesGoblinV3;
- static const int _goblinFuncLookUp[][2];
-
virtual void setupOpcodesDraw();
virtual void setupOpcodesFunc();
-
- virtual void setupOpcodes();
- virtual void executeGoblinOpcode(int i, OpGobParams &params);
- virtual const char *getOpcodeGoblinDesc(int i);
+ virtual void setupOpcodesGob();
bool o3_getTotTextItemPart(OpFuncParams &params);
bool o3_copySprite(OpFuncParams &params);
@@ -538,20 +481,9 @@ public:
virtual ~Inter_v4() {}
protected:
- typedef void (Inter_v4::*OpcodeGoblinProcV4)(OpGobParams &);
- struct OpcodeGoblinEntryV4 {
- OpcodeGoblinProcV4 proc;
- const char *desc;
- };
- const OpcodeGoblinEntryV4 *_opcodesGoblinV4;
- static const int _goblinFuncLookUp[][2];
-
virtual void setupOpcodesDraw();
virtual void setupOpcodesFunc();
-
- virtual void setupOpcodes();
- virtual void executeGoblinOpcode(int i, OpGobParams &params);
- virtual const char *getOpcodeGoblinDesc(int i);
+ virtual void setupOpcodesGob();
void o4_initScreen();
void o4_playVmdOrMusic();
@@ -563,22 +495,11 @@ public:
virtual ~Inter_v5() {}
protected:
- typedef void (Inter_v5::*OpcodeGoblinProcV5)(OpGobParams &);
- struct OpcodeGoblinEntryV5 {
- OpcodeGoblinProcV5 proc;
- const char *desc;
- };
- const OpcodeGoblinEntryV5 *_opcodesGoblinV5;
- static const int _goblinFuncLookUp[][2];
+ byte _gob_97_98_val;
virtual void setupOpcodesDraw();
virtual void setupOpcodesFunc();
-
- virtual void setupOpcodes();
- virtual void executeGoblinOpcode(int i, OpGobParams &params);
- virtual const char *getOpcodeGoblinDesc(int i);
-
- byte _gob_97_98_val;
+ virtual void setupOpcodesGob();
void o5_deleteFile();
void o5_initScreen();
@@ -609,22 +530,11 @@ public:
virtual ~Inter_v6() {}
protected:
- typedef void (Inter_v6::*OpcodeGoblinProcV6)(OpGobParams &);
- struct OpcodeGoblinEntryV6 {
- OpcodeGoblinProcV6 proc;
- const char *desc;
- };
- const OpcodeGoblinEntryV6 *_opcodesGoblinV6;
- static const int _goblinFuncLookUp[][2];
+ bool _gotFirstPalette;
virtual void setupOpcodesDraw();
virtual void setupOpcodesFunc();
-
- bool _gotFirstPalette;
-
- virtual void setupOpcodes();
- virtual void executeGoblinOpcode(int i, OpGobParams &params);
- virtual const char *getOpcodeGoblinDesc(int i);
+ virtual void setupOpcodesGob();
void o6_totSub();
void o6_playVmdOrMusic();
diff --git a/engines/gob/inter_bargon.cpp b/engines/gob/inter_bargon.cpp
index e5ec5eb486..12079600c0 100644
--- a/engines/gob/inter_bargon.cpp
+++ b/engines/gob/inter_bargon.cpp
@@ -39,88 +39,12 @@
namespace Gob {
-#define OPCODE(x) _OPCODE(Inter_Bargon, x)
#define OPCODEVER Inter_Bargon
#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
-
-const int Inter_Bargon::_goblinFuncLookUp[][2] = {
- {1, 0},
- {2, 1},
- {3, 2},
- {4, 3},
- {5, 4},
- {6, 5},
- {7, 6},
- {8, 7},
- {9, 8},
- {10, 9},
- {11, 10},
- {13, 11},
- {14, 12},
- {15, 13},
- {16, 14},
- {21, 15},
- {22, 16},
- {23, 17},
- {24, 18},
- {25, 19},
- {26, 20},
- {27, 21},
- {28, 22},
- {29, 23},
- {30, 24},
- {32, 25},
- {33, 26},
- {34, 27},
- {35, 28},
- {36, 29},
- {37, 30},
- {40, 31},
- {41, 32},
- {42, 33},
- {43, 34},
- {44, 35},
- {50, 36},
- {52, 37},
- {53, 38},
- {100, 39},
- {152, 40},
- {200, 41},
- {201, 42},
- {202, 43},
- {203, 44},
- {204, 45},
- {250, 46},
- {251, 47},
- {252, 48},
- {500, 49},
- {502, 50},
- {503, 51},
- {600, 52},
- {601, 53},
- {602, 54},
- {603, 55},
- {604, 56},
- {605, 57},
- {1000, 58},
- {1001, 59},
- {1002, 60},
- {1003, 61},
- {1004, 62},
- {1005, 63},
- {1006, 64},
- {1008, 65},
- {1009, 66},
- {1010, 67},
- {1011, 68},
- {1015, 69},
- {2005, 70}
-};
+#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
Inter_Bargon::Inter_Bargon(GobEngine *vm) : Inter_v2(vm) {
- setupOpcodes();
- NsetupOpcodes();
}
void Inter_Bargon::setupOpcodesDraw() {
@@ -131,130 +55,20 @@ void Inter_Bargon::setupOpcodesFunc() {
Inter_v2::setupOpcodesFunc();
}
-void Inter_Bargon::setupOpcodes() {
- static const OpcodeGoblinEntryBargon opcodesGoblin[71] = {
- /* 00 */
- OPCODE(oBargon_intro0),
- OPCODE(oBargon_intro1),
- OPCODE(oBargon_intro2),
- OPCODE(oBargon_intro3),
- /* 04 */
- OPCODE(oBargon_intro4),
- OPCODE(oBargon_intro5),
- OPCODE(oBargon_intro6),
- OPCODE(oBargon_intro7),
- /* 08 */
- OPCODE(oBargon_intro8),
- OPCODE(oBargon_intro9),
- OPCODE(o_gobNOP),
- {0, ""},
- /* 0C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 10 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 14 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 18 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 1C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 20 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 24 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 28 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 2C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 30 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 34 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 38 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 3C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 40 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 44 */
- {0, ""},
- {0, ""},
- {0, ""},
- };
-
- _opcodesGoblinBargon = opcodesGoblin;
-}
-
-void Inter_Bargon::executeGoblinOpcode(int i, OpGobParams &params) {
- debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
- i, i, getOpcodeGoblinDesc(i));
-
- OpcodeGoblinProcBargon op = 0;
+void Inter_Bargon::setupOpcodesGob() {
+ OPCODEGOB( 1, oBargon_intro0);
+ OPCODEGOB( 2, oBargon_intro1);
+ OPCODEGOB( 3, oBargon_intro2);
+ OPCODEGOB( 4, oBargon_intro3);
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i) {
- op = _opcodesGoblinBargon[_goblinFuncLookUp[j][1]].proc;
- break;
- }
-
- if (op == 0) {
- int16 val;
-
- _vm->_global->_inter_execPtr -= 2;
- val = load16();
- _vm->_global->_inter_execPtr += val << 1;
- warning("unimplemented opcodeGob: %d", i);
- } else
- (this->*op) (params);
-}
+ OPCODEGOB( 5, oBargon_intro4);
+ OPCODEGOB( 6, oBargon_intro5);
+ OPCODEGOB( 7, oBargon_intro6);
+ OPCODEGOB( 8, oBargon_intro7);
-const char *Inter_Bargon::getOpcodeGoblinDesc(int i) {
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i)
- return _opcodesGoblinBargon[_goblinFuncLookUp[j][1]].desc;
- return "";
+ OPCODEGOB( 9, oBargon_intro8);
+ OPCODEGOB(10, oBargon_intro9);
+ OPCODEGOB(11, o_gobNOP);
}
void Inter_Bargon::oBargon_intro0(OpGobParams &params) {
diff --git a/engines/gob/inter_fascin.cpp b/engines/gob/inter_fascin.cpp
index fd8e6062ce..8f7a53c8f1 100644
--- a/engines/gob/inter_fascin.cpp
+++ b/engines/gob/inter_fascin.cpp
@@ -40,32 +40,12 @@
namespace Gob {
-#define OPCODE(x) _OPCODE(Inter_Fascination, x)
#define OPCODEVER Inter_Fascination
#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
-
-const int Inter_Fascination::_goblinFuncLookUp[][2] = {
- {1, 0},
- {2, 1},
- {3, 2},
- {4, 3},
- {5, 4},
- {6, 5},
- {7, 6},
- {8, 7},
- {9, 8},
- {10, 9},
- {11, 10},
- {12, 11},
- {1000, 12},
- {1001, 13},
- {1002, 14}
-};
+#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
Inter_Fascination::Inter_Fascination(GobEngine *vm) : Inter_v2(vm) {
- setupOpcodes();
- NsetupOpcodes();
}
void Inter_Fascination::setupOpcodesDraw() {
@@ -106,30 +86,25 @@ void Inter_Fascination::setupOpcodesFunc() {
Inter_v2::setupOpcodesFunc();
}
-void Inter_Fascination::setupOpcodes() {
- static const OpcodeGoblinEntryFascination opcodesGoblin[15] = {
- /* 00 */
- OPCODE(oFascin_geUnknown0),
- OPCODE(oFascin_geUnknown1),
- OPCODE(oFascin_geUnknown2),
- OPCODE(oFascin_geUnknown3),
- /* 04 */
- OPCODE(oFascin_geUnknown4),
- OPCODE(oFascin_geUnknown5),
- OPCODE(oFascin_geUnknown6),
- OPCODE(oFascin_geUnknown7),
- /* 08 */
- OPCODE(oFascin_geUnknown8),
- OPCODE(oFascin_geUnknown9),
- OPCODE(oFascin_geUnknown10),
- OPCODE(oFascin_geUnknown11),
- /* 0C */
- OPCODE(oFascin_geUnknown1000),
- OPCODE(oFascin_geUnknown1001), //protrackerPlay doesn't play correctly "mod.extasy"
- OPCODE(oFascin_geUnknown1002), //to be replaced by o2_stopProtracker when protrackerPlay is fixed
- };
-
- _opcodesGoblinFascination = opcodesGoblin;
+void Inter_Fascination::setupOpcodesGob() {
+ OPCODEGOB( 1, oFascin_geUnknown0);
+ OPCODEGOB( 2, oFascin_geUnknown1);
+ OPCODEGOB( 3, oFascin_geUnknown2);
+ OPCODEGOB( 4, oFascin_geUnknown3);
+
+ OPCODEGOB( 5, oFascin_geUnknown4);
+ OPCODEGOB( 6, oFascin_geUnknown5);
+ OPCODEGOB( 7, oFascin_geUnknown6);
+ OPCODEGOB( 8, oFascin_geUnknown7);
+
+ OPCODEGOB( 9, oFascin_geUnknown8);
+ OPCODEGOB( 10, oFascin_geUnknown9);
+ OPCODEGOB( 11, oFascin_geUnknown10);
+ OPCODEGOB( 12, oFascin_geUnknown11);
+
+ OPCODEGOB(1000, oFascin_geUnknown1000);
+ OPCODEGOB(1001, oFascin_geUnknown1001); //protrackerPlay doesn't play correctly "mod.extasy"
+ OPCODEGOB(1002, oFascin_geUnknown1002); //to be replaced by o2_stopProtracker when protrackerPlay is fixed
}
void Inter_Fascination::oFascin_geUnknown0(OpGobParams &params) {
@@ -277,37 +252,6 @@ void Inter_Fascination::oFascin_cdUnknown11() {
evalExpr(0);
}
-void Inter_Fascination::executeGoblinOpcode(int i, OpGobParams &params) {
- debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
- i, i, getOpcodeGoblinDesc(i));
-
- OpcodeGoblinProcFascination op = 0;
-
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i) {
- op = _opcodesGoblinFascination[_goblinFuncLookUp[j][1]].proc;
- break;
- }
-
- if (op == 0) {
- int16 val;
-
- _vm->_global->_inter_execPtr -= 2;
- val = load16();
- _vm->_global->_inter_execPtr += val << 1;
- warning("unimplemented opcodeGob: %d", i);
- } else
- (this->*op) (params);
-}
-
-const char *Inter_Fascination::getOpcodeGoblinDesc(int i) {
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i)
- return _opcodesGoblinFascination[_goblinFuncLookUp[j][1]].desc;
- warning("Error in getOpcodeGoblinDesc %d",i);
- return "";
-}
-
void Inter_Fascination::oFascin_playProtracker(OpGobParams &params) {
_vm->_sound->protrackerPlay("mod.extasy");
}
diff --git a/engines/gob/inter_v1.cpp b/engines/gob/inter_v1.cpp
index a8e29201cd..26d6d9b3d9 100644
--- a/engines/gob/inter_v1.cpp
+++ b/engines/gob/inter_v1.cpp
@@ -46,88 +46,12 @@
namespace Gob {
-#define OPCODE(x) _OPCODE(Inter_v1, x)
#define OPCODEVER Inter_v1
#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
-
-const int Inter_v1::_goblinFuncLookUp[][2] = {
- {1, 0},
- {2, 1},
- {3, 2},
- {4, 3},
- {5, 4},
- {6, 5},
- {7, 6},
- {8, 7},
- {9, 8},
- {10, 9},
- {12, 10},
- {13, 11},
- {14, 12},
- {15, 13},
- {16, 14},
- {21, 15},
- {22, 16},
- {23, 17},
- {24, 18},
- {25, 19},
- {26, 20},
- {27, 21},
- {28, 22},
- {29, 23},
- {30, 24},
- {32, 25},
- {33, 26},
- {34, 27},
- {35, 28},
- {36, 29},
- {37, 30},
- {40, 31},
- {41, 32},
- {42, 33},
- {43, 34},
- {44, 35},
- {50, 36},
- {52, 37},
- {53, 38},
- {150, 39},
- {152, 40},
- {200, 41},
- {201, 42},
- {202, 43},
- {203, 44},
- {204, 45},
- {250, 46},
- {251, 47},
- {252, 48},
- {500, 49},
- {502, 50},
- {503, 51},
- {600, 52},
- {601, 53},
- {602, 54},
- {603, 55},
- {604, 56},
- {605, 57},
- {1000, 58},
- {1001, 59},
- {1002, 60},
- {1003, 61},
- {1004, 62},
- {1005, 63},
- {1006, 64},
- {1008, 65},
- {1009, 66},
- {1010, 67},
- {1011, 68},
- {1015, 69},
- {2005, 70}
-};
+#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
Inter_v1::Inter_v1(GobEngine *vm) : Inter(vm) {
- setupOpcodes();
- NsetupOpcodes();
}
void Inter_v1::setupOpcodesDraw() {
@@ -241,128 +165,78 @@ void Inter_v1::setupOpcodesFunc() {
OPCODEFUNC(0x4F, o1_manageDataFile);
}
-void Inter_v1::setupOpcodes() {
- static const OpcodeGoblinEntryV1 opcodesGoblin[71] = {
- /* 00 */
- OPCODE(o1_setState),
- OPCODE(o1_setCurFrame),
- OPCODE(o1_setNextState),
- OPCODE(o1_setMultState),
- /* 04 */
- OPCODE(o1_setOrder),
- OPCODE(o1_setActionStartState),
- OPCODE(o1_setCurLookDir),
- OPCODE(o1_setType),
- /* 08 */
- OPCODE(o1_setNoTick),
- OPCODE(o1_setPickable),
- OPCODE(o1_setXPos),
- OPCODE(o1_setYPos),
- /* 0C */
- OPCODE(o1_setDoAnim),
- OPCODE(o1_setRelaxTime),
- OPCODE(o1_setMaxTick),
- OPCODE(o1_getState),
- /* 10 */
- OPCODE(o1_getCurFrame),
- OPCODE(o1_getNextState),
- OPCODE(o1_getMultState),
- OPCODE(o1_getOrder),
- /* 14 */
- OPCODE(o1_getActionStartState),
- OPCODE(o1_getCurLookDir),
- OPCODE(o1_getType),
- OPCODE(o1_getNoTick),
- /* 18 */
- OPCODE(o1_getPickable),
- OPCODE(o1_getObjMaxFrame),
- OPCODE(o1_getXPos),
- OPCODE(o1_getYPos),
- /* 1C */
- OPCODE(o1_getDoAnim),
- OPCODE(o1_getRelaxTime),
- OPCODE(o1_getMaxTick),
- OPCODE(o1_manipulateMap),
- /* 20 */
- OPCODE(o1_getItem),
- OPCODE(o1_manipulateMapIndirect),
- OPCODE(o1_getItemIndirect),
- OPCODE(o1_setPassMap),
- /* 24 */
- OPCODE(o1_setGoblinPosH),
- OPCODE(o1_getGoblinPosXH),
- OPCODE(o1_getGoblinPosYH),
- OPCODE(o1_setGoblinMultState),
- /* 28 */
- OPCODE(o1_setGoblinUnk14),
- OPCODE(o1_setItemIdInPocket),
- OPCODE(o1_setItemIndInPocket),
- OPCODE(o1_getItemIdInPocket),
- /* 2C */
- OPCODE(o1_getItemIndInPocket),
- OPCODE(o1_setItemPos),
- OPCODE(o1_setGoblinPos),
- OPCODE(o1_setGoblinState),
- /* 30 */
- OPCODE(o1_setGoblinStateRedraw),
- OPCODE(o1_decRelaxTime),
- OPCODE(o1_getGoblinPosX),
- OPCODE(o1_getGoblinPosY),
- /* 34 */
- OPCODE(o1_clearPathExistence),
- OPCODE(o1_setGoblinVisible),
- OPCODE(o1_setGoblinInvisible),
- OPCODE(o1_getObjectIntersect),
- /* 38 */
- OPCODE(o1_getGoblinIntersect),
- OPCODE(o1_setItemPos),
- OPCODE(o1_loadObjects),
- OPCODE(o1_freeObjects),
- /* 3C */
- OPCODE(o1_animateObjects),
- OPCODE(o1_drawObjects),
- OPCODE(o1_loadMap),
- OPCODE(o1_moveGoblin),
- /* 40 */
- OPCODE(o1_switchGoblin),
- OPCODE(o1_loadGoblin),
- OPCODE(o1_writeTreatItem),
- OPCODE(o1_moveGoblin0),
- /* 44 */
- OPCODE(o1_setGoblinTarget),
- OPCODE(o1_setGoblinObjectsPos),
- OPCODE(o1_initGoblin)
- };
-
- _opcodesGoblinV1 = opcodesGoblin;
-}
-
-void Inter_v1::executeGoblinOpcode(int i, OpGobParams &params) {
- debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
- i, i, getOpcodeGoblinDesc(i));
-
- OpcodeGoblinProcV1 op = 0;
-
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i) {
- op = _opcodesGoblinV1[_goblinFuncLookUp[j][1]].proc;
- break;
- }
-
- if (op == 0) {
- warning("unimplemented opcodeGoblin: %d", i);
- _vm->_global->_inter_execPtr -= 2;
- int16 cmd = load16();
- _vm->_global->_inter_execPtr += cmd * 2;
- } else
- (this->*op) (params);
-}
-
-const char *Inter_v1::getOpcodeGoblinDesc(int i) {
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i)
- return _opcodesGoblinV1[_goblinFuncLookUp[j][1]].desc;
- return "";
+void Inter_v1::setupOpcodesGob() {
+ OPCODEGOB( 1, o1_setState);
+ OPCODEGOB( 2, o1_setCurFrame);
+ OPCODEGOB( 3, o1_setNextState);
+ OPCODEGOB( 4, o1_setMultState);
+ OPCODEGOB( 5, o1_setOrder);
+ OPCODEGOB( 6, o1_setActionStartState);
+ OPCODEGOB( 7, o1_setCurLookDir);
+ OPCODEGOB( 8, o1_setType);
+ OPCODEGOB( 9, o1_setNoTick);
+ OPCODEGOB( 10, o1_setPickable);
+ OPCODEGOB( 12, o1_setXPos);
+ OPCODEGOB( 13, o1_setYPos);
+ OPCODEGOB( 14, o1_setDoAnim);
+ OPCODEGOB( 15, o1_setRelaxTime);
+ OPCODEGOB( 16, o1_setMaxTick);
+ OPCODEGOB( 21, o1_getState);
+ OPCODEGOB( 22, o1_getCurFrame);
+ OPCODEGOB( 23, o1_getNextState);
+ OPCODEGOB( 24, o1_getMultState);
+ OPCODEGOB( 25, o1_getOrder);
+ OPCODEGOB( 26, o1_getActionStartState);
+ OPCODEGOB( 27, o1_getCurLookDir);
+ OPCODEGOB( 28, o1_getType);
+ OPCODEGOB( 29, o1_getNoTick);
+ OPCODEGOB( 30, o1_getPickable);
+ OPCODEGOB( 32, o1_getObjMaxFrame);
+ OPCODEGOB( 33, o1_getXPos);
+ OPCODEGOB( 34, o1_getYPos);
+ OPCODEGOB( 35, o1_getDoAnim);
+ OPCODEGOB( 36, o1_getRelaxTime);
+ OPCODEGOB( 37, o1_getMaxTick);
+ OPCODEGOB( 40, o1_manipulateMap);
+ OPCODEGOB( 41, o1_getItem);
+ OPCODEGOB( 42, o1_manipulateMapIndirect);
+ OPCODEGOB( 43, o1_getItemIndirect);
+ OPCODEGOB( 44, o1_setPassMap);
+ OPCODEGOB( 50, o1_setGoblinPosH);
+ OPCODEGOB( 52, o1_getGoblinPosXH);
+ OPCODEGOB( 53, o1_getGoblinPosYH);
+ OPCODEGOB( 150, o1_setGoblinMultState);
+ OPCODEGOB( 152, o1_setGoblinUnk14);
+ OPCODEGOB( 200, o1_setItemIdInPocket);
+ OPCODEGOB( 201, o1_setItemIndInPocket);
+ OPCODEGOB( 202, o1_getItemIdInPocket);
+ OPCODEGOB( 203, o1_getItemIndInPocket);
+ OPCODEGOB( 204, o1_setItemPos);
+ OPCODEGOB( 250, o1_setGoblinPos);
+ OPCODEGOB( 251, o1_setGoblinState);
+ OPCODEGOB( 252, o1_setGoblinStateRedraw);
+ OPCODEGOB( 500, o1_decRelaxTime);
+ OPCODEGOB( 502, o1_getGoblinPosX);
+ OPCODEGOB( 503, o1_getGoblinPosY);
+ OPCODEGOB( 600, o1_clearPathExistence);
+ OPCODEGOB( 601, o1_setGoblinVisible);
+ OPCODEGOB( 602, o1_setGoblinInvisible);
+ OPCODEGOB( 603, o1_getObjectIntersect);
+ OPCODEGOB( 604, o1_getGoblinIntersect);
+ OPCODEGOB( 605, o1_setItemPos);
+ OPCODEGOB(1000, o1_loadObjects);
+ OPCODEGOB(1001, o1_freeObjects);
+ OPCODEGOB(1002, o1_animateObjects);
+ OPCODEGOB(1003, o1_drawObjects);
+ OPCODEGOB(1004, o1_loadMap);
+ OPCODEGOB(1005, o1_moveGoblin);
+ OPCODEGOB(1006, o1_switchGoblin);
+ OPCODEGOB(1008, o1_loadGoblin);
+ OPCODEGOB(1009, o1_writeTreatItem);
+ OPCODEGOB(1010, o1_moveGoblin0);
+ OPCODEGOB(1011, o1_setGoblinTarget);
+ OPCODEGOB(1015, o1_setGoblinObjectsPos);
+ OPCODEGOB(2005, o1_initGoblin);
}
void Inter_v1::checkSwitchTable(byte **ppExec) {
@@ -1459,7 +1333,7 @@ bool Inter_v1::o1_goblinFunc(OpFuncParams &params) {
if ((cmd < 40) && objDescSet && !gobParams.objDesc)
return false;
- executeGoblinOpcode(cmd, gobParams);
+ executeOpcodeGob(cmd, gobParams);
return false;
}
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index 6681ea7269..078d644dd6 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -48,59 +48,12 @@
namespace Gob {
-#define OPCODE(x) _OPCODE(Inter_v2, x)
#define OPCODEVER Inter_v2
#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
-
-const int Inter_v2::_goblinFuncLookUp[][2] = {
- {0, 0},
- {1, 1},
- {2, 2},
- {4, 3},
- {5, 4},
- {6, 5},
- {7, 6},
- {8, 7},
- {9, 8},
- {10, 9},
- {12, 10},
- {13, 11},
- {14, 12},
- {15, 13},
- {16, 14},
- {21, 15},
- {22, 16},
- {23, 17},
- {24, 18},
- {25, 19},
- {26, 20},
- {27, 21},
- {28, 22},
- {29, 23},
- {30, 24},
- {32, 25},
- {33, 26},
- {34, 27},
- {35, 28},
- {36, 29},
- {37, 30},
- {40, 31},
- {41, 32},
- {42, 33},
- {43, 34},
- {44, 35},
- {50, 36},
- {52, 37},
- {53, 38},
- {100, 39},
- {500, 40},
- {501, 41}
-};
+#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
Inter_v2::Inter_v2(GobEngine *vm) : Inter_v1(vm) {
- setupOpcodes();
- NsetupOpcodes();
}
void Inter_v2::setupOpcodesDraw() {
@@ -181,129 +134,17 @@ void Inter_v2::setupOpcodesFunc() {
OPCODEFUNC(0x4E, o2_writeData);
}
-void Inter_v2::setupOpcodes() {
- static const OpcodeGoblinEntryV2 opcodesGoblin[71] = {
- /* 00 */
- OPCODE(o2_loadInfogramesIns),
- OPCODE(o2_startInfogrames),
- OPCODE(o2_stopInfogrames),
- {0, ""},
- /* 04 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 08 */
- {0, ""},
- OPCODE(o2_playInfogrames),
- {0, ""},
- {0, ""},
- /* 0C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 10 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 14 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 18 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 1C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 20 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 24 */
- {0, ""},
- {0, ""},
- {0, ""},
- OPCODE(o2_handleGoblins),
- /* 28 */
- OPCODE(o2_playProtracker),
- OPCODE(o2_stopProtracker),
- {0, ""},
- {0, ""},
- /* 2C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 30 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 34 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 38 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 3C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 40 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 44 */
- {0, ""},
- {0, ""},
- {0, ""},
- };
-
- _opcodesGoblinV2 = opcodesGoblin;
-}
-
-void Inter_v2::executeGoblinOpcode(int i, OpGobParams &params) {
- debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
- i, i, getOpcodeGoblinDesc(i));
+void Inter_v2::setupOpcodesGob() {
+ OPCODEGOB( 0, o2_loadInfogramesIns);
+ OPCODEGOB( 1, o2_startInfogrames);
+ OPCODEGOB( 2, o2_stopInfogrames);
- OpcodeGoblinProcV2 op = 0;
+ OPCODEGOB( 10, o2_playInfogrames);
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i) {
- op = _opcodesGoblinV2[_goblinFuncLookUp[j][1]].proc;
- break;
- }
-
- if (op == 0) {
- int16 val;
-
- _vm->_global->_inter_execPtr -= 2;
- val = load16();
- _vm->_global->_inter_execPtr += val << 1;
- } else
- (this->*op) (params);
-}
+ OPCODEGOB(100, o2_handleGoblins);
-const char *Inter_v2::getOpcodeGoblinDesc(int i) {
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i)
- return _opcodesGoblinV2[_goblinFuncLookUp[j][1]].desc;
- return "";
+ OPCODEGOB(500, o2_playProtracker);
+ OPCODEGOB(501, o2_stopProtracker);
}
void Inter_v2::checkSwitchTable(byte **ppExec) {
@@ -1421,7 +1262,7 @@ bool Inter_v2::o2_goblinFunc(OpFuncParams &params) {
_vm->_global->_inter_execPtr += 2;
if (cmd != 101)
- executeGoblinOpcode(cmd, gobParams);
+ executeOpcodeGob(cmd, gobParams);
return false;
}
diff --git a/engines/gob/inter_v3.cpp b/engines/gob/inter_v3.cpp
index 28ac6dbd8c..4a8bc8f218 100644
--- a/engines/gob/inter_v3.cpp
+++ b/engines/gob/inter_v3.cpp
@@ -36,88 +36,12 @@
namespace Gob {
-#define OPCODE(x) _OPCODE(Inter_v3, x)
#define OPCODEVER Inter_v3
#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
-
-const int Inter_v3::_goblinFuncLookUp[][2] = {
- {0, 0},
- {1, 1},
- {2, 2},
- {4, 3},
- {5, 4},
- {6, 5},
- {7, 6},
- {8, 7},
- {9, 8},
- {10, 9},
- {12, 10},
- {13, 11},
- {14, 12},
- {15, 13},
- {16, 14},
- {21, 15},
- {22, 16},
- {23, 17},
- {24, 18},
- {25, 19},
- {26, 20},
- {27, 21},
- {28, 22},
- {29, 23},
- {30, 24},
- {32, 25},
- {33, 26},
- {34, 27},
- {35, 28},
- {36, 29},
- {37, 30},
- {40, 31},
- {41, 32},
- {42, 33},
- {43, 34},
- {44, 35},
- {50, 36},
- {52, 37},
- {53, 38},
- {100, 39},
- {152, 40},
- {200, 41},
- {201, 42},
- {202, 43},
- {203, 44},
- {204, 45},
- {250, 46},
- {251, 47},
- {252, 48},
- {500, 49},
- {502, 50},
- {503, 51},
- {600, 52},
- {601, 53},
- {602, 54},
- {603, 55},
- {604, 56},
- {605, 57},
- {1000, 58},
- {1001, 59},
- {1002, 60},
- {1003, 61},
- {1004, 62},
- {1005, 63},
- {1006, 64},
- {1008, 65},
- {1009, 66},
- {1010, 67},
- {1011, 68},
- {1015, 69},
- {2005, 70}
-};
+#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
Inter_v3::Inter_v3(GobEngine *vm) : Inter_v2(vm) {
- setupOpcodes();
- NsetupOpcodes();
}
void Inter_v3::setupOpcodesDraw() {
@@ -131,129 +55,14 @@ void Inter_v3::setupOpcodesFunc() {
OPCODEFUNC(0x32, o3_copySprite);
}
-void Inter_v3::setupOpcodes() {
- static const OpcodeGoblinEntryV3 opcodesGoblin[71] = {
- /* 00 */
- OPCODE(o2_loadInfogramesIns),
- OPCODE(o2_startInfogrames),
- OPCODE(o2_stopInfogrames),
- {0, ""},
- /* 04 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 08 */
- {0, ""},
- OPCODE(o2_playInfogrames),
- {0, ""},
- {0, ""},
- /* 0C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 10 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 14 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 18 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 1C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 20 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 24 */
- {0, ""},
- {0, ""},
- {0, ""},
- OPCODE(o3_wobble),
- /* 28 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 2C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 30 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 34 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 38 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 3C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 40 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 44 */
- {0, ""},
- {0, ""},
- {0, ""},
- };
-
- _opcodesGoblinV3 = opcodesGoblin;
-}
-
-void Inter_v3::executeGoblinOpcode(int i, OpGobParams &params) {
- debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
- i, i, getOpcodeGoblinDesc(i));
+void Inter_v3::setupOpcodesGob() {
+ OPCODEGOB( 0, o2_loadInfogramesIns);
+ OPCODEGOB( 1, o2_startInfogrames);
+ OPCODEGOB( 2, o2_stopInfogrames);
- OpcodeGoblinProcV3 op = 0;
-
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i) {
- op = _opcodesGoblinV3[_goblinFuncLookUp[j][1]].proc;
- break;
- }
-
- if (op == 0) {
- int16 val;
-
- _vm->_global->_inter_execPtr -= 2;
- val = load16();
- _vm->_global->_inter_execPtr += val << 1;
- } else
- (this->*op) (params);
-}
+ OPCODEGOB( 10, o2_playInfogrames);
-const char *Inter_v3::getOpcodeGoblinDesc(int i) {
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i)
- return _opcodesGoblinV3[_goblinFuncLookUp[j][1]].desc;
- return "";
+ OPCODEGOB(100, o3_wobble);
}
bool Inter_v3::o3_getTotTextItemPart(OpFuncParams &params) {
diff --git a/engines/gob/inter_v4.cpp b/engines/gob/inter_v4.cpp
index 0c04d02a61..ccc50ebb24 100644
--- a/engines/gob/inter_v4.cpp
+++ b/engines/gob/inter_v4.cpp
@@ -38,88 +38,12 @@
namespace Gob {
-#define OPCODE(x) _OPCODE(Inter_v4, x)
#define OPCODEVER Inter_v4
#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
-
-const int Inter_v4::_goblinFuncLookUp[][2] = {
- {0, 0},
- {1, 1},
- {2, 2},
- {4, 3},
- {5, 4},
- {6, 5},
- {7, 6},
- {8, 7},
- {9, 8},
- {10, 9},
- {12, 10},
- {13, 11},
- {14, 12},
- {15, 13},
- {16, 14},
- {21, 15},
- {22, 16},
- {23, 17},
- {24, 18},
- {25, 19},
- {26, 20},
- {27, 21},
- {28, 22},
- {29, 23},
- {30, 24},
- {32, 25},
- {33, 26},
- {34, 27},
- {35, 28},
- {36, 29},
- {37, 30},
- {40, 31},
- {41, 32},
- {42, 33},
- {43, 34},
- {44, 35},
- {50, 36},
- {52, 37},
- {53, 38},
- {100, 39},
- {152, 40},
- {200, 41},
- {201, 42},
- {202, 43},
- {203, 44},
- {204, 45},
- {250, 46},
- {251, 47},
- {252, 48},
- {500, 49},
- {502, 50},
- {503, 51},
- {600, 52},
- {601, 53},
- {602, 54},
- {603, 55},
- {604, 56},
- {605, 57},
- {1000, 58},
- {1001, 59},
- {1002, 60},
- {1003, 61},
- {1004, 62},
- {1005, 63},
- {1006, 64},
- {1008, 65},
- {1009, 66},
- {1010, 67},
- {1011, 68},
- {1015, 69},
- {2005, 70}
-};
+#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
Inter_v4::Inter_v4(GobEngine *vm) : Inter_v3(vm) {
- setupOpcodes();
- NsetupOpcodes();
}
void Inter_v4::setupOpcodesDraw() {
@@ -133,131 +57,7 @@ void Inter_v4::setupOpcodesFunc() {
Inter_v3::setupOpcodesFunc();
}
-void Inter_v4::setupOpcodes() {
- static const OpcodeGoblinEntryV4 opcodesGoblin[71] = {
- /* 00 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 04 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 08 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 0C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 10 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 14 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 18 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 1C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 20 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 24 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 28 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 2C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 30 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 34 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 38 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 3C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 40 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 44 */
- {0, ""},
- {0, ""},
- {0, ""},
- };
-
- _opcodesGoblinV4 = opcodesGoblin;
-}
-
-void Inter_v4::executeGoblinOpcode(int i, OpGobParams &params) {
- debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
- i, i, getOpcodeGoblinDesc(i));
-
- OpcodeGoblinProcV4 op = 0;
-
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i) {
- op = _opcodesGoblinV4[_goblinFuncLookUp[j][1]].proc;
- break;
- }
-
- if (op == 0) {
- warning("unimplemented opcodeGoblin: %d", i);
-
- int16 val;
-
- _vm->_global->_inter_execPtr -= 2;
- val = load16();
- _vm->_global->_inter_execPtr += val << 1;
- } else
- (this->*op) (params);
-}
-
-const char *Inter_v4::getOpcodeGoblinDesc(int i) {
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i)
- return _opcodesGoblinV4[_goblinFuncLookUp[j][1]].desc;
- return "";
+void Inter_v4::setupOpcodesGob() {
}
void Inter_v4::o4_initScreen() {
diff --git a/engines/gob/inter_v5.cpp b/engines/gob/inter_v5.cpp
index 426cef9b92..0d089af1ae 100644
--- a/engines/gob/inter_v5.cpp
+++ b/engines/gob/inter_v5.cpp
@@ -35,44 +35,12 @@
namespace Gob {
-#define OPCODE(x) _OPCODE(Inter_v5, x)
#define OPCODEVER Inter_v5
#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
-
-const int Inter_v5::_goblinFuncLookUp[][2] = {
- {0, 0},
- {1, 0},
- {3, 0},
- {2, 0},
- {33, 0},
- {80, 1},
- {81, 2},
- {82, 3},
- {83, 4},
- {84, 5},
- {85, 6},
- {86, 7},
- {87, 0},
- {88, 0},
- {89, 0},
- {90, 0},
- {91, 0},
- {92, 8},
- {93, 0},
- {94, 0},
- {95, 9},
- {96, 10},
- {97, 11},
- {98, 12},
- {99, 0},
- {100, 13},
- {200, 14}
-};
+#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
Inter_v5::Inter_v5(GobEngine *vm) : Inter_v4(vm) {
- setupOpcodes();
- NsetupOpcodes();
}
void Inter_v5::setupOpcodesDraw() {
@@ -88,133 +56,41 @@ void Inter_v5::setupOpcodesFunc() {
OPCODEFUNC(0x45, o5_istrlen);
}
-void Inter_v5::setupOpcodes() {
- static const OpcodeGoblinEntryV5 opcodesGoblin[71] = {
- /* 00 */
- OPCODE(o5_spaceShooter),
- OPCODE(o5_getSystemCDSpeed),
- OPCODE(o5_getSystemRAM),
- OPCODE(o5_getSystemCPUSpeed),
- /* 04 */
- OPCODE(o5_getSystemDrawSpeed),
- OPCODE(o5_totalSystemSpecs),
- OPCODE(o5_saveSystemSpecs),
- OPCODE(o5_loadSystemSpecs),
- /* 08 */
- OPCODE(o5_gob92),
- OPCODE(o5_gob95),
- OPCODE(o5_gob96),
- OPCODE(o5_gob97),
- /* 0C */
- OPCODE(o5_gob98),
- OPCODE(o5_gob100),
- OPCODE(o5_gob200),
- {0, ""},
- /* 10 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 14 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 18 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 1C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 20 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 24 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 28 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 2C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 30 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 34 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 38 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 3C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 40 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 44 */
- {0, ""},
- {0, ""},
- {0, ""},
- };
-
- _opcodesGoblinV5 = opcodesGoblin;
-}
-
-void Inter_v5::executeGoblinOpcode(int i, OpGobParams &params) {
- debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
- i, i, getOpcodeGoblinDesc(i));
-
- OpcodeGoblinProcV5 op = 0;
-
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i) {
- op = _opcodesGoblinV5[_goblinFuncLookUp[j][1]].proc;
- break;
- }
-
- _vm->_global->_inter_execPtr -= 2;
-
- if (op == 0) {
- warning("unimplemented opcodeGoblin: %d", i);
-
- int16 paramCount = load16();
- _vm->_global->_inter_execPtr += paramCount * 2;
- } else {
- params.extraData = i;
-
- (this->*op) (params);
- }
-}
-
-const char *Inter_v5::getOpcodeGoblinDesc(int i) {
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i)
- return _opcodesGoblinV5[_goblinFuncLookUp[j][1]].desc;
- return "";
+void Inter_v5::setupOpcodesGob() {
+ OPCODEGOB( 0, o5_spaceShooter);
+ OPCODEGOB( 1, o5_spaceShooter);
+ OPCODEGOB( 2, o5_spaceShooter);
+ OPCODEGOB( 3, o5_spaceShooter);
+
+ OPCODEGOB( 33, o5_spaceShooter);
+
+ OPCODEGOB( 80, o5_getSystemCDSpeed);
+ OPCODEGOB( 81, o5_getSystemRAM);
+ OPCODEGOB( 82, o5_getSystemCPUSpeed);
+ OPCODEGOB( 83, o5_getSystemDrawSpeed);
+ OPCODEGOB( 84, o5_totalSystemSpecs);
+
+ OPCODEGOB( 85, o5_saveSystemSpecs);
+ OPCODEGOB( 86, o5_loadSystemSpecs);
+
+ OPCODEGOB( 87, o5_spaceShooter);
+ OPCODEGOB( 88, o5_spaceShooter);
+ OPCODEGOB( 89, o5_spaceShooter);
+ OPCODEGOB( 90, o5_spaceShooter);
+
+ OPCODEGOB( 91, o5_spaceShooter);
+ OPCODEGOB( 92, o5_gob92);
+ OPCODEGOB( 93, o5_spaceShooter);
+ OPCODEGOB( 94, o5_spaceShooter);
+
+ OPCODEGOB( 95, o5_gob95);
+ OPCODEGOB( 96, o5_gob96);
+ OPCODEGOB( 97, o5_gob97);
+ OPCODEGOB( 98, o5_gob98);
+
+ OPCODEGOB( 99, o5_spaceShooter);
+ OPCODEGOB(100, o5_gob100);
+ OPCODEGOB(200, o5_gob200);
}
void Inter_v5::o5_deleteFile() {
diff --git a/engines/gob/inter_v6.cpp b/engines/gob/inter_v6.cpp
index 883ecfcd8a..760760625b 100644
--- a/engines/gob/inter_v6.cpp
+++ b/engines/gob/inter_v6.cpp
@@ -39,20 +39,13 @@
namespace Gob {
-#define OPCODE(x) _OPCODE(Inter_v6, x)
#define OPCODEVER Inter_v6
#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x)
#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x)
-
-const int Inter_v6::_goblinFuncLookUp[][2] = {
- {0, 0},
-};
+#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x)
Inter_v6::Inter_v6(GobEngine *vm) : Inter_v5(vm) {
_gotFirstPalette = false;
-
- setupOpcodes();
- NsetupOpcodes();
}
void Inter_v6::setupOpcodesDraw() {
@@ -73,133 +66,7 @@ void Inter_v6::setupOpcodesFunc() {
OPCODEFUNC(0x33, o6_fillRect);
}
-void Inter_v6::setupOpcodes() {
- static const OpcodeGoblinEntryV6 opcodesGoblin[71] = {
- /* 00 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 04 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 08 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 0C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 10 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 14 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 18 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 1C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 20 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 24 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 28 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 2C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 30 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 34 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 38 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 3C */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 40 */
- {0, ""},
- {0, ""},
- {0, ""},
- {0, ""},
- /* 44 */
- {0, ""},
- {0, ""},
- {0, ""},
- };
-
- _opcodesGoblinV6 = opcodesGoblin;
-}
-
-void Inter_v6::executeGoblinOpcode(int i, OpGobParams &params) {
- debugC(1, kDebugGobOp, "opcodeGoblin %d [0x%X] (%s)",
- i, i, getOpcodeGoblinDesc(i));
-
- OpcodeGoblinProcV6 op = 0;
-
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i) {
- op = _opcodesGoblinV6[_goblinFuncLookUp[j][1]].proc;
- break;
- }
-
- _vm->_global->_inter_execPtr -= 2;
-
- if (op == 0) {
- warning("unimplemented opcodeGoblin: %d", i);
-
- int16 paramCount = load16();
- _vm->_global->_inter_execPtr += paramCount * 2;
- } else {
- params.extraData = i;
-
- (this->*op) (params);
- }
-}
-
-const char *Inter_v6::getOpcodeGoblinDesc(int i) {
- for (int j = 0; j < ARRAYSIZE(_goblinFuncLookUp); j++)
- if (_goblinFuncLookUp[j][0] == i)
- return _opcodesGoblinV6[_goblinFuncLookUp[j][1]].desc;
- return "";
+void Inter_v6::setupOpcodesGob() {
}
void Inter_v6::o6_totSub() {