TRECISION: Move endChangeRoom to LogicManager, use a setter instead of memcpy on a specific message

This commit is contained in:
Strangerke 2021-04-20 11:21:50 +02:00 committed by SupSuper
parent 03a3c1923f
commit b6ffdcf16a
6 changed files with 364 additions and 343 deletions

View File

@ -30,7 +30,6 @@
#include "trecision/nl/struct.h" #include "trecision/nl/struct.h"
#include "trecision/logic.h" #include "trecision/logic.h"
#include "trecision/graphics.h"
#include "trecision/trecision.h" #include "trecision/trecision.h"
#include "trecision/video.h" #include "trecision/video.h"
@ -264,10 +263,10 @@ void LogicManager::initScript() {
_vm->_scriptFrame[f]._u32Param = oENTRANCE2E; _vm->_scriptFrame[f]._u32Param = oENTRANCE2E;
} }
void LogicManager::setRoom(uint16 r, bool b) { void LogicManager::setRoom(uint16 r, bool altRoomFl) {
switch (r) { switch (r) {
case r21: case r21:
if (!b) { if (!altRoomFl) {
read3D("21.3d"); read3D("21.3d");
_vm->_room[r21]._flag &= ~OBJFLAG_EXTRA; _vm->_room[r21]._flag &= ~OBJFLAG_EXTRA;
setPosition(14); setPosition(14);
@ -327,7 +326,7 @@ void LogicManager::setRoom(uint16 r, bool b) {
} }
break; break;
case r24: case r24:
if (!b) { if (!altRoomFl) {
read3D("24.3d"); read3D("24.3d");
_vm->_room[r24]._flag &= ~OBJFLAG_EXTRA; _vm->_room[r24]._flag &= ~OBJFLAG_EXTRA;
_vm->_obj[oPASSAGE24]._position = 3; _vm->_obj[oPASSAGE24]._position = 3;
@ -346,7 +345,7 @@ void LogicManager::setRoom(uint16 r, bool b) {
break; break;
case r2A: case r2A:
if (!b) { if (!altRoomFl) {
read3D("2A.3d"); read3D("2A.3d");
_vm->_room[r2A]._flag &= ~OBJFLAG_EXTRA; _vm->_room[r2A]._flag &= ~OBJFLAG_EXTRA;
_vm->_obj[oDUMMY2A2]._mode |= OBJMODE_OBJSTATUS; _vm->_obj[oDUMMY2A2]._mode |= OBJMODE_OBJSTATUS;
@ -359,7 +358,7 @@ void LogicManager::setRoom(uint16 r, bool b) {
} }
break; break;
case r2B: case r2B:
if (!b) { if (!altRoomFl) {
read3D("2B.3d"); read3D("2B.3d");
_vm->_room[r2B]._flag &= ~OBJFLAG_EXTRA; _vm->_room[r2B]._flag &= ~OBJFLAG_EXTRA;
_vm->_obj[oPORTA2B]._mode |= OBJMODE_OBJSTATUS; _vm->_obj[oPORTA2B]._mode |= OBJMODE_OBJSTATUS;
@ -372,7 +371,7 @@ void LogicManager::setRoom(uint16 r, bool b) {
} }
break; break;
case r2E: case r2E:
if (!b) { if (!altRoomFl) {
_vm->_obj[oCATWALKA2E]._nbox = BACKGROUND; _vm->_obj[oCATWALKA2E]._nbox = BACKGROUND;
_vm->_obj[oCATWALKA2E]._position = 2; _vm->_obj[oCATWALKA2E]._position = 2;
_vm->_obj[oCATWALKA2E]._anim = a2E2PRIMAPALLONTANANDO; _vm->_obj[oCATWALKA2E]._anim = a2E2PRIMAPALLONTANANDO;
@ -400,7 +399,7 @@ void LogicManager::setRoom(uint16 r, bool b) {
} }
break; break;
case r2GV: case r2GV:
if (!b) { if (!altRoomFl) {
_vm->_obj[oVIADOTTO2GV]._position = 7; _vm->_obj[oVIADOTTO2GV]._position = 7;
_vm->_obj[oVIADOTTO2GV]._anim = a2G7ATTRAVERSAPONTICELLO; _vm->_obj[oVIADOTTO2GV]._anim = a2G7ATTRAVERSAPONTICELLO;
read3D("2GV.3d"); read3D("2GV.3d");
@ -415,6 +414,280 @@ void LogicManager::setRoom(uint16 r, bool b) {
} }
} }
void LogicManager::endChangeRoom() {
// Specific management of magnetic fields
if ((_vm->_curRoom == r2E) && (_vm->_obj[oPULSANTEADS2D]._mode & OBJMODE_OBJSTATUS)) {
_vm->_animMgr->_animTab[aBKG2E]._flag |= SMKANIM_OFF1;
_vm->_obj[oCAMPO2E]._mode &= ~OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOA2E]._mode &= ~OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOS2E]._mode |= OBJMODE_OBJSTATUS;
} else if ((_vm->_curRoom == r2E) && (_vm->_obj[oPULSANTEADA2D]._mode & OBJMODE_OBJSTATUS)) {
_vm->_animMgr->_animTab[aBKG2E]._flag &= ~SMKANIM_OFF1;
_vm->_obj[oCAMPO2E]._mode |= OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOA2E]._mode |= OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOS2E]._mode &= ~OBJMODE_OBJSTATUS;
}
if ((_vm->_curRoom == r2C) && (_vm->_obj[oPULSANTEACS2D]._mode & OBJMODE_OBJSTATUS)) {
_vm->_animMgr->_animTab[aBKG2C]._flag |= SMKANIM_OFF1;
_vm->_obj[oCAMPO2C]._mode &= ~OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOA2C]._mode &= ~OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOS2C]._mode |= OBJMODE_OBJSTATUS;
} else if ((_vm->_curRoom == r2C) && (_vm->_obj[oPULSANTEACA2D]._mode & OBJMODE_OBJSTATUS)) {
_vm->_animMgr->_animTab[aBKG2C]._flag &= ~SMKANIM_OFF1;
_vm->_obj[oCAMPO2C]._mode |= OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOS2C]._mode &= ~OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOA2C]._mode |= OBJMODE_OBJSTATUS;
}
if ((_vm->_curRoom == r28) && (_vm->_obj[oPULSANTEBBS2D]._mode & OBJMODE_OBJSTATUS)) {
_vm->_animMgr->_animTab[aBKG28]._flag |= SMKANIM_OFF2;
_vm->_obj[oCESPUGLIO28]._anim = a283;
_vm->_obj[oSERPENTETM28]._mode |= OBJMODE_OBJSTATUS;
_vm->_obj[oSERPENTEAM28]._mode |= OBJMODE_OBJSTATUS;
RegenRoom();
} else if ((_vm->_curRoom == r28) && (_vm->_obj[oPULSANTEBBA2D]._mode & OBJMODE_OBJSTATUS)) {
_vm->_animMgr->_animTab[aBKG28]._flag &= ~SMKANIM_OFF2;
_vm->_obj[oCESPUGLIO28]._anim = a282;
_vm->_obj[oSERPENTETM28]._mode &= ~OBJMODE_OBJSTATUS;
_vm->_obj[oSERPENTEAM28]._mode &= ~OBJMODE_OBJSTATUS;
RegenRoom();
}
if ((_vm->_curRoom == r28) && (_vm->_obj[oPULSANTEABS2D]._mode & OBJMODE_OBJSTATUS)) {
_vm->_animMgr->_animTab[aBKG28]._flag |= (SMKANIM_OFF1 | SMKANIM_OFF3);
_vm->_obj[oCAMPO28]._mode &= ~OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOA28]._mode &= ~OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOS28]._mode |= OBJMODE_OBJSTATUS;
read3D("282.3d");
} else if ((_vm->_curRoom == r28) && (_vm->_obj[oPULSANTEABA2D]._mode & OBJMODE_OBJSTATUS)) {
_vm->_animMgr->_animTab[aBKG28]._flag &= ~(SMKANIM_OFF1 | SMKANIM_OFF3);
_vm->_obj[oCAMPO28]._mode |= OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOA28]._mode |= OBJMODE_OBJSTATUS;
_vm->_obj[oCARTELLOS28]._mode &= ~OBJMODE_OBJSTATUS;
}
// End of specific management for the magnetic fields
// Actions
if ((_vm->_curRoom == r12) && ((_vm->_oldRoom == r13) || (_vm->_oldRoom == r16)))
StartCharacterAction(a1213ARRIVACONASCENSORE, 0, 0, 0);
else if ((_vm->_curRoom == r16) && ((_vm->_oldRoom == r13) || (_vm->_oldRoom == r12)))
StartCharacterAction(a1617SCENDECONASCENSORE, 0, 0, 0);
else if ((_vm->_curRoom == r13) && (_vm->_oldRoom == r12))
StartCharacterAction(a1315ARRIVAASCENSOREALTOENTRA, 0, 0, 0);
else if ((_vm->_curRoom == r13) && (_vm->_oldRoom == r16))
StartCharacterAction(a1314ARRIVAASCENSOREDABASSO, 0, 0, 0);
else if ((_vm->_curRoom == r14) && (_vm->_oldRoom == r13))
StartCharacterAction(a1414ENTERROOM, 0, 0, 0);
else if ((_vm->_curRoom == r18) && (_vm->_oldRoom == r17) && !(_vm->_room[r18]._flag & OBJFLAG_DONE))
StartCharacterAction(a186GUARDAPIAZZA, 0, 0, 0);
else if ((_vm->_curRoom == r18) && (_vm->_oldRoom == r19))
StartCharacterAction(a189ENTRADALCLUB, 0, 0, 0);
else if ((_vm->_curRoom == r1A) && (_vm->_oldRoom == r18) && (_vm->_room[r1A]._flag & OBJFLAG_DONE)) {
StartCharacterAction(a1A5ENTRA, 0, 0, 0);
_vm->_animMgr->_animTab[aBKG1A]._flag |= SMKANIM_OFF1;
} else if ((_vm->_curRoom == r1C) && (_vm->_oldRoom == r1B))
StartCharacterAction(a1C1ENTRACUNICOLO, 0, 0, 0);
else if ((_vm->_curRoom == r1B) && (_vm->_oldRoom == r1C))
StartCharacterAction(a1B11ESCETOMBINO, 0, 0, 0);
else if ((_vm->_curRoom == r1D) && (_vm->_oldRoom == r1B) && (_vm->_obj[oDONNA1D]._mode & OBJMODE_OBJSTATUS)) {
StartCharacterAction(a1D1SCENDESCALE, 0, 1, 0);
_vm->_actor->_lim[0] = 60;
_vm->_actor->_lim[2] = 240;
} else if ((_vm->_curRoom == r1D) && (_vm->_oldRoom == r1B) && !(_vm->_obj[oDONNA1D]._mode & OBJMODE_OBJSTATUS)) {
StartCharacterAction(a1D12SCENDESCALA, 0, 1, 0);
_vm->_actor->_lim[0] = 60;
_vm->_actor->_lim[2] = 240;
} else if ((_vm->_curRoom == r1B) && (_vm->_oldRoom == r1D))
StartCharacterAction(a1B4ESCEBOTOLA, 0, 0, 0);
else if ((_vm->_curRoom == r1B) && (_vm->_oldRoom == r18) && (_vm->_animMgr->_animTab[aBKG1B]._flag & SMKANIM_OFF1))
StartCharacterAction(a1B12SCAPPATOPO, 0, 0, 0);
else if ((_vm->_curRoom == r24) && (_vm->_oldRoom == r2H))
StartCharacterAction(a242, 0, 0, 0);
else if ((_vm->_curRoom == r25) && (_vm->_oldRoom == r2A))
StartCharacterAction(a257, 0, 0, 0);
else if ((_vm->_curRoom == r28) && (_vm->_oldRoom == r27))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((_vm->_curRoom == r29) && (_vm->_oldRoom == r2A))
StartCharacterAction(a298ESCEBOTOLA, 0, 0, 0);
else if ((_vm->_curRoom == r29L) && (_vm->_oldRoom == r2A))
StartCharacterAction(a2910ESCEBOTOLA, 0, 0, 0);
else if ((_vm->_curRoom == r2A) && (_vm->_oldRoom == r25))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((_vm->_curRoom == r2A) && ((_vm->_oldRoom == r29) || (_vm->_oldRoom == r29L)))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((_vm->_curRoom == r2B) && (_vm->_oldRoom == r2A))
StartCharacterAction(a2B2ESCEPOZZO, 0, 2, 0);
else if ((_vm->_curRoom == r2H) && (_vm->_oldRoom == r24))
StartCharacterAction(a2H1ARRIVA, 0, 0, 0);
else if ((_vm->_curRoom == r2E) && (_vm->_oldRoom == r2F))
StartCharacterAction(a2E5SECONDAPARRIVANDO, 0, 0, 0);
else if ((_vm->_curRoom == r2F) && (_vm->_oldRoom == r2E))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((_vm->_curRoom == r23B) && (_vm->_oldRoom == r21))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((_vm->_curRoom == r23A) && (_vm->_oldRoom == r21) && (_vm->_room[r23A]._flag & OBJFLAG_DONE))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((_vm->_curRoom == r23A) && (_vm->_oldRoom == r21) && (!(_vm->_room[r23A]._flag & OBJFLAG_DONE)))
_vm->_flagShowCharacter = false;
else if ((_vm->_curRoom == r21) && ((_vm->_oldRoom == r23A) || (_vm->_oldRoom == r23B)))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((_vm->_curRoom == r2BL) || (_vm->_curRoom == r36F) || (_vm->_curRoom == r41D) || (_vm->_curRoom == r49M) || (_vm->_curRoom == r4CT) ||
(_vm->_curRoom == r58T) || (_vm->_curRoom == r58M) || (_vm->_curRoom == r59L) || (_vm->_curRoom == rSYS) ||
(_vm->_curRoom == r12CU) || (_vm->_curRoom == r13CU)) { // Screens without inventory
_vm->_flagShowCharacter = false;
_vm->_flagCharacterExists = false;
_vm->_flagInventoryLocked = true;
} else if ((_vm->_curRoom == r31P) || (_vm->_curRoom == r35P)) { // Screens with inventory
_vm->_flagShowCharacter = false;
_vm->_flagCharacterExists = false;
} else if ((_vm->_curRoom == r2F) && (_vm->_oldRoom == r31))
StartCharacterAction(a2F4ESCEASCENSORE, 0, 0, 0);
else if ((_vm->_curRoom == r31) && (_vm->_oldRoom == r2F))
StartCharacterAction(a3114ESCEPASSAGGIO, 0, 0, 0);
else if ((_vm->_curRoom == r31) && !(_vm->_room[r31]._flag & OBJFLAG_DONE))
setPosition(14);
else if ((_vm->_curRoom == r32) && (_vm->_oldRoom == r31))
StartCharacterAction(a321SALEMONTACARICHI, 0, 0, 0);
else if ((_vm->_curRoom == r33) && (_vm->_oldRoom == r32) && (_vm->_obj[oBRUCIATURA33]._mode & OBJMODE_OBJSTATUS))
StartCharacterAction(a3311SALESCALE, 0, 0, 0);
else if ((_vm->_curRoom == r33) && (_vm->_oldRoom == r32) && !(_vm->_obj[oBRUCIATURA33]._mode & OBJMODE_OBJSTATUS))
StartCharacterAction(a3313CHIUDEBOTOLA, 0, 0, 0);
else if ((_vm->_curRoom == r32) && (_vm->_oldRoom == r33))
StartCharacterAction(a325SCENDESCALE, 0, 0, 0);
else if ((_vm->_curRoom == r36) && (_vm->_oldRoom == r35))
StartCharacterAction(a361ESCEASCENSORE, 0, 0, 0);
else if ((_vm->_curRoom == r35) && (_vm->_oldRoom == r36))
StartCharacterAction(a3515ESCEASCENSORE, 0, 0, 0);
else if ((_vm->_curRoom == r44) && (_vm->_oldRoom == r45 || _vm->_oldRoom == r45S) && !(_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a445, 0, 0, 0);
else if ((_vm->_curRoom == r45 || _vm->_curRoom == r45S) && (_vm->_oldRoom == r44) && !(_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a457, 0, 0, 0);
else if ((_vm->_curRoom == r46) && (_vm->_oldRoom == r47 || _vm->_oldRoom == r48 || _vm->_oldRoom == r49) && !(_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((_vm->_curRoom == r47) && (_vm->_oldRoom == r46) && !(_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a476, 0, 0, 0);
else if ((_vm->_curRoom == r48) && (_vm->_oldRoom == r46) && !(_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a485, 0, 0, 0);
else if ((_vm->_curRoom == r49) && (_vm->_oldRoom == r46) && !(_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a494, 0, 0, 0);
else if ((_vm->_curRoom == r54) && (_vm->_oldRoom == r53)) {
StartCharacterAction(a5411, 0, 11, 0);
_vm->_inventoryObj[iLASER35]._examine = 1599;
} else if ((_vm->_oldRoom == r41D) && (_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA)) {
setPosition(30);
drawCharacter(CALCPOINTS);
}
// FullMotion
if ((_vm->_curRoom == r17) && (_vm->_oldRoom == r16)) {
PlayDialog(dF171);
WaitSoundFadEnd();
} else if ((_vm->_curRoom == r16) && (_vm->_oldRoom == r17)) {
PlayDialog(dF161);
WaitSoundFadEnd();
_vm->removeIcon(iFOGLIO14);
} else if ((_vm->_curRoom == r21) && (_vm->_oldRoom == r1C)) {
PlayDialog(dF1C1);
WaitSoundFadEnd();
} else if ((_vm->_curRoom == r23B) && (_vm->_oldRoom == r23A)) {
PlayDialog(dF231);
WaitSoundFadEnd();
_vm->removeIcon(iMAPPA17);
} else if ((_vm->_curRoom == r29L) && (_vm->_oldRoom == r29)) {
PlayDialog(dF291);
WaitSoundFadEnd();
} else if ((_vm->_curRoom == r2GV) && (_vm->_oldRoom == r2G)) {
PlayDialog(dF2G2);
WaitSoundFadEnd();
} else if ((_vm->_curRoom == r31) && (_vm->_oldRoom == r32) && (_vm->_room[r32]._flag & OBJFLAG_EXTRA)) {
PlayDialog(dF321);
_vm->_flagShowCharacter = false;
WaitSoundFadEnd();
_vm->_room[r32]._flag &= ~OBJFLAG_EXTRA;
} else if ((_vm->_curRoom == r19) && !(_vm->_room[r19]._flag & OBJFLAG_DONE)) {
_vm->playScript(s19EVA);
_vm->_flagNoPaintScreen = false;
_vm->clearText();
_vm->redrawString();
WaitSoundFadEnd();
}
// CHECKME: This check is identical to the 3rd one, thus it's always false
else if ((_vm->_curRoom == r21) && (/*!( _room[_vm->_curRoom]._flag & OBJFLAG_DONE ) || */ (_vm->_oldRoom == r1C))) {
setPosition(10);
TendIn();
_vm->_flagNoPaintScreen = false;
_vm->clearText();
_vm->redrawString();
} else if ((_vm->_curRoom == r46) && (_vm->_oldRoom == r43) && !(_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA)) {
PlayDialog(dF431);
WaitSoundFadEnd();
} else if ((_vm->_curRoom == r45S) && (_vm->_oldRoom == r45) && !(_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA)) {
PlayDialog(dF451);
WaitSoundFadEnd();
} else if ((_vm->_curRoom == r4A) && (_vm->_oldRoom == r49) && !(_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA)) {
PlayDialog(dF491);
WaitSoundFadEnd();
} else if ((_vm->_curRoom == r4A) && (_vm->_oldRoom == r41D) && (_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA) && (_vm->_obj[ocHELLEN4A]._mode & OBJMODE_OBJSTATUS)) {
WaitSoundFadEnd();
PlayDialog(dC4A1);
} else if ((_vm->_curRoom == r4P) && (_vm->_oldRoom == r4O) && !(_vm->_room[r4P]._flag & OBJFLAG_DONE)) {
PlayDialog(dF4PI);
_vm->_flagShowCharacter = false;
WaitSoundFadEnd();
} else if ((_vm->_curRoom == r51) && (_vm->_oldRoom == r4CT)) {
PlayDialog(dF4C1);
_vm->_flagShowCharacter = false;
WaitSoundFadEnd();
} else if ((_vm->_curRoom == r1A) && (_vm->_oldRoom == r18)) {
if (!(_vm->_room[r1A]._flag & OBJFLAG_DONE)) {
PlayDialog(dF1A1);
WaitSoundFadEnd();
_vm->_obj[oTOPO1C]._flag |= OBJFLAG_TAKE;
_vm->_obj[oTOPO1C]._anim = a1C3RACCOGLIETOPO;
} else {
TendIn();
_vm->_flagNoPaintScreen = false;
_vm->redrawString();
}
} else {
TendIn();
_vm->_flagNoPaintScreen = false;
_vm->clearText();
_vm->redrawString();
}
// Sentence
if ((_vm->_curRoom == r17) && (_vm->_oldRoom == r18) && !(_vm->_room[r17]._flag & OBJFLAG_DONE) && (_vm->_obj[oRETE17]._mode & OBJMODE_OBJSTATUS))
CharacterSay(189);
if (((_vm->_curRoom == r12CU) || (_vm->_curRoom == r13CU)) && _vm->_closeUpObj && _vm->_obj[_vm->_closeUpObj]._examine)
CharacterSay(_vm->_obj[_vm->_closeUpObj]._examine);
else if ((_vm->_curRoom == r23A) && (_vm->_oldRoom == r21) && !(_vm->_room[r23A]._flag & OBJFLAG_DONE)) {
_vm->_flagShowCharacter = true;
StartCharacterAction(aWALKIN, 0, 0, 361);
} else if ((_vm->_curRoom == r24) && !(_vm->_room[r24]._flag & OBJFLAG_DONE))
CharacterSay(381);
else if ((_vm->_curRoom == r2G) && !(_vm->_room[r2G]._flag & OBJFLAG_DONE))
CharacterSay(688);
else if ((_vm->_curRoom == r4C) && (_vm->_oldRoom == r4CT))
CharacterSay(1163);
else if ((_vm->_curRoom == r41) && (_vm->_oldRoom == r36) && !(_vm->_room[r41]._flag & OBJFLAG_DONE))
CharacterSay(900);
else if ((_vm->_curRoom == r58) && (_vm->_obj[oGUARDIA58]._mode & OBJMODE_OBJSTATUS) && (_vm->_obj[oGUARDIA58]._anim)) {
_vm->_curObj = oGUARDIA58;
doEvent(MC_MOUSE, ME_MRIGHT, MP_DEFAULT, 372, 335 + TOP, 0, oGUARDIA58);
} else if ((_vm->_curRoom == r59L))
CharacterSay(1394);
else if ((_vm->_curRoom == r58) && (_vm->_oldRoom == r58T))
CharacterSay(1368);
else if ((_vm->_curRoom == r5A) && !(_vm->_room[r5A]._flag & OBJFLAG_DONE))
CharacterSay(1408);
else if ((_vm->_curRoom == rSYS) && (_vm->_oldRoom == rSYS))
_vm->_logicMgr->DoSys(o00LOAD);
_vm->_inventoryObj[iDISLOCATORE]._flag &= ~OBJFLAG_EXTRA;
}
void LogicManager::initInventory() { void LogicManager::initInventory() {
_vm->_inventorySize = 0; _vm->_inventorySize = 0;
_vm->_inventory[_vm->_inventorySize++] = iBANCONOTE; _vm->_inventory[_vm->_inventorySize++] = iBANCONOTE;
@ -3600,7 +3873,7 @@ void LogicManager::doMouseLeftRight() {
if (GAMEAREA(_vm->_curMessage->_u16Param2) && !_vm->_flagUseWithStarted && (_vm->_curObj != oSNAKEU52)) { if (GAMEAREA(_vm->_curMessage->_u16Param2) && !_vm->_flagUseWithStarted && (_vm->_curObj != oSNAKEU52)) {
StartCharacterAction(a526, 0, 1, 0); StartCharacterAction(a526, 0, 1, 0);
_vm->_obj[oSCAVO51]._anim = a516; _vm->_obj[oSCAVO51]._anim = a516;
memcpy(&_vm->_snake52, _vm->_curMessage, sizeof(_vm->_snake52)); _vm->_snake52.set(_vm->_curMessage);
return; return;
} }
} }

View File

@ -61,7 +61,9 @@ public:
void initScript(); void initScript();
void initInventory(); void initInventory();
void setRoom(uint16 r, bool b); void setRoom(uint16 r, bool altRoomFl);
void endChangeRoom();
void useInventoryWithInventory(bool *updateInv, bool *printSentence); void useInventoryWithInventory(bool *updateInv, bool *printSentence);
void useInventoryWithScreen(bool *updateInv, bool *printSentence); void useInventoryWithScreen(bool *updateInv, bool *printSentence);
bool useScreenWithScreen(); bool useScreenWithScreen();

View File

@ -358,7 +358,7 @@ void doSystem() {
if (g_vm->_curMessage->_u16Param2) if (g_vm->_curMessage->_u16Param2)
StartCharacterAction(g_vm->_curMessage->_u16Param2, 0, 0, 0); StartCharacterAction(g_vm->_curMessage->_u16Param2, 0, 0, 0);
AtEndChangeRoom(); g_vm->_logicMgr->endChangeRoom();
g_vm->_room[g_vm->_curRoom]._flag |= OBJFLAG_DONE; // Visited g_vm->_room[g_vm->_curRoom]._flag |= OBJFLAG_DONE; // Visited
drawCharacter(CALCPOINTS); // for right _actorPos entrance drawCharacter(CALCPOINTS); // for right _actorPos entrance

View File

@ -341,291 +341,19 @@ bool AtMouseClick(uint16 curObj) {
return retVal; return retVal;
} }
/* -----------------26/11/97 10.37-------------------
* AtEndChangeRoom
* --------------------------------------------------*/
void AtEndChangeRoom() {
// Specific management of magnetic fields
if ((g_vm->_curRoom == r2E) && (g_vm->_obj[oPULSANTEADS2D]._mode & OBJMODE_OBJSTATUS)) {
g_vm->_animMgr->_animTab[aBKG2E]._flag |= SMKANIM_OFF1;
g_vm->_obj[oCAMPO2E]._mode &= ~OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOA2E]._mode &= ~OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOS2E]._mode |= OBJMODE_OBJSTATUS;
} else if ((g_vm->_curRoom == r2E) && (g_vm->_obj[oPULSANTEADA2D]._mode & OBJMODE_OBJSTATUS)) {
g_vm->_animMgr->_animTab[aBKG2E]._flag &= ~SMKANIM_OFF1;
g_vm->_obj[oCAMPO2E]._mode |= OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOA2E]._mode |= OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOS2E]._mode &= ~OBJMODE_OBJSTATUS;
}
if ((g_vm->_curRoom == r2C) && (g_vm->_obj[oPULSANTEACS2D]._mode & OBJMODE_OBJSTATUS)) {
g_vm->_animMgr->_animTab[aBKG2C]._flag |= SMKANIM_OFF1;
g_vm->_obj[oCAMPO2C]._mode &= ~OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOA2C]._mode &= ~OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOS2C]._mode |= OBJMODE_OBJSTATUS;
} else if ((g_vm->_curRoom == r2C) && (g_vm->_obj[oPULSANTEACA2D]._mode & OBJMODE_OBJSTATUS)) {
g_vm->_animMgr->_animTab[aBKG2C]._flag &= ~SMKANIM_OFF1;
g_vm->_obj[oCAMPO2C]._mode |= OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOS2C]._mode &= ~OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOA2C]._mode |= OBJMODE_OBJSTATUS;
}
if ((g_vm->_curRoom == r28) && (g_vm->_obj[oPULSANTEBBS2D]._mode & OBJMODE_OBJSTATUS)) {
g_vm->_animMgr->_animTab[aBKG28]._flag |= SMKANIM_OFF2;
g_vm->_obj[oCESPUGLIO28]._anim = a283;
g_vm->_obj[oSERPENTETM28]._mode |= OBJMODE_OBJSTATUS;
g_vm->_obj[oSERPENTEAM28]._mode |= OBJMODE_OBJSTATUS;
RegenRoom();
} else if ((g_vm->_curRoom == r28) && (g_vm->_obj[oPULSANTEBBA2D]._mode & OBJMODE_OBJSTATUS)) {
g_vm->_animMgr->_animTab[aBKG28]._flag &= ~SMKANIM_OFF2;
g_vm->_obj[oCESPUGLIO28]._anim = a282;
g_vm->_obj[oSERPENTETM28]._mode &= ~OBJMODE_OBJSTATUS;
g_vm->_obj[oSERPENTEAM28]._mode &= ~OBJMODE_OBJSTATUS;
RegenRoom();
}
if ((g_vm->_curRoom == r28) && (g_vm->_obj[oPULSANTEABS2D]._mode & OBJMODE_OBJSTATUS)) {
g_vm->_animMgr->_animTab[aBKG28]._flag |= (SMKANIM_OFF1 | SMKANIM_OFF3);
g_vm->_obj[oCAMPO28]._mode &= ~OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOA28]._mode &= ~OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOS28]._mode |= OBJMODE_OBJSTATUS;
read3D("282.3d");
} else if ((g_vm->_curRoom == r28) && (g_vm->_obj[oPULSANTEABA2D]._mode & OBJMODE_OBJSTATUS)) {
g_vm->_animMgr->_animTab[aBKG28]._flag &= ~(SMKANIM_OFF1 | SMKANIM_OFF3);
g_vm->_obj[oCAMPO28]._mode |= OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOA28]._mode |= OBJMODE_OBJSTATUS;
g_vm->_obj[oCARTELLOS28]._mode &= ~OBJMODE_OBJSTATUS;
}
// End of specific management for the magnetic fields
// Actions
if ((g_vm->_curRoom == r12) && ((g_vm->_oldRoom == r13) || (g_vm->_oldRoom == r16)))
StartCharacterAction(a1213ARRIVACONASCENSORE, 0, 0, 0);
else if ((g_vm->_curRoom == r16) && ((g_vm->_oldRoom == r13) || (g_vm->_oldRoom == r12)))
StartCharacterAction(a1617SCENDECONASCENSORE, 0, 0, 0);
else if ((g_vm->_curRoom == r13) && (g_vm->_oldRoom == r12))
StartCharacterAction(a1315ARRIVAASCENSOREALTOENTRA, 0, 0, 0);
else if ((g_vm->_curRoom == r13) && (g_vm->_oldRoom == r16))
StartCharacterAction(a1314ARRIVAASCENSOREDABASSO, 0, 0, 0);
else if ((g_vm->_curRoom == r14) && (g_vm->_oldRoom == r13))
StartCharacterAction(a1414ENTERROOM, 0, 0, 0);
else if ((g_vm->_curRoom == r18) && (g_vm->_oldRoom == r17) && !(g_vm->_room[r18]._flag & OBJFLAG_DONE))
StartCharacterAction(a186GUARDAPIAZZA, 0, 0, 0);
else if ((g_vm->_curRoom == r18) && (g_vm->_oldRoom == r19))
StartCharacterAction(a189ENTRADALCLUB, 0, 0, 0);
else if ((g_vm->_curRoom == r1A) && (g_vm->_oldRoom == r18) && (g_vm->_room[r1A]._flag & OBJFLAG_DONE)) {
StartCharacterAction(a1A5ENTRA, 0, 0, 0);
g_vm->_animMgr->_animTab[aBKG1A]._flag |= SMKANIM_OFF1;
} else if ((g_vm->_curRoom == r1C) && (g_vm->_oldRoom == r1B))
StartCharacterAction(a1C1ENTRACUNICOLO, 0, 0, 0);
else if ((g_vm->_curRoom == r1B) && (g_vm->_oldRoom == r1C))
StartCharacterAction(a1B11ESCETOMBINO, 0, 0, 0);
else if ((g_vm->_curRoom == r1D) && (g_vm->_oldRoom == r1B) && (g_vm->_obj[oDONNA1D]._mode & OBJMODE_OBJSTATUS)) {
StartCharacterAction(a1D1SCENDESCALE, 0, 1, 0);
g_vm->_actor->_lim[0] = 60;
g_vm->_actor->_lim[2] = 240;
} else if ((g_vm->_curRoom == r1D) && (g_vm->_oldRoom == r1B) && !(g_vm->_obj[oDONNA1D]._mode & OBJMODE_OBJSTATUS)) {
StartCharacterAction(a1D12SCENDESCALA, 0, 1, 0);
g_vm->_actor->_lim[0] = 60;
g_vm->_actor->_lim[2] = 240;
} else if ((g_vm->_curRoom == r1B) && (g_vm->_oldRoom == r1D))
StartCharacterAction(a1B4ESCEBOTOLA, 0, 0, 0);
else if ((g_vm->_curRoom == r1B) && (g_vm->_oldRoom == r18) && (g_vm->_animMgr->_animTab[aBKG1B]._flag & SMKANIM_OFF1))
StartCharacterAction(a1B12SCAPPATOPO, 0, 0, 0);
else if ((g_vm->_curRoom == r24) && (g_vm->_oldRoom == r2H))
StartCharacterAction(a242, 0, 0, 0);
else if ((g_vm->_curRoom == r25) && (g_vm->_oldRoom == r2A))
StartCharacterAction(a257, 0, 0, 0);
else if ((g_vm->_curRoom == r28) && (g_vm->_oldRoom == r27))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((g_vm->_curRoom == r29) && (g_vm->_oldRoom == r2A))
StartCharacterAction(a298ESCEBOTOLA, 0, 0, 0);
else if ((g_vm->_curRoom == r29L) && (g_vm->_oldRoom == r2A))
StartCharacterAction(a2910ESCEBOTOLA, 0, 0, 0);
else if ((g_vm->_curRoom == r2A) && (g_vm->_oldRoom == r25))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((g_vm->_curRoom == r2A) && ((g_vm->_oldRoom == r29) || (g_vm->_oldRoom == r29L)))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((g_vm->_curRoom == r2B) && (g_vm->_oldRoom == r2A))
StartCharacterAction(a2B2ESCEPOZZO, 0, 2, 0);
else if ((g_vm->_curRoom == r2H) && (g_vm->_oldRoom == r24))
StartCharacterAction(a2H1ARRIVA, 0, 0, 0);
else if ((g_vm->_curRoom == r2E) && (g_vm->_oldRoom == r2F))
StartCharacterAction(a2E5SECONDAPARRIVANDO, 0, 0, 0);
else if ((g_vm->_curRoom == r2F) && (g_vm->_oldRoom == r2E))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((g_vm->_curRoom == r23B) && (g_vm->_oldRoom == r21))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((g_vm->_curRoom == r23A) && (g_vm->_oldRoom == r21) && (g_vm->_room[r23A]._flag & OBJFLAG_DONE))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((g_vm->_curRoom == r23A) && (g_vm->_oldRoom == r21) && (!(g_vm->_room[r23A]._flag & OBJFLAG_DONE)))
g_vm->_flagShowCharacter = false;
else if ((g_vm->_curRoom == r21) && ((g_vm->_oldRoom == r23A) || (g_vm->_oldRoom == r23B)))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((g_vm->_curRoom == r2BL) || (g_vm->_curRoom == r36F) || (g_vm->_curRoom == r41D) || (g_vm->_curRoom == r49M) || (g_vm->_curRoom == r4CT) ||
(g_vm->_curRoom == r58T) || (g_vm->_curRoom == r58M) || (g_vm->_curRoom == r59L) || (g_vm->_curRoom == rSYS) ||
(g_vm->_curRoom == r12CU) || (g_vm->_curRoom == r13CU)) { // Screens without inventory
g_vm->_flagShowCharacter = false;
g_vm->_flagCharacterExists = false;
g_vm->_flagInventoryLocked = true;
} else if ((g_vm->_curRoom == r31P) || (g_vm->_curRoom == r35P)) { // Screens with inventory
g_vm->_flagShowCharacter = false;
g_vm->_flagCharacterExists = false;
} else if ((g_vm->_curRoom == r2F) && (g_vm->_oldRoom == r31))
StartCharacterAction(a2F4ESCEASCENSORE, 0, 0, 0);
else if ((g_vm->_curRoom == r31) && (g_vm->_oldRoom == r2F))
StartCharacterAction(a3114ESCEPASSAGGIO, 0, 0, 0);
else if ((g_vm->_curRoom == r31) && !(g_vm->_room[r31]._flag & OBJFLAG_DONE))
setPosition(14);
else if ((g_vm->_curRoom == r32) && (g_vm->_oldRoom == r31))
StartCharacterAction(a321SALEMONTACARICHI, 0, 0, 0);
else if ((g_vm->_curRoom == r33) && (g_vm->_oldRoom == r32) && (g_vm->_obj[oBRUCIATURA33]._mode & OBJMODE_OBJSTATUS))
StartCharacterAction(a3311SALESCALE, 0, 0, 0);
else if ((g_vm->_curRoom == r33) && (g_vm->_oldRoom == r32) && !(g_vm->_obj[oBRUCIATURA33]._mode & OBJMODE_OBJSTATUS))
StartCharacterAction(a3313CHIUDEBOTOLA, 0, 0, 0);
else if ((g_vm->_curRoom == r32) && (g_vm->_oldRoom == r33))
StartCharacterAction(a325SCENDESCALE, 0, 0, 0);
else if ((g_vm->_curRoom == r36) && (g_vm->_oldRoom == r35))
StartCharacterAction(a361ESCEASCENSORE, 0, 0, 0);
else if ((g_vm->_curRoom == r35) && (g_vm->_oldRoom == r36))
StartCharacterAction(a3515ESCEASCENSORE, 0, 0, 0);
else if ((g_vm->_curRoom == r44) && (g_vm->_oldRoom == r45 || g_vm->_oldRoom == r45S) && !(g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a445, 0, 0, 0);
else if ((g_vm->_curRoom == r45 || g_vm->_curRoom == r45S) && (g_vm->_oldRoom == r44) && !(g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a457, 0, 0, 0);
else if ((g_vm->_curRoom == r46) && (g_vm->_oldRoom == r47 || g_vm->_oldRoom == r48 || g_vm->_oldRoom == r49) && !(g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(aWALKIN, 0, 0, 0);
else if ((g_vm->_curRoom == r47) && (g_vm->_oldRoom == r46) && !(g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a476, 0, 0, 0);
else if ((g_vm->_curRoom == r48) && (g_vm->_oldRoom == r46) && !(g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a485, 0, 0, 0);
else if ((g_vm->_curRoom == r49) && (g_vm->_oldRoom == r46) && !(g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA))
StartCharacterAction(a494, 0, 0, 0);
else if ((g_vm->_curRoom == r54) && (g_vm->_oldRoom == r53)) {
StartCharacterAction(a5411, 0, 11, 0);
g_vm->_inventoryObj[iLASER35]._examine = 1599;
} else if ((g_vm->_oldRoom == r41D) && (g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA)) {
setPosition(30);
drawCharacter(CALCPOINTS);
}
// FullMotion
if ((g_vm->_curRoom == r17) && (g_vm->_oldRoom == r16)) {
PlayDialog(dF171);
WaitSoundFadEnd();
} else if ((g_vm->_curRoom == r16) && (g_vm->_oldRoom == r17)) {
PlayDialog(dF161);
WaitSoundFadEnd();
g_vm->removeIcon(iFOGLIO14);
} else if ((g_vm->_curRoom == r21) && (g_vm->_oldRoom == r1C)) {
PlayDialog(dF1C1);
WaitSoundFadEnd();
} else if ((g_vm->_curRoom == r23B) && (g_vm->_oldRoom == r23A)) {
PlayDialog(dF231);
WaitSoundFadEnd();
g_vm->removeIcon(iMAPPA17);
} else if ((g_vm->_curRoom == r29L) && (g_vm->_oldRoom == r29)) {
PlayDialog(dF291);
WaitSoundFadEnd();
} else if ((g_vm->_curRoom == r2GV) && (g_vm->_oldRoom == r2G)) {
PlayDialog(dF2G2);
WaitSoundFadEnd();
} else if ((g_vm->_curRoom == r31) && (g_vm->_oldRoom == r32) && (g_vm->_room[r32]._flag & OBJFLAG_EXTRA)) {
PlayDialog(dF321);
g_vm->_flagShowCharacter = false;
WaitSoundFadEnd();
g_vm->_room[r32]._flag &= ~OBJFLAG_EXTRA;
} else if ((g_vm->_curRoom == r19) && !(g_vm->_room[r19]._flag & OBJFLAG_DONE)) {
g_vm->playScript(s19EVA);
g_vm->_flagNoPaintScreen = false;
g_vm->clearText();
g_vm->redrawString();
WaitSoundFadEnd();
}
// CHECKME: This check is identical to the 3rd one, thus it's always false
else if ((g_vm->_curRoom == r21) && (/*!( _room[g_vm->_curRoom]._flag & OBJFLAG_DONE ) || */ (g_vm->_oldRoom == r1C))) {
setPosition(10);
TendIn();
g_vm->_flagNoPaintScreen = false;
g_vm->clearText();
g_vm->redrawString();
} else if ((g_vm->_curRoom == r46) && (g_vm->_oldRoom == r43) && !(g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA)) {
PlayDialog(dF431);
WaitSoundFadEnd();
} else if ((g_vm->_curRoom == r45S) && (g_vm->_oldRoom == r45) && !(g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA)) {
PlayDialog(dF451);
WaitSoundFadEnd();
} else if ((g_vm->_curRoom == r4A) && (g_vm->_oldRoom == r49) && !(g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA)) {
PlayDialog(dF491);
WaitSoundFadEnd();
} else if ((g_vm->_curRoom == r4A) && (g_vm->_oldRoom == r41D) && (g_vm->_inventoryObj[iDISLOCATORE]._flag & OBJFLAG_EXTRA) && (g_vm->_obj[ocHELLEN4A]._mode & OBJMODE_OBJSTATUS)) {
WaitSoundFadEnd();
PlayDialog(dC4A1);
} else if ((g_vm->_curRoom == r4P) && (g_vm->_oldRoom == r4O) && !(g_vm->_room[r4P]._flag & OBJFLAG_DONE)) {
PlayDialog(dF4PI);
g_vm->_flagShowCharacter = false;
WaitSoundFadEnd();
} else if ((g_vm->_curRoom == r51) && (g_vm->_oldRoom == r4CT)) {
PlayDialog(dF4C1);
g_vm->_flagShowCharacter = false;
WaitSoundFadEnd();
} else if ((g_vm->_curRoom == r1A) && (g_vm->_oldRoom == r18)) {
if (!(g_vm->_room[r1A]._flag & OBJFLAG_DONE)) {
PlayDialog(dF1A1);
WaitSoundFadEnd();
g_vm->_obj[oTOPO1C]._flag |= OBJFLAG_TAKE;
g_vm->_obj[oTOPO1C]._anim = a1C3RACCOGLIETOPO;
} else {
TendIn();
g_vm->_flagNoPaintScreen = false;
g_vm->redrawString();
}
} else {
TendIn();
g_vm->_flagNoPaintScreen = false;
g_vm->clearText();
g_vm->redrawString();
}
// Sentence
if ((g_vm->_curRoom == r17) && (g_vm->_oldRoom == r18) && !(g_vm->_room[r17]._flag & OBJFLAG_DONE) && (g_vm->_obj[oRETE17]._mode & OBJMODE_OBJSTATUS))
CharacterSay(189);
if (((g_vm->_curRoom == r12CU) || (g_vm->_curRoom == r13CU)) && g_vm->_closeUpObj && g_vm->_obj[g_vm->_closeUpObj]._examine)
CharacterSay(g_vm->_obj[g_vm->_closeUpObj]._examine);
else if ((g_vm->_curRoom == r23A) && (g_vm->_oldRoom == r21) && !(g_vm->_room[r23A]._flag & OBJFLAG_DONE)) {
g_vm->_flagShowCharacter = true;
StartCharacterAction(aWALKIN, 0, 0, 361);
} else if ((g_vm->_curRoom == r24) && !(g_vm->_room[r24]._flag & OBJFLAG_DONE))
CharacterSay(381);
else if ((g_vm->_curRoom == r2G) && !(g_vm->_room[r2G]._flag & OBJFLAG_DONE))
CharacterSay(688);
else if ((g_vm->_curRoom == r4C) && (g_vm->_oldRoom == r4CT))
CharacterSay(1163);
else if ((g_vm->_curRoom == r41) && (g_vm->_oldRoom == r36) && !(g_vm->_room[r41]._flag & OBJFLAG_DONE))
CharacterSay(900);
else if ((g_vm->_curRoom == r58) && (g_vm->_obj[oGUARDIA58]._mode & OBJMODE_OBJSTATUS) && (g_vm->_obj[oGUARDIA58]._anim)) {
g_vm->_curObj = oGUARDIA58;
doEvent(MC_MOUSE, ME_MRIGHT, MP_DEFAULT, 372, 335 + TOP, 0, oGUARDIA58);
} else if ((g_vm->_curRoom == r59L))
CharacterSay(1394);
else if ((g_vm->_curRoom == r58) && (g_vm->_oldRoom == r58T))
CharacterSay(1368);
else if ((g_vm->_curRoom == r5A) && !(g_vm->_room[r5A]._flag & OBJFLAG_DONE))
CharacterSay(1408);
else if ((g_vm->_curRoom == rSYS) && (g_vm->_oldRoom == rSYS))
g_vm->_logicMgr->DoSys(o00LOAD);
g_vm->_inventoryObj[iDISLOCATORE]._flag &= ~OBJFLAG_EXTRA;
}
/* -----------------26/11/97 10.38------------------- /* -----------------26/11/97 10.38-------------------
* GestioneATFrame * GestioneATFrame
* --------------------------------------------------*/ * --------------------------------------------------*/
#define ATF_WAITTEXT 1 #define ATF_WAITTEXT 1
static struct ATFHandle { static struct ATFHandle {
int16 curframe, lastframe; int16 _curFrame;
uint16 object; int16 _lastFrame;
uint16 status; uint16 _object;
SAnim *curanim; uint16 _status;
} // 0->character 1->background 2->icon SAnim *_curAnim;
AnimType[3] = { {true}, {true}, {true} }; }
AnimType[3] = { {1}, {1}, {1} };
void ExecuteAtFrameDoit(ATFHandle *h, int doit, int obj) { void ExecuteAtFrameDoit(ATFHandle *h, int doit, int obj) {
switch (doit) { switch (doit) {
@ -742,12 +470,14 @@ void ExecuteAtFrameDoit(ATFHandle *h, int doit, int obj) {
doEvent(MC_SYSTEM, ME_QUIT, MP_SYSTEM, 0, 0, 0, 0); doEvent(MC_SYSTEM, ME_QUIT, MP_SYSTEM, 0, 0, 0, 0);
break; break;
case fSTOP2TXT: case fSTOP2TXT:
h->status |= ATF_WAITTEXT; h->_status |= ATF_WAITTEXT;
// Sets a flag that is always cleared when you finish speaking // Sets a flag that is always cleared when you finish speaking
// if the flag is cleared the anim no longer plays // if the flag is cleared the anim no longer plays
// (to be done in the smacker player) // (to be done in the smacker player)
// also the counters in AtFrameNext stops // also the counters in AtFrameNext stops
break; break;
default:
break;
} }
} }
@ -756,92 +486,98 @@ void ProcessAtFrame(ATFHandle *h, int type, int atf) {
switch (type) { switch (type) {
case ATFTEXT: case ATFTEXT:
CharacterTalkInAction(h->curanim->_atFrame[atf]._index); CharacterTalkInAction(h->_curAnim->_atFrame[atf]._index);
break; break;
case ATFTEXTACT: case ATFTEXTACT:
CharacterTalkInAction(g_vm->_obj[h->object]._action); CharacterTalkInAction(g_vm->_obj[h->_object]._action);
break; break;
case ATFTEXTEX: case ATFTEXTEX:
CharacterTalkInAction(g_vm->_obj[h->object]._examine); CharacterTalkInAction(g_vm->_obj[h->_object]._examine);
break; break;
case ATFCLR: case ATFCLR:
g_vm->_obj[h->curanim->_atFrame[atf]._index]._mode &= ~OBJMODE_OBJSTATUS; g_vm->_obj[h->_curAnim->_atFrame[atf]._index]._mode &= ~OBJMODE_OBJSTATUS;
RegenRoom(); RegenRoom();
break; break;
case ATFCLRI: case ATFCLRI:
g_vm->removeIcon(h->curanim->_atFrame[atf]._index); g_vm->removeIcon(h->_curAnim->_atFrame[atf]._index);
break; break;
case ATFCEX: case ATFCEX:
g_vm->_obj[h->object]._examine = h->curanim->_atFrame[atf]._index; g_vm->_obj[h->_object]._examine = h->_curAnim->_atFrame[atf]._index;
break; break;
case ATFCACT: case ATFCACT:
g_vm->_obj[h->object]._action = h->curanim->_atFrame[atf]._index; g_vm->_obj[h->_object]._action = h->_curAnim->_atFrame[atf]._index;
break; break;
case ATFSET: case ATFSET:
g_vm->_obj[h->curanim->_atFrame[atf]._index]._mode |= OBJMODE_OBJSTATUS; g_vm->_obj[h->_curAnim->_atFrame[atf]._index]._mode |= OBJMODE_OBJSTATUS;
RegenRoom(); RegenRoom();
break; break;
case ATFSETI: case ATFSETI:
g_vm->addIcon(h->curanim->_atFrame[atf]._index); g_vm->addIcon(h->_curAnim->_atFrame[atf]._index);
break; break;
case ATFDO: case ATFDO:
ExecuteAtFrameDoit(h, h->curanim->_atFrame[atf]._index, h->object); ExecuteAtFrameDoit(h, h->_curAnim->_atFrame[atf]._index, h->_object);
break; break;
case ATFROOM: case ATFROOM:
doEvent(MC_SYSTEM, ME_CHANGEROOM, MP_SYSTEM, h->curanim->_atFrame[atf]._index, 0, 0, h->object); doEvent(MC_SYSTEM, ME_CHANGEROOM, MP_SYSTEM, h->_curAnim->_atFrame[atf]._index, 0, 0, h->_object);
break; break;
case ATFSETPOS: case ATFSETPOS:
setPosition(h->curanim->_atFrame[atf]._index); setPosition(h->_curAnim->_atFrame[atf]._index);
break; break;
case ATFDIALOG: case ATFDIALOG:
PlayDialog(h->curanim->_atFrame[atf]._index); PlayDialog(h->_curAnim->_atFrame[atf]._index);
break; break;
case ATFCOBJANIM: case ATFCOBJANIM:
g_vm->_obj[h->object]._anim = h->curanim->_atFrame[atf]._index; g_vm->_obj[h->_object]._anim = h->_curAnim->_atFrame[atf]._index;
RegenRoom(); RegenRoom();
break; break;
case ATFCOBJBOX: case ATFCOBJBOX:
g_vm->_obj[h->object]._nbox = h->curanim->_atFrame[atf]._index; g_vm->_obj[h->_object]._nbox = h->_curAnim->_atFrame[atf]._index;
RegenRoom(); RegenRoom();
break; break;
case ATFCOBJPOS: case ATFCOBJPOS:
g_vm->_obj[h->object]._position = h->curanim->_atFrame[atf]._index; g_vm->_obj[h->_object]._position = h->_curAnim->_atFrame[atf]._index;
RegenRoom(); RegenRoom();
break; break;
case ATFSETFORE: case ATFSETFORE:
g_vm->_obj[h->curanim->_atFrame[atf]._index]._nbox = FOREGROUND; g_vm->_obj[h->_curAnim->_atFrame[atf]._index]._nbox = FOREGROUND;
RegenRoom(); RegenRoom();
break; break;
case ATFSETBACK: case ATFSETBACK:
g_vm->_obj[h->curanim->_atFrame[atf]._index]._nbox = BACKGROUND; g_vm->_obj[h->_curAnim->_atFrame[atf]._index]._nbox = BACKGROUND;
RegenRoom(); RegenRoom();
break; break;
case ATFSWITCH: case ATFSWITCH:
g_vm->_obj[h->curanim->_atFrame[atf]._index]._mode ^= OBJMODE_OBJSTATUS; g_vm->_obj[h->_curAnim->_atFrame[atf]._index]._mode ^= OBJMODE_OBJSTATUS;
RegenRoom(); RegenRoom();
break; break;
case ATFSETROOMT: case ATFSETROOMT:
g_vm->setRoom(h->curanim->_atFrame[atf]._index, true); g_vm->setRoom(h->_curAnim->_atFrame[atf]._index, true);
break; break;
case ATFSETROOMF: case ATFSETROOMF:
g_vm->setRoom(h->curanim->_atFrame[atf]._index, false); g_vm->setRoom(h->_curAnim->_atFrame[atf]._index, false);
break; break;
case ATFREADBOX: case ATFREADBOX:
if (h->curanim->_atFrame[atf]._index == 1) { switch (h->_curAnim->_atFrame[atf]._index) {
case 1: {
Common::String filename = Common::String::format("%s.3d", g_vm->_room[g_vm->_curRoom]._baseName); Common::String filename = Common::String::format("%s.3d", g_vm->_room[g_vm->_curRoom]._baseName);
read3D(filename); read3D(filename);
g_vm->_room[g_vm->_curRoom]._flag &= ~OBJFLAG_EXTRA; g_vm->_room[g_vm->_curRoom]._flag &= ~OBJFLAG_EXTRA;
} else if (h->curanim->_atFrame[atf]._index == 2) { }
break;
case 2: {
Common::String filename = Common::String::format("%s2.3d", g_vm->_room[g_vm->_curRoom]._baseName); Common::String filename = Common::String::format("%s2.3d", g_vm->_room[g_vm->_curRoom]._baseName);
read3D(filename); read3D(filename);
g_vm->_room[g_vm->_curRoom]._flag |= OBJFLAG_EXTRA; g_vm->_room[g_vm->_curRoom]._flag |= OBJFLAG_EXTRA;
if (g_vm->_curRoom == r37) { if (g_vm->_curRoom == r37)
g_vm->_animMgr->smkVolumePan(0, 1, 1); g_vm->_animMgr->smkVolumePan(0, 1, 1);
} }
break;
default:
break;
} }
break; break;
case ATFONESPEAK: case ATFONESPEAK:
switch (h->curanim->_atFrame[atf]._index) { switch (h->_curAnim->_atFrame[atf]._index) {
case 1: case 1:
if (g_vm->_room[r1D]._flag & OBJFLAG_EXTRA) if (g_vm->_room[r1D]._flag & OBJFLAG_EXTRA)
break; break;
@ -854,13 +590,16 @@ void ProcessAtFrame(ATFHandle *h, int type, int atf) {
case 2: case 2:
SomeoneTalk(1788, ocNEGOZIANTE1A, 0, false); SomeoneTalk(1788, ocNEGOZIANTE1A, 0, false);
break; break;
default:
break;
} }
break; break;
case ATFEND: case ATFEND:
DemoOver(); DemoOver();
doEvent(MC_SYSTEM, ME_QUIT, MP_SYSTEM, 0, 0, 0, 0); doEvent(MC_SYSTEM, ME_QUIT, MP_SYSTEM, 0, 0, 0, 0);
break; break;
default:
break;
} }
} }
@ -871,20 +610,17 @@ void ProcessAtFrame(ATFHandle *h, int type, int atf) {
void InitAtFrameHandler(uint16 an, uint16 obj) { void InitAtFrameHandler(uint16 an, uint16 obj) {
SAnim *anim = &g_vm->_animMgr->_animTab[an]; SAnim *anim = &g_vm->_animMgr->_animTab[an];
ATFHandle *handle = &AnimType[0]; ATFHandle *handle = &AnimType[CHARACTER_ANIM];
if (anim->_flag & SMKANIM_BKG) if (anim->_flag & SMKANIM_BKG)
handle = &AnimType[1]; handle = &AnimType[BACKGROUND_ANIM];
if (anim->_flag & SMKANIM_ICON) if (anim->_flag & SMKANIM_ICON)
handle = &AnimType[2]; handle = &AnimType[ICON_ANIM];
handle->curanim = anim; handle->_curAnim = anim;
if (obj) handle->_object = obj ? obj : g_vm->_curObj;
handle->object = obj; handle->_curFrame = 0;
else handle->_lastFrame = -1;
handle->object = g_vm->_curObj; handle->_status = 0;
handle->curframe = 0;
handle->lastframe = -1;
handle->status = 0;
} }
/* -----------------11/07/97 11.41------------------- /* -----------------11/07/97 11.41-------------------
@ -892,8 +628,8 @@ void InitAtFrameHandler(uint16 an, uint16 obj) {
--------------------------------------------------*/ --------------------------------------------------*/
void AtFrameNext() { void AtFrameNext() {
for (int i = 0; i < 3; ++i) { for (int i = 0; i < 3; ++i) {
if (!(AnimType[i].status & ATF_WAITTEXT) || !g_vm->_flagCharacterSpeak) if (!(AnimType[i]._status & ATF_WAITTEXT) || !g_vm->_flagCharacterSpeak)
AnimType[i].curframe++; AnimType[i]._curFrame++;
} }
} }
@ -902,14 +638,14 @@ void AtFrameNext() {
--------------------------------------------------*/ --------------------------------------------------*/
void AtFrameEnd(int type) { void AtFrameEnd(int type) {
ATFHandle *h = &AnimType[type]; ATFHandle *h = &AnimType[type];
SAnim *anim = h->curanim; SAnim *anim = h->_curAnim;
h->curframe = 0; h->_curFrame = 0;
// if this ATFrame has already been handled // if this ATFrame has already been handled
if (h->curframe == h->lastframe) if (h->_curFrame == h->_lastFrame)
return; return;
h->lastframe = h->curframe; h->_lastFrame = h->_curFrame;
uint16 flag = g_vm->_animMgr->_animTab[g_vm->_room[g_vm->_curRoom]._bkgAnim]._flag; uint16 flag = g_vm->_animMgr->_animTab[g_vm->_room[g_vm->_curRoom]._bkgAnim]._flag;
@ -925,7 +661,7 @@ void AtFrameEnd(int type) {
} }
} }
h->curanim = nullptr; h->_curAnim = nullptr;
} }
/* -----------------11/07/97 11.44------------------- /* -----------------11/07/97 11.44-------------------
@ -933,21 +669,21 @@ void AtFrameEnd(int type) {
--------------------------------------------------*/ --------------------------------------------------*/
void AtFrameHandler(int type) { void AtFrameHandler(int type) {
ATFHandle *h = &AnimType[type]; ATFHandle *h = &AnimType[type];
SAnim *anim = h->curanim; SAnim *anim = h->_curAnim;
if (anim == nullptr) if (anim == nullptr)
return; return;
if (h->curframe == 0) if (h->_curFrame == 0)
h->curframe++; h->_curFrame++;
// if this ATFrame has already been applied // if this ATFrame has already been applied
if (h->curframe <= h->lastframe) if (h->_curFrame <= h->_lastFrame)
return; return;
uint16 flag = g_vm->_animMgr->_animTab[g_vm->_room[g_vm->_curRoom]._bkgAnim]._flag; uint16 flag = g_vm->_animMgr->_animTab[g_vm->_room[g_vm->_curRoom]._bkgAnim]._flag;
for (int32 a = 0; a < MAXATFRAME; a++) { for (int32 a = 0; a < MAXATFRAME; a++) {
// if it's time to run this AtFrame // if it's time to run this AtFrame
if ((anim->_atFrame[a]._numFrame > h->lastframe) && (anim->_atFrame[a]._numFrame <= h->curframe) && (anim->_atFrame[a]._numFrame != 0)) { if ((anim->_atFrame[a]._numFrame > h->_lastFrame) && (anim->_atFrame[a]._numFrame <= h->_curFrame) && (anim->_atFrame[a]._numFrame != 0)) {
if (anim->_atFrame[a]._child == 0 || if (anim->_atFrame[a]._child == 0 ||
(anim->_atFrame[a]._child == 1 && !(flag & SMKANIM_OFF1)) || (anim->_atFrame[a]._child == 1 && !(flag & SMKANIM_OFF1)) ||
(anim->_atFrame[a]._child == 2 && !(flag & SMKANIM_OFF2)) || (anim->_atFrame[a]._child == 2 && !(flag & SMKANIM_OFF2)) ||
@ -957,8 +693,8 @@ void AtFrameHandler(int type) {
} }
} }
// set lastframe // set _lastFrame
h->lastframe = h->curframe; h->_lastFrame = h->_curFrame;
} }
} // End of namespace Trecision } // End of namespace Trecision

View File

@ -66,7 +66,6 @@ void doInvOperate();
void doDoing(); void doDoing();
void doScript(); void doScript();
bool AtMouseClick(uint16 curObj); bool AtMouseClick(uint16 curObj);
void AtEndChangeRoom();
void ProcessAtFrame(ATFHandle *h, int type, int atf); void ProcessAtFrame(ATFHandle *h, int type, int atf);
void InitAtFrameHandler(uint16 an, uint16 obj); void InitAtFrameHandler(uint16 an, uint16 obj);
void AtFrameNext(); void AtFrameNext();

View File

@ -138,6 +138,17 @@ struct Message {
uint16 _u16Param2; // byte parameter 2 uint16 _u16Param2; // byte parameter 2
uint32 _u32Param; // int parameter uint32 _u32Param; // int parameter
uint32 _timestamp; uint32 _timestamp;
void set(Message *src) {
_class = src->_class;
_event = src->_event;
_priority = src->_priority;
_u8Param = src->_u8Param;
_u16Param1 = src->_u16Param1;
_u16Param2 = src->_u16Param2;
_u32Param = src->_u32Param;
_timestamp = src->_timestamp;
}
}; };
// Screen rectangle (don't remove, please!) // Screen rectangle (don't remove, please!)