scummvm/engines/kyra/lol.h
athrxx da3c385ee3 KYRA: (LOL/FM-TOWNS) some startup code
(let the FM-Towns version load up and run without errors/crashes)
2013-01-09 20:27:37 +01:00

1346 lines
42 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#ifdef ENABLE_LOL
#ifndef KYRA_LOL_H
#define KYRA_LOL_H
#include "kyra/kyra_rpg.h"
#include "kyra/script_tim.h"
#include "kyra/script.h"
#include "kyra/gui_lol.h"
#include "kyra/text_lol.h"
#include "common/list.h"
namespace Audio {
class SeekableAudioStream;
} // End of namespace Audio
namespace Kyra {
class Screen_LoL;
class WSAMovie_v2;
struct Button;
struct LoLCharacter {
uint16 flags;
char name[11];
uint8 raceClassSex;
int16 id;
uint8 curFaceFrame;
uint8 tempFaceFrame;
uint8 screamSfx;
const uint16 *defaultModifiers;
uint16 itemsMight[8];
uint16 protectionAgainstItems[8];
uint16 itemProtection;
int16 hitPointsCur;
uint16 hitPointsMax;
int16 magicPointsCur;
uint16 magicPointsMax;
uint8 field_41;
uint16 damageSuffered;
uint16 weaponHit;
uint16 totalMightModifier;
uint16 totalProtectionModifier;
uint16 might;
uint16 protection;
int16 nextAnimUpdateCountdown;
uint16 items[11];
uint8 skillLevels[3];
int8 skillModifiers[3];
int32 experiencePts[3];
uint8 characterUpdateEvents[5];
uint8 characterUpdateDelay[5];
};
struct SpellProperty {
uint16 spellNameCode;
uint16 mpRequired[4];
uint16 field_a;
uint16 field_c;
uint16 hpRequired[4];
uint16 field_16;
uint16 field_18;
uint16 flags;
};
struct LoLMonsterProperty {
uint8 shapeIndex;
uint8 maxWidth;
uint16 fightingStats[9];
uint16 itemsMight[8];
uint16 protectionAgainstItems[8];
uint16 itemProtection;
uint16 hitPoints;
uint8 speedTotalWaitTicks;
uint8 skillLevel;
uint16 flags;
uint16 unk5;
uint16 numDistAttacks;
uint16 numDistWeapons;
uint16 distWeapons[3];
uint8 attackSkillChance;
uint8 attackSkillType;
uint8 defenseSkillChance;
uint8 defenseSkillType;
uint8 sounds[3];
};
struct LoLObject {
uint16 nextAssignedObject;
uint16 nextDrawObject;
uint8 flyingHeight;
uint16 block;
uint16 x;
uint16 y;
};
struct LoLMonster : public LoLObject {
uint8 destDirection;
int8 shiftStep;
uint16 destX;
uint16 destY;
int8 hitOffsX;
int8 hitOffsY;
uint8 currentSubFrame;
uint8 mode;
int8 fightCurTick;
uint8 id;
uint8 direction;
uint8 facing;
uint16 flags;
uint16 damageReceived;
int16 hitPoints;
uint8 speedTick;
uint8 type;
LoLMonsterProperty *properties;
uint8 numDistAttacks;
uint8 curDistWeapon;
int8 distAttackTick;
uint16 assignedItems;
uint8 equipmentShapes[4];
};
struct LoLItem : public LoLObject {
int8 level;
uint16 itemPropertyIndex;
uint16 shpCurFrame_flg;
};
struct ItemProperty {
uint16 nameStringId;
uint8 shpIndex;
uint16 flags;
uint16 type;
uint8 itemScriptFunc;
int8 might;
uint8 skill;
uint8 protection;
uint16 unkB;
uint8 unkD;
};
struct CompassDef {
uint8 shapeIndex;
int8 x;
int8 y;
uint8 flags;
};
struct LoLButtonDef {
uint16 buttonflags;
uint16 keyCode;
uint16 keyCode2;
int16 x;
int16 y;
uint16 w;
uint16 h;
uint16 index;
uint16 screenDim;
};
struct ActiveSpell {
uint8 spell;
const SpellProperty *p;
uint8 charNum;
uint8 level;
uint8 target;
};
struct FlyingObject {
uint8 enable;
uint8 objectType;
uint16 attackerId;
Item item;
uint16 x;
uint16 y;
uint8 flyingHeight;
uint8 direction;
uint8 distance;
int8 field_D;
uint8 c;
uint8 flags;
uint8 wallFlags;
};
struct FlyingObjectShape {
uint8 shapeFront;
uint8 shapeBack;
uint8 shapeLeft;
uint8 drawFlags;
uint8 flipFlags;
};
struct MapLegendData {
uint8 shapeIndex;
bool enable;
int8 y;
uint16 stringId;
};
struct LightningProperty {
uint8 lastFrame;
uint8 frameDiv;
int16 sfxId;
};
struct FireballState {
FireballState(int i) {
active = true;
destX = 200;
destY = 60;
tblIndex = ((i * 50) % 255) + 200;
progress = 1000;
step = 10;
finalize = false;
finProgress = 0;
}
bool active;
int16 destX;
int16 destY;
uint16 tblIndex;
int32 progress;
uint8 step;
bool finalize;
uint8 finProgress;
};
struct MistOfDoomAnimData {
uint8 part1First;
uint8 part1Last;
uint8 part2First;
uint8 part2Last;
uint8 sound;
};
class LoLEngine : public KyraRpgEngine {
friend class GUI_LoL;
friend class TextDisplayer_LoL;
friend class TIMInterpreter_LoL;
friend class TimAnimator;
friend class Debugger_LoL;
friend class HistoryPlayer;
public:
LoLEngine(OSystem *system, const GameFlags &flags);
virtual ~LoLEngine();
virtual void initKeymap();
void pauseEngineIntern(bool pause);
Screen *screen();
GUI *gui() const;
private:
Screen_LoL *_screen;
GUI_LoL *_gui;
TIMInterpreter *_tim;
Common::Error init();
Common::Error go();
// initialization
void initStaticResource();
void preInit();
void loadItemIconShapes();
int mainMenu();
void startup();
void startupNew();
void registerDefaultSettings();
void writeSettings();
void readSettings();
static const char *const kKeymapName;
const char *const *_pakFileList;
int _pakFileListSize;
// options
int _monsterDifficulty;
bool _smoothScrollingEnabled;
bool _floatingCursorsEnabled;
// main loop
void runLoop();
void update();
// mouse
void setMouseCursorToIcon(int icon);
void setMouseCursorToItemInHand();
uint8 *getItemIconShapePtr(int index);
void checkFloatingPointerRegions();
int _floatingCursorControl;
int _currentFloatingCursor;
// intro + character selection
int processPrologue();
void setupPrologueData(bool load);
void showIntro();
struct CharacterPrev {
int x, y;
int attrib[3];
};
static const CharacterPrev _charPreviews[];
static const char *const _charPreviewNamesDefault[];
static const char *const _charPreviewNamesRussianFloppy[];
// PC98/FM-TOWNS specific data
static const uint16 _charPosXPC98[];
static const char *const _charNamesJapanese[];
WSAMovie_v2 *_chargenWSA;
static const uint8 _chargenFrameTableTalkie[];
static const uint8 _chargenFrameTableFloppy[];
const uint8 *_chargenFrameTable;
int chooseCharacter();
void kingSelectionIntro();
void kingSelectionReminder();
void kingSelectionOutro();
void processCharacterSelection();
void updateSelectionAnims();
int selectionCharInfo(int character);
void selectionCharInfoIntro(char *file);
int getCharSelection();
int selectionCharAccept();
void showStarcraftLogo();
int _charSelection;
int _charSelectionInfoResult;
uint32 _selectionAnimTimers[4];
uint8 _selectionAnimFrames[4];
static const uint8 _selectionAnimIndexTable[];
static const uint16 _selectionPosTable[];
static const uint8 _selectionChar1IdxTable[];
static const uint8 _selectionChar2IdxTable[];
static const uint8 _selectionChar3IdxTable[];
static const uint8 _selectionChar4IdxTable[];
static const uint8 _reminderChar1IdxTable[];
static const uint8 _reminderChar2IdxTable[];
static const uint8 _reminderChar3IdxTable[];
static const uint8 _reminderChar4IdxTable[];
static const uint8 _charInfoFrameTable[];
// outro
void showOutro(int character, bool maxDifficulty);
void setupEpilogueData(bool load);
void showCredits();
void processCredits(char *text, int dimState, int page, int delay);
void loadOutroShapes(int file, uint8 **storage);
uint8 _outroShapeTable[256];
// TODO: Consider moving these tables to kyra.dat
static const char *const _outroShapeFileTable[];
static const uint8 _outroFrameTable[];
static const int16 _outroRightMonsterPos[];
static const int16 _outroLeftMonsterPos[];
static const int16 _outroRightDoorPos[];
static const int16 _outroLeftDoorPos[];
static const int _outroMonsterScaleTableX[];
static const int _outroMonsterScaleTableY[];
// Non-interactive demo
int playDemo();
void pauseDemoPlayer(bool toggle);
// timers
void setupTimers();
void timerProcessMonsters(int timerNum);
void timerSpecialCharacterUpdate(int timerNum);
void timerProcessFlyingObjects(int timerNum);
void timerRunSceneAnimScript(int timerNum);
void timerRegeneratePoints(int timerNum);
void timerUpdatePortraitAnimations(int skipUpdate);
void timerUpdateLampState(int timerNum);
void timerFadeMessageText(int timerNum);
uint8 getClock2Timer(int index) { return index < _numClock2Timers ? _clock2Timers[index] : 0; }
uint8 getNumClock2Timers() { return _numClock2Timers; }
static const uint8 _clock2Timers[];
static const uint8 _numClock2Timers;
// sound
int convertVolumeToMixer(int value);
int convertVolumeFromMixer(int value);
void loadTalkFile(int index);
void snd_playVoiceFile(int track) {}
bool snd_playCharacterSpeech(int id, int8 speaker, int);
int snd_updateCharacterSpeech();
void snd_stopSpeech(bool setFlag);
void snd_playSoundEffect(int track, int volume);
bool snd_processEnvironmentalSoundEffect(int soundId, int block);
void snd_queueEnvironmentalSoundEffect(int soundId, int block);
void snd_playQueuedEffects();
void snd_loadSoundFile(int track);
int snd_playTrack(int track);
int snd_stopMusic();
int _lastSpeechId;
int _lastSpeaker;
int _lastSfxTrack;
int _lastMusicTrack;
int _curMusicFileIndex;
char _curMusicFileExt;
bool _envSfxUseQueue;
int _envSfxNumTracksInQueue;
uint16 _envSfxQueuedTracks[10];
uint16 _envSfxQueuedBlocks[10];
int _nextSpeechId;
int _nextSpeaker;
typedef Common::List<Audio::SeekableAudioStream *> SpeechList;
SpeechList _speechList;
int _curTlkFile;
char **_ingameSoundList;
int _ingameSoundListSize;
const uint8 *_musicTrackMap;
const uint16 *_ingameSoundIndex;
const uint8 *_ingameGMSoundIndex;
int _ingameGMSoundIndexSize;
const uint8 *_ingameMT32SoundIndex;
int _ingameMT32SoundIndexSize;
const uint8 *_ingamePCSpeakerSoundIndex;
int _ingamePCSpeakerSoundIndexSize;
// gui
void gui_drawPlayField();
void gui_drawScene(int pageNum);
void gui_drawAllCharPortraitsWithStats();
void gui_drawCharPortraitWithStats(int charNum);
void gui_drawCharFaceShape(int charNum, int x, int y, int pageNum);
void gui_highlightPortraitFrame(int charNum);
void gui_drawLiveMagicBar(int x, int y, int curPoints, int unk, int maxPoints, int w, int h, int col1, int col2, int flag);
void gui_drawMoneyBox(int pageNum);
void gui_drawInventory();
void gui_drawInventoryItem(int index);
void gui_drawCompass();
void gui_drawScroll();
void gui_highlightSelectedSpell(bool mode);
void gui_displayCharInventory(int charNum);
void gui_printCharInventoryStats(int charNum);
void gui_printCharacterStats(int index, int redraw, int value);
void gui_changeCharacterStats(int charNum);
void gui_drawCharInventoryItem(int itemIndex);
int gui_enableControls();
int gui_disableControls(int controlMode);
void gui_toggleButtonDisplayMode(int shapeIndex, int mode);
void gui_toggleFightButtons(bool disable);
void gui_prepareForSequence(int x, int y, int w, int h, int buttonFlags);
void gui_specialSceneSuspendControls(int controlMode);
void gui_specialSceneRestoreControls(int restoreLamp);
bool _weaponsDisabled;
int _lastButtonShape;
uint32 _buttonPressTimer;
int _selectedCharacter;
int _compassStep;
int _compassDirectionIndex;
uint32 _compassTimer;
int _charInventoryUnk;
const CompassDef *_compassDefs;
void gui_updateInput();
void gui_triggerEvent(int eventType);
void gui_enableDefaultPlayfieldButtons();
void gui_enableSequenceButtons(int x, int y, int w, int h, int enableFlags);
void gui_specialSceneRestoreButtons();
void gui_enableCharInventoryButtons(int charNum);
void gui_setFaceFramesControlButtons(int index, int xOffs);
void gui_initCharInventorySpecialButtons(int charNum);
void gui_initMagicScrollButtons();
void gui_initMagicSubmenu(int charNum);
void gui_initButton(int index, int x = -1, int y = -1, int val = -1);
LoLButtonDef _sceneWindowButton;
int clickedUpArrow(Button *button);
int clickedDownArrow(Button *button);
int clickedLeftArrow(Button *button);
int clickedRightArrow(Button *button);
int clickedTurnLeftArrow(Button *button);
int clickedTurnRightArrow(Button *button);
int clickedAttackButton(Button *button);
int clickedMagicButton(Button *button);
int clickedMagicSubmenu(Button *button);
int clickedScreen(Button *button);
int clickedPortraitLeft(Button *button);
int clickedLiveMagicBarsLeft(Button *button);
int clickedPortraitEtcRight(Button *button);
int clickedCharInventorySlot(Button *button);
int clickedExitCharInventory(Button *button);
int clickedSceneDropItem(Button *button);
int clickedScenePickupItem(Button *button);
int clickedInventorySlot(Button *button);
int clickedInventoryScroll(Button *button);
int clickedWall(Button *button);
int clickedSequenceWindow(Button *button);
int clickedScroll(Button *button);
int clickedSpellTargetCharacter(Button *button);
int clickedSpellTargetScene(Button *button);
int clickedSceneThrowItem(Button *button);
int clickedOptions(Button *button);
int clickedRestParty(Button *button);
int clickedMoneyBox(Button *button);
int clickedCompass(Button *button);
int clickedAutomap(Button *button);
int clickedLamp(Button *button);
int clickedStatusIcon(Button *button);
const LoLButtonDef *_buttonData;
const uint8 *_buttonList1;
const uint8 *_buttonList2;
const uint8 *_buttonList3;
const uint8 *_buttonList4;
const uint8 *_buttonList5;
const uint8 *_buttonList6;
const uint8 *_buttonList7;
const uint8 *_buttonList8;
// text
int characterSays(int track, int charId, bool redraw);
int playCharacterScriptChat(int charId, int mode, int restorePortrait, char *str, EMCState *script, const uint16 *paramList, int16 paramIndex);
void setupDialogueButtons(int numStr, const char *s1, const char *s2, const char *s3);
TextDisplayer_LoL *_txt;
TextDisplayer_rpg *txt() { return _txt; }
// emc scripts
void runInitScript(const char *filename, int optionalFunc);
void runInfScript(const char *filename);
void runLevelScript(int block, int flags);
void runLevelScriptCustom(int block, int flags, int charNum, int item, int reg3, int reg4);
EMCData _scriptData;
bool _suspendScript;
uint16 _scriptDirection;
int16 _globalScriptVars[24];
// emc opcode
int olol_setWallType(EMCState *script);
int olol_getWallType(EMCState *script);
int olol_drawScene(EMCState *script);
int olol_rollDice(EMCState *script);
int olol_moveParty(EMCState *script);
int olol_delay(EMCState *script);
int olol_setGameFlag(EMCState *script);
int olol_testGameFlag(EMCState *script);
int olol_loadLevelGraphics(EMCState *script);
int olol_loadBlockProperties(EMCState *script);
int olol_loadMonsterShapes(EMCState *script);
int olol_deleteHandItem(EMCState *script);
int olol_allocItemPropertiesBuffer(EMCState *script);
int olol_setItemProperty(EMCState *script);
int olol_makeItem(EMCState *script);
int olol_placeMoveLevelItem(EMCState *script);
int olol_createLevelItem(EMCState *script);
int olol_getItemPara(EMCState *script);
int olol_getCharacterStat(EMCState *script);
int olol_setCharacterStat(EMCState *script);
int olol_loadLevelShapes(EMCState *script);
int olol_closeLevelShapeFile(EMCState *script);
int olol_loadDoorShapes(EMCState *script);
int olol_initAnimStruct(EMCState *script);
int olol_playAnimationPart(EMCState *script);
int olol_freeAnimStruct(EMCState *script);
int olol_getDirection(EMCState *script);
int olol_characterSurpriseFeedback(EMCState *script);
int olol_setMusicTrack(EMCState *script);
int olol_setSequenceButtons(EMCState *script);
int olol_setDefaultButtonState(EMCState *script);
int olol_checkRectForMousePointer(EMCState *script);
int olol_clearDialogueField(EMCState *script);
int olol_setupBackgroundAnimationPart(EMCState *script);
int olol_startBackgroundAnimation(EMCState *script);
int olol_fadeToBlack(EMCState *script);
int olol_fadePalette(EMCState *script);
int olol_loadBitmap(EMCState *script);
int olol_stopBackgroundAnimation(EMCState *script);
int olol_getGlobalScriptVar(EMCState *script);
int olol_setGlobalScriptVar(EMCState *script);
int olol_getGlobalVar(EMCState *script);
int olol_setGlobalVar(EMCState *script);
int olol_triggerDoorSwitch(EMCState *script);
int olol_checkEquippedItemScriptFlags(EMCState *script);
int olol_setDoorState(EMCState *script);
int olol_updateBlockAnimations(EMCState *script);
int olol_assignLevelDecorationShape(EMCState *script);
int olol_resetBlockShapeAssignment(EMCState *script);
int olol_copyRegion(EMCState *script);
int olol_initMonster(EMCState *script);
int olol_fadeClearSceneWindow(EMCState *script);
int olol_fadeSequencePalette(EMCState *script);
int olol_redrawPlayfield(EMCState *script);
int olol_loadNewLevel(EMCState *script);
int olol_getNearestMonsterFromCharacter(EMCState *script);
int olol_dummy0(EMCState *script);
int olol_loadMonsterProperties(EMCState *script);
int olol_battleHitSkillTest(EMCState *script);
int olol_inflictDamage(EMCState *script);
int olol_moveMonster(EMCState *script);
int olol_setupDialogueButtons(EMCState *script);
int olol_giveTakeMoney(EMCState *script);
int olol_checkMoney(EMCState *script);
int olol_setScriptTimer(EMCState *script);
int olol_createHandItem(EMCState *script);
int olol_playAttackSound(EMCState *script);
int olol_addRemoveCharacter(EMCState *script);
int olol_giveItem(EMCState *script);
int olol_loadTimScript(EMCState *script);
int olol_runTimScript(EMCState *script);
int olol_releaseTimScript(EMCState *script);
int olol_initSceneWindowDialogue(EMCState *script);
int olol_restoreAfterSceneWindowDialogue(EMCState *script);
int olol_getItemInHand(EMCState *script);
int olol_checkMagic(EMCState *script);
int olol_giveItemToMonster(EMCState *script);
int olol_loadLangFile(EMCState *script);
int olol_playSoundEffect(EMCState *script);
int olol_processDialogue(EMCState *script);
int olol_stopTimScript(EMCState *script);
int olol_getWallFlags(EMCState *script);
int olol_changeMonsterStat(EMCState *script);
int olol_getMonsterStat(EMCState *script);
int olol_releaseMonsterShapes(EMCState *script);
int olol_playCharacterScriptChat(EMCState *script);
int olol_playEnvironmentalSfx(EMCState *script);
int olol_update(EMCState *script);
int olol_healCharacter(EMCState *script);
int olol_drawExitButton(EMCState *script);
int olol_loadSoundFile(EMCState *script);
int olol_playMusicTrack(EMCState *script);
int olol_deleteMonstersFromBlock(EMCState *script);
int olol_countBlockItems(EMCState *script);
int olol_characterSkillTest(EMCState *script);
int olol_countAllMonsters(EMCState *script);
int olol_playEndSequence(EMCState *script);
int olol_stopPortraitSpeechAnim(EMCState *script);
int olol_setPaletteBrightness(EMCState *script);
int olol_calcInflictableDamage(EMCState *script);
int olol_getInflictedDamage(EMCState *script);
int olol_checkForCertainPartyMember(EMCState *script);
int olol_printMessage(EMCState *script);
int olol_deleteLevelItem(EMCState *script);
int olol_calcInflictableDamagePerItem(EMCState *script);
int olol_distanceAttack(EMCState *script);
int olol_removeCharacterEffects(EMCState *script);
int olol_checkInventoryFull(EMCState *script);
int olol_moveBlockObjects(EMCState *script);
int olol_addSpellToScroll(EMCState *script);
int olol_playDialogueText(EMCState *script);
int olol_playDialogueTalkText(EMCState *script);
int olol_checkMonsterTypeHostility(EMCState *script);
int olol_setNextFunc(EMCState *script);
int olol_dummy1(EMCState *script);
int olol_suspendMonster(EMCState *script);
int olol_setScriptTextParameter(EMCState *script);
int olol_triggerEventOnMouseButtonClick(EMCState *script);
int olol_printWindowText(EMCState *script);
int olol_countSpecificMonsters(EMCState *script);
int olol_updateBlockAnimations2(EMCState *script);
int olol_checkPartyForItemType(EMCState *script);
int olol_blockDoor(EMCState *script);
int olol_resetTimDialogueState(EMCState *script);
int olol_getItemOnPos(EMCState *script);
int olol_removeLevelItem(EMCState *script);
int olol_savePage5(EMCState *script);
int olol_restorePage5(EMCState *script);
int olol_initDialogueSequence(EMCState *script);
int olol_restoreAfterDialogueSequence(EMCState *script);
int olol_setSpecialSceneButtons(EMCState *script);
int olol_restoreButtonsAfterSpecialScene(EMCState *script);
int olol_prepareSpecialScene(EMCState *script);
int olol_restoreAfterSpecialScene(EMCState *script);
int olol_assignCustomSfx(EMCState *script);
int olol_findAssignedMonster(EMCState *script);
int olol_checkBlockForMonster(EMCState *script);
int olol_crossFadeRegion(EMCState *script);
int olol_calcCoordinatesAddDirectionOffset(EMCState *script);
int olol_resetPortraitsAndDisableSysTimer(EMCState *script);
int olol_enableSysTimer(EMCState *script);
int olol_checkNeedSceneRestore(EMCState *script);
int olol_getNextActiveCharacter(EMCState *script);
int olol_paralyzePoisonCharacter(EMCState *script);
int olol_drawCharPortrait(EMCState *script);
int olol_removeInventoryItem(EMCState *script);
int olol_getAnimationLastPart(EMCState *script);
int olol_assignSpecialGuiShape(EMCState *script);
int olol_findInventoryItem(EMCState *script);
int olol_restoreFadePalette(EMCState *script);
int olol_getSelectedCharacter(EMCState *script);
int olol_setHandItem(EMCState *script);
int olol_drinkBezelCup(EMCState *script);
int olol_changeItemTypeOrFlag(EMCState *script);
int olol_placeInventoryItemInHand(EMCState *script);
int olol_castSpell(EMCState *script);
int olol_pitDrop(EMCState *script);
int olol_increaseSkill(EMCState *script);
int olol_paletteFlash(EMCState *script);
int olol_restoreMagicShroud(EMCState *script);
int olol_disableControls(EMCState *script);
int olol_enableControls(EMCState *script);
int olol_shakeScene(EMCState *script);
int olol_gasExplosion(EMCState *script);
int olol_calcNewBlockPosition(EMCState *script);
int olol_crossFadeScene(EMCState *script);
int olol_updateDrawPage2(EMCState *script);
int olol_setMouseCursor(EMCState *script);
int olol_characterSays(EMCState *script);
int olol_queueSpeech(EMCState *script);
int olol_getItemPrice(EMCState *script);
int olol_getLanguage(EMCState *script);
// tim scripts
TIM *_activeTim[10];
// tim opcode
void setupOpcodeTable();
Common::Array<const TIMOpcode *> _timIntroOpcodes;
int tlol_setupPaletteFade(const TIM *tim, const uint16 *param);
int tlol_loadPalette(const TIM *tim, const uint16 *param);
int tlol_setupPaletteFadeEx(const TIM *tim, const uint16 *param);
int tlol_processWsaFrame(const TIM *tim, const uint16 *param);
int tlol_displayText(const TIM *tim, const uint16 *param);
Common::Array<const TIMOpcode *> _timOutroOpcodes;
int tlol_fadeInScene(const TIM *tim, const uint16 *param);
int tlol_unusedResourceFunc(const TIM *tim, const uint16 *param);
int tlol_fadeInPalette(const TIM *tim, const uint16 *param);
int tlol_fadeSoundOut(const TIM *tim, const uint16 *param);
int tlol_displayAnimFrame(const TIM *tim, const uint16 *param);
int tlol_delayForChat(const TIM *tim, const uint16 *param);
int tlol_fadeOutSound(const TIM *tim, const uint16 *param);
Common::Array<const TIMOpcode *> _timIngameOpcodes;
int tlol_initSceneWindowDialogue(const TIM *tim, const uint16 *param);
int tlol_restoreAfterSceneWindowDialogue(const TIM *tim, const uint16 *param);
int tlol_giveItem(const TIM *tim, const uint16 *param);
int tlol_setPartyPosition(const TIM *tim, const uint16 *param);
int tlol_fadeClearWindow(const TIM *tim, const uint16 *param);
int tlol_copyRegion(const TIM *tim, const uint16 *param);
int tlol_characterChat(const TIM *tim, const uint16 *param);
int tlol_drawScene(const TIM *tim, const uint16 *param);
int tlol_update(const TIM *tim, const uint16 *param);
int tlol_clearTextField(const TIM *tim, const uint16 *param);
int tlol_loadSoundFile(const TIM *tim, const uint16 *param);
int tlol_playMusicTrack(const TIM *tim, const uint16 *param);
int tlol_playDialogueTalkText(const TIM *tim, const uint16 *param);
int tlol_playSoundEffect(const TIM *tim, const uint16 *param);
int tlol_startBackgroundAnimation(const TIM *tim, const uint16 *param);
int tlol_stopBackgroundAnimation(const TIM *tim, const uint16 *param);
// translation
int _lang;
uint8 *_landsFile;
uint8 *_levelLangFile;
int _lastUsedStringBuffer;
char _stringBuffer[5][512]; // TODO: The original used a size of 512, it looks a bit large.
// Maybe we can someday reduce the size.
char *getLangString(uint16 id);
uint8 *getTableEntry(uint8 *buffer, uint16 id);
void decodeSjis(const char *src, char *dst);
int decodeCyrillic(const char *src, char *dst);
static const char *const _languageExt[];
// graphics
void setupScreenDims();
void initSceneWindowDialogue(int controlMode);
void restoreAfterSceneWindowDialogue(int redraw);
void initDialogueSequence(int controlMode, int pageNum);
void restoreAfterDialogueSequence(int controlMode);
void resetPortraitsAndDisableSysTimer();
void toggleSelectedCharacterFrame(bool mode);
void fadeText();
void transformRegion(int x1, int y1, int x2, int y2, int w, int h, int srcPage, int dstPage);
void setPaletteBrightness(const Palette &srcPal, int brightness, int modifier);
void generateBrightnessPalette(const Palette &src, Palette &dst, int brightness, int16 modifier);
void generateFlashPalette(const Palette &src, Palette &dst, int colorFlags);
void createTransparencyTables();
void updateSequenceBackgroundAnimations();
uint8 **_itemIconShapes;
int _numItemIconShapes;
uint8 **_itemShapes;
int _numItemShapes;
uint8 **_gameShapes;
int _numGameShapes;
uint8 **_thrownShapes;
int _numThrownShapes;
uint8 **_effectShapes;
int _numEffectShapes;
const int8 *_gameShapeMap;
uint8 *_characterFaceShapes[40][3];
// characters
bool addCharacter(int id);
void setTemporaryFaceFrame(int charNum, int frame, int updateDelay, int redraw);
void setTemporaryFaceFrameForAllCharacters(int frame, int updateDelay, int redraw);
void setCharacterUpdateEvent(int charNum, int updateType, int updateDelay, int overwrite);
int countActiveCharacters();
void loadCharFaceShapes(int charNum, int id);
void calcCharPortraitXpos();
void updatePortraitSpeechAnim();
void stopPortraitSpeechAnim();
void initTextFading(int textType, int clearField);
void setCharFaceFrame(int charNum, int frameNum);
void faceFrameRefresh(int charNum);
void recalcCharacterStats(int charNum);
int calculateCharacterStats(int charNum, int index);
int calculateProtection(int index);
void setCharacterMagicOrHitPoints(int charNum, int type, int points, int mode);
void increaseExperience(int charNum, int skill, uint32 points);
void increaseCharacterHitpoints(int charNum, int points, bool ignoreDeath);
LoLCharacter *_characters;
uint16 _activeCharsXpos[3];
int _portraitSpeechAnimMode;
int _textColorFlag;
uint32 _palUpdateTimer;
uint32 _updatePortraitNext;
int _loadLevelFlag;
int _activeMagicMenu;
uint16 _scriptCharacterCycle;
int _charStatsTemp[5];
const LoLCharacter *_charDefaults;
int _charDefaultsSize;
const uint16 *_charDefsMan;
const uint16 *_charDefsWoman;
const uint16 *_charDefsKieran;
const uint16 *_charDefsAkshel;
const int32 *_expRequirements;
// lamp
void resetLampStatus();
void setLampMode(bool lampOn);
void updateLampStatus();
int8 _lampEffect;
int _brightness;
int _lampOilStatus;
uint32 _lampStatusTimer;
bool _lampStatusSuspended;
// level
void loadLevel(int index);
void addLevelItems();
void loadLevelWallData(int fileIndex, bool mapShapes);
void assignBlockItem(LevelBlockProperty *l, uint16 item);
int assignLevelDecorationShapes(int index);
uint8 *getLevelDecorationShapes(int index);
void releaseDecorations(int first = 0, int num = 400);
void restoreTempDataAdjustMonsterStrength(int index);
void loadBlockProperties(const char *cmzFile);
const uint8 *getBlockFileData(int levelIndex);
void loadLevelShpDat(const char *shpFile, const char *datFile, bool flag);
void loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile);
void resetItems(int flag);
void disableMonsters();
void resetBlockProperties();
bool testWallFlag(int block, int direction, int flag);
bool testWallInvisibility(int block, int direction);
void drawScene(int pageNum);
void drawSceneShapes(int start = 0);
void drawDecorations(int index);
void drawBlockEffects(int index, int type);
void drawSpecialGuiShape(int pageNum);
void setWallType(int block, int wall, int val);
void updateDrawPage2();
void prepareSpecialScene(int fieldType, int hasDialogue, int suspendGui, int allowSceneUpdate, int controlMode, int fadeFlag);
int restoreAfterSpecialScene(int fadeFlag, int redrawPlayField, int releaseTimScripts, int sceneUpdateMode);
void setSequenceButtons(int x, int y, int w, int h, int enableFlags);
void setSpecialSceneButtons(int x, int y, int w, int h, int enableFlags);
void setDefaultButtonState();
void updateCompass();
void moveParty(uint16 direction, int unk1, int unk2, int buttonShape);
void notifyBlockNotPassable(int scrollFlag);
virtual bool checkBlockPassability(uint16 block, uint16 direction);
uint16 calcBlockIndex(uint16 x, uint16 y);
void calcCoordinates(uint16 &x, uint16 &y, int block, uint16 xOffs, uint16 yOffs);
void calcCoordinatesForSingleCharacter(int charNum, uint16 &x, uint16 &y);
void calcCoordinatesAddDirectionOffset(uint16 &x, uint16 &y, int direction);
int clickedDoorSwitch(uint16 block, uint16 direction);
int clickedNiche(uint16 block, uint16 direction);
void movePartySmoothScrollBlocked(int speed);
void movePartySmoothScrollUp(int speed);
void movePartySmoothScrollDown(int speed);
void movePartySmoothScrollLeft(int speed);
void movePartySmoothScrollRight(int speed);
void movePartySmoothScrollTurnLeft(int speed);
void movePartySmoothScrollTurnRight(int speed);
void pitDropScroll(int numSteps);
void shakeScene(int duration, int width, int height, int restore);
void processGasExplosion(int soundId);
int smoothScrollDrawSpecialGuiShape(int pageNum);
int _blockDoor;
int _smoothScrollModeNormal;
const uint8 *_scrollXTop;
const uint8 *_scrollYTop;
const uint8 *_scrollXBottom;
const uint8 *_scrollYBottom;
int _nextScriptFunc;
int _lvlShapeIndex;
bool _partyAwake;
uint8 *_specialGuiShape;
uint16 _specialGuiShapeX;
uint16 _specialGuiShapeY;
uint16 _specialGuiShapeMirrorFlag;
char _lastOverridePalFile[12];
char *_lastOverridePalFilePtr;
int _lastSpecialColor;
int _lastSpecialColorWeight;
uint8 *_transparencyTable2;
uint8 *_transparencyTable1;
int _loadSuppFilesFlag;
uint8 *_wllAutomapData;
uint16 _partyPosX;
uint16 _partyPosY;
Common::SeekableReadStream *_lvlShpFileHandle;
int _shpDmX;
int _shpDmY;
uint16 _dmScaleW;
uint16 _dmScaleH;
int _lastMouseRegion;
int _seqWindowX1, _seqWindowY1, _seqWindowX2, _seqWindowY2, _seqTrigger;
int _spsWindowX, _spsWindowY, _spsWindowW, _spsWindowH;
uint8 *_tempBuffer5120;
const char *const *_levelDatList;
const char *const *_levelShpList;
const int8 *_dscWalls;
const uint8 *_dscOvlMap;
const uint8 *_dscShapeOvlIndex;
const uint16 *_dscShapeScaleW;
const uint16 *_dscShapeScaleH;
const int8 *_dscShapeY;
const uint16 *_dscDoorMonsterScaleTable;
const uint16 *_dscDoor4;
const int16 *_dscDoorMonsterX;
const int16 *_dscDoorMonsterY;
// objects (item/monster common)
LoLObject *findObject(uint16 index);
int calcObjectPosition(LoLObject *obj, uint16 direction);
void removeAssignedObjectFromBlock(LevelBlockProperty *l, uint16 id);
void removeDrawObjectFromBlock(LevelBlockProperty *l, uint16 id);
void assignObjectToBlock(uint16 *assignedBlockObjects, uint16 id);
// items
void giveCredits(int credits, int redraw);
void takeCredits(int credits, int redraw);
Item makeItem(int itemType, int curFrame, int flags);
void placeMoveLevelItem(Item itemIndex, int level, int block, int xOffs, int yOffs, int flyingHeight);
bool addItemToInventory(Item itemIndex);
bool isItemMoveable(Item itemIndex);
void deleteItem(Item itemIndex);
void runItemScript(int charNum, Item item, int flags, int next, int reg4);
void setHandItem(Item itemIndex);
bool itemEquipped(int charNum, uint16 itemType);
void setItemPosition(Item item, uint16 x, uint16 y, int flyingHeight, int moveable);
void removeLevelItem(Item item, int block);
bool launchObject(int objectType, Item item, int startX, int startY, int flyingHeight, int direction, int, int attackerId, int c);
void endObjectFlight(FlyingObject *t, int x, int y, int collisionType);
void processObjectFlight(FlyingObject *t, int x, int y);
void updateObjectFlightPosition(FlyingObject *t);
void objectFlightProcessHits(FlyingObject *t, int x, int y, int collisionType);
void updateFlyingObject(FlyingObject *t);
void assignItemToBlock(uint16 *assignedBlockObjects, int id);
int checkDrawObjectSpace(int x1, int y1, int x2, int y2);
int checkSceneForItems(uint16 *blockDrawObjects, int color);
uint8 _moneyColumnHeight[5];
uint16 _credits;
LoLItem *_itemsInPlay;
ItemProperty *_itemProperties;
Item _itemInHand;
Item _inventory[48];
Item _inventoryCurItem;
int _lastCharInventory;
uint16 _charStatusFlags[3];
int _emcLastItem;
FlyingObject *_flyingObjects;
EMCData _itemScript;
const uint8 *_charInvIndex;
const uint8 *_charInvDefs;
const uint16 *_inventorySlotDesc;
const uint16 *_itemCost;
const uint8 *_stashSetupData;
const int8 *_sceneItemOffs;
const FlyingObjectShape *_flyingItemShapes;
// monsters
void loadMonsterShapes(const char *file, int monsterIndex, int b);
void releaseMonsterShapes(int monsterIndex);
int deleteMonstersFromBlock(int block);
void setMonsterMode(LoLMonster *monster, int mode);
bool updateMonsterAdjustBlocks(LoLMonster *monster);
void placeMonster(LoLMonster *monster, uint16 x, uint16 y);
int calcMonsterDirection(uint16 x1, uint16 y1, uint16 x2, uint16 y2);
void setMonsterDirection(LoLMonster *monster, int dir);
void monsterDropItems(LoLMonster *monster);
void giveItemToMonster(LoLMonster *monster, Item item);
int checkBlockBeforeObjectPlacement(uint16 x, uint16 y, uint16 objectWidth, uint16 testFlag, uint16 wallFlag);
int testBlockPassability(int block, int x, int y, int objectWidth, int testFlag, int wallFlag);
int calcMonsterSkillLevel(int id, int a);
int checkBlockOccupiedByParty(int x, int y, int testFlag);
const uint16 *getCharacterOrMonsterStats(int id);
uint16 *getCharacterOrMonsterItemsMight(int id);
uint16 *getCharacterOrMonsterProtectionAgainstItems(int id);
void drawBlockObjects(int blockArrayIndex);
void drawMonster(uint16 id);
int getMonsterCurFrame(LoLMonster *m, uint16 dirFlags);
void reassignDrawObjects(uint16 direction, uint16 itemIndex, LevelBlockProperty *l, bool flag);
void redrawSceneItem();
void calcSpriteRelPosition(uint16 x1, uint16 y1, int &x2, int &y2, uint16 direction);
void drawDoor(uint8 *shape, uint8 *doorPalette, int index, int unk2, int w, int h, int flags);
void drawDoorOrMonsterEquipment(uint8 *shape, uint8 *objectPalette, int x, int y, int flags, const uint8 *brightnessOverlay);
uint8 *drawItemOrMonster(uint8 *shape, uint8 *monsterPalette, int x, int y, int fineX, int fineY, int flags, int tblValue, bool vflip);
int calcDrawingLayerParameters(int srcX, int srcY, int &x2, int &y2, uint16 &w, uint16 &h, uint8 *shape, int vflip);
void updateMonster(LoLMonster *monster);
void moveMonster(LoLMonster *monster);
void walkMonster(LoLMonster *monster);
bool chasePartyWithDistanceAttacks(LoLMonster *monster);
void chasePartyWithCloseAttacks(LoLMonster *monster);
int walkMonsterCalcNextStep(LoLMonster *monster);
int checkForPossibleDistanceAttack(uint16 monsterBlock, int direction, int distance, uint16 curBlock);
int walkMonsterCheckDest(int x, int y, LoLMonster *monster, int unk);
void getNextStepCoords(int16 monsterX, int16 monsterY, int &newX, int &newY, uint16 direction);
void alignMonsterToParty(LoLMonster *monster);
void moveStrayingMonster(LoLMonster *monster);
void killMonster(LoLMonster *monster);
LoLMonster *_monsters;
LoLMonsterProperty *_monsterProperties;
uint8 **_monsterDecorationShapes;
uint8 _monsterAnimType[3];
uint16 _monsterCurBlock;
int _objectLastDirection;
const uint16 *_monsterModifiers1;
const uint16 *_monsterModifiers2;
const uint16 *_monsterModifiers3;
const uint16 *_monsterModifiers4;
const int8 *_monsterShiftOffs;
const uint8 *_monsterDirFlags;
const uint8 *_monsterScaleX;
const uint8 *_monsterScaleY;
const uint16 *_monsterScaleWH;
// misc
void delay(uint32 millis, bool doUpdate = false, bool isMainLoop = false);
const KyraRpgGUISettings *guiSettings();
uint8 _compassBroken;
uint8 _drainMagic;
uint16 _globalScriptVars2[8];
uint8 *_pageBuffer1;
uint8 *_pageBuffer2;
static const KyraRpgGUISettings _guiSettings;
// spells
typedef Common::Functor1Mem<ActiveSpell *, int, LoLEngine> SpellProc;
Common::Array<const SpellProc *> _spellProcs;
typedef void (LoLEngine::*SpellProcCallback)(WSAMovie_v2 *, int, int);
int castSpell(int charNum, int spellType, int spellLevel);
int castSpark(ActiveSpell *a);
int castHeal(ActiveSpell *a);
int castIce(ActiveSpell *a);
int castFireball(ActiveSpell *a);
int castHandOfFate(ActiveSpell *a);
int castMistOfDoom(ActiveSpell *a);
int castLightning(ActiveSpell *a);
int castFog(ActiveSpell *a);
int castSwarm(ActiveSpell *a);
int castVaelansCube(ActiveSpell *a);
int castGuardian(ActiveSpell *a);
int castHealOnSingleCharacter(ActiveSpell *a);
int processMagicSpark(int charNum, int spellLevel);
int processMagicHealSelectTarget();
int processMagicHeal(int charNum, int spellLevel);
int processMagicIce(int charNum, int spellLevel);
int processMagicFireball(int charNum, int spellLevel);
int processMagicHandOfFate(int spellLevel);
int processMagicMistOfDoom(int charNum, int spellLevel);
int processMagicLightning(int charNum, int spellLevel);
int processMagicFog();
int processMagicSwarm(int charNum, int damage);
int processMagicVaelansCube();
int processMagicGuardian(int charNum);
void callbackProcessMagicSwarm(WSAMovie_v2 *mov, int x, int y);
void callbackProcessMagicLightning(WSAMovie_v2 *mov, int x, int y);
void drinkBezelCup(int a, int charNum);
void addSpellToScroll(int spell, int charNum);
void transferSpellToScollAnimation(int charNum, int spell, int slot);
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);
int checkMagic(int charNum, int spellNum, int spellLevel);
int getSpellTargetBlock(int currentBlock, int direction, int maxDistance, uint16 &targetBlock);
void inflictMagicalDamage(int target, int attacker, int damage, int index, int hitType);
void inflictMagicalDamageForBlock(int block, int attacker, int damage, int index);
ActiveSpell _activeSpell;
int8 _availableSpells[8];
int _selectedSpell;
const SpellProperty *_spellProperties;
//int _spellPropertiesSize;
int _subMenuIndex;
LightningProperty *_lightningProps;
int16 _lightningCurSfx;
int16 _lightningDiv;
int16 _lightningFirstSfx;
int16 _lightningSfxFrame;
uint8 *_healOverlay;
uint8 _swarmSpellStatus;
uint8 **_fireballShapes;
int _numFireballShapes;
uint8 **_healShapes;
int _numHealShapes;
uint8 **_healiShapes;
int _numHealiShapes;
static const MistOfDoomAnimData _mistAnimData[];
const uint8 *_updateSpellBookCoords;
const uint8 *_updateSpellBookAnimData;
const uint8 *_healShapeFrames;
const int16 *_fireBallCoords;
// fight
int battleHitSkillTest(int16 attacker, int16 target, int skill);
int calcInflictableDamage(int16 attacker, int16 target, int hitType);
int inflictDamage(uint16 target, int damage, uint16 attacker, int skill, int flags);
void characterHitpointsZero(int16 charNum, int a);
void removeCharacterEffects(LoLCharacter *c, int first, int last);
int calcInflictableDamagePerItem(int16 attacker, int16 target, uint16 itemMight, int index, int hitType);
void checkForPartyDeath();
void applyMonsterAttackSkill(LoLMonster *monster, int16 target, int16 damage);
void applyMonsterDefenseSkill(LoLMonster *monster, int16 attacker, int flags, int skill, int damage);
int removeCharacterItem(int charNum, int itemFlags);
int paralyzePoisonCharacter(int charNum, int typeFlag, int immunityFlags, int hitChance, int redraw);
void paralyzePoisonAllCharacters(int typeFlag, int immunityFlags, int hitChance);
void stunCharacter(int charNum);
void restoreSwampPalette();
void launchMagicViper();
void breakIceWall(uint8 *pal1, uint8 *pal2);
uint16 getNearestMonsterFromCharacter(int charNum);
uint16 getNearestMonsterFromCharacterForBlock(uint16 block, int charNum);
uint16 getNearestMonsterFromPos(int x, int y);
uint16 getNearestPartyMemberFromPos(int x, int y);
int _partyDamageFlags;
// magic atlas
void displayAutomap();
void updateAutoMap(uint16 block);
bool updateAutoMapIntern(uint16 block, uint16 x, uint16 y, int16 xOffs, int16 yOffs);
void loadMapLegendData(int level);
void drawMapPage(int pageNum);
bool automapProcessButtons(int inputFlag);
void automapBackButton();
void automapForwardButton();
void redrawMapCursor();
void drawMapBlockWall(uint16 block, uint8 wall, int x, int y, int direction);
void drawMapShape(uint8 wall, int x, int y, int direction);
int mapGetStartPosX();
int mapGetStartPosY();
void mapIncludeLegendData(int type);
void printMapText(uint16 stringId, int x, int y);
void printMapExitButtonText();
uint8 _currentMapLevel;
uint8 *_mapOverlay;
const uint8 **_automapShapes;
const uint16 *_autoMapStrings;
MapLegendData *_defaultLegendData;
uint8 *_mapCursorOverlay;
uint8 _automapTopLeftX;
uint8 _automapTopLeftY;
static const int8 _mapCoords[12][4];
bool _mapUpdateNeeded;
// unneeded
void setWalkspeed(uint8) {}
void removeHandItem() {}
bool lineIsPassable(int, int) { return false; }
// save
Common::Error loadGameState(int slot);
Common::Error saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail);
void *generateMonsterTempData(LevelTempData *tmp);
void restoreBlockTempData(int levelIndex);
void restoreMonsterTempData(LevelTempData *tmp);
void releaseMonsterTempData(LevelTempData *tmp);
Graphics::Surface *generateSaveThumbnail() const;
};
class HistoryPlayer {
public:
HistoryPlayer(LoLEngine *vm);
~HistoryPlayer();
void play();
private:
OSystem *_system;
LoLEngine *_vm;
Screen *_screen;
int _x, _y, _width, _height;
int _frame;
Movie *_wsa;
void loadWsa(const char *filename);
void playWsa(bool direction);
void restoreWsaBkgd();
Movie *_fireWsa;
int _fireFrame;
uint32 _nextFireTime;
void updateFire();
};
} // End of namespace Kyra
#endif
#endif // ENABLE_LOL