aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h5
-rw-r--r--scumm/script_v100he.cpp133
-rw-r--r--scumm/script_v6.cpp10
-rw-r--r--scumm/script_v6he.cpp10
-rw-r--r--scumm/script_v72he.cpp44
-rw-r--r--scumm/script_v7he.cpp33
-rw-r--r--scumm/script_v80he.cpp2
-rw-r--r--scumm/scumm.cpp2
8 files changed, 154 insertions, 85 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 6d36f711f5..3d9662fccf 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -612,7 +612,7 @@ protected:
Win32ResExtractor *_win32ResExtractor;
- int _heSndSoundFreq, _heSndOffset, _heSndChannel, _heSndSoundId, _heSndLoop;
+ int _heSndSoundFreq, _heSndOffset, _heSndChannel, _heSndSoundId, _heSndFlags;
public:
ScummEngine_v70he(GameDetector *detector, OSystem *syst, const ScummGameSettings &gs, uint8 md5sum[16]);
@@ -909,6 +909,8 @@ protected:
const char *desc;
};
+ int _heResId, _heResType;
+
const OpcodeEntryV100he *_opcodesV100he;
public:
@@ -938,6 +940,7 @@ protected:
void o100_quitPauseRestart();
void o100_cursorCommand();
void o100_wait();
+ void o100_getResourceSize();
void o100_unknown27();
void o100_getPaletteData();
void o100_unknown25();
diff --git a/scumm/script_v100he.cpp b/scumm/script_v100he.cpp
index 79b6e617c9..0b796a8cce 100644
--- a/scumm/script_v100he.cpp
+++ b/scumm/script_v100he.cpp
@@ -272,7 +272,7 @@ void ScummEngine_v100he::setupOpcodes() {
OPCODE(o72_getNumFreeArrays),
OPCODE(o72_getArrayDimSize),
OPCODE(o72_checkGlobQueue),
- OPCODE(o72_getResourceSize),
+ OPCODE(o100_getResourceSize),
/* B8 */
OPCODE(o100_unknown27),
OPCODE(o6_invalid),
@@ -381,11 +381,11 @@ void ScummEngine_v100he::o100_actorOps() {
Actor *a;
int i, j, k;
int args[32];
- byte b;
+ byte subOp;
byte string[256];
- b = fetchScriptByte();
- if (b == 129) {
+ subOp = fetchScriptByte();
+ if (subOp == 129) {
_curActor = pop();
return;
}
@@ -394,7 +394,7 @@ void ScummEngine_v100he::o100_actorOps() {
if (!a)
return;
- switch (b) {
+ switch (subOp) {
case 3:
pop();
pop();
@@ -574,7 +574,7 @@ void ScummEngine_v100he::o100_actorOps() {
a->_walkFrame = pop();
break;
default:
- error("o100_actorOps: default case %d", b);
+ error("o100_actorOps: default case %d", subOp);
}
}
@@ -890,43 +890,59 @@ void ScummEngine_v100he::o100_unknown28() {
void ScummEngine_v100he::o100_resourceRoutines() {
// Incomplete
- int resid, op;
- op = fetchScriptByte();
+ int obj, room;
- switch (op) {
+ byte subOp = fetchScriptByte();
+
+ switch (subOp) {
case 14:
- // charset
- resid = pop();
+ _heResType = rtCharset;
+ _heResId = pop();
break;
case 25:
- // costume
- resid = pop();
+ _heResType = rtCostume;
+ _heResId = pop();
break;
case 34:
- // flobject
- resid = pop();
+ _heResType = rtFlObject;
+ _heResId = pop();
break;
case 40:
- // image
- resid = pop();
+ _heResType = rtImage;
+ _heResId = pop();
+ break;
+ case 47:
+ if (_heResType == rtFlObject) {
+ obj = _heResId;
+ room= getObjectRoom(obj);
+ loadFlObject(obj, room);
+ } else if (_heResType == rtCharset) {
+ loadCharset(_heResId);
+ }
break;
case 62:
- // room
- resid = pop();
+ _heResType = rtRoom;
+ _heResId = pop();
break;
case 66:
- // script
- resid = pop();
+ _heResType = rtScript;
+ _heResId = pop();
break;
case 72:
- // sound
- resid = pop();
+ _heResType = rtSound;
+ _heResId = pop();
break;
case 128:
- // lock
+ // lock?
+ break;
+ case 133:
+ if (_heResType == rtCharset)
+ nukeCharset(_heResId);
+ else
+ nukeResource(_heResType, _heResId);
break;
default:
- debug(1,"o100_resourceRoutines: default case %d", op);
+ debug(1,"o100_resourceRoutines: default case %d", subOp);
}
}
@@ -947,6 +963,15 @@ void ScummEngine_v100he::o100_wizImageOps() {
_wizParams.img.y1 = pop();
_wizParams.img.x1 = pop();
break;
+ case 11:
+ _wizParams.processFlags |= 0x300;
+ _wizParams.processMode = 2;
+ _wizParams.box.bottom = pop();
+ _wizParams.box.right = pop();
+ _wizParams.box.top = pop();
+ _wizParams.box.left = pop();
+ _wizParams.unk_148 = pop();
+ break;
case 29:
_wizParams.processMode = 1;
break;
@@ -1180,29 +1205,28 @@ void ScummEngine_v100he::o100_roomOps() {
}
void ScummEngine_v100he::o100_startSound() {
- byte op;
- op = fetchScriptByte();
+ byte subOp = fetchScriptByte();
- switch (op) {
+ switch (subOp) {
case 6:
- _heSndLoop |= 16;
+ _heSndFlags |= 16;
pop();
break;
case 92:
_sound->addSoundToQueue(_heSndSoundId, _heSndOffset);
break;
case 128:
- _heSndLoop |= 2;
+ _heSndFlags |= 2;
break;
case 129:
_heSndChannel = pop();
break;
case 130:
- _heSndLoop |= 40;
+ _heSndFlags |= 40;
pop();
break;
case 131:
- _heSndLoop |= 4;
+ _heSndFlags |= 4;
break;
case 132:
case 134:
@@ -1212,18 +1236,18 @@ void ScummEngine_v100he::o100_startSound() {
_heSndChannel = VAR(VAR_MUSIC_CHANNEL);
break;
case 133:
- _heSndLoop |= 80;
+ _heSndFlags |= 80;
pop();
break;
case 135:
- _heSndLoop |= 4;
+ _heSndFlags |= 4;
break;
case 136:
- _heSndLoop |= 20;
+ _heSndFlags |= 20;
pop();
break;
default:
- error("o100_startSound invalid case %d", op);
+ error("o100_startSound invalid case %d", subOp);
}
}
@@ -1449,6 +1473,43 @@ void ScummEngine_v100he::o100_wait() {
o6_breakHere();
}
+void ScummEngine_v100he::o100_getResourceSize() {
+ int size = 0, type;
+
+ int idx = pop();
+ byte subOp = fetchScriptByte();
+
+ switch (subOp) {
+ case 25:
+ type = rtCostume;
+ break;
+ case 40:
+ type = rtImage;
+ break;
+ case 62:
+ type = rtRoomImage;
+ break;
+ case 66:
+ type = rtScript;
+ break;
+ case 72:
+ if (idx > _numSounds) {
+ // TODO Music resource size
+ push(100);
+ return;
+ }
+ type = rtSound;
+ break;
+ default:
+ error("o100_getResourceSize: default type %d", subOp);
+ }
+
+ const byte *ptr = getResourceAddress(type, idx);
+ if (ptr)
+ size = READ_BE_UINT32(ptr + 4) - 8;
+ push(size);
+}
+
void ScummEngine_v100he::o100_unknown27() {
byte subOp = fetchScriptByte();
switch (subOp) {
diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp
index 5c9fce7ec9..b02cd0e484 100644
--- a/scumm/script_v6.cpp
+++ b/scumm/script_v6.cpp
@@ -1765,10 +1765,10 @@ void ScummEngine_v6::o6_actorOps() {
Actor *a;
int i, j, k;
int args[8];
- byte b;
+ byte subOp;
- b = fetchScriptByte();
- if (b == 197) {
+ subOp = fetchScriptByte();
+ if (subOp == 197) {
_curActor = pop();
return;
}
@@ -1777,7 +1777,7 @@ void ScummEngine_v6::o6_actorOps() {
if (!a)
return;
- switch (b) {
+ switch (subOp) {
case 76: // SO_COSTUME
a->setActorCostume(pop());
break;
@@ -1911,7 +1911,7 @@ void ScummEngine_v6::o6_actorOps() {
a->talkScript = pop();
break;
default:
- error("o6_actorOps: default case %d", b);
+ error("o6_actorOps: default case %d", subOp);
}
}
diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp
index 245ac464a0..e6119506ed 100644
--- a/scumm/script_v6he.cpp
+++ b/scumm/script_v6he.cpp
@@ -595,10 +595,10 @@ void ScummEngine_v60he::o60_actorOps() {
Actor *a;
int i, j, k;
int args[8];
- byte b;
+ byte subOp;
- b = fetchScriptByte();
- if (b == 197) {
+ subOp = fetchScriptByte();
+ if (subOp == 197) {
_curActor = pop();
return;
}
@@ -607,7 +607,7 @@ void ScummEngine_v60he::o60_actorOps() {
if (!a)
return;
- switch (b) {
+ switch (subOp) {
case 30:
// _heversion >= 70
_actorClipOverride.bottom = pop();
@@ -762,7 +762,7 @@ void ScummEngine_v60he::o60_actorOps() {
break;
}
default:
- error("o60_actorOps: default case %d", b);
+ error("o60_actorOps: default case %d", subOp);
}
}
diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp
index 8efe5e3135..eb7c85c12b 100644
--- a/scumm/script_v72he.cpp
+++ b/scumm/script_v72he.cpp
@@ -846,7 +846,7 @@ void ScummEngine_v72he::o72_startObject() {
}
void ScummEngine_v72he::o72_drawObject() {
- int subOp = fetchScriptByte();
+ byte subOp = fetchScriptByte();
int state = 0, y = -1, x = -1;
switch (subOp) {
@@ -895,7 +895,7 @@ void ScummEngine_v72he::o72_printWizImage() {
}
void ScummEngine_v72he::o72_getArrayDimSize() {
- int subOp = fetchScriptByte();
+ byte subOp = fetchScriptByte();
int32 val1, val2;
ArrayHeader *ah = (ArrayHeader *)getResourceAddress(rtString, readVar(fetchScriptWord()));
if (!ah) {
@@ -1047,11 +1047,11 @@ void ScummEngine_v72he::o72_actorOps() {
Actor *a;
int i, j, k;
int args[32];
- byte b;
+ byte subOp;
byte string[256];
- b = fetchScriptByte();
- if (b == 197) {
+ subOp = fetchScriptByte();
+ if (subOp == 197) {
_curActor = pop();
return;
}
@@ -1060,7 +1060,7 @@ void ScummEngine_v72he::o72_actorOps() {
if (!a)
return;
- switch (b) {
+ switch (subOp) {
case 21: // HE 80+
k = getStackList(args, ARRAYSIZE(args));
for (i = 0; i < k; ++i) {
@@ -1245,7 +1245,7 @@ void ScummEngine_v72he::o72_actorOps() {
break;
}
default:
- error("o72_actorOps: default case %d", b);
+ error("o72_actorOps: default case %d", subOp);
}
}
@@ -1995,7 +1995,7 @@ int ScummEngine_v72he::readFileToArray(int slot, int32 size) {
void ScummEngine_v72he::o72_readFile() {
int slot, val;
int32 size;
- int subOp = fetchScriptByte();
+ byte subOp = fetchScriptByte();
switch (subOp) {
case 4:
@@ -2037,7 +2037,7 @@ void ScummEngine_v72he::writeFileFromArray(int slot, int resID) {
void ScummEngine_v72he::o72_writeFile() {
int16 resID = pop();
int slot = pop();
- int subOp = fetchScriptByte();
+ byte subOp = fetchScriptByte();
switch (subOp) {
case 4:
@@ -2092,12 +2092,10 @@ void ScummEngine_v72he::o72_deleteFile() {
void ScummEngine_v72he::o72_getPixel() {
byte area;
+
int x = pop();
int y = pop();
- int subOp = fetchScriptByte();
-
- if (subOp != 218 && subOp != 219)
- return;
+ byte subOp = fetchScriptByte();
VirtScreen *vs = findVirtScreen(y);
if (vs == NULL || x > _screenWidth - 1 || x < 0) {
@@ -2105,10 +2103,16 @@ void ScummEngine_v72he::o72_getPixel() {
return;
}
- if (subOp == 218)
+ switch (subOp) {
+ case 218:
area = *vs->getBackPixels(x, y - vs->topline);
- else
+ break;
+ case 219:
area = *vs->getPixels(x, y - vs->topline);
+ break;
+ default:
+ error("o72_getPixel: default case %d", subOp);
+ }
push(area);
}
@@ -2155,12 +2159,12 @@ void ScummEngine_v72he::o72_pickVarRandom() {
}
void ScummEngine_v72he::o72_redimArray() {
- int subcode, newX, newY;
+ int newX, newY;
newY = pop();
newX = pop();
- subcode = fetchScriptByte();
- switch (subcode) {
+ byte subOp = fetchScriptByte();
+ switch (subOp) {
case 5:
redimArray(fetchScriptWord(), 0, newX, 0, newY, kIntArray);
break;
@@ -2171,7 +2175,7 @@ void ScummEngine_v72he::o72_redimArray() {
redimArray(fetchScriptWord(), 0, newX, 0, newY, kDwordArray);
break;
default:
- error("o72_redimArray: default type %d", subcode);
+ error("o72_redimArray: default type %d", subOp);
}
}
@@ -2321,7 +2325,7 @@ void ScummEngine_v72he::o72_unknownF1() {
}
void ScummEngine_v72he::o72_checkGlobQueue() {
- int subOp = fetchScriptByte();
+ byte subOp = fetchScriptByte();
int idx = pop();
debug(1,"o72_checkGlobQueue stub (%d, %d)", subOp, idx);
diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp
index 31c648fa5c..24c75858b0 100644
--- a/scumm/script_v7he.cpp
+++ b/scumm/script_v7he.cpp
@@ -405,21 +405,20 @@ void ScummEngine_v70he::arrrays_unk2(int dst, int src, int len2, int len) {
}
void ScummEngine_v70he::o70_startSound() {
- byte op;
- op = fetchScriptByte();
+ byte subOp = fetchScriptByte();
- switch (op) {
+ switch (subOp) {
case 9:
- _heSndLoop |= 4;
+ _heSndFlags |= 4;
break;
case 23:
debug(1,"o70_startSound: case 29 (%d, %d, %d)", pop(), pop(), pop());
break;
case 56:
- _heSndLoop |= 2;
+ _heSndFlags |= 2;
break;
case 164:
- _heSndLoop |= 2;
+ _heSndFlags |= 2;
break;
case 224:
_heSndSoundFreq = pop();
@@ -441,18 +440,18 @@ void ScummEngine_v70he::o70_startSound() {
break;
case 245:
- _heSndLoop |= 1;
+ _heSndFlags |= 1;
break;
case 255:
- // _sound->addSoundToQueue(_heSndSoundId, _heSndOffset, _heSndChannel, _heSndLoop);
+ // _sound->addSoundToQueue(_heSndSoundId, _heSndOffset, _heSndChannel, _heSndFlags);
_sound->addSoundToQueue(_heSndSoundId, _heSndOffset);
- debug(2, "o70_startSound stub (%d, %d, %d, %d)", _heSndSoundId, _heSndOffset, _heSndChannel, _heSndLoop);
- _heSndLoop = 0;
+ debug(2, "o70_startSound stub (%d, %d, %d, %d)", _heSndSoundId, _heSndOffset, _heSndChannel, _heSndFlags);
+ _heSndFlags = 0;
break;
default:
- error("o70_startSound invalid case %d", op);
+ error("o70_startSound invalid case %d", subOp);
}
}
@@ -618,7 +617,7 @@ void ScummEngine_v70he::o70_quitPauseRestart() {
byte subOp = fetchScriptByte();
int par1;
- switch (subOp & 0xff) {
+ switch (subOp) {
case 22: // HE80+
clearDrawObjectQueue();
break;
@@ -909,13 +908,13 @@ void ScummEngine_v70he::o70_unknownFA() {
}
void ScummEngine_v70he::o70_polygonOps() {
- byte b;
- b = fetchScriptByte();
int vert1x, vert1y, vert2x, vert2y, vert3x, vert3y, vert4x, vert4y;
int id;
int fromId, toId;
- switch (b) {
+ byte subOp = fetchScriptByte();
+
+ switch (subOp) {
case 68: // HE 100
case 69: // HE 100
case 246:
@@ -930,7 +929,7 @@ void ScummEngine_v70he::o70_polygonOps() {
vert1x = pop();
id = pop();
- polygonStore(id, (b == 69 || b == 248), vert1x, vert1y, vert2x, vert2y, vert3x, vert3y,
+ polygonStore(id, (subOp == 69 || subOp == 248), vert1x, vert1y, vert2x, vert2y, vert3x, vert3y,
vert4x, vert4y);
break;
case 28: // HE 100
@@ -940,6 +939,8 @@ void ScummEngine_v70he::o70_polygonOps() {
polygonErase(fromId, toId);
break;
+ default:
+ error("o70_polygonOps: default case %d", subOp);
}
}
diff --git a/scumm/script_v80he.cpp b/scumm/script_v80he.cpp
index 33a14c975d..331589d93c 100644
--- a/scumm/script_v80he.cpp
+++ b/scumm/script_v80he.cpp
@@ -500,7 +500,7 @@ void ScummEngine_v80he::o80_writeConfigFile() {
void ScummEngine_v80he::o80_cursorCommand() {
int a, i;
int args[16];
- int subOp = fetchScriptByte();
+ byte subOp = fetchScriptByte();
switch (subOp) {
case 0x13: // Loads cursors from another resource
diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp
index 4e4300e46a..18080a55a3 100644
--- a/scumm/scumm.cpp
+++ b/scumm/scumm.cpp
@@ -1011,7 +1011,7 @@ ScummEngine_v70he::ScummEngine_v70he(GameDetector *detector, OSystem *syst, cons
_heSndSoundId = 0;
_heSndOffset = 0;
_heSndChannel = 0;
- _heSndLoop = 0;
+ _heSndFlags = 0;
_heSndSoundFreq = 0;
}