PageRenderTime 68ms CodeModel.GetById 33ms RepoModel.GetById 1ms app.codeStats 0ms

/engines/kyra/lol.h

http://github.com/scummvm/scummvm
C Header | 1346 lines | 1093 code | 199 blank | 54 comment | 0 complexity | 66d925c394c42507c6bcf91b08757b21 MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.1, GPL-2.0
  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. #ifdef ENABLE_LOL
  23. #ifndef KYRA_LOL_H
  24. #define KYRA_LOL_H
  25. #include "kyra/kyra_rpg.h"
  26. #include "kyra/script_tim.h"
  27. #include "kyra/script.h"
  28. #include "kyra/gui_lol.h"
  29. #include "kyra/text_lol.h"
  30. #include "common/list.h"
  31. namespace Audio {
  32. class SeekableAudioStream;
  33. } // End of namespace Audio
  34. namespace Kyra {
  35. class Screen_LoL;
  36. class WSAMovie_v2;
  37. struct Button;
  38. struct LoLCharacter {
  39. uint16 flags;
  40. char name[11];
  41. uint8 raceClassSex;
  42. int16 id;
  43. uint8 curFaceFrame;
  44. uint8 tempFaceFrame;
  45. uint8 screamSfx;
  46. const uint16 *defaultModifiers;
  47. uint16 itemsMight[8];
  48. uint16 protectionAgainstItems[8];
  49. uint16 itemProtection;
  50. int16 hitPointsCur;
  51. uint16 hitPointsMax;
  52. int16 magicPointsCur;
  53. uint16 magicPointsMax;
  54. uint8 field_41;
  55. uint16 damageSuffered;
  56. uint16 weaponHit;
  57. uint16 totalMightModifier;
  58. uint16 totalProtectionModifier;
  59. uint16 might;
  60. uint16 protection;
  61. int16 nextAnimUpdateCountdown;
  62. uint16 items[11];
  63. uint8 skillLevels[3];
  64. int8 skillModifiers[3];
  65. int32 experiencePts[3];
  66. uint8 characterUpdateEvents[5];
  67. uint8 characterUpdateDelay[5];
  68. };
  69. struct SpellProperty {
  70. uint16 spellNameCode;
  71. uint16 mpRequired[4];
  72. uint16 field_a;
  73. uint16 field_c;
  74. uint16 hpRequired[4];
  75. uint16 field_16;
  76. uint16 field_18;
  77. uint16 flags;
  78. };
  79. struct LoLMonsterProperty {
  80. uint8 shapeIndex;
  81. uint8 maxWidth;
  82. uint16 fightingStats[9];
  83. uint16 itemsMight[8];
  84. uint16 protectionAgainstItems[8];
  85. uint16 itemProtection;
  86. uint16 hitPoints;
  87. uint8 speedTotalWaitTicks;
  88. uint8 skillLevel;
  89. uint16 flags;
  90. uint16 unk5;
  91. uint16 numDistAttacks;
  92. uint16 numDistWeapons;
  93. uint16 distWeapons[3];
  94. uint8 attackSkillChance;
  95. uint8 attackSkillType;
  96. uint8 defenseSkillChance;
  97. uint8 defenseSkillType;
  98. uint8 sounds[3];
  99. };
  100. struct LoLObject {
  101. uint16 nextAssignedObject;
  102. uint16 nextDrawObject;
  103. uint8 flyingHeight;
  104. uint16 block;
  105. uint16 x;
  106. uint16 y;
  107. };
  108. struct LoLMonster : public LoLObject {
  109. uint8 destDirection;
  110. int8 shiftStep;
  111. uint16 destX;
  112. uint16 destY;
  113. int8 hitOffsX;
  114. int8 hitOffsY;
  115. uint8 currentSubFrame;
  116. uint8 mode;
  117. int8 fightCurTick;
  118. uint8 id;
  119. uint8 direction;
  120. uint8 facing;
  121. uint16 flags;
  122. uint16 damageReceived;
  123. int16 hitPoints;
  124. uint8 speedTick;
  125. uint8 type;
  126. LoLMonsterProperty *properties;
  127. uint8 numDistAttacks;
  128. uint8 curDistWeapon;
  129. int8 distAttackTick;
  130. uint16 assignedItems;
  131. uint8 equipmentShapes[4];
  132. };
  133. struct LoLItem : public LoLObject {
  134. int8 level;
  135. uint16 itemPropertyIndex;
  136. uint16 shpCurFrame_flg;
  137. };
  138. struct ItemProperty {
  139. uint16 nameStringId;
  140. uint8 shpIndex;
  141. uint16 flags;
  142. uint16 type;
  143. uint8 itemScriptFunc;
  144. int8 might;
  145. uint8 skill;
  146. uint8 protection;
  147. uint16 unkB;
  148. uint8 unkD;
  149. };
  150. struct CompassDef {
  151. uint8 shapeIndex;
  152. int8 x;
  153. int8 y;
  154. uint8 flags;
  155. };
  156. struct LoLButtonDef {
  157. uint16 buttonflags;
  158. uint16 keyCode;
  159. uint16 keyCode2;
  160. int16 x;
  161. int16 y;
  162. uint16 w;
  163. uint16 h;
  164. uint16 index;
  165. uint16 screenDim;
  166. };
  167. struct ActiveSpell {
  168. uint8 spell;
  169. const SpellProperty *p;
  170. uint8 charNum;
  171. uint8 level;
  172. uint8 target;
  173. };
  174. struct FlyingObject {
  175. uint8 enable;
  176. uint8 objectType;
  177. uint16 attackerId;
  178. Item item;
  179. uint16 x;
  180. uint16 y;
  181. uint8 flyingHeight;
  182. uint8 direction;
  183. uint8 distance;
  184. int8 field_D;
  185. uint8 c;
  186. uint8 flags;
  187. uint8 wallFlags;
  188. };
  189. struct FlyingObjectShape {
  190. uint8 shapeFront;
  191. uint8 shapeBack;
  192. uint8 shapeLeft;
  193. uint8 drawFlags;
  194. uint8 flipFlags;
  195. };
  196. struct MapLegendData {
  197. uint8 shapeIndex;
  198. bool enable;
  199. int8 y;
  200. uint16 stringId;
  201. };
  202. struct LightningProperty {
  203. uint8 lastFrame;
  204. uint8 frameDiv;
  205. int16 sfxId;
  206. };
  207. struct FireballState {
  208. FireballState(int i) {
  209. active = true;
  210. destX = 200;
  211. destY = 60;
  212. tblIndex = ((i * 50) % 255) + 200;
  213. progress = 1000;
  214. step = 10;
  215. finalize = false;
  216. finProgress = 0;
  217. }
  218. bool active;
  219. int16 destX;
  220. int16 destY;
  221. uint16 tblIndex;
  222. int32 progress;
  223. uint8 step;
  224. bool finalize;
  225. uint8 finProgress;
  226. };
  227. struct MistOfDoomAnimData {
  228. uint8 part1First;
  229. uint8 part1Last;
  230. uint8 part2First;
  231. uint8 part2Last;
  232. uint8 sound;
  233. };
  234. class LoLEngine : public KyraRpgEngine {
  235. friend class GUI_LoL;
  236. friend class TextDisplayer_LoL;
  237. friend class TIMInterpreter_LoL;
  238. friend class TimAnimator;
  239. friend class Debugger_LoL;
  240. friend class HistoryPlayer;
  241. public:
  242. LoLEngine(OSystem *system, const GameFlags &flags);
  243. virtual ~LoLEngine();
  244. virtual void initKeymap();
  245. void pauseEngineIntern(bool pause);
  246. Screen *screen();
  247. GUI *gui() const;
  248. private:
  249. Screen_LoL *_screen;
  250. GUI_LoL *_gui;
  251. TIMInterpreter *_tim;
  252. Common::Error init();
  253. Common::Error go();
  254. // initialization
  255. void initStaticResource();
  256. void preInit();
  257. void loadItemIconShapes();
  258. int mainMenu();
  259. void startup();
  260. void startupNew();
  261. void registerDefaultSettings();
  262. void writeSettings();
  263. void readSettings();
  264. static const char *const kKeymapName;
  265. const char *const *_pakFileList;
  266. int _pakFileListSize;
  267. // options
  268. int _monsterDifficulty;
  269. bool _smoothScrollingEnabled;
  270. bool _floatingCursorsEnabled;
  271. // main loop
  272. void runLoop();
  273. void update();
  274. // mouse
  275. void setMouseCursorToIcon(int icon);
  276. void setMouseCursorToItemInHand();
  277. uint8 *getItemIconShapePtr(int index);
  278. void checkFloatingPointerRegions();
  279. int _floatingCursorControl;
  280. int _currentFloatingCursor;
  281. // intro + character selection
  282. int processPrologue();
  283. void setupPrologueData(bool load);
  284. void showIntro();
  285. struct CharacterPrev {
  286. int x, y;
  287. int attrib[3];
  288. };
  289. static const CharacterPrev _charPreviews[];
  290. static const char *const _charPreviewNamesDefault[];
  291. static const char *const _charPreviewNamesRussianFloppy[];
  292. // PC98/FM-TOWNS specific data
  293. static const uint16 _charPosXPC98[];
  294. static const char *const _charNamesJapanese[];
  295. WSAMovie_v2 *_chargenWSA;
  296. static const uint8 _chargenFrameTableTalkie[];
  297. static const uint8 _chargenFrameTableFloppy[];
  298. const uint8 *_chargenFrameTable;
  299. int chooseCharacter();
  300. void kingSelectionIntro();
  301. void kingSelectionReminder();
  302. void kingSelectionOutro();
  303. void processCharacterSelection();
  304. void updateSelectionAnims();
  305. int selectionCharInfo(int character);
  306. void selectionCharInfoIntro(char *file);
  307. int getCharSelection();
  308. int selectionCharAccept();
  309. void showStarcraftLogo();
  310. int _charSelection;
  311. int _charSelectionInfoResult;
  312. uint32 _selectionAnimTimers[4];
  313. uint8 _selectionAnimFrames[4];
  314. static const uint8 _selectionAnimIndexTable[];
  315. static const uint16 _selectionPosTable[];
  316. static const uint8 _selectionChar1IdxTable[];
  317. static const uint8 _selectionChar2IdxTable[];
  318. static const uint8 _selectionChar3IdxTable[];
  319. static const uint8 _selectionChar4IdxTable[];
  320. static const uint8 _reminderChar1IdxTable[];
  321. static const uint8 _reminderChar2IdxTable[];
  322. static const uint8 _reminderChar3IdxTable[];
  323. static const uint8 _reminderChar4IdxTable[];
  324. static const uint8 _charInfoFrameTable[];
  325. // outro
  326. void showOutro(int character, bool maxDifficulty);
  327. void setupEpilogueData(bool load);
  328. void showCredits();
  329. void processCredits(char *text, int dimState, int page, int delay);
  330. void loadOutroShapes(int file, uint8 **storage);
  331. uint8 _outroShapeTable[256];
  332. // TODO: Consider moving these tables to kyra.dat
  333. static const char *const _outroShapeFileTable[];
  334. static const uint8 _outroFrameTable[];
  335. static const int16 _outroRightMonsterPos[];
  336. static const int16 _outroLeftMonsterPos[];
  337. static const int16 _outroRightDoorPos[];
  338. static const int16 _outroLeftDoorPos[];
  339. static const int _outroMonsterScaleTableX[];
  340. static const int _outroMonsterScaleTableY[];
  341. // Non-interactive demo
  342. int playDemo();
  343. void pauseDemoPlayer(bool toggle);
  344. // timers
  345. void setupTimers();
  346. void timerProcessMonsters(int timerNum);
  347. void timerSpecialCharacterUpdate(int timerNum);
  348. void timerProcessFlyingObjects(int timerNum);
  349. void timerRunSceneAnimScript(int timerNum);
  350. void timerRegeneratePoints(int timerNum);
  351. void timerUpdatePortraitAnimations(int skipUpdate);
  352. void timerUpdateLampState(int timerNum);
  353. void timerFadeMessageText(int timerNum);
  354. uint8 getClock2Timer(int index) { return index < _numClock2Timers ? _clock2Timers[index] : 0; }
  355. uint8 getNumClock2Timers() { return _numClock2Timers; }
  356. static const uint8 _clock2Timers[];
  357. static const uint8 _numClock2Timers;
  358. // sound
  359. int convertVolumeToMixer(int value);
  360. int convertVolumeFromMixer(int value);
  361. void loadTalkFile(int index);
  362. void snd_playVoiceFile(int track) {}
  363. bool snd_playCharacterSpeech(int id, int8 speaker, int);
  364. int snd_updateCharacterSpeech();
  365. void snd_stopSpeech(bool setFlag);
  366. void snd_playSoundEffect(int track, int volume);
  367. bool snd_processEnvironmentalSoundEffect(int soundId, int block);
  368. void snd_queueEnvironmentalSoundEffect(int soundId, int block);
  369. void snd_playQueuedEffects();
  370. void snd_loadSoundFile(int track);
  371. int snd_playTrack(int track);
  372. int snd_stopMusic();
  373. int _lastSpeechId;
  374. int _lastSpeaker;
  375. int _lastSfxTrack;
  376. int _lastMusicTrack;
  377. int _curMusicFileIndex;
  378. char _curMusicFileExt;
  379. bool _envSfxUseQueue;
  380. int _envSfxNumTracksInQueue;
  381. uint16 _envSfxQueuedTracks[10];
  382. uint16 _envSfxQueuedBlocks[10];
  383. int _nextSpeechId;
  384. int _nextSpeaker;
  385. typedef Common::List<Audio::SeekableAudioStream *> SpeechList;
  386. SpeechList _speechList;
  387. int _curTlkFile;
  388. char **_ingameSoundList;
  389. int _ingameSoundListSize;
  390. const uint8 *_musicTrackMap;
  391. const uint16 *_ingameSoundIndex;
  392. int _ingameSoundIndexSize;
  393. const uint8 *_ingameGMSoundIndex;
  394. int _ingameGMSoundIndexSize;
  395. const uint8 *_ingameMT32SoundIndex;
  396. int _ingameMT32SoundIndexSize;
  397. const uint8 *_ingamePCSpeakerSoundIndex;
  398. int _ingamePCSpeakerSoundIndexSize;
  399. // gui
  400. void gui_drawPlayField();
  401. void gui_drawScene(int pageNum);
  402. void gui_drawAllCharPortraitsWithStats();
  403. void gui_drawCharPortraitWithStats(int charNum);
  404. void gui_drawCharFaceShape(int charNum, int x, int y, int pageNum);
  405. void gui_highlightPortraitFrame(int charNum);
  406. void gui_drawLiveMagicBar(int x, int y, int curPoints, int unk, int maxPoints, int w, int h, int col1, int col2, int flag);
  407. void gui_drawMoneyBox(int pageNum);
  408. void gui_drawInventory();
  409. void gui_drawInventoryItem(int index);
  410. void gui_drawCompass();
  411. void gui_drawScroll();
  412. void gui_highlightSelectedSpell(bool mode);
  413. void gui_displayCharInventory(int charNum);
  414. void gui_printCharInventoryStats(int charNum);
  415. void gui_printCharacterStats(int index, int redraw, int value);
  416. void gui_changeCharacterStats(int charNum);
  417. void gui_drawCharInventoryItem(int itemIndex);
  418. int gui_enableControls();
  419. int gui_disableControls(int controlMode);
  420. void gui_toggleButtonDisplayMode(int shapeIndex, int mode);
  421. void gui_toggleFightButtons(bool disable);
  422. void gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags);
  423. void gui_specialSceneSuspendControls(int controlMode);
  424. void gui_specialSceneRestoreControls(int restoreLamp);
  425. bool _weaponsDisabled;
  426. int _lastButtonShape;
  427. uint32 _buttonPressTimer;
  428. int _selectedCharacter;
  429. int _compassStep;
  430. int _compassDirectionIndex;
  431. uint32 _compassTimer;
  432. int _charInventoryUnk;
  433. const CompassDef *_compassDefs;
  434. void gui_updateInput();
  435. void gui_triggerEvent(int eventType);
  436. void gui_enableDefaultPlayfieldButtons();
  437. void gui_enableSequenceButtons(int x, int y, int w, int h, int enableFlags);
  438. void gui_specialSceneRestoreButtons();
  439. void gui_enableCharInventoryButtons(int charNum);
  440. void gui_setFaceFramesControlButtons(int index, int xOffs);
  441. void gui_initCharInventorySpecialButtons(int charNum);
  442. void gui_initMagicScrollButtons();
  443. void gui_initMagicSubmenu(int charNum);
  444. void gui_initButton(int index, int x = -1, int y = -1, int val = -1);
  445. LoLButtonDef _sceneWindowButton;
  446. int clickedUpArrow(Button *button);
  447. int clickedDownArrow(Button *button);
  448. int clickedLeftArrow(Button *button);
  449. int clickedRightArrow(Button *button);
  450. int clickedTurnLeftArrow(Button *button);
  451. int clickedTurnRightArrow(Button *button);
  452. int clickedAttackButton(Button *button);
  453. int clickedMagicButton(Button *button);
  454. int clickedMagicSubmenu(Button *button);
  455. int clickedScreen(Button *button);
  456. int clickedPortraitLeft(Button *button);
  457. int clickedLiveMagicBarsLeft(Button *button);
  458. int clickedPortraitEtcRight(Button *button);
  459. int clickedCharInventorySlot(Button *button);
  460. int clickedExitCharInventory(Button *button);
  461. int clickedSceneDropItem(Button *button);
  462. int clickedScenePickupItem(Button *button);
  463. int clickedInventorySlot(Button *button);
  464. int clickedInventoryScroll(Button *button);
  465. int clickedWall(Button *button);
  466. int clickedSequenceWindow(Button *button);
  467. int clickedScroll(Button *button);
  468. int clickedSpellTargetCharacter(Button *button);
  469. int clickedSpellTargetScene(Button *button);
  470. int clickedSceneThrowItem(Button *button);
  471. int clickedOptions(Button *button);
  472. int clickedRestParty(Button *button);
  473. int clickedMoneyBox(Button *button);
  474. int clickedCompass(Button *button);
  475. int clickedAutomap(Button *button);
  476. int clickedLamp(Button *button);
  477. int clickedStatusIcon(Button *button);
  478. const LoLButtonDef *_buttonData;
  479. const uint8 *_buttonList1;
  480. const uint8 *_buttonList2;
  481. const uint8 *_buttonList3;
  482. const uint8 *_buttonList4;
  483. const uint8 *_buttonList5;
  484. const uint8 *_buttonList6;
  485. const uint8 *_buttonList7;
  486. const uint8 *_buttonList8;
  487. // text
  488. int characterSays(int track, int charId, bool redraw);
  489. int playCharacterScriptChat(int charId, int mode, int restorePortrait, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex);
  490. void setupDialogueButtons(int numStr, const char *s1, const char *s2, const char *s3);
  491. TextDisplayer_LoL *_txt;
  492. TextDisplayer_rpg *txt() { return _txt; }
  493. // emc scripts
  494. void runInitScript(const char *filename, int optionalFunc);
  495. void runInfScript(const char *filename);
  496. void runLevelScript(int block, int flags);
  497. void runLevelScriptCustom(int block, int flags, int charNum, int item, int reg3, int reg4);
  498. EMCData _scriptData;
  499. bool _suspendScript;
  500. uint16 _scriptDirection;
  501. int16 _globalScriptVars[24];
  502. // emc opcode
  503. int olol_setWallType(EMCState *script);
  504. int olol_getWallType(EMCState *script);
  505. int olol_drawScene(EMCState *script);
  506. int olol_rollDice(EMCState *script);
  507. int olol_moveParty(EMCState *script);
  508. int olol_delay(EMCState *script);
  509. int olol_setGameFlag(EMCState *script);
  510. int olol_testGameFlag(EMCState *script);
  511. int olol_loadLevelGraphics(EMCState *script);
  512. int olol_loadBlockProperties(EMCState *script);
  513. int olol_loadMonsterShapes(EMCState *script);
  514. int olol_deleteHandItem(EMCState *script);
  515. int olol_allocItemPropertiesBuffer(EMCState *script);
  516. int olol_setItemProperty(EMCState *script);
  517. int olol_makeItem(EMCState *script);
  518. int olol_placeMoveLevelItem(EMCState *script);
  519. int olol_createLevelItem(EMCState *script);
  520. int olol_getItemPara(EMCState *script);
  521. int olol_getCharacterStat(EMCState *script);
  522. int olol_setCharacterStat(EMCState *script);
  523. int olol_loadLevelShapes(EMCState *script);
  524. int olol_closeLevelShapeFile(EMCState *script);
  525. int olol_loadDoorShapes(EMCState *script);
  526. int olol_initAnimStruct(EMCState *script);
  527. int olol_playAnimationPart(EMCState *script);
  528. int olol_freeAnimStruct(EMCState *script);
  529. int olol_getDirection(EMCState *script);
  530. int olol_characterSurpriseFeedback(EMCState *script);
  531. int olol_setMusicTrack(EMCState *script);
  532. int olol_setSequenceButtons(EMCState *script);
  533. int olol_setDefaultButtonState(EMCState *script);
  534. int olol_checkRectForMousePointer(EMCState *script);
  535. int olol_clearDialogueField(EMCState *script);
  536. int olol_setupBackgroundAnimationPart(EMCState *script);
  537. int olol_startBackgroundAnimation(EMCState *script);
  538. int olol_fadeToBlack(EMCState *script);
  539. int olol_fadePalette(EMCState *script);
  540. int olol_loadBitmap(EMCState *script);
  541. int olol_stopBackgroundAnimation(EMCState *script);
  542. int olol_getGlobalScriptVar(EMCState *script);
  543. int olol_setGlobalScriptVar(EMCState *script);
  544. int olol_getGlobalVar(EMCState *script);
  545. int olol_setGlobalVar(EMCState *script);
  546. int olol_triggerDoorSwitch(EMCState *script);
  547. int olol_checkEquippedItemScriptFlags(EMCState *script);
  548. int olol_setDoorState(EMCState *script);
  549. int olol_updateBlockAnimations(EMCState *script);
  550. int olol_assignLevelDecorationShape(EMCState *script);
  551. int olol_resetBlockShapeAssignment(EMCState *script);
  552. int olol_copyRegion(EMCState *script);
  553. int olol_initMonster(EMCState *script);
  554. int olol_fadeClearSceneWindow(EMCState *script);
  555. int olol_fadeSequencePalette(EMCState *script);
  556. int olol_redrawPlayfield(EMCState *script);
  557. int olol_loadNewLevel(EMCState *script);
  558. int olol_getNearestMonsterFromCharacter(EMCState *script);
  559. int olol_dummy0(EMCState *script);
  560. int olol_loadMonsterProperties(EMCState *script);
  561. int olol_battleHitSkillTest(EMCState *script);
  562. int olol_inflictDamage(EMCState *script);
  563. int olol_moveMonster(EMCState *script);
  564. int olol_setupDialogueButtons(EMCState *script);
  565. int olol_giveTakeMoney(EMCState *script);
  566. int olol_checkMoney(EMCState *script);
  567. int olol_setScriptTimer(EMCState *script);
  568. int olol_createHandItem(EMCState *script);
  569. int olol_playAttackSound(EMCState *script);
  570. int olol_addRemoveCharacter(EMCState *script);
  571. int olol_giveItem(EMCState *script);
  572. int olol_loadTimScript(EMCState *script);
  573. int olol_runTimScript(EMCState *script);
  574. int olol_releaseTimScript(EMCState *script);
  575. int olol_initSceneWindowDialogue(EMCState *script);
  576. int olol_restoreAfterSceneWindowDialogue(EMCState *script);
  577. int olol_getItemInHand(EMCState *script);
  578. int olol_checkMagic(EMCState *script);
  579. int olol_giveItemToMonster(EMCState *script);
  580. int olol_loadLangFile(EMCState *script);
  581. int olol_playSoundEffect(EMCState *script);
  582. int olol_processDialogue(EMCState *script);
  583. int olol_stopTimScript(EMCState *script);
  584. int olol_getWallFlags(EMCState *script);
  585. int olol_changeMonsterStat(EMCState *script);
  586. int olol_getMonsterStat(EMCState *script);
  587. int olol_releaseMonsterShapes(EMCState *script);
  588. int olol_playCharacterScriptChat(EMCState *script);
  589. int olol_playEnvironmentalSfx(EMCState *script);
  590. int olol_update(EMCState *script);
  591. int olol_healCharacter(EMCState *script);
  592. int olol_drawExitButton(EMCState *script);
  593. int olol_loadSoundFile(EMCState *script);
  594. int olol_playMusicTrack(EMCState *script);
  595. int olol_deleteMonstersFromBlock(EMCState *script);
  596. int olol_countBlockItems(EMCState *script);
  597. int olol_characterSkillTest(EMCState *script);
  598. int olol_countAllMonsters(EMCState *script);
  599. int olol_playEndSequence(EMCState *script);
  600. int olol_stopPortraitSpeechAnim(EMCState *script);
  601. int olol_setPaletteBrightness(EMCState *script);
  602. int olol_calcInflictableDamage(EMCState *script);
  603. int olol_getInflictedDamage(EMCState *script);
  604. int olol_checkForCertainPartyMember(EMCState *script);
  605. int olol_printMessage(EMCState *script);
  606. int olol_deleteLevelItem(EMCState *script);
  607. int olol_calcInflictableDamagePerItem(EMCState *script);
  608. int olol_distanceAttack(EMCState *script);
  609. int olol_removeCharacterEffects(EMCState *script);
  610. int olol_checkInventoryFull(EMCState *script);
  611. int olol_moveBlockObjects(EMCState *script);
  612. int olol_addSpellToScroll(EMCState *script);
  613. int olol_playDialogueText(EMCState *script);
  614. int olol_playDialogueTalkText(EMCState *script);
  615. int olol_checkMonsterTypeHostility(EMCState *script);
  616. int olol_setNextFunc(EMCState *script);
  617. int olol_dummy1(EMCState *script);
  618. int olol_suspendMonster(EMCState *script);
  619. int olol_setScriptTextParameter(EMCState *script);
  620. int olol_triggerEventOnMouseButtonClick(EMCState *script);
  621. int olol_printWindowText(EMCState *script);
  622. int olol_countSpecificMonsters(EMCState *script);
  623. int olol_updateBlockAnimations2(EMCState *script);
  624. int olol_checkPartyForItemType(EMCState *script);
  625. int olol_blockDoor(EMCState *script);
  626. int olol_resetTimDialogueState(EMCState *script);
  627. int olol_getItemOnPos(EMCState *script);
  628. int olol_removeLevelItem(EMCState *script);
  629. int olol_savePage5(EMCState *script);
  630. int olol_restorePage5(EMCState *script);
  631. int olol_initDialogueSequence(EMCState *script);
  632. int olol_restoreAfterDialogueSequence(EMCState *script);
  633. int olol_setSpecialSceneButtons(EMCState *script);
  634. int olol_restoreButtonsAfterSpecialScene(EMCState *script);
  635. int olol_prepareSpecialScene(EMCState *script);
  636. int olol_restoreAfterSpecialScene(EMCState *script);
  637. int olol_assignCustomSfx(EMCState *script);
  638. int olol_findAssignedMonster(EMCState *script);
  639. int olol_checkBlockForMonster(EMCState *script);
  640. int olol_crossFadeRegion(EMCState *script);
  641. int olol_calcCoordinatesAddDirectionOffset(EMCState *script);
  642. int olol_resetPortraitsAndDisableSysTimer(EMCState *script);
  643. int olol_enableSysTimer(EMCState *script);
  644. int olol_checkNeedSceneRestore(EMCState *script);
  645. int olol_getNextActiveCharacter(EMCState *script);
  646. int olol_paralyzePoisonCharacter(EMCState *script);
  647. int olol_drawCharPortrait(EMCState *script);
  648. int olol_removeInventoryItem(EMCState *script);
  649. int olol_getAnimationLastPart(EMCState *script);
  650. int olol_assignSpecialGuiShape(EMCState *script);
  651. int olol_findInventoryItem(EMCState *script);
  652. int olol_restoreFadePalette(EMCState *script);
  653. int olol_getSelectedCharacter(EMCState *script);
  654. int olol_setHandItem(EMCState *script);
  655. int olol_drinkBezelCup(EMCState *script);
  656. int olol_changeItemTypeOrFlag(EMCState *script);
  657. int olol_placeInventoryItemInHand(EMCState *script);
  658. int olol_castSpell(EMCState *script);
  659. int olol_pitDrop(EMCState *script);
  660. int olol_increaseSkill(EMCState *script);
  661. int olol_paletteFlash(EMCState *script);
  662. int olol_restoreMagicShroud(EMCState *script);
  663. int olol_disableControls(EMCState *script);
  664. int olol_enableControls(EMCState *script);
  665. int olol_shakeScene(EMCState *script);
  666. int olol_gasExplosion(EMCState *script);
  667. int olol_calcNewBlockPosition(EMCState *script);
  668. int olol_crossFadeScene(EMCState *script);
  669. int olol_updateDrawPage2(EMCState *script);
  670. int olol_setMouseCursor(EMCState *script);
  671. int olol_characterSays(EMCState *script);
  672. int olol_queueSpeech(EMCState *script);
  673. int olol_getItemPrice(EMCState *script);
  674. int olol_getLanguage(EMCState *script);
  675. // tim scripts
  676. TIM *_activeTim[10];
  677. // tim opcode
  678. void setupOpcodeTable();
  679. Common::Array<const TIMOpcode *> _timIntroOpcodes;
  680. int tlol_setupPaletteFade(const TIM *tim, const uint16 *param);
  681. int tlol_loadPalette(const TIM *tim, const uint16 *param);
  682. int tlol_setupPaletteFadeEx(const TIM *tim, const uint16 *param);
  683. int tlol_processWsaFrame(const TIM *tim, const uint16 *param);
  684. int tlol_displayText(const TIM *tim, const uint16 *param);
  685. Common::Array<const TIMOpcode *> _timOutroOpcodes;
  686. int tlol_fadeInScene(const TIM *tim, const uint16 *param);
  687. int tlol_unusedResourceFunc(const TIM *tim, const uint16 *param);
  688. int tlol_fadeInPalette(const TIM *tim, const uint16 *param);
  689. int tlol_fadeSoundOut(const TIM *tim, const uint16 *param);
  690. int tlol_displayAnimFrame(const TIM *tim, const uint16 *param);
  691. int tlol_delayForChat(const TIM *tim, const uint16 *param);
  692. int tlol_fadeOutSound(const TIM *tim, const uint16 *param);
  693. Common::Array<const TIMOpcode *> _timIngameOpcodes;
  694. int tlol_initSceneWindowDialogue(const TIM *tim, const uint16 *param);
  695. int tlol_restoreAfterSceneWindowDialogue(const TIM *tim, const uint16 *param);
  696. int tlol_giveItem(const TIM *tim, const uint16 *param);
  697. int tlol_setPartyPosition(const TIM *tim, const uint16 *param);
  698. int tlol_fadeClearWindow(const TIM *tim, const uint16 *param);
  699. int tlol_copyRegion(const TIM *tim, const uint16 *param);
  700. int tlol_characterChat(const TIM *tim, const uint16 *param);
  701. int tlol_drawScene(const TIM *tim, const uint16 *param);
  702. int tlol_update(const TIM *tim, const uint16 *param);
  703. int tlol_clearTextField(const TIM *tim, const uint16 *param);
  704. int tlol_loadSoundFile(const TIM *tim, const uint16 *param);
  705. int tlol_playMusicTrack(const TIM *tim, const uint16 *param);
  706. int tlol_playDialogueTalkText(const TIM *tim, const uint16 *param);
  707. int tlol_playSoundEffect(const TIM *tim, const uint16 *param);
  708. int tlol_startBackgroundAnimation(const TIM *tim, const uint16 *param);
  709. int tlol_stopBackgroundAnimation(const TIM *tim, const uint16 *param);
  710. // translation
  711. int _lang;
  712. uint8 *_landsFile;
  713. uint8 *_levelLangFile;
  714. int _lastUsedStringBuffer;
  715. char _stringBuffer[5][512]; // TODO: The original used a size of 512, it looks a bit large.
  716. // Maybe we can someday reduce the size.
  717. char *getLangString(uint16 id);
  718. uint8 *getTableEntry(uint8 *buffer, uint16 id);
  719. void decodeSjis(const char *src, char *dst);
  720. int decodeCyrillic(const char *src, char *dst);
  721. static const char *const _languageExt[];
  722. // graphics
  723. void setupScreenDims();
  724. void initSceneWindowDialogue(int controlMode);
  725. void restoreAfterSceneWindowDialogue(int redraw);
  726. void initDialogueSequence(int controlMode, int pageNum);
  727. void restoreAfterDialogueSequence(int controlMode);
  728. void resetPortraitsAndDisableSysTimer();
  729. void toggleSelectedCharacterFrame(bool mode);
  730. void fadeText();
  731. void transformRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage);
  732. void setPaletteBrightness(const Palette &srcPal, int brightness, int modifier);
  733. void generateBrightnessPalette(const Palette &src, Palette &dst, int brightness, int16 modifier);
  734. void generateFlashPalette(const Palette &src, Palette &dst, int colorFlags);
  735. void createTransparencyTables();
  736. void updateSequenceBackgroundAnimations();
  737. uint8 **_itemIconShapes;
  738. int _numItemIconShapes;
  739. uint8 **_itemShapes;
  740. int _numItemShapes;
  741. uint8 **_gameShapes;
  742. int _numGameShapes;
  743. uint8 **_thrownShapes;
  744. int _numThrownShapes;
  745. uint8 **_effectShapes;
  746. int _numEffectShapes;
  747. const int8 *_gameShapeMap;
  748. uint8 *_characterFaceShapes[40][3];
  749. // characters
  750. bool addCharacter(int id);
  751. void setTemporaryFaceFrame(int charNum, int frame, int updateDelay, int redraw);
  752. void setTemporaryFaceFrameForAllCharacters(int frame, int updateDelay, int redraw);
  753. void setCharacterUpdateEvent(int charNum, int updateType, int updateDelay, int overwrite);
  754. int countActiveCharacters();
  755. void loadCharFaceShapes(int charNum, int id);
  756. void calcCharPortraitXpos();
  757. void updatePortraitSpeechAnim();
  758. void stopPortraitSpeechAnim();
  759. void initTextFading(int textType, int clearField);
  760. void setCharFaceFrame(int charNum, int frameNum);
  761. void faceFrameRefresh(int charNum);
  762. void recalcCharacterStats(int charNum);
  763. int calculateCharacterStats(int charNum, int index);
  764. int calculateProtection(int index);
  765. void setCharacterMagicOrHitPoints(int charNum, int type, int points, int mode);
  766. void increaseExperience(int charNum, int skill, uint32 points);
  767. void increaseCharacterHitpoints(int charNum, int points, bool ignoreDeath);
  768. LoLCharacter *_characters;
  769. uint16 _activeCharsXpos[3];
  770. int _portraitSpeechAnimMode;
  771. int _textColorFlag;
  772. uint32 _palUpdateTimer;
  773. uint32 _updatePortraitNext;
  774. int _loadLevelFlag;
  775. int _activeMagicMenu;
  776. uint16 _scriptCharacterCycle;
  777. int _charStatsTemp[5];
  778. const LoLCharacter *_charDefaults;
  779. int _charDefaultsSize;
  780. const uint16 *_charDefsMan;
  781. const uint16 *_charDefsWoman;
  782. const uint16 *_charDefsKieran;
  783. const uint16 *_charDefsAkshel;
  784. const int32 *_expRequirements;
  785. // lamp
  786. void resetLampStatus();
  787. void setLampMode(bool lampOn);
  788. void updateLampStatus();
  789. int8 _lampEffect;
  790. int _brightness;
  791. int _lampOilStatus;
  792. uint32 _lampStatusTimer;
  793. bool _lampStatusSuspended;
  794. // level
  795. void loadLevel(int index);
  796. void addLevelItems();
  797. void loadLevelWallData(int fileIndex, bool mapShapes);
  798. void assignBlockItem(LevelBlockProperty *l, uint16 item);
  799. int assignLevelDecorationShapes(int index);
  800. uint8 *getLevelDecorationShapes(int index);
  801. void releaseDecorations(int first = 0, int num = 400);
  802. void restoreTempDataAdjustMonsterStrength(int index);
  803. void loadBlockProperties(const char *cmzFile);
  804. const uint8 *getBlockFileData(int levelIndex);
  805. void loadLevelShpDat(const char *shpFile, const char *datFile, bool flag);
  806. void loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile);
  807. void resetItems(int flag);
  808. void disableMonsters();
  809. void resetBlockProperties();
  810. bool testWallFlag(int block, int direction, int flag);
  811. bool testWallInvisibility(int block, int direction);
  812. void drawScene(int pageNum);
  813. void drawSceneShapes(int start = 0);
  814. void drawDecorations(int index);
  815. void drawBlockEffects(int index, int type);
  816. void drawSpecialGuiShape(int pageNum);
  817. void setWallType(int block, int wall, int val);
  818. void updateDrawPage2();
  819. void prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag);
  820. int restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode);
  821. void setSequenceButtons(int x, int y, int w, int h, int enableFlags);
  822. void setSpecialSceneButtons(int x, int y, int w, int h, int enableFlags);
  823. void setDefaultButtonState();
  824. void updateCompass();
  825. void moveParty(uint16 direction, int unk1, int unk2, int buttonShape);
  826. void notifyBlockNotPassable(int scrollFlag);
  827. virtual bool checkBlockPassability(uint16 block, uint16 direction);
  828. uint16 calcBlockIndex(uint16 x, uint16 y);
  829. void calcCoordinates(uint16 &x, uint16 &y, int block, uint16 xOffs, uint16 yOffs);
  830. void calcCoordinatesForSingleCharacter(int charNum, uint16 &x, uint16 &y);
  831. void calcCoordinatesAddDirectionOffset(uint16 &x, uint16 &y, int direction);
  832. int clickedDoorSwitch(uint16 block, uint16 direction);
  833. int clickedNiche(uint16 block, uint16 direction);
  834. void movePartySmoothScrollBlocked(int speed);
  835. void movePartySmoothScrollUp(int speed);
  836. void movePartySmoothScrollDown(int speed);
  837. void movePartySmoothScrollLeft(int speed);
  838. void movePartySmoothScrollRight(int speed);
  839. void movePartySmoothScrollTurnLeft(int speed);
  840. void movePartySmoothScrollTurnRight(int speed);
  841. void pitDropScroll(int numSteps);
  842. void shakeScene(int duration, int width, int height, int restore);
  843. void processGasExplosion(int soundId);
  844. int smoothScrollDrawSpecialGuiShape(int pageNum);
  845. int _blockDoor;
  846. int _smoothScrollModeNormal;
  847. const uint8 *_scrollXTop;
  848. const uint8 *_scrollYTop;
  849. const uint8 *_scrollXBottom;
  850. const uint8 *_scrollYBottom;
  851. int _nextScriptFunc;
  852. int _lvlShapeIndex;
  853. bool _partyAwake;
  854. uint8 *_specialGuiShape;
  855. uint16 _specialGuiShapeX;
  856. uint16 _specialGuiShapeY;
  857. uint16 _specialGuiShapeMirrorFlag;
  858. char _lastOverridePalFile[12];
  859. char *_lastOverridePalFilePtr;
  860. int _lastSpecialColor;
  861. int _lastSpecialColorWeight;
  862. uint8 *_transparencyTable2;
  863. uint8 *_transparencyTable1;
  864. int _loadSuppFilesFlag;
  865. uint8 *_wllAutomapData;
  866. uint16 _partyPosX;
  867. uint16 _partyPosY;
  868. Common::SeekableReadStream *_lvlShpFileHandle;
  869. int _shpDmX;
  870. int _shpDmY;
  871. uint16 _dmScaleW;
  872. uint16 _dmScaleH;
  873. int _lastMouseRegion;
  874. int _seqWindowX1, _seqWindowY1, _seqWindowX2, _seqWindowY2, _seqTrigger;
  875. int _spsWindowX, _spsWindowY, _spsWindowW, _spsWindowH;
  876. uint8 *_tempBuffer5120;
  877. const char *const *_levelDatList;
  878. const char *const *_levelShpList;
  879. const int8 *_dscWalls;
  880. const uint8 *_dscOvlMap;
  881. const uint8 *_dscShapeOvlIndex;
  882. const uint16 *_dscShapeScaleW;
  883. const uint16 *_dscShapeScaleH;
  884. const int8 *_dscShapeY;
  885. const uint16 *_dscDoorMonsterScaleTable;
  886. const uint16 *_dscDoor4;
  887. const int16 *_dscDoorMonsterX;
  888. const int16 *_dscDoorMonsterY;
  889. // objects (item/monster common)
  890. LoLObject *findObject(uint16 index);
  891. int calcObjectPosition(LoLObject *obj, uint16 direction);
  892. void removeAssignedObjectFromBlock(LevelBlockProperty *l, uint16 id);
  893. void removeDrawObjectFromBlock(LevelBlockProperty *l, uint16 id);
  894. void assignObjectToBlock(uint16 *assignedBlockObjects, uint16 id);
  895. // items
  896. void giveCredits(int credits, int redraw);
  897. void takeCredits(int credits, int redraw);
  898. Item makeItem(int itemType, int curFrame, int flags);
  899. void placeMoveLevelItem(Item itemIndex, int level, int block, int xOffs, int yOffs, int flyingHeight);
  900. bool addItemToInventory(Item itemIndex);
  901. bool isItemMoveable(Item itemIndex);
  902. void deleteItem(Item itemIndex);
  903. void runItemScript(int charNum, Item item, int flags, int next, int reg4);
  904. void setHandItem(Item itemIndex);
  905. bool itemEquipped(int charNum, uint16 itemType);
  906. void setItemPosition(Item item, uint16 x, uint16 y, int flyingHeight, int moveable);
  907. void removeLevelItem(Item item, int block);
  908. bool launchObject(int objectType, Item item, int startX, int startY, int flyingHeight, int direction, int, int attackerId, int c);
  909. void endObjectFlight(FlyingObject *t, int x, int y, int collisionType);
  910. void processObjectFlight(FlyingObject *t, int x, int y);
  911. void updateObjectFlightPosition(FlyingObject *t);
  912. void objectFlightProcessHits(FlyingObject *t, int x, int y, int collisionType);
  913. void updateFlyingObject(FlyingObject *t);
  914. void assignItemToBlock(uint16 *assignedBlockObjects, int id);
  915. int checkDrawObjectSpace(int x1, int y1, int x2, int y2);
  916. int checkSceneForItems(uint16 *blockDrawObjects, int color);
  917. uint8 _moneyColumnHeight[5];
  918. uint16 _credits;
  919. LoLItem *_itemsInPlay;
  920. ItemProperty *_itemProperties;
  921. Item _itemInHand;
  922. Item _inventory[48];
  923. Item _inventoryCurItem;
  924. int _lastCharInventory;
  925. uint16 _charStatusFlags[3];
  926. int _emcLastItem;
  927. FlyingObject *_flyingObjects;
  928. EMCData _itemScript;
  929. const uint8 *_charInvIndex;
  930. const uint8 *_charInvDefs;
  931. const uint16 *_inventorySlotDesc;
  932. const uint16 *_itemCost;
  933. const uint8 *_stashSetupData;
  934. const int8 *_sceneItemOffs;
  935. const FlyingObjectShape *_flyingItemShapes;
  936. // monsters
  937. void loadMonsterShapes(const char *file, int monsterIndex, int b);
  938. void releaseMonsterShapes(int monsterIndex);
  939. int deleteMonstersFromBlock(int block);
  940. void setMonsterMode(LoLMonster *monster, int mode);
  941. bool updateMonsterAdjustBlocks(LoLMonster *monster);
  942. void placeMonster(LoLMonster *monster, uint16 x, uint16 y);
  943. int calcMonsterDirection(uint16 x1, uint16 y1, uint16 x2, uint16 y2);
  944. void setMonsterDirection(LoLMonster *monster, int dir);
  945. void monsterDropItems(LoLMonster *monster);
  946. void giveItemToMonster(LoLMonster *monster, Item item);
  947. int checkBlockBeforeObjectPlacement(uint16 x, uint16 y, uint16 objectWidth, uint16 testFlag, uint16 wallFlag);
  948. int testBlockPassability(int block, int x, int y, int objectWidth, int testFlag, int wallFlag);
  949. int calcMonsterSkillLevel(int id, int a);
  950. int checkBlockOccupiedByParty(int x, int y, int testFlag);
  951. const uint16 *getCharacterOrMonsterStats(int id);
  952. uint16 *getCharacterOrMonsterItemsMight(int id);
  953. uint16 *getCharacterOrMonsterProtectionAgainstItems(int id);
  954. void drawBlockObjects(int blockArrayIndex);
  955. void drawMonster(uint16 id);
  956. int getMonsterCurFrame(LoLMonster *m, uint16 dirFlags);
  957. void reassignDrawObjects(uint16 direction, uint16 itemIndex, LevelBlockProperty *l, bool flag);
  958. void redrawSceneItem();
  959. void calcSpriteRelPosition(uint16 x1, uint16 y1, int &x2, int &y2, uint16 direction);
  960. void drawDoor(uint8 *shape, uint8 *doorPalette, int index, int unk2, int w, int h, int flags);
  961. void drawDoorOrMonsterEquipment(uint8 *shape, uint8 *objectPalette, int x, int y, int flags, const uint8 *brightnessOverlay);
  962. uint8 *drawItemOrMonster(uint8 *shape, uint8 *monsterPalette, int x, int y, int fineX, int fineY, int flags, int tblValue, bool vflip);
  963. int calcDrawingLayerParameters(int srcX, int srcY, int &x2, int &y2, uint16 &w, uint16 &h, uint8 *shape, int vflip);
  964. void updateMonster(LoLMonster *monster);
  965. void moveMonster(LoLMonster *monster);
  966. void walkMonster(LoLMonster *monster);
  967. bool chasePartyWithDistanceAttacks(LoLMonster *monster);
  968. void chasePartyWithCloseAttacks(LoLMonster *monster);
  969. int walkMonsterCalcNextStep(LoLMonster *monster);
  970. int checkForPossibleDistanceAttack(uint16 monsterBlock, int direction, int distance, uint16 curBlock);
  971. int walkMonsterCheckDest(int x, int y, LoLMonster *monster, int unk);
  972. void getNextStepCoords(int16 monsterX, int16 monsterY, int &newX, int &newY, uint16 direction);
  973. void alignMonsterToParty(LoLMonster *monster);
  974. void moveStrayingMonster(LoLMonster *monster);
  975. void killMonster(LoLMonster *monster);
  976. LoLMonster *_monsters;
  977. LoLMonsterProperty *_monsterProperties;
  978. uint8 **_monsterDecorationShapes;
  979. uint8 _monsterAnimType[3];
  980. uint16 _monsterCurBlock;
  981. int _objectLastDirection;
  982. const uint16 *_monsterModifiers1;
  983. const uint16 *_monsterModifiers2;
  984. const uint16 *_monsterModifiers3;
  985. const uint16 *_monsterModifiers4;
  986. const int8 *_monsterShiftOffs;
  987. const uint8 *_monsterDirFlags;
  988. const uint8 *_monsterScaleX;
  989. const uint8 *_monsterScaleY;
  990. const uint16 *_monsterScaleWH;
  991. // misc
  992. void delay(uint32 millis, bool doUpdate = false, bool isMainLoop = false);
  993. const KyraRpgGUISettings *guiSettings();
  994. uint8 _compassBroken;
  995. uint8 _drainMagic;
  996. uint16 _globalScriptVars2[8];
  997. uint8 *_pageBuffer1;
  998. uint8 *_pageBuffer2;
  999. static const KyraRpgGUISettings _guiSettings;
  1000. // spells
  1001. typedef Common::Functor1Mem<ActiveSpell *, int, LoLEngine> SpellProc;
  1002. Common::Array<const SpellProc *> _spellProcs;
  1003. typedef void (LoLEngine::*SpellProcCallback)(WSAMovie_v2 *, int, int);
  1004. int castSpell(int charNum, int spellType, int spellLevel);
  1005. int castSpark(ActiveSpell *a);
  1006. int castHeal(ActiveSpell *a);
  1007. int castIce(ActiveSpell *a);
  1008. int castFireball(ActiveSpell *a);
  1009. int castHandOfFate(ActiveSpell *a);
  1010. int castMistOfDoom(ActiveSpell *a);
  1011. int castLightning(ActiveSpell *a);
  1012. int castFog(ActiveSpell *a);
  1013. int castSwarm(ActiveSpell *a);
  1014. int castVaelansCube(ActiveSpell *a);
  1015. int castGuardian(ActiveSpell *a);
  1016. int castHealOnSingleCharacter(ActiveSpell *a);
  1017. int processMagicSpark(int charNum, int spellLevel);
  1018. int processMagicHealSelectTarget();
  1019. int processMagicHeal(int charNum, int spellLevel);
  1020. int processMagicIce(int charNum, int spellLevel);
  1021. int processMagicFireball(int charNum, int spellLevel);
  1022. int processMagicHandOfFate(int spellLevel);
  1023. int processMagicMistOfDoom(int charNum, int spellLevel);
  1024. int processMagicLightning(int charNum, int spellLevel);
  1025. int processMagicFog();
  1026. int processMagicSwarm(int charNum, int damage);
  1027. int processMagicVaelansCube();
  1028. int processMagicGuardian(int charNum);
  1029. void callbackProcessMagicSwarm(WSAMovie_v2 *mov, int x, int y);
  1030. void callbackProcessMagicLightning(WSAMovie_v2 *mov, int x, int y);
  1031. void drinkBezelCup(int a, int charNum);
  1032. void addSpellToScroll(int spell, int charNum);
  1033. void transferSpellToScollAnimation(int charNum, int spell, int slot);
  1034. void playSpellAnimation(WSAMovie_v2 *mov, int firstFrame, int lastFrame, int frameDelay, int x, int y, SpellProcCallback callback, uint8 *pal1, uint8 *pal2, int fadeDelay, bool restoreScreen);
  1035. int checkMagic(int charNum, int spellNum, int spellLevel);
  1036. int getSpellTargetBlock(int currentBlock, int direction, int maxDistance, uint16 &targetBlock);
  1037. void inflictMagicalDamage(int target, int attacker, int damage, int index, int hitType);
  1038. void inflictMagicalDamageForBlock(int block, int attacker, int damage, int index);
  1039. ActiveSpell _activeSpell;
  1040. int8 _availableSpells[8];
  1041. int _selectedSpell;
  1042. const SpellProperty *_spellProperties;
  1043. //int _spellPropertiesSize;
  1044. int _subMenuIndex;
  1045. LightningProperty *_lightningProps;
  1046. int16 _lightningCurSfx;
  1047. int16 _lightningDiv;
  1048. int16 _lightningFirstSfx;
  1049. int16 _lightningSfxFrame;
  1050. uint8 *_healOverlay;
  1051. uint8 _swarmSpellStatus;
  1052. uint8 **_fireballShapes;
  1053. int _numFireballShapes;
  1054. uint8 **_healShapes;
  1055. int _numHealShapes;
  1056. uint8 **_healiShapes;
  1057. int _numHealiShapes;
  1058. static const MistOfDoomAnimData _mistAnimData[];
  1059. const uint8 *_updateSpellBookCoords;
  1060. const uint8 *_updateSpellBookAnimData;
  1061. const uint8 *_healShapeFrames;
  1062. const int16 *_fireBallCoords;
  1063. // fight
  1064. int battleHitSkillTest(int16 attacker, int16 target, int skill);
  1065. int calcInflictableDamage(int16 attacker, int16 target, int hitType);
  1066. int inflictDamage(uint16 target, int damage, uint16 attacker, int skill, int flags);
  1067. void characterHitpointsZero(int16 charNum, int a);
  1068. void removeCharacterEffects(LoLCharacter *c, int first, int last);
  1069. int calcInflictableDamagePerItem(int16 attacker, int16 target, uint16 itemMight, int index, int hitType);
  1070. void checkForPartyDeath();
  1071. void applyMonsterAttackSkill(LoLMonster *monster, int16 target, int16 damage);
  1072. void applyMonsterDefenseSkill(LoLMonster *monster, int16 attacker, int flags, int skill, int damage);
  1073. int removeCharacterItem(int charNum, int itemFlags);
  1074. int paralyzePoisonCharacter(int charNum, int typeFlag, int immunityFlags, int hitChance, int redraw);
  1075. void paralyzePoisonAllCharacters(int typeFlag, int immunityFlags, int hitChance);
  1076. void stunCharacter(int charNum);
  1077. void restoreSwampPalette();
  1078. void launchMagicViper();
  1079. void breakIceWall(uint8 *pal1, uint8 *pal2);
  1080. uint16 getNearestMonsterFromCharacter(int charNum);
  1081. uint16 getNearestMonsterFromCharacterForBlock(uint16 block, int charNum);
  1082. uint16 getNearestMonsterFromPos(int x, int y);
  1083. uint16 getNearestPartyMemberFromPos(int x, int y);
  1084. int _partyDamageFlags;
  1085. // magic atlas
  1086. void displayAutomap();
  1087. void updateAutoMap(uint16 block);
  1088. bool updateAutoMapIntern(uint16 block, uint16 x, uint16 y, int16 xOffs, int16 yOffs);
  1089. void loadMapLegendData(int level);
  1090. void drawMapPage(int pageNum);
  1091. bool automapProcessButtons(int inputFlag);
  1092. void automapBackButton();
  1093. void automapForwardButton();
  1094. void redrawMapCursor();
  1095. void drawMapBlockWall(uint16 block, uint8 wall, int x, int y, int direction);
  1096. void drawMapShape(uint8 wall, int x, int y, int direction);
  1097. int mapGetStartPosX();
  1098. int mapGetStartPosY();
  1099. void mapIncludeLegendData(int type);
  1100. void printMapText(uint16 stringId, int x, int y);
  1101. void printMapExitButtonText();
  1102. uint8 _currentMapLevel;
  1103. uint8 *_mapOverlay;
  1104. const uint8 **_automapShapes;
  1105. const uint16 *_autoMapStrings;
  1106. MapLegendData *_defaultLegendData;
  1107. uint8 *_mapCursorOverlay;
  1108. uint8 _automapTopLeftX;
  1109. uint8 _automapTopLeftY;
  1110. static const int8 _mapCoords[12][4];
  1111. bool _mapUpdateNeeded;
  1112. // unneeded
  1113. void setWalkspeed(uint8) {}
  1114. void removeHandItem() {}
  1115. bool lineIsPassable(int, int) { return false; }
  1116. // save
  1117. Common::Error loadGameState(int slot);
  1118. Common::Error saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail);
  1119. void *generateMonsterTempData(LevelTempData *tmp);
  1120. void restoreBlockTempData(int levelIndex);
  1121. void restoreMonsterTempData(LevelTempData *tmp);
  1122. void releaseMonsterTempData(LevelTempData *tmp);
  1123. Graphics::Surface *generateSaveThumbnail() const;
  1124. };
  1125. class HistoryPlayer {
  1126. public:
  1127. HistoryPlayer(LoLEngine *vm);
  1128. ~HistoryPlayer();
  1129. void play();
  1130. private:
  1131. OSystem *_system;
  1132. LoLEngine *_vm;
  1133. Screen *_screen;
  1134. int _x, _y, _width, _height;
  1135. int _frame;
  1136. Movie *_wsa;
  1137. void loadWsa(const char *filename);
  1138. void playWsa(bool direction);
  1139. void restoreWsaBkgd();
  1140. Movie *_fireWsa;
  1141. int _fireFrame;
  1142. uint32 _nextFireTime;
  1143. void updateFire();
  1144. };
  1145. } // End of namespace Kyra
  1146. #endif
  1147. #endif // ENABLE_LOL