Add some missing code for HE100.

Cleanup

svn-id: r15494
This commit is contained in:
Travis Howell 2004-10-10 01:52:35 +00:00
parent 873fecd67d
commit 8df034b6ac
8 changed files with 154 additions and 85 deletions

View file

@ -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();

View file

@ -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) {

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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

View file

@ -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;
}