aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h41
-rw-r--r--scumm/module.mk1
-rw-r--r--scumm/script_v6.cpp28
-rw-r--r--scumm/script_v72he.cpp658
-rw-r--r--scumm/script_v7he.cpp268
5 files changed, 762 insertions, 234 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 1829539068..6a2719a5e8 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -623,8 +623,6 @@ protected:
/* Version 7 script opcodes */
void o7_getString();
- void o7_objectX();
- void o7_objectY();
void o7_stringLen();
void o7_readINI();
void o7_unknownF4();
@@ -634,12 +632,47 @@ protected:
void o7_quitPauseRestart();
void o7_getActorRoom();
void o7_pickupObject();
+ void o7_startSound();
+ void o7_cursorCommand();
+};
+
+class ScummEngine_v72he : public ScummEngine_v7he {
+protected:
+ typedef void (ScummEngine_v72he::*OpcodeProcV72he)();
+ struct OpcodeEntryV72he {
+ OpcodeProcV72he proc;
+ const char *desc;
+ };
+
+ const OpcodeEntryV72he *_opcodesV72he;
+
+public:
+ ScummEngine_v72he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs);
+
+protected:
+ virtual void setupScummVars();
+
+ virtual void setupOpcodes();
+ virtual void executeOpcode(byte i);
+ virtual const char *getOpcodeDesc(byte i);
+
+ byte stringLen(byte *);
+
+ /* Version 7 script opcodes */
+ void o7_getString();
+ void o7_objectX();
+ void o7_objectY();
+ void o7_stringLen();
+ void o7_readINI();
+ void o7_unknownF4();
+ void o7_unknownFA();
+ void o7_unknownFB();
void o7_arrayOps();
void o7_dimArray();
void o7_jumpToScript();
void o7_startScript();
- void o7_startSound();
- void o7_cursorCommand();
+ void o7_unknown63();
+ void o7_dim2dimArray();
};
class ScummEngine_v7 : public ScummEngine_v6 {
diff --git a/scumm/module.mk b/scumm/module.mk
index 2391a77413..06dbd03f50 100644
--- a/scumm/module.mk
+++ b/scumm/module.mk
@@ -39,6 +39,7 @@ MODULE_OBJS := \
scumm/script_v6.o \
scumm/script_v6he.o \
scumm/script_v7he.o \
+ scumm/script_v72he.o \
scumm/script_v8.o \
scumm/scumm.o \
scumm/sound.o \
diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp
index 07d0235e56..d5bf4908a8 100644
--- a/scumm/script_v6.cpp
+++ b/scumm/script_v6.cpp
@@ -1653,6 +1653,34 @@ void ScummEngine_v6::o6_resourceRoutines() {
// 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);
diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp
new file mode 100644
index 0000000000..d270b27aa6
--- /dev/null
+++ b/scumm/script_v72he.cpp
@@ -0,0 +1,658 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ * Copyright (C) 2001-2004 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+
+#include "stdafx.h"
+
+#include "common/config-manager.h"
+
+#include "scumm/actor.h"
+#include "scumm/charset.h"
+#include "scumm/intern.h"
+#include "scumm/object.h"
+#include "scumm/resource.h"
+#include "scumm/resource_v7he.h"
+#include "scumm/scumm.h"
+#include "scumm/sound.h"
+#include "scumm/verbs.h"
+#include "scumm/smush/smush_player.h"
+
+#include "sound/mididrv.h"
+#include "sound/mixer.h"
+
+namespace Scumm {
+
+#define OPCODE(x) { &ScummEngine_v72he::x, #x }
+
+void ScummEngine_v72he::setupOpcodes() {
+ static const OpcodeEntryV72he opcodes[256] = {
+ /* 00 */
+ OPCODE(o6_pushByte),
+ OPCODE(o6_pushWord),
+ OPCODE(o6_pushByteVar),
+ OPCODE(o6_pushWordVar),
+ /* 04 */
+ OPCODE(o7_getString),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayRead),
+ OPCODE(o6_wordArrayRead),
+ /* 08 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayIndexedRead),
+ OPCODE(o6_wordArrayIndexedRead),
+ /* 0C */
+ OPCODE(o6_dup),
+ OPCODE(o6_not),
+ OPCODE(o6_eq),
+ OPCODE(o6_neq),
+ /* 10 */
+ OPCODE(o6_gt),
+ OPCODE(o6_lt),
+ OPCODE(o6_le),
+ OPCODE(o6_ge),
+ /* 14 */
+ OPCODE(o6_add),
+ OPCODE(o6_sub),
+ OPCODE(o6_mul),
+ OPCODE(o6_div),
+ /* 18 */
+ OPCODE(o6_land),
+ OPCODE(o6_lor),
+ OPCODE(o6_pop),
+ OPCODE(o6_invalid),
+ /* 1C */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* 20 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* 24 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* 28 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* 2C */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* 30 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* 34 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* 38 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* 3C */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* 40 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_writeByteVar),
+ OPCODE(o6_writeWordVar),
+ /* 44 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayWrite),
+ OPCODE(o6_wordArrayWrite),
+ /* 48 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayIndexedWrite),
+ OPCODE(o6_wordArrayIndexedWrite),
+ /* 4C */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteVarInc),
+ OPCODE(o6_wordVarInc),
+ /* 50 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayInc),
+ OPCODE(o6_wordArrayInc),
+ /* 54 */
+ OPCODE(o7_objectX),
+ OPCODE(o7_objectY),
+ OPCODE(o6_byteVarDec),
+ OPCODE(o6_wordVarDec),
+ /* 58 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_byteArrayDec),
+ OPCODE(o6_wordArrayDec),
+ /* 5C */
+ OPCODE(o6_if),
+ OPCODE(o6_ifNot),
+ OPCODE(o7_startScript),
+ OPCODE(o6_startScriptQuick),
+ /* 60 */
+ OPCODE(o6_startObject),
+ OPCODE(o6_drawObject),
+ OPCODE(o6_drawObjectAt),
+ OPCODE(o7_unknown63),
+ /* 64 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_stopObjectCode),
+ OPCODE(o6_stopObjectCode),
+ OPCODE(o6_endCutscene),
+ /* 68 */
+ OPCODE(o6_cutscene),
+ OPCODE(o6_stopMusic),
+ OPCODE(o6_freezeUnfreeze),
+ OPCODE(o7_cursorCommand),
+ /* 6C */
+ OPCODE(o6_breakHere),
+ OPCODE(o6_ifClassOfIs),
+ OPCODE(o6_setClass),
+ OPCODE(o6_getState),
+ /* 70 */
+ OPCODE(o6_setState),
+ OPCODE(o6_setOwner),
+ OPCODE(o6_getOwner),
+ OPCODE(o6_jump),
+ /* 74 */
+ OPCODE(o7_startSound),
+ OPCODE(o6_stopSound),
+ OPCODE(o6_startMusic),
+ OPCODE(o6_stopObjectScript),
+ /* 78 */
+ OPCODE(o6_panCameraTo),
+ OPCODE(o6_actorFollowCamera),
+ OPCODE(o6_setCameraAt),
+ OPCODE(o6_loadRoom),
+ /* 7C */
+ OPCODE(o6_stopScript),
+ OPCODE(o6_walkActorToObj),
+ OPCODE(o6_walkActorTo),
+ OPCODE(o6_putActorAtXY),
+ /* 80 */
+ OPCODE(o6_putActorAtObject),
+ OPCODE(o6_faceActor),
+ OPCODE(o6_animateActor),
+ OPCODE(o6_doSentence),
+ /* 84 */
+ OPCODE(o7_pickupObject),
+ OPCODE(o6_loadRoomWithEgo),
+ OPCODE(o6_invalid),
+ OPCODE(o6_getRandomNumber),
+ /* 88 */
+ OPCODE(o6_getRandomNumberRange),
+ OPCODE(o6_invalid),
+ OPCODE(o6_getActorMoving),
+ OPCODE(o6_isScriptRunning),
+ /* 8C */
+ OPCODE(o7_getActorRoom),
+ OPCODE(o6_getObjectX),
+ OPCODE(o6_getObjectY),
+ OPCODE(o6_getObjectOldDir),
+ /* 90 */
+ OPCODE(o6_getActorWalkBox),
+ OPCODE(o6_getActorCostume),
+ OPCODE(o6_findInventory),
+ OPCODE(o6_getInventoryCount),
+ /* 94 */
+ OPCODE(o6_getVerbFromXY),
+ OPCODE(o6_beginOverride),
+ OPCODE(o6_endOverride),
+ OPCODE(o6_setObjectName),
+ /* 98 */
+ OPCODE(o6_isSoundRunning),
+ OPCODE(o6_setBoxFlags),
+ OPCODE(o6_invalid),
+ OPCODE(o6_resourceRoutines),
+ /* 9C */
+ OPCODE(o6_roomOps),
+ OPCODE(o6_actorOps),
+ OPCODE(o6_verbOps),
+ OPCODE(o6_getActorFromXY),
+ /* A0 */
+ OPCODE(o6_findObject),
+ OPCODE(o6_pseudoRoom),
+ OPCODE(o6_getActorElevation),
+ OPCODE(o6_getVerbEntrypoint),
+ /* A4 */
+ OPCODE(o7_arrayOps),
+ OPCODE(o6_saveRestoreVerbs),
+ OPCODE(o6_drawBox),
+ OPCODE(o6_pop),
+ /* A8 */
+ OPCODE(o6_getActorWidth),
+ OPCODE(o6_wait),
+ OPCODE(o6_getActorScaleX),
+ OPCODE(o6_getActorAnimCounter1),
+ /* AC */
+ OPCODE(o6_invalid),
+ OPCODE(o6_isAnyOf),
+ OPCODE(o7_quitPauseRestart),
+ OPCODE(o6_isActorInBox),
+ /* B0 */
+ OPCODE(o6_delay),
+ OPCODE(o6_delaySeconds),
+ OPCODE(o6_delayMinutes),
+ OPCODE(o6_stopSentence),
+ /* B4 */
+ OPCODE(o6_printLine),
+ OPCODE(o6_printCursor),
+ OPCODE(o6_printDebug),
+ OPCODE(o6_printSystem),
+ /* B8 */
+ OPCODE(o6_printActor),
+ OPCODE(o6_printEgo),
+ OPCODE(o6_talkActor),
+ OPCODE(o6_talkEgo),
+ /* BC */
+ OPCODE(o7_dimArray),
+ OPCODE(o6_dummy),
+ OPCODE(o6_startObjectQuick),
+ OPCODE(o6_startScriptQuick2),
+ /* C0 */
+ OPCODE(o7_dim2dimArray),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* C4 */
+ OPCODE(o6_abs),
+ OPCODE(o6_distObjectObject),
+ OPCODE(o6_distObjectPt),
+ OPCODE(o6_distPtPt),
+ /* C8 */
+ OPCODE(o6_kernelGetFunctions),
+ OPCODE(o6_kernelSetFunctions),
+ OPCODE(o6_delayFrames),
+ OPCODE(o6_pickOneOf),
+ /* CC */
+ OPCODE(o6_pickOneOfDefault),
+ OPCODE(o6_stampObject),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* D0 */
+ OPCODE(o6_getDateTime),
+ OPCODE(o6_stopTalking),
+ OPCODE(o6_getAnimateVariable),
+ OPCODE(o6_invalid),
+ /* D4 */
+ OPCODE(o6_shuffle),
+ OPCODE(o7_jumpToScript),
+ OPCODE(o6_band),
+ OPCODE(o6_bor),
+ /* D8 */
+ OPCODE(o6_isRoomScriptRunning),
+ OPCODE(o6_closeFile),
+ OPCODE(o6_openFile),
+ OPCODE(o6_readFile),
+ /* DC */
+ OPCODE(o6_writeFile),
+ OPCODE(o6_findAllObjects),
+ OPCODE(o6_deleteFile),
+ OPCODE(o6_rename),
+ /* E0 */
+ OPCODE(o6_soundOps),
+ OPCODE(o6_getPixel),
+ OPCODE(o6_localizeArray),
+ OPCODE(o6_pickVarRandom),
+ /* E4 */
+ OPCODE(o6_setBoxSet),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* E8 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_seekFilePos),
+ OPCODE(o6_redimArray),
+ OPCODE(o6_readFilePos),
+ /* EC */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o7_stringLen),
+ OPCODE(o6_invalid),
+ /* F0 */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o7_readINI),
+ /* F4 */
+ OPCODE(o7_unknownF4),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ /* F8 */
+ OPCODE(o6_invalid),
+ OPCODE(o7_unknownF9),
+ OPCODE(o7_unknownFA),
+ OPCODE(o7_unknownFB),
+ /* FC */
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
+ };
+
+ _opcodesV72he = opcodes;
+}
+
+void ScummEngine_v72he::executeOpcode(byte i) {
+ OpcodeProcV72he op = _opcodesV72he[i].proc;
+ (this->*op) ();
+}
+
+const char *ScummEngine_v72he::getOpcodeDesc(byte i) {
+ return _opcodesV72he[i].desc;
+}
+
+
+void ScummEngine_v72he::o7_objectX() {
+ int object = pop();
+ int objnum = getObjectIndex(object);
+
+ if (objnum == -1) {
+ push(0);
+ return;
+ }
+
+ push(_objs[objnum].x_pos);
+}
+
+
+void ScummEngine_v72he::o7_objectY() {
+ int object = pop();
+ int objnum = getObjectIndex(object);
+
+ if (objnum == -1) {
+ push(0);
+ return;
+ }
+
+ push(_objs[objnum].y_pos);
+}
+
+void ScummEngine_v72he::o7_getString() {
+ int len;
+
+ len = resStrLen(_scriptPointer);
+ warning("stub o7_getString(\"%s\")", _scriptPointer);
+ _scriptPointer += len;
+ fetchScriptWord();
+ fetchScriptWord();
+}
+
+void ScummEngine_v72he::o7_unknown63() {
+ int a = fetchScriptByte();
+ warning("o7_unknown63 stub (%d)", a);
+ push(1);
+}
+
+void ScummEngine_v72he::o7_unknownFA() {
+ warning("stub o7_unknownFA(%d)", fetchScriptByte());
+}
+
+void ScummEngine_v72he::o7_stringLen() {
+ int a, len;
+ byte *addr;
+
+ a = pop();
+
+ addr = getStringAddress(a);
+ if (!addr) {
+ // FIXME: should be error here
+ warning("o7_stringLen: Reference to zeroed array pointer (%d)", a);
+ push(0);
+ return;
+ }
+
+ len = strlen((char *)getStringAddress(a));
+ push(len);
+}
+
+void ScummEngine_v72he::o7_readINI() {
+ int type;
+ int retval;
+
+ // we pretend that we don't have .ini file
+ type = fetchScriptByte();
+ switch (type) {
+ case 6: // number
+ push(0);
+ break;
+ case 7: // string
+ defineArray(0, kStringArray, 0, 0);
+ retval = readVar(0);
+ writeArray(0, 0, 0, 0);
+ push(retval); // var ID string
+ break;
+ default:
+ warning("o7_readINI(..., %d): read-ini string not implemented", type);
+ }
+}
+
+void ScummEngine_v72he::o7_unknownF4() {
+ byte b;
+ int len;
+ b = fetchScriptByte();
+
+ switch (b) {
+ case 6:
+ pop();
+ len = resStrLen(_scriptPointer);
+ _scriptPointer += len + 1;
+ break;
+ case 7:
+ len = resStrLen(_scriptPointer);
+ _scriptPointer += len + 1;
+ len = resStrLen(_scriptPointer);
+ _scriptPointer += len + 1;
+ break;
+ }
+ warning("o7_unknownF4 stub");
+}
+
+void ScummEngine_v72he::o7_unknownFB() {
+ byte b;
+ b = fetchScriptByte();
+
+ switch (b) {
+ case 246:
+ case 248:
+ pop();
+ pop();
+ pop();
+ pop();
+ pop();
+ pop();
+ pop();
+ pop();
+ pop();
+ break;
+ case 247:
+ pop();
+ pop();
+ break;
+ }
+ warning("o7_unknownFB stub");
+}
+
+void ScummEngine_v72he::o7_dim2dimArray() {
+ if (_heversion <= 71) {
+ ScummEngine_v6::o6_dim2dimArray();
+ return;
+ }
+
+ int a, b, data;
+ int type = fetchScriptByte();
+ switch (type - 2) {
+ case 0: // SO_INT_ARRAY
+ data = kIntArray;
+ break;
+ case 1: // SO_BIT_ARRAY
+ data = kBitArray;
+ break;
+ case 2: // SO_NIBBLE_ARRAY
+ data = kNibbleArray;
+ break;
+ case 3: // SO_BYTE_ARRAY
+ data = kByteArray;
+ break;
+ case 4: // SO_STRING_ARRAY
+ data = kStringArray;
+ break;
+ default:
+ error("o7_dim2dimArray: default case %d", type);
+ }
+
+ b = pop();
+ a = pop();
+ defineArray(fetchScriptWord(), data, a, b);
+}
+
+void ScummEngine_v72he::o7_dimArray() {
+ if (_heversion <= 71) {
+ ScummEngine_v6::o6_dimArray();
+ return;
+ }
+
+ int data;
+ int type = fetchScriptByte();
+
+ switch (type) {
+ case 5: // SO_INT_ARRAY
+ data = kIntArray;
+ break;
+ case 2: // SO_BIT_ARRAY
+ data = kBitArray;
+ break;
+ case 3: // SO_NIBBLE_ARRAY
+ data = kNibbleArray;
+ break;
+ case 4: // SO_BYTE_ARRAY
+ data = kByteArray;
+ break;
+ case 7: // SO_STRING_ARRAY
+ data = kStringArray;
+ break;
+ case 204: // SO_UNDIM_ARRAY
+ nukeArray(fetchScriptWord());
+ return;
+ default:
+ error("o7_dimArray: default case %d", type);
+ }
+
+ defineArray(fetchScriptWord(), data, 0, pop());
+}
+
+void ScummEngine_v72he::o7_arrayOps() {
+ byte subOp = fetchScriptByte();
+ int array = fetchScriptWord();
+ int b, c, d, len;
+ ArrayHeader *ah;
+ int list[128];
+
+ switch (subOp) {
+ case 7: // SO_ASSIGN_STRING
+ len = resStrLen(_scriptPointer);
+ ah = defineArray(array, kStringArray, 0, len + 1);
+ copyScriptString(ah->data);
+ break;
+ case 205: // SO_ASSIGN_STRING
+ b = pop();
+ len = resStrLen(_scriptPointer);
+ ah = defineArray(array, kStringArray, 0, len + 1);
+ copyScriptString(ah->data + b);
+ break;
+ case 208: // SO_ASSIGN_INT_LIST
+ b = pop();
+ c = pop();
+ d = readVar(array);
+ if (d == 0) {
+ defineArray(array, kIntArray, 0, b + c);
+ }
+ while (c--) {
+ writeArray(array, 0, b + c, pop());
+ }
+ break;
+ case 212: // SO_ASSIGN_2DIM_LIST
+ b = pop();
+ len = getStackList(list, ARRAYSIZE(list));
+ d = readVar(array);
+ if (d == 0)
+ error("Must DIM a two dimensional array before assigning");
+ c = pop();
+ while (--len >= 0) {
+ writeArray(array, c, b + len, list[len]);
+ }
+ break;
+ default:
+ error("o7_arrayOps: default case %d (array %d)", subOp, array);
+ }
+}
+
+void ScummEngine_v72he::o7_jumpToScript() {
+ if (_heversion <= 71) {
+ ScummEngine_v6::o6_jumpToScript();
+ return;
+ }
+ int args[16];
+ int script, flags;
+
+ getStackList(args, ARRAYSIZE(args));
+ script = pop();
+ flags = fetchScriptByte();
+ stopObjectCode();
+ runScript(script, (flags == 199 || flags == 200), (flags == 195 || flags == 200), args);
+}
+
+void ScummEngine_v72he::o7_startScript() {
+ if (_heversion <= 71) {
+ ScummEngine_v6::o6_startScript();
+ return;
+ }
+
+ int args[16];
+ int script, flags;
+
+ getStackList(args, ARRAYSIZE(args));
+ script = pop();
+ flags = fetchScriptByte();
+
+ runScript(script, (flags == 199 || flags == 200), (flags == 195 || flags == 200), args);
+}
+
+} // End of namespace Scumm
diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp
index 274b8b47f2..a5863b0d7f 100644
--- a/scumm/script_v7he.cpp
+++ b/scumm/script_v7he.cpp
@@ -57,7 +57,7 @@ void ScummEngine_v7he::setupOpcodes() {
OPCODE(o6_pushByteVar),
OPCODE(o6_pushWordVar),
/* 04 */
- OPCODE(o7_getString),
+ OPCODE(o6_invalid),
OPCODE(o6_invalid),
OPCODE(o6_byteArrayRead),
OPCODE(o6_wordArrayRead),
@@ -157,8 +157,8 @@ void ScummEngine_v7he::setupOpcodes() {
OPCODE(o6_byteArrayInc),
OPCODE(o6_wordArrayInc),
/* 54 */
- OPCODE(o7_objectX),
- OPCODE(o7_objectY),
+ OPCODE(o6_invalid),
+ OPCODE(o6_invalid),
OPCODE(o6_byteVarDec),
OPCODE(o6_wordVarDec),
/* 58 */
@@ -169,7 +169,7 @@ void ScummEngine_v7he::setupOpcodes() {
/* 5C */
OPCODE(o6_if),
OPCODE(o6_ifNot),
- OPCODE(o7_startScript),
+ OPCODE(o6_startScript),
OPCODE(o6_startScriptQuick),
/* 60 */
OPCODE(o6_startObject),
@@ -257,7 +257,7 @@ void ScummEngine_v7he::setupOpcodes() {
OPCODE(o6_getActorElevation),
OPCODE(o6_getVerbEntrypoint),
/* A4 */
- OPCODE(o7_arrayOps),
+ OPCODE(o6_arrayOps),
OPCODE(o6_saveRestoreVerbs),
OPCODE(o6_drawBox),
OPCODE(o6_pop),
@@ -287,7 +287,7 @@ void ScummEngine_v7he::setupOpcodes() {
OPCODE(o6_talkActor),
OPCODE(o6_talkEgo),
/* BC */
- OPCODE(o7_dimArray),
+ OPCODE(o6_dimArray),
OPCODE(o6_dummy),
OPCODE(o6_startObjectQuick),
OPCODE(o6_startScriptQuick2),
@@ -318,7 +318,7 @@ void ScummEngine_v7he::setupOpcodes() {
OPCODE(o6_invalid),
/* D4 */
OPCODE(o6_shuffle),
- OPCODE(o7_jumpToScript),
+ OPCODE(o6_jumpToScript),
OPCODE(o6_band),
OPCODE(o6_bor),
/* D8 */
@@ -386,59 +386,11 @@ const char *ScummEngine_v7he::getOpcodeDesc(byte i) {
}
-void ScummEngine_v7he::o7_objectX() {
- if (_heversion <= 71) {
- o6_invalid();
- }
-
- int object = pop();
- int objnum = getObjectIndex(object);
-
- if (objnum == -1) {
- push(0);
- return;
- }
-
- push(_objs[objnum].x_pos);
-}
-
-
-void ScummEngine_v7he::o7_objectY() {
- if (_heversion <= 71) {
- o6_invalid();
- }
-
- int object = pop();
- int objnum = getObjectIndex(object);
-
- if (objnum == -1) {
- push(0);
- return;
- }
-
- push(_objs[objnum].y_pos);
-}
-
-void ScummEngine_v7he::o7_getString() {
- int len;
-
- len = resStrLen(_scriptPointer);
- warning("stub o7_getString(\"%s\")", _scriptPointer);
- _scriptPointer += len;
- fetchScriptWord();
- fetchScriptWord();
-}
-
void ScummEngine_v7he::o7_unknownFA() {
- int len, a = fetchScriptByte();
-
- if (_heversion <= 71) {
- len = resStrLen(_scriptPointer);
- warning("stub o7_unknownFA(%d, \"%s\")", a, _scriptPointer);
- _scriptPointer += len + 1;
- } else {
- warning("stub o7_unknownFA(%d)", a);
- }
+ int num = fetchScriptByte();
+ int len = resStrLen(_scriptPointer);
+ warning("stub o7_unknownFA(%d, \"%s\")", num, _scriptPointer);
+ _scriptPointer += len + 1;
}
void ScummEngine_v7he::o7_stringLen() {
@@ -455,11 +407,7 @@ void ScummEngine_v7he::o7_stringLen() {
return;
}
- if (_gameId == GID_FREDDEMO) {
- len = strlen((char *)getStringAddress(a));
- } else { // FREDDI, PUTTMOON
- len = stringLen(addr);
- }
+ len = stringLen(addr);
push(len);
}
@@ -496,22 +444,14 @@ void ScummEngine_v7he::o7_readINI() {
int retval;
// we pretend that we don't have .ini file
- if (_heversion <= 71) {
- len = resStrLen(_scriptPointer);
- _scriptPointer += len + 1;
- type = pop();
- } else {
- type = fetchScriptByte();
- }
-
-
+ len = resStrLen(_scriptPointer);
+ _scriptPointer += len + 1;
+ type = pop();
switch (type) {
case 1: // number
- case 6: // HE 7.2
push(0);
break;
case 2: // string
- case 7: // HE 7.2
defineArray(0, kStringArray, 0, 0);
retval = readVar(0);
writeArray(0, 0, 0, 0);
@@ -523,54 +463,34 @@ void ScummEngine_v7he::o7_readINI() {
}
void ScummEngine_v7he::o7_unknownF4() {
- if (_gameId == GID_FREDDEMO) {
- byte b;
- int len;
- b = fetchScriptByte();
-
- switch (b) {
- case 6:
- pop();
- len = resStrLen(_scriptPointer);
- _scriptPointer += len + 1;
- break;
- case 7:
- len = resStrLen(_scriptPointer);
- _scriptPointer += len + 1;
- len = resStrLen(_scriptPointer);
- _scriptPointer += len + 1;
- break;
- }
- } else { // FREDDI, PUTTMOON
- int a, b;
- byte filename1[256], filename2[256];
- int len;
+ int a, b;
+ byte filename1[256], filename2[256];
+ int len;
-
- b = pop();
- a = pop();
+
+ b = pop();
+ a = pop();
- switch (b) {
- case 1:
- addMessageToStack(_scriptPointer, filename1, sizeof(filename1));
+ switch (b) {
+ case 1:
+ addMessageToStack(_scriptPointer, filename1, sizeof(filename1));
- len = resStrLen(_scriptPointer);
- _scriptPointer += len + 1;
- debug(1, "o7_unknownF4(%d, %d, \"%s\")", a, b, filename1);
- break;
- case 2:
- addMessageToStack(_scriptPointer, filename1, sizeof(filename1));
+ len = resStrLen(_scriptPointer);
+ _scriptPointer += len + 1;
+ debug(1, "o7_unknownF4(%d, %d, \"%s\")", a, b, filename1);
+ break;
+ case 2:
+ addMessageToStack(_scriptPointer, filename1, sizeof(filename1));
- len = resStrLen(_scriptPointer);
- _scriptPointer += len + 1;
+ len = resStrLen(_scriptPointer);
+ _scriptPointer += len + 1;
- addMessageToStack(_scriptPointer, filename2, sizeof(filename2));
+ addMessageToStack(_scriptPointer, filename2, sizeof(filename2));
- len = resStrLen(_scriptPointer);
- _scriptPointer += len + 1;
- debug(1, "o7_unknownF4(%d, %d, \"%s\", \"%s\")", a, b, filename1, filename2);
- break;
- }
+ len = resStrLen(_scriptPointer);
+ _scriptPointer += len + 1;
+ debug(1, "o7_unknownF4(%d, %d, \"%s\", \"%s\")", a, b, filename1, filename2);
+ break;
}
warning("o7_unknownF4 stub");
}
@@ -677,118 +597,6 @@ void ScummEngine_v7he::o7_getActorRoom() {
push(getObjectRoom(act));
}
-void ScummEngine_v7he::o7_dimArray() {
- if (_heversion <= 71) {
- ScummEngine_v6::o6_dimArray();
- return;
- }
-
- int data;
- int type = fetchScriptByte();
-
- switch (type) {
- case 5: // SO_INT_ARRAY
- data = kIntArray;
- break;
- case 2: // SO_BIT_ARRAY
- data = kBitArray;
- break;
- case 3: // SO_NIBBLE_ARRAY
- data = kNibbleArray;
- break;
- case 4: // SO_BYTE_ARRAY
- data = kByteArray;
- break;
- case 7: // SO_STRING_ARRAY
- data = kStringArray;
- break;
- case 204: // SO_UNDIM_ARRAY
- nukeArray(fetchScriptWord());
- return;
- default:
- error("o7_dimArray: default case %d", type);
- }
-
- defineArray(fetchScriptWord(), data, 0, pop());
-}
-
-void ScummEngine_v7he::o7_arrayOps() {
- byte subOp = fetchScriptByte();
- int array = fetchScriptWord();
- int b, c, d, len;
- ArrayHeader *ah;
- int list[128];
-
- switch (subOp) {
- case 7: // SO_ASSIGN_STRING
- len = resStrLen(_scriptPointer);
- ah = defineArray(array, kStringArray, 0, len + 1);
- copyScriptString(ah->data);
- break;
- case 205: // SO_ASSIGN_STRING
- b = pop();
- len = resStrLen(_scriptPointer);
- ah = defineArray(array, kStringArray, 0, len + 1);
- copyScriptString(ah->data + b);
- break;
- case 208: // SO_ASSIGN_INT_LIST
- b = pop();
- c = pop();
- d = readVar(array);
- if (d == 0) {
- defineArray(array, kIntArray, 0, b + c);
- }
- while (c--) {
- writeArray(array, 0, b + c, pop());
- }
- break;
- case 212: // SO_ASSIGN_2DIM_LIST
- b = pop();
- len = getStackList(list, ARRAYSIZE(list));
- d = readVar(array);
- if (d == 0)
- error("Must DIM a two dimensional array before assigning");
- c = pop();
- while (--len >= 0) {
- writeArray(array, c, b + len, list[len]);
- }
- break;
- default:
- error("o7_arrayOps: default case %d (array %d)", subOp, array);
- }
-}
-
-void ScummEngine_v7he::o7_jumpToScript() {
- if (_heversion <= 71) {
- ScummEngine_v6::o6_jumpToScript();
- return;
- }
- int args[16];
- int script, flags;
-
- getStackList(args, ARRAYSIZE(args));
- script = pop();
- flags = fetchScriptByte();
- stopObjectCode();
- runScript(script, (flags == 199 || flags == 200), (flags == 195 || flags == 200), args);
-}
-
-void ScummEngine_v7he::o7_startScript() {
- if (_heversion <= 71) {
- ScummEngine_v6::o6_startScript();
- return;
- }
-
- int args[16];
- int script, flags;
-
- getStackList(args, ARRAYSIZE(args));
- script = pop();
- flags = fetchScriptByte();
-
- runScript(script, (flags == 199 || flags == 200), (flags == 195 || flags == 200), args);
-}
-
void ScummEngine_v7he::o7_startSound() {
byte op;
op = fetchScriptByte();
@@ -885,7 +693,7 @@ void ScummEngine_v7he::o7_cursorCommand() {
setCursorTransparency(pop());
break;
default:
- error("o6_cursorCommand: default case %x", subOp);
+ error("o7_cursorCommand: default case %x", subOp);
}
VAR(VAR_CURSORSTATE) = _cursor.state;