aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/script.cpp4
-rw-r--r--scumm/script_v1.cpp857
-rw-r--r--scumm/script_v2.cpp843
-rw-r--r--scumm/scumm.h17
4 files changed, 546 insertions, 1175 deletions
diff --git a/scumm/script.cpp b/scumm/script.cpp
index fef4acf855..ec6ec74202 100644
--- a/scumm/script.cpp
+++ b/scumm/script.cpp
@@ -283,7 +283,7 @@ void Scumm::executeScript()
_opcode = fetchScriptByte();
_scriptPointerStart = _scriptPointer;
vm.slot[_currentScript].didexec = 1;
- debug(8, "Script %d: [%X] %s()", vm.slot[_currentScript].number, _opcode, _opcodes_lookup[_opcode]);
+ debug(8, "Script %d: [%X] %s()", vm.slot[_currentScript].number, _opcode, _opcodes[_opcode].desc);
op = getOpcode(_opcode);
(this->*op) ();
}
@@ -861,7 +861,7 @@ void Scumm::push(int a)
int Scumm::pop()
{
if ((_scummStackPos < 1) || ((unsigned int)_scummStackPos > ARRAYSIZE(_scummStack))) {
- error("No items on stack to pop() for %s (0x%X) at [%d-%d]\n", _opcodes_lookup[_opcode], _opcode, _roomResource, vm.slot[_currentScript].number);
+ error("No items on stack to pop() for %s (0x%X) at [%d-%d]\n", _opcodes[_opcode].desc, _opcode, _roomResource, vm.slot[_currentScript].number);
}
return _scummStack[--_scummStackPos];
diff --git a/scumm/script_v1.cpp b/scumm/script_v1.cpp
index 992891cfba..214d795b8f 100644
--- a/scumm/script_v1.cpp
+++ b/scumm/script_v1.cpp
@@ -25,657 +25,334 @@
#include "actor.h"
#include "scumm/sound.h"
+#define OPCODE(x) { &Scumm::x, #x }
+
void Scumm::setupOpcodes()
{
- static const OpcodeProc opcode_list[] = {
+ static const OpcodeEntry opcodes[256] = {
/* 00 */
- &Scumm::o5_stopObjectCode,
- &Scumm::o5_putActor,
- &Scumm::o5_startMusic,
- &Scumm::o5_getActorRoom,
+ OPCODE(o5_stopObjectCode),
+ OPCODE(o5_putActor),
+ OPCODE(o5_startMusic),
+ OPCODE(o5_getActorRoom),
/* 04 */
- &Scumm::o5_isGreaterEqual,
- &Scumm::o5_drawObject,
- &Scumm::o5_getActorElevation,
- &Scumm::o5_setState,
+ OPCODE(o5_isGreaterEqual),
+ OPCODE(o5_drawObject),
+ OPCODE(o5_getActorElevation),
+ OPCODE(o5_setState),
/* 08 */
- &Scumm::o5_isNotEqual,
- &Scumm::o5_faceActor,
- &Scumm::o5_startScript,
- &Scumm::o5_getVerbEntrypoint,
+ OPCODE(o5_isNotEqual),
+ OPCODE(o5_faceActor),
+ OPCODE(o5_startScript),
+ OPCODE(o5_getVerbEntrypoint),
/* 0C */
- &Scumm::o5_resourceRoutines,
- &Scumm::o5_walkActorToActor,
- &Scumm::o5_putActorAtObject,
- &Scumm::o5_getObjectState,
+ OPCODE(o5_resourceRoutines),
+ OPCODE(o5_walkActorToActor),
+ OPCODE(o5_putActorAtObject),
+ OPCODE(o5_getObjectState),
/* 10 */
- &Scumm::o5_getObjectOwner,
- &Scumm::o5_animateActor,
- &Scumm::o5_panCameraTo,
- &Scumm::o5_actorSet,
+ OPCODE(o5_getObjectOwner),
+ OPCODE(o5_animateActor),
+ OPCODE(o5_panCameraTo),
+ OPCODE(o5_actorSet),
/* 14 */
- &Scumm::o5_print,
- &Scumm::o5_actorFromPos,
- &Scumm::o5_getRandomNr,
- &Scumm::o5_and,
+ OPCODE(o5_print),
+ OPCODE(o5_actorFromPos),
+ OPCODE(o5_getRandomNr),
+ OPCODE(o5_and),
/* 18 */
- &Scumm::o5_jumpRelative,
- &Scumm::o5_doSentence,
- &Scumm::o5_move,
- &Scumm::o5_multiply,
+ OPCODE(o5_jumpRelative),
+ OPCODE(o5_doSentence),
+ OPCODE(o5_move),
+ OPCODE(o5_multiply),
/* 1C */
- &Scumm::o5_startSound,
- &Scumm::o5_ifClassOfIs,
- &Scumm::o5_walkActorTo,
- &Scumm::o5_isActorInBox,
+ OPCODE(o5_startSound),
+ OPCODE(o5_ifClassOfIs),
+ OPCODE(o5_walkActorTo),
+ OPCODE(o5_isActorInBox),
/* 20 */
- &Scumm::o5_stopMusic,
- &Scumm::o5_putActor,
- &Scumm::o5_getAnimCounter,
- &Scumm::o5_getActorY,
+ OPCODE(o5_stopMusic),
+ OPCODE(o5_putActor),
+ OPCODE(o5_getAnimCounter),
+ OPCODE(o5_getActorY),
/* 24 */
- &Scumm::o5_loadRoomWithEgo,
- &Scumm::o5_pickupObject,
- &Scumm::o5_setVarRange,
- &Scumm::o5_stringOps,
+ OPCODE(o5_loadRoomWithEgo),
+ OPCODE(o5_pickupObject),
+ OPCODE(o5_setVarRange),
+ OPCODE(o5_stringOps),
/* 28 */
- &Scumm::o5_equalZero,
- &Scumm::o5_setOwnerOf,
- &Scumm::o5_startScript,
- &Scumm::o5_delayVariable,
+ OPCODE(o5_equalZero),
+ OPCODE(o5_setOwnerOf),
+ OPCODE(o5_startScript),
+ OPCODE(o5_delayVariable),
/* 2C */
- &Scumm::o5_cursorCommand,
- &Scumm::o5_putActorInRoom,
- &Scumm::o5_delay,
- &Scumm::o5_ifState,
+ OPCODE(o5_cursorCommand),
+ OPCODE(o5_putActorInRoom),
+ OPCODE(o5_delay),
+ OPCODE(o5_ifNotState),
/* 30 */
- &Scumm::o5_matrixOps,
- &Scumm::o5_getInventoryCount,
- &Scumm::o5_setCameraAt,
- &Scumm::o5_roomOps,
+ OPCODE(o5_matrixOps),
+ OPCODE(o5_getInventoryCount),
+ OPCODE(o5_setCameraAt),
+ OPCODE(o5_roomOps),
/* 34 */
- &Scumm::o5_getDist,
- &Scumm::o5_findObject,
- &Scumm::o5_walkActorToObject,
- &Scumm::o5_startObject,
+ OPCODE(o5_getDist),
+ OPCODE(o5_findObject),
+ OPCODE(o5_walkActorToObject),
+ OPCODE(o5_startObject),
/* 38 */
- &Scumm::o5_lessOrEqual,
- &Scumm::o5_doSentence,
- &Scumm::o5_subtract,
- &Scumm::o5_getActorScale,
+ OPCODE(o5_lessOrEqual),
+ OPCODE(o5_doSentence),
+ OPCODE(o5_subtract),
+ OPCODE(o5_getActorScale),
/* 3C */
- &Scumm::o5_stopSound,
- &Scumm::o5_findInventory,
- &Scumm::o5_walkActorTo,
- &Scumm::o5_drawBox,
+ OPCODE(o5_stopSound),
+ OPCODE(o5_findInventory),
+ OPCODE(o5_walkActorTo),
+ OPCODE(o5_drawBox),
/* 40 */
- &Scumm::o5_cutscene,
- &Scumm::o5_putActor,
- &Scumm::o5_chainScript,
- &Scumm::o5_getActorX,
+ OPCODE(o5_cutscene),
+ OPCODE(o5_putActor),
+ OPCODE(o5_chainScript),
+ OPCODE(o5_getActorX),
/* 44 */
- &Scumm::o5_isLess,
- &Scumm::o5_drawObject,
- &Scumm::o5_increment,
- &Scumm::o5_setState,
+ OPCODE(o5_isLess),
+ OPCODE(o5_drawObject),
+ OPCODE(o5_increment),
+ OPCODE(o5_setState),
/* 48 */
- &Scumm::o5_isEqual,
- &Scumm::o5_faceActor,
- &Scumm::o5_startScript,
- &Scumm::o5_getVerbEntrypoint,
+ OPCODE(o5_isEqual),
+ OPCODE(o5_faceActor),
+ OPCODE(o5_startScript),
+ OPCODE(o5_getVerbEntrypoint),
/* 4C */
- &Scumm::o5_soundKludge,
- &Scumm::o5_walkActorToActor,
- &Scumm::o5_putActorAtObject,
- &Scumm::o5_ifState,
+ OPCODE(o5_soundKludge),
+ OPCODE(o5_walkActorToActor),
+ OPCODE(o5_putActorAtObject),
+ OPCODE(o5_ifState),
/* 50 */
- &Scumm::o5_pickupObjectOld,
- &Scumm::o5_animateActor,
- &Scumm::o5_actorFollowCamera,
- &Scumm::o5_actorSet,
+ OPCODE(o5_pickupObjectOld),
+ OPCODE(o5_animateActor),
+ OPCODE(o5_actorFollowCamera),
+ OPCODE(o5_actorSet),
/* 54 */
- &Scumm::o5_setObjectName,
- &Scumm::o5_actorFromPos,
- &Scumm::o5_getActorMoving,
- &Scumm::o5_or,
+ OPCODE(o5_setObjectName),
+ OPCODE(o5_actorFromPos),
+ OPCODE(o5_getActorMoving),
+ OPCODE(o5_or),
/* 58 */
- &Scumm::o5_overRide,
- &Scumm::o5_doSentence,
- &Scumm::o5_add,
- &Scumm::o5_divide,
+ OPCODE(o5_overRide),
+ OPCODE(o5_doSentence),
+ OPCODE(o5_add),
+ OPCODE(o5_divide),
/* 5C */
- &Scumm::o5_oldRoomEffect,
- &Scumm::o5_setClass,
- &Scumm::o5_walkActorTo,
- &Scumm::o5_isActorInBox,
+ OPCODE(o5_oldRoomEffect),
+ OPCODE(o5_setClass),
+ OPCODE(o5_walkActorTo),
+ OPCODE(o5_isActorInBox),
/* 60 */
- &Scumm::o5_freezeScripts,
- &Scumm::o5_putActor,
- &Scumm::o5_stopScript,
- &Scumm::o5_getActorFacing,
+ OPCODE(o5_freezeScripts),
+ OPCODE(o5_putActor),
+ OPCODE(o5_stopScript),
+ OPCODE(o5_getActorFacing),
/* 64 */
- &Scumm::o5_loadRoomWithEgo,
- &Scumm::o5_pickupObject,
- &Scumm::o5_getClosestObjActor,
- &Scumm::o5_dummy,
+ OPCODE(o5_loadRoomWithEgo),
+ OPCODE(o5_pickupObject),
+ OPCODE(o5_getClosestObjActor),
+ OPCODE(o5_dummy),
/* 68 */
- &Scumm::o5_getScriptRunning,
- &Scumm::o5_setOwnerOf,
- &Scumm::o5_startScript,
- &Scumm::o5_debug,
+ OPCODE(o5_getScriptRunning),
+ OPCODE(o5_setOwnerOf),
+ OPCODE(o5_startScript),
+ OPCODE(o5_debug),
/* 6C */
- &Scumm::o5_getActorWidth,
- &Scumm::o5_putActorInRoom,
- &Scumm::o5_stopObjectScript,
- &Scumm::o5_ifState,
+ OPCODE(o5_getActorWidth),
+ OPCODE(o5_putActorInRoom),
+ OPCODE(o5_stopObjectScript),
+ OPCODE(o5_ifNotState),
/* 70 */
- &Scumm::o5_lights,
- &Scumm::o5_getActorCostume,
- &Scumm::o5_loadRoom,
- &Scumm::o5_roomOps,
+ OPCODE(o5_lights),
+ OPCODE(o5_getActorCostume),
+ OPCODE(o5_loadRoom),
+ OPCODE(o5_roomOps),
/* 74 */
- &Scumm::o5_getDist,
- &Scumm::o5_findObject,
- &Scumm::o5_walkActorToObject,
- &Scumm::o5_startObject,
+ OPCODE(o5_getDist),
+ OPCODE(o5_findObject),
+ OPCODE(o5_walkActorToObject),
+ OPCODE(o5_startObject),
/* 78 */
- &Scumm::o5_isGreater, /* less? */
- &Scumm::o5_doSentence,
- &Scumm::o5_verbOps,
- &Scumm::o5_getActorWalkBox,
+ OPCODE(o5_isGreater), /* less? */
+ OPCODE(o5_doSentence),
+ OPCODE(o5_verbOps),
+ OPCODE(o5_getActorWalkBox),
/* 7C */
- &Scumm::o5_isSoundRunning,
- &Scumm::o5_findInventory,
- &Scumm::o5_walkActorTo,
- &Scumm::o5_drawBox,
+ OPCODE(o5_isSoundRunning),
+ OPCODE(o5_findInventory),
+ OPCODE(o5_walkActorTo),
+ OPCODE(o5_drawBox),
/* 80 */
- &Scumm::o5_breakHere,
- &Scumm::o5_putActor,
- &Scumm::o5_startMusic,
- &Scumm::o5_getActorRoom,
+ OPCODE(o5_breakHere),
+ OPCODE(o5_putActor),
+ OPCODE(o5_startMusic),
+ OPCODE(o5_getActorRoom),
/* 84 */
- &Scumm::o5_isGreaterEqual, /* less equal? */
- &Scumm::o5_drawObject,
- &Scumm::o5_getActorElevation,
- &Scumm::o5_setState,
+ OPCODE(o5_isGreaterEqual), /* less equal? */
+ OPCODE(o5_drawObject),
+ OPCODE(o5_getActorElevation),
+ OPCODE(o5_setState),
/* 88 */
- &Scumm::o5_isNotEqual,
- &Scumm::o5_faceActor,
- &Scumm::o5_startScript,
- &Scumm::o5_getVerbEntrypoint,
+ OPCODE(o5_isNotEqual),
+ OPCODE(o5_faceActor),
+ OPCODE(o5_startScript),
+ OPCODE(o5_getVerbEntrypoint),
/* 8C */
- &Scumm::o5_resourceRoutines,
- &Scumm::o5_walkActorToActor,
- &Scumm::o5_putActorAtObject,
- &Scumm::o5_getObjectState,
+ OPCODE(o5_resourceRoutines),
+ OPCODE(o5_walkActorToActor),
+ OPCODE(o5_putActorAtObject),
+ OPCODE(o5_getObjectState),
/* 90 */
- &Scumm::o5_getObjectOwner,
- &Scumm::o5_animateActor,
- &Scumm::o5_panCameraTo,
- &Scumm::o5_actorSet,
+ OPCODE(o5_getObjectOwner),
+ OPCODE(o5_animateActor),
+ OPCODE(o5_panCameraTo),
+ OPCODE(o5_actorSet),
/* 94 */
- &Scumm::o5_print,
- &Scumm::o5_actorFromPos,
- &Scumm::o5_getRandomNr,
- &Scumm::o5_and,
+ OPCODE(o5_print),
+ OPCODE(o5_actorFromPos),
+ OPCODE(o5_getRandomNr),
+ OPCODE(o5_and),
/* 98 */
- &Scumm::o5_quitPauseRestart,
- &Scumm::o5_doSentence,
- &Scumm::o5_move,
- &Scumm::o5_multiply,
+ OPCODE(o5_quitPauseRestart),
+ OPCODE(o5_doSentence),
+ OPCODE(o5_move),
+ OPCODE(o5_multiply),
/* 9C */
- &Scumm::o5_startSound,
- &Scumm::o5_ifClassOfIs,
- &Scumm::o5_walkActorTo,
- &Scumm::o5_isActorInBox,
+ OPCODE(o5_startSound),
+ OPCODE(o5_ifClassOfIs),
+ OPCODE(o5_walkActorTo),
+ OPCODE(o5_isActorInBox),
/* A0 */
- &Scumm::o5_stopObjectCode,
- &Scumm::o5_putActor,
- &Scumm::o5_getAnimCounter,
- &Scumm::o5_getActorY,
+ OPCODE(o5_stopObjectCode),
+ OPCODE(o5_putActor),
+ OPCODE(o5_getAnimCounter),
+ OPCODE(o5_getActorY),
/* A4 */
- &Scumm::o5_loadRoomWithEgo,
- &Scumm::o5_pickupObject,
- &Scumm::o5_setVarRange,
- &Scumm::o5_dummy,
+ OPCODE(o5_loadRoomWithEgo),
+ OPCODE(o5_pickupObject),
+ OPCODE(o5_setVarRange),
+ OPCODE(o5_dummy),
/* A8 */
- &Scumm::o5_notEqualZero,
- &Scumm::o5_setOwnerOf,
- &Scumm::o5_startScript,
- &Scumm::o5_saveRestoreVerbs,
+ OPCODE(o5_notEqualZero),
+ OPCODE(o5_setOwnerOf),
+ OPCODE(o5_startScript),
+ OPCODE(o5_saveRestoreVerbs),
/* AC */
- &Scumm::o5_expression,
- &Scumm::o5_putActorInRoom,
- &Scumm::o5_wait,
- &Scumm::o5_ifState,
+ OPCODE(o5_expression),
+ OPCODE(o5_putActorInRoom),
+ OPCODE(o5_wait),
+ OPCODE(o5_ifNotState),
/* B0 */
- &Scumm::o5_matrixOps,
- &Scumm::o5_getInventoryCount,
- &Scumm::o5_setCameraAt,
- &Scumm::o5_roomOps,
+ OPCODE(o5_matrixOps),
+ OPCODE(o5_getInventoryCount),
+ OPCODE(o5_setCameraAt),
+ OPCODE(o5_roomOps),
/* B4 */
- &Scumm::o5_getDist,
- &Scumm::o5_findObject,
- &Scumm::o5_walkActorToObject,
- &Scumm::o5_startObject,
+ OPCODE(o5_getDist),
+ OPCODE(o5_findObject),
+ OPCODE(o5_walkActorToObject),
+ OPCODE(o5_startObject),
/* B8 */
- &Scumm::o5_lessOrEqual,
- &Scumm::o5_doSentence,
- &Scumm::o5_subtract,
- &Scumm::o5_getActorScale,
+ OPCODE(o5_lessOrEqual),
+ OPCODE(o5_doSentence),
+ OPCODE(o5_subtract),
+ OPCODE(o5_getActorScale),
/* BC */
- &Scumm::o5_stopSound,
- &Scumm::o5_findInventory,
- &Scumm::o5_walkActorTo,
- &Scumm::o5_drawBox,
+ OPCODE(o5_stopSound),
+ OPCODE(o5_findInventory),
+ OPCODE(o5_walkActorTo),
+ OPCODE(o5_drawBox),
/* C0 */
- &Scumm::o5_endCutscene,
- &Scumm::o5_putActor,
- &Scumm::o5_chainScript,
- &Scumm::o5_getActorX,
+ OPCODE(o5_endCutscene),
+ OPCODE(o5_putActor),
+ OPCODE(o5_chainScript),
+ OPCODE(o5_getActorX),
/* C4 */
- &Scumm::o5_isLess,
- &Scumm::o5_drawObject,
- &Scumm::o5_decrement,
- &Scumm::o5_setState,
+ OPCODE(o5_isLess),
+ OPCODE(o5_drawObject),
+ OPCODE(o5_decrement),
+ OPCODE(o5_setState),
/* C8 */
- &Scumm::o5_isEqual,
- &Scumm::o5_faceActor,
- &Scumm::o5_startScript,
- &Scumm::o5_getVerbEntrypoint,
+ OPCODE(o5_isEqual),
+ OPCODE(o5_faceActor),
+ OPCODE(o5_startScript),
+ OPCODE(o5_getVerbEntrypoint),
/* CC */
- &Scumm::o5_pseudoRoom,
- &Scumm::o5_walkActorToActor,
- &Scumm::o5_putActorAtObject,
- &Scumm::o5_ifState,
+ OPCODE(o5_pseudoRoom),
+ OPCODE(o5_walkActorToActor),
+ OPCODE(o5_putActorAtObject),
+ OPCODE(o5_ifState),
/* D0 */
- &Scumm::o5_pickupObjectOld,
- &Scumm::o5_animateActor,
- &Scumm::o5_actorFollowCamera,
- &Scumm::o5_actorSet,
+ OPCODE(o5_pickupObjectOld),
+ OPCODE(o5_animateActor),
+ OPCODE(o5_actorFollowCamera),
+ OPCODE(o5_actorSet),
/* D4 */
- &Scumm::o5_setObjectName,
- &Scumm::o5_actorFromPos,
- &Scumm::o5_getActorMoving,
- &Scumm::o5_or,
+ OPCODE(o5_setObjectName),
+ OPCODE(o5_actorFromPos),
+ OPCODE(o5_getActorMoving),
+ OPCODE(o5_or),
/* D8 */
- &Scumm::o5_printEgo,
- &Scumm::o5_doSentence,
- &Scumm::o5_add,
- &Scumm::o5_divide,
+ OPCODE(o5_printEgo),
+ OPCODE(o5_doSentence),
+ OPCODE(o5_add),
+ OPCODE(o5_divide),
/* DC */
- &Scumm::o5_oldRoomEffect,
- &Scumm::o5_setClass,
- &Scumm::o5_walkActorTo,
- &Scumm::o5_isActorInBox,
+ OPCODE(o5_oldRoomEffect),
+ OPCODE(o5_setClass),
+ OPCODE(o5_walkActorTo),
+ OPCODE(o5_isActorInBox),
/* E0 */
- &Scumm::o5_freezeScripts,
- &Scumm::o5_putActor,
- &Scumm::o5_stopScript,
- &Scumm::o5_getActorFacing,
+ OPCODE(o5_freezeScripts),
+ OPCODE(o5_putActor),
+ OPCODE(o5_stopScript),
+ OPCODE(o5_getActorFacing),
/* E4 */
- &Scumm::o5_loadRoomWithEgo,
- &Scumm::o5_pickupObject,
- &Scumm::o5_getClosestObjActor,
- &Scumm::o5_dummy,
+ OPCODE(o5_loadRoomWithEgo),
+ OPCODE(o5_pickupObject),
+ OPCODE(o5_getClosestObjActor),
+ OPCODE(o5_dummy),
/* E8 */
- &Scumm::o5_getScriptRunning,
- &Scumm::o5_setOwnerOf,
- &Scumm::o5_startScript,
- &Scumm::o5_debug,
+ OPCODE(o5_getScriptRunning),
+ OPCODE(o5_setOwnerOf),
+ OPCODE(o5_startScript),
+ OPCODE(o5_debug),
/* EC */
- &Scumm::o5_getActorWidth,
- &Scumm::o5_putActorInRoom,
- &Scumm::o5_stopObjectScript,
- &Scumm::o5_ifState,
+ OPCODE(o5_getActorWidth),
+ OPCODE(o5_putActorInRoom),
+ OPCODE(o5_stopObjectScript),
+ OPCODE(o5_ifNotState),
/* F0 */
- &Scumm::o5_lights,
- &Scumm::o5_getActorCostume,
- &Scumm::o5_loadRoom,
- &Scumm::o5_roomOps,
+ OPCODE(o5_lights),
+ OPCODE(o5_getActorCostume),
+ OPCODE(o5_loadRoom),
+ OPCODE(o5_roomOps),
/* F4 */
- &Scumm::o5_getDist,
- &Scumm::o5_findObject,
- &Scumm::o5_walkActorToObject,
- &Scumm::o5_startObject,
+ OPCODE(o5_getDist),
+ OPCODE(o5_findObject),
+ OPCODE(o5_walkActorToObject),
+ OPCODE(o5_startObject),
/* F8 */
- &Scumm::o5_isGreater,
- &Scumm::o5_doSentence,
- &Scumm::o5_verbOps,
- &Scumm::o5_getActorWalkBox,
+ OPCODE(o5_isGreater),
+ OPCODE(o5_doSentence),
+ OPCODE(o5_verbOps),
+ OPCODE(o5_getActorWalkBox),
/* FC */
- &Scumm::o5_isSoundRunning,
- &Scumm::o5_findInventory,
- &Scumm::o5_walkActorTo,
- &Scumm::o5_drawBox
+ OPCODE(o5_isSoundRunning),
+ OPCODE(o5_findInventory),
+ OPCODE(o5_walkActorTo),
+ OPCODE(o5_drawBox)
};
- static const char *opcode_lookup[] = {
- /* 00 */
- "o5_stopObjectCode",
- "o5_putActor",
- "o5_startMusic",
- "o5_getActorRoom",
- /* 04 */
- "o5_isGreaterEqual",
- "o5_drawObject",
- "o5_getActorElevation",
- "o5_setState",
- /* 08 */
- "o5_isNotEqual",
- "o5_faceActor",
- "o5_startScript",
- "o5_getVerbEntrypoint",
- /* 0C */
- "o5_resourceRoutines",
- "o5_walkActorToActor",
- "o5_putActorAtObject",
- "o5_getObjectState",
- /* 10 */
- "o5_getObjectOwner",
- "o5_animateActor",
- "o5_panCameraTo",
- "o5_actorSet",
- /* 14 */
- "o5_print",
- "o5_actorFromPos",
- "o5_getRandomNr",
- "o5_and",
- /* 18 */
- "o5_jumpRelative",
- "o5_doSentence",
- "o5_move",
- "o5_multiply",
- /* 1C */
- "o5_startSound",
- "o5_ifClassOfIs",
- "o5_walkActorTo",
- "o5_isActorInBox",
- /* 20 */
- "o5_stopMusic",
- "o5_putActor",
- "o5_getAnimCounter",
- "o5_getActorY",
- /* 24 */
- "o5_loadRoomWithEgo",
- "o5_pickupObject",
- "o5_setVarRange",
- "o5_stringOps",
- /* 28 */
- "o5_equalZero",
- "o5_setOwnerOf",
- "o5_startScript",
- "o5_delayVariable",
- /* 2C */
- "o5_cursorCommand",
- "o5_putActorInRoom",
- "o5_delay",
- "o5_ifNotState",
- /* 30 */
- "o5_matrixOps",
- "o5_getInventoryCount",
- "o5_setCameraAt",
- "o5_roomOps",
- /* 34 */
- "o5_getDist",
- "o5_findObject",
- "o5_walkActorToObject",
- "o5_startObject",
- /* 38 */
- "o5_lessOrEqual",
- "o5_doSentence",
- "o5_subtract",
- "o5_getActorScale",
- /* 3C */
- "o5_stopSound",
- "o5_findInventory",
- "o5_walkActorTo",
- "o5_drawBox",
- /* 40 */
- "o5_cutscene",
- "o5_putActor",
- "o5_chainScript",
- "o5_getActorX",
- /* 44 */
- "o5_isLess",
- "o5_drawObject",
- "o5_increment",
- "o5_setState",
- /* 48 */
- "o5_isEqual",
- "o5_faceActor",
- "o5_startScript",
- "o5_getVerbEntrypoint",
- /* 4C */
- "o5_soundKludge",
- "o5_walkActorToActor",
- "o5_putActorAtObject",
- "o5_ifState",
- /* 50 */
- "o5_pickupObjectOld",
- "o5_animateActor",
- "o5_actorFollowCamera",
- "o5_actorSet",
- /* 54 */
- "o5_setObjectName",
- "o5_actorFromPos",
- "o5_getActorMoving",
- "o5_or",
- /* 58 */
- "o5_overRide",
- "o5_doSentence",
- "o5_add",
- "o5_divide",
- /* 5C */
- "o5_oldRoomEffect",
- "o5_setClass",
- "o5_walkActorTo",
- "o5_isActorInBox",
- /* 60 */
- "o5_freezeScripts",
- "o5_putActor",
- "o5_stopScript",
- "o5_getActorFacing",
- /* 64 */
- "o5_loadRoomWithEgo",
- "o5_pickupObject",
- "o5_getClosestObjActor",
- "o5_dummy",
- /* 68 */
- "o5_getScriptRunning",
- "o5_setOwnerOf",
- "o5_startScript",
- "o5_debug",
- /* 6C */
- "o5_getActorWidth",
- "o5_putActorInRoom",
- "o5_stopObjectScript",
- "o5_ifNotState",
- /* 70 */
- "o5_lights",
- "o5_getActorCostume",
- "o5_loadRoom",
- "o5_roomOps",
- /* 74 */
- "o5_getDist",
- "o5_findObject",
- "o5_walkActorToObject",
- "o5_startObject",
- /* 78 */
- "o5_isGreater", /* less? */
- "o5_doSentence",
- "o5_verbOps",
- "o5_getActorWalkBox",
- /* 7C */
- "o5_isSoundRunning",
- "o5_findInventory",
- "o5_walkActorTo",
- "o5_drawBox",
- /* 80 */
- "o5_breakHere",
- "o5_putActor",
- "o5_startMusic",
- "o5_getActorRoom",
- /* 84 */
- "o5_isGreaterEqual", /* less equal? */
- "o5_drawObject",
- "o5_getActorElevation",
- "o5_setState",
- /* 88 */
- "o5_isNotEqual",
- "o5_faceActor",
- "o5_startScript",
- "o5_getVerbEntrypoint",
- /* 8C */
- "o5_resourceRoutines",
- "o5_walkActorToActor",
- "o5_putActorAtObject",
- "o5_getObjectState",
- /* 90 */
- "o5_getObjectOwner",
- "o5_animateActor",
- "o5_panCameraTo",
- "o5_actorSet",
- /* 94 */
- "o5_print",
- "o5_actorFromPos",
- "o5_getRandomNr",
- "o5_and",
- /* 98 */
- "o5_quitPauseRestart",
- "o5_doSentence",
- "o5_move",
- "o5_multiply",
- /* 9C */
- "o5_startSound",
- "o5_ifClassOfIs",
- "o5_walkActorTo",
- "o5_isActorInBox",
- /* A0 */
- "o5_stopObjectCode",
- "o5_putActor",
- "o5_getAnimCounter",
- "o5_getActorY",
- /* A4 */
- "o5_loadRoomWithEgo",
- "o5_pickupObject",
- "o5_setVarRange",
- "o5_dummy",
- /* A8 */
- "o5_notEqualZero",
- "o5_setOwnerOf",
- "o5_startScript",
- "o5_saveRestoreVerbs",
- /* AC */
- "o5_expression",
- "o5_putActorInRoom",
- "o5_wait",
- "o5_ifNotState",
- /* B0 */
- "o5_matrixOps",
- "o5_getInventoryCount",
- "o5_setCameraAt",
- "o5_roomOps",
- /* B4 */
- "o5_getDist",
- "o5_findObject",
- "o5_walkActorToObject",
- "o5_startObject",
- /* B8 */
- "o5_lessOrEqual",
- "o5_doSentence",
- "o5_subtract",
- "o5_getActorScale",
- /* BC */
- "o5_stopSound",
- "o5_findInventory",
- "o5_walkActorTo",
- "o5_drawBox",
- /* C0 */
- "o5_endCutscene",
- "o5_putActor",
- "o5_chainScript",
- "o5_getActorX",
- /* C4 */
- "o5_isLess",
- "o5_drawObject",
- "o5_decrement",
- "o5_setState",
- /* C8 */
- "o5_isEqual",
- "o5_faceActor",
- "o5_startScript",
- "o5_getVerbEntrypoint",
- /* CC */
- "o5_pseudoRoom",
- "o5_walkActorToActor",
- "o5_putActorAtObject",
- "o5_ifState",
- /* D0 */
- "o5_pickupObjectOld",
- "o5_animateActor",
- "o5_actorFollowCamera",
- "o5_actorSet",
- /* D4 */
- "o5_setObjectName",
- "o5_actorFromPos",
- "o5_getActorMoving",
- "o5_or",
- /* D8 */
- "o5_printEgo",
- "o5_doSentence",
- "o5_add",
- "o5_divide",
- /* DC */
- "o5_oldRoomEffect",
- "o5_setClass",
- "o5_walkActorTo",
- "o5_isActorInBox",
- /* E0 */
- "o5_freezeScripts",
- "o5_putActor",
- "o5_stopScript",
- "o5_getActorFacing",
- /* E4 */
- "o5_loadRoomWithEgo",
- "o5_pickupObject",
- "o5_getClosestObjActor",
- "o5_dummy",
- /* E8 */
- "o5_getScriptRunning",
- "o5_setOwnerOf",
- "o5_startScript",
- "o5_debug",
- /* EC */
- "o5_getActorWidth",
- "o5_putActorInRoom",
- "o5_stopObjectScript",
- "o5_ifNotState",
- /* F0 */
- "o5_lights",
- "o5_getActorCostume",
- "o5_loadRoom",
- "o5_roomOps",
- /* F4 */
- "o5_getDist",
- "o5_findObject",
- "o5_walkActorToObject",
- "o5_startObject",
- /* F8 */
- "o5_isGreater",
- "o5_doSentence",
- "o5_verbOps",
- "o5_getActorWalkBox",
- /* FC */
- "o5_isSoundRunning",
- "o5_findInventory",
- "o5_walkActorTo",
- "o5_drawBox",
- };
-
-
- _opcodes = opcode_list;
- _opcodes_lookup = opcode_lookup;
+ _opcodes = opcodes;
}
void Scumm::o5_actorFollowCamera()
@@ -1383,9 +1060,19 @@ void Scumm::o5_ifState()
{
int a = getVarOrDirectWord(0x80);
int b = getVarOrDirectByte(0x40);
- bool isNegated = (_opcode & 0x20) ? true : false;
- if ((getState(a) != b) ^ isNegated)
+ if (getState(a) != b)
+ o5_jumpRelative();
+ else
+ ignoreScriptWord();
+}
+
+void Scumm::o5_ifNotState()
+{
+ int a = getVarOrDirectWord(0x80);
+ int b = getVarOrDirectByte(0x40);
+
+ if (getState(a) == b)
o5_jumpRelative();
else
ignoreScriptWord();
diff --git a/scumm/script_v2.cpp b/scumm/script_v2.cpp
index 0a02f51a02..cffb9aade6 100644
--- a/scumm/script_v2.cpp
+++ b/scumm/script_v2.cpp
@@ -33,656 +33,335 @@
#include "dialogs.h" // FIXME: This is just for the FT-INSANE warning.
// Remove when INSANE is implemented
+
+#define OPCODE(x) { &Scumm::x, #x }
+
void Scumm::setupOpcodes2()
{
- static const OpcodeProc opcode_list[256] = {
- /* 00 */
- &Scumm::o6_pushByte,
- &Scumm::o6_pushWord,
- &Scumm::o6_pushByteVar,
- &Scumm::o6_pushWordVar,
- /* 04 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_byteArrayRead,
- &Scumm::o6_wordArrayRead,
- /* 08 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_byteArrayIndexedRead,
- &Scumm::o6_wordArrayIndexedRead,
- /* 0C */
- &Scumm::o6_dup,
- &Scumm::o6_zero,
- &Scumm::o6_eq,
- &Scumm::o6_neq,
- /* 10 */
- &Scumm::o6_gt,
- &Scumm::o6_lt,
- &Scumm::o6_le,
- &Scumm::o6_ge,
- /* 14 */
- &Scumm::o6_add,
- &Scumm::o6_sub,
- &Scumm::o6_mul,
- &Scumm::o6_div,
- /* 18 */
- &Scumm::o6_land,
- &Scumm::o6_lor,
- &Scumm::o6_kill,
- &Scumm::o6_invalid,
- /* 1C */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* 20 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* 24 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* 28 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* 2C */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* 30 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* 34 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* 38 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* 3C */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* 40 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_writeByteVar,
- &Scumm::o6_writeWordVar,
- /* 44 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_byteArrayWrite,
- &Scumm::o6_wordArrayWrite,
- /* 48 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_byteArrayIndexedWrite,
- &Scumm::o6_wordArrayIndexedWrite,
- /* 4C */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_byteVarInc,
- &Scumm::o6_wordVarInc,
- /* 50 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_byteArrayInc,
- &Scumm::o6_wordArrayInc,
- /* 54 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_byteVarDec,
- &Scumm::o6_wordVarDec,
- /* 58 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_byteArrayDec,
- &Scumm::o6_wordArrayDec,
- /* 5C */
- &Scumm::o6_jumpTrue,
- &Scumm::o6_jumpFalse,
- &Scumm::o6_startScriptEx,
- &Scumm::o6_startScript,
- /* 60 */
- &Scumm::o6_startObject,
- &Scumm::o6_setObjectState,
- &Scumm::o6_setObjectXY,
- &Scumm::o6_drawBlastObject,
- /* 64 */
- &Scumm::o6_setBlastObjectWindow,
- &Scumm::o6_stopObjectCode,
- &Scumm::o6_stopObjectCode,
- &Scumm::o6_endCutscene,
- /* 68 */
- &Scumm::o6_cutScene,
- &Scumm::o6_stopMusic,
- &Scumm::o6_freezeUnfreeze,
- &Scumm::o6_cursorCommand,
- /* 6C */
- &Scumm::o6_breakHere,
- &Scumm::o6_ifClassOfIs,
- &Scumm::o6_setClass,
- &Scumm::o6_getState,
- /* 70 */
- &Scumm::o6_setState,
- &Scumm::o6_setOwner,
- &Scumm::o6_getOwner,
- &Scumm::o6_jump,
- /* 74 */
- &Scumm::o6_startSound,
- &Scumm::o6_stopSound,
- &Scumm::o6_startMusic,
- &Scumm::o6_stopObjectScript,
- /* 78 */
- &Scumm::o6_panCameraTo,
- &Scumm::o6_actorFollowCamera,
- &Scumm::o6_setCameraAt,
- &Scumm::o6_loadRoom,
- /* 7C */
- &Scumm::o6_stopScript,
- &Scumm::o6_walkActorToObj,
- &Scumm::o6_walkActorTo,
- &Scumm::o6_putActorInRoom,
- /* 80 */
- &Scumm::o6_putActorAtObject,
- &Scumm::o6_faceActor,
- &Scumm::o6_animateActor,
- &Scumm::o6_doSentence,
- /* 84 */
- &Scumm::o6_pickupObject,
- &Scumm::o6_loadRoomWithEgo,
- &Scumm::o6_invalid,
- &Scumm::o6_getRandomNumber,
- /* 88 */
- &Scumm::o6_getRandomNumberRange,
- &Scumm::o6_invalid,
- &Scumm::o6_getActorMoving,
- &Scumm::o6_getScriptRunning,
- /* 8C */
- &Scumm::o6_getActorRoom,
- &Scumm::o6_getObjectX,
- &Scumm::o6_getObjectY,
- &Scumm::o6_getObjectOldDir,
- /* 90 */
- &Scumm::o6_getActorWalkBox,
- &Scumm::o6_getActorCostume,
- &Scumm::o6_findInventory,
- &Scumm::o6_getInventoryCount,
- /* 94 */
- &Scumm::o6_getVerbFromXY,
- &Scumm::o6_beginOverride,
- &Scumm::o6_endOverride,
- &Scumm::o6_setObjectName,
- /* 98 */
- &Scumm::o6_isSoundRunning,
- &Scumm::o6_setBoxFlags,
- &Scumm::o6_createBoxMatrix,
- &Scumm::o6_resourceRoutines,
- /* 9C */
- &Scumm::o6_roomOps,
- &Scumm::o6_actorSet,
- &Scumm::o6_verbOps,
- &Scumm::o6_getActorFromXY,
- /* A0 */
- &Scumm::o6_findObject,
- &Scumm::o6_pseudoRoom,
- &Scumm::o6_getActorElevation,
- &Scumm::o6_getVerbEntrypoint,
- /* A4 */
- &Scumm::o6_arrayOps,
- &Scumm::o6_saveRestoreVerbs,
- &Scumm::o6_drawBox,
- &Scumm::o6_invalid,
- /* A8 */
- &Scumm::o6_getActorWidth,
- &Scumm::o6_wait,
- &Scumm::o6_getActorScaleX,
- &Scumm::o6_getActorAnimCounter1,
- /* AC */
- &Scumm::o6_soundKludge,
- &Scumm::o6_isAnyOf,
- &Scumm::o6_quitPauseRestart,
- &Scumm::o6_isActorInBox,
- /* B0 */
- &Scumm::o6_delay,
- &Scumm::o6_delayLonger,
- &Scumm::o6_delayVeryLong,
- &Scumm::o6_stopSentence,
- /* B4 */
- &Scumm::o6_print_0,
- &Scumm::o6_print_1,
- &Scumm::o6_print_2,
- &Scumm::o6_print_3,
- /* B8 */
- &Scumm::o6_printActor,
- &Scumm::o6_printEgo,
- &Scumm::o6_talkActor,
- &Scumm::o6_talkEgo,
- /* BC */
- &Scumm::o6_dim,
- &Scumm::o5_dummy,
- &Scumm::o6_runVerbCodeQuick,
- &Scumm::o6_runScriptQuick,
- /* C0 */
- &Scumm::o6_dim2,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* C4 */
- &Scumm::o6_abs,
- &Scumm::o6_distObjectObject,
- &Scumm::o6_distObjectPt,
- &Scumm::o6_distPtPt,
- /* C8 */
- &Scumm::o6_kernelFunction,
- &Scumm::o6_miscOps,
- &Scumm::o6_delayFrames,
- &Scumm::o6_pickOneOf,
- /* CC */
- &Scumm::o6_pickOneOfDefault,
- &Scumm::o6_unknownCD,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* D0 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_getAnimateVariable,
- &Scumm::o6_invalid,
- /* D4 */
- &Scumm::o6_invalid,
- &Scumm::o6_jumpToScript,
- &Scumm::o6_band,
- &Scumm::o6_bor,
- /* D8 */
- &Scumm::o6_isRoomScriptRunning,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* DC */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* E0 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* E4 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* E8 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* EC */
- &Scumm::o6_getActorPriority,
- &Scumm::o6_getObjectNewDir,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* F0 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* F4 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* F8 */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- /* FC */
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- &Scumm::o6_invalid,
- };
-
- static const char *opcode_lookup[] = {
+ static const OpcodeEntry opcodes[256] = {
/* 00 */
- "o6_pushByte",
- "o6_pushWord",
- "o6_pushByteVar",
- "o6_pushWordVar",
+ OPCODE(o6_pushByte),
+ OPCODE(o6_pushWord),
+ OPCODE(o6_pushByteVar),
+ OPCODE(o6_pushWordVar),
/* 04 */
- "o6_invalid",
- "o6_invalid",
- "o6_byteArrayRead",
- "o6_wordArrayRead",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayRead),
+ OPCODE(o6_wordArrayRead),
/* 08 */
- "o6_invalid",
- "o6_invalid",
- "o6_byteArrayIndexedRead",
- "o6_wordArrayIndexedRead",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayIndexedRead),
+ OPCODE(o6_wordArrayIndexedRead),
/* 0C */
- "o6_dup",
- "o6_zero",
- "o6_eq",
- "o6_neq",
+ OPCODE(o6_dup),
+ OPCODE(o6_zero),
+ OPCODE(o6_eq),
+ OPCODE(o6_neq),
/* 10 */
- "o6_gt",
- "o6_lt",
- "o6_le",
- "o6_ge",
+ OPCODE(o6_gt),
+ OPCODE(o6_lt),
+ OPCODE(o6_le),
+ OPCODE(o6_ge),
/* 14 */
- "o6_add",
- "o6_sub",
- "o6_mul",
- "o6_div",
+ OPCODE(o6_add),
+ OPCODE(o6_sub),
+ OPCODE(o6_mul),
+ OPCODE(o6_div),
/* 18 */
- "o6_land",
- "o6_lor",
- "o6_kill",
- "o6_invalid",
+ OPCODE(o6_land),
+ OPCODE(o6_lor),
+ OPCODE(o6_kill),
+ OPCODE(o6_invalid),
/* 1C */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* 20 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* 24 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* 28 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* 2C */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* 30 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* 34 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* 38 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* 3C */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* 40 */
- "o6_invalid",
- "o6_invalid",
- "o6_writeByteVar",
- "o6_writeWordVar",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_writeByteVar),
+ OPCODE(o6_writeWordVar),
/* 44 */
- "o6_invalid",
- "o6_invalid",
- "o6_byteArrayWrite",
- "o6_wordArrayWrite",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayWrite),
+ OPCODE(o6_wordArrayWrite),
/* 48 */
- "o6_invalid",
- "o6_invalid",
- "o6_byteArrayIndexedWrite",
- "o6_wordArrayIndexedWrite",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayIndexedWrite),
+ OPCODE(o6_wordArrayIndexedWrite),
/* 4C */
- "o6_invalid",
- "o6_invalid",
- "o6_byteVarInc",
- "o6_wordVarInc",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteVarInc),
+ OPCODE(o6_wordVarInc),
/* 50 */
- "o6_invalid",
- "o6_invalid",
- "o6_byteArrayInc",
- "o6_wordArrayInc",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayInc),
+ OPCODE(o6_wordArrayInc),
/* 54 */
- "o6_invalid",
- "o6_invalid",
- "o6_byteVarDec",
- "o6_wordVarDec",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteVarDec),
+ OPCODE(o6_wordVarDec),
/* 58 */
- "o6_invalid",
- "o6_invalid",
- "o6_byteArrayDec",
- "o6_wordArrayDec",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayDec),
+ OPCODE(o6_wordArrayDec),
/* 5C */
- "o6_jumpTrue",
- "o6_jumpFalse",
- "o6_startScriptEx",
- "o6_startScript",
+ OPCODE(o6_jumpTrue),
+ OPCODE(o6_jumpFalse),
+ OPCODE(o6_startScriptEx),
+ OPCODE(o6_startScript),
/* 60 */
- "o6_startObject",
- "o6_setObjectState",
- "o6_setObjectXY",
- "o6_drawBlastObject",
+ OPCODE(o6_startObject),
+ OPCODE(o6_setObjectState),
+ OPCODE(o6_setObjectXY),
+ OPCODE(o6_drawBlastObject),
/* 64 */
- "o6_invalid",
- "o6_stopObjectCode",
- "o6_stopObjectCode",
- "o6_endCutscene",
+ OPCODE(o6_setBlastObjectWindow),
+ OPCODE(o6_stopObjectCode),
+ OPCODE(o6_stopObjectCode),
+ OPCODE(o6_endCutscene),
/* 68 */
- "o6_cutScene",
- "o6_stopMusic",
- "o6_freezeUnfreeze",
- "o6_cursorCommand",
+ OPCODE(o6_cutScene),
+ OPCODE(o6_stopMusic),
+ OPCODE(o6_freezeUnfreeze),
+ OPCODE(o6_cursorCommand),
/* 6C */
- "o6_breakHere",
- "o6_ifClassOfIs",
- "o6_setClass",
- "o6_getState",
+ OPCODE(o6_breakHere),
+ OPCODE(o6_ifClassOfIs),
+ OPCODE(o6_setClass),
+ OPCODE(o6_getState),
/* 70 */
- "o6_setState",
- "o6_setOwner",
- "o6_getOwner",
- "o6_jump",
+ OPCODE(o6_setState),
+ OPCODE(o6_setOwner),
+ OPCODE(o6_getOwner),
+ OPCODE(o6_jump),
/* 74 */
- "o6_startSound",
- "o6_stopSound",
- "o6_startMusic",
- "o6_stopObjectScript",
+ OPCODE(o6_startSound),
+ OPCODE(o6_stopSound),
+ OPCODE(o6_startMusic),
+ OPCODE(o6_stopObjectScript),
/* 78 */
- "o6_panCameraTo",
- "o6_actorFollowCamera",
- "o6_setCameraAt",
- "o6_loadRoom",
+ OPCODE(o6_panCameraTo),
+ OPCODE(o6_actorFollowCamera),
+ OPCODE(o6_setCameraAt),
+ OPCODE(o6_loadRoom),
/* 7C */
- "o6_stopScript",
- "o6_walkActorToObj",
- "o6_walkActorTo",
- "o6_putActorInRoom",
+ OPCODE(o6_stopScript),
+ OPCODE(o6_walkActorToObj),
+ OPCODE(o6_walkActorTo),
+ OPCODE(o6_putActorInRoom),
/* 80 */
- "o6_putActorAtObject",
- "o6_faceActor",
- "o6_animateActor",
- "o6_doSentence",
+ OPCODE(o6_putActorAtObject),
+ OPCODE(o6_faceActor),
+ OPCODE(o6_animateActor),
+ OPCODE(o6_doSentence),
/* 84 */
- "o6_pickupObject",
- "o6_loadRoomWithEgo",
- "o6_invalid",
- "o6_getRandomNumber",
+ OPCODE(o6_pickupObject),
+ OPCODE(o6_loadRoomWithEgo),
+ OPCODE(o6_invalid),
+ OPCODE(o6_getRandomNumber),
/* 88 */
- "o6_getRandomNumberRange",
- "o6_invalid",
- "o6_getActorMoving",
- "o6_getScriptRunning",
+ OPCODE(o6_getRandomNumberRange),
+ OPCODE(o6_invalid),
+ OPCODE(o6_getActorMoving),
+ OPCODE(o6_getScriptRunning),
/* 8C */
- "o6_getActorRoom",
- "o6_getObjectX",
- "o6_getObjectY",
- "o6_getObjectOldDir",
+ OPCODE(o6_getActorRoom),
+ OPCODE(o6_getObjectX),
+ OPCODE(o6_getObjectY),
+ OPCODE(o6_getObjectOldDir),
/* 90 */
- "o6_getActorWalkBox",
- "o6_getActorCostume",
- "o6_findInventory",
- "o6_getInventoryCount",
+ OPCODE(o6_getActorWalkBox),
+ OPCODE(o6_getActorCostume),
+ OPCODE(o6_findInventory),
+ OPCODE(o6_getInventoryCount),
/* 94 */
- "o6_getVerbFromXY",
- "o6_beginOverride",
- "o6_endOverride",
- "o6_setObjectName",
+ OPCODE(o6_getVerbFromXY),
+ OPCODE(o6_beginOverride),
+ OPCODE(o6_endOverride),
+ OPCODE(o6_setObjectName),
/* 98 */
- "o6_isSoundRunning",
- "o6_setBoxFlags",
- "o6_createBoxMatrix",
- "o6_resourceRoutines",
+ OPCODE(o6_isSoundRunning),
+ OPCODE(o6_setBoxFlags),
+ OPCODE(o6_createBoxMatrix),
+ OPCODE(o6_resourceRoutines),
/* 9C */
- "o6_roomOps",
- "o6_actorSet",
- "o6_verbOps",
- "o6_getActorFromXY",
+ OPCODE(o6_roomOps),
+ OPCODE(o6_actorSet),
+ OPCODE(o6_verbOps),
+ OPCODE(o6_getActorFromXY),
/* A0 */
- "o6_findObject",
- "o6_pseudoRoom",
- "o6_getActorElevation",
- "o6_getVerbEntrypoint",
+ OPCODE(o6_findObject),
+ OPCODE(o6_pseudoRoom),
+ OPCODE(o6_getActorElevation),
+ OPCODE(o6_getVerbEntrypoint),
/* A4 */
- "o6_arrayOps",
- "o6_saveRestoreVerbs",
- "o6_drawBox",
- "o6_invalid",
+ OPCODE(o6_arrayOps),
+ OPCODE(o6_saveRestoreVerbs),
+ OPCODE(o6_drawBox),
+ OPCODE(o6_invalid),
/* A8 */
- "o6_getActorWidth",
- "o6_wait",
- "o6_getActorScaleX",
- "o6_getActorAnimCounter1",
+ OPCODE(o6_getActorWidth),
+ OPCODE(o6_wait),
+ OPCODE(o6_getActorScaleX),
+ OPCODE(o6_getActorAnimCounter1),
/* AC */
- "o6_soundKludge",
- "o6_isAnyOf",
- "o6_quitPauseRestart",
- "o6_isActorInBox",
+ OPCODE(o6_soundKludge),
+ OPCODE(o6_isAnyOf),
+ OPCODE(o6_quitPauseRestart),
+ OPCODE(o6_isActorInBox),
/* B0 */
- "o6_delay",
- "o6_delayLonger",
- "o6_delayVeryLong",
- "o6_stopSentence",
+ OPCODE(o6_delay),
+ OPCODE(o6_delayLonger),
+ OPCODE(o6_delayVeryLong),
+ OPCODE(o6_stopSentence),
/* B4 */
- "o6_print_0",
- "o6_print_1",
- "o6_print_2",
- "o6_print_3",
+ OPCODE(o6_print_0),
+ OPCODE(o6_print_1),
+ OPCODE(o6_print_2),
+ OPCODE(o6_print_3),
/* B8 */
- "o6_printActor",
- "o6_printEgo",
- "o6_talkActor",
- "o6_talkEgo",
+ OPCODE(o6_printActor),
+ OPCODE(o6_printEgo),
+ OPCODE(o6_talkActor),
+ OPCODE(o6_talkEgo),
/* BC */
- "o6_dim",
- "o6_invalid",
- "o6_runVerbCodeQuick",
- "o6_runScriptQuick",
+ OPCODE(o6_dim),
+ OPCODE(o5_dummy),
+ OPCODE(o6_runVerbCodeQuick),
+ OPCODE(o6_runScriptQuick),
/* C0 */
- "o6_dim2",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_dim2),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* C4 */
- "o6_abs",
- "o6_distObjectObject",
- "o6_distObjectPt",
- "o6_distPtPt",
+ OPCODE(o6_abs),
+ OPCODE(o6_distObjectObject),
+ OPCODE(o6_distObjectPt),
+ OPCODE(o6_distPtPt),
/* C8 */
- "o6_kernelFunction",
- "o6_miscOps",
- "o6_breakMaybe",
- "o6_pickOneOf",
+ OPCODE(o6_kernelFunction),
+ OPCODE(o6_miscOps),
+ OPCODE(o6_delayFrames),
+ OPCODE(o6_pickOneOf),
/* CC */
- "o6_pickOneOfDefault",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_pickOneOfDefault),
+ OPCODE(o6_unknownCD),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* D0 */
- "o6_invalid",
- "o6_invalid",
- "o6_getAnimateVariable",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_getAnimateVariable),
+ OPCODE(o6_invalid),
/* D4 */
- "o6_invalid",
- "o6_jumpToScript",
- "o6_band",
- "o6_bor",
+ OPCODE(o6_invalid),
+ OPCODE(o6_jumpToScript),
+ OPCODE(o6_band),
+ OPCODE(o6_bor),
/* D8 */
- "o6_isRoomScriptRunning",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_isRoomScriptRunning),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* DC */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* E0 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* E4 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* E8 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* EC */
- "o6_invalid",
- "o6_getObjectNewDir",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_getActorPriority),
+ OPCODE(o6_getObjectNewDir),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* F0 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* F4 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* F8 */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
/* FC */
- "o6_invalid",
- "o6_invalid",
- "o6_invalid",
- "o6_invalid"
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
};
- _opcodes = opcode_list;
- _opcodes_lookup = opcode_lookup;
+ _opcodes = opcodes;
}
void Scumm::o6_setBlastObjectWindow()
{ // Set BOMP processing window
diff --git a/scumm/scumm.h b/scumm/scumm.h
index 8b5e4cc003..797390d497 100644
--- a/scumm/scumm.h
+++ b/scumm/scumm.h
@@ -43,6 +43,11 @@ struct FindObjectInRoom;
typedef void (Scumm::*OpcodeProc)();
+struct OpcodeEntry {
+ OpcodeProc proc;
+ const char *desc;
+};
+
// Use g_scumm from error() ONLY
extern Scumm *g_scumm;
@@ -60,6 +65,9 @@ struct ScummPoint {
int x, y;
};
+#include "gfx.h"
+#include "boxes.h"
+
struct MemBlkHeader {
uint32 size;
};
@@ -265,9 +273,6 @@ enum MouseButtonStatus {
msClicked = 2
};
-#include "gfx.h"
-#include "boxes.h"
-
class Scumm : public Engine {
public:
/* Put often used variables at the top.
@@ -450,13 +455,12 @@ public:
byte *_scriptPointer, *_scriptOrgPointer, *_scriptPointerStart;
byte _opcode, _numNestedScripts, _currentScript;
uint16 _curExecScript;
- const OpcodeProc *_opcodes;
- const char **_opcodes_lookup;
+ const OpcodeEntry *_opcodes;
byte **_lastCodePtr;
int _resultVarNumber, _scummStackPos;
int16 _localParamList[16], _scummStack[150];
- OpcodeProc getOpcode(int i) { return _opcodes[i]; }
+ OpcodeProc getOpcode(int i) { return _opcodes[i].proc; }
void initializeLocals(int slot, int16 *vars);
int getScriptSlot();
void runScript(int script, int a, int b, int16 *lvarptr);
@@ -985,6 +989,7 @@ public:
void o5_isLess();
void o5_isNotEqual();
void o5_ifState();
+ void o5_ifNotState();
void o5_isSoundRunning();
void o5_jumpRelative();
void o5_lessOrEqual();