PageRenderTime 86ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/engines/kyra/script_hof.cpp

http://github.com/scummvm/scummvm
C++ | 1727 lines | 1365 code | 259 blank | 103 comment | 238 complexity | 832304b0a2dce80f014ad0a41c397a7f MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1, GPL-2.0

Large files files are truncated, but you can click here to view the full file

  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. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  20. *
  21. */
  22. #include "kyra/kyra_hof.h"
  23. #include "kyra/timer.h"
  24. #include "kyra/resource.h"
  25. #include "kyra/sound.h"
  26. #include "common/system.h"
  27. namespace Kyra {
  28. int KyraEngine_HoF::o2_setCharacterFacingRefresh(EMCState *script) {
  29. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setCharacterFacingRefresh(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
  30. int animFrame = stackPos(2);
  31. if (animFrame >= 0)
  32. _mainCharacter.animFrame = animFrame;
  33. _mainCharacter.facing = stackPos(1);
  34. updateCharacterAnim(0);
  35. refreshAnimObjectsIfNeed();
  36. return 0;
  37. }
  38. int KyraEngine_HoF::o2_setCharacterPos(EMCState *script) {
  39. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setCharacterFacingRefresh(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
  40. int x = stackPos(1);
  41. int y = stackPos(2);
  42. if (x != -1 && y != -1) {
  43. x &= ~3;
  44. y &= ~1;
  45. }
  46. restorePage3();
  47. _mainCharacter.x2 = _mainCharacter.x1 = x;
  48. _mainCharacter.y2 = _mainCharacter.y1 = y;
  49. return 0;
  50. }
  51. int KyraEngine_HoF::o2_defineObject(EMCState *script) {
  52. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_defineObject(%p) (%d, '%s', %d, %d, %d, %d)", (const void *)script,
  53. stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
  54. TalkObject *object = &_talkObjectList[stackPos(0)];
  55. strcpy(object->filename, stackPosString(1));
  56. object->scriptId = stackPos(2);
  57. object->x = stackPos(3);
  58. object->y = stackPos(4);
  59. object->color = stackPos(5);
  60. return 0;
  61. }
  62. int KyraEngine_HoF::o2_refreshCharacter(EMCState *script) {
  63. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_refreshCharacter(%p) (-, %d, %d, %d)", (const void *)script, stackPos(1), stackPos(2), stackPos(3));
  64. int unk = stackPos(1);
  65. int facing = stackPos(2);
  66. int refresh = stackPos(3);
  67. if (facing >= 0)
  68. _mainCharacter.facing = facing;
  69. if (unk >= 0 && unk != 32)
  70. _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
  71. updateCharacterAnim(0);
  72. if (refresh)
  73. refreshAnimObjectsIfNeed();
  74. return 0;
  75. }
  76. int KyraEngine_HoF::o2_setSceneComment(EMCState *script) {
  77. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setSceneComment(%p) ('%s')", (const void *)script, stackPosString(0));
  78. _sceneCommentString = stackPosString(0);
  79. return 0;
  80. }
  81. int KyraEngine_HoF::o2_setCharacterAnimFrame(EMCState *script) {
  82. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setCharacterAnimFrame(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
  83. int animFrame = stackPos(1);
  84. int updateAnim = stackPos(2);
  85. _mainCharacter.animFrame = animFrame;
  86. if (updateAnim)
  87. updateCharacterAnim(0);
  88. return 0;
  89. }
  90. int KyraEngine_HoF::o2_customCharacterChat(EMCState *script) {
  91. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_customCharacterChat(%p) ('%s', %d, %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
  92. playVoice(_vocHigh, stackPos(4));
  93. _text->printCustomCharacterText(stackPosString(0), stackPos(1), stackPos(2), stackPos(3), 0, 2);
  94. return 0;
  95. }
  96. int KyraEngine_HoF::o2_soundFadeOut(EMCState *script) {
  97. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_soundFadeOut(%p) ()", (const void *)script);
  98. _sound->beginFadeOut();
  99. return 0;
  100. }
  101. int KyraEngine_HoF::o2_showChapterMessage(EMCState *script) {
  102. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_showChapterMessage(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  103. showChapterMessage(stackPos(0), stackPos(1));
  104. return 0;
  105. }
  106. int KyraEngine_HoF::o2_restoreTalkTextMessageBkgd(EMCState *script) {
  107. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_restoreTalkTextMessageBkgd(%p) ()", (const void *)script);
  108. _text->restoreTalkTextMessageBkgd(2, 0);
  109. return 0;
  110. }
  111. int KyraEngine_HoF::o2_wsaClose(EMCState *script) {
  112. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_wsaClose(%p) (%d)", (const void *)script, stackPos(0));
  113. assert(stackPos(0) >= 0 && stackPos(0) < ARRAYSIZE(_wsaSlots));
  114. _wsaSlots[stackPos(0)]->close();
  115. return 0;
  116. }
  117. int KyraEngine_HoF::o2_meanWhileScene(EMCState *script) {
  118. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_meanWhileScene(%p) (%d)", (const void *)script, stackPos(0));
  119. static const uint8 jpSubtitle[] = { 0x88, 0xEA, 0x95, 0xFB, 0x81, 0x45, 0x81, 0x45, 0x81, 0x45 };
  120. const char *cpsfile = stackPosString(0);
  121. const char *palfile = stackPosString(1);
  122. _screen->loadBitmap(cpsfile, 3, 3, 0);
  123. _screen->copyPalette(2, 0);
  124. _screen->loadPalette(palfile, _screen->getPalette(2));
  125. _screen->fillRect(0, 0, 319, 199, 207);
  126. _screen->setScreenPalette(_screen->getPalette(2));
  127. _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
  128. if (!scumm_stricmp(cpsfile, "_MEANWIL.CPS") && _flags.lang == Common::JA_JPN) {
  129. Screen::FontId o = _screen->setFont(Screen::FID_SJIS_FNT);
  130. _screen->printText((const char *)jpSubtitle, 140, 176, 255, 132);
  131. _screen->setFont(o);
  132. }
  133. _screen->updateScreen();
  134. return 0;
  135. }
  136. int KyraEngine_HoF::o2_backUpScreen(EMCState *script) {
  137. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_backUpScreen(%p) (%d)", (const void *)script, stackPos(0));
  138. _screen->copyRegionToBuffer(stackPos(0), 0, 0, 320, 144, _screenBuffer);
  139. return 0;
  140. }
  141. int KyraEngine_HoF::o2_restoreScreen(EMCState *script) {
  142. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_restoreScreen(%p) (%d)", (const void *)script, stackPos(0));
  143. _screen->copyBlockToPage(stackPos(0), 0, 0, 320, 144, _screenBuffer);
  144. return 0;
  145. }
  146. int KyraEngine_HoF::o2_displayWsaFrame(EMCState *script) {
  147. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_displayWsaFrame(%p) (%d, %d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script,
  148. stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8));
  149. int frame = stackPos(0);
  150. int x = stackPos(1);
  151. int y = stackPos(2);
  152. int waitTime = stackPos(3);
  153. int slot = stackPos(4);
  154. int copyParam = stackPos(5);
  155. int doUpdate = stackPos(6);
  156. int dstPage = stackPos(7);
  157. int backUp = stackPos(8);
  158. _screen->hideMouse();
  159. const uint32 endTime = _system->getMillis() + waitTime * _tickLength;
  160. _wsaSlots[slot]->displayFrame(frame, dstPage, x, y, copyParam | 0xC000, 0, 0);
  161. _screen->updateScreen();
  162. if (backUp)
  163. memcpy(_gamePlayBuffer, _screen->getCPagePtr(3), 46080);
  164. delayUntil(endTime, false, doUpdate != 0);
  165. _screen->showMouse();
  166. return 0;
  167. }
  168. int KyraEngine_HoF::o2_displayWsaSequentialFramesLooping(EMCState *script) {
  169. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_displayWsaSequentialFramesLooping(%p) (%d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script,
  170. stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
  171. int startFrame = stackPos(0);
  172. int endFrame = stackPos(1);
  173. int x = stackPos(2);
  174. int y = stackPos(3);
  175. int waitTime = stackPos(4);
  176. int slot = stackPos(5);
  177. int maxTimes = stackPos(6);
  178. int copyFlags = stackPos(7);
  179. if (maxTimes > 1)
  180. maxTimes = 1;
  181. _screen->hideMouse();
  182. int curTime = 0;
  183. while (curTime < maxTimes) {
  184. if (startFrame < endFrame) {
  185. for (int i = startFrame; i <= endFrame; ++i) {
  186. const uint32 endTime = _system->getMillis() + waitTime * _tickLength;
  187. _wsaSlots[slot]->displayFrame(i, 0, x, y, 0xC000 | copyFlags, 0, 0);
  188. if (!skipFlag()) {
  189. _screen->updateScreen();
  190. delayUntil(endTime, false, true);
  191. }
  192. }
  193. } else {
  194. for (int i = startFrame; i >= endFrame; --i) {
  195. const uint32 endTime = _system->getMillis() + waitTime * _tickLength;
  196. _wsaSlots[slot]->displayFrame(i, 0, x, y, 0xC000 | copyFlags, 0, 0);
  197. if (!skipFlag()) {
  198. _screen->updateScreen();
  199. delayUntil(endTime, false, true);
  200. }
  201. }
  202. }
  203. ++curTime;
  204. }
  205. resetSkipFlag();
  206. _screen->showMouse();
  207. return 0;
  208. }
  209. int KyraEngine_HoF::o2_wsaOpen(EMCState *script) {
  210. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_wsaOpen(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
  211. assert(stackPos(1) >= 0 && stackPos(1) < ARRAYSIZE(_wsaSlots));
  212. _wsaSlots[stackPos(1)]->open(stackPosString(0), 1, 0);
  213. return 0;
  214. }
  215. int KyraEngine_HoF::o2_displayWsaSequentialFrames(EMCState *script) {
  216. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_displayWsaSequentialFrames(%p) (%d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6));
  217. uint16 frameDelay = stackPos(2) * _tickLength;
  218. uint16 currentFrame = stackPos(3);
  219. uint16 lastFrame = stackPos(4);
  220. uint16 index = stackPos(5);
  221. uint16 copyParam = stackPos(6) | 0xC000;
  222. _screen->hideMouse();
  223. while (currentFrame <= lastFrame) {
  224. const uint32 endTime = _system->getMillis() + frameDelay;
  225. _wsaSlots[index]->displayFrame(currentFrame++, 0, stackPos(0), stackPos(1), copyParam, 0, 0);
  226. if (!skipFlag()) {
  227. _screen->updateScreen();
  228. delayUntil(endTime);
  229. }
  230. }
  231. resetSkipFlag();
  232. _screen->showMouse();
  233. return 0;
  234. }
  235. int KyraEngine_HoF::o2_displayWsaSequence(EMCState *script) {
  236. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_displayWsaSequence(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
  237. const int frameDelay = stackPos(2) * _tickLength;
  238. const int index = stackPos(3);
  239. const bool doUpdate = (stackPos(4) != 0);
  240. const uint16 copyParam = stackPos(5) | 0xC000;
  241. _screen->hideMouse();
  242. int currentFrame = 0;
  243. const int lastFrame = _wsaSlots[index]->frames();
  244. while (currentFrame <= lastFrame) {
  245. const uint32 endTime = _system->getMillis() + frameDelay;
  246. _wsaSlots[index]->displayFrame(currentFrame++, 0, stackPos(0), stackPos(1), copyParam, 0, 0);
  247. if (!skipFlag()) {
  248. if (doUpdate)
  249. update();
  250. _screen->updateScreen();
  251. delayUntil(endTime);
  252. }
  253. }
  254. resetSkipFlag();
  255. _screen->showMouse();
  256. return 0;
  257. }
  258. int KyraEngine_HoF::o2_addItemToInventory(EMCState *script) {
  259. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_addItemToInventory(%p) (%d, -, %d)", (const void *)script, stackPos(0), stackPos(2));
  260. int slot = findFreeVisibleInventorySlot();
  261. if (slot != -1) {
  262. _mainCharacter.inventory[slot] = stackPos(0);
  263. if (stackPos(2))
  264. redrawInventory(0);
  265. }
  266. return slot;
  267. }
  268. int KyraEngine_HoF::o2_drawShape(EMCState *script) {
  269. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_drawShape(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
  270. uint8 *shp = getShapePtr(stackPos(0) + 64);
  271. int x = stackPos(1);
  272. int y = stackPos(2);
  273. uint8 dsFlag = stackPos(3) & 0xFF;
  274. uint8 modeFlag = stackPos(4) & 0xFF;
  275. if (modeFlag) {
  276. _screen->drawShape(2, shp, x, y, 2, dsFlag ? 1 : 0);
  277. } else {
  278. restorePage3();
  279. _screen->drawShape(2, shp, x, y, 2, dsFlag ? 1 : 0);
  280. memcpy(_gamePlayBuffer, _screen->getCPagePtr(3), 46080);
  281. _screen->drawShape(0, shp, x, y, 2, dsFlag ? 1 : 0);
  282. flagAnimObjsForRefresh();
  283. flagAnimObjsSpecialRefresh();
  284. refreshAnimObjectsIfNeed();
  285. }
  286. return 0;
  287. }
  288. int KyraEngine_HoF::o2_addItemToCurScene(EMCState *script) {
  289. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_addItemToCurScene(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
  290. const int16 id = stackPos(0);
  291. int x = stackPos(1);
  292. int y = stackPos(2);
  293. int freeItem = findFreeItem();
  294. x = MAX(14, x);
  295. x = MIN(304, x);
  296. y = MAX(14, y);
  297. y = MIN(136, y);
  298. if (freeItem >= 0) {
  299. _itemList[freeItem].id = id;
  300. _itemList[freeItem].x = x;
  301. _itemList[freeItem].y = y;
  302. _itemList[freeItem].sceneId = _mainCharacter.sceneId;
  303. addItemToAnimList(freeItem);
  304. refreshAnimObjectsIfNeed();
  305. }
  306. return 0;
  307. }
  308. int KyraEngine_HoF::o2_loadSoundFile(EMCState *script) {
  309. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_loadSoundFile(%p) (%d)", (const void *)script, stackPos(0));
  310. if (_flags.platform == Common::kPlatformDOS)
  311. snd_loadSoundFile(stackPos(0));
  312. return 0;
  313. }
  314. int KyraEngine_HoF::o2_removeSlotFromInventory(EMCState *script) {
  315. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_removeSlotFromInventory(%p) (%d)", (const void *)script, stackPos(0));
  316. removeSlotFromInventory(stackPos(0));
  317. return 0;
  318. }
  319. int KyraEngine_HoF::o2_removeItemFromInventory(EMCState *script) {
  320. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_removeItemFromInventory(%p) (%d)", (const void *)script, stackPos(0));
  321. uint16 item = stackPos(0);
  322. int slot = -1;
  323. while ((slot = getInventoryItemSlot(item)) != -1)
  324. removeSlotFromInventory(slot);
  325. return 0;
  326. }
  327. int KyraEngine_HoF::o2_countItemInInventory(EMCState *script) {
  328. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_countItemInInventory(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  329. uint16 item = stackPos(1);
  330. int count = 0;
  331. for (int i = 0; i < 20; ++i) {
  332. if (_mainCharacter.inventory[i] == item)
  333. ++count;
  334. }
  335. if ((stackPos(0) == 0) && _itemInHand == int16(item))
  336. ++count;
  337. return count;
  338. }
  339. int KyraEngine_HoF::o2_countItemsInScene(EMCState *script) {
  340. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_countItemsInScene(%p) (%d)", (const void *)script, stackPos(0));
  341. int count = 0;
  342. for (int i = 0; i < 30; ++i) {
  343. if (_itemList[i].sceneId == stackPos(0) && _itemList[i].id != kItemNone)
  344. ++count;
  345. }
  346. return count;
  347. }
  348. int KyraEngine_HoF::o2_wipeDownMouseItem(EMCState *script) {
  349. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_wipeDownMouseItem(%p) (-, %d, %d)", (const void *)script, stackPos(1), stackPos(2));
  350. _screen->hideMouse();
  351. const int x = stackPos(1) - 8;
  352. const int y = stackPos(2) - 15;
  353. if (_itemInHand >= 0) {
  354. backUpGfxRect32x32(x, y);
  355. uint8 *shape = getShapePtr(_itemInHand+64);
  356. for (int curY = y, height = 16; height > 0; height -= 2, curY += 2) {
  357. restoreGfxRect32x32(x, y);
  358. _screen->setNewShapeHeight(shape, height);
  359. uint32 waitTime = _system->getMillis() + _tickLength;
  360. _screen->drawShape(0, shape, x, curY, 0, 0);
  361. _screen->updateScreen();
  362. delayUntil(waitTime);
  363. }
  364. restoreGfxRect32x32(x, y);
  365. _screen->resetShapeHeight(shape);
  366. }
  367. _screen->showMouse();
  368. removeHandItem();
  369. return 0;
  370. }
  371. int KyraEngine_HoF::o2_getElapsedSecs(EMCState *script) {
  372. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getElapsedSecs(%p) ()", (const void *)script);
  373. return _system->getMillis() / 1000;
  374. }
  375. int KyraEngine_HoF::o2_getTimerDelay(EMCState *script) {
  376. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getTimerDelay(%p) (%d)", (const void *)script, stackPos(0));
  377. return _timer->getDelay(stackPos(0));
  378. }
  379. int KyraEngine_HoF::o2_delaySecs(EMCState *script) {
  380. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_delaySecs(%p) (%d)", (const void *)script, stackPos(0));
  381. delay(stackPos(0) * 1000, true);
  382. return 0;
  383. }
  384. int KyraEngine_HoF::o2_setTimerDelay(EMCState *script) {
  385. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setTimerDelay(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  386. _timer->setDelay(stackPos(0), stackPos(1));
  387. return 0;
  388. }
  389. int KyraEngine_HoF::o2_setScaleTableItem(EMCState *script) {
  390. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setScaleTableItem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  391. setScaleTableItem(stackPos(0), stackPos(1));
  392. return 0;
  393. }
  394. int KyraEngine_HoF::o2_setDrawLayerTableItem(EMCState *script) {
  395. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setDrawLayerTableItem(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  396. setDrawLayerTableEntry(stackPos(0), stackPos(1));
  397. return 0;
  398. }
  399. int KyraEngine_HoF::o2_setCharPalEntry(EMCState *script) {
  400. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setCharPalEntry(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  401. setCharPalEntry(stackPos(0), stackPos(1));
  402. return 0;
  403. }
  404. int KyraEngine_HoF::o2_loadZShapes(EMCState *script) {
  405. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_loadZShapes(%p) (%d)", (const void *)script, stackPos(0));
  406. loadCharacterShapes(stackPos(0));
  407. return 0;
  408. }
  409. int KyraEngine_HoF::o2_drawSceneShape(EMCState *script) {
  410. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_drawSceneShape(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1),
  411. stackPos(2), stackPos(3));
  412. int shape = stackPos(0);
  413. int x = stackPos(1);
  414. int y = stackPos(2);
  415. int flag = (stackPos(3) != 0) ? 1 : 0;
  416. restorePage3();
  417. _screen->drawShape(2, _sceneShapeTable[shape], x, y, 2, flag);
  418. memcpy(_gamePlayBuffer, _screen->getCPagePtr(3), 46080);
  419. _screen->drawShape(0, _sceneShapeTable[shape], x, y, 2, flag);
  420. flagAnimObjsSpecialRefresh();
  421. flagAnimObjsForRefresh();
  422. refreshAnimObjectsIfNeed();
  423. return 0;
  424. }
  425. int KyraEngine_HoF::o2_drawSceneShapeOnPage(EMCState *script) {
  426. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_drawSceneShapeOnPage(%p) (%d, %d, %d, %d, %d)", (const void *)script,
  427. stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4));
  428. int shape = stackPos(0);
  429. int x = stackPos(1);
  430. int y = stackPos(2);
  431. int flag = stackPos(3);
  432. int drawPage = stackPos(4);
  433. _screen->drawShape(drawPage, _sceneShapeTable[shape], x, y, 2, flag ? 1 : 0);
  434. return 0;
  435. }
  436. int KyraEngine_HoF::o2_disableAnimObject(EMCState *script) {
  437. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_disableAnimObject(%p) (%d)", (const void *)script, stackPos(0));
  438. _animObjects[stackPos(0)+1].enabled = false;
  439. return 0;
  440. }
  441. int KyraEngine_HoF::o2_enableAnimObject(EMCState *script) {
  442. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_enableAnimObject(%p) (%d)", (const void *)script, stackPos(0));
  443. _animObjects[stackPos(0)+1].enabled = true;
  444. return 0;
  445. }
  446. int KyraEngine_HoF::o2_loadPalette384(EMCState *script) {
  447. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_loadPalette384(%p) ('%s')", (const void *)script, stackPosString(0));
  448. _screen->copyPalette(1, 0);
  449. _res->loadFileToBuf(stackPosString(0), _screen->getPalette(1).getData(), 384);
  450. return 0;
  451. }
  452. int KyraEngine_HoF::o2_setPalette384(EMCState *script) {
  453. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setPalette384(%p) ()", (const void *)script);
  454. _screen->getPalette(0).copy(_screen->getPalette(1), 0, 128);
  455. _screen->setScreenPalette(_screen->getPalette(0));
  456. return 0;
  457. }
  458. int KyraEngine_HoF::o2_restoreBackBuffer(EMCState *script) {
  459. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_restoreBackBuffer(%p) (%d)", (const void *)script, stackPos(0));
  460. int disable = stackPos(0);
  461. int oldState = 0;
  462. if (disable) {
  463. oldState = _animObjects[0].enabled;
  464. _animObjects[0].enabled = 0;
  465. }
  466. restorePage3();
  467. if (disable)
  468. _animObjects[0].enabled = (oldState != 0);
  469. return 0;
  470. }
  471. int KyraEngine_HoF::o2_backUpInventoryGfx(EMCState *script) {
  472. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_backUpInventoryGfx(%p) ()", (const void *)script);
  473. _screen->copyRegionToBuffer(1, 0, 144, 320, 56, _screenBuffer);
  474. _inventorySaved = true;
  475. return 0;
  476. }
  477. int KyraEngine_HoF::o2_disableSceneAnim(EMCState *script) {
  478. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_disableSceneAnim(%p) (%d)", (const void *)script, stackPos(0));
  479. _sceneAnims[stackPos(0)].flags &= ~1;
  480. return 0;
  481. }
  482. int KyraEngine_HoF::o2_enableSceneAnim(EMCState *script) {
  483. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_enableSceneAnim(%p) (%d)", (const void *)script, stackPos(0));
  484. _sceneAnims[stackPos(0)].flags |= 1;
  485. return 0;
  486. }
  487. int KyraEngine_HoF::o2_restoreInventoryGfx(EMCState *script) {
  488. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_restoreInventoryGfx(%p) ()", (const void *)script);
  489. _screen->copyBlockToPage(1, 0, 144, 320, 56, _screenBuffer);
  490. _inventorySaved = false;
  491. return 0;
  492. }
  493. int KyraEngine_HoF::o2_setSceneAnimPos2(EMCState *script) {
  494. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setSceneAnimPos2(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
  495. _sceneAnims[stackPos(0)].x2 = stackPos(1);
  496. _sceneAnims[stackPos(0)].y2 = stackPos(2);
  497. return 0;
  498. }
  499. int KyraEngine_HoF::o2_fadeScenePal(EMCState *script) {
  500. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_fadeScenePal(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  501. fadeScenePal(stackPos(0), stackPos(1));
  502. return 0;
  503. }
  504. int KyraEngine_HoF::o2_enterNewScene(EMCState *script) {
  505. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_enterNewScene(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0),
  506. stackPos(1), stackPos(2), stackPos(3), stackPos(4));
  507. int skipNpcScript = stackPos(3);
  508. enterNewScene(stackPos(0), stackPos(1), stackPos(2), skipNpcScript, stackPos(4));
  509. if (!skipNpcScript)
  510. runSceneScript4(0);
  511. _unk5 = 1;
  512. if (_mainCharX == -1 || _mainCharY == -1) {
  513. _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
  514. updateCharacterAnim(0);
  515. }
  516. return 0;
  517. }
  518. int KyraEngine_HoF::o2_switchScene(EMCState *script) {
  519. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_switchScene(%p) (%d)", (const void *)script, stackPos(0));
  520. setGameFlag(0x1EF);
  521. _mainCharX = _mainCharacter.x1;
  522. _mainCharY = _mainCharacter.y1;
  523. _noScriptEnter = false;
  524. enterNewScene(stackPos(0), _mainCharacter.facing, 0, 0, 0);
  525. _noScriptEnter = true;
  526. return 0;
  527. }
  528. int KyraEngine_HoF::o2_setPathfinderFlag(EMCState *script) {
  529. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setPathfinderFlag(%p) (%d)", (const void *)script, stackPos(0));
  530. _pathfinderFlag = stackPos(0);
  531. return 0;
  532. }
  533. int KyraEngine_HoF::o2_getSceneExitToFacing(EMCState *script) {
  534. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getSceneExitToFacing(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  535. const int scene = stackPos(0);
  536. const int facing = stackPos(1);
  537. if (facing == 0)
  538. return (int16)_sceneList[scene].exit1;
  539. else if (facing == 2)
  540. return (int16)_sceneList[scene].exit2;
  541. else if (facing == 4)
  542. return (int16)_sceneList[scene].exit3;
  543. else if (facing == 6)
  544. return (int16)_sceneList[scene].exit4;
  545. return -1;
  546. }
  547. int KyraEngine_HoF::o2_setLayerFlag(EMCState *script) {
  548. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setLayerFlag(%p) (%d)", (const void *)script, stackPos(0));
  549. int layer = stackPos(0);
  550. if (layer >= 1 && layer <= 16)
  551. _layerFlagTable[layer] = 1;
  552. return 0;
  553. }
  554. int KyraEngine_HoF::o2_setZanthiaPos(EMCState *script) {
  555. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setZanthiaPos(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  556. _mainCharX = stackPos(0);
  557. _mainCharY = stackPos(1);
  558. if (_mainCharX == -1 && _mainCharY == -1)
  559. _mainCharacter.animFrame = 32;
  560. else
  561. _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
  562. return 0;
  563. }
  564. int KyraEngine_HoF::o2_loadMusicTrack(EMCState *script) {
  565. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_loadMusicTrack(%p) (%d)", (const void *)script, stackPos(0));
  566. snd_loadSoundFile(stackPos(0));
  567. return 0;
  568. }
  569. int KyraEngine_HoF::o2_setSceneAnimPos(EMCState *script) {
  570. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setSceneAnimPos(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2));
  571. _sceneAnims[stackPos(0)].x = stackPos(1);
  572. _sceneAnims[stackPos(0)].y = stackPos(2);
  573. return 0;
  574. }
  575. int KyraEngine_HoF::o2_setCauldronState(EMCState *script) {
  576. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setCauldronState(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  577. setCauldronState(stackPos(0), stackPos(1) != 0);
  578. clearCauldronTable();
  579. return 0;
  580. }
  581. int KyraEngine_HoF::o2_showItemString(EMCState *script) {
  582. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_showItemString(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  583. const int item = stackPos(0);
  584. int string = 0;
  585. if (stackPos(1) == 1) {
  586. if (_lang == 1)
  587. string = getItemCommandStringPickUp(item);
  588. else
  589. string = 7;
  590. } else {
  591. if (_lang == 1)
  592. string = getItemCommandStringInv(item);
  593. else
  594. string = 8;
  595. }
  596. updateCommandLineEx(item+54, string, 0xD6);
  597. return 0;
  598. }
  599. int KyraEngine_HoF::o2_isAnySoundPlaying(EMCState *script) {
  600. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_isAnySoundPlaying(%p) ()", (const void *)script);
  601. // WORKAROUND
  602. //
  603. // The input script function in the skull scene does busy wait
  604. // for the sound effect, which is played after completing the
  605. // song, to finish. To avoid too much CPU use, we add some slight
  606. // delay here.
  607. //
  608. // Also the Nintendo DS backend seems only to update the sound, when
  609. // either OSystem::updateScreen or OSystem::delayMillis is called.
  610. // So we have to call delay here, since otherwise the game would hang.
  611. #ifndef __DS__
  612. if (_currentScene == 16 && _currentChapter == 1)
  613. #endif
  614. delay(_tickLength);
  615. return _sound->voiceIsPlaying() ? 1 : 0;
  616. }
  617. int KyraEngine_HoF::o2_setDrawNoShapeFlag(EMCState *script) {
  618. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setDrawNoShapeFlag(%p) (%d)", (const void *)script, stackPos(0));
  619. _drawNoShapeFlag = (stackPos(0) != 0);
  620. return 0;
  621. }
  622. int KyraEngine_HoF::o2_setRunFlag(EMCState *script) {
  623. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setRunFlag(%p) (%d)", (const void *)script, stackPos(0));
  624. // this is usually just _runFlag, but since this is just used when the game should play the credits
  625. // we handle it a bit different :-)
  626. _showOutro = true;
  627. _runFlag = false;
  628. return 0;
  629. }
  630. int KyraEngine_HoF::o2_showLetter(EMCState *script) {
  631. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_showLetter(%p) (%d)", (const void *)script, stackPos(0));
  632. const int letter = stackPos(0);
  633. char filename[16];
  634. _screen->hideMouse();
  635. showMessage(0, 0xCF);
  636. displayInvWsaLastFrame();
  637. backUpPage0();
  638. _screen->copyPalette(2, 0);
  639. _screen->clearPage(3);
  640. _screen->loadBitmap("_NOTE.CPS", 3, 3, 0);
  641. sprintf(filename, "_NTEPAL%.1d.COL", letter+1);
  642. _screen->loadPalette(filename, _screen->getPalette(0));
  643. _screen->fadeToBlack(0x14);
  644. sprintf(filename, "LETTER%.1d.%s", letter, _languageExtension[_lang]);
  645. uint8 *letterBuffer = _res->fileData(filename, 0);
  646. if (!letterBuffer) {
  647. // some floppy versions use a TXT extension
  648. sprintf(filename, "LETTER%.1d.TXT", letter);
  649. letterBuffer = _res->fileData(filename, 0);
  650. }
  651. if (letterBuffer) {
  652. bookDecodeText(letterBuffer);
  653. bookPrintText(2, letterBuffer, 0xC, 0xA, 0x20);
  654. }
  655. _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK);
  656. _screen->fadePalette(_screen->getPalette(0), 0x14);
  657. _screen->setMouseCursor(0, 0, getShapePtr(0));
  658. setMousePos(280, 160);
  659. _screen->showMouse();
  660. bool running = true;
  661. while (running) {
  662. int inputFlag = checkInput(0);
  663. removeInputTop();
  664. if (inputFlag == 198 || inputFlag == 199)
  665. running = false;
  666. _screen->updateScreen();
  667. _system->delayMillis(10);
  668. }
  669. _screen->hideMouse();
  670. _screen->fadeToBlack(0x14);
  671. restorePage0();
  672. _screen->copyPalette(0, 2);
  673. _screen->fadePalette(_screen->getPalette(0), 0x14);
  674. setHandItem(_itemInHand);
  675. _screen->showMouse();
  676. return 0;
  677. }
  678. int KyraEngine_HoF::o2_playFireflyScore(EMCState *script) {
  679. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_playFireflyScore(%p) ()", (const void *)script);
  680. if (_sound->getSfxType() == Sound::kAdLib || _sound->getSfxType() == Sound::kPCSpkr ||
  681. _sound->getSfxType() == Sound::kMidiMT32 || _sound->getSfxType() == Sound::kMidiGM) {
  682. snd_playWanderScoreViaMap(86, 1);
  683. return 1;
  684. } else {
  685. return 0;
  686. }
  687. }
  688. int KyraEngine_HoF::o2_encodeShape(EMCState *script) {
  689. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_encodeShape(%p) (%d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1),
  690. stackPos(2), stackPos(3), stackPos(4));
  691. _sceneShapeTable[stackPos(0)] = _screen->encodeShape(stackPos(1), stackPos(2), stackPos(3), stackPos(4), 2);
  692. return 0;
  693. }
  694. int KyraEngine_HoF::o2_defineSceneAnim(EMCState *script) {
  695. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_defineSceneAnim(%p) (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, '%s')", (const void *)script,
  696. stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8),
  697. stackPos(9), stackPos(10), stackPos(11), stackPosString(12));
  698. int animId = stackPos(0);
  699. SceneAnim &anim = _sceneAnims[animId];
  700. anim.flags = stackPos(1);
  701. anim.x = stackPos(2);
  702. anim.y = stackPos(3);
  703. anim.x2 = stackPos(4);
  704. anim.y2 = stackPos(5);
  705. anim.width = stackPos(6);
  706. anim.height = stackPos(7);
  707. anim.specialSize = stackPos(9);
  708. anim.shapeIndex = stackPos(11);
  709. if (stackPosString(12) != 0)
  710. strcpy(anim.filename, stackPosString(12));
  711. if (anim.flags & 0x40) {
  712. if (!_sceneAnimMovie[animId]->open(anim.filename, 1, 0))
  713. error("couldn't load '%s'", anim.filename);
  714. if (_sceneAnimMovie[animId]->xAdd() || _sceneAnimMovie[animId]->yAdd())
  715. anim.wsaFlag = 1;
  716. else
  717. anim.wsaFlag = 0;
  718. }
  719. return 0;
  720. }
  721. int KyraEngine_HoF::o2_updateSceneAnim(EMCState *script) {
  722. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_updateSceneAnim(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  723. updateSceneAnim(stackPos(0), stackPos(1));
  724. // HACK: Some animations are really too fast because of missing delay times.
  725. // Notice that the delay time is purely subjective set here, it could look
  726. // slower or maybe faster in the original, but at least this looks OK for
  727. // Raziel^.
  728. //
  729. // We know currently of some different animations where this happens.
  730. // - Where Marco is dangling from the flesh-eating plant (see bug
  731. // #1923638 "HoF: Marco missing animation frames").
  732. // - After giving the ticket to the captain. He would move very fast
  733. // (barely noticeable) onto the ship without this delay.
  734. // - The scene after giving the sandwitch to the guards in the city.
  735. // (see bug #1926838 "HoF: Animation plays too fast")
  736. // This scene script calls o2_delay though, but since this updates
  737. // the scene animation scripts again there is no delay for the
  738. // animation.
  739. // - When the sheriff enters the jail, either to lock you up or to throw
  740. // away the key. (see bug #1926838 "HoF: Animation plays too fast").
  741. if ((stackPos(0) == 2 && _mainCharacter.sceneId == 3) ||
  742. (stackPos(0) == 3 && _mainCharacter.sceneId == 33) ||
  743. ((stackPos(0) == 1 || stackPos(0) == 2) && _mainCharacter.sceneId == 19) ||
  744. ((stackPos(0) == 1 || stackPos(0) == 2) && _mainCharacter.sceneId == 27))
  745. _sceneSpecialScriptsTimer[_lastProcessedSceneScript] = _system->getMillis() + _tickLength * 6;
  746. _specialSceneScriptRunFlag = false;
  747. return 0;
  748. }
  749. int KyraEngine_HoF::o2_addToSceneAnimPosAndUpdate(EMCState *script) {
  750. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_addToSceneAnimPosAndUpdate(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
  751. const int anim = stackPos(0);
  752. _sceneAnims[anim].x2 += stackPos(1);
  753. _sceneAnims[anim].y2 += stackPos(2);
  754. if (_sceneAnims[anim].flags & 2) {
  755. _sceneAnims[anim].x += stackPos(1);
  756. _sceneAnims[anim].y += stackPos(2);
  757. }
  758. updateSceneAnim(anim, stackPos(3));
  759. _specialSceneScriptRunFlag = false;
  760. return 0;
  761. }
  762. int KyraEngine_HoF::o2_useItemOnMainChar(EMCState *script) {
  763. EMCState tmpScript;
  764. _emc->init(&tmpScript, &_npcScriptData);
  765. _emc->start(&tmpScript, 0);
  766. tmpScript.regs[4] = _itemInHand;
  767. tmpScript.regs[0] = _mainCharacter.sceneId;
  768. int oldVocH = _vocHigh;
  769. _vocHigh = 0x5A;
  770. while (_emc->isValid(&tmpScript))
  771. _emc->run(&tmpScript);
  772. _vocHigh = oldVocH;
  773. return 0;
  774. }
  775. int KyraEngine_HoF::o2_startDialogue(EMCState *script) {
  776. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_startDialogue(%p) (%d)", (const void *)script, stackPos(0));
  777. startDialogue(stackPos(0));
  778. return 0;
  779. }
  780. int KyraEngine_HoF::o2_addCauldronStateTableEntry(EMCState *script) {
  781. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_addCauldronStateTableEntry(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  782. return addToCauldronStateTable(stackPos(0), stackPos(1)) ? 1 : 0;
  783. }
  784. int KyraEngine_HoF::o2_setCountDown(EMCState *script) {
  785. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setCountDown(%p) (%d)", (const void *)script, stackPos(0));
  786. _scriptCountDown = _system->getMillis() + stackPos(0) * _tickLength;
  787. return 0;
  788. }
  789. int KyraEngine_HoF::o2_getCountDown(EMCState *script) {
  790. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getCountDown(%p)", (const void *)script);
  791. uint32 time = _system->getMillis();
  792. return (time > _scriptCountDown) ? 0 : (_scriptCountDown - time) / _tickLength;
  793. }
  794. int KyraEngine_HoF::o2_pressColorKey(EMCState *script) {
  795. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_pressColorKey(%p) (%d)", (const void *)script, stackPos(0));
  796. for (int i = 6; i; i--)
  797. _inputColorCode[i] = _inputColorCode[i - 1];
  798. _inputColorCode[0] = stackPos(0) & 0xFF;
  799. for (int i = 0; i < 7; i++) {
  800. if (_presetColorCode[i] != _inputColorCode[6 - i])
  801. return _dbgPass;
  802. }
  803. return 1;
  804. }
  805. int KyraEngine_HoF::o2_objectChat(EMCState *script) {
  806. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_objectChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
  807. if (_flags.isTalkie)
  808. warning("Unexpected call: o2_objectChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
  809. else
  810. objectChat(stackPosString(0), stackPos(1));
  811. return 0;
  812. }
  813. int KyraEngine_HoF::o2_changeChapter(EMCState *script) {
  814. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_changeChapter(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  815. const int chapter = stackPos(0);
  816. const int scene = stackPos(1);
  817. resetItemList();
  818. _newChapterFile = chapter;
  819. runStartScript(chapter, 0);
  820. _mainCharacter.dlgIndex = 0;
  821. memset(_newSceneDlgState, 0, 32);
  822. static const int zShapeList[] = { 1, 2, 2, 2, 4 };
  823. assert(chapter > 1 && chapter <= ARRAYSIZE(zShapeList));
  824. loadCharacterShapes(zShapeList[chapter-1]);
  825. enterNewScene(scene, (chapter == 2) ? 2 : 0, 0, 0, 0);
  826. return 0;
  827. }
  828. int KyraEngine_HoF::o2_getColorCodeFlag1(EMCState *script) {
  829. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getColorCodeFlag1(%p) ()", (const void *)script);
  830. return _colorCodeFlag1;
  831. }
  832. int KyraEngine_HoF::o2_setColorCodeFlag1(EMCState *script) {
  833. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getColorCodeFlag1(%p) (%d)", (const void *)script, stackPos(0));
  834. _colorCodeFlag1 = stackPos(0);
  835. return 0;
  836. }
  837. int KyraEngine_HoF::o2_getColorCodeFlag2(EMCState *script) {
  838. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getColorCodeFlag2(%p) ()", (const void *)script);
  839. return _colorCodeFlag2;
  840. }
  841. int KyraEngine_HoF::o2_setColorCodeFlag2(EMCState *script) {
  842. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getColorCodeFlag2(%p) (%d)", (const void *)script, stackPos(0));
  843. _colorCodeFlag2 = stackPos(0);
  844. return 0;
  845. }
  846. int KyraEngine_HoF::o2_getColorCodeValue(EMCState *script) {
  847. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getColorCodeValue(%p) (%d)", (const void *)script, stackPos(0));
  848. return _presetColorCode[stackPos(0)];
  849. }
  850. int KyraEngine_HoF::o2_setColorCodeValue(EMCState *script) {
  851. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setColorCodeValue(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  852. _presetColorCode[stackPos(0)] = stackPos(1) & 0xFF;
  853. return stackPos(1) & 0xFF;
  854. }
  855. int KyraEngine_HoF::o2_countItemInstances(EMCState *script) {
  856. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_countItemInstances(%p) (%d)", (const void *)script, stackPos(0));
  857. Item item = stackPos(0);
  858. int count = 0;
  859. for (int i = 0; i < 20; ++i) {
  860. if (_mainCharacter.inventory[i] == item)
  861. ++count;
  862. }
  863. if (_itemInHand == item)
  864. ++count;
  865. for (int i = 0; i < 30; ++i) {
  866. if (_itemList[i].id == item)
  867. ++count;
  868. }
  869. if (_hiddenItems[0] == item && _newChapterFile == 1)
  870. ++count;
  871. if (_hiddenItems[1] == item && _newChapterFile == 1)
  872. ++count;
  873. if (_hiddenItems[2] == item && _newChapterFile == 2)
  874. ++count;
  875. if (_hiddenItems[3] == item && _newChapterFile == 2)
  876. ++count;
  877. if (_hiddenItems[4] == item && _newChapterFile == 1)
  878. ++count;
  879. return count;
  880. }
  881. int KyraEngine_HoF::o2_removeItemFromScene(EMCState *script) {
  882. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_removeItemFromScene(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  883. const int scene = stackPos(0);
  884. const uint16 item = stackPos(1);
  885. for (int i = 0; i < 30; ++i) {
  886. if (_itemList[i].sceneId == scene && _itemList[i].id == item)
  887. _itemList[i].id = kItemNone;
  888. }
  889. return 0;
  890. }
  891. int KyraEngine_HoF::o2_initObject(EMCState *script) {
  892. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_initObject(%p) (%d)", (const void *)script, stackPos(0));
  893. initTalkObject(stackPos(0));
  894. return 0;
  895. }
  896. int KyraEngine_HoF::o2_npcChat(EMCState *script) {
  897. if (_flags.isTalkie) {
  898. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_npcChat(%p) ('%s', %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), _vocHigh, stackPos(2));
  899. npcChatSequence(stackPosString(0), stackPos(1), _vocHigh, stackPos(2));
  900. } else {
  901. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_npcChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
  902. npcChatSequence(stackPosString(0), stackPos(1));
  903. }
  904. return 0;
  905. }
  906. int KyraEngine_HoF::o2_deinitObject(EMCState *script) {
  907. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_deinitObject(%p) (%d)", (const void *)script, stackPos(0));
  908. deinitTalkObject(stackPos(0));
  909. return 0;
  910. }
  911. int KyraEngine_HoF::o2_playTimSequence(EMCState *script) {
  912. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_playTimSequence(%p) ('%s')", (const void *)script, stackPosString(0));
  913. playTim(stackPosString(0));
  914. return 0;
  915. }
  916. int KyraEngine_HoF::o2_makeBookOrCauldronAppear(EMCState *script) {
  917. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_makeBookOrCauldronAppear(%p) (%d)", (const void *)script, stackPos(0));
  918. seq_makeBookOrCauldronAppear(stackPos(0));
  919. return 0;
  920. }
  921. int KyraEngine_HoF::o2_resetInputColorCode(EMCState *script) {
  922. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_resetInputColorCode(%p)", (const void *)script);
  923. memset(_inputColorCode, 255, 7);
  924. return 0;
  925. }
  926. int KyraEngine_HoF::o2_mushroomEffect(EMCState *script) {
  927. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_mushroomEffect(%p)", (const void *)script);
  928. _screen->copyPalette(2, 0);
  929. for (int i = 1; i < 768; i += 3)
  930. _screen->getPalette(0)[i] = 0;
  931. snd_playSoundEffect(106);
  932. _screen->fadePalette(_screen->getPalette(0), 90, &_updateFunctor);
  933. _screen->copyPalette(0, 2);
  934. for (int i = 0; i < 768; i += 3) {
  935. _screen->getPalette(0)[i] = _screen->getPalette(0)[i + 1] = 0;
  936. _screen->getPalette(0)[i + 2] += (((int8)_screen->getPalette(0)[i + 2]) >> 1);
  937. if (_screen->getPalette(0)[i + 2] > 63)
  938. _screen->getPalette(0)[i + 2] = 63;
  939. }
  940. snd_playSoundEffect(106);
  941. _screen->fadePalette(_screen->getPalette(0), 90, &_updateFunctor);
  942. _screen->copyPalette(0, 2);
  943. _screen->fadePalette(_screen->getPalette(0), 30, &_updateFunctor);
  944. return 0;
  945. }
  946. int KyraEngine_HoF::o2_customChat(EMCState *script) {
  947. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_customChat(%p) ('%s', %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2));
  948. strcpy((char *)_unkBuf500Bytes, stackPosString(0));
  949. _chatText = (char *)_unkBuf500Bytes;
  950. _chatObject = stackPos(1);
  951. _chatVocHigh = _chatVocLow = -1;
  952. objectChatInit(_chatText, _chatObject, _vocHigh, stackPos(2));
  953. playVoice(_vocHigh, stackPos(2));
  954. return 0;
  955. }
  956. int KyraEngine_HoF::o2_customChatFinish(EMCState *script) {
  957. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_customChatFinish(%p) ()", (const void *)script);
  958. _text->restoreScreen();
  959. _chatText = 0;
  960. _chatObject = -1;
  961. return 0;
  962. }
  963. int KyraEngine_HoF::o2_setupSceneAnimation(EMCState *script) {
  964. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_setupSceneAnimation(%p) (%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, '%s')", (const void *)script,
  965. stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8), stackPos(9), stackPos(10), stackPos(11), stackPosString(12));
  966. const int index = stackPos(0);
  967. const uint16 flags = stackPos(1);
  968. restorePage3();
  969. SceneAnim &anim = _sceneAnims[index];
  970. anim.flags = flags;
  971. anim.x = stackPos(2);
  972. anim.y = stackPos(3);
  973. anim.x2 = stackPos(4);
  974. anim.y2 = stackPos(5);
  975. anim.width = stackPos(6);
  976. anim.height = stackPos(7);
  977. anim.specialSize = stackPos(9);
  978. anim.shapeIndex = stackPos(11);
  979. if (stackPosString(12))
  980. strcpy(anim.filename, stackPosString(12));
  981. if (flags & 0x40) {
  982. _sceneAnimMovie[index]->open(stackPosString(12), 0, 0);
  983. if (_sceneAnimMovie[index]->xAdd() || _sceneAnimMovie[index]->yAdd())
  984. anim.wsaFlag = 1;
  985. else
  986. anim.wsaFlag = 0;
  987. }
  988. AnimObj *obj = &_animObjects[1+index];
  989. obj->enabled = 1;
  990. obj->needRefresh = 1;
  991. obj->specialRefresh = 1;
  992. obj->animFlags = anim.flags & 8;
  993. if (anim.flags & 2)
  994. obj->flags = 0x800;
  995. else
  996. obj->flags = 0;
  997. if (anim.flags & 4)
  998. obj->flags |= 1;
  999. obj->xPos1 = anim.x;
  1000. obj->yPos1 = anim.y;
  1001. if ((anim.flags & 0x20) && anim.shapeIndex >= 0)
  1002. obj->shapePtr = _sceneShapeTable[anim.shapeIndex];
  1003. else
  1004. obj->shapePtr = 0;
  1005. if (anim.flags & 0x40) {
  1006. obj->shapeIndex3 = anim.shapeIndex;
  1007. obj->animNum = index;
  1008. } else {
  1009. obj->shapeIndex3 = 0xFFFF;
  1010. obj->animNum = 0xFFFF;
  1011. }
  1012. obj->shapeIndex2 = 0xFFFF;
  1013. obj->xPos2 = obj->xPos3 = anim.x2;
  1014. obj->yPos2 = obj->yPos3 = anim.y2;
  1015. obj->width = anim.width;
  1016. obj->height = anim.height;
  1017. obj->width2 = obj->height2 = anim.specialSize;
  1018. _animList = addToAnimListSorted(_animList, obj);
  1019. obj->needRefresh = 1;
  1020. obj->specialRefresh = 1;
  1021. return 0;
  1022. }
  1023. int KyraEngine_HoF::o2_stopSceneAnimation(EMCState *script) {
  1024. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_stopSceneAnimation(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  1025. const int index = stackPos(0);
  1026. AnimObj &obj = _animObjects[1+index];
  1027. restorePage3();
  1028. obj.shapeIndex3 = 0xFFFF;
  1029. obj.animNum = 0xFFFF;
  1030. obj.needRefresh = 1;
  1031. obj.specialRefresh = 1;
  1032. if (stackPos(1))
  1033. refreshAnimObjectsIfNeed();
  1034. obj.enabled = 0;
  1035. _animList = deleteAnimListEntry(_animList, &_animObjects[1+index]);
  1036. if (_sceneAnimMovie[index]->opened())
  1037. _sceneAnimMovie[index]->close();
  1038. return 0;
  1039. }
  1040. int KyraEngine_HoF::o2_processPaletteIndex(EMCState *script) {
  1041. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_processPaletteIndex(%p) (%d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
  1042. Palette &palette = _screen->getPalette(0);
  1043. const int index = stackPos(0);
  1044. const bool updatePalette = (stackPos(4) != 0);
  1045. const int delayTime = stackPos(5);
  1046. palette[index*3+0] = (stackPos(1) * 0x3F) / 100;
  1047. palette[index*3+1] = (stackPos(2) * 0x3F) / 100;
  1048. palette[index*3+2] = (stackPos(3) * 0x3F) / 100;
  1049. if (updatePalette) {
  1050. if (delayTime > 0)
  1051. _screen->fadePalette(palette, delayTime, &_updateFunctor);
  1052. else
  1053. _screen->setScreenPalette(palette);
  1054. }
  1055. return 0;
  1056. }
  1057. int KyraEngine_HoF::o2_updateTwoSceneAnims(EMCState *script) {
  1058. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_updateTwoSceneAnims(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
  1059. updateSceneAnim(stackPos(0), stackPos(1));
  1060. updateSceneAnim(stackPos(2), stackPos(3));
  1061. _specialSceneScriptRunFlag = false;
  1062. return 0;
  1063. }
  1064. int KyraEngine_HoF::o2_getRainbowRoomData(EMCState *script) {
  1065. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getRainbowRoomData(%p) (%d)", (const void *)script, stackPos(0));
  1066. return _rainbowRoomData[stackPos(0)];
  1067. }
  1068. int KyraEngine_HoF::o2_drawSceneShapeEx(EMCState *script) {
  1069. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_drawSceneShapeEx(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
  1070. const int itemShape = stackPos(0) + 64;
  1071. const int x = stackPos(1);
  1072. const int y = stackPos(2);
  1073. const bool skipFronUpdate = (stackPos(3) != 0);
  1074. _screen->drawShape(2, _sceneShapeTable[6], x, y, 2, 0);
  1075. _screen->drawShape(2, getShapePtr(itemShape), x+2, y+2, 2, 0);
  1076. if (!skipFronUpdate) {
  1077. _screen->copyRegion(x, y, x, y, 0x15, 0x14, 2, 0, Screen::CR_NO_P_CHECK);
  1078. _screen->updateScreen();
  1079. }
  1080. return 0;
  1081. }
  1082. int KyraEngine_HoF::o2_midiSoundFadeout(EMCState *script) {
  1083. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_midiSoundFadeout(%p) ()", (const void *)script);
  1084. if (!stackPos(0)) {
  1085. if ((_sound->getMusicType() == Sound::kMidiMT32 || _sound->getMusicType() == Sound::kMidiGM) &&
  1086. (_sound->getSfxType() == Sound::kMidiMT32 || _sound->getSfxType() == Sound::kMidiGM)) {
  1087. _sound->beginFadeOut();
  1088. delay(2000, true);
  1089. _lastMusicCommand = -1;
  1090. } else {
  1091. return 0;
  1092. }
  1093. }
  1094. return 1;
  1095. }
  1096. int KyraEngine_HoF::o2_getSfxDriver(EMCState *script) {
  1097. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getSfxDriver(%p) ()", (const void *)script);
  1098. if (_sound->getSfxType() == Sound::kAdLib)
  1099. return 1;
  1100. else if (_sound->getSfxType() == Sound::kPCSpkr)
  1101. return 4;
  1102. else if (_sound->getSfxType() == Sound::kMidiMT32)
  1103. return 6;
  1104. else if (_sound->getSfxType() == Sound::kMidiGM)
  1105. return 7;
  1106. // TODO: find nice default value
  1107. return 0;
  1108. }
  1109. int KyraEngine_HoF::o2_getVocSupport(EMCState *script) {
  1110. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getVocSupport(%p) ()", (const void *)script);
  1111. // we always support VOC file playback
  1112. return 1;
  1113. }
  1114. int KyraEngine_HoF::o2_getMusicDriver(EMCState *script) {
  1115. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getMusicDriver(%p) ()", (const void *)script);
  1116. if (_sound->getMusicType() == Sound::kAdLib)
  1117. return 1;
  1118. else if (_sound->getMusicType() == Sound::kPCSpkr)
  1119. return 4;
  1120. else if (_sound->getMusicType() == Sound::kMidiMT32)
  1121. return 6;
  1122. else if (_sound->getMusicType() == Sound::kMidiGM)
  1123. return 7;
  1124. // TODO: find nice default value
  1125. return 0;
  1126. }
  1127. int KyraEngine_HoF::o2_zanthiaChat(EMCState *script) {
  1128. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_zanthiaChat(%p) ('%s', %d)", (const void *)script, stackPosString(0), stackPos(1));
  1129. objectChat(stackPosString(0), 0, _vocHigh, stackPos(1));
  1130. return 0;
  1131. }
  1132. int KyraEngine_HoF::o2_isVoiceEnabled(EMCState *script) {
  1133. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_isVoiceEnabled(%p) ()", (const void *)script);
  1134. return speechEnabled() ? 1 : 0;
  1135. }
  1136. int KyraEngine_HoF::o2_isVoicePlaying(EMCState *script) {
  1137. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_isVoicePlaying(%p) ()", (const void *)script);
  1138. return (snd_voiceIsPlaying() && !skipFlag()) ? 1 : 0;
  1139. }
  1140. int KyraEngine_HoF::o2_stopVoicePlaying(EMCState *script) {
  1141. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_stopVoicePlaying(%p) ()", (const void *)script);
  1142. snd_stopVoice();
  1143. return 0;
  1144. }
  1145. int KyraEngine_HoF::o2_getGameLanguage(EMCState *script) {
  1146. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_getGameLanguage(%p) ()", (const void *)script);
  1147. return _lang;
  1148. }
  1149. int KyraEngine_HoF::o2_demoFinale(EMCState *script) {
  1150. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_demoFinale(%p) ()", (const void *)script);
  1151. if (!_flags.isDemo)
  1152. return 0;
  1153. int tmpSize;
  1154. const char *const *strings = _staticres->loadStrings(k2IngameTlkDemoStrings, tmpSize);
  1155. assert(strings);
  1156. _screen->clearPage(0);
  1157. _screen->loadPalette("THANKS.COL", _screen->getPalette(0));
  1158. _screen->loadBitmap("THANKS.CPS", 3, 3, 0);
  1159. _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0);
  1160. _screen->_curPage = 0;
  1161. int y = _lang == 1 ? 70 : 65;
  1162. for (int i = 0; i < 6; i++)
  1163. _text->printText(strings[i], _text->getCenterStringX(strings[i], 1, 319), y + i * 10, 255, 207, 0);
  1164. _screen->setScreenPalette(_screen->getPalette(0));
  1165. _screen->updateScreen();
  1166. _eventList.clear();
  1167. while (!skipFlag() && !shouldQuit())
  1168. delay(10);
  1169. _sound->beginFadeOut();
  1170. _screen->fadeToBlack();
  1171. _runFlag = 0;
  1172. return 0;
  1173. }
  1174. int KyraEngine_HoF::o2_dummy(EMCState *script) {
  1175. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2_dummy(%p) ()", (const void *)script);
  1176. return 0;
  1177. }
  1178. #pragma mark -
  1179. int KyraEngine_HoF::o2a_setCharacterFrame(EMCState *script) {
  1180. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::o2a_setCharacterFrame(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
  1181. _animNewFrame = stackPos(0);
  1182. _animDelayTime = stackPos(1);
  1183. _animNeedUpdate = true;
  1184. return 0;
  1185. }
  1186. #pragma mark -
  1187. int KyraEngine_HoF::t2_initChat(const TIM *tim, const uint16 *param) {
  1188. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::t2_initChat(%p, %p) (%d)", (const void *)tim, (const void *)param, param[0]);
  1189. _chatText = (const char *)tim->text + READ_LE_UINT16(tim->text + (param[0] << 1));
  1190. _chatObject = param[1];
  1191. if (_flags.lang == Common::JA_JPN) {
  1192. for (int i = 0; i < _ingameTimJpStrSize; i += 2) {
  1193. if (!scumm_stricmp(_chatText, _ingameTimJpStr[i]))
  1194. _chatText = _ingameTimJpStr[i + 1];
  1195. }
  1196. }
  1197. objectChatInit(_chatText, _chatObject);
  1198. return 0;
  1199. }
  1200. int KyraEngine_HoF::t2_updateSceneAnim(const TIM *tim, const uint16 *param) {
  1201. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::t2_updateSceneAnim(%p, %p) (%d, %d)", (const void *)tim, (const void *)param, param[0], param[1]);
  1202. updateSceneAnim(param[1], param[0]);
  1203. return 0;
  1204. }
  1205. int KyraEngine_HoF::t2_resetChat(const TIM *tim, const uint16 *param) {
  1206. debugC(3, kDebugLevelScriptFuncs, "KyraEngine_HoF::t2_resetChat(%p, %p) ()", (const void *)tim, (const void *)param);
  1207. _text->restoreScreen();
  1208. _c

Large files files are truncated, but you can click here to view the full file