aboutsummaryrefslogtreecommitdiff
path: root/script_v2.cpp
diff options
context:
space:
mode:
authorJames Brown2002-03-05 09:58:12 +0000
committerJames Brown2002-03-05 09:58:12 +0000
commit9dec4275b6ca19a98a4cb86b32a0a7228d725826 (patch)
treee64172c0f890ca12b964b176a9de88525f57e968 /script_v2.cpp
parent5753e81beaa736275e0406d91bce9258fbbe8ac8 (diff)
downloadscummvm-rg350-9dec4275b6ca19a98a4cb86b32a0a7228d725826.tar.gz
scummvm-rg350-9dec4275b6ca19a98a4cb86b32a0a7228d725826.tar.bz2
scummvm-rg350-9dec4275b6ca19a98a4cb86b32a0a7228d725826.zip
Warning'ed some miscops, and added a hack to just ignore non-existant actors.
Sam and Max is now playable to a quite advanced stage. svn-id: r3645
Diffstat (limited to 'script_v2.cpp')
-rw-r--r--script_v2.cpp334
1 files changed, 331 insertions, 3 deletions
diff --git a/script_v2.cpp b/script_v2.cpp
index 193f28feec..3c20d0c069 100644
--- a/script_v2.cpp
+++ b/script_v2.cpp
@@ -347,7 +347,331 @@ void Scumm::setupOpcodes2() {
&Scumm::o6_invalid,
};
+ static const char* opcode_lookup[] = {
+ /* 00 */
+ "o6_pushByte",
+ "o6_pushWord",
+ "o6_pushByteVar",
+ "o6_pushWordVar",
+ /* 04 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_byteArrayRead",
+ "o6_wordArrayRead",
+ /* 08 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_byteArrayIndexedRead",
+ "o6_wordArrayIndexedRead",
+ /* 0C */
+ "o6_dup",
+ "o6_zero",
+ "o6_eq",
+ "o6_neq",
+ /* 10 */
+ "o6_gt",
+ "o6_lt",
+ "o6_le",
+ "o6_ge",
+ /* 14 */
+ "o6_add",
+ "o6_sub",
+ "o6_mul",
+ "o6_div",
+ /* 18 */
+ "o6_land",
+ "o6_lor",
+ "o6_kill",
+ "o6_invalid",
+ /* 1C */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* 20 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* 24 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* 28 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* 2C */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* 30 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* 34 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* 38 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* 3C */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* 40 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_writeByteVar",
+ "o6_writeWordVar",
+ /* 44 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_byteArrayWrite",
+ "o6_wordArrayWrite",
+ /* 48 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_byteArrayIndexedWrite",
+ "o6_wordArrayIndexedWrite",
+ /* 4C */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_byteVarInc",
+ "o6_wordVarInc",
+ /* 50 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_byteArrayInc",
+ "o6_wordArrayInc",
+ /* 54 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_byteVarDec",
+ "o6_wordVarDec",
+ /* 58 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_byteArrayDec",
+ "o6_wordArrayDec",
+ /* 5C */
+ "o6_jumpTrue",
+ "o6_jumpFalse",
+ "o6_startScriptEx",
+ "o6_startScript",
+ /* 60 */
+ "o6_startObject",
+ "o6_setObjectState",
+ "o6_setObjectXY",
+ "o6_drawBlastObject",
+ /* 64 */
+ "o6_invalid",
+ "o6_stopObjectCode",
+ "o6_stopObjectCode",
+ "o6_endCutscene",
+ /* 68 */
+ "o6_cutScene",
+ "o6_stopMusic",
+ "o6_freezeUnfreeze",
+ "o6_cursorCommand",
+ /* 6C */
+ "o6_breakHere",
+ "o6_ifClassOfIs",
+ "o6_setClass",
+ "o6_getState",
+ /* 70 */
+ "o6_setState",
+ "o6_setOwner",
+ "o6_getOwner",
+ "o6_jump",
+ /* 74 */
+ "o6_startSound",
+ "o6_stopSound",
+ "o6_startMusic",
+ "o6_stopObjectScript",
+ /* 78 */
+ "o6_panCameraTo",
+ "o6_actorFollowCamera",
+ "o6_setCameraAt",
+ "o6_loadRoom",
+ /* 7C */
+ "o6_stopScript",
+ "o6_walkActorToObj",
+ "o6_walkActorTo",
+ "o6_putActorInRoom",
+ /* 80 */
+ "o6_putActorAtObject",
+ "o6_faceActor",
+ "o6_animateActor",
+ "o6_doSentence",
+ /* 84 */
+ "o6_pickupObject",
+ "o6_loadRoomWithEgo",
+ "o6_invalid",
+ "o6_getRandomNumber",
+ /* 88 */
+ "o6_getRandomNumberRange",
+ "o6_invalid",
+ "o6_getActorMoving",
+ "o6_getScriptRunning",
+ /* 8C */
+ "o6_getActorRoom",
+ "o6_getObjectX",
+ "o6_getObjectY",
+ "o6_getObjectOldDir",
+ /* 90 */
+ "o6_getActorWalkBox",
+ "o6_getActorCostume",
+ "o6_findInventory",
+ "o6_getInventoryCount",
+ /* 94 */
+ "o6_getVerbFromXY",
+ "o6_beginOverride",
+ "o6_endOverride",
+ "o6_setObjectName",
+ /* 98 */
+ "o6_isSoundRunning",
+ "o6_setBoxFlags",
+ "o6_createBoxMatrix",
+ "o6_resourceRoutines",
+ /* 9C */
+ "o6_roomOps",
+ "o6_actorSet",
+ "o6_verbOps",
+ "o6_getActorFromXY",
+ /* A0 */
+ "o6_findObject",
+ "o6_pseudoRoom",
+ "o6_getActorElevation",
+ "o6_getVerbEntrypoint",
+ /* A4 */
+ "o6_arrayOps",
+ "o6_saveRestoreVerbs",
+ "o6_drawBox",
+ "o6_invalid",
+ /* A8 */
+ "o6_getActorWidth",
+ "o6_wait",
+ "o6_getActorScaleX",
+ "o6_getActorAnimCounter1",
+ /* AC */
+ "o6_soundKludge",
+ "o6_isAnyOf",
+ "o6_quitPauseRestart",
+ "o6_isActorInBox",
+ /* B0 */
+ "o6_delay",
+ "o6_delayLonger",
+ "o6_delayVeryLong",
+ "o6_stopSentence",
+ /* B4 */
+ "o6_print_0",
+ "o6_print_1",
+ "o6_print_2",
+ "o6_print_3",
+ /* B8 */
+ "o6_printActor",
+ "o6_printEgo",
+ "o6_talkActor",
+ "o6_talkEgo",
+ /* BC */
+ "o6_dim",
+ "o6_invalid",
+ "o6_runVerbCodeQuick",
+ "o6_runScriptQuick",
+ /* C0 */
+ "o6_dim2",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* C4 */
+ "o6_abs",
+ "o6_distObjectObject",
+ "o6_distObjectPt",
+ "o6_distPtPt",
+ /* C8 */
+ "o6_kernelFunction",
+ "o6_miscOps",
+ "o6_breakMaybe",
+ "o6_pickOneOf",
+ /* CC */
+ "o6_pickOneOfDefault",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* D0 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_getAnimateVariable",
+ "o6_invalid",
+ /* D4 */
+ "o6_invalid",
+ "o6_jumpToScript",
+ "o6_invalid",
+ "o6_invalid",
+ /* D8 */
+ "o6_isRoomScriptRunning",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* DC */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* E0 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* E4 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* E8 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* EC */
+ "o6_invalid",
+ "o6_getObjectNewDir",
+ "o6_invalid",
+ "o6_invalid",
+ /* F0 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* F4 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* F8 */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ /* FC */
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid",
+ "o6_invalid"
+ };
+
_opcodes = opcode_list;
+ _opcodes_lookup = opcode_lookup;
}
int Scumm::popRoomAndObj(int *room) {
@@ -909,6 +1233,7 @@ void Scumm::o6_walkActorToObj() {
dist = pop();
obj = pop();
a = derefActorSafe(pop(), "o6_walkActorToObj");
+ if (!a) return;
if (obj >= NUM_ACTORS) {
if (whereIsObject(obj)==WIO_NOT_FOUND)
@@ -917,6 +1242,7 @@ void Scumm::o6_walkActorToObj() {
startWalkActor(a, _xPos, _yPos, _dir);
} else {
a2 = derefActorSafe(obj, "o6_walkActorToObj(2)");
+ if (!a2) return;
if (a2->room != _currentRoom ||
a->room != _currentRoom)
return;
@@ -948,6 +1274,8 @@ void Scumm::o6_putActorInRoom() {
y = pop();
x = pop();
a = derefActorSafe(pop(), "o6_putActorInRoom");
+ if (!a)
+ return;
if (room==0xFF) {
room = a->room;
@@ -2257,7 +2585,7 @@ void Scumm::o6_miscOps() {
a->needRedraw = true;
break;
- case 108:
+ case 108: /* shadow palette? */
case 109:
warning("stub o6_miscOps_108(%d,%d,%d,%d,%d,%d,%d)",args[1], args[2], args[3], args[4], args[5],0,256);
break;
@@ -2271,8 +2599,8 @@ void Scumm::o6_miscOps() {
a->shadow_mode = args[2] + args[3];
break;
- case 112:
- error("stub o6_miscOps_112(%d,%d,%d,%d,%d,%d,%d)",
+ case 112: /* palette shift? */
+ warning("stub o6_miscOps_112(%d,%d,%d,%d,%d,%d,%d)",
args[1], args[2], args[3], args[4], args[5],
args[6], args[7]);
break;