aboutsummaryrefslogtreecommitdiff
path: root/engines/parallaction/parallaction.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/parallaction/parallaction.h')
-rw-r--r--engines/parallaction/parallaction.h311
1 files changed, 311 insertions, 0 deletions
diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h
new file mode 100644
index 0000000000..fb2221cd6a
--- /dev/null
+++ b/engines/parallaction/parallaction.h
@@ -0,0 +1,311 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2006 The ScummVM project
+ *
+ * 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.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#ifndef PARALLACTION_H
+#define PARALLACTION_H
+
+#include "engines/engine.h"
+#include "parallaction/defs.h"
+#include "parallaction/inventory.h"
+#include "common/advancedDetector.h"
+
+
+namespace Parallaction {
+
+// high values mean high priority
+
+#define JOBPRIORITY_DRAWLABEL 0
+#define JOBPRIORITY_DRAWMOUSE 1
+#define JOBPRIORITY_SHOWINVENTORY 2
+#define JOBPRIORITY_DRAWANIMATIONS 3
+#define JOBPRIORITY_RUNSTUFF 15
+#define JOBPRIORITY_ADDREMOVEITEMS 17
+#define JOBPRIORITY_TOGGLEDOOR 18
+#define JOBPRIORITY_WALK 19
+#define JOBPRIORITY_HIDEINVENTORY 20
+#define JOBPRIORITY_ERASEMOUSE 21
+
+enum {
+ kMouseNone = 0,
+ kMouseLeftUp = 1,
+ kMouseLeftDown = 2,
+ kMouseRightUp = 3,
+ kMouseRightDown = 4
+};
+
+
+enum ParallactionGameType {
+ GType_Nippon = 1,
+ GType_BRA
+};
+
+struct PARALLACTIONGameDescription {
+ Common::ADGameDescription desc;
+
+ int gameType;
+ uint32 features;
+};
+
+struct Job;
+typedef void (*JobFn)(void*, Job*);
+
+struct Job {
+ Node _node;
+ uint16 _count; // # of executions left
+ uint16 _tag; // used for ordering
+ uint16 _finished;
+ void * _parm;
+ JobFn _fn;
+};
+
+extern Point _mousePos;
+extern uint16 _mouseButtons;
+
+extern uint16 _score;
+extern uint16 _language;
+extern Zone *_activeZone;
+extern uint32 _engineFlags;
+extern callable _callables[];
+extern Animation _yourself;
+extern Node _zones;
+extern Node _animations;
+extern uint32 _localFlags[];
+extern Command *_forwardedCommands[];
+extern char _forwardedAnimationNames[][20];
+extern uint16 _numForwards;
+extern char _soundFile[];
+extern char _slideText[][40];
+extern uint16 _introSarcData3; // sarcophagus stuff to be saved
+extern uint16 _introSarcData2; // sarcophagus stuff to be saved
+extern char _newLocation[];
+extern char *_globalTable[];
+extern char _saveData1[];
+extern Point _firstPosition; // starting position after load game??
+extern uint16 _firstFrame; // starting frame after load game??
+extern Cnv _characterFace;
+extern byte _mouseHidden;
+extern uint32 _commandFlags;
+extern Cnv _tempFrames;
+
+extern char _location[];
+extern Node _locationWalkNodes;
+extern Command *_locationACommands;
+extern Command *_locationCommands;
+extern char *_locationComment;
+extern char *_locationEndComment;
+
+extern char *_objectsNames[];
+extern char *_zoneTypeNames[];
+extern char *_zoneFlagNames[];
+extern char *_localFlagNames[];
+extern char *commands_names[];
+
+extern char *_instructionNames[];
+extern char *_callableNames[];
+
+void waitUntilLeftClick();
+
+void addNode(Node *list, Node *n);
+void removeNode(Node *n);
+void freeNodeList(Node *list);
+
+Command *parseCommands(ArchivedFile *file);
+void runCommands(Command *list, Zone *z = NULL);
+void freeCommands(Command*);
+
+void freeZones(Node *list);
+
+void freeLocation();
+
+void runDialogue(SpeakData*);
+Dialogue *parseDialogue(ArchivedFile *file);
+
+void changeCharacter(const char *name);
+
+WalkNode *buildWalkPath(uint16 x, uint16 y);
+
+Job *addJob(JobFn fn, void *parm, uint16 tag);
+void removeJob(Job *j);
+void runJobs();
+void pauseJobs();
+void resumeJobs();
+
+void jobRemovePickedItem(void*, Job *j);
+void jobDisplayDroppedItem(void*, Job *j);
+void jobToggleDoor(void*, Job *j);
+void jobEraseAnimations(void *arg_0, Job *j);
+void jobWalk(void*, Job *j);
+void jobRunScripts(void*, Job *j);
+void jobDisplayAnimations(void*, Job *j);
+void jobDisplayLabel(void *parm, Job *j);
+void jobWaitRemoveJob(void *parm, Job *j);
+void jobShowInventory(void *parm, Job *j);
+void jobHideInventory(void *parm, Job *j);
+void jobEraseLabel(void *parm, Job *j);
+
+
+enum EngineFlags {
+ kEngineQuit = (1 << 0),
+ kEnginePauseJobs = (1 << 1),
+ kEngineInventory = (1 << 2),
+ kEngineWalking = (1 << 3),
+ kEngineChangeLocation = (1 << 4),
+ kEngineMouse = (1 << 5),
+ kEngineDragging = (1 << 6),
+ kEngineMiniDonna = (1 << 7)
+};
+
+enum {
+ kEvNone = 0,
+ kEvEnterZone = 1,
+ kEvExitZone = 2,
+ kEvAction = 3,
+ kEvOpenInventory = 4,
+ kEvCloseInventory = 5,
+ kEvHoverInventory = 6,
+ kEvWalk = 7,
+ kEvQuitGame = 1000,
+ kEvSaveGame = 2000,
+ kEvLoadGame = 4000
+};
+
+enum {
+ kCursorArrow = -1
+};
+
+
+
+class Graphics;
+class Menu;
+
+class Parallaction : public Engine {
+
+public:
+
+ Parallaction(OSystem *syst);
+ ~Parallaction();
+
+ int init();
+
+ int go();
+
+
+ void loadGame();
+ void saveGame();
+
+ uint16 updateInput();
+
+ void waitTime(uint32 t);
+
+ void initTable(const char *path, char **table);
+ void freeTable(char** table);
+ int16 searchTable(const char *s, char **table);
+
+ void parseLocation(const char *filename);
+ void changeCursor(int32 index);
+ void changeCharacter(const char *name);
+
+public:
+ int getGameType() const { return _gameDescription->gameType; }
+ uint32 getFeatures() const { return _gameDescription->features; }
+ Common::Language getLanguage() const { return _gameDescription->desc.language; }
+ Common::Platform getPlatform() const { return _gameDescription->desc.platform; }
+
+private:
+ const PARALLACTIONGameDescription *_gameDescription;
+
+public:
+
+ Graphics* _graphics;
+ Menu* _menu;
+ char _characterName[30];
+ char _languageDir[6];
+ char _disk[6];
+
+ char _locationNames[120][32];
+ int16 _currentLocationIndex;
+ uint16 _numLocations;
+
+ InventoryItem _activeItem;
+
+protected: // data
+
+ struct InputData {
+ uint16 _event;
+ Point _mousePos;
+ int32 _data;
+ };
+
+ bool _skipMenu;
+
+ // input-only
+ InputData _input;
+ bool _actionAfterWalk; // actived when the character needs to move before taking an action
+
+ // these two could/should be merged as they carry on the same duty in two member functions,
+ // respectively processInput and translateInput
+ int16 _procCurrentHoverItem;
+ int16 _transCurrentHoverItem;
+
+ uint32 _baseTime;
+
+ uint16 _musicData1; // only used in changeLocation
+ char _characterName1[50]; // only used in changeCharacter
+
+ int16 _keyDown;
+
+protected: // members
+ bool detectGame(void);
+
+ void initGame();
+ void initGlobals();
+
+ void doLoadGame(uint16 _di);
+ void doSaveGame(uint16 _di);
+
+ void runGame();
+ InputData * translateInput();
+ void processInput(InputData*);
+
+ int16 getHoverInventoryItem(int16 x, int16 y);
+
+ uint32 getElapsedTime();
+ void resetTimer();
+
+ void doLocationEnterTransition();
+ void parseZone(ArchivedFile *file, Node *list, char *name);
+ Animation * parseAnimation(ArchivedFile *file, Node *list, char *name);
+ void parseScriptLine(Instruction *inst, Animation *a, LocalVariable *locals);
+ void parseZoneTypeBlock(ArchivedFile *file, Zone *z);
+ void loadProgram(Animation *a, char *filename);
+ void changeLocation(char *location);
+
+};
+
+// FIXME: remove global
+extern Parallaction *_vm;
+
+
+} // namespace Parallaction
+
+
+#endif