aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h7
-rw-r--r--scumm/script.cpp3
-rw-r--r--scumm/script_v6.cpp76
-rw-r--r--scumm/script_v6he.cpp37
-rw-r--r--scumm/script_v72he.cpp72
-rw-r--r--scumm/script_v7he.cpp133
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;