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