scummvm/engines/kyra/kyra_rpg.h

388 lines
9.9 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.
*
*/
#ifndef KYRA_RPG_H
#define KYRA_RPG_H
#if defined(ENABLE_EOB) || defined(ENABLE_LOL)
#include "kyra/kyra_v1.h"
#include "kyra/screen_eob.h"
#include "kyra/gui_eob.h"
#include "kyra/text_lol.h"
namespace Kyra {
struct LevelDecorationProperty {
uint16 shapeIndex[10];
uint8 scaleFlag[10];
int16 shapeX[10];
int16 shapeY[10];
int8 next;
uint8 flags;
};
struct LevelBlockProperty {
uint8 walls[4];
uint16 assignedObjects;
uint16 drawObjects;
uint8 direction;
uint16 flags;
};
struct OpenDoorState {
uint16 block;
int8 wall;
int8 state;
};
struct LevelTempData {
uint8 *wallsXorData;
uint16 *flags;
void *monsters;
void *flyingObjects;
void *wallsOfForce;
uint8 monsterDifficulty;
};
struct EoBFlyingObject {
uint8 enable;
uint8 objectType;
int16 attackerId;
Item item;
uint16 curBlock;
uint16 starting;
uint8 u1;
uint8 direction;
uint8 distance;
int8 callBackIndex;
uint8 curPos;
uint8 flags;
uint8 unused;
};
struct KyraRpgGUISettings {
struct DialogueButtons {
uint8 labelColor1;
uint8 labelColor2;
uint16 width;
uint16 height;
int waitReserve;
uint16 waitX[2];
uint8 waitY[2];
uint16 waitWidth[2];
} buttons;
struct Colors {
uint8 frame1;
uint8 frame2;
int fill;
uint8 unused;
uint8 barGraph;
uint8 warningFrame1;
uint8 warningFrame2;
int warningFill;
uint8 extraFrame1;
uint8 extraFrame2;
int extraFill;
uint8 inactiveTabFrame1;
uint8 inactiveTabFrame2;
int inactiveTabFill;
} colors;
};
class KyraRpgEngine : public KyraEngine_v1 {
friend class TextDisplayer_rpg;
public:
KyraRpgEngine(OSystem *system, const GameFlags &flags);
virtual ~KyraRpgEngine();
virtual Screen *screen() = 0;
virtual GUI *gui() const = 0;
protected:
// Startup
virtual Common::Error init();
virtual Common::Error go() = 0;
// Init
void initStaticResource();
const uint8 **_itemIconShapes;
// Main loop
virtual void update() = 0;
void updateEnvironmentalSfx(int soundId);
// timers
virtual void setupTimers() = 0;
void enableSysTimer(int sysTimer);
void disableSysTimer(int sysTimer);
void enableTimer(int id);
virtual uint8 getClock2Timer(int index) = 0;
virtual uint8 getNumClock2Timers() = 0;
void timerProcessDoors(int timerNum);
// mouse
bool posWithinRect(int posX, int posY, int x1, int y1, int x2, int y2);
virtual void setHandItem(Item itemIndex) = 0;
// Characters
int _updateCharNum;
int _updatePortraitSpeechAnimDuration;
bool _fadeText;
int _resetPortraitAfterSpeechAnim;
int _needSceneRestore;
// Items
int _itemInHand;
// Monsters
int getBlockDistance(uint16 block1, uint16 block2);
uint8 **_monsterPalettes;
uint8 **_monsterShapes;
int16 _shpDmX1;
int16 _shpDmX2;
int _monsterStepCounter;
int _monsterStepMode;
// Level
virtual void addLevelItems() = 0;
virtual void loadBlockProperties(const char *file) = 0;
virtual void drawScene(int pageNum) = 0;
virtual void drawSceneShapes(int start) = 0;
virtual void drawDecorations(int index) = 0;
virtual const uint8 *getBlockFileData(int levelIndex) = 0;
void setLevelShapesDim(int index, int16 &x1, int16 &x2, int dim);
void setDoorShapeDim(int index, int16 &y1, int16 &y2, int dim);
void drawLevelModifyScreenDim(int dim, int16 x1, int16 y1, int16 x2, int16 y2);
void generateBlockDrawingBuffer();
void generateVmpTileData(int16 startBlockX, uint8 startBlockY, uint8 wllVmpIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY);
void generateVmpTileDataFlipped(int16 startBlockX, uint8 startBlockY, uint8 wllVmpIndex, int16 vmpOffset, uint8 numBlocksX, uint8 numBlocksY);
bool hasWall(int index);
void assignVisibleBlocks(int block, int direction);
bool checkSceneUpdateNeed(int block);
void drawVcnBlocks();
uint16 calcNewBlockPosition(uint16 curBlock, uint16 direction);
virtual int clickedDoorSwitch(uint16 block, uint16 direction) = 0;
int clickedWallShape(uint16 block, uint16 direction);
int clickedLeverOn(uint16 block, uint16 direction);
int clickedLeverOff(uint16 block, uint16 direction);
int clickedWallOnlyScript(uint16 block);
virtual int clickedNiche(uint16 block, uint16 direction) = 0;
void processDoorSwitch(uint16 block, int openClose);
void openCloseDoor(int block, int openClose);
void completeDoorOperations();
uint8 *_wllVmpMap;
int8 *_wllShapeMap;
uint8 *_specialWallTypes;
uint8 *_wllWallFlags;
int _sceneXoffset;
int _sceneShpDim;
LevelBlockProperty *_levelBlockProperties;
LevelBlockProperty *_visibleBlocks[18];
LevelDecorationProperty *_levelDecorationData;
uint16 _levelDecorationDataSize;
LevelDecorationProperty *_levelDecorationProperties;
uint8 **_levelDecorationShapes;
uint16 _decorationCount;
int16 _mappedDecorationsCount;
uint16 *_vmpPtr;
uint8 *_vcnBlocks;
uint8 *_vcfBlocks;
uint8 *_vcnTransitionMask;
uint8 *_vcnShift;
uint8 *_vcnColTable;
uint16 *_blockDrawingBuffer;
uint8 *_sceneWindowBuffer;
uint8 _blockBrightness;
uint8 _wllVcnOffset;
uint8 **_doorShapes;
uint8 _currentLevel;
uint16 _currentBlock;
uint16 _currentDirection;
int _sceneDefaultUpdate;
bool _sceneUpdateRequired;
int16 _visibleBlockIndex[18];
int16 *_lvlShapeLeftRight;
int16 *_lvlShapeTop;
int16 *_lvlShapeBottom;
char _lastBlockDataFile[13];
uint32 _hasTempDataFlags;
int16 _sceneDrawVarDown;
int16 _sceneDrawVarRight;
int16 _sceneDrawVarLeft;
int _wllProcessFlag;
OpenDoorState _openDoorState[3];
int _sceneDrawPage1;
int _sceneDrawPage2;
const int8 *_dscShapeIndex;
const uint8 *_dscDimMap;
const int8 *_dscDim1;
const int8 *_dscDim2;
const int16 *_dscShapeX;
const uint8 *_dscUnk2;
const uint8 *_dscBlockMap;
const int8 *_dscBlockIndex;
const uint8 *_dscTileIndex;
const uint8 *_dscDoorShpIndex;
int _dscDoorShpIndexSize;
const uint8 *_dscDoorY2;
const uint8 *_dscDoorFrameY1;
const uint8 *_dscDoorFrameY2;
const uint8 *_dscDoorFrameIndex1;
const uint8 *_dscDoorFrameIndex2;
// Script
virtual void runLevelScript(int block, int flags) = 0;
// Gui
void removeInputTop();
void gui_drawBox(int x, int y, int w, int h, int frameColor1, int frameColor2, int fillColor);
virtual void gui_drawHorizontalBarGraph(int x, int y, int w, int h, int32 curVal, int32 maxVal, int col1, int col2);
void gui_initButtonsFromList(const uint8 *list);
virtual void gui_initButton(int index, int x = -1, int y = -1, int val = -1) = 0;
void gui_resetButtonList();
void gui_notifyButtonListChanged();
bool clickedShape(int shapeIndex);
virtual const KyraRpgGUISettings *guiSettings() = 0;
int _clickedShapeXOffs;
int _clickedShapeYOffs;
Button *_activeButtons;
Button _activeButtonData[70];
Common::Array<Button::Callback> _buttonCallbacks;
//bool _processingButtons;
uint8 _mouseClick;
bool _preserveEvents;
bool _buttonListChanged;
int _updateFlags;
int _clickedSpecialFlag;
int _compassDirection;
static const uint8 _dropItemDirIndex[];
// text
void drawDialogueButtons();
uint16 processDialogue();
TextDisplayer_rpg *_txt;
virtual TextDisplayer_rpg *txt() { return _txt; }
bool _dialogueField;
const char *_dialogueButtonString[9];
const uint16 *_dialogueButtonPosX;
const uint8 *_dialogueButtonPosY;
int16 _dialogueButtonYoffs;
uint16 _dialogueButtonWidth;
int _dialogueNumButtons;
int _dialogueHighlightedButton;
int _currentControlMode;
int _specialSceneFlag;
uint8 _dialogueButtonLabelColor1;
uint8 _dialogueButtonLabelColor2;
const char *const *_moreStrings;
// misc
virtual void delay(uint32 millis, bool doUpdate = false, bool isMainLoop = false) = 0;
void delayUntil(uint32 time, bool unused = false, bool doUpdate = false, bool isMainLoop = false);
int rollDice(int times, int pips, int inc = 0);
virtual Common::Error loadGameState(int slot) = 0;
virtual Common::Error saveGameStateIntern(int slot, const char *saveName, const Graphics::Surface *thumbnail) = 0;
void generateTempData();
virtual void restoreBlockTempData(int levelIndex);
void releaseTempData();
virtual void *generateMonsterTempData(LevelTempData *tmp) = 0;
virtual void restoreMonsterTempData(LevelTempData *tmp) = 0;
virtual void releaseMonsterTempData(LevelTempData *tmp) = 0;
void restoreFlyingObjectTempData(LevelTempData *tmp);
void *generateFlyingObjectTempData(LevelTempData *tmp);
void releaseFlyingObjectTempData(LevelTempData *tmp);
virtual void *generateWallOfForceTempData(LevelTempData *tmp) { return 0; }
virtual void restoreWallOfForceTempData(LevelTempData *tmp) {}
virtual void releaseWallOfForceTempData(LevelTempData *tmp) {}
LevelTempData *_lvlTempData[29];
const int _numFlyingObjects;
uint32 _flyingObjectStructSize;
void *_flyingObjectsPtr;
// sound
virtual bool snd_processEnvironmentalSoundEffect(int soundId, int block);
virtual void snd_stopSpeech(bool) {}
virtual int snd_updateCharacterSpeech() { return 0; }
virtual void stopPortraitSpeechAnim() {}
virtual void setupOpcodeTable() {}
virtual void snd_playVoiceFile(int) {}
int _environmentSfx;
int _environmentSfxVol;
int _envSfxDistThreshold;
uint32 _activeVoiceFileTotalTime;
// unused
void setWalkspeed(uint8) {}
void removeHandItem() {}
bool lineIsPassable(int, int) { return false; }
};
} // End of namespace Kyra
#endif // ENABLE_EOB || ENABLE_LOL
#endif