PageRenderTime 61ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/scummvm-1.4.1/engines/kyra/sequences_hof.cpp

#
C++ | 2922 lines | 2359 code | 525 blank | 38 comment | 652 complexity | c32c65842ebc905a7144ea9013ff45a9 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. /* ScummVM - Graphic Adventure Engine
  2. *
  3. * ScummVM is the legal property of its developers, whose names
  4. * are too numerous to list here. Please refer to the COPYRIGHT
  5. * file distributed with this source distribution.
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License
  9. * as published by the Free Software Foundation; either version 2
  10. * of the License, or (at your option) any later version.
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18. *
  19. */
  20. #include "kyra/kyra_hof.h"
  21. #include "kyra/timer.h"
  22. #include "kyra/resource.h"
  23. #include "kyra/sound.h"
  24. #include "common/system.h"
  25. namespace Kyra {
  26. void KyraEngine_HoF::seq_playSequences(int startSeq, int endSeq) {
  27. seq_init();
  28. bool allowSkip = (!(_flags.isDemo && !_flags.isTalkie) && (startSeq == kSequenceTitle)) ? false : true;
  29. if (endSeq == -1)
  30. endSeq = startSeq;
  31. assert(startSeq >= 0 && endSeq < kSequenceArraySize && startSeq <= endSeq);
  32. _sound->setSoundList(&_soundData[(startSeq > kSequenceZanfaun) ? kMusicFinale : kMusicIntro]);
  33. _sound->loadSoundFile(0);
  34. _screen->_charWidth = (_flags.gameID == GI_LOL) ? 0 : -2;
  35. memset(_activeWSA, 0, sizeof(ActiveWSA) * 8);
  36. for (int i = 0; i < 8; ++i)
  37. _activeWSA[i].flags = -1;
  38. memset(_activeText, 0, sizeof(ActiveText) * 10);
  39. seq_resetAllTextEntries();
  40. _screen->hideMouse();
  41. int oldPage = _screen->setCurPage(2);
  42. for (int i = 0; i < 4; ++i)
  43. _screen->getPalette(i).clear();
  44. _screen->clearPage(10);
  45. _screen->clearPage(12);
  46. _seqSubframePlaying = false;
  47. _seqWsaCurrentFrame = 0;
  48. _seqTextColor[0] = _seqTextColor[1] = 0;
  49. _seqEndTime = 0;
  50. _menuChoice = 0;
  51. for (int seqNum = startSeq; seqNum <= endSeq && !((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice); seqNum++) {
  52. _screen->clearPage(0);
  53. _screen->clearPage(8);
  54. _screen->copyPalette(1, 0);
  55. _seqFrameCounter = 0;
  56. _seqStartTime = _system->getMillis();
  57. allowSkip = (!(_flags.isDemo && !_flags.isTalkie) && (seqNum == kSequenceTitle)) ? false : true;
  58. Sequence cseq = _sequences->seq[seqNum];
  59. SeqProc cb = _callbackS[seqNum];
  60. if (cseq.flags & 2) {
  61. _screen->loadBitmap(cseq.cpsFile, 2, 2, &_screen->getPalette(0));
  62. _screen->setScreenPalette(_screen->getPalette(0));
  63. } else {
  64. _screen->setCurPage(2);
  65. _screen->clearPage(2);
  66. _screen->loadPalette("goldfont.col", _screen->getPalette(0));
  67. }
  68. if (cb && !(_flags.isDemo && !_flags.isTalkie))
  69. (this->*cb)(0, 0, 0, -1);
  70. if (cseq.flags & 1) {
  71. _seqWsa->close();
  72. _seqWsa->open(cseq.wsaFile, 0, &_screen->getPalette(0));
  73. _screen->setScreenPalette(_screen->getPalette(0));
  74. _seqWsa->displayFrame(0, 2, cseq.xPos, cseq.yPos, 0, 0, 0);
  75. }
  76. if (cseq.flags & 4) {
  77. int cp = _screen->setCurPage(2);
  78. Screen::FontId cf = _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_GOLDFONT_FNT);
  79. if (cseq.stringIndex1 != -1) {
  80. int sX = (320 - _screen->getTextWidth(_sequenceStrings[cseq.stringIndex1])) / 2;
  81. _screen->printText(_sequenceStrings[cseq.stringIndex1], sX, 100 - _screen->getFontHeight(), 1, 0);
  82. }
  83. if (cseq.stringIndex2 != -1) {
  84. int sX = (320 - _screen->getTextWidth(_sequenceStrings[cseq.stringIndex2])) / 2;
  85. _screen->printText(_sequenceStrings[cseq.stringIndex2], sX, 100, 1, 0);
  86. }
  87. _screen->setFont(cf);
  88. _screen->setCurPage(cp);
  89. }
  90. _screen->copyPage(2, 12);
  91. _screen->copyPage(0, 2);
  92. _screen->copyPage(2, 10);
  93. _screen->copyPage(12, 2);
  94. seq_sequenceCommand(cseq.startupCommand);
  95. if (!((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) {
  96. _screen->copyPage(2, 0);
  97. _screen->updateScreen();
  98. }
  99. if (cseq.flags & 1) {
  100. int x = cseq.xPos;
  101. int y = cseq.yPos;
  102. _seqFrameDelay = cseq.frameDelay;
  103. if (_seqWsa) {
  104. if (x < 0) {
  105. _seqWsa->setWidth(_seqWsa->width() + x);
  106. x = 0;
  107. }
  108. if (y < 0) {
  109. _seqWsa->setHeight(_seqWsa->height() + y);
  110. y = 0;
  111. }
  112. if (cseq.xPos + _seqWsa->width() > 319)
  113. _seqWsa->setWidth(320 - cseq.xPos);
  114. if (cseq.yPos + _seqWsa->height() > 199)
  115. _seqWsa->setHeight(199 - cseq.yPos);
  116. }
  117. uint8 dir = (cseq.startFrame > cseq.numFrames) ? 0 : 1;
  118. _seqWsaCurrentFrame = cseq.startFrame;
  119. bool loop = true;
  120. while (loop && !((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) {
  121. _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
  122. if (_seqWsa || !cb)
  123. _screen->copyPage(12, 2);
  124. if (cb) {
  125. int f = _seqWsaCurrentFrame % _seqWsa->frames();
  126. (this->*cb)(_seqWsa, cseq.xPos, cseq.yPos, f);
  127. }
  128. if (_seqWsa) {
  129. int f = _seqWsaCurrentFrame % _seqWsa->frames();
  130. _seqWsa->displayFrame(f, 2, cseq.xPos, cseq.yPos, 0, 0, 0);
  131. }
  132. _screen->copyPage(2, 12);
  133. seq_processWSAs();
  134. seq_processText();
  135. if ((_seqWsa || !cb) && !((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) {
  136. _screen->copyPage(2, 0);
  137. _screen->updateScreen();
  138. }
  139. bool loop2 = true;
  140. while (loop2 && !((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) {
  141. if (_seqWsa) {
  142. seq_processText();
  143. if (!((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) {
  144. _screen->copyPage(2, 0);
  145. _screen->updateScreen();
  146. }
  147. uint32 now = _system->getMillis();
  148. if (now >= _seqEndTime) {
  149. loop2 = false;
  150. } else {
  151. uint32 tdiff = _seqEndTime - now;
  152. uint32 dly = tdiff < _tickLength ? tdiff : _tickLength;
  153. delay(dly);
  154. }
  155. } else {
  156. loop = loop2 = false;
  157. }
  158. }
  159. if (loop) {
  160. if (dir == 1) {
  161. if (++_seqWsaCurrentFrame >= cseq.numFrames)
  162. loop = false;
  163. } else {
  164. if (--_seqWsaCurrentFrame < cseq.numFrames)
  165. loop = false;
  166. }
  167. }
  168. }
  169. _seqWsa->close();
  170. } else {
  171. _seqFrameDelay = cseq.frameDelay;
  172. _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
  173. while (!((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) {
  174. _seqSubFrameStartTime = _system->getMillis();
  175. seq_processWSAs();
  176. if (cb)
  177. (this->*cb)(0, 0, 0, 0);
  178. seq_processText();
  179. _screen->copyPage(2, 0);
  180. _screen->updateScreen();
  181. _screen->copyPage(12, 2);
  182. uint32 now = _system->getMillis();
  183. if (now >= _seqEndTime && !_seqSubframePlaying)
  184. break;
  185. uint32 tdiff = _seqEndTime - _seqSubFrameStartTime;
  186. int32 dly = _tickLength - (now - _seqSubFrameStartTime);
  187. if (dly > 0)
  188. delay(MIN<uint32>(dly, tdiff));
  189. }
  190. }
  191. if (cb && !(_flags.isDemo && !_flags.isTalkie))
  192. (this->*cb)(0, 0, 0, -2);
  193. uint32 ct = seq_activeTextsTimeLeft();
  194. uint32 dl = cseq.duration * _tickLength;
  195. if (dl < ct)
  196. dl = ct;
  197. _seqEndTime = _system->getMillis() + dl;
  198. while (!((skipFlag() && allowSkip) || shouldQuit() || (_abortIntroFlag && allowSkip) || _menuChoice)) {
  199. _seqSubFrameStartTime = _system->getMillis();
  200. seq_processWSAs();
  201. _screen->copyPage(2, 0);
  202. _screen->updateScreen();
  203. _screen->copyPage(12, 2);
  204. uint32 now = _system->getMillis();
  205. if (now >= _seqEndTime && !_seqSubframePlaying) {
  206. break;
  207. }
  208. uint32 tdiff = _seqEndTime - _seqSubFrameStartTime;
  209. int32 dly = _tickLength - (now - _seqSubFrameStartTime);
  210. if (dly > 0)
  211. delay(MIN<uint32>(dly, tdiff));
  212. }
  213. seq_sequenceCommand(cseq.finalCommand);
  214. seq_resetAllTextEntries();
  215. if (_abortIntroFlag || skipFlag()) {
  216. _sound->haltTrack();
  217. _sound->voiceStop();
  218. }
  219. if (!_flags.isDemo || _flags.isTalkie) {
  220. if ((seqNum != kSequenceTitle && seqNum < kSequenceZanfaun &&
  221. (_abortIntroFlag || skipFlag())) || seqNum == kSequenceZanfaun) {
  222. _abortIntroFlag = false;
  223. _eventList.clear();
  224. seqNum = kSequenceWestwood;
  225. } else if (seqNum < kSequenceFrash && (_abortIntroFlag || skipFlag())) {
  226. _abortIntroFlag = false;
  227. _eventList.clear();
  228. seqNum = kSequenceFirates;
  229. }
  230. } else if (seqNum == endSeq && !(_abortIntroFlag || skipFlag())) {
  231. seqNum = 0;
  232. }
  233. if (_menuChoice) {
  234. _abortIntroFlag = false;
  235. _eventList.clear();
  236. if (_menuChoice == 2) {
  237. seqNum = kSequenceTitle;
  238. _menuChoice = 0;
  239. }
  240. }
  241. }
  242. if (_flags.isDemo && !_flags.isTalkie) {
  243. _eventList.clear();
  244. _screen->fadeToBlack();
  245. }
  246. if (!_menuChoice)
  247. delay(1200);
  248. _screen->setCurPage(oldPage);
  249. _screen->showMouse();
  250. for (int i = 0; i < 8; i++)
  251. seq_unloadWSA(i);
  252. _seqWsa->close();
  253. _screen->_charWidth = 0;
  254. seq_uninit();
  255. }
  256. int KyraEngine_HoF::seq_introWestwood(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  257. if (frm == -2) {
  258. if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
  259. delay(300 * _tickLength);
  260. } else if (!frm) {
  261. _sound->playTrack(2);
  262. }
  263. return 0;
  264. }
  265. int KyraEngine_HoF::seq_introTitle(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  266. if (frm == 1) {
  267. _sound->playTrack(3);
  268. } else if (frm == 25) {
  269. int cp = _screen->setCurPage(0);
  270. _screen->showMouse();
  271. _system->updateScreen();
  272. _menuChoice = _menu->handle(11) + 1;
  273. _seqEndTime = 0;
  274. _seqSubframePlaying = false;
  275. if (_menuChoice == 4)
  276. quitGame();
  277. _screen->hideMouse();
  278. _screen->setCurPage(cp);
  279. }
  280. return 0;
  281. }
  282. int KyraEngine_HoF::seq_introOverview(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  283. uint8 *tmpPal = _screen->getPalette(3).getData() + 0x101;
  284. memset(tmpPal, 0, 256);
  285. _seqSubFrameEndTimeInternal = 0;
  286. uint32 now = 0;
  287. switch (_seqFrameCounter) {
  288. case 0:
  289. _seqSubframePlaying = true;
  290. _sound->playTrack(4);
  291. _seqSubFrameEndTimeInternal = _system->getMillis() + 60 * _tickLength;
  292. _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff;
  293. memset(_seqTextColorMap, _seqTextColor[1], 16);
  294. _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff;
  295. _screen->setTextColorMap(_seqTextColorMap);
  296. now = _system->getMillis();
  297. if (_seqSubFrameEndTimeInternal > now)
  298. delay(_seqSubFrameEndTimeInternal - now);
  299. break;
  300. case 1:
  301. _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x40, 0, 0, 0, 0x100, true);
  302. for (int i = 0; i < 256; i++)
  303. tmpPal[_screen->getPalette(3)[i]] = 1;
  304. for (int i = 0; i < 256; i++) {
  305. int v = (tmpPal[i] == 1) ? i : _screen->getPalette(3)[i];
  306. v *= 3;
  307. _screen->getPalette(2)[3 * i] = _screen->getPalette(0)[v];
  308. _screen->getPalette(2)[3 * i + 1] = _screen->getPalette(0)[v + 1];
  309. _screen->getPalette(2)[3 * i + 2] = _screen->getPalette(0)[v + 2];
  310. }
  311. break;
  312. case 40:
  313. seq_loadNestedSequence(0, kSequenceOver1);
  314. break;
  315. case 60:
  316. seq_loadNestedSequence(1, kSequenceOver2);
  317. break;
  318. case 120:
  319. seq_playTalkText(0);
  320. break;
  321. case 200:
  322. seq_waitForTextsTimeout();
  323. _screen->fadePalette(_screen->getPalette(2), 64);
  324. break;
  325. case 201:
  326. _screen->setScreenPalette(_screen->getPalette(2));
  327. _screen->updateScreen();
  328. _screen->applyOverlay(0, 0, 320, 200, 2, _screen->getPalette(3).getData());
  329. _screen->copyPage(2, 12);
  330. _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
  331. _screen->setScreenPalette(_screen->getPalette(0));
  332. _screen->updateScreen();
  333. seq_resetActiveWSA(0);
  334. seq_resetActiveWSA(1);
  335. break;
  336. case 282:
  337. seq_loadNestedSequence(0, kSequenceForest);
  338. seq_playTalkText(1);
  339. break;
  340. case 354:
  341. case 434:
  342. if (!((_seqFrameCounter == 354 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 434 && _flags.platform == Common::kPlatformPC)))
  343. break;
  344. seq_resetActiveWSA(0);
  345. seq_loadNestedSequence(0, kSequenceDragon);
  346. break;
  347. case 400:
  348. case 540:
  349. if (!((_seqFrameCounter == 400 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 540 && _flags.platform == Common::kPlatformPC)))
  350. break;
  351. seq_waitForTextsTimeout();
  352. seq_resetActiveWSA(0);
  353. _seqEndTime = 0;
  354. _seqSubframePlaying = false;
  355. break;
  356. default:
  357. break;
  358. }
  359. _seqFrameCounter++;
  360. return 0;
  361. }
  362. int KyraEngine_HoF::seq_introLibrary(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  363. switch (_seqFrameCounter) {
  364. case 0:
  365. _seqSubframePlaying = true;
  366. _sound->playTrack(5);
  367. _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x24, 0, 0, 0, 0x100, false);
  368. _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff;
  369. memset(_seqTextColorMap, _seqTextColor[1], 16);
  370. _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff;
  371. _screen->setTextColorMap(_seqTextColorMap);
  372. break;
  373. case 1:
  374. seq_loadNestedSequence(0, kSequenceLibrary3);
  375. seq_playTalkText(4);
  376. break;
  377. case 100:
  378. seq_waitForTextsTimeout();
  379. _screen->copyPage(12, 2);
  380. _screen->applyOverlay(0, 0, 320, 200, 2, _screen->getPalette(3).getData());
  381. _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
  382. _screen->updateScreen();
  383. _screen->copyPage(2, 12);
  384. seq_resetActiveWSA(0);
  385. seq_loadNestedSequence(0, kSequenceDarm);
  386. break;
  387. case 104:
  388. seq_playTalkText(5);
  389. break;
  390. case 240:
  391. seq_waitForTextsTimeout();
  392. seq_resetActiveWSA(0);
  393. seq_loadNestedSequence(0, kSequenceLibrary2);
  394. break;
  395. case 340:
  396. seq_resetActiveWSA(0);
  397. _screen->applyOverlay(0, 0, 320, 200, 2, _screen->getPalette(3).getData());
  398. _screen->copyPage(2, 12);
  399. _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
  400. _screen->updateScreen();
  401. seq_loadNestedSequence(0, kSequenceMarco);
  402. seq_playTalkText(6);
  403. break;
  404. case 480:
  405. case 660:
  406. if (!((_seqFrameCounter == 480 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 660 && _flags.platform == Common::kPlatformPC)))
  407. break;
  408. _screen->copyPage(2, 12);
  409. seq_waitForTextsTimeout();
  410. seq_resetActiveWSA(0);
  411. _seqEndTime = 0;
  412. _seqSubframePlaying = false;
  413. break;
  414. default:
  415. break;
  416. }
  417. _seqFrameCounter++;
  418. return 0;
  419. }
  420. int KyraEngine_HoF::seq_introHand(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  421. switch (_seqFrameCounter) {
  422. case 0:
  423. _seqSubframePlaying = true;
  424. _sound->playTrack(6);
  425. _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x24, 0, 0, 0, 0x100, false);
  426. _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff;
  427. memset(_seqTextColorMap, _seqTextColor[1], 16);
  428. _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff;
  429. _screen->setTextColorMap(_seqTextColorMap);
  430. break;
  431. case 1:
  432. seq_loadNestedSequence(0, kSequenceHand1a);
  433. seq_loadNestedSequence(1, kSequenceHand1b);
  434. seq_loadNestedSequence(2, kSequenceHand1c);
  435. seq_playTalkText(7);
  436. break;
  437. case 201:
  438. seq_waitForTextsTimeout();
  439. _screen->applyOverlay(0, 0, 320, 200, 2, _screen->getPalette(3).getData());
  440. _screen->copyPage(2, 12);
  441. _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
  442. _screen->updateScreen();
  443. seq_resetActiveWSA(0);
  444. seq_resetActiveWSA(1);
  445. seq_resetActiveWSA(2);
  446. seq_loadNestedSequence(0, kSequenceHand2);
  447. seq_playTalkText(8);
  448. break;
  449. case 260:
  450. case 395:
  451. if (!((_seqFrameCounter == 260 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 395 && _flags.platform == Common::kPlatformPC)))
  452. break;
  453. seq_waitForTextsTimeout();
  454. seq_resetActiveWSA(0);
  455. seq_loadNestedSequence(1, kSequenceHand3);
  456. seq_playTalkText(9);
  457. break;
  458. case 365:
  459. case 500:
  460. if (!((_seqFrameCounter == 365 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 500 && _flags.platform == Common::kPlatformPC)))
  461. break;
  462. seq_waitForTextsTimeout();
  463. seq_resetActiveWSA(1);
  464. seq_loadNestedSequence(0, kSequenceHand4);
  465. break;
  466. case 405:
  467. case 540:
  468. if (!((_seqFrameCounter == 405 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 540 && _flags.platform == Common::kPlatformPC)))
  469. break;
  470. seq_playTalkText(10);
  471. break;
  472. case 484:
  473. case 630:
  474. if (!((_seqFrameCounter == 484 && (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)) || (_seqFrameCounter == 630 && _flags.platform == Common::kPlatformPC)))
  475. break;
  476. seq_waitForTextsTimeout();
  477. seq_resetActiveWSA(0);
  478. _seqEndTime = 0;
  479. _seqSubframePlaying = false;
  480. break;
  481. default:
  482. break;
  483. }
  484. _seqFrameCounter++;
  485. return 0;
  486. }
  487. int KyraEngine_HoF::seq_introPoint(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  488. if (frm == -2) {
  489. seq_waitForTextsTimeout();
  490. _seqEndTime = 0;
  491. }
  492. switch (_seqFrameCounter) {
  493. case -2:
  494. seq_waitForTextsTimeout();
  495. break;
  496. case 0:
  497. _sound->playTrack(7);
  498. _seqTextColor[1] = 0xf7;
  499. memset(_seqTextColorMap, _seqTextColor[1], 16);
  500. _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff;
  501. _screen->setTextColorMap(_seqTextColorMap);
  502. _screen->generateGrayOverlay(_screen->getPalette(0), _screen->getPalette(3).getData(), 0x24, 0, 0, 0, 0x100, false);
  503. break;
  504. case 1:
  505. seq_playTalkText(11);
  506. break;
  507. default:
  508. break;
  509. }
  510. _seqFrameCounter++;
  511. return 0;
  512. }
  513. int KyraEngine_HoF::seq_introZanfaun(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  514. if (frm == -2) {
  515. seq_waitForTextsTimeout();
  516. _seqEndTime = 0;
  517. return 0;
  518. }
  519. switch (_seqFrameCounter) {
  520. case 0:
  521. _sound->playTrack(8);
  522. _seqTextColor[1] = 0xfd;
  523. memset(_seqTextColorMap, _seqTextColor[1], 16);
  524. _seqTextColorMap[1] = _seqTextColor[0] = _screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 255) & 0xff;
  525. _screen->setTextColorMap(_seqTextColorMap);
  526. break;
  527. case 1:
  528. if (_flags.isTalkie) {
  529. seq_playWsaSyncDialogue(21, 13, -1, 140, 70, 160, wsaObj, 0, 8, x, y);
  530. } else {
  531. seq_setTextEntry(21, 140, 70, 200, 160);
  532. _seqFrameDelay = 200;
  533. }
  534. break;
  535. case 2:
  536. case 11:
  537. case 21:
  538. if (!_flags.isTalkie)
  539. _seqFrameDelay = 12;
  540. break;
  541. case 9:
  542. if (_flags.isTalkie)
  543. seq_playWsaSyncDialogue(13, 14, -1, 140, (_flags.lang == Common::FR_FRA
  544. || _flags.lang == Common::DE_DEU) ? 50 : 70, 160, wsaObj, 9, 15, x, y);
  545. break;
  546. case 10:
  547. if (!_flags.isTalkie) {
  548. seq_waitForTextsTimeout();
  549. seq_setTextEntry(13, 140, 50, _sequenceStringsDuration[13], 160);
  550. _seqFrameDelay = 300;
  551. }
  552. break;
  553. case 16:
  554. if (_flags.isTalkie)
  555. seq_playWsaSyncDialogue(18, 15, -1, 140, (_flags.lang == Common::FR_FRA) ? 50 :
  556. (_flags.lang == Common::DE_DEU ? 40 : 70), 160, wsaObj, 10, 16, x, y);
  557. break;
  558. case 17:
  559. if (_flags.isTalkie)
  560. _seqFrameDelay = 12;
  561. break;
  562. case 20:
  563. if (!_flags.isTalkie) {
  564. seq_waitForTextsTimeout();
  565. seq_setTextEntry(18, 160, 50, _sequenceStringsDuration[18], 160);
  566. _seqFrameDelay = 200;
  567. }
  568. break;
  569. case 26:
  570. seq_waitForTextsTimeout();
  571. break;
  572. case 46:
  573. if (_flags.isTalkie) {
  574. seq_playWsaSyncDialogue(16, 16, -1, 200, 50, 120, wsaObj, 46, 46, x, y);
  575. } else {
  576. seq_waitForTextsTimeout();
  577. seq_setTextEntry(16, 200, 50, _sequenceStringsDuration[16], 120);
  578. }
  579. _seqEndTime = _system->getMillis() + 120 * _tickLength;
  580. break;
  581. default:
  582. break;
  583. }
  584. _seqFrameCounter++;
  585. return 0;
  586. }
  587. int KyraEngine_HoF::seq_introOver1(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  588. if (frm == 2)
  589. seq_waitForTextsTimeout();
  590. else if (frm == 3)
  591. seq_playTalkText(12);
  592. return frm;
  593. }
  594. int KyraEngine_HoF::seq_introOver2(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  595. if (frm == 1)
  596. seq_playTalkText(12);
  597. return frm;
  598. }
  599. int KyraEngine_HoF::seq_introForest(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  600. if (frm == 11)
  601. seq_waitForTextsTimeout();
  602. else if (frm == 12)
  603. seq_playTalkText(2);
  604. return frm;
  605. }
  606. int KyraEngine_HoF::seq_introDragon(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  607. if (frm == 11)
  608. seq_waitForTextsTimeout();
  609. else if (frm == 3)
  610. seq_playTalkText(3);
  611. return frm;
  612. }
  613. int KyraEngine_HoF::seq_introDarm(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  614. //NULLSUB (at least in FM-TOWNS version)
  615. return frm;
  616. }
  617. int KyraEngine_HoF::seq_introLibrary2(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  618. //NULLSUB (at least in FM-TOWNS version)
  619. return frm;
  620. }
  621. int KyraEngine_HoF::seq_introMarco(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  622. if (frm == 36) {
  623. seq_waitForTextsTimeout();
  624. _seqEndTime = 0;
  625. }
  626. return frm;
  627. }
  628. int KyraEngine_HoF::seq_introHand1a(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  629. //NULLSUB (at least in FM-TOWNS version)
  630. return frm;
  631. }
  632. int KyraEngine_HoF::seq_introHand1b(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  633. if (frm == 15)
  634. frm = 12;
  635. return frm;
  636. }
  637. int KyraEngine_HoF::seq_introHand1c(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  638. if (frm == 8)
  639. frm = 4;
  640. return frm;
  641. }
  642. int KyraEngine_HoF::seq_introHand2(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  643. //NULLSUB (at least in FM-TOWNS version)
  644. return frm;
  645. }
  646. int KyraEngine_HoF::seq_introHand3(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  647. //NULLSUB (at least in FM-TOWNS version)
  648. return frm;
  649. }
  650. int KyraEngine_HoF::seq_finaleFunters(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  651. _seqSubFrameEndTimeInternal = 0;
  652. int chatX = 0;
  653. int chatY = 0;
  654. int chatW = 0;
  655. int chatFirstFrame = 0;
  656. int chatLastFrame = 0;
  657. uint16 voiceIndex = 0;
  658. switch (frm) {
  659. case -2:
  660. seq_sequenceCommand(9);
  661. break;
  662. case 0:
  663. _sound->playTrack(3);
  664. _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff;
  665. memset(_seqTextColorMap, _seqTextColor[1], 16);
  666. _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
  667. _screen->setTextColorMap(_seqTextColorMap);
  668. _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
  669. seq_printCreditsString(81, 240, 70, _seqTextColorMap, 252);
  670. seq_printCreditsString(82, 240, 90, _seqTextColorMap, _seqTextColor[0]);
  671. _screen->copyPage(2, 12);
  672. seq_playTalkText(_flags.isTalkie ? 28 : 24);
  673. delay(_seqSubFrameEndTimeInternal - _system->getMillis());
  674. _seqTextColor[0] = 1;
  675. if (_flags.isTalkie) {
  676. chatY = (_flags.lang == Common::FR_FRA) ? 70 : 78;
  677. chatFirstFrame = 9;
  678. chatLastFrame = 15;
  679. voiceIndex = 34;
  680. } else {
  681. chatY = (_flags.lang == Common::FR_FRA) ? 78 : 70;
  682. chatFirstFrame = 0;
  683. chatLastFrame = 8;
  684. }
  685. chatX = (_flags.lang == Common::FR_FRA) ? 84 : 88;
  686. chatW = 100;
  687. seq_playWsaSyncDialogue(22, voiceIndex, 187, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
  688. break;
  689. case 9:
  690. case 16:
  691. if (!((frm == 9 && !_flags.isTalkie) || (frm == 16 && _flags.isTalkie)))
  692. break;
  693. _seqFrameDelay = 12;
  694. if (_flags.lang == Common::FR_FRA) {
  695. chatX = 80;
  696. chatW = 112;
  697. } else {
  698. chatX = (_flags.lang == Common::DE_DEU) ? 84 : 96;
  699. chatW = 100;
  700. }
  701. if (_flags.isTalkie) {
  702. chatFirstFrame = 0;
  703. chatLastFrame = 8;
  704. voiceIndex = 35;
  705. } else {
  706. chatFirstFrame = 9;
  707. chatLastFrame = 15;
  708. }
  709. chatY = 70;
  710. seq_playWsaSyncDialogue(23, voiceIndex, 137, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
  711. if (_flags.isTalkie)
  712. _seqWsaCurrentFrame = 17;
  713. break;
  714. default:
  715. break;
  716. }
  717. _seqFrameCounter++;
  718. return 0;
  719. }
  720. int KyraEngine_HoF::seq_finaleFerb(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  721. _seqSubFrameEndTimeInternal = 0;
  722. int chatX = 0;
  723. int chatY = 0;
  724. int chatW = 0;
  725. int chatFirstFrame = 0;
  726. int chatLastFrame = 0;
  727. uint16 voiceIndex = 0;
  728. switch (frm) {
  729. case -2:
  730. seq_sequenceCommand(9);
  731. _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
  732. seq_printCreditsString(34, 240, _flags.isTalkie ? 60 : 40, _seqTextColorMap, 252);
  733. seq_printCreditsString(35, 240, _flags.isTalkie ? 70 : 50, _seqTextColorMap, _seqTextColor[0]);
  734. seq_printCreditsString(36, 240, _flags.isTalkie ? 90 : 70, _seqTextColorMap, 252);
  735. seq_printCreditsString(37, 240, _flags.isTalkie ? 100 : 90, _seqTextColorMap, _seqTextColor[0]);
  736. seq_printCreditsString(38, 240, _flags.isTalkie ? 120 : 110, _seqTextColorMap, 252);
  737. seq_printCreditsString(39, 240, _flags.isTalkie ? 130 : 120, _seqTextColorMap, _seqTextColor[0]);
  738. if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
  739. seq_printCreditsString(103, 240, 130, _seqTextColorMap, _seqTextColor[0]);
  740. delay(_seqSubFrameEndTimeInternal - _system->getMillis());
  741. _seqEndTime = 0;
  742. break;
  743. case 0:
  744. _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff;
  745. memset(_seqTextColorMap, _seqTextColor[1], 16);
  746. _seqTextColor[0] = _seqTextColorMap[1] = 255;
  747. _screen->setTextColorMap(_seqTextColorMap);
  748. break;
  749. case 5:
  750. if (!_flags.isTalkie)
  751. seq_playTalkText(18);
  752. _seqFrameDelay = 16;
  753. if (_flags.isTalkie) {
  754. chatFirstFrame = 5;
  755. chatLastFrame = 8;
  756. voiceIndex = 22;
  757. } else {
  758. chatLastFrame = 14;
  759. }
  760. chatX = 116;
  761. chatY = 90;
  762. chatW = 60;
  763. seq_playWsaSyncDialogue(24, voiceIndex, 149, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
  764. break;
  765. case 11:
  766. if (_flags.isTalkie)
  767. seq_playWsaSyncDialogue(24, 22, 149, 116, 90, 60, wsaObj, 11, 14, x, y);
  768. break;
  769. case 16:
  770. seq_playTalkText(_flags.isTalkie ? 23 : 19);
  771. _seqFrameDelay = _flags.isTalkie ? 20 : 16;
  772. if (_flags.lang == Common::FR_FRA) {
  773. chatY = 48;
  774. chatW = 88;
  775. } else {
  776. chatY = 60;
  777. chatW = 100;
  778. }
  779. chatX = 60;
  780. if (_flags.isTalkie)
  781. voiceIndex = 36;
  782. seq_playWsaSyncDialogue(25, voiceIndex, 143, chatX, chatY, chatW, wsaObj, 16, 25, x, y);
  783. _seqFrameDelay = 16;
  784. break;
  785. default:
  786. break;
  787. }
  788. _seqFrameCounter++;
  789. return 0;
  790. }
  791. int KyraEngine_HoF::seq_finaleFish(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  792. _seqSubFrameEndTimeInternal = 0;
  793. int chatX = 0;
  794. int chatY = 0;
  795. int chatW = 0;
  796. uint16 voiceIndex = 0;
  797. switch (frm) {
  798. case -2:
  799. seq_sequenceCommand(9);
  800. _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
  801. seq_printCreditsString(40, 240, _flags.isTalkie ? 55 : 40, _seqTextColorMap, 252);
  802. seq_printCreditsString(41, 240, _flags.isTalkie ? 65 : 50, _seqTextColorMap, _seqTextColor[0]);
  803. seq_printCreditsString(42, 240, _flags.isTalkie ? 75 : 60, _seqTextColorMap, _seqTextColor[0]);
  804. seq_printCreditsString(43, 240, _flags.isTalkie ? 95 : 80, _seqTextColorMap, 252);
  805. seq_printCreditsString(44, 240, _flags.isTalkie ? 105 : 90, _seqTextColorMap, _seqTextColor[0]);
  806. seq_printCreditsString(93, 240, _flags.isTalkie ? 125 : 110, _seqTextColorMap, 252);
  807. seq_printCreditsString(94, 240, _flags.isTalkie ? 135 : 120, _seqTextColorMap, _seqTextColor[0]);
  808. delay(_seqSubFrameEndTimeInternal - _system->getMillis());
  809. _seqEndTime = 0;
  810. break;
  811. case 0:
  812. _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff;
  813. memset(_seqTextColorMap, _seqTextColor[1], 16);
  814. _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
  815. _screen->setTextColorMap(_seqTextColorMap);
  816. break;
  817. case 4:
  818. chatX = 94;
  819. chatY = 42;
  820. chatW = 100;
  821. if (_flags.isTalkie)
  822. voiceIndex = 37;
  823. seq_playWsaSyncDialogue(26, voiceIndex, 149, chatX, chatY, chatW, wsaObj, 3, 12, x, y);
  824. break;
  825. case 14:
  826. seq_playTalkText(_flags.isTalkie ? 19 : 15);
  827. break;
  828. case 23:
  829. seq_playTalkText(_flags.isTalkie ? 20 : 16);
  830. break;
  831. case 29:
  832. chatX = (_flags.lang == Common::DE_DEU) ? 82 : ((_flags.lang == Common::FR_FRA) ? 92 : 88);
  833. chatY = 40;
  834. chatW = 100;
  835. if (_flags.isTalkie) {
  836. if (_flags.lang == Common::DE_DEU)
  837. chatY = 35;
  838. voiceIndex = 38;
  839. }
  840. seq_playWsaSyncDialogue(27, voiceIndex, 187, chatX, chatY, chatW, wsaObj, 28, 34, x, y);
  841. break;
  842. case 45:
  843. seq_playTalkText(_flags.isTalkie ? 21 : 17);
  844. break;
  845. case 50:
  846. seq_playTalkText(_flags.isTalkie ? 29 : 25);
  847. break;
  848. default:
  849. break;
  850. }
  851. _seqFrameCounter++;
  852. return 0;
  853. }
  854. int KyraEngine_HoF::seq_finaleFheep(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  855. _seqSubFrameEndTimeInternal = 0;
  856. int chatX = 0;
  857. int chatY = 0;
  858. int chatW = 0;
  859. int chatFirstFrame = 0;
  860. int chatLastFrame = 0;
  861. uint16 voiceIndex = 0;
  862. switch (frm) {
  863. case -2:
  864. _screen->copyPage(12, 2);
  865. _screen->copyPage(2, 0);
  866. _screen->updateScreen();
  867. seq_sequenceCommand(9);
  868. _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
  869. seq_printCreditsString(49, 240, 20, _seqTextColorMap, 252);
  870. seq_printCreditsString(50, 240, 30, _seqTextColorMap, _seqTextColor[0]);
  871. seq_printCreditsString(51, 240, 40, _seqTextColorMap, _seqTextColor[0]);
  872. seq_printCreditsString(52, 240, 50, _seqTextColorMap, _seqTextColor[0]);
  873. seq_printCreditsString(53, 240, 60, _seqTextColorMap, _seqTextColor[0]);
  874. seq_printCreditsString(54, 240, 70, _seqTextColorMap, _seqTextColor[0]);
  875. seq_printCreditsString(55, 240, 80, _seqTextColorMap, _seqTextColor[0]);
  876. seq_printCreditsString(56, 240, 90, _seqTextColorMap, _seqTextColor[0]);
  877. seq_printCreditsString(57, 240, 100, _seqTextColorMap, _seqTextColor[0]);
  878. seq_printCreditsString(58, 240, 110, _seqTextColorMap, _seqTextColor[0]);
  879. seq_printCreditsString(60, 240, 120, _seqTextColorMap, _seqTextColor[0]);
  880. seq_printCreditsString(61, 240, 130, _seqTextColorMap, _seqTextColor[0]);
  881. seq_printCreditsString(62, 240, 140, _seqTextColorMap, _seqTextColor[0]);
  882. seq_printCreditsString(63, 240, 150, _seqTextColorMap, _seqTextColor[0]);
  883. seq_printCreditsString(64, 240, 160, _seqTextColorMap, _seqTextColor[0]);
  884. delay(_seqSubFrameEndTimeInternal - _system->getMillis());
  885. _seqEndTime = 0;
  886. break;
  887. case 0:
  888. _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff;
  889. memset(_seqTextColorMap, _seqTextColor[1], 16);
  890. _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
  891. _screen->setTextColorMap(_seqTextColorMap);
  892. break;
  893. case 2:
  894. seq_playTalkText(_flags.isTalkie ? 25 : 21);
  895. if (_flags.lang == Common::FR_FRA) {
  896. chatX = 92;
  897. chatY = 72;
  898. } else {
  899. chatX = (_flags.lang == Common::DE_DEU) ? 90 : 98;
  900. chatY = 84;
  901. }
  902. if (_flags.isTalkie) {
  903. chatFirstFrame = 8;
  904. chatLastFrame = 9;
  905. voiceIndex = 39;
  906. } else {
  907. chatFirstFrame = 2;
  908. chatLastFrame = -8;
  909. }
  910. chatW = 100;
  911. seq_playWsaSyncDialogue(28, voiceIndex, -1, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
  912. if (_flags.isTalkie)
  913. _seqWsaCurrentFrame = 4;
  914. break;
  915. case 9:
  916. seq_playTalkText(_flags.isTalkie ? 24 : 20);
  917. _seqFrameDelay = 100;
  918. break;
  919. default:
  920. break;
  921. }
  922. _seqFrameCounter++;
  923. return 0;
  924. }
  925. int KyraEngine_HoF::seq_finaleFarmer(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  926. _seqSubFrameEndTimeInternal = 0;
  927. int chatX = 0;
  928. int chatY = 0;
  929. int chatW = 0;
  930. uint16 voiceIndex = 0;
  931. switch (frm) {
  932. case -2:
  933. _screen->copyPage(12, 2);
  934. _screen->copyPage(2, 0);
  935. _screen->updateScreen();
  936. seq_sequenceCommand(9);
  937. _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
  938. seq_printCreditsString(45, 240, 40, _seqTextColorMap, 252);
  939. seq_printCreditsString(46, 240, 50, _seqTextColorMap, _seqTextColor[0]);
  940. seq_printCreditsString(47, 240, 60, _seqTextColorMap, _seqTextColor[0]);
  941. seq_printCreditsString(83, 240, 80, _seqTextColorMap, 252);
  942. seq_printCreditsString(48, 240, 90, _seqTextColorMap, _seqTextColor[0]);
  943. seq_printCreditsString(65, 240, 110, _seqTextColorMap, 252);
  944. seq_printCreditsString(66, 240, 120, _seqTextColorMap, _seqTextColor[0]);
  945. seq_printCreditsString(67, 240, 130, _seqTextColorMap, _seqTextColor[0]);
  946. seq_printCreditsString(68, 240, 140, _seqTextColorMap, _seqTextColor[0]);
  947. seq_printCreditsString(69, 240, 150, _seqTextColorMap, _seqTextColor[0]);
  948. if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
  949. seq_printCreditsString(104, 240, 160, _seqTextColorMap, _seqTextColor[0]);
  950. delay(_seqSubFrameEndTimeInternal - _system->getMillis());
  951. _seqEndTime = 0;
  952. break;
  953. case 0:
  954. _seqTextColor[1] = 1 + (_screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 254) & 0xff);
  955. memset(_seqTextColorMap, _seqTextColor[1], 16);
  956. _seqTextColorMap[1] = _seqTextColor[0] = 1 + (_screen->findLeastDifferentColor(_seqTextColorPresets + 3, _screen->getPalette(0), 1, 254) & 0xff);
  957. _screen->setTextColorMap(_seqTextColorMap);
  958. seq_playTalkText(_flags.isTalkie ? 30 : 26);
  959. break;
  960. case 6:
  961. if (_flags.isTalkie)
  962. seq_playTalkText(18);
  963. break;
  964. case 12:
  965. if (!_flags.isTalkie)
  966. seq_playTalkText(14);
  967. chatX = 90;
  968. chatY = 30;
  969. chatW = 100;
  970. if (_flags.isTalkie) {
  971. if (_flags.lang == Common::FR_FRA || _flags.lang == Common::DE_DEU) {
  972. chatX = 75;
  973. chatY = 25;
  974. }
  975. voiceIndex = 40;
  976. }
  977. seq_playWsaSyncDialogue(29, voiceIndex, 150, chatX, chatY, chatW, wsaObj, 12, -21, x, y);
  978. break;
  979. default:
  980. break;
  981. }
  982. _seqFrameCounter++;
  983. return 0;
  984. }
  985. int KyraEngine_HoF::seq_finaleFuards(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  986. _seqSubFrameEndTimeInternal = 0;
  987. int chatX = 0;
  988. int chatY = 0;
  989. int chatW = 0;
  990. int chatFirstFrame = 0;
  991. int chatLastFrame = 0;
  992. //int textCol = 0;
  993. uint16 voiceIndex = 0;
  994. switch (frm) {
  995. case -2:
  996. seq_sequenceCommand(9);
  997. _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
  998. seq_printCreditsString(70, 240, 20, _seqTextColorMap, 252);
  999. seq_printCreditsString(71, 240, 30, _seqTextColorMap, _seqTextColor[0]);
  1000. seq_printCreditsString(72, 240, 40, _seqTextColorMap, _seqTextColor[0]);
  1001. seq_printCreditsString(73, 240, 50, _seqTextColorMap, _seqTextColor[0]);
  1002. seq_printCreditsString(74, 240, 60, _seqTextColorMap, _seqTextColor[0]);
  1003. seq_printCreditsString(75, 240, 70, _seqTextColorMap, _seqTextColor[0]);
  1004. seq_printCreditsString(101, 240, 80, _seqTextColorMap, _seqTextColor[0]);
  1005. seq_printCreditsString(102, 240, 90, _seqTextColorMap, _seqTextColor[0]);
  1006. seq_printCreditsString(87, 240, 100, _seqTextColorMap, _seqTextColor[0]);
  1007. seq_printCreditsString(88, 240, 110, _seqTextColorMap, _seqTextColor[0]);
  1008. seq_printCreditsString(89, 240, 120, _seqTextColorMap, _seqTextColor[0]);
  1009. seq_printCreditsString(90, 240, 130, _seqTextColorMap, _seqTextColor[0]);
  1010. seq_printCreditsString(91, 240, 140, _seqTextColorMap, _seqTextColor[0]);
  1011. seq_printCreditsString(92, 240, 150, _seqTextColorMap, _seqTextColor[0]);
  1012. delay(_seqSubFrameEndTimeInternal - _system->getMillis());
  1013. _seqEndTime = 0;
  1014. break;
  1015. case 0:
  1016. for (int i = 0; i < 0x300; i++)
  1017. _screen->getPalette(0)[i] &= 0x3f;
  1018. _seqTextColor[1] = 0xCf;
  1019. memset(_seqTextColorMap, _seqTextColor[1], 16);
  1020. _seqTextColor[0] = _seqTextColorMap[1] = 0xfe;
  1021. _screen->setTextColorMap(_seqTextColorMap);
  1022. break;
  1023. case 6:
  1024. _seqFrameDelay = 20;
  1025. if (_flags.isTalkie) {
  1026. chatX = 82;
  1027. //textCol = 143;
  1028. chatFirstFrame = 16;
  1029. chatLastFrame = 21;
  1030. voiceIndex = 41;
  1031. } else {
  1032. chatX = 62;
  1033. //textCol = 137;
  1034. chatFirstFrame = 9;
  1035. chatLastFrame = 13;
  1036. }
  1037. chatY = (_flags.lang == Common::FR_FRA || _flags.lang == Common::DE_DEU) ? 88 :100;
  1038. chatW = 80;
  1039. seq_playWsaSyncDialogue(30, voiceIndex, 137, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
  1040. if (_flags.isTalkie)
  1041. _seqWsaCurrentFrame = 8;
  1042. break;
  1043. case 9:
  1044. case 16:
  1045. if (_flags.isTalkie) {
  1046. if (frm == 16)
  1047. break;
  1048. chatX = 64;
  1049. //textCol = 137;
  1050. chatFirstFrame = 9;
  1051. chatLastFrame = 13;
  1052. voiceIndex = 42;
  1053. } else {
  1054. if (frm == 9)
  1055. break;
  1056. chatX = 80;
  1057. //textCol = 143;
  1058. chatFirstFrame = 16;
  1059. chatLastFrame = 21;
  1060. }
  1061. chatY = 100;
  1062. chatW = 100;
  1063. seq_playWsaSyncDialogue(31, voiceIndex, 143, chatX, chatY, chatW, wsaObj, chatFirstFrame, chatLastFrame, x, y);
  1064. if (_flags.isTalkie)
  1065. _seqWsaCurrentFrame = 21;
  1066. break;
  1067. default:
  1068. break;
  1069. }
  1070. _seqFrameCounter++;
  1071. return 0;
  1072. }
  1073. int KyraEngine_HoF::seq_finaleFirates(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1074. _seqSubFrameEndTimeInternal = 0;
  1075. int chatX = 0;
  1076. int chatY = 0;
  1077. int chatW = 0;
  1078. uint16 voiceIndex = 0;
  1079. switch (frm) {
  1080. case -2:
  1081. _screen->copyPage(12, 2);
  1082. _screen->copyPage(2, 0);
  1083. _screen->updateScreen();
  1084. seq_sequenceCommand(9);
  1085. _seqSubFrameEndTimeInternal = _system->getMillis() + 480 * _tickLength;
  1086. seq_printCreditsString(76, 240, 40, _seqTextColorMap, 252);
  1087. seq_printCreditsString(77, 240, 50, _seqTextColorMap, 252);
  1088. seq_printCreditsString(78, 240, 60, _seqTextColorMap, _seqTextColor[0]);
  1089. seq_printCreditsString(79, 240, 70, _seqTextColorMap, _seqTextColor[0]);
  1090. seq_printCreditsString(80, 240, 80, _seqTextColorMap, _seqTextColor[0]);
  1091. seq_printCreditsString(84, 240, 100, _seqTextColorMap, 252);
  1092. seq_printCreditsString(85, 240, 110, _seqTextColorMap, _seqTextColor[0]);
  1093. seq_printCreditsString(99, 240, 130, _seqTextColorMap, 252);
  1094. seq_printCreditsString(100, 240, 140, _seqTextColorMap, _seqTextColor[0]);
  1095. delay(_seqSubFrameEndTimeInternal - _system->getMillis());
  1096. _seqEndTime = 0;
  1097. break;
  1098. case 0:
  1099. _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff;
  1100. memset(_seqTextColorMap, _seqTextColor[1], 16);
  1101. _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
  1102. _screen->setTextColorMap(_seqTextColorMap);
  1103. break;
  1104. case 6:
  1105. seq_playTalkText(_flags.isTalkie ? 31 : 27);
  1106. break;
  1107. case 14:
  1108. case 15:
  1109. if (!((frm == 15 && !_flags.isTalkie) || (frm == 14 && _flags.isTalkie)))
  1110. break;
  1111. seq_playTalkText(_flags.isTalkie ? 31 : 27);
  1112. if (_flags.lang == Common::DE_DEU) {
  1113. chatX = 82;
  1114. chatY = 84;
  1115. chatW = 140;
  1116. } else {
  1117. chatX = 74;
  1118. chatY = (_flags.lang == Common::FR_FRA) ? 96: 108;
  1119. chatW = 80;
  1120. }
  1121. if (_flags.isTalkie)
  1122. voiceIndex = 43;
  1123. seq_playWsaSyncDialogue(32, voiceIndex, 137, chatX, chatY, chatW, wsaObj, 14, 16, x, y);
  1124. break;
  1125. case 28:
  1126. seq_playTalkText(_flags.isTalkie ? 32 : 28);
  1127. break;
  1128. case 29:
  1129. seq_playTalkText(_flags.isTalkie ? 33 : 29);
  1130. break;
  1131. case 31:
  1132. if (_flags.isTalkie)
  1133. voiceIndex = 44;
  1134. chatX = 90;
  1135. chatY = (_flags.lang == Common::DE_DEU) ? 60 : 76;
  1136. chatW = 80;
  1137. seq_playWsaSyncDialogue(33, voiceIndex, 143, chatX, chatY, chatW, wsaObj, 31, 34, x, y);
  1138. break;
  1139. case 35:
  1140. _seqFrameDelay = 300;
  1141. break;
  1142. default:
  1143. break;
  1144. }
  1145. _seqFrameCounter++;
  1146. return 0;
  1147. }
  1148. int KyraEngine_HoF::seq_finaleFrash(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1149. int tmp = 0;
  1150. switch (frm) {
  1151. case -2:
  1152. _screen->setCurPage(2);
  1153. _screen->clearCurPage();
  1154. _screen->copyPage(2, 12);
  1155. _screen->copyPage(2, 0);
  1156. _screen->updateScreen();
  1157. _seqFrameCounter = 0;
  1158. seq_loadNestedSequence(0, kSequenceFiggle);
  1159. break;
  1160. case -1:
  1161. if (_flags.isTalkie)
  1162. seq_finaleActorScreen();
  1163. _seqSpecialFlag = _flags.isTalkie;
  1164. break;
  1165. case 0:
  1166. if (_seqFrameCounter == 1) {
  1167. _sound->playTrack(4);
  1168. _seqTextColor[1] = _screen->findLeastDifferentColor(_seqTextColorPresets, _screen->getPalette(0), 1, 255) & 0xff;
  1169. memset(_seqTextColorMap, _seqTextColor[1], 16);
  1170. _seqTextColor[0] = _seqTextColorMap[1] = 0xff;
  1171. _screen->setTextColorMap(_seqTextColorMap);
  1172. }
  1173. _seqFrameDelay = 10;
  1174. break;
  1175. case 1:
  1176. if (_seqFrameCounter < 20 && _seqSpecialFlag) {
  1177. _seqWsaCurrentFrame = 0;
  1178. } else {
  1179. _seqFrameDelay = _flags.isTalkie ? 500 : (300 + _rnd.getRandomNumberRng(1, 300));
  1180. seq_playTalkText(_flags.isTalkie ? 26 : 22);
  1181. if (_seqSpecialFlag) {
  1182. _seqFrameCounter = 3;
  1183. _seqSpecialFlag = false;
  1184. }
  1185. }
  1186. break;
  1187. case 2:
  1188. _seqFrameDelay = 20;
  1189. break;
  1190. case 3:
  1191. seq_playTalkText(_flags.isTalkie ? 27 : 23);
  1192. _seqFrameDelay = _flags.isTalkie ? 500 : (300 + _rnd.getRandomNumberRng(1, 300));
  1193. break;
  1194. case 4:
  1195. _seqFrameDelay = 10;
  1196. break;
  1197. case 5:
  1198. seq_playTalkText(_flags.isTalkie ? 27 : 23);
  1199. tmp = _seqFrameCounter / 6;
  1200. if (tmp == 2)
  1201. _seqFrameDelay = _flags.isTalkie ? 7 : (1 + _rnd.getRandomNumberRng(1, 10));
  1202. else if (tmp < 2)
  1203. _seqFrameDelay = _flags.isTalkie ? 500 : (300 + _rnd.getRandomNumberRng(1, 300));
  1204. break;
  1205. case 6:
  1206. _seqFrameDelay = 10;
  1207. tmp = _seqFrameCounter / 6;
  1208. if (tmp == 2)
  1209. _seqWsaCurrentFrame = 4;
  1210. else if (tmp < 2)
  1211. _seqWsaCurrentFrame = 0;
  1212. break;
  1213. case 7:
  1214. _seqFrameCounter = 0;
  1215. _seqFrameDelay = 5;
  1216. seq_playTalkText(_flags.isTalkie ? 26 : 22);
  1217. break;
  1218. case 11:
  1219. if (_seqFrameCounter < 8)
  1220. _seqWsaCurrentFrame = 8;
  1221. break;
  1222. default:
  1223. break;
  1224. }
  1225. _seqFrameCounter++;
  1226. return 0;
  1227. }
  1228. void KyraEngine_HoF::seq_finaleActorScreen() {
  1229. static const uint8 colormap[] = {0, 0, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  1230. static const ScreenDim d = { 0x00, 0x0C, 0x28, 0xB4, 0xFF, 0x00, 0x00, 0x00 };
  1231. _screen->loadBitmap("finale.cps", 3, 3, &_screen->getPalette(0));
  1232. _screen->setFont(Screen::FID_GOLDFONT_FNT);
  1233. int talkieCreditsSize, talkieCreditsSpecialSize;
  1234. const uint8 *talkieCredits = _staticres->loadRawData(k2SeqplayCredits, talkieCreditsSize);
  1235. const char * const *talkieCreditsSpecial = _staticres->loadStrings(k2SeqplayCreditsSpecial, talkieCreditsSpecialSize);
  1236. _sound->setSoundList(&_soundData[kMusicIngame]);
  1237. _sound->loadSoundFile(3);
  1238. _sound->playTrack(3);
  1239. _screen->setTextColorMap(colormap);
  1240. _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
  1241. _screen->updateScreen();
  1242. _screen->fadeFromBlack();
  1243. _screen->_charWidth = -2;
  1244. uint8 *dataPtr = new uint8[0xafd];
  1245. memcpy(dataPtr, talkieCredits, talkieCreditsSize);
  1246. _staticres->unloadId(k2SeqplayCredits);
  1247. seq_displayScrollText(dataPtr, &d, 2, 6, 5, 1, Screen::FID_GOLDFONT_FNT, Screen::FID_GOLDFONT_FNT, 0, talkieCreditsSpecial);
  1248. delay(120);
  1249. delete[] dataPtr;
  1250. _staticres->unloadId(k2SeqplayCreditsSpecial);
  1251. _sound->setSoundList(&_soundData[kMusicFinale]);
  1252. _sound->loadSoundFile(0);
  1253. }
  1254. int KyraEngine_HoF::seq_finaleFiggle(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1255. if (_seqFrameCounter == 10)
  1256. _seqEndTime = 0;
  1257. if (_seqFrameCounter == 10 || _seqFrameCounter == 5 || _seqFrameCounter == 7)
  1258. seq_playTalkText(_flags.isTalkie ? 45 : 30);
  1259. _seqFrameCounter++;
  1260. return frm;
  1261. }
  1262. int KyraEngine_HoF::seq_demoVirgin(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1263. if (!frm)
  1264. delay(50 * _tickLength);
  1265. return 0;
  1266. }
  1267. int KyraEngine_HoF::seq_demoWestwood(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1268. if (!frm)
  1269. _sound->playTrack(2);
  1270. return 0;
  1271. }
  1272. int KyraEngine_HoF::seq_demoTitle(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1273. if (!frm) {
  1274. _sound->playTrack(3);
  1275. } else if (frm == 25) {
  1276. delay(60 * _tickLength);
  1277. _seqEndTime = 0;
  1278. seq_sequenceCommand(0);
  1279. }
  1280. return 0;
  1281. }
  1282. int KyraEngine_HoF::seq_demoHill(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1283. if (!frm) {
  1284. _sound->playTrack(4);
  1285. } else if (frm == 25) {
  1286. seq_loadNestedSequence(0, kSequenceDemoWater);
  1287. _seqFrameDelay--;
  1288. } else if (frm > 25 && frm < 50) {
  1289. if (_seqFrameDelay > 3)
  1290. _seqFrameDelay--;
  1291. } else if (frm == 95) {
  1292. _seqFrameDelay = 70;
  1293. } else if (frm == 96) {
  1294. _seqFrameDelay = 7;
  1295. } else if (frm == 129) {
  1296. seq_resetActiveWSA(0);
  1297. }
  1298. return 0;
  1299. }
  1300. int KyraEngine_HoF::seq_demoOuthome(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1301. switch (frm) {
  1302. case 12:
  1303. seq_playTalkText(4);
  1304. break;
  1305. case 32:
  1306. seq_playTalkText(7);
  1307. break;
  1308. case 36:
  1309. seq_playTalkText(10);
  1310. break;
  1311. case 57:
  1312. seq_playTalkText(9);
  1313. break;
  1314. case 80:
  1315. case 96:
  1316. case 149:
  1317. _seqFrameDelay = 70;
  1318. break;
  1319. case 81:
  1320. case 97:
  1321. _seqFrameDelay = 5;
  1322. break;
  1323. case 110:
  1324. seq_playTalkText(5);
  1325. break;
  1326. case 137:
  1327. seq_playTalkText(6);
  1328. break;
  1329. }
  1330. return 0;
  1331. }
  1332. int KyraEngine_HoF::seq_demoWharf(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1333. if (!_seqFrameCounter)
  1334. seq_loadNestedSequence(0, kSequenceDemoWharf2);
  1335. switch (frm) {
  1336. case 0:
  1337. seq_playTalkText(11);
  1338. break;
  1339. case 5:
  1340. if ((_seqFrameCounter / 8) <= 2 || _activeWSA[0].flags != -1)
  1341. _seqWsaCurrentFrame = 0;
  1342. else
  1343. seq_resetActiveWSA(0);
  1344. break;
  1345. case 6:
  1346. seq_resetActiveWSA(0);
  1347. break;
  1348. case 8:
  1349. case 10:
  1350. seq_playTalkText(2);
  1351. break;
  1352. case 13:
  1353. seq_playTalkText(7);
  1354. break;
  1355. case 16:
  1356. seq_playTalkText(12);
  1357. break;
  1358. default:
  1359. break;
  1360. }
  1361. _seqFrameCounter++;
  1362. return 0;
  1363. }
  1364. int KyraEngine_HoF::seq_demoDinob(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1365. if (frm == 0) {
  1366. if (!(_seqFrameCounter/8)) {
  1367. seq_loadNestedSequence(0, kSequenceDemoDinob2);
  1368. _seqWsaCurrentFrame = 0;
  1369. }
  1370. } else if (frm == 3) {
  1371. if (_activeWSA[0].flags != -1) {
  1372. _seqWsaCurrentFrame = 0;
  1373. } else {
  1374. seq_resetActiveWSA(0);
  1375. _screen->copyPage(2, 12);
  1376. }
  1377. } else if (frm == 4) {
  1378. seq_resetActiveWSA(0);
  1379. }
  1380. _seqFrameCounter++;
  1381. return 0;
  1382. }
  1383. int KyraEngine_HoF::seq_demoFisher(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1384. if (((_system->getMillis() - _seqStartTime) / (5 * _tickLength)) > 0) {
  1385. _seqStartTime = _system->getMillis();
  1386. if (!_seqFrameCounter) {
  1387. seq_loadNestedSequence(0, kSequenceDemoBail);
  1388. seq_loadNestedSequence(1, kSequenceDemoDig);
  1389. }
  1390. if (_seqScrollTextCounter >= 0x18f && !_seqFrameCounter)
  1391. return 0;
  1392. if (!_seqFrameCounter) {
  1393. _screen->loadBitmap("adtext.cps", 4, 4, 0);
  1394. _screen->loadBitmap("adtext2.cps", 6, 6, 0);
  1395. _screen->copyPageMemory(6, 0, 4, 64000, 1024);
  1396. _screen->copyPageMemory(6, 1023, 6, 0, 64000);
  1397. _seqScrollTextCounter = 0;
  1398. }
  1399. seq_scrollPage(24, 144);
  1400. _seqFrameCounter++;
  1401. if (_seqFrameCounter < 0x256 || _seqFrameCounter > 0x31c) {
  1402. if (_seqFrameCounter < 0x174 || _seqFrameCounter > 0x1d7) {
  1403. if (_seqFrameCounter < 0x84 || _seqFrameCounter > 0xe7) {
  1404. _seqScrollTextCounter++;
  1405. }
  1406. }
  1407. }
  1408. if (_seqFrameCounter > 0x31e) {
  1409. seq_resetActiveWSA(0);
  1410. seq_resetActiveWSA(1);
  1411. _seqEndTime = 0;
  1412. _screen->copyPage(2, 12);
  1413. }
  1414. } else {
  1415. seq_scrollPage(24, 144);
  1416. }
  1417. return 0;
  1418. }
  1419. int KyraEngine_HoF::seq_demoWharf2(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1420. if (frm == 69)
  1421. _seqWsaCurrentFrame = 8;
  1422. return frm;
  1423. }
  1424. int KyraEngine_HoF::seq_demoDinob2(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1425. switch (frm) {
  1426. case 19:
  1427. seq_playTalkText(13);
  1428. break;
  1429. case 54:
  1430. seq_playTalkText(15);
  1431. break;
  1432. case 61:
  1433. seq_playTalkText(16);
  1434. break;
  1435. case 69:
  1436. seq_playTalkText(14);
  1437. break;
  1438. case 77:
  1439. seq_playTalkText(13);
  1440. break;
  1441. case 79:
  1442. _seqWsaCurrentFrame = 4;
  1443. break;
  1444. }
  1445. return frm;
  1446. }
  1447. int KyraEngine_HoF::seq_demoWater(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1448. if (frm == 1)
  1449. seq_playTalkText(11);
  1450. return frm;
  1451. }
  1452. int KyraEngine_HoF::seq_demoBail(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1453. return frm;
  1454. }
  1455. int KyraEngine_HoF::seq_demoDig(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1456. return frm;
  1457. }
  1458. #ifdef ENABLE_LOL
  1459. int KyraEngine_HoF::seq_lolDemoScene1(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1460. Palette &tmpPal = _screen->getPalette(2);
  1461. if (!(_seqFrameCounter % 100)) {
  1462. if (_seqFrameCounter == 0) {
  1463. _sound->haltTrack();
  1464. _sound->playTrack(6);
  1465. }
  1466. tmpPal.copy(_screen->getPalette(0));
  1467. for (int i = 3; i < 0x300; i++) {
  1468. tmpPal[i] = ((int)tmpPal[i] * 120) / 64;
  1469. if (tmpPal[i] > 0x3f)
  1470. tmpPal[i] = 0x3f;
  1471. }
  1472. seq_playTalkText(_rnd.getRandomBit());
  1473. _screen->setScreenPalette(tmpPal);
  1474. _screen->updateScreen();
  1475. delay(8);
  1476. } else {
  1477. _screen->setScreenPalette(_screen->getPalette(0));
  1478. _screen->updateScreen();
  1479. if (_seqFrameCounter == 40)
  1480. seq_playTalkText(3);
  1481. }
  1482. _seqFrameCounter++;
  1483. return frm;
  1484. }
  1485. int KyraEngine_HoF::seq_lolDemoScene2(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1486. switch (_seqFrameCounter - 17) {
  1487. case 0:
  1488. _seqFrameDelay = 8;
  1489. break;
  1490. case 3:
  1491. case 6:
  1492. case 9:
  1493. seq_playTalkText(8);
  1494. break;
  1495. case 15:
  1496. seq_playTalkText(9);
  1497. break;
  1498. case 18:
  1499. seq_playTalkText(2);
  1500. break;
  1501. default:
  1502. break;
  1503. }
  1504. _seqFrameCounter++;
  1505. return frm;
  1506. }
  1507. int KyraEngine_HoF::seq_lolDemoScene3(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1508. if (_seqFrameCounter == 1)
  1509. seq_playTalkText(6);
  1510. else if (frm == 26)
  1511. seq_playTalkText(7);
  1512. _seqFrameCounter++;
  1513. return frm;
  1514. }
  1515. int KyraEngine_HoF::seq_lolDemoScene4(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1516. switch (_seqFrameCounter) {
  1517. case 11:
  1518. case 14:
  1519. case 17:
  1520. case 20:
  1521. seq_playTalkText(8);
  1522. break;
  1523. case 22:
  1524. seq_playTalkText(11);
  1525. break;
  1526. case 24:
  1527. seq_playTalkText(8);
  1528. break;
  1529. case 30:
  1530. seq_playTalkText(15);
  1531. break;
  1532. case 34:
  1533. seq_playTalkText(14);
  1534. break;
  1535. case 38:
  1536. seq_playTalkText(13);
  1537. break;
  1538. case 42:
  1539. seq_playTalkText(12);
  1540. break;
  1541. default:
  1542. break;
  1543. }
  1544. _seqFrameCounter++;
  1545. return frm;
  1546. }
  1547. int KyraEngine_HoF::seq_lolDemoScene5(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1548. switch (_seqFrameCounter++) {
  1549. case 0:
  1550. case 4:
  1551. case 6:
  1552. case 8:
  1553. case 10:
  1554. case 14:
  1555. case 16:
  1556. case 18:
  1557. case 20:
  1558. case 22:
  1559. case 24:
  1560. case 26:
  1561. case 28:
  1562. case 30:
  1563. seq_playTalkText(15);
  1564. break;
  1565. case 32:
  1566. seq_playTalkText(16);
  1567. break;
  1568. case 42:
  1569. seq_playTalkText(6);
  1570. break;
  1571. default:
  1572. break;
  1573. }
  1574. return frm;
  1575. }
  1576. int KyraEngine_HoF::seq_lolDemoText5(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1577. if (_seqFrameCounter++ == 100)
  1578. seq_playTalkText(5);
  1579. return frm;
  1580. }
  1581. int KyraEngine_HoF::seq_lolDemoScene6(WSAMovie_v2 *wsaObj, int x, int y, int frm) {
  1582. while (_seqScrollTextCounter < 0x122) {
  1583. _seqEndTime = _system->getMillis() + 6 * _tickLength;
  1584. if (!_seqFrameCounter) {
  1585. _screen->loadBitmap("adtext.cps", 4, 4, 0);
  1586. _screen->loadBitmap("adtext2.cps", 6, 6, 0);
  1587. _screen->copyPageMemory(6, 0, 4, 64000, 1024);
  1588. _screen->copyPageMemory(6, 1023, 6, 0, 64000);
  1589. _seqScrollTextCounter = 0;
  1590. }
  1591. if (_seqFrameCounter % 175) {
  1592. _screen->setScreenPalette(_screen->getPalette(0));
  1593. } else {
  1594. Palette &tmpPal = _screen->getPalette(2);
  1595. tmpPal.copy(_screen->getPalette(0));
  1596. for (int i = 3; i < 0x300; i++) {
  1597. tmpPal[i] = ((int)tmpPal[i] * 120) / 64;
  1598. if (tmpPal[i] > 0x3f)
  1599. tmpPal[i] = 0x3f;
  1600. }
  1601. seq_playTalkText(_rnd.getRandomBit());
  1602. _screen->setScreenPalette(tmpPal);
  1603. _screen->updateScreen();
  1604. delay(8);
  1605. }
  1606. if (_seqFrameCounter == 40 || _seqFrameCounter == 80 || _seqFrameCounter == 150 || _seqFrameCounter == 300)
  1607. seq_playTalkText(3);
  1608. _screen->copyPage(12, 2);
  1609. seq_scrollPage(70, 130);
  1610. _screen->copyPage(2, 0);
  1611. _screen->updateScreen();
  1612. _seqFrameCounter++;
  1613. if (_seqFrameCounter < 128 || _seqFrameCounter > 207)
  1614. _seqScrollTextCounter++;
  1615. delayUntil(_seqEndTime);
  1616. }
  1617. _screen->copyPage(2, 12);
  1618. return 0;
  1619. }
  1620. #endif // ENABLE_LOL
  1621. uint32 KyraEngine_HoF::seq_activeTextsTimeLeft() {
  1622. uint32 res = 0;
  1623. for (int i = 0; i < 10; i++) {
  1624. uint32 chatend = (_activeText[i].duration + _activeText[i].startTime);
  1625. uint32 curtime = _system->getMillis();
  1626. if (_activeText[i].duration != -1 && chatend > curtime) {
  1627. chatend -= curtime;
  1628. if (res < chatend)
  1629. res = chatend;
  1630. }
  1631. }
  1632. return res;
  1633. }
  1634. void KyraEngine_HoF::seq_processWSAs() {
  1635. for (int i = 0; i < 8; i++) {
  1636. if (_activeWSA[i].flags != -1) {
  1637. if (seq_processNextSubFrame(i))
  1638. seq_resetActiveWSA(i);
  1639. }
  1640. }
  1641. }
  1642. void KyraEngine_HoF::seq_processText() {
  1643. int curPage = _screen->setCurPage(2);
  1644. char outputStr[70];
  1645. for (int i = 0; i < 10; i++) {
  1646. if (_activeText[i].startTime + _activeText[i].duration > _system->getMillis() && _activeText[i].duration != -1) {
  1647. char *srcStr = seq_preprocessString(_sequenceStrings[_activeText[i].strIndex], _activeText[i].width);
  1648. int yPos = _activeText[i].y;
  1649. while (*srcStr) {
  1650. uint32 linePos = 0;
  1651. for (; *srcStr; linePos++) {
  1652. if (*srcStr == 0x0d) // Carriage return
  1653. break;
  1654. outputStr[linePos] = *srcStr;
  1655. srcStr++;
  1656. }
  1657. outputStr[linePos] = 0;
  1658. if (*srcStr == 0x0d)
  1659. srcStr++;
  1660. uint8 textColor = (_activeText[i].textcolor >= 0) ? _activeText[i].textcolor : _seqTextColor[0];
  1661. _screen->printText(outputStr, _activeText[i].x - (_screen->getTextWidth(outputStr) / 2), yPos, textColor, 0);
  1662. yPos += 10;
  1663. }
  1664. } else {
  1665. _activeText[i].duration = -1;
  1666. }
  1667. }
  1668. _screen->setCurPage(curPage);
  1669. }
  1670. char *KyraEngine_HoF::seq_preprocessString(const char *srcStr, int width) {
  1671. char *dstStr = _seqProcessedString;
  1672. int lineStart = 0;
  1673. int linePos = 0;
  1674. while (*srcStr) {
  1675. while (*srcStr && *srcStr != 0x20) // Space
  1676. dstStr[lineStart + linePos++] = *srcStr++;
  1677. dstStr[lineStart + linePos] = 0;
  1678. int len = _screen->getTextWidth(&dstStr[lineStart]);
  1679. if (width >= len && *srcStr) {
  1680. dstStr[lineStart + linePos++] = *srcStr++;
  1681. } else {
  1682. dstStr[lineStart + linePos] = 0x0d; // Carriage return
  1683. lineStart += linePos + 1;
  1684. linePos = 0;
  1685. if (*srcStr)
  1686. srcStr++;
  1687. }
  1688. }
  1689. dstStr[lineStart + linePos] = 0;
  1690. return strlen(_seqProcessedString) ? dstStr : 0;
  1691. }
  1692. void KyraEngine_HoF::seq_sequenceCommand(int command) {
  1693. for (int i = 0; i < 8; i++)
  1694. seq_resetActiveWSA(i);
  1695. switch (command) {
  1696. case 0:
  1697. _screen->fadeToBlack(36);
  1698. _screen->getPalette(0).clear();
  1699. _screen->getPalette(1).clear();
  1700. break;
  1701. case 1:
  1702. seq_playTalkText(_rnd.getRandomBit());
  1703. _screen->getPalette(0).fill(0, 256, 0x3F);
  1704. _screen->fadePalette(_screen->getPalette(0), 16);
  1705. _screen->copyPalette(1, 0);
  1706. break;
  1707. case 3:
  1708. _screen->copyPage(2, 0);
  1709. _screen->fadePalette(_screen->getPalette(0), 16);
  1710. _screen->copyPalette(1, 0);
  1711. break;
  1712. case 4:
  1713. _screen->copyPage(2, 0);
  1714. _screen->fadePalette(_screen->getPalette(0), 36);
  1715. _screen->copyPalette(1, 0);
  1716. break;
  1717. case 5:
  1718. _screen->copyPage(2, 0);
  1719. break;
  1720. case 6:
  1721. // UNUSED
  1722. // seq_loadBLD("library.bld");
  1723. break;
  1724. case 7:
  1725. // UNUSED
  1726. // seq_loadBLD("marco.bld");
  1727. break;
  1728. case 8:
  1729. _screen->fadeToBlack(16);
  1730. _screen->getPalette(0).clear();
  1731. _screen->getPalette(1).clear();
  1732. delay(120 * _tickLength);
  1733. break;
  1734. case 9: {
  1735. Palette &pal = _screen->getPalette(0);
  1736. for (int i = 0; i < 256; i++) {
  1737. int pv = (pal[3 * i] + pal[3 * i + 1] + pal[3 * i + 2]) / 3;
  1738. pal[3 * i] = pal[3 * i + 1] = pal[3 * i + 2] = pv & 0xff;
  1739. }
  1740. //int a = 0x100;
  1741. //int d = (0x800 << 5) - 0x100;
  1742. //pal[3 * i] = pal[3 * i + 1] = pal[3 * i + 2] = 0x3f;
  1743. _screen->fadePalette(pal, 64);
  1744. _screen->copyPalette(1, 0);
  1745. } break;
  1746. default:
  1747. break;
  1748. }
  1749. }
  1750. void KyraEngine_HoF::seq_cmpFadeFrame(const char *cmpFile) {
  1751. _screen->copyPage(10, 2);
  1752. _screen->copyPage(4, 10);
  1753. _screen->clearPage(6);
  1754. _screen->loadBitmap(cmpFile, 6, 6, 0);
  1755. _screen->copyPage(12, 4);
  1756. for (int i = 0; i < 3; i++) {
  1757. uint32 endtime = _system->getMillis() + 4 * _tickLength;
  1758. _screen->cmpFadeFrameStep(4, 320, 200, 0, 0, 2, 320, 200, 0, 0, 320, 200, 6);
  1759. _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
  1760. _screen->updateScreen();
  1761. delayUntil(endtime);
  1762. }
  1763. _screen->copyPage(4, 0);
  1764. _screen->updateScreen();
  1765. _screen->copyPage(4, 2);
  1766. _screen->copyPage(4, 6);
  1767. _screen->copyPage(10, 4);
  1768. }
  1769. void KyraEngine_HoF::seq_playTalkText(uint8 chatNum) {
  1770. assert(chatNum < _sequenceSoundListSize);
  1771. if (chatNum < 12 && !_flags.isDemo && textEnabled())
  1772. seq_setTextEntry(chatNum, 160, 168, _sequenceStringsDuration[chatNum], 160);
  1773. _sound->voicePlay(_sequenceSoundList[chatNum], &_speechHandle);
  1774. }
  1775. void KyraEngine_HoF::seq_waitForTextsTimeout() {
  1776. uint32 longest = seq_activeTextsTimeLeft() + _system->getMillis();
  1777. uint32 now = _system->getMillis();
  1778. if (textEnabled()) {
  1779. if (longest > now)
  1780. delay(longest - now);
  1781. } else if (speechEnabled()) {
  1782. while (snd_voiceIsPlaying())
  1783. delay(_tickLength);
  1784. }
  1785. seq_resetAllTextEntries();
  1786. }
  1787. void KyraEngine_HoF::seq_resetAllTextEntries() {
  1788. for (int i = 0; i < 10; i++)
  1789. _activeText[i].duration = -1;
  1790. }
  1791. int KyraEngine_HoF::seq_setTextEntry(uint16 strIndex, uint16 posX, uint16 posY, int duration, uint16 width) {
  1792. for (int i = 0; i < 10; i++) {
  1793. if (_activeText[i].duration != -1) {
  1794. if (i < 9)
  1795. continue;
  1796. else
  1797. return -1;
  1798. }
  1799. _activeText[i].strIndex = strIndex;
  1800. _activeText[i].x = posX;
  1801. _activeText[i].y = posY;
  1802. _activeText[i].duration = duration * _tickLength;
  1803. _activeText[i].width = width;
  1804. _activeText[i].startTime = _system->getMillis();
  1805. _activeText[i].textcolor = -1;
  1806. return i;
  1807. }
  1808. return -1;
  1809. }
  1810. void KyraEngine_HoF::seq_loadNestedSequence(int wsaNum, int seqNum) {
  1811. if (_activeWSA[wsaNum].flags != -1)
  1812. return;
  1813. NestedSequence s = _sequences->seqn[seqNum];
  1814. if (!_activeWSA[wsaNum].movie) {
  1815. _activeWSA[wsaNum].movie = new WSAMovie_v2(this);
  1816. assert(_activeWSA[wsaNum].movie);
  1817. }
  1818. _activeWSA[wsaNum].movie->close();
  1819. _activeWSA[wsaNum].movie->open(s.wsaFile, 0, 0);
  1820. if (!_activeWSA[wsaNum].movie->opened()) {
  1821. delete _activeWSA[wsaNum].movie;
  1822. _activeWSA[wsaNum].movie = 0;
  1823. return;
  1824. }
  1825. _activeWSA[wsaNum].endFrame = s.endFrame;
  1826. _activeWSA[wsaNum].startFrame = _activeWSA[wsaNum].currentFrame = s.startframe;
  1827. _activeWSA[wsaNum].frameDelay = s.frameDelay;
  1828. _activeWSA[wsaNum].callback = _callbackN[seqNum];
  1829. _activeWSA[wsaNum].control = s.wsaControl;
  1830. _activeWSA[wsaNum].flags = s.flags | 1;
  1831. _activeWSA[wsaNum].x = s.x;
  1832. _activeWSA[wsaNum].y = s.y;
  1833. _activeWSA[wsaNum].startupCommand = s.startupCommand;
  1834. _activeWSA[wsaNum].finalCommand = s.finalCommand;
  1835. _activeWSA[wsaNum].lastFrame = 0xffff;
  1836. seq_nestedSequenceFrame(s.startupCommand, wsaNum);
  1837. if (!s.startupCommand)
  1838. seq_processNextSubFrame(wsaNum);
  1839. _activeWSA[wsaNum].nextFrame = _system->getMillis();
  1840. }
  1841. void KyraEngine_HoF::seq_nestedSequenceFrame(int command, int wsaNum) {
  1842. int xa = 0, ya = 0;
  1843. command--;
  1844. if (!_activeWSA[wsaNum].movie || skipFlag() || shouldQuit() || _abortIntroFlag)
  1845. return;
  1846. switch (command) {
  1847. case 0:
  1848. xa = -_activeWSA[wsaNum].movie->xAdd();
  1849. ya = -_activeWSA[wsaNum].movie->yAdd();
  1850. _activeWSA[wsaNum].movie->displayFrame(0, 8, xa, ya, 0, 0, 0);
  1851. seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(),
  1852. _activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 1, 2);
  1853. break;
  1854. case 1:
  1855. xa = -_activeWSA[wsaNum].movie->xAdd();
  1856. ya = -_activeWSA[wsaNum].movie->yAdd();
  1857. _activeWSA[wsaNum].movie->displayFrame(0, 8, xa, ya, 0, 0, 0);
  1858. seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(),
  1859. _activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 1, 1);
  1860. break;
  1861. case 2:
  1862. seq_waitForTextsTimeout();
  1863. xa = -_activeWSA[wsaNum].movie->xAdd();
  1864. ya = -_activeWSA[wsaNum].movie->yAdd();
  1865. _activeWSA[wsaNum].movie->displayFrame(0x15, 8, xa, ya, 0, 0, 0);
  1866. seq_animatedSubFrame(8, 2, 7, 8, _activeWSA[wsaNum].movie->xAdd(), _activeWSA[wsaNum].movie->yAdd(),
  1867. _activeWSA[wsaNum].movie->width(), _activeWSA[wsaNum].movie->height(), 0, 2);
  1868. break;
  1869. case 3:
  1870. _screen->copyPage(2, 10);
  1871. _activeWSA[wsaNum].movie->displayFrame(0, 2, 0, 0, 0, 0, 0);
  1872. _screen->copyPage(2, 12);
  1873. seq_cmpFadeFrame("scene2.cmp");
  1874. break;
  1875. case 4:
  1876. _screen->copyPage(2, 10);
  1877. _activeWSA[wsaNum].movie->displayFrame(0, 2, 0, 0, 0, 0, 0);
  1878. _screen->copyPage(2, 12);
  1879. seq_cmpFadeFrame("scene3.cmp");
  1880. break;
  1881. default:
  1882. break;
  1883. }
  1884. }
  1885. void KyraEngine_HoF::seq_animatedSubFrame(int srcPage, int dstPage, int delaytime, int steps,
  1886. int x, int y, int w, int h, int openClose, int directionFlags) {
  1887. if (openClose) {
  1888. for (int i = 1; i < steps; i++) {
  1889. uint32 endtime = _system->getMillis() + delaytime * _tickLength;
  1890. int w2 = (((w * 256) / steps) * i) / 256;
  1891. int h2 = (((h * 256) / steps) * i) / 256;
  1892. int ym = (directionFlags & 2) ? (h - h2) : 0;
  1893. int xm = (directionFlags & 1) ? (w - w2) : 0;
  1894. _screen->wsaFrameAnimationStep(0, 0, x + xm, y + ym, w, h, w2, h2, srcPage, dstPage, 0);
  1895. _screen->copyPage(dstPage, 6);
  1896. _screen->copyPage(dstPage, 0);
  1897. _screen->updateScreen();
  1898. _screen->copyPage(12, dstPage);
  1899. delayUntil(endtime);
  1900. }
  1901. _screen->wsaFrameAnimationStep(0, 0, x, y, w, h, w, h, srcPage, dstPage, 0);
  1902. _screen->copyPage(dstPage, 6);
  1903. _screen->copyPage(dstPage, 0);
  1904. _screen->updateScreen();
  1905. } else {
  1906. _screen->copyPage(12, dstPage);
  1907. for (int i = steps; i; i--) {
  1908. uint32 endtime = _system->getMillis() + delaytime * _tickLength;
  1909. int w2 = (((w * 256) / steps) * i) / 256;
  1910. int h2 = (((h * 256) / steps) * i) / 256;
  1911. int ym = (directionFlags & 2) ? (h - h2) : 0;
  1912. int xm = (directionFlags & 1) ? (w - w2) : 0;
  1913. _screen->wsaFrameAnimationStep(0, 0, x + xm, y + ym, w, h, w2, h2, srcPage, dstPage, 0);
  1914. _screen->copyPage(dstPage, 6);
  1915. _screen->copyPage(dstPage, 0);
  1916. _screen->updateScreen();
  1917. _screen->copyPage(12, dstPage);
  1918. delayUntil(endtime);
  1919. }
  1920. }
  1921. }
  1922. void KyraEngine_HoF::seq_resetActiveWSA(int wsaNum) {
  1923. if (_activeWSA[wsaNum].flags == -1)
  1924. return;
  1925. _activeWSA[wsaNum].flags = -1;
  1926. seq_nestedSequenceFrame(_activeWSA[wsaNum].finalCommand, wsaNum);
  1927. _activeWSA[wsaNum].movie->close();
  1928. }
  1929. void KyraEngine_HoF::seq_unloadWSA(int wsaNum) {
  1930. if (_activeWSA[wsaNum].movie) {
  1931. _activeWSA[wsaNum].movie->close();
  1932. delete _activeWSA[wsaNum].movie;
  1933. _activeWSA[wsaNum].movie = 0;
  1934. }
  1935. }
  1936. bool KyraEngine_HoF::seq_processNextSubFrame(int wsaNum) {
  1937. uint32 currentFrame = _activeWSA[wsaNum].currentFrame;
  1938. uint32 currentTime = _system->getMillis();
  1939. if (_activeWSA[wsaNum].callback && currentFrame != _activeWSA[wsaNum].lastFrame) {
  1940. _activeWSA[wsaNum].lastFrame = currentFrame;
  1941. currentFrame = (this->*_activeWSA[wsaNum].callback)(_activeWSA[wsaNum].movie, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, currentFrame);
  1942. }
  1943. if (_activeWSA[wsaNum].movie) {
  1944. if (_activeWSA[wsaNum].flags & 0x20) {
  1945. _activeWSA[wsaNum].movie->displayFrame(_activeWSA[wsaNum].control[currentFrame].index, 2, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, 0x4000, 0, 0);
  1946. _activeWSA[wsaNum].frameDelay = _activeWSA[wsaNum].control[currentFrame].delay;
  1947. } else {
  1948. _activeWSA[wsaNum].movie->displayFrame(currentFrame % _activeWSA[wsaNum].movie->frames(), 2, _activeWSA[wsaNum].x, _activeWSA[wsaNum].y, 0x4000, 0, 0);
  1949. }
  1950. }
  1951. if (_activeWSA[wsaNum].flags & 0x10) {
  1952. currentFrame = (currentTime - _activeWSA[wsaNum].nextFrame) / (_activeWSA[wsaNum].frameDelay * _tickLength);
  1953. } else {
  1954. if (((int32)(currentTime - _activeWSA[wsaNum].nextFrame) / (int32)(_activeWSA[wsaNum].frameDelay * _tickLength)) > 0) {
  1955. currentFrame++;
  1956. _activeWSA[wsaNum].nextFrame = currentTime;
  1957. }
  1958. }
  1959. bool res = false;
  1960. if (currentFrame >= _activeWSA[wsaNum].endFrame) {
  1961. int sw = ((_activeWSA[wsaNum].flags & 0x1e) - 2);
  1962. switch (sw) {
  1963. case 0:
  1964. res = true;
  1965. currentFrame = _activeWSA[wsaNum].endFrame;
  1966. _screen->copyPage(2, 12);
  1967. break;
  1968. case 6:
  1969. case 8:
  1970. currentFrame = _activeWSA[wsaNum].endFrame - 1;
  1971. break;
  1972. case 2:
  1973. case 10:
  1974. currentFrame = _activeWSA[wsaNum].startFrame;
  1975. break;
  1976. default:
  1977. currentFrame = _activeWSA[wsaNum].endFrame - 1;
  1978. res = true;
  1979. }
  1980. }
  1981. _activeWSA[wsaNum].currentFrame = currentFrame & 0xffff;
  1982. return res;
  1983. }
  1984. void KyraEngine_HoF::seq_printCreditsString(uint16 strIndex, int x, int y, const uint8 *colorMap, uint8 textcolor) {
  1985. uint8 colormap[16];
  1986. if (skipFlag() || shouldQuit() || _abortIntroFlag || _menuChoice)
  1987. return;
  1988. Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
  1989. memset(&_screen->getPalette(0)[0x2fa], 0x3f, 6);
  1990. _screen->getPalette(0)[0x2f6] = 0x3f;
  1991. _screen->getPalette(0)[0x2f5] = 0x20;
  1992. _screen->getPalette(0)[0x2f4] = 0x30;
  1993. colormap[0] = colorMap[0];
  1994. colormap[1] = 0xfd;
  1995. memcpy(&colormap[2], &colorMap[2], 14);
  1996. uint8 seqTextColor0 = _seqTextColor[0];
  1997. _seqTextColor[0] = 0xfd;
  1998. _screen->setTextColorMap(colormap);
  1999. seq_resetAllTextEntries();
  2000. seq_setTextEntry(strIndex, x, y, 0x80, 0x78);
  2001. seq_processText();
  2002. _screen->copyPage(2, 0);
  2003. _screen->updateScreen();
  2004. _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[textcolor * 3];
  2005. _screen->getPalette(0)[0x2f8] = _screen->getPalette(0)[textcolor * 3 + 1];
  2006. _screen->getPalette(0)[0x2f9] = _screen->getPalette(0)[textcolor * 3 + 2];
  2007. _screen->fadePalette(_screen->getPalette(0), 0x18);
  2008. _seqTextColor[0] = textcolor;
  2009. _screen->setTextColorMap(colorMap);
  2010. seq_resetAllTextEntries();
  2011. seq_setTextEntry(strIndex, x, y, 0x80, 0x78);
  2012. seq_processText();
  2013. _screen->copyPage(2, 0);
  2014. _screen->updateScreen();
  2015. _screen->getPalette(0)[0x2f7] = _screen->getPalette(0)[0x2f8] = _screen->getPalette(0)[0x2f9] = 0;
  2016. _screen->fadePalette(_screen->getPalette(0), 1);
  2017. _screen->copyPage(2, 12);
  2018. seq_resetAllTextEntries();
  2019. _seqTextColor[0] = seqTextColor0;
  2020. _screen->setFont(of);
  2021. }
  2022. void KyraEngine_HoF::seq_playWsaSyncDialogue(uint16 strIndex, uint16 vocIndex, int textColor, int x, int y, int width, WSAMovie_v2 *wsa, int firstframe, int lastframe, int wsaXpos, int wsaYpos) {
  2023. int dur = int(strlen(_sequenceStrings[strIndex])) * (_flags.isTalkie ? 7 : 15);
  2024. if (textEnabled()) {
  2025. int entry = seq_setTextEntry(strIndex, x, y, dur, width);
  2026. _activeText[entry].textcolor = textColor;
  2027. }
  2028. _seqWsaChatTimeout = _system->getMillis() + dur * _tickLength;
  2029. int curframe = firstframe;
  2030. if (vocIndex && speechEnabled()) {
  2031. while (_sound->voiceIsPlaying() && !skipFlag())
  2032. delay(4);
  2033. seq_playTalkText(vocIndex);
  2034. }
  2035. while (_system->getMillis() < _seqWsaChatTimeout && !(_abortIntroFlag || skipFlag())) {
  2036. if (lastframe < 0) {
  2037. int t = ABS(lastframe);
  2038. if (t < curframe)
  2039. curframe = t;
  2040. }
  2041. if (ABS(lastframe) < curframe)
  2042. curframe = firstframe;
  2043. _seqWsaChatFrameTimeout = _seqEndTime = _system->getMillis() + _seqFrameDelay * _tickLength;
  2044. if (wsa)
  2045. wsa->displayFrame(curframe % wsa->frames(), 2, wsaXpos, wsaYpos, 0, 0, 0);
  2046. _screen->copyPage(2, 12);
  2047. seq_processText();
  2048. uint32 tm = _system->getMillis();
  2049. if (_seqWsaChatFrameTimeout > tm && _seqWsaChatTimeout > tm)
  2050. delay(MIN(_seqWsaChatFrameTimeout - tm, _seqWsaChatTimeout - tm));
  2051. if (speechEnabled() && !textEnabled() && !snd_voiceIsPlaying())
  2052. break;
  2053. _screen->copyPage(2, 0);
  2054. _screen->updateScreen();
  2055. curframe++;
  2056. }
  2057. if (_abortIntroFlag || skipFlag())
  2058. _sound->voiceStop();
  2059. if (ABS(lastframe) < curframe)
  2060. curframe = ABS(lastframe);
  2061. if (curframe == firstframe)
  2062. curframe++;
  2063. _seqWsaCurrentFrame = curframe;
  2064. }
  2065. void KyraEngine_HoF::seq_displayScrollText(uint8 *data, const ScreenDim *d, int tempPage1, int tempPage2, int speed,
  2066. int step, Screen::FontId fid1, Screen::FontId fid2, const uint8 *shapeData, const char *const *specialData) {
  2067. if (!data)
  2068. return;
  2069. static const char mark[] = { 5, 13, 0 };
  2070. _screen->clearPage(tempPage1);
  2071. _screen->clearPage(tempPage2);
  2072. _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, 0, tempPage1);
  2073. struct ScrollTextData {
  2074. int16 x;
  2075. int16 y;
  2076. uint8 *text;
  2077. byte unk1;
  2078. byte height;
  2079. byte adjust;
  2080. ScrollTextData() {
  2081. x = 0; // 0 11
  2082. y = 0; // 2 13
  2083. text = 0; // 4 15
  2084. unk1 = 0; // 8 19
  2085. height = 0; // 9 20
  2086. adjust = 0; // 10 21
  2087. }
  2088. };
  2089. ScrollTextData *textData = new ScrollTextData[36];
  2090. uint8 *ptr = data;
  2091. bool loop = true;
  2092. int cnt = 0;
  2093. while (loop) {
  2094. _seqSubFrameEndTimeInternal = _system->getMillis() + speed * _tickLength;
  2095. while (cnt < 35 && *ptr) {
  2096. uint16 cH;
  2097. if (cnt)
  2098. cH = textData[cnt].y + textData[cnt].height + (textData[cnt].height >> 3);
  2099. else
  2100. cH = d->h;
  2101. char *str = (char *)ptr;
  2102. ptr = (uint8 *)strpbrk(str, mark);
  2103. if (!ptr)
  2104. ptr = (uint8 *)strchr(str, 0);
  2105. textData[cnt + 1].unk1 = *ptr;
  2106. *ptr = 0;
  2107. if (textData[cnt + 1].unk1)
  2108. ptr++;
  2109. if (*str == 3 || *str == 4)
  2110. textData[cnt + 1].adjust = *str++;
  2111. else
  2112. textData[cnt + 1].adjust = 0;
  2113. _screen->setFont(fid1);
  2114. if (*str == 1) {
  2115. _screen->setFont(fid2);
  2116. str++;
  2117. } else if (*str == 2) {
  2118. str++;
  2119. }
  2120. textData[cnt + 1].height = _screen->getFontHeight();
  2121. switch (textData[cnt + 1].adjust) {
  2122. case 3:
  2123. textData[cnt + 1].x = 157 - _screen->getTextWidth(str);
  2124. break;
  2125. case 4:
  2126. textData[cnt + 1].x = 161;
  2127. break;
  2128. default:
  2129. textData[cnt + 1].x = (((d->w << 3) - _screen->getTextWidth(str)) >> 1) + 1;
  2130. }
  2131. if (textData[cnt].unk1 == 5)
  2132. cH -= (textData[cnt].height + (textData[cnt].height >> 3));
  2133. textData[cnt + 1].y = cH;
  2134. textData[cnt + 1].text = (uint8 *)str;
  2135. cnt++;
  2136. }
  2137. _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage1, tempPage2);
  2138. int cnt2 = 0;
  2139. bool palCycle = 0;
  2140. while (cnt2 < cnt) {
  2141. const char *str = (const char *)textData[cnt2 + 1].text;
  2142. const char *str2 = str;
  2143. int16 cW = textData[cnt2 + 1].x - 10;
  2144. int16 cH = textData[cnt2 + 1].y;
  2145. int x = (d->sx << 3) + cW;
  2146. int y = d->sy + cH;
  2147. int col1 = 255;
  2148. if (cH < d->h) {
  2149. _screen->setCurPage(tempPage2);
  2150. _screen->setFont(fid1);
  2151. if (textData[cnt2 + 1].height != _screen->getFontHeight())
  2152. _screen->setFont(fid2);
  2153. if (specialData) {
  2154. if (!strcmp(str, specialData[0])) {
  2155. col1 = 112;
  2156. char cChar[2] = " ";
  2157. while (*str2) {
  2158. cChar[0] = *str2;
  2159. _screen->printText(cChar, x, y, col1++, 0);
  2160. x += _screen->getCharWidth((uint8)*str2++);
  2161. }
  2162. palCycle = true;
  2163. } else if (!strcmp(str, specialData[1])) {
  2164. col1 = 133;
  2165. char cChar[2] = " ";
  2166. while (*str2) {
  2167. cChar[0] = *str2;
  2168. _screen->printText(cChar, x, y, col1--, 0);
  2169. x += _screen->getCharWidth((uint8)*str2++);
  2170. }
  2171. palCycle = true;
  2172. } else {
  2173. _screen->printText(str, x, y, col1, 0);
  2174. }
  2175. } else {
  2176. _screen->printText(str, x, y, col1, 0);
  2177. }
  2178. _screen->setCurPage(0);
  2179. }
  2180. textData[cnt2 + 1].y -= step;
  2181. cnt2++;
  2182. }
  2183. _screen->copyRegion(d->sx << 3, d->sy, d->sx << 3, d->sy, d->w << 3, d->h, tempPage2, 0);
  2184. _screen->updateScreen();
  2185. if (textData[1].y < -10) {
  2186. textData[1].text += strlen((char *)textData[1].text);
  2187. textData[1].text[0] = textData[1].unk1;
  2188. cnt--;
  2189. memcpy(&textData[1], &textData[2], cnt * sizeof(ScrollTextData));
  2190. }
  2191. if (palCycle) {
  2192. for (int col = 133; col > 112; col--)
  2193. _screen->getPalette(0).copy(_screen->getPalette(0), col - 1, 1, col);
  2194. _screen->getPalette(0).copy(_screen->getPalette(0), 133, 1, 112);
  2195. _screen->setScreenPalette(_screen->getPalette(0));
  2196. }
  2197. delayUntil(_seqSubFrameEndTimeInternal);
  2198. if ((cnt < 36) && ((d->sy + d->h) > (textData[cnt].y + textData[cnt].height)) && !skipFlag()) {
  2199. resetSkipFlag();
  2200. delay(_tickLength * 500);
  2201. cnt = 0;
  2202. }
  2203. if (!cnt || skipFlag())
  2204. loop = false;
  2205. }
  2206. _sound->beginFadeOut();
  2207. _screen->fadeToBlack();
  2208. _abortIntroFlag= false;
  2209. resetSkipFlag();
  2210. delete[] textData;
  2211. }
  2212. void KyraEngine_HoF::seq_scrollPage(int bottom, int top) {
  2213. int dstY, dstH, srcH;
  2214. static const ScreenDim d = { 0x00, 0x00, 0x28, 0x320, 0xFF, 0xFE, 0x00, 0x00 };
  2215. if (_seqScrollTextCounter - (top - 1) < 0) {
  2216. dstY = top - _seqScrollTextCounter;
  2217. dstH = _seqScrollTextCounter;
  2218. srcH = 0;
  2219. } else {
  2220. dstY = 0;
  2221. srcH = _seqScrollTextCounter - top;
  2222. dstH = (400 - srcH <= top) ? 400 - srcH : top;
  2223. }
  2224. if (dstH > 0) {
  2225. if (_demoAnimData) {
  2226. for (int i = 0; i < 4; i++) {
  2227. const ItemAnimData_v1 *def = &_demoAnimData[i];
  2228. ActiveItemAnim *a = &_activeItemAnim[i];
  2229. _screen->fillRect(12, def->y - 8, 28, def->y + 8, 0, 4);
  2230. _screen->drawShape(4, getShapePtr(def->itemIndex + def->frames[a->currentFrame]), 12, def->y - 8, 0, 0);
  2231. if (_seqFrameCounter % 2 == 0)
  2232. a->currentFrame = (a->currentFrame + 1) % 20;
  2233. }
  2234. }
  2235. _screen->copyRegionEx(4, 0, srcH, 2, 2, dstY + bottom, 320, dstH, &d);
  2236. }
  2237. }
  2238. void KyraEngine_HoF::seq_showStarcraftLogo() {
  2239. WSAMovie_v2 *ci = new WSAMovie_v2(this);
  2240. assert(ci);
  2241. _screen->clearPage(2);
  2242. _res->loadPakFile("INTROGEN.PAK");
  2243. int endframe = ci->open("ci.wsa", 0, &_screen->getPalette(0));
  2244. _res->unloadPakFile("INTROGEN.PAK");
  2245. if (!ci->opened()) {
  2246. delete ci;
  2247. return;
  2248. }
  2249. _screen->hideMouse();
  2250. ci->displayFrame(0, 2, 0, 0, 0, 0, 0);
  2251. _screen->copyPage(2, 0);
  2252. _screen->fadeFromBlack();
  2253. for (int i = 1; i < endframe; i++) {
  2254. _seqEndTime = _system->getMillis() + 50;
  2255. if (skipFlag())
  2256. break;
  2257. ci->displayFrame(i, 2, 0, 0, 0, 0, 0);
  2258. _screen->copyPage(2, 0);
  2259. _screen->updateScreen();
  2260. delay(_seqEndTime - _system->getMillis());
  2261. }
  2262. if (!skipFlag()) {
  2263. _seqEndTime = _system->getMillis() + 50;
  2264. ci->displayFrame(0, 2, 0, 0, 0, 0, 0);
  2265. _screen->copyPage(2, 0);
  2266. _screen->updateScreen();
  2267. delay(_seqEndTime - _system->getMillis());
  2268. }
  2269. _screen->fadeToBlack();
  2270. _screen->showMouse();
  2271. _eventList.clear();
  2272. delete ci;
  2273. }
  2274. void KyraEngine_HoF::seq_init() {
  2275. _seqProcessedString = new char[200];
  2276. _seqWsa = new WSAMovie_v2(this);
  2277. _activeWSA = new ActiveWSA[8];
  2278. _activeText = new ActiveText[10];
  2279. _res->unloadAllPakFiles();
  2280. _res->loadPakFile(StaticResource::staticDataFilename());
  2281. _res->loadFileList(_sequencePakList, _sequencePakListSize);
  2282. if (_flags.platform == Common::kPlatformPC98)
  2283. _sound->loadSoundFile("SOUND.DAT");
  2284. _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_GOLDFONT_FNT);
  2285. if (_flags.gameID == GI_LOL)
  2286. return;
  2287. if (_flags.isDemo && !_flags.isTalkie) {
  2288. _demoAnimData = _staticres->loadShapeAnimData_v1(k2SeqplayShapeAnimData, _itemAnimDataSize);
  2289. uint8 *shp = _res->fileData("icons.shp", 0);
  2290. uint32 outsize = READ_LE_UINT16(shp + 4);
  2291. _animShapeFiledata = new uint8[outsize];
  2292. Screen::decodeFrame4(shp + 10, _animShapeFiledata, outsize);
  2293. delete[] shp;
  2294. for (int numShp = 0; getShapePtr(numShp); ++numShp)
  2295. addShapeToPool(_screen->getPtrToShape(_animShapeFiledata, numShp), numShp);
  2296. } else {
  2297. const MainMenu::StaticData data = {
  2298. { _sequenceStrings[97], _sequenceStrings[96], _sequenceStrings[95], _sequenceStrings[98], 0 },
  2299. { 0x01, 0x04, 0x0C, 0x04, 0x00, 0xd7, 0xd6 },
  2300. { 0xd8, 0xda, 0xd9, 0xd8 },
  2301. (_flags.lang == Common::JA_JPN) ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT, 240
  2302. };
  2303. _menu = new MainMenu(this);
  2304. _menu->init(data, MainMenu::Animation());
  2305. }
  2306. }
  2307. void KyraEngine_HoF::seq_uninit() {
  2308. delete[] _seqProcessedString;
  2309. _seqProcessedString = NULL;
  2310. delete[] _activeWSA;
  2311. _activeWSA = NULL;
  2312. delete[] _activeText;
  2313. _activeText = NULL;
  2314. delete _seqWsa;
  2315. _seqWsa = NULL;
  2316. delete[] _animShapeFiledata;
  2317. _animShapeFiledata = 0;
  2318. delete _menu;
  2319. _menu = 0;
  2320. _screen->setFont(_flags.lang == Common::JA_JPN ? Screen::FID_SJIS_FNT : Screen::FID_8_FNT);
  2321. }
  2322. #pragma mark -
  2323. #pragma mark - Ingame sequences
  2324. #pragma mark -
  2325. void KyraEngine_HoF::seq_makeBookOrCauldronAppear(int type) {
  2326. _screen->hideMouse();
  2327. showMessage(0, 0xCF);
  2328. if (type == 1)
  2329. seq_makeBookAppear();
  2330. else if (type == 2)
  2331. loadInvWsa("CAULDRON.WSA", 1, 6, 0, -2, -2, 1);
  2332. _screen->copyRegionToBuffer(2, 0, 0, 320, 200, _screenBuffer);
  2333. _screen->loadBitmap("_PLAYALL.CPS", 3, 3, 0);
  2334. static const uint8 bookCauldronRects[] = {
  2335. 0x46, 0x90, 0x7F, 0x2B, // unknown rect (maybe unused?)
  2336. 0xCE, 0x90, 0x2C, 0x2C, // book rect
  2337. 0xFA, 0x90, 0x46, 0x2C // cauldron rect
  2338. };
  2339. int x = bookCauldronRects[type*4+0];
  2340. int y = bookCauldronRects[type*4+1];
  2341. int w = bookCauldronRects[type*4+2];
  2342. int h = bookCauldronRects[type*4+3];
  2343. _screen->copyRegion(x, y, x, y, w, h, 2, 0, Screen::CR_NO_P_CHECK);
  2344. _screen->copyBlockToPage(2, 0, 0, 320, 200, _screenBuffer);
  2345. if (type == 2) {
  2346. int32 countdown = _rnd.getRandomNumberRng(45, 80);
  2347. _timer->setCountdown(2, countdown * 60);
  2348. }
  2349. _screen->showMouse();
  2350. }
  2351. void KyraEngine_HoF::seq_makeBookAppear() {
  2352. _screen->hideMouse();
  2353. displayInvWsaLastFrame();
  2354. showMessage(0, 0xCF);
  2355. loadInvWsa("BOOK2.WSA", 0, 4, 2, -1, -1, 0);
  2356. uint8 *rect = new uint8[_screen->getRectSize(_invWsa.w, _invWsa.h)];
  2357. assert(rect);
  2358. _screen->copyRegionToBuffer(_invWsa.page, _invWsa.x, _invWsa.y, _invWsa.w, _invWsa.h, rect);
  2359. _invWsa.running = false;
  2360. snd_playSoundEffect(0xAF);
  2361. while (true) {
  2362. _invWsa.timer = _system->getMillis() + _invWsa.delay * _tickLength;
  2363. _screen->copyBlockToPage(_invWsa.page, _invWsa.x, _invWsa.y, _invWsa.w, _invWsa.h, rect);
  2364. _invWsa.wsa->displayFrame(_invWsa.curFrame, _invWsa.page, 0, 0, 0x4000, 0, 0);
  2365. if (_invWsa.page)
  2366. _screen->copyRegion(_invWsa.x, _invWsa.y, _invWsa.x, _invWsa.y, _invWsa.w, _invWsa.h, _invWsa.page, 0, Screen::CR_NO_P_CHECK);
  2367. ++_invWsa.curFrame;
  2368. if (_invWsa.curFrame >= _invWsa.lastFrame && !shouldQuit())
  2369. break;
  2370. switch (_invWsa.curFrame) {
  2371. case 39:
  2372. snd_playSoundEffect(0xCA);
  2373. break;
  2374. case 50:
  2375. snd_playSoundEffect(0x6A);
  2376. break;
  2377. case 72:
  2378. snd_playSoundEffect(0xCB);
  2379. break;
  2380. case 85:
  2381. snd_playSoundEffect(0x38);
  2382. break;
  2383. default:
  2384. break;
  2385. }
  2386. do {
  2387. update();
  2388. } while (_invWsa.timer > _system->getMillis() && !skipFlag());
  2389. }
  2390. closeInvWsa();
  2391. delete[] rect;
  2392. _invWsa.running = false;
  2393. _screen->showMouse();
  2394. }
  2395. } // End of namespace Kyra