aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/engine/kyra_v2.h
diff options
context:
space:
mode:
authorathrxx2019-01-26 01:31:34 +0100
committerathrxx2019-03-06 20:48:15 +0100
commit1dfdcc7252ac83643cae7a7447c025da2af63843 (patch)
treeb6736d006bf67d5264dd171c336f0915695d1f88 /engines/kyra/engine/kyra_v2.h
parent8b53d20b51771680c3d31aa02c0285b7a8be4e85 (diff)
downloadscummvm-rg350-1dfdcc7252ac83643cae7a7447c025da2af63843.tar.gz
scummvm-rg350-1dfdcc7252ac83643cae7a7447c025da2af63843.tar.bz2
scummvm-rg350-1dfdcc7252ac83643cae7a7447c025da2af63843.zip
KYRA: cleanup dir
Reorganize all files in sub directories. The file placement isn't as intuitive as it might be for other engines, which is probably the reason why this hasn't been done before.
Diffstat (limited to 'engines/kyra/engine/kyra_v2.h')
-rw-r--r--engines/kyra/engine/kyra_v2.h400
1 files changed, 400 insertions, 0 deletions
diff --git a/engines/kyra/engine/kyra_v2.h b/engines/kyra/engine/kyra_v2.h
new file mode 100644
index 0000000000..87de4398e1
--- /dev/null
+++ b/engines/kyra/engine/kyra_v2.h
@@ -0,0 +1,400 @@
+/* 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_KYRA_V2_H
+#define KYRA_KYRA_V2_H
+
+#include "kyra/kyra_v1.h"
+#include "kyra/gui/gui_v1.h"
+#include "kyra/graphics/wsamovie.h"
+#include "kyra/engine/item.h"
+
+#include "common/list.h"
+#include "common/hashmap.h"
+
+namespace Kyra {
+
+struct FrameControl {
+ uint16 index;
+ uint16 delay;
+};
+
+struct ItemAnimDefinition {
+ Item itemIndex;
+ uint8 numFrames;
+ const FrameControl *frames;
+};
+
+struct ActiveItemAnim {
+ uint16 currentFrame;
+ uint32 nextFrameTime;
+};
+
+class Screen_v2;
+
+class KyraEngine_v2 : public KyraEngine_v1 {
+friend class Debugger_v2;
+friend class GUI_v2;
+public:
+ struct EngineDesc {
+ // Generic shape related
+ int itemShapeStart;
+ const uint8 *characterFrameTable;
+
+ // Scene script
+ int firstAnimSceneScript;
+
+ // Animation script specific
+ int animScriptFrameAdd;
+
+ // Item specific
+ Item maxItemId;
+ };
+
+ KyraEngine_v2(OSystem *system, const GameFlags &flags, const EngineDesc &desc);
+ ~KyraEngine_v2();
+
+ virtual void pauseEngineIntern(bool pause);
+
+ virtual Screen_v2 *screen_v2() const = 0;
+
+ void delay(uint32 time, bool update = false, bool isMainLoop = false);
+
+ const EngineDesc &engineDesc() const { return _desc; }
+protected:
+ EngineDesc _desc;
+
+ // run
+ uint32 _pauseStart;
+ bool _runFlag;
+ bool _showOutro;
+
+ virtual void update() = 0;
+ virtual void updateWithText() = 0;
+
+ // detection
+ int _lang;
+
+ // Input
+ virtual int inputSceneChange(int x, int y, int unk1, int unk2) = 0;
+
+ // Animator
+ struct AnimObj {
+ uint16 index;
+ uint16 type;
+ bool enabled;
+ uint16 needRefresh;
+ uint16 specialRefresh;
+ uint16 animFlags;
+ uint16 flags;
+ int16 xPos1, yPos1;
+ uint8 *shapePtr;
+ uint16 shapeIndex1;
+ uint16 animNum;
+ uint16 shapeIndex3;
+ uint16 shapeIndex2;
+ int16 xPos2, yPos2;
+ int16 xPos3, yPos3;
+ int16 width, height;
+ int16 width2, height2;
+ uint16 palette;
+ AnimObj *nextObject;
+ };
+
+ void allocAnimObjects(int actors, int anims, int items);
+ AnimObj *_animObjects;
+
+ AnimObj *_animActor;
+ AnimObj *_animAnims;
+ AnimObj *_animItems;
+
+ bool _drawNoShapeFlag;
+ AnimObj *_animList;
+
+ AnimObj *initAnimList(AnimObj *list, AnimObj *entry);
+ AnimObj *addToAnimListSorted(AnimObj *list, AnimObj *entry);
+ AnimObj *deleteAnimListEntry(AnimObj *list, AnimObj *entry);
+
+ virtual void refreshAnimObjects(int force) = 0;
+ void refreshAnimObjectsIfNeed();
+
+ void flagAnimObjsSpecialRefresh();
+ void flagAnimObjsForRefresh();
+
+ virtual void clearAnimObjects() = 0;
+
+ virtual void drawAnimObjects() = 0;
+ virtual void drawSceneAnimObject(AnimObj *obj, int x, int y, int drawLayer) = 0;
+ virtual void drawCharacterAnimObject(AnimObj *obj, int x, int y, int drawLayer) = 0;
+
+ virtual void updateCharacterAnim(int) = 0;
+ virtual void updateSceneAnim(int anim, int newFrame) = 0;
+
+ void addItemToAnimList(int item);
+ void deleteItemAnimEntry(int item);
+
+ virtual void animSetupPaletteEntry(AnimObj *){}
+
+ virtual void setCharacterAnimDim(int w, int h) = 0;
+ virtual void resetCharacterAnimDim() = 0;
+
+ virtual int getScale(int x, int y) = 0;
+
+ uint8 *_screenBuffer;
+
+ // Scene
+ struct SceneDesc {
+ char filename1[10];
+ char filename2[10];
+
+ uint16 exit1, exit2, exit3, exit4;
+ uint8 flags;
+ uint8 sound;
+ };
+
+ SceneDesc *_sceneList;
+ int _sceneListSize;
+ uint16 _currentScene;
+
+ uint16 _sceneExit1, _sceneExit2, _sceneExit3, _sceneExit4;
+ int _sceneEnterX1, _sceneEnterY1, _sceneEnterX2, _sceneEnterY2,
+ _sceneEnterX3, _sceneEnterY3, _sceneEnterX4, _sceneEnterY4;
+ int _specialExitCount;
+ uint16 _specialExitTable[25];
+ bool checkSpecialSceneExit(int num, int x, int y);
+
+ bool _overwriteSceneFacing;
+
+ virtual void enterNewScene(uint16 newScene, int facing, int unk1, int unk2, int unk3) = 0;
+
+ void runSceneScript6();
+
+ EMCData _sceneScriptData;
+ EMCState _sceneScriptState;
+
+ virtual int trySceneChange(int *moveTable, int unk1, int unk2) = 0;
+
+ // Animation
+ virtual void restorePage3() = 0;
+
+ struct SceneAnim {
+ uint16 flags;
+ int16 x, y;
+ int16 x2, y2;
+ int16 width, height;
+ uint16 specialSize;
+ int16 shapeIndex;
+ uint16 wsaFlag;
+ char filename[14];
+ };
+
+ SceneAnim _sceneAnims[16];
+ WSAMovie_v2 *_sceneAnimMovie[16];
+
+ void freeSceneAnims();
+
+ bool _specialSceneScriptState[10];
+ bool _specialSceneScriptStateBackup[10];
+ EMCState _sceneSpecialScripts[10];
+ uint32 _sceneSpecialScriptsTimer[10];
+ int _lastProcessedSceneScript;
+ bool _specialSceneScriptRunFlag;
+
+ void updateSpecialSceneScripts();
+
+ // Sequences
+ EMCData _animationScriptData;
+ EMCState _animationScriptState;
+ Common::Array<const Opcode *> _opcodesAnimation;
+
+ void runAnimationScript(const char *filename, int allowSkip, int resetChar, int newShapes, int shapeUnload);
+
+ int o2a_setAnimationShapes(EMCState *script);
+ int o2a_setResetFrame(EMCState *script);
+
+ char _animShapeFilename[14];
+
+ uint8 *_animShapeFiledata;
+ int _animShapeCount;
+ int _animShapeLastEntry;
+
+ int _animNewFrame;
+ int _animDelayTime;
+
+ int _animResetFrame;
+
+ int _animShapeWidth, _animShapeHeight;
+ int _animShapeXAdd, _animShapeYAdd;
+
+ bool _animNeedUpdate;
+
+ virtual int initAnimationShapes(uint8 *filedata) = 0;
+ void processAnimationScript(int allowSkip, int resetChar);
+ virtual void uninitAnimationShapes(int count, uint8 *filedata) = 0;
+
+ // Shapes
+ typedef Common::HashMap<int, uint8 *> ShapeMap;
+ ShapeMap _gameShapes;
+
+ uint8 *getShapePtr(int index) const;
+ void addShapeToPool(const uint8 *data, int realIndex, int shape);
+ void addShapeToPool(uint8 *shpData, int index);
+ void remShapeFromPool(int idx);
+
+ int _characterShapeFile;
+ virtual void loadCharacterShapes(int shapes) = 0;
+
+ // pathfinder
+ int _movFacingTable[600];
+ int _pathfinderFlag;
+ bool _smoothingPath;
+
+ int findWay(int curX, int curY, int dstX, int dstY, int *moveTable, int moveTableSize);
+
+ bool directLinePassable(int x, int y, int toX, int toY);
+
+ int pathfinderInitPositionTable(int *moveTable);
+ int pathfinderAddToPositionTable(int index, int v1, int v2);
+ int pathfinderInitPositionIndexTable(int tableLen, int x, int y);
+ int pathfinderAddToPositionIndexTable(int index, int v);
+ void pathfinderFinializePath(int *moveTable, int unk1, int x, int y, int moveTableSize);
+
+ int _pathfinderPositionTable[400];
+ int _pathfinderPositionIndexTable[200];
+
+ // items
+ struct ItemDefinition {
+ Item id;
+ uint16 sceneId;
+ int16 x;
+ uint8 y;
+ };
+
+ void initItemList(int size);
+
+ Item _hiddenItems[100];
+
+ ItemDefinition *_itemList;
+ int _itemListSize;
+
+ int _itemInHand;
+ int _savedMouseState;
+
+ int findFreeItem();
+ int countAllItems();
+
+ int findItem(uint16 sceneId, Item id);
+ int findItem(Item item);
+
+ void resetItemList();
+ void resetItem(int index);
+
+ virtual void setMouseCursor(Item item) = 0;
+
+ void setHandItem(Item item);
+ void removeHandItem();
+
+ // character
+ struct Character {
+ uint16 sceneId;
+ int16 dlgIndex;
+ uint8 height;
+ uint8 facing;
+ uint16 animFrame;
+ byte walkspeed;
+ Item inventory[20];
+ int16 x1, y1;
+ int16 x2, y2;
+ int16 x3, y3;
+ };
+
+ Character _mainCharacter;
+ int _mainCharX, _mainCharY;
+ int _charScale;
+
+ void moveCharacter(int facing, int x, int y);
+ int updateCharPos(int *table, int force = 0);
+ void updateCharPosWithUpdate();
+
+ uint32 _updateCharPosNextUpdate;
+
+ virtual int getCharacterWalkspeed() const = 0;
+ virtual void updateCharAnimFrame(int *table) = 0;
+
+ // chat
+ int _vocHigh;
+
+ const char *_chatText;
+ int _chatObject;
+ uint32 _chatEndTime;
+ int _chatVocHigh, _chatVocLow;
+ bool _chatTextEnabled;
+
+ EMCData _chatScriptData;
+ EMCState _chatScriptState;
+
+ virtual void setDlgIndex(int dlgIndex) = 0;
+
+ virtual void randomSceneChat() = 0;
+
+ // unknown
+ int _unk4, _unk5;
+ bool _unkSceneScreenFlag1;
+ bool _unkHandleSceneChangeFlag;
+
+ // opcodes
+ int o2_getCharacterX(EMCState *script);
+ int o2_getCharacterY(EMCState *script);
+ int o2_getCharacterFacing(EMCState *script);
+ int o2_getCharacterScene(EMCState *script);
+ int o2_setCharacterFacingOverwrite(EMCState *script);
+ int o2_trySceneChange(EMCState *script);
+ int o2_moveCharacter(EMCState *script);
+ int o2_checkForItem(EMCState *script);
+ int o2_defineItem(EMCState *script);
+ int o2_addSpecialExit(EMCState *script);
+ int o2_delay(EMCState *script);
+ int o2_update(EMCState *script);
+ int o2_getShapeFlag1(EMCState *script);
+ int o2_waitForConfirmationClick(EMCState *script);
+ int o2_randomSceneChat(EMCState *script);
+ int o2_setDlgIndex(EMCState *script);
+ int o2_getDlgIndex(EMCState *script);
+ int o2_defineRoomEntrance(EMCState *script);
+ int o2_runAnimationScript(EMCState *script);
+ int o2_setSpecialSceneScriptRunTime(EMCState *script);
+ int o2_defineScene(EMCState *script);
+ int o2_setSpecialSceneScriptState(EMCState *script);
+ int o2_clearSpecialSceneScriptState(EMCState *script);
+ int o2_querySpecialSceneScriptState(EMCState *script);
+ int o2_setHiddenItemsEntry(EMCState *script);
+ int o2_getHiddenItemsEntry(EMCState *script);
+ int o2_disableTimer(EMCState *script);
+ int o2_enableTimer(EMCState *script);
+ int o2_setTimerCountdown(EMCState *script);
+ int o2_setVocHigh(EMCState *script);
+ int o2_getVocHigh(EMCState *script);
+};
+
+} // End of namespace Kyra
+
+#endif