/* 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) { assert(_dialogueTextsCount < MAX_DIALOGUE_TEXTS); DialogueText *dt = &_dialogueTextsTable[_dialogueTextsCount]; dt->num = num; dt->count = count; ++_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); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); } break; case 3: ADD_DIALOGUE_TEXT(15, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 4: ADD_DIALOGUE_TEXT(10, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 5: ADD_DIALOGUE_TEXT(9, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 6: ADD_DIALOGUE_TEXT(8, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 7: ADD_DIALOGUE_TEXT(6, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 8: ADD_DIALOGUE_TEXT(7, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 9: ADD_DIALOGUE_TEXT(16 + getRandomNumber(2), 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 10: ADD_DIALOGUE_TEXT(18, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 11: ADD_DIALOGUE_TEXT(19, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 12: ADD_DIALOGUE_TEXT(20 + getRandomNumber(2), 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 13: ADD_DIALOGUE_TEXT(22, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 14: ADD_DIALOGUE_TEXT(23, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 15: ADD_DIALOGUE_TEXT(24, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 16: ADD_DIALOGUE_TEXT(25, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 17: ADD_DIALOGUE_TEXT(26 + getRandomNumber(2), 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 18: ADD_DIALOGUE_TEXT(28, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 19: ADD_DIALOGUE_TEXT(4, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 20: ADD_DIALOGUE_TEXT(5, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 21: ADD_DIALOGUE_TEXT(1 + getRandomNumber(3), 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 22: ADD_DIALOGUE_TEXT(51, 1); ADD_DIALOGUE_TEXT(52, 1); SET_DIALOGUE_TEXT(1, 2); startIgorDialogue(); break; case 23: ADD_DIALOGUE_TEXT(53, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 24: ADD_DIALOGUE_TEXT(54, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 25: ADD_DIALOGUE_TEXT(55, 3); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 26: ADD_DIALOGUE_TEXT(58, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 27: ADD_DIALOGUE_TEXT(59, 2); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 28: ADD_DIALOGUE_TEXT(61, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 29: ADD_DIALOGUE_TEXT(62, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 30: ADD_DIALOGUE_TEXT(64, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 31: ADD_DIALOGUE_TEXT(63, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 32: ADD_DIALOGUE_TEXT(65, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 33: ADD_DIALOGUE_TEXT(66, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 34: ADD_DIALOGUE_TEXT(30, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 35: ADD_DIALOGUE_TEXT(29, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 36: ADD_DIALOGUE_TEXT(67, 2); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 37: ADD_DIALOGUE_TEXT(69, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 38: EXEC_MAIN_ACTION_38(); break; case 39: ADD_DIALOGUE_TEXT(70, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 40: ADD_DIALOGUE_TEXT(71, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 41: ADD_DIALOGUE_TEXT(72, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 42: ADD_DIALOGUE_TEXT(73, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 43: EXEC_MAIN_ACTION_43(); break; case 44: ADD_DIALOGUE_TEXT(156, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 45: ADD_DIALOGUE_TEXT(92, 1); ADD_DIALOGUE_TEXT(93, 3); SET_DIALOGUE_TEXT(1, 2); startIgorDialogue(); break; case 46: if (_objectsState[3] == 0) { ADD_DIALOGUE_TEXT(85, 1); } else { ADD_DIALOGUE_TEXT(86, 2); } SET_DIALOGUE_TEXT(1, 2); startIgorDialogue(); break; case 48: ADD_DIALOGUE_TEXT(77 + _objectsState[0], 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); case 50: if (_objectsState[1] == 0) { ADD_DIALOGUE_TEXT(80, 1); ADD_DIALOGUE_TEXT(81, 1); SET_DIALOGUE_TEXT(1, 2); startIgorDialogue(); } else { ADD_DIALOGUE_TEXT(82, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); } break; case 51: if (_objectsState[7] == 0) { ADD_DIALOGUE_TEXT(157, 1); } else { ADD_DIALOGUE_TEXT(158, 1); } SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 52: ADD_DIALOGUE_TEXT(89, 2); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 53: ADD_DIALOGUE_TEXT(88, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 54: EXEC_MAIN_ACTION_54(); break; case 55: ADD_DIALOGUE_TEXT(159, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 56: ADD_DIALOGUE_TEXT(160, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 57: ADD_DIALOGUE_TEXT(31, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 58: ADD_DIALOGUE_TEXT(140, 1); ADD_DIALOGUE_TEXT(141, 1); ADD_DIALOGUE_TEXT(142, 1); ADD_DIALOGUE_TEXT(143, 1); SET_DIALOGUE_TEXT(1, 4); startIgorDialogue(); _objectsState[4] = 2; break; case 59: ADD_DIALOGUE_TEXT(97, 2); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 60: ADD_DIALOGUE_TEXT(161, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 61: if (_inventoryInfo[51] != 0) { ADD_DIALOGUE_TEXT(76, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); } else { ADD_DIALOGUE_TEXT(74, 2); 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); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 63: ADD_DIALOGUE_TEXT(170, 1); 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); } else if (_objectsState[6] == 1) { ADD_DIALOGUE_TEXT(163, 1); } else if (_objectsState[6] == 2) { ADD_DIALOGUE_TEXT(164, 1); } SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 65: ADD_DIALOGUE_TEXT(165, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 66: ADD_DIALOGUE_TEXT(166, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 67: ADD_DIALOGUE_TEXT(167, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 68: ADD_DIALOGUE_TEXT(168, 1); SET_DIALOGUE_TEXT(1, 1); startIgorDialogue(); break; case 69: ADD_DIALOGUE_TEXT(96, 1); 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); // mov _dialogueColor+3, 0 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); ADD_DIALOGUE_TEXT(145, 3); ADD_DIALOGUE_TEXT(148, 2); ADD_DIALOGUE_TEXT(150, 2); SET_DIALOGUE_TEXT(1, 4); startIgorDialogue(); waitForEndOfIgorDialogue(); wd->x = 240; wd->y = 130; ADD_DIALOGUE_TEXT(152, 1); ADD_DIALOGUE_TEXT(153, 3); 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; // mov _dialogueColor+3, 63 } 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); // mov _dialogueColor+3, 0 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); 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); // mov _dialogueColor+3, 63 } 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); } else { ADD_DIALOGUE_TEXT(100, 2); } 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::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: memcpy(_globalObjectNames + 0x592 / 62, " bottle of whisky", 30); break; case 1: memcpy(_globalObjectNames + 0x592 / 62, " empty bottle", 30); break; case 2: memcpy(_globalObjectNames + 0x592 / 62, " bottle of water", 30); break; } } if (num == 2 || num == 255) { switch (_objectsState[1]) { case 0: _inventoryImages[23] = 27; memcpy(_globalObjectNames + 0x5D0 / 62, " lizard", 30); break; default: _inventoryImages[23] = 35; memcpy(_globalObjectNames + 0x5D0 / 62, " fat lizard", 30); break; } } if (num == 4 || num == 255) { switch (_objectsState[3]) { case 0: memcpy(_globalObjectNames + 0x554 / 62, " Caroline%s folder", 30); break; case 1: memcpy(_globalObjectNames + 0x554 / 62, " Philip%s folder", 30); 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) { memcpy(_globalObjectNames + 0x60E / 62, " statuette", 30); _inventoryImages[24] = 29; } else { memcpy(_globalObjectNames + 0x60E / 62, " reward", 30); _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); ADD_DIALOGUE_TEXT(224, 1); ADD_DIALOGUE_TEXT(225, 1); break; case 2: ADD_DIALOGUE_TEXT(201, 1); ADD_DIALOGUE_TEXT(202, 1); ADD_DIALOGUE_TEXT(203, 1); break; case 3: ADD_DIALOGUE_TEXT(204, 1); ADD_DIALOGUE_TEXT(205, 1); ADD_DIALOGUE_TEXT(206, 1); break; case 4: ADD_DIALOGUE_TEXT(207, 1); ADD_DIALOGUE_TEXT(208, 1); ADD_DIALOGUE_TEXT(209, 1); break; case 5: ADD_DIALOGUE_TEXT(210, 1); ADD_DIALOGUE_TEXT(211, 1); ADD_DIALOGUE_TEXT(212, 1); break; case 6: ADD_DIALOGUE_TEXT(213, 2); ADD_DIALOGUE_TEXT(215, 1); ADD_DIALOGUE_TEXT(216, 1); break; case 7: ADD_DIALOGUE_TEXT(217, 1); ADD_DIALOGUE_TEXT(218, 1); ADD_DIALOGUE_TEXT(219, 1); break; case 8: ADD_DIALOGUE_TEXT(220, 1); ADD_DIALOGUE_TEXT(221, 1); ADD_DIALOGUE_TEXT(222, 1); 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 (_gameVersion == kIdEngDemo100 || _gameVersion == kIdEngDemo110) { for (_currentPart = kSharewarePart; !_eventQuitGame && _currentPart <= kSharewarePart + 6; ++_currentPart) { PART_95(); } } } } // namespace Igor