scummvm/engines/igor/parts/part_main.cpp
Gregory Montoir 98545ad4e5 sync'ing with local tree for now
- some minor changes to detection code
- added missing spanish strings to IGOR.TBL
- fixed '@' charset index

svn-id: r29672
2007-11-30 19:05:53 +00:00

991 lines
22 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* $URL$
* $Id$
*
*/
#include "common/system.h"
#include "igor/igor.h"
namespace Igor {
void IgorEngine::ADD_DIALOGUE_TEXT(int num, int count, int sound) {
assert(_dialogueTextsCount < MAX_DIALOGUE_TEXTS);
DialogueText *dt = &_dialogueTextsTable[_dialogueTextsCount];
dt->num = num;
dt->count = count;
dt->sound = sound;
++_dialogueTextsCount;
}
void IgorEngine::SET_DIALOGUE_TEXT(int start, int count) {
_dialogueTextsStart = start - 1;
_dialogueTextsCount = count;
}
void IgorEngine::SET_EXEC_ACTION_FUNC(int i, ExecuteActionProc p) {
switch (i) {
case 0:
_executeMainAction = p;
break;
case 1:
_executeRoomAction = p;
break;
}
}
void IgorEngine::EXEC_MAIN_ACTION(int action) {
switch (action) {
case 0:
case 1:
break;
case 2: {
int num, rnd = getRandomNumber(100);
if (rnd < 34) {
num = 11;
} else if (rnd < 69) {
num = 12;
} else if (rnd < 94) {
num = 13;
} else {
num = 14;
}
ADD_DIALOGUE_TEXT(num, 1, num);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
}
break;
case 3:
ADD_DIALOGUE_TEXT(15, 1, 15);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 4:
ADD_DIALOGUE_TEXT(10, 1, 10);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 5:
ADD_DIALOGUE_TEXT(9, 1, 9);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 6:
ADD_DIALOGUE_TEXT(8, 1, 8);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 7:
ADD_DIALOGUE_TEXT(6, 1, 6);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 8:
ADD_DIALOGUE_TEXT(7, 1, 7);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 9: {
int num = 16 + getRandomNumber(2);
ADD_DIALOGUE_TEXT(num, 1, num);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
}
break;
case 10:
ADD_DIALOGUE_TEXT(18, 1, 18);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 11:
ADD_DIALOGUE_TEXT(19, 1, 19);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 12: {
int num = 20 + getRandomNumber(2);
ADD_DIALOGUE_TEXT(num, 1, num);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
}
break;
case 13:
ADD_DIALOGUE_TEXT(22, 1, 22);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 14:
ADD_DIALOGUE_TEXT(23, 1, 23);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 15:
ADD_DIALOGUE_TEXT(24, 1, 24);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 16:
ADD_DIALOGUE_TEXT(25, 1, 25);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 17: {
int num = 26 + getRandomNumber(2);
ADD_DIALOGUE_TEXT(num, 1, num);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
}
break;
case 18:
ADD_DIALOGUE_TEXT(28, 1, 28);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 19:
ADD_DIALOGUE_TEXT(4, 1, 4);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 20:
ADD_DIALOGUE_TEXT(5, 1, 5);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 21: {
int num = 1 + getRandomNumber(3);
ADD_DIALOGUE_TEXT(num, 1, num);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
}
break;
case 22:
ADD_DIALOGUE_TEXT(51, 1, 32);
ADD_DIALOGUE_TEXT(52, 1, 33);
SET_DIALOGUE_TEXT(1, 2);
startIgorDialogue();
break;
case 23:
ADD_DIALOGUE_TEXT(53, 1, 34);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 24:
ADD_DIALOGUE_TEXT(54, 1, 35);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 25:
ADD_DIALOGUE_TEXT(55, 3, 36);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 26:
ADD_DIALOGUE_TEXT(58, 1, 37);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 27:
ADD_DIALOGUE_TEXT(59, 2, 38);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 28:
ADD_DIALOGUE_TEXT(61, 1, 39);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 29:
ADD_DIALOGUE_TEXT(62, 1, 40);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 30:
ADD_DIALOGUE_TEXT(64, 1, 42);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 31:
ADD_DIALOGUE_TEXT(63, 1, 41);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 32:
ADD_DIALOGUE_TEXT(65, 1, 43);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 33:
ADD_DIALOGUE_TEXT(66, 1, 44);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 34:
ADD_DIALOGUE_TEXT(30, 1, 30);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 35:
ADD_DIALOGUE_TEXT(29, 1, 29);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 36:
ADD_DIALOGUE_TEXT(67, 2, 45);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 37:
ADD_DIALOGUE_TEXT(69, 1, 46);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 38:
EXEC_MAIN_ACTION_38();
break;
case 39:
ADD_DIALOGUE_TEXT(70, 1, 47);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 40:
ADD_DIALOGUE_TEXT(71, 1, 48);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 41:
ADD_DIALOGUE_TEXT(72, 1, 49);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 42:
ADD_DIALOGUE_TEXT(73, 1, 50);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 43:
EXEC_MAIN_ACTION_43();
break;
case 44:
ADD_DIALOGUE_TEXT(156, 1, 80);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 45:
ADD_DIALOGUE_TEXT(92, 1, 64);
ADD_DIALOGUE_TEXT(93, 3, 65);
SET_DIALOGUE_TEXT(1, 2);
startIgorDialogue();
break;
case 46:
if (_objectsState[3] == 0) {
ADD_DIALOGUE_TEXT(85, 1, 60);
} else {
ADD_DIALOGUE_TEXT(86, 2, 61);
}
SET_DIALOGUE_TEXT(1, 2);
startIgorDialogue();
break;
case 48:
ADD_DIALOGUE_TEXT(77 + _objectsState[0], 1, 53 + _objectsState[0]);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
case 50:
if (_objectsState[1] == 0) {
ADD_DIALOGUE_TEXT(80, 1, 56);
ADD_DIALOGUE_TEXT(81, 1, 57);
SET_DIALOGUE_TEXT(1, 2);
startIgorDialogue();
} else {
ADD_DIALOGUE_TEXT(82, 1, 58);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
}
break;
case 51:
if (_objectsState[7] == 0) {
ADD_DIALOGUE_TEXT(157, 1, 81);
} else {
ADD_DIALOGUE_TEXT(158, 1, 82);
}
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 52:
ADD_DIALOGUE_TEXT(89, 2, 63);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 53:
ADD_DIALOGUE_TEXT(88, 1, 62);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 54:
EXEC_MAIN_ACTION_54();
break;
case 55:
ADD_DIALOGUE_TEXT(159, 1, 83);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 56:
ADD_DIALOGUE_TEXT(160, 1, 84);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 57:
ADD_DIALOGUE_TEXT(31, 1, 31);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 58:
ADD_DIALOGUE_TEXT(140, 1, 70);
ADD_DIALOGUE_TEXT(141, 1, 71);
ADD_DIALOGUE_TEXT(142, 1, 72);
ADD_DIALOGUE_TEXT(143, 1, 73);
SET_DIALOGUE_TEXT(1, 4);
startIgorDialogue();
_objectsState[4] = 2;
break;
case 59:
ADD_DIALOGUE_TEXT(97, 2, 67);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 60:
ADD_DIALOGUE_TEXT(161, 1, 85);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 61:
if (_inventoryInfo[51] != 0) {
ADD_DIALOGUE_TEXT(76, 1, 52);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
} else {
ADD_DIALOGUE_TEXT(74, 2, 51);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
addObjectToInventory(16, 51);
}
break;
case 62:
_inventoryImages[_inventoryInfo[52] - 1] = 0;
_inventoryInfo[52] = 0;
packInventory();
_inventoryImages[_inventoryInfo[59] - 1] = 0;
_inventoryInfo[59] = 0;
packInventory();
_objectsState[1] = 1;
UPDATE_OBJECT_STATE(2);
addObjectToInventory(24, 59);
ADD_DIALOGUE_TEXT(169, 1, 93);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 63:
ADD_DIALOGUE_TEXT(170, 1, 94);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
_inventoryImages[_inventoryInfo[68] - 1] = 0;
_inventoryInfo[68] = 0;
packInventory();
_inventoryImages[_inventoryInfo[69] - 1] = 0;
_inventoryInfo[69] = 0;
packInventory();
_objectsState[6] = 1;
UPDATE_OBJECT_STATE(7);
addObjectToInventory(34, 69);
break;
case 64:
if (_objectsState[6] == 0) {
ADD_DIALOGUE_TEXT(162, 1, 86);
} else if (_objectsState[6] == 1) {
ADD_DIALOGUE_TEXT(163, 1, 87);
} else if (_objectsState[6] == 2) {
ADD_DIALOGUE_TEXT(164, 1, 88);
}
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 65:
ADD_DIALOGUE_TEXT(165, 1, 89);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 66:
ADD_DIALOGUE_TEXT(166, 1, 90);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 67:
ADD_DIALOGUE_TEXT(167, 1, 91);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 68:
ADD_DIALOGUE_TEXT(168, 1, 92);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
case 69:
ADD_DIALOGUE_TEXT(96, 1, 66);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
break;
default:
warning("EXEC_MAIN_ACTION() Unhandled action %d", action);
break;
}
}
void IgorEngine::EXEC_MAIN_ACTION_38() {
memcpy(_paletteBuffer, _currentPalette, 624);
fadeOutPalette(624);
uint8 *tmp = (uint8 *)malloc(64000 + 768);
if (tmp) {
memcpy(tmp, _screenVGA, 64000);
memcpy(tmp + 64000, _paletteBuffer, 768);
}
loadData(IMG_NewsPaper, _screenVGA);
loadData(PAL_NewsPaper, _paletteBuffer);
fadeInPalette(624);
WalkData *wd = &_walkData[_walkDataLastIndex - 1];
int _walkDataCurrentPosX2 = wd->x;
int _walkDataCurrentPosY2 = wd->y;
int _walkDataCurrentWScale = wd->scaleWidth;
wd->x = 80;
wd->y = 130;
wd->scaleWidth = 50;
ADD_DIALOGUE_TEXT(144, 1, 74);
ADD_DIALOGUE_TEXT(145, 3, 75);
ADD_DIALOGUE_TEXT(148, 2, 76);
ADD_DIALOGUE_TEXT(150, 2, 77);
SET_DIALOGUE_TEXT(1, 4);
startIgorDialogue();
waitForEndOfIgorDialogue();
wd->x = 240;
wd->y = 130;
ADD_DIALOGUE_TEXT(152, 1, 78);
ADD_DIALOGUE_TEXT(153, 3, 79);
SET_DIALOGUE_TEXT(1, 2);
startIgorDialogue();
waitForEndOfIgorDialogue();
wd->x = _walkDataCurrentPosX2;
wd->y = _walkDataCurrentPosY2;
wd->scaleWidth = _walkDataCurrentWScale;
fadeOutPalette(624);
if (tmp) {
memcpy(_screenVGA, tmp, 64000);
memcpy(_paletteBuffer, tmp + 64000, 768);
free(tmp);
}
fadeInPalette(624);
_objectsState[2] = 1;
}
void IgorEngine::EXEC_MAIN_ACTION_43() {
memcpy(_paletteBuffer, _currentPalette, 624);
fadeOutPalette(624);
uint8 *tmp = (uint8 *)malloc(64000 + 768);
if (tmp) {
memcpy(tmp, _screenVGA, 64000);
memcpy(tmp + 64000, _paletteBuffer, 768);
}
loadData(IMG_PhotoHarrisonMargaret, _screenVGA);
loadData(PAL_PhotoHarrisonMargaret, _paletteBuffer);
fadeInPalette(624);
WalkData *wd = &_walkData[_walkDataLastIndex - 1];
int _walkDataCurrentPosX2 = wd->x;
int _walkDataCurrentPosY2 = wd->y;
int _walkDataCurrentWScale = wd->scaleWidth;
wd->x = 160;
wd->y = 130;
wd->scaleWidth = 50;
ADD_DIALOGUE_TEXT(83, 2, 59);
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
waitForEndOfIgorDialogue();
_currentAction.object1Num = 0;
wd->x = _walkDataCurrentPosX2;
wd->y = _walkDataCurrentPosY2;
wd->scaleWidth = _walkDataCurrentWScale;
fadeOutPalette(624);
if (tmp) {
memcpy(_screenVGA, tmp, 64000);
memcpy(_paletteBuffer, tmp + 64000, 768);
free(tmp);
}
fadeInPalette(624);
}
void IgorEngine::EXEC_MAIN_ACTION_54() {
memcpy(_paletteBuffer, _currentPalette, 624);
fadeOutPalette(624);
uint8 *tmp = (uint8 *)malloc(64000 + 768);
if (tmp) {
memcpy(tmp, _screenVGA, 64000);
memcpy(tmp + 64000, _paletteBuffer, 768);
}
loadData(IMG_RomanNumbersPaper, _screenVGA);
loadData(PAL_RomanNumbersPaper, _paletteBuffer);
PART_UPDATE_FIGURES_ON_PAPER(0);
fadeInPalette(624);
WalkData *wd = &_walkData[_walkDataLastIndex - 1];
int _walkDataCurrentPosX2 = wd->x;
int _walkDataCurrentPosY2 = wd->y;
int _walkDataCurrentWScale = wd->scaleWidth;
wd->x = 160;
wd->y = 130;
wd->scaleWidth = 50;
if (_objectsState[2] == 0) {
ADD_DIALOGUE_TEXT(99, 1, 68);
} else {
ADD_DIALOGUE_TEXT(100, 2, 69);
}
SET_DIALOGUE_TEXT(1, 1);
startIgorDialogue();
waitForEndOfIgorDialogue();
wd->x = _walkDataCurrentPosX2;
wd->y = _walkDataCurrentPosY2;
wd->scaleWidth = _walkDataCurrentWScale;
fadeOutPalette(624);
if (tmp) {
memcpy(_screenVGA, tmp, 64000);
memcpy(_paletteBuffer, tmp + 64000, 768);
free(tmp);
}
fadeInPalette(624);
}
void IgorEngine::CHECK_FOR_END_OF_DEMO() {
if (_demoActionsCounter >= 10) {
ADD_DIALOGUE_TEXT(104, 2);
ADD_DIALOGUE_TEXT(106, 2);
SET_DIALOGUE_TEXT(1, 2);
startIgorDialogue();
}
}
void IgorEngine::SET_PAL_208_96_1() {
memcpy(_paletteBuffer + 208 * 3, PAL_96_1, 96);
}
void IgorEngine::SET_PAL_240_48_1() {
memcpy(_paletteBuffer + 240 * 3, PAL_48_1, 48);
}
void IgorEngine::UPDATE_OBJECT_STATE(int num) {
if (num == 1 || num == 255) {
switch (_objectsState[0]) {
case 0:
strcpy(_globalObjectNames[23], getString(STR_BottleOfWhisky));
break;
case 1:
strcpy(_globalObjectNames[23], getString(STR_EmptyBottle));
break;
case 2:
strcpy(_globalObjectNames[23], getString(STR_BottleOfWater));
break;
}
}
if (num == 2 || num == 255) {
switch (_objectsState[1]) {
case 0:
_inventoryImages[23] = 27;
strcpy(_globalObjectNames[24], getString(STR_Lizard));
break;
default:
_inventoryImages[23] = 35;
strcpy(_globalObjectNames[24], getString(STR_FatLizard));
break;
}
}
if (num == 4 || num == 255) {
switch (_objectsState[3]) {
case 0:
strcpy(_globalObjectNames[22], getString(STR_CarolineFolder));
break;
case 1:
strcpy(_globalObjectNames[22], getString(STR_PhilipFolder));
break;
}
}
if (num == 7 || num == 255) {
switch (_objectsState[6]) {
case 0:
_inventoryImages[33] = 21;
break;
case 1:
_inventoryImages[33] = 14;
break;
case 2:
_inventoryImages[33] = 7;
break;
}
}
if (num == 8 || num == 255) {
if (_objectsState[7] == 0) {
strcpy(_globalObjectNames[25], getString(STR_Statuette));
_inventoryImages[24] = 29;
} else {
strcpy(_globalObjectNames[25], getString(STR_Reward));
_inventoryImages[24] = 39;
}
}
}
void IgorEngine::PART_MEANWHILE() {
hideCursor();
memset(_currentPalette, 0, 768);
setPaletteRange(208, 255);
loadData(IMG_Meanwhile, _screenVGA);
_paletteBuffer[3] = 63;
_paletteBuffer[4] = 32;
_paletteBuffer[5] = 0;
_paletteBuffer[6] = 44;
_paletteBuffer[7] = 12;
_paletteBuffer[8] = 0;
fadeInPalette(9);
for (int i = 0; i <= 5 && !_inputVars[kInputEscape]; ++i) {
waitForTimer(250);
}
_inputVars[kInputEscape] = 0;
fadeOutPalette(9);
}
static int VAR_MARGARET_ROOM_ANIM_COUNTER;
void IgorEngine::PART_MARGARET_ROOM_CUTSCENE_HELPER_1() {
const uint8 *src = _animFramesBuffer + READ_LE_UINT16(_animFramesBuffer + 0x2A63 + VAR_MARGARET_ROOM_ANIM_COUNTER * 2) - 1;
decodeAnimFrame(src, _screenVGA);
}
void IgorEngine::PART_MARGARET_ROOM_CUTSCENE_HELPER_2(int frame) {
const int offset = ((VAR_MARGARET_ROOM_ANIM_COUNTER - 1) * 5 + frame) * 2;
const uint8 *src = _animFramesBuffer + 0x2A75 + READ_LE_UINT16(_animFramesBuffer + offset + 0xD887) - 1;
decodeAnimFrame(src, _screenVGA);
}
void IgorEngine::PART_MARGARET_ROOM_CUTSCENE_UPDATE_DIALOGUE_MARGARET(int action) {
switch (action) {
case kUpdateDialogueAnimEndOfSentence:
PART_MARGARET_ROOM_CUTSCENE_HELPER_2(1);
break;
case kUpdateDialogueAnimMiddleOfSentence:
PART_MARGARET_ROOM_CUTSCENE_HELPER_2(getRandomNumber(5) + 1);
break;
}
}
void IgorEngine::PART_MARGARET_ROOM_CUTSCENE() {
_gameState.enableLight = 1;
VAR_MARGARET_ROOM_ANIM_COUNTER = _objectsState[110] + 1;
if (VAR_MARGARET_ROOM_ANIM_COUNTER == 9) {
VAR_MARGARET_ROOM_ANIM_COUNTER = 1;
}
loadRoomData(PAL_MargaretRoom, IMG_MargaretRoom, BOX_MargaretRoom, MSK_MargaretRoom, TXT_MargaretRoom);
static const int anm[] = { FRM_MargaretRoom1, FRM_MargaretRoom2, FRM_MargaretRoom3, FRM_MargaretRoom4, 0 };
loadAnimData(anm);
memcpy(_screenVGA, _screenLayer1, 46080);
_updateDialogue = &IgorEngine::PART_MARGARET_ROOM_CUTSCENE_UPDATE_DIALOGUE_MARGARET;
PART_MARGARET_ROOM_CUTSCENE_HELPER_1();
memset(_currentPalette, 0, 768);
fadeInPalette(768);
_gameState.igorMoving = false;
switch (VAR_MARGARET_ROOM_ANIM_COUNTER) {
case 1:
ADD_DIALOGUE_TEXT(223, 1, 1118);
ADD_DIALOGUE_TEXT(224, 1, 1119);
ADD_DIALOGUE_TEXT(225, 1, 1120);
break;
case 2:
ADD_DIALOGUE_TEXT(201, 1, 1097);
ADD_DIALOGUE_TEXT(202, 1, 1098);
ADD_DIALOGUE_TEXT(203, 1, 1099);
break;
case 3:
ADD_DIALOGUE_TEXT(204, 1, 1100);
ADD_DIALOGUE_TEXT(205, 1, 1101);
ADD_DIALOGUE_TEXT(206, 1, 1102);
break;
case 4:
ADD_DIALOGUE_TEXT(207, 1, 1103);
ADD_DIALOGUE_TEXT(208, 1, 1104);
ADD_DIALOGUE_TEXT(209, 1, 1105);
break;
case 5:
ADD_DIALOGUE_TEXT(210, 1, 1106);
ADD_DIALOGUE_TEXT(211, 1, 1107);
ADD_DIALOGUE_TEXT(212, 1, 1108);
break;
case 6:
ADD_DIALOGUE_TEXT(213, 2, 1109);
ADD_DIALOGUE_TEXT(215, 1, 1110);
ADD_DIALOGUE_TEXT(216, 1, 1111);
break;
case 7:
ADD_DIALOGUE_TEXT(217, 1, 1112);
ADD_DIALOGUE_TEXT(218, 1, 1113);
ADD_DIALOGUE_TEXT(219, 1, 1114);
break;
case 8:
ADD_DIALOGUE_TEXT(220, 1, 1115);
ADD_DIALOGUE_TEXT(221, 1, 1116);
ADD_DIALOGUE_TEXT(222, 1, 1117);
break;
}
SET_DIALOGUE_TEXT(1, 3);
startCutsceneDialogue(200, 73, 63, 32, 0);
waitForEndOfCutsceneDialogue(200, 73, 63, 32, 0);
waitForTimer(255);
_updateDialogue = 0;
++_objectsState[110];
memcpy(_paletteBuffer, _currentPalette, 768);
fadeOutPalette(768);
memset(_screenVGA, 0, 46080);
if (_objectsState[110] < 9 && _currentPart != 331) {
setupDefaultPalette();
SET_PAL_240_48_1();
SET_PAL_208_96_1();
drawVerbsPanel();
drawInventory(_inventoryInfo[72], 0);
}
}
void IgorEngine::PART_UPDATE_FIGURES_ON_PAPER(int delay) {
uint8 *framesData = loadData(FRM_NumbersPaper1);
uint8 *framesOffsets = loadData(FRM_NumbersPaper2);
for (int i = 1; i <= 20; ++i) {
const uint8 *p = framesData + READ_LE_UINT16(framesOffsets + (i - 1) * 2) - 1;
decodeAnimFrame(p, _screenVGA, true);
waitForTimer(delay);
}
free(framesData);
free(framesOffsets);
}
void IgorEngine::PART_MAIN() {
SET_EXEC_ACTION_FUNC(0, &IgorEngine::EXEC_MAIN_ACTION);
memset(_objectsState, 0, 112);
_objectsState[21] = 1;
_objectsState[49] = 1;
memset(_inventoryInfo, 0, 36);
_inventoryInfo[0] = 1; // ordering
_inventoryInfo[1] = 2;
_inventoryInfo[2] = 4;
_inventoryInfo[36] = 1;
_inventoryInfo[37] = 2;
_inventoryInfo[39] = 3;
_inventoryInfo[72] = 1; // first object
_inventoryInfo[73] = 3; // last object
UPDATE_OBJECT_STATE(255);
if (_currentPart != kStartupPart) { // boot param
SET_PAL_208_96_1();
SET_PAL_240_48_1();
drawVerbsPanel();
drawInventory(1, 0);
}
do {
debugC(9, kDebugGame, "PART_MAIN _currentPart %d", _currentPart);
switch (_currentPart) {
case 40:
PART_04();
break;
case 50:
case 51:
case 52:
PART_05();
break;
case 60:
case 61:
case 62:
PART_06();
break;
case 120:
case 121:
case 122:
PART_12();
break;
case 130:
case 131:
PART_13();
break;
case 140:
case 141:
case 142:
PART_14();
break;
case 150:
PART_15();
break;
case 160:
PART_16();
break;
case 170:
case 171:
PART_17();
break;
case 180:
case 181:
PART_18();
break;
case 190:
case 191:
PART_19();
break;
case 210:
case 211:
case 212:
PART_21();
break;
case 220:
case 221:
PART_22();
break;
case 230:
case 231:
case 232:
PART_23();
break;
case 240:
case 241:
case 242:
PART_24();
break;
case 250:
case 251:
case 252:
PART_25();
break;
case 260:
case 261:
PART_26();
break;
case 270:
case 271:
PART_27();
break;
case 280:
case 281:
PART_28();
break;
case 300:
case 301:
case 302:
case 303:
PART_30();
break;
case 310:
case 311:
case 312:
case 313:
PART_31();
break;
case 330:
case 331:
PART_33();
break;
case 360:
PART_36();
break;
case 370:
PART_37();
break;
case 750:
PART_75();
break;
case 850:
memset(_screenVGA, 0, 64000);
_screenVGAVOffset = 24;
_system->copyRectToScreen(_screenVGA, 320, 0, 0, 320, _screenVGAVOffset);
PART_85();
memset(_screenVGA + 46080, 0, 17920);
_nextTimer = _system->getMillis() + 1000 / 60;
for (int y = _screenVGAVOffset; y >= 0; --y) {
_system->copyRectToScreen(_screenVGA, 320, 0, y, 320, 145);
_system->updateScreen();
int diff = _nextTimer - _system->getMillis();
if (diff > 0) {
_system->delayMillis(diff);
}
_nextTimer = _system->getMillis() + 1000 / 60;
}
_screenVGAVOffset = 0;
_inputVars[kInputCursorXPos] = 160;
_inputVars[kInputCursorYPos] = 72;
_system->warpMouse(_inputVars[kInputCursorXPos], _inputVars[kInputCursorYPos]);
break;
case 900:
case 901:
case 902:
case 903:
case 904:
PART_90();
break;
default:
warning("PART_MAIN() Unhandled part %d", _currentPart);
_currentPart = kInvalidPart;
break;
}
if (_currentPart >= 10) {
if (_currentPart <= 24 || _currentPart == 51) {
continue;
}
if (_currentPart == 60 || _currentPart == 102 || _currentPart == 110) {
continue;
}
}
if (_currentPart == 340 || _currentPart == 351 || _currentPart == 750) {
continue;
}
if (_currentPart == 122 || _currentPart == 255) {
continue;
}
if (_objectsState[110] < 1 || _objectsState[110] > 7) {
continue;
}
if (_gameState.nextMusicCounter != 5) {
++_gameState.nextMusicCounter;
} else {
if (_gameState.musicNum != 11) {
_previousMusic = _gameState.musicNum;
playMusic(11);
}
PART_MEANWHILE();
PART_MARGARET_ROOM_CUTSCENE();
if (_previousMusic != 11) {
playMusic(_previousMusic);
}
_gameState.nextMusicCounter = 0;
}
} while (_currentPart != kInvalidPart && !_eventQuitGame);
if (_game.flags & kFlagDemo) {
for (_currentPart = kSharewarePart; !_eventQuitGame && _currentPart <= kSharewarePart + 6; ++_currentPart) {
PART_95();
}
}
}
} // namespace Igor