Add some missing code for HE100.
Cleanup svn-id: r15494
This commit is contained in:
parent
873fecd67d
commit
8df034b6ac
8 changed files with 154 additions and 85 deletions
|
@ -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();
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue