From f16065d86ded3a4ba7466432db4574748a150cf0 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Tue, 24 Aug 2004 11:17:28 +0000 Subject: Remove some old/duplicate code. Add a few more functions/stubs for HE 7.2 Moved HE 7.2 o_resourceRoutine() specifics. svn-id: r14727 --- scumm/intern.h | 7 ++- scumm/script.cpp | 3 ++ scumm/script_v6.cpp | 76 ---------------------------- scumm/script_v6he.cpp | 37 ++++++++++---- scumm/script_v72he.cpp | 72 +++++++++++++++----------- scumm/script_v7he.cpp | 133 ++++++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 208 insertions(+), 120 deletions(-) diff --git a/scumm/intern.h b/scumm/intern.h index 3b8edbba9f..769dd58a7e 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -580,8 +580,6 @@ protected: void o6_roomOps(); void o6_actorOps(); void o6_wait(); - void o6_soundKludge(); - void o6_dummy(); void o6_kernelSetFunctions(); void o6_kernelGetFunctions(); void o6_openFile(); @@ -624,6 +622,7 @@ protected: void o7_startSound(); void o7_pickupObject(); void o7_getActorRoom(); + void o7_resourceRoutines(); void o7_quitPauseRestart(); void o7_stringLen(); void o7_readINI(); @@ -656,8 +655,7 @@ protected: /* Version 7 script opcodes */ void o72_getString(); - void o72_objectX(); - void o72_objectY(); + void o72_compareStackList(); void o72_startScript(); void o72_startObject(); void o72_drawObject(); @@ -667,6 +665,7 @@ protected: void o72_dimArray(); void o72_dim2dimArray(); void o72_jumpToScript(); + void o72_getPixel(); void o72_stringLen(); void o72_readINI(); void o72_unknownF4(); diff --git a/scumm/script.cpp b/scumm/script.cpp index a8c45acd8d..861c51fabe 100644 --- a/scumm/script.cpp +++ b/scumm/script.cpp @@ -349,6 +349,9 @@ void ScummEngine::updateScriptPtr() { /* Nuke arrays based on script */ void ScummEngine::nukeArrays(int script) { + //FIXME + return; + int i; if (!(_features & GF_HUMONGOUS) || !script) diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index f02b7b56b5..8e160f9c06 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -1617,82 +1617,6 @@ void ScummEngine_v6::o6_resourceRoutines() { loadFlObject(obj, room); break; } - case 120: /* queue ? for load */ - { - if (_heversion < 70) - error("o6_resourceRoutines: default case %d", op); - - debug(1,"stub queueload resource 2, %d", pop()); - // QL_QueGlobForLoad(2, pop(), 1); - break; - } - case 121: - { - if (_heversion < 70) - error("o6_resourceRoutines: default case %d", op); - - debug(1,"stub queueload resource 4, %d", pop()); - // QL_QueGlobForLoad(4, pop(), 1); - break; - } - case 122: - { - if (_heversion < 70) - error("o6_resourceRoutines: default case %d", op); - - debug(1,"stub queueload resource 3, %d", pop()); - // QL_QueGlobForLoad(3, pop(), 1); - break; - } - case 123: - { - if (_heversion < 70) - error("o6_resourceRoutines: default case %d", op); - - resid = pop(); - debug(1,"stub queueload resource 18, %d", resid); - // QL_QueGlobForLoad(18, resid, 1); - // QL_QueGlobForLoad(1, resid, 1); - break; - } - case 201: - { - if (_heversion < 70) - error("o6_resourceRoutines: default case %d", op); - - resid = pop(); - ensureResourceLoaded(rtImage, resid); - break; - } - case 202: - { - if (_heversion < 70) - error("o6_resourceRoutines: default case %d", op); - - resid = pop(); - lock(rtImage, resid); - break; - } - case 203: - { - if (_heversion < 70) - error("o6_resourceRoutines: default case %d", op); - - resid = pop(); - debug(1,"stub stub queueload resource 19, %d", resid); - // QL_QueGlobForLoad(19, resid, 1); - break; - } - case 233: - resid = pop(); - debug(1,"stub o6_resourceRoutines resource %d, 1", resid); - // foo(resid, 1); - break; - case 235: - resid = pop(); - debug(1,"stub o6_resourceRoutines resource %d, 0", resid); - // foo(resid, 0); - break; default: error("o6_resourceRoutines: default case %d", op); } diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp index 5e9edb0ca3..56455dd5f1 100644 --- a/scumm/script_v6he.cpp +++ b/scumm/script_v6he.cpp @@ -529,7 +529,12 @@ void ScummEngine_v6he::o6_roomOps() { _saveLoadSlot = 1; _saveTemporaryState = true; break; - case 234: + case 234: // HE 7.2 + b = pop(); + a = pop(); + warning("o6_roomOps: case %d (%d, %d)", op, b, a); + break; + case 236: // HE 7.2 b = pop(); a = pop(); warning("o6_roomOps: case %d (%d, %d)", op, b, a); @@ -740,15 +745,6 @@ void ScummEngine_v6he::o6_wait() { o6_breakHere(); } -void ScummEngine_v6he::o6_soundKludge() { - int list[16]; - getStackList(list, ARRAYSIZE(list)); -} - -void ScummEngine_v6he::o6_dummy() { - stopObjectCode(); -} - void ScummEngine_v6he::o6_kernelSetFunctions() { int args[29]; int num; @@ -1230,7 +1226,7 @@ void ScummEngine_v6he::redimArray(int arrayId, int newX, int newY, int type) { void ScummEngine_v6he::decodeParseString(int m, int n) { byte b; int i, color; - int args[16]; + int args[31]; b = fetchScriptByte(); @@ -1265,7 +1261,26 @@ void ScummEngine_v6he::decodeParseString(int m, int n) { _string[m].no_talk_anim = true; break; case 75: // SO_TEXTSTRING + switch (m) { + case 0: + actorTalk(_scriptPointer); + break; + case 1: + drawString(1, _scriptPointer); + break; + case 2: + unkMessage1(_scriptPointer); + break; + case 3: + unkMessage2(_scriptPointer); + break; + } + _scriptPointer += resStrLen(_scriptPointer) + 1; + + break; case 194: // HE 7.2 + getStackList(args, ARRAYSIZE(args)); + pop(); switch (m) { case 0: actorTalk(_scriptPointer); diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp index 7707c3496d..110d6349c8 100644 --- a/scumm/script_v72he.cpp +++ b/scumm/script_v72he.cpp @@ -79,7 +79,7 @@ void ScummEngine_v72he::setupOpcodes() { OPCODE(o6_land), OPCODE(o6_lor), OPCODE(o6_pop), - OPCODE(o6_invalid), + OPCODE(o72_compareStackList), /* 1C */ OPCODE(o6_invalid), OPCODE(o6_invalid), @@ -151,8 +151,8 @@ void ScummEngine_v72he::setupOpcodes() { OPCODE(o6_invalid), OPCODE(o6_wordArrayInc), /* 54 */ - OPCODE(o72_objectX), - OPCODE(o72_objectY), + OPCODE(o6_getObjectX), + OPCODE(o6_getObjectY), OPCODE(o6_byteVarDec), OPCODE(o6_wordVarDec), /* 58 */ @@ -327,7 +327,7 @@ void ScummEngine_v72he::setupOpcodes() { OPCODE(o6_rename), /* E0 */ OPCODE(o6_soundOps), - OPCODE(o6_getPixel), + OPCODE(o72_getPixel), OPCODE(o6_localizeArray), OPCODE(o6_pickVarRandom), /* E4 */ @@ -390,29 +390,21 @@ void ScummEngine_v72he::o72_getString() { fetchScriptWord(); } -void ScummEngine_v72he::o72_objectX() { - int object = pop(); - int objnum = getObjectIndex(object); - - if (objnum == -1) { - push(0); - return; - } - - push(_objs[objnum].x_pos); -} - - -void ScummEngine_v72he::o72_objectY() { - int object = pop(); - int objnum = getObjectIndex(object); - - if (objnum == -1) { +void ScummEngine_v72he::o72_compareStackList() { + int args[128], i; + int num = getStackList(args, ARRAYSIZE(args)); + int value = pop(); + + if (num) { + for (i = 1; i < 128; i++) { + if (args[i] = value) { + push(1); + break; + } + } + } else { push(0); - return; } - - push(_objs[objnum].y_pos); } void ScummEngine_v72he::o72_startScript() { @@ -483,9 +475,11 @@ void ScummEngine_v72he::o72_unknown62() { } void ScummEngine_v72he::o72_unknown63() { - int a = fetchScriptByte(); - warning("o72_unknown63 stub (%d)", a); - push(1); + int subOp = fetchScriptByte(); + //int arrayId = readVar(fetchScriptWord()); + + warning("o72_unknown63 stub (%d)", subOp); + push(0); } void ScummEngine_v72he::o72_arrayOps() { @@ -610,6 +604,28 @@ void ScummEngine_v72he::o72_jumpToScript() { runScript(script, (flags == 199 || flags == 200), (flags == 195 || flags == 200), args); } +void ScummEngine_v72he::o72_getPixel() { + byte area; + int x = pop(); + int y = pop(); + int subOp = fetchScriptByte(); + + if (subOp != 218 && subOp != 219) + return; + + VirtScreen *vs = findVirtScreen(y); + if (vs == NULL || x > _screenWidth - 1 || x < 0) { + push(-1); + return; + } + + if (subOp == 218) + area = *vs->getBackPixels(x, y - vs->topline); + else + area = *vs->getPixels(x, y - vs->topline); + push(area); +} + void ScummEngine_v72he::o72_stringLen() { int a, len; byte *addr; diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index 07b0a92282..63f0338c38 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -245,7 +245,7 @@ void ScummEngine_v7he::setupOpcodes() { OPCODE(o6_isSoundRunning), OPCODE(o6_setBoxFlags), OPCODE(o6_invalid), - OPCODE(o6_resourceRoutines), + OPCODE(o7_resourceRoutines), /* 9C */ OPCODE(o6_roomOps), OPCODE(o6_actorOps), @@ -543,6 +543,137 @@ void ScummEngine_v7he::o7_getActorRoom() { push(getObjectRoom(act)); } +void ScummEngine_v7he::o7_resourceRoutines() { + int resid, op; + op = fetchScriptByte(); + + switch (op) { + case 100: // SO_LOAD_SCRIPT + resid = pop(); + ensureResourceLoaded(rtScript, resid); + break; + case 101: // SO_LOAD_SOUND + resid = pop(); + ensureResourceLoaded(rtSound, resid); + break; + case 102: // SO_LOAD_COSTUME + resid = pop(); + ensureResourceLoaded(rtCostume, resid); + break; + case 103: // SO_LOAD_ROOM + resid = pop(); + ensureResourceLoaded(rtRoom, resid); + break; + case 104: // SO_NUKE_SCRIPT + resid = pop(); + setResourceCounter(rtScript, resid, 0x7F); + break; + case 105: // SO_NUKE_SOUND + resid = pop(); + setResourceCounter(rtSound, resid, 0x7F); + break; + case 106: // SO_NUKE_COSTUME + resid = pop(); + setResourceCounter(rtCostume, resid, 0x7F); + break; + case 107: // SO_NUKE_ROOM + resid = pop(); + setResourceCounter(rtRoom, resid, 0x7F); + break; + case 108: // SO_LOCK_SCRIPT + resid = pop(); + if (resid >= _numGlobalScripts) + break; + lock(rtScript, resid); + break; + case 109: // SO_LOCK_SOUND + resid = pop(); + lock(rtSound, resid); + break; + case 110: // SO_LOCK_COSTUME + resid = pop(); + lock(rtCostume, resid); + break; + case 111: // SO_LOCK_ROOM + resid = pop(); + if (resid > 0x7F) + resid = _resourceMapper[resid & 0x7F]; + lock(rtRoom, resid); + break; + case 112: // SO_UNLOCK_SCRIPT + resid = pop(); + if (resid >= _numGlobalScripts) + break; + unlock(rtScript, resid); + break; + case 113: // SO_UNLOCK_SOUND + resid = pop(); + unlock(rtSound, resid); + break; + case 114: // SO_UNLOCK_COSTUME + resid = pop(); + unlock(rtCostume, resid); + break; + case 115: // SO_UNLOCK_ROOM + resid = pop(); + if (resid > 0x7F) + resid = _resourceMapper[resid & 0x7F]; + unlock(rtRoom, resid); + break; + case 116: // SO_CLEAR_HEAP + /* this is actually a scumm message */ + error("clear heap not working yet"); + break; + case 117: // SO_LOAD_CHARSET + resid = pop(); + loadCharset(resid); + break; + case 118: // SO_NUKE_CHARSET + resid = pop(); + nukeCharset(resid); + break; + case 119: // SO_LOAD_OBJECT + { + int room, obj = popRoomAndObj(&room); + loadFlObject(obj, room); + break; + } + case 120: /* queue for load */ + case 121: + case 122: + case 123: + case 203: + debug(1,"stub queueload (%d) resource %d", op, pop()); + break; + case 159: + resid = pop(); + unlock(rtImage, resid); + break; + case 192: + resid = pop(); + nukeResource(rtImage, resid); + break; + case 201: + resid = pop(); + ensureResourceLoaded(rtImage, resid); + break; + case 202: + resid = pop(); + lock(rtImage, resid); + break; + case 233: + resid = pop(); + debug(1,"stub o7_resourceRoutines lock object %d", resid); + break; + case 235: + resid = pop(); + debug(1,"stub o7_resourceRoutines unlock object %d", resid); + break; + default: + error("o7_resourceRoutines: default case %d", op); + } +} + void ScummEngine_v7he::o7_quitPauseRestart() { byte subOp = fetchScriptByte(); int par1; -- cgit v1.2.3