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" 33 #include "common/list.h" 36 class SeekableAudioStream;
59 uint16 protectionAgainstItems[8];
60 uint16 itemProtection;
64 uint16 magicPointsMax;
66 uint16 damageSuffered;
68 uint16 totalMightModifier;
69 uint16 totalProtectionModifier;
72 int16 nextAnimUpdateCountdown;
75 int8 skillModifiers[3];
76 int32 experiencePts[3];
77 uint8 characterUpdateEvents[5];
78 uint8 characterUpdateDelay[5];
81 struct SpellProperty {
92 struct LoLMonsterProperty {
95 uint16 fightingStats[9];
97 uint16 protectionAgainstItems[8];
98 uint16 itemProtection;
100 uint8 speedTotalWaitTicks;
104 uint16 numDistAttacks;
105 uint16 numDistWeapons;
106 uint16 distWeapons[3];
107 uint8 attackSkillChance;
108 uint8 attackSkillType;
109 uint8 defenseSkillChance;
110 uint8 defenseSkillType;
115 uint16 nextAssignedObject;
116 uint16 nextDrawObject;
123 struct LoLMonster :
public LoLObject {
131 uint8 currentSubFrame;
138 uint16 damageReceived;
142 LoLMonsterProperty *properties;
143 uint8 numDistAttacks;
146 uint16 assignedItems;
147 uint8 equipmentShapes[4];
150 struct LoLItem :
public LoLObject {
152 uint16 itemPropertyIndex;
153 uint16 shpCurFrame_flg;
156 struct ItemProperty {
161 uint8 itemScriptFunc;
176 struct LoLButtonDef {
190 const SpellProperty *p;
196 struct FlyingObject {
212 struct FlyingObjectShape {
220 struct MapLegendData {
227 struct LightningProperty {
233 struct FireballState {
234 FireballState(
int i) {
238 tblIndex = ((i * 50) % 255) + 200;
255 struct MistOfDoomAnimData {
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;
271 LoLEngine(
OSystem *system,
const GameFlags &flags);
272 ~LoLEngine()
override;
276 void pauseEngineIntern(
bool pause)
override;
278 Screen *screen()
override;
279 GUI *gui()
const override;
285 TIMInterpreter *_tim;
291 void initStaticResource();
294 void loadItemIconShapes();
300 void registerDefaultSettings()
override;
301 void writeSettings()
override;
302 void readSettings()
override;
304 static const char *
const kMouseKeymapName;
305 static const char *
const kKeyboardKeymapName;
307 const char *
const *_pakFileList;
308 int _pakFileListSize;
311 int _monsterDifficulty;
312 bool _smoothScrollingEnabled;
313 bool _floatingCursorsEnabled;
314 bool _autoSaveNamesEnabled;
318 void update()
override;
321 void setMouseCursorToIcon(
int icon);
322 void setMouseCursorToItemInHand();
323 uint8 *getItemIconShapePtr(
int index);
325 void checkFloatingPointerRegions();
326 int _floatingCursorControl;
327 int _currentFloatingCursor;
330 int processPrologue();
331 void setupPrologueData(
bool load);
335 struct CharacterPrev {
340 static const CharacterPrev _charPreviews[];
341 static const char *
const _charPreviewNamesDefault[];
342 static const char *
const _charPreviewNamesRussianFloppy[];
345 static const uint16 _charPosXPC98[];
346 static const char *
const _charNamesJapanese[];
348 WSAMovie_v2 *_chargenWSA;
349 static const uint8 _chargenFrameTableTalkie[];
350 static const uint8 _chargenFrameTableFloppy[];
351 const uint8 *_chargenFrameTable;
352 int chooseCharacter();
354 void kingSelectionIntro();
355 void kingSelectionReminder();
356 void kingSelectionOutro();
357 void processCharacterSelection();
358 void updateSelectionAnims();
359 int selectionCharInfo(
int character);
362 int getCharSelection();
363 int selectionCharAccept();
365 void showStarcraftLogo();
368 int _charSelectionInfoResult;
370 uint32 _selectionAnimTimers[4];
371 uint8 _selectionAnimFrames[4];
372 static const uint8 _selectionAnimIndexTable[];
374 static const uint16 _selectionPosTable[];
376 static const uint8 _selectionChar1IdxTable[];
377 static const uint8 _selectionChar2IdxTable[];
378 static const uint8 _selectionChar3IdxTable[];
379 static const uint8 _selectionChar4IdxTable[];
381 static const uint8 _reminderChar1IdxTable[];
382 static const uint8 _reminderChar2IdxTable[];
383 static const uint8 _reminderChar3IdxTable[];
384 static const uint8 _reminderChar4IdxTable[];
386 static const uint8 _charInfoFrameTable[];
389 void showOutro(
int character,
bool maxDifficulty);
390 void setupEpilogueData(
bool load);
393 void processCredits(
char *text,
int dimState,
int page,
int delay);
394 void loadOutroShapes(
int file, uint8 **storage);
396 uint8 _outroShapeTable[256];
399 static const char *
const _outroShapeFileTable[];
400 static const uint8 _outroFrameTable[];
402 static const int16 _outroRightMonsterPos[];
403 static const int16 _outroLeftMonsterPos[];
404 static const int16 _outroRightDoorPos[];
405 static const int16 _outroLeftDoorPos[];
407 static const int _outroMonsterScaleTableX[];
408 static const int _outroMonsterScaleTableY[];
412 void pauseDemoPlayer(
bool toggle);
415 void setupTimers()
override;
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);
426 uint8 getClock2Timer(
int index)
override {
return index < _numClock2Timers ? _clock2Timers[index] : 0; }
427 uint8 getNumClock2Timers()
override {
return _numClock2Timers; }
429 static const uint8 _clock2Timers[];
430 static const uint8 _numClock2Timers;
433 int convertVolumeToMixer(
int value)
override;
434 int convertVolumeFromMixer(
int value)
override;
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);
453 int _curMusicFileIndex;
454 char _curMusicFileExt;
455 bool _envSfxUseQueue;
456 int _envSfxNumTracksInQueue;
457 uint16 _envSfxQueuedTracks[10];
458 uint16 _envSfxQueuedBlocks[10];
462 SpeechList _speechList;
467 int _ingameSoundListSize;
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;
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);
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);
507 bool _weaponsDisabled;
508 int _lastButtonShape;
509 uint32 _buttonPressTimer;
510 int _selectedCharacter;
512 int _compassDirectionIndex;
513 uint32 _compassTimer;
514 int _charInventoryUnk;
516 const CompassDef *_compassDefs;
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);
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;
531 LoLButtonDef _sceneWindowButton;
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);
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;
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);
581 TextDisplayer_LoL *_txt;
582 TextDisplayer_rpg *txt()
override {
return _txt; }
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);
592 uint16 _scriptDirection;
593 int16 _globalScriptVars[24];
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);
773 void setupOpcodeTable()
override;
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);
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);
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);
814 uint8 *_levelLangFile;
816 int _lastUsedStringBuffer;
817 char _stringBuffer[5][512];
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);
824 static const char *
const _languageExt[];
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);
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();
842 uint8 **_itemIconShapes;
843 int _numItemIconShapes;
848 uint8 **_thrownShapes;
849 int _numThrownShapes;
850 uint8 **_effectShapes;
851 int _numEffectShapes;
853 const int8 *_gameShapeMap;
855 uint8 *_characterFaceShapes[40][3];
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();
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);
872 void recalcCharacterStats(
int charNum);
873 int calculateCharacterStats(
int charNum,
int index);
874 int calculateProtection(
int index);
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);
880 LoLCharacter *_characters;
881 uint16 _activeCharsXpos[3];
883 int _portraitSpeechAnimMode;
885 uint32 _palUpdateTimer;
886 uint32 _updatePortraitNext;
889 int _activeMagicMenu;
890 uint16 _scriptCharacterCycle;
891 int _charStatsTemp[5];
893 const LoLCharacter *_charDefaults;
894 int _charDefaultsSize;
896 const uint16 *_charDefsMan;
897 const uint16 *_charDefsWoman;
898 const uint16 *_charDefsKieran;
899 const uint16 *_charDefsAkshel;
900 const int32 *_expRequirements;
903 void resetLampStatus();
904 void setLampMode(
bool lampOn);
905 void updateLampStatus();
910 uint32 _lampStatusTimer;
911 bool _lampStatusSuspended;
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);
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);
933 void drawScene(
int pageNum);
934 void drawSceneShapes(
int start = 0);
935 void drawDecorations(
int index);
937 void drawBlockEffects(
int index,
int type);
938 void drawSpecialGuiShape(
int pageNum);
939 void setWallType(
int block,
int wall,
int val);
940 void updateDrawPage2();
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);
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();
949 void updateCompass();
951 void moveParty(uint16 direction,
int unk1,
int unk2,
int buttonShape);
952 void notifyBlockNotPassable(
int scrollFlag);
953 virtual bool checkBlockPassability(uint16 block, uint16 direction);
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);
960 int clickedDoorSwitch(uint16 block, uint16 direction)
override;
961 int clickedNiche(uint16 block, uint16 direction)
override;
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);
971 void pitDropScroll(
int numSteps);
973 void shakeScene(
int duration,
int width,
int height,
int restore);
974 void processGasExplosion(
int soundId);
976 int smoothScrollDrawSpecialGuiShape(
int pageNum);
980 int _smoothScrollModeNormal;
982 const uint8 *_scrollXTop;
983 const uint8 *_scrollYTop;
984 const uint8 *_scrollXBottom;
985 const uint8 *_scrollYBottom;
991 const uint8 *_specialGuiShape;
992 uint16 _specialGuiShapeX;
993 uint16 _specialGuiShapeY;
994 uint16 _specialGuiShapeMirrorFlag;
997 int _lastSpecialColor;
998 int _lastSpecialColorWeight;
1000 uint8 *_transparencyTable2;
1001 uint8 *_transparencyTable1;
1003 int _loadSuppFilesFlag;
1004 uint8 *_wllAutomapData;
1016 int _lastMouseRegion;
1017 int _seqWindowX1, _seqWindowY1, _seqWindowX2, _seqWindowY2, _seqTrigger;
1018 int _spsWindowX, _spsWindowY, _spsWindowW, _spsWindowH;
1020 uint8 *_tempBuffer5120;
1022 const char *
const *_levelDatList;
1023 const char *
const *_levelShpList;
1025 const int8 *_dscWalls;
1027 const uint8 *_dscOvlMap;
1028 const uint8 *_dscShapeOvlIndex;
1029 const uint16 *_dscShapeScaleW;
1030 const uint16 *_dscShapeScaleH;
1031 const int8 *_dscShapeY;
1033 const uint16 *_dscDoorMonsterScaleTable;
1034 const uint16 *_dscDoor4;
1035 const int16 *_dscDoorMonsterX;
1036 const int16 *_dscDoorMonsterY;
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);
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);
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);
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);
1070 uint8 _moneyColumnHeight[5];
1073 LoLItem *_itemsInPlay;
1074 ItemProperty *_itemProperties;
1077 Item _inventory[48];
1078 Item _inventoryCurItem;
1080 int _lastCharInventory;
1081 uint16 _charStatusFlags[3];
1084 FlyingObject *_flyingObjects;
1086 EMCData _itemScript;
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;
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);
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);
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);
1139 LoLMonster *_monsters;
1140 LoLMonsterProperty *_monsterProperties;
1141 uint8 **_monsterDecorationShapes;
1142 uint8 _monsterAnimType[3];
1143 uint16 _monsterCurBlock;
1144 int _objectLastDirection;
1146 const uint16 *_monsterModifiers1;
1147 const uint16 *_monsterModifiers2;
1148 const uint16 *_monsterModifiers3;
1149 const uint16 *_monsterModifiers4;
1151 const int8 *_monsterShiftOffs;
1152 const uint8 *_monsterDirFlags;
1153 const uint8 *_monsterScaleX;
1154 const uint8 *_monsterScaleY;
1155 const uint16 *_monsterScaleWH;
1158 void delay(uint32 millis,
bool doUpdate =
false,
bool isMainLoop =
false)
override;
1160 const KyraRpgGUISettings *guiSettings()
const override;
1162 uint8 _compassBroken;
1164 uint16 _globalScriptVars2[8];
1166 uint8 *_pageBuffer1;
1167 uint8 *_pageBuffer2;
1169 bool _displayLoraPaulsonWorkaroundMsg;
1171 static const KyraRpgGUISettings _guiSettings;
1172 static const KyraRpgGUISettings _guiSettingsZH;
1177 typedef void (LoLEngine::*SpellProcCallback)(WSAMovie_v2 *, int, int);
1179 int castSpell(
int charNum,
int spellType,
int spellLevel);
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);
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);
1207 void callbackProcessMagicSwarm(WSAMovie_v2 *mov,
int x,
int y);
1208 void callbackProcessMagicLightning(WSAMovie_v2 *mov,
int x,
int y);
1210 void drinkBezelCup(
int a,
int charNum);
1212 void addSpellToScroll(
int spell,
int charNum);
1213 void transferSpellToScollAnimation(
int charNum,
int spell,
int slot);
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);
1221 ActiveSpell _activeSpell;
1222 int8 _availableSpells[8];
1224 const SpellProperty *_spellProperties;
1227 LightningProperty *_lightningProps;
1228 int16 _lightningCurSfx;
1229 int16 _lightningDiv;
1230 int16 _lightningFirstSfx;
1231 int16 _lightningSfxFrame;
1233 uint8 *_healOverlay;
1234 uint8 _swarmSpellStatus;
1236 uint8 **_fireballShapes;
1237 int _numFireballShapes;
1238 uint8 **_healShapes;
1240 uint8 **_healiShapes;
1241 int _numHealiShapes;
1243 static const MistOfDoomAnimData _mistAnimData[];
1245 const uint8 *_updateSpellBookCoords;
1246 const uint8 *_updateSpellBookAnimData;
1247 const uint8 *_healShapeFrames;
1248 const int16 *_fireBallCoords;
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();
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();
1267 void launchMagicViper();
1269 void breakIceWall(uint8 *pal1, uint8 *pal2);
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);
1276 int _partyDamageFlags;
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();
1296 uint8 _currentMapLevel;
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;
1308 void setWalkspeed(uint8)
override {}
1309 void removeHandItem()
override {}
1310 bool lineIsPassable(
int,
int)
override {
return false; }
1316 void *generateMonsterTempData(LevelTempData *tmp)
override;
1317 void restoreBlockTempData(
int levelIndex)
override;
1318 void restoreMonsterTempData(LevelTempData *tmp)
override;
1319 void releaseMonsterTempData(LevelTempData *tmp)
override;
1324 class HistoryPlayer {
1326 HistoryPlayer(LoLEngine *vm);
1335 int _x, _y, _width, _height;
1339 void loadWsa(
const char *filename);
1340 void playWsa(
bool direction);
1341 void restoreWsaBkgd();
1345 uint32 _nextFireTime;
1353 #endif // ENABLE_LOL const ModifierTableEntry defaultModifiers[]
Definition: atari-screen.h:60
Definition: algorithm.h:29
Definition: detection.h:27
Definition: atari-screen.h:44