diff options
-rw-r--r-- | scumm/script.cpp | 4 | ||||
-rw-r--r-- | scumm/script_v1.cpp | 857 | ||||
-rw-r--r-- | scumm/script_v2.cpp | 843 | ||||
-rw-r--r-- | scumm/scumm.h | 17 |
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(); |