aboutsummaryrefslogtreecommitdiff
path: root/kyra/sequences_v1.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kyra/sequences_v1.cpp')
-rw-r--r--kyra/sequences_v1.cpp1630
1 files changed, 0 insertions, 1630 deletions
diff --git a/kyra/sequences_v1.cpp b/kyra/sequences_v1.cpp
deleted file mode 100644
index 8b60196763..0000000000
--- a/kyra/sequences_v1.cpp
+++ /dev/null
@@ -1,1630 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Copyright (C) 2005-2006 The ScummVM project
- *
- * 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 "kyra/kyra.h"
-#include "kyra/seqplayer.h"
-#include "kyra/screen.h"
-#include "kyra/resource.h"
-#include "kyra/sound.h"
-#include "kyra/sprites.h"
-#include "kyra/wsamovie.h"
-#include "kyra/animator.h"
-#include "kyra/text.h"
-
-#include "common/system.h"
-#include "common/savefile.h"
-
-namespace Kyra {
-
-void KyraEngine::seq_demo() {
- debug(9, "KyraEngine::seq_demo()");
-
- snd_playTheme(MUSIC_INTRO, 2);
-
- loadBitmap("START.CPS", 7, 7, _screen->_currentPalette);
- _screen->copyRegion(0, 0, 0, 0, 320, 200, 6, 0);
- _system->copyRectToScreen(_screen->getPagePtr(0), 320, 0, 0, 320, 200);
- _screen->fadeFromBlack();
- delay(60 * _tickLength);
- _screen->fadeToBlack();
-
- _screen->clearPage(0);
- loadBitmap("TOP.CPS", 7, 7, NULL);
- loadBitmap("BOTTOM.CPS", 5, 5, _screen->_currentPalette);
- _screen->copyRegion(0, 91, 0, 8, 320, 103, 6, 0);
- _screen->copyRegion(0, 0, 0, 111, 320, 64, 6, 0);
- _system->copyRectToScreen(_screen->getPagePtr(0), 320, 0, 0, 320, 200);
- _screen->fadeFromBlack();
-
- _seq->playSequence(_seq_WestwoodLogo, true);
- delay(60 * _tickLength);
- _seq->playSequence(_seq_KyrandiaLogo, true);
-
- _screen->fadeToBlack();
- _screen->clearPage(2);
- _screen->clearPage(0);
-
- _seq->playSequence(_seq_Demo1, true);
-
- _screen->clearPage(0);
- _seq->playSequence(_seq_Demo2, true);
-
- _screen->clearPage(0);
- _seq->playSequence(_seq_Demo3, true);
-
- _screen->clearPage(0);
- _seq->playSequence(_seq_Demo4, true);
-
- _screen->clearPage(0);
- loadBitmap("FINAL.CPS", 7, 7, _screen->_currentPalette);
- _screen->_curPage = 0;
- _screen->copyRegion(0, 0, 0, 0, 320, 200, 6, 0);
- _system->copyRectToScreen(_screen->getPagePtr(0), 320, 0, 0, 320, 200);
- _screen->fadeFromBlack();
- delay(60 * _tickLength);
- _screen->fadeToBlack();
- _sound->stopMusic();
-}
-
-void KyraEngine::seq_intro() {
- debug(9, "KyraEngine::seq_intro()");
-
- if (_features & GF_TALKIE) {
- _res->loadPakFile("INTRO.VRM");
- }
-
- static const IntroProc introProcTable[] = {
- &KyraEngine::seq_introLogos,
- &KyraEngine::seq_introStory,
- &KyraEngine::seq_introMalcolmTree,
- &KyraEngine::seq_introKallakWriting,
- &KyraEngine::seq_introKallakMalcolm
- };
-
- Common::InSaveFile *in;
- if ((in = _saveFileMan->openForLoading(getSavegameFilename(0)))) {
- delete in;
- _skipIntroFlag = true;
- } else
- _skipIntroFlag = false;
-
- _seq->setCopyViewOffs(true);
- _screen->setFont(Screen::FID_8_FNT);
- snd_playTheme(MUSIC_INTRO, 2);
- snd_setSoundEffectFile(MUSIC_INTRO);
- _text->setTalkCoords(144);
- for (int i = 0; i < ARRAYSIZE(introProcTable) && !seq_skipSequence(); ++i) {
- (this->*introProcTable[i])();
- }
- _text->setTalkCoords(136);
- delay(30 * _tickLength);
- _seq->setCopyViewOffs(false);
- _sound->stopMusic();
- if (_features & GF_TALKIE) {
- _res->unloadPakFile("INTRO.VRM");
- }
- res_unloadResources(RES_INTRO | RES_OUTRO);
-}
-
-void KyraEngine::seq_introLogos() {
- debug(9, "KyraEngine::seq_introLogos()");
- _screen->clearPage(0);
- loadBitmap("TOP.CPS", 7, 7, NULL);
- loadBitmap("BOTTOM.CPS", 5, 5, _screen->_currentPalette);
- _screen->_curPage = 0;
- _screen->copyRegion(0, 91, 0, 8, 320, 103, 6, 0);
- _screen->copyRegion(0, 0, 0, 111, 320, 64, 6, 0);
- _system->copyRectToScreen(_screen->getPagePtr(0), 320, 0, 0, 320, 200);
- _screen->fadeFromBlack();
-
- if (_seq->playSequence(_seq_WestwoodLogo, _skipFlag)) {
- _screen->fadeToBlack();
- _screen->clearPage(0);
- return;
- }
- delay(60 * _tickLength);
- if (_seq->playSequence(_seq_KyrandiaLogo, _skipFlag) && !seq_skipSequence()) {
- _screen->fadeToBlack();
- _screen->clearPage(0);
- return;
- }
- _screen->fillRect(0, 179, 319, 199, 0);
-
- int y1 = 8;
- int h1 = 175;
- int y2 = 176;
- int h2 = 0;
- int32 start, now;
- int wait;
- _screen->copyRegion(0, 91, 0, 8, 320, 103, 6, 2);
- _screen->copyRegion(0, 0, 0, 111, 320, 64, 6, 2);
- do {
- start = (int32)_system->getMillis();
- if (h1 > 0) {
- _screen->copyRegion(0, y1, 0, 8, 320, h1, 2, 0);
- }
- ++y1;
- --h1;
- if (h2 > 0) {
- _screen->copyRegion(0, 64, 0, y2, 320, h2, 4, 0);
- }
- --y2;
- ++h2;
- _screen->updateScreen();
- now = (int32)_system->getMillis();
- wait = _tickLength - (now - start);
- if (wait > 0) {
- delay(wait);
- }
- } while (y2 >= 64);
-
- _seq->playSequence(_seq_Forest, true);
-}
-
-void KyraEngine::seq_introStory() {
- debug(9, "KyraEngine::seq_introStory()");
- _screen->clearPage(3);
- _screen->clearPage(0);
- if (_features & GF_TALKIE) {
- return;
- } else if (_features & GF_ENGLISH) {
- loadBitmap("TEXT.CPS", 3, 3, 0);
- } else if (_features & GF_GERMAN) {
- loadBitmap("TEXT_GER.CPS", 3, 3, 0);
- } else if (_features & GF_FRENCH) {
- loadBitmap("TEXT_FRE.CPS", 3, 3, 0);
- } else if (_features & GF_SPANISH) {
- loadBitmap("TEXT_SPA.CPS", 3, 3, 0);
- } else {
- warning("no story graphics file found");
- }
- _screen->copyRegion(0, 0, 0, 0, 320, 200, 3, 0);
- _screen->updateScreen();
- debug("skipFlag %i, %i", _skipFlag, _tickLength);
- delay(360 * _tickLength);
-}
-
-void KyraEngine::seq_introMalcolmTree() {
- debug(9, "KyraEngine::seq_introMalcolmTree()");
- _screen->_curPage = 0;
- _screen->clearPage(3);
- _seq->playSequence(_seq_MalcolmTree, true);
-}
-
-void KyraEngine::seq_introKallakWriting() {
- debug(9, "KyraEngine::seq_introKallakWriting()");
- _seq->makeHandShapes();
- _screen->setAnimBlockPtr(5060);
- _screen->_charWidth = -2;
- _screen->clearPage(3);
- _seq->playSequence(_seq_KallakWriting, true);
-}
-
-void KyraEngine::seq_introKallakMalcolm() {
- debug(9, "KyraEngine::seq_introKallakMalcolm()");
- _screen->clearPage(3);
- _seq->playSequence(_seq_KallakMalcolm, true);
-}
-
-void KyraEngine::seq_createAmuletJewel(int jewel, int page, int noSound, int drawOnly) {
- debug(9, "seq_createAmuletJewel(%d, %d, %d, %d)", jewel, page, noSound, drawOnly);
- static const uint16 specialJewelTable[] = {
- 0x167, 0x162, 0x15D, 0x158, 0x153, 0xFFFF
- };
- static const uint16 specialJewelTable1[] = {
- 0x14F, 0x154, 0x159, 0x15E, 0x163, 0xFFFF
- };
- static const uint16 specialJewelTable2[] = {
- 0x150, 0x155, 0x15A, 0x15F, 0x164, 0xFFFF
- };
- static const uint16 specialJewelTable3[] = {
- 0x151, 0x156, 0x15B, 0x160, 0x165, 0xFFFF
- };
- static const uint16 specialJewelTable4[] = {
- 0x152, 0x157, 0x15C, 0x161, 0x166, 0xFFFF
- };
- if (!noSound)
- snd_playSoundEffect(0x5F);
- _screen->hideMouse();
- if (!drawOnly) {
- for (int i = 0; specialJewelTable[i] != 0xFFFF; ++i) {
- _screen->drawShape(page, _shapes[4+specialJewelTable[i]], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
- _screen->updateScreen();
- delayWithTicks(3);
- }
-
- const uint16 *opcodes = 0;
- switch (jewel - 1) {
- case 0:
- opcodes = specialJewelTable1;
- break;
-
- case 1:
- opcodes = specialJewelTable2;
- break;
-
- case 2:
- opcodes = specialJewelTable3;
- break;
-
- case 3:
- opcodes = specialJewelTable4;
- break;
- }
-
- if (opcodes) {
- for (int i = 0; opcodes[i] != 0xFFFF; ++i) {
- _screen->drawShape(page, _shapes[4+opcodes[i]], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
- _screen->updateScreen();
- delayWithTicks(3);
- }
- }
- }
- _screen->drawShape(page, _shapes[327+jewel], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
- _screen->updateScreen();
- _screen->showMouse();
- setGameFlag(0x55+jewel);
-}
-
-void KyraEngine::seq_brandonHealing() {
- debug(9, "seq_brandonHealing()");
- if (!(_deathHandler & 8))
- return;
- if (_currentCharacter->sceneId == 210) {
- if (_beadStateVar == 4 || _beadStateVar == 6)
- return;
- }
- _screen->hideMouse();
- checkAmuletAnimFlags();
- assert(_healingShapeTable);
- setupShapes123(_healingShapeTable, 22, 0);
- _animator->setBrandonAnimSeqSize(3, 48);
- snd_playSoundEffect(0x53);
- for (int i = 123; i <= 144; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
- for (int i = 125; i >= 123; --i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
- _animator->resetBrandonAnimSeqSize();
- _currentCharacter->currentAnimFrame = 7;
- _animator->animRefreshNPC(0);
- freeShapes123();
- _screen->showMouse();
-}
-
-void KyraEngine::seq_brandonHealing2() {
- debug(9, "seq_brandonHealing2()");
- _screen->hideMouse();
- checkAmuletAnimFlags();
- assert(_healingShape2Table);
- setupShapes123(_healingShape2Table, 30, 0);
- resetBrandonPoisonFlags();
- _animator->setBrandonAnimSeqSize(3, 48);
- snd_playSoundEffect(0x50);
- for (int i = 123; i <= 152; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
- _animator->resetBrandonAnimSeqSize();
- _currentCharacter->currentAnimFrame = 7;
- _animator->animRefreshNPC(0);
- freeShapes123();
- _screen->showMouse();
- assert(_poisonGone);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- snd_playVoiceFile(2010);
- }
- characterSays(_poisonGone[0], 0, -2);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- snd_playVoiceFile(2011);
- }
- characterSays(_poisonGone[1], 0, -2);
-}
-
-void KyraEngine::seq_poisonDeathNow(int now) {
- debug(9, "seq_poisonDeathNow(%d)", now);
- if (!(_brandonStatusBit & 1))
- return;
- ++_poisonDeathCounter;
- if (now)
- _poisonDeathCounter = 2;
- if (_poisonDeathCounter >= 2) {
- snd_playWanderScoreViaMap(1, 1);
- assert(_thePoison);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- snd_playVoiceFile(7000);
- }
- characterSays(_thePoison[0], 0, -2);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- snd_playVoiceFile(7001);
- }
- characterSays(_thePoison[1], 0, -2);
- seq_poisonDeathNowAnim();
- _deathHandler = 3;
- } else {
- assert(_thePoison);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- snd_playVoiceFile(7002);
- }
- characterSays(_thePoison[2], 0, -2);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- snd_playVoiceFile(7004);
- }
- characterSays(_thePoison[3], 0, -2);
- }
-}
-
-void KyraEngine::seq_poisonDeathNowAnim() {
- debug(9, "seq_poisonDeathNowAnim()");
- _screen->hideMouse();
- checkAmuletAnimFlags();
- assert(_posionDeathShapeTable);
- setupShapes123(_posionDeathShapeTable, 20, 0);
- _animator->setBrandonAnimSeqSize(8, 48);
-
- _currentCharacter->currentAnimFrame = 124;
- _animator->animRefreshNPC(0);
- delayWithTicks(30);
-
- _currentCharacter->currentAnimFrame = 123;
- _animator->animRefreshNPC(0);
- delayWithTicks(30);
-
- for (int i = 125; i <= 139; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
-
- delayWithTicks(60);
-
- for (int i = 140; i <= 142; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
-
- delayWithTicks(60);
-
- _animator->resetBrandonAnimSeqSize();
- freeShapes123();
- _animator->restoreAllObjectBackgrounds();
- _currentCharacter->x1 = _currentCharacter->x2 = -1;
- _currentCharacter->y1 = _currentCharacter->y2 = -1;
- _animator->preserveAllBackgrounds();
- _screen->showMouse();
-}
-
-void KyraEngine::seq_playFluteAnimation() {
- debug(9, "seq_playFluteAnimation()");
- _screen->hideMouse();
- checkAmuletAnimFlags();
- setupShapes123(_fluteAnimShapeTable, 36, 0);
- _animator->setBrandonAnimSeqSize(3, 75);
- for (int i = 123; i <= 130; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(2);
- }
-
- int delayTime = 0, soundType = 0;
- if (queryGameFlag(0x85)) {
- snd_playSoundEffect(0x63);
- delayTime = 9;
- soundType = 3;
- } else if (!queryGameFlag(0x86)) {
- snd_playSoundEffect(0x61);
- delayTime = 2;
- soundType = 1;
- setGameFlag(0x86);
- } else {
- snd_playSoundEffect(0x62);
- delayTime = 2;
- soundType = 2;
- }
-
- for (int i = 131; i <= 158; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(delayTime);
- }
-
- for (int i = 126; i >= 123; --i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(delayTime);
- }
- _animator->resetBrandonAnimSeqSize();
- _currentCharacter->currentAnimFrame = 7;
- _animator->animRefreshNPC(0);
- freeShapes123();
- _screen->showMouse();
-
- if (soundType == 1) {
- assert(_fluteString);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- snd_playVoiceFile(1000);
- }
- characterSays(_fluteString[0], 0, -2);
- } else if (soundType == 2) {
- assert(_fluteString);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- snd_playVoiceFile(1001);
- }
- characterSays(_fluteString[1], 0, -2);
- }
-}
-
-void KyraEngine::seq_winterScroll1() {
- debug(9, "seq_winterScroll1()");
- _screen->hideMouse();
- checkAmuletAnimFlags();
- assert(_winterScrollTable);
- assert(_winterScroll1Table);
- assert(_winterScroll2Table);
- setupShapes123(_winterScrollTable, 7, 0);
- _animator->setBrandonAnimSeqSize(5, 66);
-
- for (int i = 123; i <= 129; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
-
- freeShapes123();
- snd_playSoundEffect(0x20);
-
- uint8 numFrames, midpoint;
- if (_features & GF_TALKIE) {
- numFrames = 18;
- midpoint = 136;
- } else {
- numFrames = 35;
- midpoint = 147;
- }
- setupShapes123(_winterScroll1Table, numFrames, 0);
- for (int i = 123; i < midpoint; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
-
- if (_currentCharacter->sceneId == 41 && !queryGameFlag(0xA2)) {
- snd_playSoundEffect(0x20);
- _sprites->_anims[0].play = false;
- _animator->sprites()[0].active = 0;
- _sprites->_anims[1].play = true;
- _animator->sprites()[1].active = 1;
- setGameFlag(0xA2);
- }
-
- for (int i = midpoint; i < 123 + numFrames; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
-
- if (_currentCharacter->sceneId == 117 && !queryGameFlag(0xB3)) {
- for (int i = 0; i <= 7; ++i) {
- _sprites->_anims[i].play = false;
- _animator->sprites()[i].active = 0;
- }
- uint8 tmpPal[768];
- memcpy(tmpPal, _screen->_currentPalette, 768);
- memcpy(&tmpPal[684], palTable2()[0], 60);
- _screen->fadePalette(tmpPal, 72);
- memcpy(&_screen->_currentPalette[684], palTable2()[0], 60);
- _screen->setScreenPalette(_screen->_currentPalette);
- setGameFlag(0xB3);
- } else {
- delayWithTicks(120);
- }
-
- freeShapes123();
- setupShapes123(_winterScroll2Table, 4, 0);
-
- for (int i = 123; i <= 126; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
-
- _animator->resetBrandonAnimSeqSize();
- _currentCharacter->currentAnimFrame = 7;
- _animator->animRefreshNPC(0);
- freeShapes123();
- _screen->showMouse();
-}
-
-void KyraEngine::seq_winterScroll2() {
- debug(9, "seq_winterScroll2()");
- _screen->hideMouse();
- checkAmuletAnimFlags();
- assert(_winterScrollTable);
- setupShapes123(_winterScrollTable, 7, 0);
- _animator->setBrandonAnimSeqSize(5, 66);
-
- for (int i = 123; i <= 128; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
-
- delayWithTicks(120);
-
- for (int i = 127; i >= 123; --i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
-
- _animator->resetBrandonAnimSeqSize();
- _currentCharacter->currentAnimFrame = 7;
- _animator->animRefreshNPC(0);
- freeShapes123();
- _screen->showMouse();
-}
-
-void KyraEngine::seq_makeBrandonInv() {
- debug(9, "seq_makeBrandonInv()");
- if (_deathHandler == 8)
- return;
-
- if (_currentCharacter->sceneId == 210) {
- if (_beadStateVar == 4 || _beadStateVar == 6)
- return;
- }
-
- _screen->hideMouse();
- checkAmuletAnimFlags();
- _brandonStatusBit |= 0x20;
- setTimerCountdown(18, 2700);
- _brandonStatusBit |= 0x40;
- snd_playSoundEffect(0x77);
- _brandonInvFlag = 0;
- while (_brandonInvFlag <= 0x100) {
- _animator->animRefreshNPC(0);
- delayWithTicks(10);
- _brandonInvFlag += 0x10;
- }
- _brandonStatusBit &= 0xFFBF;
- _screen->showMouse();
-}
-
-void KyraEngine::seq_makeBrandonNormal() {
- debug(9, "seq_makeBrandonNormal()");
- _screen->hideMouse();
- _brandonStatusBit |= 0x40;
- snd_playSoundEffect(0x77);
- _brandonInvFlag = 0x100;
- while (_brandonInvFlag >= 0) {
- _animator->animRefreshNPC(0);
- delayWithTicks(10);
- _brandonInvFlag -= 0x10;
- }
- _brandonInvFlag = 0;
- _brandonStatusBit &= 0xFF9F;
- _screen->showMouse();
-}
-
-void KyraEngine::seq_makeBrandonNormal2() {
- debug(9, "seq_makeBrandonNormal2()");
- _screen->hideMouse();
- assert(_brandonToWispTable);
- setupShapes123(_brandonToWispTable, 26, 0);
- _animator->setBrandonAnimSeqSize(5, 48);
- _brandonStatusBit &= 0xFFFD;
- snd_playSoundEffect(0x6C);
- for (int i = 138; i >= 123; --i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
- _animator->setBrandonAnimSeqSize(4, 48);
- _currentCharacter->currentAnimFrame = 7;
- _animator->animRefreshNPC(0);
- if (_currentCharacter->sceneId >= 229 && _currentCharacter->sceneId <= 245) {
- _screen->fadeSpecialPalette(31, 234, 13, 4);
- } else if (_currentCharacter->sceneId >= 118 && _currentCharacter->sceneId <= 186) {
- _screen->fadeSpecialPalette(14, 228, 15, 4);
- }
- freeShapes123();
- _screen->showMouse();
-}
-
-void KyraEngine::seq_makeBrandonWisp() {
- debug(9, "seq_makeBrandonWisp()");
- if (_deathHandler == 8)
- return;
-
- if (_currentCharacter->sceneId == 210) {
- if (_beadStateVar == 4 || _beadStateVar == 6)
- return;
- }
- _screen->hideMouse();
- checkAmuletAnimFlags();
- assert(_brandonToWispTable);
- setupShapes123(_brandonToWispTable, 26, 0);
- _animator->setBrandonAnimSeqSize(5, 48);
- snd_playSoundEffect(0x6C);
- for (int i = 123; i <= 138; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
- _brandonStatusBit |= 2;
- if (_currentCharacter->sceneId >= 109 && _currentCharacter->sceneId <= 198) {
- setTimerCountdown(14, 18000);
- } else {
- setTimerCountdown(14, 7200);
- }
- _animator->_brandonDrawFrame = 113;
- _brandonStatusBit0x02Flag = 1;
- _currentCharacter->currentAnimFrame = 113;
- _animator->animRefreshNPC(0);
- _animator->updateAllObjectShapes();
- if (_currentCharacter->sceneId >= 229 && _currentCharacter->sceneId <= 245) {
- _screen->fadeSpecialPalette(30, 234, 13, 4);
- } else if (_currentCharacter->sceneId >= 118 && _currentCharacter->sceneId <= 186) {
- _screen->fadeSpecialPalette(14, 228, 15, 4);
- }
- freeShapes123();
- _screen->showMouse();
-}
-
-void KyraEngine::seq_dispelMagicAnimation() {
- debug(9, "seq_dispelMagicAnimation()");
- if (_deathHandler == 8)
- return;
- if (_currentCharacter->sceneId == 210) {
- if (_beadStateVar == 4 || _beadStateVar == 6)
- return;
- }
- _screen->hideMouse();
- if (_currentCharacter->sceneId == 210 && _currentCharacter->sceneId < 160)
- _currentCharacter->facing = 3;
- if (_malcolmFlag == 7 && _beadStateVar == 3) {
- _beadStateVar = 6;
- _unkEndSeqVar5 = 2;
- _malcolmFlag = 10;
- }
- checkAmuletAnimFlags();
- setGameFlag(0xEE);
- assert(_magicAnimationTable);
- setupShapes123(_magicAnimationTable, 5, 0);
- _animator->setBrandonAnimSeqSize(8, 49);
- snd_playSoundEffect(0x15);
- for (int i = 123; i <= 127; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
-
- delayWithTicks(120);
-
- for (int i = 127; i >= 123; --i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(10);
- }
- _animator->resetBrandonAnimSeqSize();
- _currentCharacter->currentAnimFrame = 7;
- _animator->animRefreshNPC(0);
- freeShapes123();
- _screen->showMouse();
-}
-
-void KyraEngine::seq_fillFlaskWithWater(int item, int type) {
- debug(9, "seq_fillFlaskWithWater(%d, %d)", item, type);
- int newItem = -1;
- static const uint8 flaskTable1[] = { 0x46, 0x48, 0x4A, 0x4C };
- static const uint8 flaskTable2[] = { 0x47, 0x49, 0x4B, 0x4D };
-
- if (item >= 60 && item <= 77) {
- assert(_flaskFull);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- snd_playVoiceFile(8006);
- }
- characterSays(_flaskFull[0], 0, -2);
- } else if (item == 78) {
- assert(type >= 0 && type < ARRAYSIZE(flaskTable1));
- newItem = flaskTable1[type];
- } else if (item == 79) {
- assert(type >= 0 && type < ARRAYSIZE(flaskTable2));
- newItem = flaskTable2[type];
- }
-
- if (newItem == -1)
- return;
-
- _screen->hideMouse();
- setMouseItem(newItem);
- _screen->showMouse();
- _itemInHand = newItem;
- assert(_fullFlask);
- assert(type < _fullFlask_Size && type >= 0);
- if (_features & GF_TALKIE) {
- snd_voiceWaitForFinish();
- static const uint16 voiceEntries[] = {
- 0x1F40, 0x1F41, 0x1F42, 0x1F45
- };
- assert(type < ARRAYSIZE(voiceEntries));
- snd_playVoiceFile(voiceEntries[type]);
- }
- characterSays(_fullFlask[type], 0, -2);
-}
-
-void KyraEngine::seq_playDrinkPotionAnim(int unk1, int unk2, int flags) {
- debug(9, "KyraEngine::seq_playDrinkPotionAnim(%d, %d, %d)", unk1, unk2, flags);
- // XXX
- _screen->hideMouse();
- checkAmuletAnimFlags();
- _currentCharacter->facing = 5;
- _animator->animRefreshNPC(0);
- assert(_drinkAnimationTable);
- setupShapes123(_drinkAnimationTable, 9, flags);
- _animator->setBrandonAnimSeqSize(5, 54);
-
- for (int i = 123; i <= 131; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(5);
- }
- snd_playSoundEffect(0x34);
- for (int i = 0; i < 2; ++i) {
- _currentCharacter->currentAnimFrame = 130;
- _animator->animRefreshNPC(0);
- delayWithTicks(7);
- _currentCharacter->currentAnimFrame = 131;
- _animator->animRefreshNPC(0);
- delayWithTicks(7);
- }
-
- if (unk2) {
- // XXX
- }
-
- for (int i = 131; i >= 123; --i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(5);
- }
-
- _animator->resetBrandonAnimSeqSize();
- _currentCharacter->currentAnimFrame = 7;
- _animator->animRefreshNPC(0);
- freeShapes123();
- _screen->showMouse();
-}
-
-int KyraEngine::seq_playEnd() {
- debug(9, "KyraEngine::seq_playEnd()");
- if (_endSequenceSkipFlag) {
- return 0;
- }
- if (_deathHandler == 8) {
- return 0;
- }
- _screen->_curPage = 2;
- if (_endSequenceNeedLoading) {
- snd_playWanderScoreViaMap(50, 1);
- setupPanPages();
- _finalA = new WSAMovieV1(this);
- assert(_finalA);
- _finalA->open("finala.wsa", 1, 0);
- _finalB = new WSAMovieV1(this);
- assert(_finalB);
- _finalB->open("finalb.wsa", 1, 0);
- _finalC = new WSAMovieV1(this);
- assert(_finalC);
- _endSequenceNeedLoading = 0;
- _finalC->open("finalc.wsa", 1, 0);
- _screen->_curPage = 0;
- _beadStateVar = 0;
- _malcolmFlag = 0;
- // wired stuff with _unkEndSeqVar2 which needs timer handling
- _screen->copyRegion(312, 0, 312, 0, 8, 136, 0, 2);
- }
- if (handleMalcolmFlag()) {
- _beadStateVar = 0;
- _malcolmFlag = 12;
- handleMalcolmFlag();
- handleBeadState();
- closeFinalWsa();
- if (_deathHandler == 8) {
- _screen->_curPage = 0;
- checkAmuletAnimFlags();
- seq_brandonToStone();
- delay(60 * _tickLength);
- return 1;
- } else {
- _endSequenceSkipFlag = 1;
- if (_text->printed()) {
- _text->restoreTalkTextMessageBkgd(2, 0);
- }
- _screen->_curPage = 0;
- _screen->hideMouse();
- _screen->fadeSpecialPalette(32, 228, 20, 60);
- delay(60 * _tickLength);
- loadBitmap("GEMHEAL.CPS", 3, 3, _screen->_currentPalette);
- _screen->setScreenPalette(_screen->_currentPalette);
- _screen->shuffleScreen(8, 8, 304, 128, 2, 0, 1, 0);
- uint32 nextTime = _system->getMillis() + 120 * _tickLength;
- _finalA = new WSAMovieV1(this);
- assert(_finalA);
- _finalA->open("finald.wsa", 1, 0);
- _finalA->_x = _finalA->_y = 8;
- _finalA->_drawPage = 0;
- while (_system->getMillis() < nextTime) {}
- snd_playSoundEffect(0x40);
- for (int i = 0; i < 22; ++i) {
- while (_system->getMillis() < nextTime) {}
- if (i == 4) {
- snd_playSoundEffect(0x3E);
- } else if (i == 20) {
- snd_playSoundEffect(0x0E);
- }
- nextTime = _system->getMillis() + 8 * _tickLength;
- _finalA->displayFrame(i);
- _screen->updateScreen();
- }
- delete _finalA;
- _finalA = 0;
- seq_playEnding();
- return 1;
- }
- } else {
- handleBeadState();
- _screen->bitBlitRects();
- _screen->updateScreen();
- _screen->_curPage = 0;
- }
- return 0;
-}
-
-void KyraEngine::seq_brandonToStone() {
- debug(9, "KyraEngine::seq_brandonToStone()");
- _screen->hideMouse();
- assert(_brandonStoneTable);
- setupShapes123(_brandonStoneTable, 14, 0);
- _animator->setBrandonAnimSeqSize(5, 51);
- for (int i = 123; i <= 136; ++i) {
- _currentCharacter->currentAnimFrame = i;
- _animator->animRefreshNPC(0);
- delayWithTicks(8);
- }
- _animator->resetBrandonAnimSeqSize();
- freeShapes123();
- _screen->showMouse();
-}
-
-void KyraEngine::seq_playEnding() {
- debug(9, "KyraEngine::seq_playEnding()");
- _screen->hideMouse();
- res_unloadResources(RES_INGAME);
- res_loadResources(RES_OUTRO);
- loadBitmap("REUNION.CPS", 3, 3, _screen->_currentPalette);
- _screen->copyRegion(8, 8, 8, 8, 304, 128, 2, 0);
- _screen->_curPage = 0;
- // XXX
- assert(_homeString);
- drawSentenceCommand(_homeString[0], 179);
- _screen->_curPage = 0;
- _screen->fadeToBlack();
- _seq->playSequence(_seq_Reunion, false);
- _screen->fadeToBlack();
- _screen->showMouse();
- seq_playCredits();
-}
-
-void KyraEngine::seq_playCredits() {
- debug(9, "KyraEngine::seq_playCredits()");
- static const uint8 colorMap[] = { 0, 0, 0xC, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- _screen->hideMouse();
- uint32 sz = 0;
- if (_features & GF_FLOPPY) {
- _screen->loadFont(Screen::FID_CRED6_FNT, _res->fileData("CREDIT6.FNT", &sz));
- _screen->loadFont(Screen::FID_CRED8_FNT, _res->fileData("CREDIT8.FNT", &sz));
- }
- loadBitmap("CHALET.CPS", 2, 2, _screen->_currentPalette);
- _screen->setScreenPalette(_screen->_currentPalette);
- _screen->setCurPage(0);
- _screen->clearCurPage();
- _screen->copyRegion(8, 8, 8, 8, 304, 128, 2, 0);
- _screen->setTextColorMap(colorMap);
- _screen->_charWidth = -1;
- snd_playWanderScoreViaMap(53, 1);
- // delete
- _screen->updateScreen();
- // XXX
- delay(120 * _tickLength); // wait until user presses escape normally
- _screen->fadeToBlack();
- _screen->clearCurPage();
- _screen->showMouse();
-}
-
-bool KyraEngine::seq_skipSequence() const {
- debug(9, "KyraEngine::seq_skipSequence()");
- return _quitFlag || _abortIntroFlag;
-}
-
-int KyraEngine::handleMalcolmFlag() {
- debug(9, "KyraEngine::handleMalcolmFlag()");
- static uint16 frame = 0;
- static uint32 timer1 = 0;
- static uint32 timer2 = 0;
-
- switch (_malcolmFlag) {
- case 1:
- frame = 0;
- _malcolmFlag = 2;
- timer2 = 0;
- case 2:
- if (_system->getMillis() >= timer2) {
- _finalA->_x = 8;
- _finalA->_y = 46;
- _finalA->_drawPage = 0;
- _finalA->displayFrame(frame);
- _screen->updateScreen();
- timer2 = _system->getMillis() + 8 * _tickLength;
- ++frame;
- if (frame > 13) {
- _malcolmFlag = 3;
- timer1 = _system->getMillis() + 180 * _tickLength;
- }
- }
- break;
-
- case 3:
- if (_system->getMillis() < timer1) {
- if (_system->getMillis() >= timer2) {
- frame = _rnd.getRandomNumberRng(14, 17);
- _finalA->_x = 8;
- _finalA->_y = 46;
- _finalA->_drawPage = 0;
- _finalA->displayFrame(frame);
- _screen->updateScreen();
- timer2 = _system->getMillis() + 8 * _tickLength;
- }
- } else {
- _malcolmFlag = 4;
- frame = 18;
- }
- break;
-
- case 4:
- if (_system->getMillis() >= timer2) {
- _finalA->_x = 8;
- _finalA->_y = 46;
- _finalA->_drawPage = 0;
- _finalA->displayFrame(frame);
- _screen->updateScreen();
- timer2 = _system->getMillis() + 8 * _tickLength;
- ++frame;
- if (frame > 25) {
- frame = 26;
- _malcolmFlag = 5;
- _beadStateVar = 1;
- }
- }
- break;
-
- case 5:
- if (_system->getMillis() >= timer2) {
- _finalA->_x = 8;
- _finalA->_y = 46;
- _finalA->_drawPage = 0;
- _finalA->displayFrame(frame);
- _screen->updateScreen();
- timer2 = _system->getMillis() + 8 * _tickLength;
- ++frame;
- if (frame > 31) {
- frame = 32;
- _malcolmFlag = 6;
- }
- }
- break;
-
- case 6:
- if (_unkEndSeqVar4) {
- if (frame <= 33 && _system->getMillis() >= timer2) {
- _finalA->_x = 8;
- _finalA->_y = 46;
- _finalA->_drawPage = 0;
- _finalA->displayFrame(frame);
- _screen->updateScreen();
- timer2 = _system->getMillis() + 8 * _tickLength;
- ++frame;
- if (frame > 33) {
- _malcolmFlag = 7;
- frame = 32;
- _unkEndSeqVar5 = 0;
- }
- }
- }
- break;
-
- case 7:
- if (_unkEndSeqVar5 == 1) {
- _malcolmFlag = 8;
- frame = 34;
- } else if (_unkEndSeqVar5 == 2) {
- _malcolmFlag = 3;
- timer1 = _system->getMillis() + 180 * _tickLength;
- }
- break;
-
- case 8:
- if (_system->getMillis() >= timer2) {
- _finalA->_x = 8;
- _finalA->_y = 46;
- _finalA->_drawPage = 0;
- _finalA->displayFrame(frame);
- _screen->updateScreen();
- timer2 = _system->getMillis() + 8 * _tickLength;
- ++frame;
- if (frame > 37) {
- _malcolmFlag = 0;
- _deathHandler = 8;
- return 1;
- }
- }
- break;
-
- case 9:
- snd_playSoundEffect(12);
- snd_playSoundEffect(12);
- _finalC->_x = 16;
- _finalC->_y = 50;
- _finalC->_drawPage = 0;
- for (int i = 0; i < 18; ++i) {
- timer2 = _system->getMillis() + 4 * _tickLength;
- _finalC->displayFrame(i);
- _screen->updateScreen();
- while (_system->getMillis() < timer2) {}
- }
- snd_playWanderScoreViaMap(51, 1);
- delay(60*_tickLength);
- _malcolmFlag = 0;
- return 1;
- break;
-
- case 10:
- if (!_beadStateVar) {
- handleBeadState();
- _screen->bitBlitRects();
- assert(_veryClever);
- _text->printTalkTextMessage(_veryClever[0], 60, 31, 5, 0, 2);
- timer2 = _system->getMillis() + 180 * _tickLength;
- _malcolmFlag = 11;
- }
- break;
-
- case 11:
- if (_system->getMillis() >= timer2) {
- _text->restoreTalkTextMessageBkgd(2, 0);
- _malcolmFlag = 3;
- timer1 = _system->getMillis() + 180 * _tickLength;
- }
- break;
-
- default:
- break;
- }
-
- return 0;
-}
-
-int KyraEngine::handleBeadState() {
- debug(9, "KyraEngine::handleBeadState()");
- static uint32 timer1 = 0;
- static uint32 timer2 = 0;
- static BeadState beadState1 = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- static BeadState beadState2 = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-
- static const int table1[] = {
- -1, -2, -4, -5, -6, -7, -6, -5,
- -4, -2, -1, 0, 1, 2, 4, 5,
- 6, 7, 6, 5, 4, 2, 1, 0, 0
- };
- static const int table2[] = {
- 0, 0, 1, 1, 2, 2, 3, 3,
- 4, 4, 5, 5, 5, 5, 4, 4,
- 3, 3, 2, 2, 1, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0
- };
-
- switch (_beadStateVar) {
- case 0:
- if (beadState1.x != -1 && _endSequenceBackUpRect) {
- _screen->copyFromCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- } else {
- beadState1.x = -1;
- beadState1.tableIndex = 0;
- timer1 = 0;
- timer2 = 0;
- _lastDisplayedPanPage = 0;
- return 1;
- }
-
- case 1:
- if (beadState1.x != -1) {
- if (_endSequenceBackUpRect) {
- _screen->copyFromCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- }
- beadState1.x = -1;
- beadState1.tableIndex = 0;
- }
- _beadStateVar = 2;
- break;
-
- case 2:
- if (_system->getMillis() >= timer1) {
- int x = 0, y = 0;
- timer1 = _system->getMillis() + 4 * _tickLength;
- if (beadState1.x == -1) {
- assert(_panPagesTable);
- beadState1.width2 = _animator->fetchAnimWidth(_panPagesTable[19], 256);
- beadState1.width = ((beadState1.width2 + 7) >> 3) + 1;
- beadState1.height = _animator->fetchAnimHeight(_panPagesTable[19], 256);
- if (!_endSequenceBackUpRect) {
- _endSequenceBackUpRect = new uint8[(beadState1.width * beadState1.height) << 3];
- assert(_endSequenceBackUpRect);
- memset(_endSequenceBackUpRect, 0, ((beadState1.width * beadState1.height) << 3) * sizeof(uint8));
- }
- x = beadState1.x = 60;
- y = beadState1.y = 40;
- initBeadState(x, y, x, 25, 8, &beadState2);
- } else {
- if (processBead(beadState1.x, beadState1.y, x, y, &beadState2)) {
- _beadStateVar = 3;
- timer2 = _system->getMillis() + 240 * _tickLength;
- _unkEndSeqVar4 = 0;
- beadState1.dstX = beadState1.x;
- beadState1.dstY = beadState1.y;
- return 0;
- } else {
- _screen->copyFromCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- beadState1.x = x;
- beadState1.y = y;
- }
- }
- _screen->copyCurPageBlock(x >> 3, y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->drawShape(2, _panPagesTable[_lastDisplayedPanPage++], x, y, 0, 0);
- if (_lastDisplayedPanPage > 17)
- _lastDisplayedPanPage = 0;
- _screen->addBitBlitRect(x, y, beadState1.width2, beadState1.height);
- }
- break;
-
- case 3:
- if (_system->getMillis() >= timer1) {
- timer1 = _system->getMillis() + 4 * _tickLength;
- _screen->copyFromCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- beadState1.x = beadState1.dstX + table1[beadState1.tableIndex];
- beadState1.y = beadState1.dstY + table2[beadState1.tableIndex];
- _screen->copyCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->drawShape(2, _panPagesTable[_lastDisplayedPanPage++], beadState1.x, beadState1.y, 0, 0);
- if (_lastDisplayedPanPage >= 17) {
- _lastDisplayedPanPage = 0;
- }
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- ++beadState1.tableIndex;
- if (beadState1.tableIndex > 24) {
- beadState1.tableIndex = 0;
- _unkEndSeqVar4 = 1;
- }
- if (_system->getMillis() > timer2 && _malcolmFlag == 7 && !_unkAmuletVar && !_text->printed()) {
- snd_playSoundEffect(0x0B);
- if (_currentCharacter->x1 > 233 && _currentCharacter->x1 < 305 && _currentCharacter->y1 > 85 && _currentCharacter->y1 < 105 &&
- (_brandonStatusBit & 0x20)) {
- beadState1.unk8 = 290;
- beadState1.unk9 = 40;
- _beadStateVar = 5;
- } else {
- _beadStateVar = 4;
- beadState1.unk8 = _currentCharacter->x1 - 4;
- beadState1.unk9 = _currentCharacter->y1 - 30;
- }
-
- if (_text->printed()) {
- _text->restoreTalkTextMessageBkgd(2, 0);
- }
- initBeadState(beadState1.x, beadState1.y, beadState1.unk8, beadState1.unk9, 6, &beadState2);
- _lastDisplayedPanPage = 18;
- }
- }
- break;
-
- case 4:
- if (_system->getMillis() >= timer1) {
- int x = 0, y = 0;
- timer1 = _system->getMillis();
- if (processBead(beadState1.x, beadState1.y, x, y, &beadState2)) {
- if (_brandonStatusBit & 20) {
- _unkEndSeqVar5 = 2;
- _beadStateVar = 6;
- } else {
- snd_playWanderScoreViaMap(52, 1);
- snd_playSoundEffect(0x0C);
- _unkEndSeqVar5 = 1;
- _beadStateVar = 0;
- }
- } else {
- _screen->copyFromCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- beadState1.x = x;
- beadState1.y = y;
- _screen->copyCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->drawShape(2, _panPagesTable[_lastDisplayedPanPage++], x, y, 0, 0);
- if (_lastDisplayedPanPage > 17) {
- _lastDisplayedPanPage = 0;
- }
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- }
- }
- break;
-
- case 5:
- if (_system->getMillis() >= timer1) {
- timer1 = _system->getMillis();
- int x = 0, y = 0;
- if (processBead(beadState1.x, beadState1.y, x, y, &beadState2)) {
- if (beadState1.dstX == 290) {
- _screen->copyFromCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- uint32 nextRun = 0;
- _finalB->_x = 224;
- _finalB->_y = 8;
- _finalB->_drawPage = 0;
- for (int i = 0; i < 8; ++i) {
- nextRun = _system->getMillis() + _tickLength;
- _finalB->displayFrame(i);
- _screen->updateScreen();
- while (_system->getMillis() < nextRun) {}
- }
- snd_playSoundEffect(0x0D);
- for (int i = 7; i >= 0; --i) {
- nextRun = _system->getMillis() + _tickLength;
- _finalB->displayFrame(i);
- _screen->updateScreen();
- while (_system->getMillis() < nextRun) {}
- }
- initBeadState(beadState1.x, beadState1.y, 63, 60, 6, &beadState2);
- } else {
- _screen->copyFromCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- beadState1.x = -1;
- beadState1.tableIndex = 0;
- _beadStateVar = 0;
- _malcolmFlag = 9;
- }
- } else {
- _screen->copyFromCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- beadState1.x = x;
- beadState1.y = y;
- _screen->copyCurPageBlock(beadState1.x >> 3, beadState1.y, beadState1.width, beadState1.height, _endSequenceBackUpRect);
- _screen->drawShape(2, _panPagesTable[_lastDisplayedPanPage++], x, y, 0, 0);
- if (_lastDisplayedPanPage > 17) {
- _lastDisplayedPanPage = 0;
- }
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- }
- }
- break;
-
- case 6:
- _screen->drawShape(2, _panPagesTable[19], beadState1.x, beadState1.y, 0, 0);
- _screen->addBitBlitRect(beadState1.x, beadState1.y, beadState1.width2, beadState1.height);
- _beadStateVar = 0;
- break;
-
- default:
- break;
- }
- return 0;
-}
-
-void KyraEngine::initBeadState(int x, int y, int x2, int y2, int unk, BeadState *ptr) {
- debug(9, "KyraEngine::initBeadState(%d, %d, %d, %d, %d, 0x%X)", x, y, x2, y2, unk, ptr);
- ptr->unk9 = unk;
- int xDiff = x2 - x;
- int yDiff = y2 - y;
- int unk1 = 0, unk2 = 0;
- if (xDiff > 0) {
- unk1 = 1;
- } else if (xDiff == 0) {
- unk1 = 0;
- } else {
- unk1 = -1;
- }
-
- if (yDiff > 0) {
- unk2 = 1;
- } else if (yDiff == 0) {
- unk2 = 0;
- } else {
- unk2 = -1;
- }
-
- xDiff = abs(xDiff);
- yDiff = abs(yDiff);
-
- ptr->y = 0;
- ptr->x = 0;
- ptr->width = xDiff;
- ptr->height = yDiff;
- ptr->dstX = x2;
- ptr->dstY = y2;
- ptr->width2 = unk1;
- ptr->unk8 = unk2;
-}
-
-int KyraEngine::processBead(int x, int y, int &x2, int &y2, BeadState *ptr) {
- debug(9, "KyraEngine::processBead(%d, %d, 0x%X, 0x%X, 0x%X)", x, y, &x2, &y2, ptr);
- if (x == ptr->dstX && y == ptr->dstY) {
- return 1;
- }
-
- int xPos = x, yPos = y;
- if (ptr->width >= ptr->height) {
- for (int i = 0; i < ptr->unk9; ++i) {
- ptr->y += ptr->height;
- if (ptr->y >= ptr->width) {
- ptr->y -= ptr->width;
- yPos += ptr->unk8;
- }
- xPos += ptr->width2;
- }
- } else {
- for (int i = 0; i < ptr->unk9; ++i) {
- ptr->x += ptr->width;
- if (ptr->x >= ptr->height) {
- ptr->x -= ptr->height;
- xPos += ptr->width2;
- }
- yPos += ptr->unk8;
- }
- }
-
- int temp = abs(x - ptr->dstX);
- if (ptr->unk9 > temp) {
- xPos = ptr->dstX;
- }
- temp = abs(y - ptr->dstY);
- if (ptr->unk9 > temp) {
- yPos = ptr->dstY;
- }
- x2 = xPos;
- y2 = yPos;
- return 0;
-}
-
-void KyraEngine::setupPanPages() {
- debug(9, "KyraEngine::setupPanPages()");
- loadBitmap("bead.cps", 3, 3, 0);
- for (int i = 0; i <= 19; ++i) {
- _panPagesTable[i] = _seq->setPanPages(3, i);
- }
-}
-
-void KyraEngine::freePanPages() {
- debug(9, "KyraEngine::freePanPages()");
- delete _endSequenceBackUpRect;
- _endSequenceBackUpRect = 0;
- for (int i = 0; i <= 19; ++i) {
- free(_panPagesTable[i]);
- _panPagesTable[i] = NULL;
- }
-}
-
-void KyraEngine::closeFinalWsa() {
- debug(9, "KyraEngine::closeFinalWsa()");
- delete _finalA;
- _finalA = 0;
- delete _finalB;
- _finalB = 0;
- delete _finalC;
- _finalC = 0;
- freePanPages();
- _endSequenceNeedLoading = 1;
-}
-
-void KyraEngine::updateKyragemFading() {
- static const uint8 kyraGemPalette[0x28] = {
- 0x3F, 0x3B, 0x38, 0x34, 0x32, 0x2F, 0x2C, 0x29, 0x25, 0x22,
- 0x1F, 0x1C, 0x19, 0x16, 0x12, 0x0F, 0x0C, 0x0A, 0x06, 0x03,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
- };
-
- if (_system->getMillis() < _kyragemFadingState.timerCount)
- return;
-
- _kyragemFadingState.timerCount = _system->getMillis() + 4 * _tickLength;
- int palPos = 684;
- for (int i = 0; i < 20; ++i) {
- _screen->_currentPalette[palPos++] = kyraGemPalette[i + _kyragemFadingState.rOffset];
- _screen->_currentPalette[palPos++] = kyraGemPalette[i + _kyragemFadingState.gOffset];
- _screen->_currentPalette[palPos++] = kyraGemPalette[i + _kyragemFadingState.bOffset];
- }
- _screen->setScreenPalette(_screen->_currentPalette);
- _animator->_updateScreen = true;
- switch (_kyragemFadingState.nextOperation) {
- case 0:
- --_kyragemFadingState.bOffset;
- if (_kyragemFadingState.bOffset >= 1)
- return;
- _kyragemFadingState.nextOperation = 1;
- break;
-
- case 1:
- ++_kyragemFadingState.rOffset;
- if (_kyragemFadingState.rOffset < 19)
- return;
- _kyragemFadingState.nextOperation = 2;
- break;
-
- case 2:
- --_kyragemFadingState.gOffset;
- if (_kyragemFadingState.gOffset >= 1)
- return;
- _kyragemFadingState.nextOperation = 3;
- break;
-
- case 3:
- ++_kyragemFadingState.bOffset;
- if (_kyragemFadingState.bOffset < 19)
- return;
- _kyragemFadingState.nextOperation = 4;
- break;
-
- case 4:
- --_kyragemFadingState.rOffset;
- if (_kyragemFadingState.rOffset >= 1)
- return;
- _kyragemFadingState.nextOperation = 5;
- break;
-
- case 5:
- ++_kyragemFadingState.gOffset;
- if (_kyragemFadingState.gOffset < 19)
- return;
- _kyragemFadingState.nextOperation = 0;
- break;
-
- default:
- break;
- }
-
- _kyragemFadingState.timerCount = _system->getMillis() + 120 * _tickLength;
-}
-
-void KyraEngine::drawJewelPress(int jewel, int drawSpecial) {
- debug(9, "KyraEngine::drawJewelPress(%d, %d)", jewel, drawSpecial);
- _screen->hideMouse();
- int shape = 0;
- if (drawSpecial) {
- shape = 0x14E;
- } else {
- shape = jewel + 0x149;
- }
- snd_playSoundEffect(0x45);
- _screen->drawShape(0, _shapes[4+shape], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
- _screen->updateScreen();
- delayWithTicks(2);
- if (drawSpecial) {
- shape = 0x148;
- } else {
- shape = jewel + 0x143;
- }
- _screen->drawShape(0, _shapes[4+shape], _amuletX2[jewel], _amuletY2[jewel], 0, 0);
- _screen->updateScreen();
- _screen->showMouse();
-}
-
-void KyraEngine::drawJewelsFadeOutStart() {
- debug(9, "KyraEngine::drawJewelsFadeOutStart()");
- static const uint16 jewelTable1[] = { 0x164, 0x15F, 0x15A, 0x155, 0x150, 0xFFFF };
- static const uint16 jewelTable2[] = { 0x163, 0x15E, 0x159, 0x154, 0x14F, 0xFFFF };
- static const uint16 jewelTable3[] = { 0x166, 0x160, 0x15C, 0x157, 0x152, 0xFFFF };
- static const uint16 jewelTable4[] = { 0x165, 0x161, 0x15B, 0x156, 0x151, 0xFFFF };
- for (int i = 0; jewelTable1[i] != 0xFFFF; ++i) {
- if (queryGameFlag(0x57)) {
- _screen->drawShape(0, _shapes[4+jewelTable1[i]], _amuletX2[2], _amuletY2[2], 0, 0);
- }
- if (queryGameFlag(0x59)) {
- _screen->drawShape(0, _shapes[4+jewelTable3[i]], _amuletX2[4], _amuletY2[4], 0, 0);
- }
- if (queryGameFlag(0x56)) {
- _screen->drawShape(0, _shapes[4+jewelTable2[i]], _amuletX2[1], _amuletY2[1], 0, 0);
- }
- if (queryGameFlag(0x58)) {
- _screen->drawShape(0, _shapes[4+jewelTable4[i]], _amuletX2[3], _amuletY2[3], 0, 0);
- }
- _screen->updateScreen();
- delayWithTicks(3);
- }
-}
-
-void KyraEngine::drawJewelsFadeOutEnd(int jewel) {
- debug(9, "KyraEngine::drawJewelsFadeOutEnd(%d)", jewel);
- static const uint16 jewelTable[] = { 0x153, 0x158, 0x15D, 0x162, 0x148, 0xFFFF };
- int newDelay = 0;
- switch (jewel-1) {
- case 2:
- if (_currentCharacter->sceneId >= 109 && _currentCharacter->sceneId <= 198) {
- newDelay = 18900;
- } else {
- newDelay = 8100;
- }
- break;
-
- default:
- newDelay = 3600;
- break;
- }
- setGameFlag(0xF1);
- setTimerCountdown(19, newDelay);
- _screen->hideMouse();
- for (int i = 0; jewelTable[i] != 0xFFFF; ++i) {
- uint16 shape = jewelTable[i];
- if (queryGameFlag(0x57)) {
- _screen->drawShape(0, _shapes[4+shape], _amuletX2[2], _amuletY2[2], 0, 0);
- }
- if (queryGameFlag(0x59)) {
- _screen->drawShape(0, _shapes[4+shape], _amuletX2[4], _amuletY2[4], 0, 0);
- }
- if (queryGameFlag(0x56)) {
- _screen->drawShape(0, _shapes[4+shape], _amuletX2[1], _amuletY2[1], 0, 0);
- }
- if (queryGameFlag(0x58)) {
- _screen->drawShape(0, _shapes[4+shape], _amuletX2[3], _amuletY2[3], 0, 0);
- }
- _screen->updateScreen();
- delayWithTicks(3);
- }
- _screen->showMouse();
-}
-
-} // end of namespace Kyra