mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-15 06:08:35 +00:00
update for scumm v2
svn-id: r7137
This commit is contained in:
parent
1b5cac75f5
commit
6bd3454ae5
@ -252,6 +252,46 @@ protected:
|
||||
void o2_equalZero();
|
||||
void o2_notEqualZero();
|
||||
void o2_startScript();
|
||||
void o2_panCameraTo();
|
||||
void o2_move();
|
||||
void o2_startMusic();
|
||||
void o2_getActorRoom();
|
||||
void o2_getActorElevation();
|
||||
void o2_walkActorToActor();
|
||||
void o2_walkActorToObject();
|
||||
void o2_faceActor();
|
||||
void o2_putActorAtObject();
|
||||
void o2_getObjectOwner();
|
||||
void o2_animateActor();
|
||||
void o2_print();
|
||||
void o2_actorFromPos();
|
||||
void o2_getVerbEntrypoint();
|
||||
void o2_isScriptRunning();
|
||||
void o2_getRandomNr();
|
||||
void o2_startSound();
|
||||
void o2_getAnimCounter();
|
||||
void o2_saveLoadGame();
|
||||
void o2_getActorX();
|
||||
void o2_getActorY();
|
||||
void o2_loadRoomWithEgo();
|
||||
void o2_setVarRange();
|
||||
void o2_setOwnerOf();
|
||||
void o2_delayVariable();
|
||||
void o2_putActorInRoom();
|
||||
void o2_matrixOps();
|
||||
void o2_setCameraAt();
|
||||
void o2_roomOps();
|
||||
void o2_getDist();
|
||||
void o2_findObject();
|
||||
void o2_subtract();
|
||||
void o2_cutscene();
|
||||
void o2_increment();
|
||||
void o2_chainScript();
|
||||
void o2_pickupObject();
|
||||
void o2_actorFollowCamera();
|
||||
void o2_setObjectName();
|
||||
void o2_getActorMoving();
|
||||
void o2_add();
|
||||
};
|
||||
|
||||
class Scumm_v4 : public Scumm_v3 {
|
||||
|
@ -837,7 +837,7 @@ byte *Scumm::getObjOrActorName(int obj) {
|
||||
objptr = getOBCDFromObject(obj);
|
||||
if (objptr)
|
||||
if (_features & GF_OLD_BUNDLE)
|
||||
offset = READ_LE_UINT16(objptr + 20);
|
||||
offset = *(objptr + 20);
|
||||
else
|
||||
offset = READ_LE_UINT16(objptr + 18);
|
||||
return (objptr + offset);
|
||||
|
@ -473,12 +473,6 @@ void Scumm::writeVar(uint var, int value) {
|
||||
void Scumm::getResultPos() {
|
||||
int a;
|
||||
|
||||
// FIXME: Subclass this properly
|
||||
if (_features & GF_AFTER_V2) {
|
||||
_resultVarNumber = fetchScriptByte();
|
||||
return;
|
||||
}
|
||||
|
||||
_resultVarNumber = fetchScriptWord();
|
||||
if (_resultVarNumber & 0x2000) {
|
||||
a = fetchScriptWord();
|
||||
|
@ -35,126 +35,126 @@ void Scumm_v2::setupOpcodes() {
|
||||
/* 00 */
|
||||
OPCODE(o5_stopObjectCode),
|
||||
OPCODE(o2_putActor),
|
||||
OPCODE(o5_startMusic),
|
||||
OPCODE(o5_getActorRoom),
|
||||
OPCODE(o2_startMusic),
|
||||
OPCODE(o2_getActorRoom),
|
||||
/* 04 */
|
||||
OPCODE(o2_isGreaterEqual),
|
||||
OPCODE(o2_drawObject),
|
||||
OPCODE(o5_getActorElevation),
|
||||
OPCODE(o2_getActorElevation),
|
||||
OPCODE(o2_setState08),
|
||||
/* 08 */
|
||||
OPCODE(o5_isNotEqual),
|
||||
OPCODE(o5_faceActor),
|
||||
OPCODE(o2_isNotEqual),
|
||||
OPCODE(o2_faceActor),
|
||||
OPCODE(o2_assignVarWordDirect),
|
||||
OPCODE(o2_setObjY),
|
||||
/* 0C */
|
||||
OPCODE(o2_resourceRoutines),
|
||||
OPCODE(o5_walkActorToActor),
|
||||
OPCODE(o5_putActorAtObject),
|
||||
OPCODE(o2_walkActorToActor),
|
||||
OPCODE(o2_putActorAtObject),
|
||||
OPCODE(o2_ifNotState08),
|
||||
/* 10 */
|
||||
OPCODE(o5_getObjectOwner),
|
||||
OPCODE(o5_animateActor),
|
||||
OPCODE(o5_panCameraTo),
|
||||
OPCODE(o2_getObjectOwner),
|
||||
OPCODE(o2_animateActor),
|
||||
OPCODE(o2_panCameraTo),
|
||||
OPCODE(o2_actorSet),
|
||||
/* 14 */
|
||||
OPCODE(o5_print),
|
||||
OPCODE(o5_actorFromPos),
|
||||
OPCODE(o5_getRandomNr),
|
||||
OPCODE(o2_print),
|
||||
OPCODE(o2_actorFromPos),
|
||||
OPCODE(o2_getRandomNr),
|
||||
OPCODE(o2_setState04),
|
||||
/* 18 */
|
||||
OPCODE(o5_jumpRelative),
|
||||
OPCODE(o5_doSentence),
|
||||
OPCODE(o5_move),
|
||||
OPCODE(o2_doSentence),
|
||||
OPCODE(o2_move),
|
||||
OPCODE(o2_setBitVar),
|
||||
/* 1C */
|
||||
OPCODE(o5_startSound),
|
||||
OPCODE(o2_startSound),
|
||||
OPCODE(o2_ifClassOfIs),
|
||||
OPCODE(o5_walkActorTo),
|
||||
OPCODE(o2_walkActorTo),
|
||||
OPCODE(o2_ifState02),
|
||||
/* 20 */
|
||||
OPCODE(o5_stopMusic),
|
||||
OPCODE(o2_putActor),
|
||||
OPCODE(o5_getAnimCounter),
|
||||
OPCODE(o5_getActorY),
|
||||
OPCODE(o2_saveLoadGame),
|
||||
OPCODE(o2_getActorY),
|
||||
/* 24 */
|
||||
OPCODE(o5_loadRoomWithEgo),
|
||||
OPCODE(o5_pickupObject),
|
||||
OPCODE(o5_setVarRange),
|
||||
OPCODE(o2_loadRoomWithEgo),
|
||||
OPCODE(o2_drawObject),
|
||||
OPCODE(o2_setVarRange),
|
||||
OPCODE(o2_ifNotState04),
|
||||
/* 28 */
|
||||
OPCODE(o2_equalZero),
|
||||
OPCODE(o5_setOwnerOf),
|
||||
OPCODE(o2_setOwnerOf),
|
||||
OPCODE(o2_addDirect),
|
||||
OPCODE(o5_delayVariable),
|
||||
OPCODE(o2_delayVariable),
|
||||
/* 2C */
|
||||
OPCODE(o2_ifNotState04),
|
||||
OPCODE(o5_putActorInRoom),
|
||||
OPCODE(o5_delay),
|
||||
OPCODE(o2_assignVarByte),
|
||||
OPCODE(o2_putActorInRoom),
|
||||
OPCODE(o5_delay),
|
||||
OPCODE(o2_ifNotState04),
|
||||
/* 30 */
|
||||
OPCODE(o5_matrixOps),
|
||||
OPCODE(o2_matrixOps),
|
||||
OPCODE(o2_getBitVar),
|
||||
OPCODE(o5_setCameraAt),
|
||||
OPCODE(o5_roomOps),
|
||||
OPCODE(o2_setCameraAt),
|
||||
OPCODE(o2_roomOps),
|
||||
/* 34 */
|
||||
OPCODE(o5_getDist),
|
||||
OPCODE(o5_findObject),
|
||||
OPCODE(o5_walkActorToObject),
|
||||
OPCODE(o2_getDist),
|
||||
OPCODE(o2_findObject),
|
||||
OPCODE(o2_walkActorToObject),
|
||||
OPCODE(o2_setState01),
|
||||
/* 38 */
|
||||
OPCODE(o2_lessOrEqual),
|
||||
OPCODE(o5_doSentence),
|
||||
OPCODE(o5_subtract),
|
||||
OPCODE(o2_doSentence),
|
||||
OPCODE(o2_subtract),
|
||||
OPCODE(o2_waitForActor),
|
||||
/* 3C */
|
||||
OPCODE(o5_stopSound),
|
||||
OPCODE(o5_getActorElevation),
|
||||
OPCODE(o2_getActorElevation),
|
||||
OPCODE(o2_walkActorTo),
|
||||
OPCODE(o2_ifNotState01),
|
||||
/* 40 */
|
||||
OPCODE(o5_cutscene),
|
||||
OPCODE(o2_cutscene),
|
||||
OPCODE(o2_putActor),
|
||||
OPCODE(o2_startScript),
|
||||
OPCODE(o5_getActorX),
|
||||
OPCODE(o2_getActorX),
|
||||
/* 44 */
|
||||
OPCODE(o2_isLess),
|
||||
OPCODE(o2_drawObject),
|
||||
OPCODE(o5_increment),
|
||||
OPCODE(o2_increment),
|
||||
OPCODE(o2_setState08),
|
||||
/* 48 */
|
||||
OPCODE(o2_isEqual),
|
||||
OPCODE(o5_faceActor),
|
||||
OPCODE(o5_chainScript),
|
||||
OPCODE(o2_faceActor),
|
||||
OPCODE(o2_chainScript),
|
||||
OPCODE(o2_setObjY),
|
||||
/* 4C */
|
||||
OPCODE(o2_waitForSentence),
|
||||
OPCODE(o5_walkActorToActor),
|
||||
OPCODE(o5_putActorAtObject),
|
||||
OPCODE(o2_walkActorToActor),
|
||||
OPCODE(o2_putActorAtObject),
|
||||
OPCODE(o2_ifState08),
|
||||
/* 50 */
|
||||
OPCODE(o5_pickupObjectOld),
|
||||
OPCODE(o5_animateActor),
|
||||
OPCODE(o5_actorFollowCamera),
|
||||
OPCODE(o2_pickupObject),
|
||||
OPCODE(o2_animateActor),
|
||||
OPCODE(o2_actorFollowCamera),
|
||||
OPCODE(o2_actorSet),
|
||||
/* 54 */
|
||||
OPCODE(o5_setObjectName),
|
||||
OPCODE(o5_actorFromPos),
|
||||
OPCODE(o5_getActorMoving),
|
||||
OPCODE(o2_setObjectName),
|
||||
OPCODE(o2_actorFromPos),
|
||||
OPCODE(o2_getActorMoving),
|
||||
OPCODE(o2_setState02),
|
||||
/* 58 */
|
||||
OPCODE(beginOverride),
|
||||
OPCODE(o5_doSentence),
|
||||
OPCODE(o5_add),
|
||||
OPCODE(o2_doSentence),
|
||||
OPCODE(o2_add),
|
||||
OPCODE(o2_setBitVar),
|
||||
/* 5C */
|
||||
OPCODE(o5_oldRoomEffect),
|
||||
OPCODE(o5_dummy),
|
||||
OPCODE(o2_ifClassOfIs),
|
||||
OPCODE(o2_walkActorTo),
|
||||
OPCODE(o2_ifNotState02),
|
||||
/* 60 */
|
||||
OPCODE(o5_cursorCommand),
|
||||
OPCODE(o5_putActor),
|
||||
OPCODE(o2_putActor),
|
||||
OPCODE(o5_stopScript),
|
||||
OPCODE(o5_getActorFacing),
|
||||
/* 64 */
|
||||
@ -164,71 +164,71 @@ void Scumm_v2::setupOpcodes() {
|
||||
OPCODE(o2_clearState04),
|
||||
/* 68 */
|
||||
OPCODE(o5_isScriptRunning),
|
||||
OPCODE(o5_setOwnerOf),
|
||||
OPCODE(o2_setOwnerOf),
|
||||
OPCODE(o2_subDirect),
|
||||
OPCODE(o5_dummy),
|
||||
/* 6C */
|
||||
OPCODE(o2_getObjY),
|
||||
OPCODE(o5_putActorInRoom),
|
||||
OPCODE(o2_putActorInRoom),
|
||||
OPCODE(o5_dummy),
|
||||
OPCODE(o2_ifState04),
|
||||
/* 70 */
|
||||
OPCODE(o5_lights),
|
||||
OPCODE(o5_getActorCostume),
|
||||
OPCODE(o5_loadRoom),
|
||||
OPCODE(o5_roomOps),
|
||||
OPCODE(o2_roomOps),
|
||||
/* 74 */
|
||||
OPCODE(o5_getDist),
|
||||
OPCODE(o5_findObject),
|
||||
OPCODE(o5_walkActorToObject),
|
||||
OPCODE(o2_getDist),
|
||||
OPCODE(o2_findObject),
|
||||
OPCODE(o2_walkActorToObject),
|
||||
OPCODE(o2_clearState01),
|
||||
/* 78 */
|
||||
OPCODE(o2_isGreater),
|
||||
OPCODE(o5_doSentence),
|
||||
OPCODE(o2_doSentence),
|
||||
OPCODE(o2_verbOps),
|
||||
OPCODE(o5_getActorWalkBox),
|
||||
/* 7C */
|
||||
OPCODE(o5_isSoundRunning),
|
||||
OPCODE(o5_getActorElevation),
|
||||
OPCODE(o2_getActorElevation),
|
||||
OPCODE(o2_walkActorTo),
|
||||
OPCODE(o2_ifNotState01),
|
||||
/* 80 */
|
||||
OPCODE(o5_breakHere),
|
||||
OPCODE(o2_putActor),
|
||||
OPCODE(o5_startMusic),
|
||||
OPCODE(o5_getActorRoom),
|
||||
OPCODE(o2_startMusic),
|
||||
OPCODE(o2_getActorRoom),
|
||||
/* 84 */
|
||||
OPCODE(o2_isGreaterEqual),
|
||||
OPCODE(o2_drawObject),
|
||||
OPCODE(o5_getActorElevation),
|
||||
OPCODE(o2_getActorElevation),
|
||||
OPCODE(o2_setState08),
|
||||
/* 88 */
|
||||
OPCODE(o2_isNotEqual),
|
||||
OPCODE(o5_faceActor),
|
||||
OPCODE(o2_faceActor),
|
||||
OPCODE(o2_assignVarWordDirect),
|
||||
OPCODE(o2_setObjY),
|
||||
/* 8C */
|
||||
OPCODE(o2_resourceRoutines),
|
||||
OPCODE(o5_walkActorToActor),
|
||||
OPCODE(o5_putActorAtObject),
|
||||
OPCODE(o2_walkActorToActor),
|
||||
OPCODE(o2_putActorAtObject),
|
||||
OPCODE(o2_ifNotState08),
|
||||
/* 90 */
|
||||
OPCODE(o5_getObjectOwner),
|
||||
OPCODE(o5_animateActor),
|
||||
OPCODE(o5_panCameraTo),
|
||||
OPCODE(o2_getObjectOwner),
|
||||
OPCODE(o2_animateActor),
|
||||
OPCODE(o2_panCameraTo),
|
||||
OPCODE(o2_actorSet),
|
||||
/* 94 */
|
||||
OPCODE(o5_print),
|
||||
OPCODE(o5_actorFromPos),
|
||||
OPCODE(o5_getRandomNr),
|
||||
OPCODE(o2_print),
|
||||
OPCODE(o2_actorFromPos),
|
||||
OPCODE(o2_getRandomNr),
|
||||
OPCODE(o2_setState02),
|
||||
/* 98 */
|
||||
OPCODE(o2_restart),
|
||||
OPCODE(o5_doSentence),
|
||||
OPCODE(o2_doSentence),
|
||||
OPCODE(o2_assignVarWord),
|
||||
OPCODE(o2_setBitVar),
|
||||
/* 9C */
|
||||
OPCODE(o5_startSound),
|
||||
OPCODE(o2_startSound),
|
||||
OPCODE(o2_ifClassOfIs),
|
||||
OPCODE(o2_walkActorTo),
|
||||
OPCODE(o2_ifState02),
|
||||
@ -236,47 +236,47 @@ void Scumm_v2::setupOpcodes() {
|
||||
OPCODE(o5_stopObjectCode),
|
||||
OPCODE(o2_putActor),
|
||||
OPCODE(o5_getAnimCounter),
|
||||
OPCODE(o5_getActorY),
|
||||
OPCODE(o2_getActorY),
|
||||
/* A4 */
|
||||
OPCODE(o5_loadRoomWithEgo),
|
||||
OPCODE(o5_pickupObject),
|
||||
OPCODE(o5_setVarRange),
|
||||
OPCODE(o2_setVarRange),
|
||||
OPCODE(o2_setState04),
|
||||
/* A8 */
|
||||
OPCODE(o2_notEqualZero),
|
||||
OPCODE(o5_setOwnerOf),
|
||||
OPCODE(o2_setOwnerOf),
|
||||
OPCODE(o2_addDirect),
|
||||
OPCODE(o5_dummy),
|
||||
/* AC */
|
||||
OPCODE(o5_delay),
|
||||
OPCODE(o5_putActorInRoom),
|
||||
OPCODE(o2_putActorInRoom),
|
||||
OPCODE(o2_waitForSentence),
|
||||
OPCODE(o2_ifNotState04),
|
||||
/* B0 */
|
||||
OPCODE(o5_matrixOps),
|
||||
OPCODE(o2_matrixOps),
|
||||
OPCODE(o2_getBitVar),
|
||||
OPCODE(o5_setCameraAt),
|
||||
OPCODE(o5_roomOps),
|
||||
OPCODE(o2_setCameraAt),
|
||||
OPCODE(o2_roomOps),
|
||||
/* B4 */
|
||||
OPCODE(o5_getDist),
|
||||
OPCODE(o5_findObject),
|
||||
OPCODE(o5_walkActorToObject),
|
||||
OPCODE(o2_getDist),
|
||||
OPCODE(o2_findObject),
|
||||
OPCODE(o2_walkActorToObject),
|
||||
OPCODE(o2_setState02),
|
||||
/* B8 */
|
||||
OPCODE(o2_lessOrEqual),
|
||||
OPCODE(o5_doSentence),
|
||||
OPCODE(o5_subtract),
|
||||
OPCODE(o2_doSentence),
|
||||
OPCODE(o2_subtract),
|
||||
OPCODE(o2_waitForActor),
|
||||
/* BC */
|
||||
OPCODE(o5_stopSound),
|
||||
OPCODE(o5_getActorElevation),
|
||||
OPCODE(o2_getActorElevation),
|
||||
OPCODE(o2_walkActorTo),
|
||||
OPCODE(o2_ifNotState01),
|
||||
/* C0 */
|
||||
OPCODE(o5_endCutscene),
|
||||
OPCODE(o2_putActor),
|
||||
OPCODE(o2_startScript),
|
||||
OPCODE(o5_getActorX),
|
||||
OPCODE(o2_getActorX),
|
||||
/* C4 */
|
||||
OPCODE(o2_isLess),
|
||||
OPCODE(o2_drawObject),
|
||||
@ -284,31 +284,31 @@ void Scumm_v2::setupOpcodes() {
|
||||
OPCODE(o2_clearState08),
|
||||
/* C8 */
|
||||
OPCODE(o2_isEqual),
|
||||
OPCODE(o5_faceActor),
|
||||
OPCODE(o5_chainScript),
|
||||
OPCODE(o2_faceActor),
|
||||
OPCODE(o2_chainScript),
|
||||
OPCODE(o2_setObjY),
|
||||
/* CC */
|
||||
OPCODE(o5_pseudoRoom),
|
||||
OPCODE(o5_walkActorToActor),
|
||||
OPCODE(o5_putActorAtObject),
|
||||
OPCODE(o2_walkActorToActor),
|
||||
OPCODE(o2_putActorAtObject),
|
||||
OPCODE(o2_ifState08),
|
||||
/* D0 */
|
||||
OPCODE(o5_pickupObjectOld),
|
||||
OPCODE(o5_animateActor),
|
||||
OPCODE(o5_actorFollowCamera),
|
||||
OPCODE(o2_pickupObject),
|
||||
OPCODE(o2_animateActor),
|
||||
OPCODE(o2_actorFollowCamera),
|
||||
OPCODE(o2_actorSet),
|
||||
/* D4 */
|
||||
OPCODE(o5_setObjectName),
|
||||
OPCODE(o5_actorFromPos),
|
||||
OPCODE(o5_getActorMoving),
|
||||
OPCODE(o2_setObjectName),
|
||||
OPCODE(o2_actorFromPos),
|
||||
OPCODE(o2_getActorMoving),
|
||||
OPCODE(o2_setState02),
|
||||
/* D8 */
|
||||
OPCODE(o2_printEgo),
|
||||
OPCODE(o5_doSentence),
|
||||
OPCODE(o5_add),
|
||||
OPCODE(o2_doSentence),
|
||||
OPCODE(o2_add),
|
||||
OPCODE(o5_divide),
|
||||
/* DC */
|
||||
OPCODE(o5_oldRoomEffect),
|
||||
OPCODE(o5_dummy),
|
||||
OPCODE(o2_ifClassOfIs),
|
||||
OPCODE(o2_walkActorTo),
|
||||
OPCODE(o2_ifNotState02),
|
||||
@ -324,32 +324,32 @@ void Scumm_v2::setupOpcodes() {
|
||||
OPCODE(o2_clearState04),
|
||||
/* E8 */
|
||||
OPCODE(o5_isScriptRunning),
|
||||
OPCODE(o5_setOwnerOf),
|
||||
OPCODE(o2_setOwnerOf),
|
||||
OPCODE(o2_subDirect),
|
||||
OPCODE(o5_dummy),
|
||||
/* EC */
|
||||
OPCODE(o2_getObjY),
|
||||
OPCODE(o5_putActorInRoom),
|
||||
OPCODE(o2_putActorInRoom),
|
||||
OPCODE(o5_dummy),
|
||||
OPCODE(o2_ifState04),
|
||||
/* F0 */
|
||||
OPCODE(o5_lights),
|
||||
OPCODE(o5_getActorCostume),
|
||||
OPCODE(o5_loadRoom),
|
||||
OPCODE(o5_roomOps),
|
||||
OPCODE(o2_roomOps),
|
||||
/* F4 */
|
||||
OPCODE(o5_getDist),
|
||||
OPCODE(o5_findObject),
|
||||
OPCODE(o5_walkActorToObject),
|
||||
OPCODE(o2_getDist),
|
||||
OPCODE(o2_findObject),
|
||||
OPCODE(o2_walkActorToObject),
|
||||
OPCODE(o2_clearState01),
|
||||
/* F8 */
|
||||
OPCODE(o2_isGreater),
|
||||
OPCODE(o5_doSentence),
|
||||
OPCODE(o2_doSentence),
|
||||
OPCODE(o2_verbOps),
|
||||
OPCODE(o5_getActorWalkBox),
|
||||
/* FC */
|
||||
OPCODE(o5_isSoundRunning),
|
||||
OPCODE(o5_getActorElevation),
|
||||
OPCODE(o2_getActorElevation),
|
||||
OPCODE(o2_walkActorTo),
|
||||
OPCODE(o2_ifState01)
|
||||
};
|
||||
@ -746,7 +746,7 @@ void Scumm_v2::o2_verbOps() {
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_isEqual() {
|
||||
int a = readVar(fetchScriptByte());
|
||||
int a = getVar();
|
||||
int b = getVarOrDirectWord(0x80);
|
||||
|
||||
if (b == a)
|
||||
@ -757,7 +757,7 @@ void Scumm_v2::o2_isEqual() {
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_isGreater() {
|
||||
int16 a = readVar(fetchScriptByte());
|
||||
int16 a = getVar();
|
||||
int16 b = getVarOrDirectWord(0x80);
|
||||
|
||||
if (b > a)
|
||||
@ -767,7 +767,7 @@ void Scumm_v2::o2_isGreater() {
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_isGreaterEqual() {
|
||||
int16 a = readVar(fetchScriptByte());
|
||||
int16 a = getVar();
|
||||
int16 b = getVarOrDirectWord(0x80);
|
||||
|
||||
if (b >= a)
|
||||
@ -777,7 +777,7 @@ void Scumm_v2::o2_isGreaterEqual() {
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_isLess() {
|
||||
int16 a = readVar(fetchScriptByte());
|
||||
int16 a = getVar();
|
||||
int16 b = getVarOrDirectWord(0x80);
|
||||
|
||||
if (b < a)
|
||||
@ -787,7 +787,7 @@ void Scumm_v2::o2_isLess() {
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_lessOrEqual() {
|
||||
int16 a = readVar(fetchScriptByte());
|
||||
int16 a = getVar();
|
||||
int16 b = getVarOrDirectWord(0x80);
|
||||
|
||||
if (b <= a)
|
||||
@ -797,7 +797,7 @@ void Scumm_v2::o2_lessOrEqual() {
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_isNotEqual() {
|
||||
int16 a = readVar(fetchScriptByte());
|
||||
int16 a = getVar();
|
||||
int16 b = getVarOrDirectWord(0x80);
|
||||
|
||||
if (b != a)
|
||||
@ -807,7 +807,7 @@ void Scumm_v2::o2_isNotEqual() {
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_notEqualZero() {
|
||||
int a = readVar(fetchScriptByte());
|
||||
int a = getVar();
|
||||
|
||||
if (a != 0)
|
||||
ignoreScriptWord();
|
||||
@ -816,7 +816,7 @@ void Scumm_v2::o2_notEqualZero() {
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_equalZero() {
|
||||
int a = readVar(fetchScriptByte());
|
||||
int a = getVar();
|
||||
|
||||
if (a == 0)
|
||||
ignoreScriptWord();
|
||||
@ -907,5 +907,442 @@ void Scumm_v2::o2_putActor() {
|
||||
|
||||
void Scumm_v2::o2_startScript() {
|
||||
int script = getVarOrDirectByte(0x80);
|
||||
runScript(script, 0, 0, 0); // FIXME: Need to confirm runScript parameters/mode
|
||||
runScript(script, 0, 0, 0);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_panCameraTo() {
|
||||
panCameraTo(getVarOrDirectByte(0x80), 0);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_move() {
|
||||
getResultPos();
|
||||
_vars[_resultVarNumber] = getVarOrDirectWord(0x80);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_startMusic() {
|
||||
_sound->addSoundToQueue(getVarOrDirectByte(0x80));
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_getActorRoom() {
|
||||
int act;
|
||||
Actor *a;
|
||||
getResultPos();
|
||||
act = getVarOrDirectByte(0x80);
|
||||
|
||||
a = derefActorSafe(act, "o2_getActorRoom");
|
||||
if (!a) {
|
||||
warning("Invalid actor %d in o2_getActorRoom", act);
|
||||
return;
|
||||
}
|
||||
|
||||
_vars[_resultVarNumber] = a->room;
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_getActorElevation() {
|
||||
int act;
|
||||
Actor *a;
|
||||
getResultPos();
|
||||
act = getVarOrDirectByte(0x80);
|
||||
|
||||
a = derefActorSafe(act, "o2_getActorElevation");
|
||||
if (!a) {
|
||||
warning("Invalid actor %d in o2_getActorElevation", act);
|
||||
return;
|
||||
}
|
||||
|
||||
_vars[_resultVarNumber] = a->elevation;
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_walkActorToActor() {
|
||||
int b, x, y;
|
||||
Actor *a, *a2;
|
||||
int nr;
|
||||
int nr2 = getVarOrDirectByte(0x80);
|
||||
a = derefActorSafe(nr2, "o2_walkActorToActor");
|
||||
if (!a)
|
||||
return;
|
||||
|
||||
if (!a->isInCurrentRoom()) {
|
||||
getVarOrDirectByte(0x40);
|
||||
fetchScriptByte();
|
||||
return;
|
||||
}
|
||||
|
||||
nr = getVarOrDirectByte(0x40);
|
||||
a2 = derefActorSafe(nr, "o2_walkActorToActor(2)");
|
||||
if (!a2)
|
||||
return;
|
||||
|
||||
if (!a2->isInCurrentRoom()) {
|
||||
fetchScriptByte();
|
||||
return;
|
||||
}
|
||||
b = fetchScriptByte(); /* distance from actor */
|
||||
if (b == 0xFF) {
|
||||
b = a2->scalex * a->width / 0xFF;
|
||||
b = b + b / 2;
|
||||
}
|
||||
x = a2->x;
|
||||
y = a2->y;
|
||||
if (x < a->x)
|
||||
x += b;
|
||||
else
|
||||
x -= b;
|
||||
|
||||
a->startWalkActor(x, y, -1);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_walkActorToObject() {
|
||||
int obj;
|
||||
Actor *a;
|
||||
|
||||
a = derefActorSafe(getVarOrDirectByte(0x80), "o2_walkActorToObject");
|
||||
obj = getVarOrDirectWord(0x40);
|
||||
if (whereIsObject(obj) != WIO_NOT_FOUND) {
|
||||
int x, y, dir;
|
||||
getObjectXYPos(obj, x, y, dir);
|
||||
a->startWalkActor(x, y, dir);
|
||||
}
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_faceActor() {
|
||||
int act, obj;
|
||||
Actor *a;
|
||||
act = getVarOrDirectByte(0x80);
|
||||
obj = getVarOrDirectWord(0x40);
|
||||
|
||||
a = derefActorSafe(act, "o2_faceActor");
|
||||
assert(a);
|
||||
|
||||
a->faceToObject(obj);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_putActorAtObject() {
|
||||
int obj, x, y;
|
||||
Actor *a;
|
||||
|
||||
a = derefActorSafe(getVarOrDirectByte(0x80), "o2_putActorAtObject");
|
||||
obj = getVarOrDirectWord(0x40);
|
||||
if (whereIsObject(obj) != WIO_NOT_FOUND)
|
||||
getObjectXYPos(obj, x, y);
|
||||
else {
|
||||
x = 240;
|
||||
y = 120;
|
||||
}
|
||||
a->putActor(x, y, a->room);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_getObjectOwner() {
|
||||
getResultPos();
|
||||
_vars[_resultVarNumber] = getOwner(getVarOrDirectWord(0x80));
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_animateActor() {
|
||||
int act = getVarOrDirectByte(0x80);
|
||||
int anim = getVarOrDirectByte(0x40);
|
||||
|
||||
Actor *a = derefActorSafe(act, "o2_animateActor");
|
||||
if (!a)
|
||||
return;
|
||||
|
||||
a->animateActor(anim);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_print() {
|
||||
_actorToPrintStrFor = getVarOrDirectByte(0x80);
|
||||
decodeParseString();
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_actorFromPos() {
|
||||
int x, y;
|
||||
getResultPos();
|
||||
x = getVarOrDirectByte(0x80);
|
||||
y = getVarOrDirectByte(0x40);
|
||||
_vars[_resultVarNumber] = getActorFromPos(x, y);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_getRandomNr() {
|
||||
getResultPos();
|
||||
_vars[_resultVarNumber] = _rnd.getRandomNumber(getVarOrDirectByte(0x80));
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_isScriptRunning() {
|
||||
getResultPos();
|
||||
_vars[_resultVarNumber] = isScriptRunning(getVarOrDirectByte(0x80));
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_getVerbEntrypoint() {
|
||||
int a, b;
|
||||
getResultPos();
|
||||
a = getVarOrDirectWord(0x80);
|
||||
b = getVarOrDirectWord(0x40);
|
||||
|
||||
_vars[_resultVarNumber] = getVerbEntrypoint(a, b);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_startSound() {
|
||||
_vars[VAR_MUSIC_FLAG] = 0;
|
||||
_sound->addSoundToQueue(getVarOrDirectByte(0x80));
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_saveLoadGame() {
|
||||
getResultPos();
|
||||
byte a = getVarOrDirectByte(0x80);
|
||||
|
||||
error("TODO: o2_saveLoadGame()");
|
||||
_vars[_resultVarNumber] = 0;
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_getActorX() {
|
||||
int a;
|
||||
getResultPos();
|
||||
|
||||
a = getVarOrDirectByte(0x80);
|
||||
_vars[_resultVarNumber] = getObjX(a);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_getActorY() {
|
||||
int a;
|
||||
getResultPos();
|
||||
|
||||
a = getVarOrDirectByte(0x80);
|
||||
_vars[_resultVarNumber] = getObjY(a);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_loadRoomWithEgo() {
|
||||
Actor *a;
|
||||
int obj, room, x, y;
|
||||
|
||||
obj = getVarOrDirectWord(0x80);
|
||||
room = getVarOrDirectByte(0x40);
|
||||
|
||||
a = derefActorSafe(_vars[VAR_EGO], "o2_loadRoomWithEgo");
|
||||
|
||||
a->putActor(0, 0, room);
|
||||
_egoPositioned = false;
|
||||
|
||||
x = (int16)fetchScriptByte();
|
||||
y = (int16)fetchScriptByte();
|
||||
|
||||
startScene(a->room, a, obj);
|
||||
|
||||
camera._dest.x = camera._cur.x = a->x;
|
||||
setCameraAt(a->x, a->y);
|
||||
setCameraFollows(a);
|
||||
|
||||
_fullRedraw = 1;
|
||||
|
||||
if (x != -1) {
|
||||
a->startWalkActor(x, y, -1);
|
||||
}
|
||||
runScript(5, 0, 0, 0);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_setVarRange() {
|
||||
int a, b;
|
||||
|
||||
getResultPos();
|
||||
a = fetchScriptByte();
|
||||
do {
|
||||
if (_opcode & 0x80)
|
||||
b = fetchScriptWord();
|
||||
else
|
||||
b = fetchScriptByte();
|
||||
|
||||
_vars[_resultVarNumber++] = b;
|
||||
} while (--a);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_setOwnerOf() {
|
||||
int obj, owner;
|
||||
|
||||
obj = getVarOrDirectWord(0x80);
|
||||
owner = getVarOrDirectByte(0x40);
|
||||
|
||||
setOwnerOf(obj, owner);
|
||||
runHook(0);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_delayVariable() {
|
||||
vm.slot[_currentScript].delay = getVar();
|
||||
vm.slot[_currentScript].status = 1;
|
||||
o5_breakHere();
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_putActorInRoom() {
|
||||
int room;
|
||||
Actor *a;
|
||||
|
||||
a = derefActorSafe(getVarOrDirectByte(0x80), "o2_putActorInRoom");
|
||||
room = getVarOrDirectByte(0x40);
|
||||
|
||||
if (a == NULL)
|
||||
return;
|
||||
|
||||
a->room = room;
|
||||
if (!room)
|
||||
a->putActor(0, 0, 0);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_matrixOps() {
|
||||
int a, b;
|
||||
|
||||
a = getVarOrDirectByte(0x80);
|
||||
b = fetchScriptByte();
|
||||
setBoxFlags(a, b);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_setCameraAt() {
|
||||
setCameraAtEx(getVarOrDirectByte(0x80));
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_roomOps() {
|
||||
int a = getVarOrDirectByte(0x80);
|
||||
int b = getVarOrDirectByte(0x40);
|
||||
|
||||
_opcode = fetchScriptByte();
|
||||
switch (_opcode & 0x1F) {
|
||||
case 1: /* room scroll */
|
||||
if (a < (_realWidth / 2))
|
||||
a = (_realWidth / 2);
|
||||
if (b < (_realWidth / 2))
|
||||
b = (_realWidth / 2);
|
||||
if (a > _scrWidth - (_realWidth / 2))
|
||||
a = _scrWidth - (_realWidth / 2);
|
||||
if (b > _scrWidth - (_realWidth / 2))
|
||||
b = _scrWidth - (_realWidth / 2);
|
||||
_vars[VAR_CAMERA_MIN_X] = a;
|
||||
_vars[VAR_CAMERA_MAX_X] = b;
|
||||
break;
|
||||
case 2: /* room color */
|
||||
_shadowPalette[b] = a;
|
||||
_fullRedraw = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_getDist() {
|
||||
getResultPos();
|
||||
int o1 = getVarOrDirectWord(0x80);
|
||||
int o2 = getVarOrDirectWord(0x40);
|
||||
_vars[_resultVarNumber] = getObjActToObjActDist(o1, o2);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_findObject() {
|
||||
getResultPos();
|
||||
int x = getVarOrDirectWord(0x80);
|
||||
int y = getVarOrDirectWord(0x40);
|
||||
_vars[_resultVarNumber] = findObject(x, y);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_subtract() {
|
||||
int a;
|
||||
getResultPos();
|
||||
a = getVarOrDirectWord(0x80);
|
||||
_vars[_resultVarNumber] -= a;
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_cutscene() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_increment() {
|
||||
getResultPos();
|
||||
_vars[_resultVarNumber]++;
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_chainScript() {
|
||||
int data = getVarOrDirectByte(0x80);
|
||||
int cur = _currentScript;
|
||||
|
||||
vm.slot[cur].number = 0;
|
||||
vm.slot[cur].status = 0;
|
||||
_currentScript = 0xFF;
|
||||
|
||||
runScript(data, 0, 0, 0);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_pickupObject() {
|
||||
int obj = getVarOrDirectWord(0x80);
|
||||
|
||||
if (obj < 1) {
|
||||
error("pickupObject received invalid index %d (script %d)", obj, vm.slot[_currentScript].number);
|
||||
}
|
||||
|
||||
if (getObjectIndex(obj) == -1)
|
||||
return;
|
||||
|
||||
if (whereIsObject(obj) == WIO_INVENTORY) /* Don't take an */
|
||||
return; /* object twice */
|
||||
|
||||
addObjectToInventory(obj, _roomResource);
|
||||
removeObjectFromRoom(obj);
|
||||
putOwner(obj, _vars[VAR_EGO]);
|
||||
putClass(obj, 32, 1);
|
||||
putState(obj, 1);
|
||||
clearDrawObjectQueue();
|
||||
runHook(1);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_actorFollowCamera() {
|
||||
actorFollowCamera(getVarOrDirectByte(0x80));
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_setObjectName() {
|
||||
int obj = getVarOrDirectWord(0x80);
|
||||
int size;
|
||||
int a;
|
||||
int i = 0;
|
||||
byte *name = NULL;
|
||||
byte work[256];
|
||||
|
||||
// Read in new name
|
||||
do {
|
||||
a = fetchScriptByte();
|
||||
work[i++] = a;
|
||||
} while (a);
|
||||
work[i] = 0;
|
||||
|
||||
if (obj < NUM_ACTORS)
|
||||
error("Can't set actor %d name with new-name-of", obj);
|
||||
|
||||
name = getObjOrActorName(obj);
|
||||
|
||||
byte *objptr;
|
||||
byte offset = 0;
|
||||
|
||||
objptr = getOBCDFromObject(obj);
|
||||
offset = *(objptr + 18);
|
||||
size = READ_LE_UINT16(objptr) - offset;
|
||||
|
||||
if (i >= size) {
|
||||
warning("New name of object %d too long (old *%s* new *%s*)", obj, name, work);
|
||||
i = size - 1;
|
||||
}
|
||||
|
||||
memcpy(name, work, i + 1);
|
||||
runHook(0);
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_getActorMoving() {
|
||||
int act;
|
||||
Actor *a;
|
||||
getResultPos();
|
||||
act = getVarOrDirectByte(0x80);
|
||||
|
||||
a = derefActorSafe(act, "o2_getActorMoving");
|
||||
if (!a) {
|
||||
warning("Invalid actor %d in o2_getActorMoving", act);
|
||||
return;
|
||||
}
|
||||
|
||||
_vars[_resultVarNumber] = a->moving;
|
||||
}
|
||||
|
||||
void Scumm_v2::o2_add() {
|
||||
int a;
|
||||
getResultPos();
|
||||
a = getVarOrDirectWord(0x80);
|
||||
_vars[_resultVarNumber] += a;
|
||||
}
|
||||
|
||||
|
@ -1907,7 +1907,7 @@ void Scumm_v5::o5_setObjectName() {
|
||||
|
||||
objptr = getOBCDFromObject(obj);
|
||||
if (_features & GF_OLD_BUNDLE)
|
||||
offset = READ_LE_UINT16(objptr + 20);
|
||||
offset = *(objptr + 20);
|
||||
else
|
||||
offset = READ_LE_UINT16(objptr + 18);
|
||||
size = READ_LE_UINT16(objptr) - offset;
|
||||
|
Loading…
Reference in New Issue
Block a user