Logo Search packages:      
Sourcecode: scummvm version File versions

agos.h

/* 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.
 *
 * $URL: https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/tags/release-0-13-1/engines/agos/agos.h $
 * $Id: agos.h 40070 2009-04-22 11:52:57Z Kirben $
 *
 */

#ifndef AGOS_AGOS_H
#define AGOS_AGOS_H

#include "engines/engine.h"

#include "common/array.h"
#include "common/keyboard.h"
#include "common/rect.h"
#include "common/util.h"

#include "agos/animation.h"
#include "agos/midi.h"
#include "agos/sound.h"
#include "agos/vga.h"

namespace AGOS {

/* Enable and set to zone number number to dump */
//#define DUMP_FILE_NR 8
//#define DUMP_BITMAPS_FILE_NR 8

uint fileReadItemID(Common::SeekableReadStream *in);

#define CHECK_BOUNDS(x, y) assert((uint)(x) < ARRAYSIZE(y))

struct Child;
struct SubObject;

struct Item;
struct WindowBlock;
struct Subroutine;
struct SubroutineLine;
struct TimeEvent;

struct TextLocation {
      int16 x, y, width;
      TextLocation() { memset(this, 0, sizeof(*this)); }
};

struct HitArea {
      uint16 x, y;
      uint16 width, height;
      uint16 flags;
      uint16 id;
      uint16 data;
      WindowBlock *window;
      Item *item_ptr;
      uint16 verb;
      uint16 priority;
      HitArea() { memset(this, 0, sizeof(*this)); }
};

struct VgaPointersEntry {
      byte *vgaFile1;
      byte *vgaFile1End;
      byte *vgaFile2;
      byte *vgaFile2End;
      byte *sfxFile;
      byte *sfxFileEnd;
      VgaPointersEntry() { memset(this, 0, sizeof(*this)); }
};

struct VgaSprite {
      uint16 id;
      int16 image;
      uint16 palette;
      int16 x, y;
      uint16 flags;
      uint16 priority;
      uint16 windowNum;
      uint16 zoneNum;
      VgaSprite() { memset(this, 0, sizeof(*this)); }
};

struct VgaSleepStruct {
      uint16 ident;
      const byte *code_ptr;
      uint16 sprite_id;
      uint16 cur_vga_file;
      VgaSleepStruct() { memset(this, 0, sizeof(*this)); }
};

struct VgaTimerEntry {
      int16 delay;
      const byte *script_pointer;
      uint16 sprite_id;
      uint16 cur_vga_file;
      uint8 type;
      VgaTimerEntry() { memset(this, 0, sizeof(*this)); }
};

struct AnimTable {
      const byte *srcPtr;
      int16 x;
      int16 y;
      uint16 width;
      uint16 height;
      uint16 windowNum;
      uint16 id;
      uint16 zoneNum;
      AnimTable() { memset(this, 0, sizeof(*this)); }
};

enum SIMONGameType {
      GType_ELVIRA1 = 1,
      GType_ELVIRA2 = 2,
      GType_WW = 3,
      GType_SIMON1 = 4,
      GType_SIMON2 = 5,
      GType_FF = 6,
      GType_PP = 7
};

enum EventType {
      ANIMATE_INT   = 1 << 1,
      ANIMATE_EVENT = 1 << 2,
      SCROLL_EVENT  = 1 << 3,
      PLAYER_DAMAGE_EVENT = 1 << 4,
      MONSTER_DAMAGE_EVENT = 1 << 5
};

struct AGOSGameDescription;

struct GameSpecificSettings;

class Debugger;

// This is to help devices with small memory (PDA, smartphones, ...)
// to save a bit of memory used by opcode names in the AGOS engine.

#ifndef REDUCE_MEMORY_USAGE
#     define _OPCODE(ver, x)  { &ver::x, #x }
#else
#     define _OPCODE(ver, x)  { &ver::x, "" }
#endif

class AGOSEngine : public Engine {
      friend class Debugger;
      friend class MoviePlayer;
      friend class MoviePlayerDXA;
      friend class MoviePlayerSMK;

      // Engine APIs
      virtual Common::Error init();
      virtual Common::Error go();
      virtual GUI::Debugger *getDebugger();
      virtual bool hasFeature(EngineFeature f) const;
      virtual void syncSoundSettings();
      virtual void pauseEngineIntern(bool pause);

public:
      virtual void setupOpcodes();
      int _numOpcodes, _opcode;

      typedef void (AGOSEngine::*VgaOpcodeProc) ();

      void setupVgaOpcodes();
      VgaOpcodeProc _vga_opcode_table[100];
      uint8 _numVideoOpcodes;

      virtual void setupVideoOpcodes(VgaOpcodeProc *op);

      const AGOSGameDescription *_gameDescription;

      virtual void setupGame();

      int getGameId() const;
      int getGameType() const;
      uint32 getFeatures() const;
      const char *getExtra() const;
      Common::Language getLanguage() const;
      Common::Platform getPlatform() const;
      const char *getFileName(int type) const;

protected:
      void playSting(uint16 a);

      const byte *_vcPtr;                                               /* video code ptr */
      uint16 _vc_get_out_of_code;


      uint32 *_gameOffsetsPtr;

      uint8 _numMusic, _numSFX;
      uint16 _numSpeech;

      uint8 _numBitArray1, _numBitArray2, _numBitArray3, _numItemStore;
      uint16 _numVars;

      uint8 _vgaBaseDelay, _vgaPeriod;

      uint16 _musicIndexBase;
      uint16 _soundIndexBase;
      uint16 _tableIndexBase;
      uint16 _textIndexBase;

      uint32 _itemMemSize;
      uint32 _tableMemSize;
      uint32 _vgaMemSize;

      const GameSpecificSettings *gss;

      Common::KeyState _keyPressed;

      Common::File *_gameFile;

      byte *_strippedTxtMem;
      byte *_textMem;
      uint _textSize;
      uint _stringTabNum, _stringTabPos, _stringtab_numalloc;
      byte **_stringTabPtr;

      Item **_itemArrayPtr;
      uint _itemArraySize;
      uint _itemArrayInited;

      Common::Array<byte *> _itemHeap;

      byte *_iconFilePtr;

      const byte *_codePtr;

      byte **_localStringtable;
      uint _stringIdLocalMin, _stringIdLocalMax;

      RoomState *_roomStates;
      uint16 _numRoomStates;

      byte *_menuBase;
      byte *_roomsList;
      byte *_roomsListPtr;

      byte *_xtblList;
      byte *_xtablesHeapPtrOrg;
      uint _xtablesHeapCurPosOrg;
      Subroutine *_xsubroutineListOrg;

      byte *_tblList;
      byte *_tablesHeapPtr, *_tablesHeapPtrOrg, *_tablesheapPtrNew;
      uint _tablesHeapSize, _tablesHeapCurPos, _tablesHeapCurPosOrg;
      uint _tablesHeapCurPosNew;
      Subroutine *_subroutineListOrg;

      Subroutine *_subroutineList;
      uint _subroutine;

      uint16 _dxSurfacePitch;

      uint8 _recursionDepth;

      uint32 _lastVgaTick;

      uint16 _marks;
      bool _omniTV;

      bool _scriptVar2;
      bool _runScriptReturn1;
      bool _runScriptCondition[40];
      int _runScriptReturn[40];
      bool _skipVgaWait;
      bool _noParentNotify;
      bool _beardLoaded;
      bool _litBoxFlag;
      bool _mortalFlag;
      bool _displayScreen;
      bool _syncFlag2;
      bool _inCallBack;
      bool _cepeFlag;
      bool _fastMode;
      bool _backFlag;

      uint16 _debugMode;
      uint16 _language;
      bool _copyProtection;
      bool _pause;
      bool _startMainScript;
      bool _continousMainScript;
      bool _startVgaScript;
      bool _continousVgaScript;
      bool _dumpImages;
      bool _speech;
      bool _subtitles;
      bool _vgaVar9;
      int16 _chanceModifier;
      bool _restoreWindow6;
      int16 _scrollX, _scrollXMax;
      int16 _scrollY, _scrollYMax;
      int16 _scrollCount, _scrollFlag;
      uint16 _scrollWidth, _scrollHeight;
      const byte *_scrollImage;
      byte _boxStarHeight;

      char _boxBuffer[310];
      char *_boxBufferPtr;
      int _boxLineCount;
      int _lineCounts[6];
      char *_linePtrs[6];
      int _boxCR;

      SubroutineLine *_classLine;
      uint _classMask, _classMode1, _classMode2;
      Item *_findNextPtr;
      Subroutine *_currentTable;
      SubroutineLine *_currentLine;

      int _agosMenu;
      byte _textMenu[10];
      uint16 _currentRoom, _superRoomNumber;
      uint8 _wallOn;

      uint16 _hyperLink, _newLines;
      uint16 _oracleMaxScrollY, _noOracleScroll;
      uint16 _interactY;

      int16 _scriptVerb, _scriptNoun1, _scriptNoun2;
      int16 _scriptAdj1, _scriptAdj2;

      uint16 _curWindow;
      WindowBlock *_textWindow;

      Item *_subjectItem, *_objectItem;
      Item *_currentPlayer;

      Item *_hitAreaObjectItem;
      HitArea *_lastHitArea;
      HitArea *_lastNameOn;
      HitArea *_lastHitArea3;
      Item *_hitAreaSubjectItem;
      HitArea *_currentBox, *_currentVerbBox, *_lastVerbOn;
      uint16      _currentBoxNum;
      uint _needHitAreaRecalc;
      uint _verbHitArea;
      uint16 _defaultVerb;
      uint _iOverflow;
      uint _nameLocked;

      uint _dragAccept;
      uint _dragFlag;
      uint _dragMode;
      uint _dragCount;
      uint _dragEnd;
      HitArea *_lastClickRem;

      uint16 _windowNum;

      int16 _printCharCurPos, _printCharMaxPos, _printCharPixelCount;
      uint16 _numLettersToPrint;

      uint _numTextBoxes;

      uint32 getTime() const;

      uint32 _lastMinute; // Used in processSpecialKeys()
      uint32 _lastTime;
      uint32 _clockStopped, _gameStoppedClock, _gameTime;
      uint32 _timeStore;

      TimeEvent *_firstTimeStruct, *_pendingDeleteTimeEvent;

      Common::Point _mouse;
      Common::Point _mouseOld;

      byte *_mouseData;
      byte _animatePointer;
      byte _maxCursorWidth, _maxCursorHeight;
      byte _mouseAnim, _mouseAnimMax, _mouseCursor;
      byte _currentMouseAnim, _currentMouseCursor;
      byte _oldMouseAnimMax, _oldMouseCursor;
      uint _mouseHideCount;
      bool _mouseToggle;

      byte _leftButtonDown;
      byte _leftButton, _leftButtonCount, _leftButtonOld;
      byte _rightButtonDown;
      bool _clickOnly, _leftClick, _oneClick;
      bool _noRightClick;

      Item *_dummyItem1;
      Item *_dummyItem2;
      Item *_dummyItem3;

      volatile uint16 _lockWord;
      uint16 _scrollUpHitArea;
      uint16 _scrollDownHitArea;

      bool _fastFadeOutFlag;
      byte _paletteFlag;
      int _bottomPalette;
      uint _fastFadeCount;
      volatile uint16 _fastFadeInFlag;

      int _screenWidth, _screenHeight;

      uint16 _noOverWrite;
      bool _rejectBlock;

      bool _exitCutscene, _picture8600;

      uint _soundFileId;
      int16 _lastMusicPlayed;
      int16 _nextMusicToPlay;

      bool _showPreposition;
      bool _showMessageFlag;

      bool _newDirtyClip;
      uint _copyScnFlag, _vgaSpriteChanged;

      byte *_block, *_blockEnd;
      byte *_vgaMemPtr, *_vgaMemEnd, *_vgaMemBase;
      byte *_vgaFrozenBase, *_vgaRealBase;
      byte *_zoneBuffers;

      byte *_curVgaFile1;
      byte *_curVgaFile2;
      byte *_curSfxFile;

      uint16 _syncCount;

      int16 _iconToggleCount, _voiceCount;
      uint32 _lastTickCount, _thisTickCount;
      uint32 _startSecondCount, _tSecondCount;

      uint16 _frameCount;

      uint16 _zoneNumber;
      uint16 _vgaWaitFor, _lastVgaWaitFor;
      uint16 _vgaCurSpriteId, _vgaCurZoneNum;
      uint16 _vgaCurSpritePriority;

      int16 _baseY;
      float _scale;
      Common::Rect _feebleRect;
      int16 _scaleX, _scaleY, _scaleWidth, _scaleHeight;

      VgaTimerEntry *_nextVgaTimerToProcess;

      uint8 _opcode177Var1, _opcode177Var2;
      uint8 _opcode178Var1, _opcode178Var2;

      Item *_objectArray[50];
      Item *_itemStore[50];

      uint16 _shortText[40];
      uint16 _shortTextX[40];
      uint16 _shortTextY[40];
      uint16 _longText[40];
      uint16 _longSound[40];

      uint16 _bitArray[128];
      uint16 _bitArrayTwo[16];
      uint16 _bitArrayThree[16];
      int16 *_variableArray;
      int16 *_variableArray2;
      int16 *_variableArrayPtr;

      WindowBlock *_dummyWindow;
      WindowBlock *_windowArray[80];

      byte _fcsData1[8];
      bool _fcsData2[8];

      TextLocation _textLocation1, _textLocation2, _textLocation3, _textLocation4;

      byte _awaitTwoByteToken;
      byte *_byteTokens;
      byte *_byteTokenStrings;
      byte *_twoByteTokens;
      byte *_twoByteTokenStrings;
      byte *_secondTwoByteTokenStrings;
      byte *_thirdTwoByteTokenStrings;
      byte _textBuffer[180];
      int _textCount;

      int _freeStringSlot;

      byte _stringReturnBuffer[2][180];

      HitArea _hitAreas[250];

      AnimTable _screenAnim1[90];
      VgaPointersEntry _vgaBufferPointers[450];
      VgaSprite _vgaSprites[200];
      VgaSleepStruct _waitEndTable[60];
      VgaSleepStruct _waitSyncTable[60];

      const uint16 *_pathFindArray[100];

      uint8 _pathValues[400];
      uint16 _PVCount;
      uint16 _GPVCount;

      uint8 _pathValues1[400];
      uint16 _PVCount1;
      uint16 _GPVCount1;

      uint8 _currentPalette[1024];
      uint8 _displayPalette[1024];

      byte *_planarBuf;
      byte _videoBuf1[32000];
      uint16 _videoWindows[128];

      uint8 _window3Flag;
      uint8 _window4Flag;
      uint8 _window6Flag;
      byte *_window4BackScn;
      byte *_window6BackScn;

      uint16 _moveXMin, _moveYMin;
      uint16 _moveXMax, _moveYMax;

      VgaTimerEntry _vgaTimerList[205];

      WindowBlock *_windowList;

      byte _lettersToPrintBuf[80];

      MidiPlayer _midi;
      MidiDriver *_driver;
      bool _midiEnabled;
      bool _nativeMT32;

      int _vgaTickCounter;

      MoviePlayer *_moviePlayer;
      Audio::SoundHandle _modHandle;

      Sound *_sound;

      bool _effectsPaused;
      bool _ambientPaused;
      bool _musicPaused;

      Debugger *_debugger;

      uint _saveGameNameLen;
      uint _saveLoadRowCurPos;
      uint _numSaveGameRows;
      bool _saveDialogFlag;
      bool _saveOrLoad;
      bool _saveLoadEdit;

      byte _saveLoadType, _saveLoadSlot;
      char _saveLoadName[108];

      bool _oopsValid;

      byte *_backGroundBuf;
      byte *_backBuf;
      byte *_scaleBuf;

      Common::RandomSource _rnd;

      const byte *_vc10BasePtrOld;
      byte _hebrewCharWidths[32];

public:
      AGOSEngine(OSystem *syst);
      virtual ~AGOSEngine();

protected:
      virtual uint16 to16Wrapper(uint value);
      virtual uint16 readUint16Wrapper(const void *src);
      virtual uint32 readUint32Wrapper(const void *src);

      int allocGamePcVars(Common::SeekableReadStream *in);
      void createPlayer();
      void allocateStringTable(int num);
      void setupStringTable(byte *mem, int num);
      void setupLocalStringTable(byte *mem, int num);
      void readGamePcText(Common::SeekableReadStream *in);
      virtual void readItemChildren(Common::SeekableReadStream *in, Item *item, uint tmp);
      void readItemFromGamePc(Common::SeekableReadStream *in, Item *item);
      void loadGamePcFile();
      void readGamePcFile(Common::SeekableReadStream *in);
      void decompressData(const char *srcName, byte *dst, uint32 offset, uint32 srcSize, uint32 dstSize);
      void loadOffsets(const char *filename, int number, uint32 &file, uint32 &offset, uint32 &compressedSize, uint32 &size);
      void loadSound(uint sound);
      void loadSound(uint sound, int pan, int vol, uint type);
      void loadVoice(uint speechId);

      void loadSoundFile(const char *filename);


      int getUserFlag(Item *item, int a);
      int getUserFlag1(Item *item, int a);
      int getUserItem(Item *item, int n);
      void setUserFlag(Item *item, int a, int b);
      void setUserItem(Item *item, int n, int m);

      void paletteFadeOut(byte *palPtr, uint num, uint size);

      byte *allocateItem(uint size);
      byte *allocateTable(uint size);
      void alignTableMem();

      Child *findChildOfType(Item *i, uint child);
      Child *allocateChildBlock(Item *i, uint type, uint size);

      void allocItemHeap();
      void allocTablesHeap();

      Subroutine *createSubroutine(uint16 a);
      void readSubroutine(Common::SeekableReadStream *in, Subroutine *sub);
      SubroutineLine *createSubroutineLine(Subroutine *sub, int a);
      void readSubroutineLine(Common::SeekableReadStream *in, SubroutineLine *new_table, Subroutine *sub);
      byte *readSingleOpcode(Common::SeekableReadStream *in, byte *ptr);
      void readSubroutineBlock(Common::SeekableReadStream *in);

      Subroutine *getSubroutineByID(uint subroutine_id);

      /* used in debugger */
      void dumpAllSubroutines();
      void dumpSubroutines();
      void dumpSubroutine(Subroutine *sub);
      void dumpSubroutineLine(SubroutineLine *sl, Subroutine *sub);
      const byte *dumpOpcode(const byte *p);

      int startSubroutine(Subroutine *sub);
      int startSubroutineEx(Subroutine *sub);

      bool checkIfToRunSubroutineLine(SubroutineLine *sl, Subroutine *sub);

      int runScript();
      virtual void executeOpcode(int opcode) = 0;

      byte getByte();
      int getNextWord();

      uint getNextVarContents();
      uint getVarWrapper();
      uint getVarOrWord();
      uint getVarOrByte();
      uint readVariable(uint16 variable);
      void writeNextVarContents(uint16 contents);
      void writeVariable(uint16 variable, uint16 contents);

      Item *derefItem(uint item);
      Item *getNextItemPtr();
      uint getNextItemID();
      uint getItem1ID() {return 1;}
      uint itemPtrToID(Item *id);
      Item *me();
      Item *actor();

      void uncompressText(byte *ptr);
      byte *uncompressToken(byte a, byte *ptr);

      void showMessageFormat(const char *s, ...);
      const byte *getStringPtrByID(uint16 stringId, bool upperCase = false);
      const byte *getLocalStringByID(uint16 stringId);
      uint getNextStringID();

      void addTimeEvent(uint16 timeout, uint16 subroutine_id);
      void delTimeEvent(TimeEvent *te);

      Item *findInByClass(Item *i, int16 m);
      Item *nextInByClass(Item *i, int16 m);
      Item *findMaster(int16 a, int16 n);
      Item *nextMaster(Item *item, int16 a, int16 n);
      int wordMatch(Item *item, int16 a, int16 n);

      bool isRoom(Item *item);
      bool isObject(Item *item);
      bool isPlayer(Item *item);

      void itemChildrenChanged(Item *item);
      void unlinkItem(Item *item);
      void linkItem(Item *item, Item *parent);

      void setItemParent(Item *item, Item *parent);
      void setItemState(Item *item, int value);

      void stopAnimate(uint16 a);
      void stopAnimateSimon2(uint16 a, uint16 b);

      void enableBox(uint hitarea);
      void disableBox(uint hitarea);
      void moveBox(uint hitarea, int x, int y);
      bool isBoxDead(uint hitarea);
      void undefineBox(uint hitarea);
      void defineBox(int id, int x, int y, int width, int height, int flags, int verb, Item *item_ptr);
      HitArea *findEmptyHitArea();

      virtual void resetVerbs();
      virtual void setVerb(HitArea * ha);
      virtual void hitarea_leave(HitArea * ha, bool state = false);
      void leaveHitAreaById(uint hitarea_id);

      void sendSync(uint a);
      void waitForSync(uint a);

      uint getOffsetOfChild2Param(SubObject *child, uint prop);
      void scriptMouseOff();
      void freezeBottom();
      void unfreezeBottom();

      TextLocation *getTextLocation(uint a);

      uint setVerbText(HitArea *ha);
      void waitForInput();
      void setup_cond_c_helper();

      uint16 getBackExit(int n);
      uint16 getDoorState(Item *item, uint16 d);
      uint16 getExitOf(Item *item, uint16 d);
      void changeDoorState(SubRoom *r, uint16 d, uint16 n);
      void setDoorState(Item *i, uint16 d, uint16 n);

      // Elvira 1 specific
      Item *getDoorOf(Item *item, uint16 d);
      Item *getExitOf_e1(Item *item, uint16 d);
      virtual void moveDirn(Item *i, uint x);

      virtual int canPlace(Item *x, Item *y);
      int contains(Item *a, Item *b);
      int sizeContents(Item *x);
      virtual int sizeOfRec(Item *o, int d);
      int sizeRec(Item *x, int d);
      int weighUp(Item *x);
      int weightRec(Item *x, int d);
      virtual int weightOf(Item *x);
      void xPlace(Item *x, Item *y);

      void drawMenuStrip(uint windowNum, uint menuNum);
      void lightMenuStrip(int a);
      void unlightMenuStrip();
      void lightMenuBox(uint hitarea);

      uint menuFor_e2(Item *item);
      uint menuFor_ww(Item *item, uint id);
      void clearMenuStrip();
      void doMenuStrip(uint menuNum);

      void mouseOff();
      void mouseOn();

      bool loadRoomItems(uint16 item);

      virtual bool loadTablesIntoMem(uint16 subr_id);
      bool loadXTablesIntoMem(uint16 subr_id);
      void loadTextIntoMem(uint16 stringId);

      uint loadTextFile(const char *filename, byte *dst);
      Common::File *openTablesFile(const char *filename);
      void closeTablesFile(Common::File *in);

      uint loadTextFile_simon1(const char *filename, byte *dst);
      Common::File *openTablesFile_simon1(const char *filename);

      uint loadTextFile_gme(const char *filename, byte *dst);
      Common::File *openTablesFile_gme(const char *filename);

      void invokeTimeEvent(TimeEvent *te);
      bool kickoffTimeEvents();
      void killAllTimers();

      void endCutscene();
      void runSubroutine101();

      virtual void inventoryUp(WindowBlock *window);
      virtual void inventoryDown(WindowBlock *window);

      WindowBlock *openWindow(uint x, uint y, uint w, uint h, uint flags, uint fillColor, uint textColor);
      uint getWindowNum(WindowBlock *window);
      void clearWindow(WindowBlock *window);
      void changeWindow(uint a);
      void closeWindow(uint a);
      void setTextColor(uint color);
      void windowPutChar(WindowBlock *window, byte c, byte b = 0);
      void waitWindow(WindowBlock *window);

      HitArea *findBox(uint hitarea_id);
      void boxController(uint x, uint y, uint mode);
      void handleVerbClicked(uint verb);
      virtual void clearName();
      void displayName(HitArea * ha);
      void resetNameWindow();
      void displayBoxStars();
      void invertBox(HitArea * ha, byte a, byte b, byte c, byte d);

      virtual void initMouse();
      virtual void handleMouseMoved();
      virtual void drawMousePointer();

      void drawArrow(uint16 x, uint16 y, int8 dir);
      virtual void addArrows(WindowBlock *window, uint8 num);
      virtual void removeArrows(WindowBlock *window, uint num);

      virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y);
      virtual bool hasIcon(Item *item);
      virtual uint itemGetIconNumber(Item *item);
      virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr);

      virtual void drawIconArray(uint i, Item *item_ptr, int line, int classMask);
      void removeIconArray(uint num);

      void loadIconData();
      void loadIconFile();
      void loadMenuFile();

      bool processSpecialKeys();
      void hitarea_stuff_helper();

      void permitInput();

      uint getFeebleFontSize(byte chr);
      void justifyStart();
      void justifyOutPut(byte chr);

      void loadZone(uint16 zoneNum);

      void animate(uint16 windowNum, uint16 zoneNum, uint16 vgaSpriteId, int16 x, int16 y, uint16 palette, bool vgaScript = false);
      void setImage(uint16 vga_res_id, bool vgaScript = false);
      void setWindowImage(uint16 mode, uint16 vga_res_id);
      void setWindowImageEx(uint16 mode, uint16 vga_res);

      void skipSpeech();

      bool printNameOf(Item *item, uint x, uint y);
      bool printTextOf(uint a, uint x, uint y);
      void printVerbOf(uint hitarea_id);
      void showActionString(const byte *string);

      virtual void printScreenText(uint vga_sprite_id, uint color, const char *string_ptr, int16 x, int16 y, int16 width);

      void renderStringAmiga(uint vga_sprite_id, uint color, uint width, uint height, const char *txt);
      void renderString(uint vga_sprite_id, uint color, uint width, uint height, const char *txt);

      void writeChar(WindowBlock *window, int x, int y, int offs, int val);

      byte *allocBlock(uint32 size);
      void checkNoOverWrite();
      void checkRunningAnims();
      void checkAnims(uint a);
      void checkZonePtrs();
      void setZoneBuffers();

      void runVgaScript();

public:
      bool getBitFlag(uint bit);
      void setBitFlag(uint bit, bool value);

      // Video Script Opcodes, Common
      void vc1_fadeOut();
      void vc2_call();
      void vc3_loadSprite();
      void vc4_fadeIn();
      void vc5_ifEqual();
      void vc6_ifObjectHere();
      void vc7_ifObjectNotHere();
      void vc8_ifObjectIsAt();
      void vc9_ifObjectStateIs();
      void vc10_draw();
      void vc12_delay();
      void vc13_addToSpriteX();
      void vc14_addToSpriteY();
      void vc15_sync();
      void vc16_waitSync();
      void vc18_jump();
      void vc19_loop();
      void vc20_setRepeat();
      void vc21_endRepeat();
      void vc23_setPriority();
      void vc24_setSpriteXY();
      void vc25_halt_sprite();
      void vc26_setSubWindow();
      void vc27_resetSprite();
      void vc28_playSFX();
      void vc29_stopAllSounds();
      void vc30_setFrameRate();
      void vc31_setWindow();
      void vc33_setMouseOn();
      void vc34_setMouseOff();
      void vc35_clearWindow();
      void vc36_setWindowImage();
      void vc38_ifVarNotZero();
      void vc39_setVar();
      void vc40_scrollRight();
      void vc41_scrollLeft();
      void vc42_delayIfNotEQ();

      // Video Script Opcodes, Elvira 1
      void vc17_waitEnd();
      void vc22_setPaletteOld();
      void vc32_saveScreen();
      void vc37_pokePalette();

      // Video Script Opcodes, Elvira 2
      void vc43_ifBitSet();
      void vc44_ifBitClear();
      void vc45_setWindowPalette();
      void vc46_setPaletteSlot1();
      void vc47_setPaletteSlot2();
      void vc48_setPaletteSlot3();
      void vc49_setBit();
      void vc50_clearBit();
      void vc51_enableBox();
      void vc52_playSound();
      void vc53_dissolveIn();
      void vc54_dissolveOut();
      void vc55_moveBox();
      void vc56_fullScreen();
      void vc57_blackPalette();
      void vc58_checkCodeWheel();
      void vc58_changePriority();
      void vc59_ifEGA();

      // Video Script Opcodes, Waxworks
      void vc60_stopAnimation();
      void vc61();
      void vc62_fastFadeOut();
      void vc63_fastFadeIn();

      // Video Script Opcodes, Simon 1
      void vc11_clearPathFinder();
      void vc17_setPathfinderItem();
      void vc32_copyVar();
      void vc37_addToSpriteY();
      void vc45_setSpriteX();
      void vc46_setSpriteY();
      void vc47_addToVar();
      void vc48_setPathFinder();
      void vc59_ifSpeech();
      void vc61_setMaskImage();
      void vc22_setPaletteNew();

      // Video Script Opcodes, Simon 2
      void vc56_delayLong();
      void vc59_stopAnimations();
      void vc64_ifSpeech();
      void vc65_slowFadeIn();
      void vc66_ifEqual();
      void vc67_ifLE();
      void vc68_ifGE();
      void vc69_playSeq();
      void vc70_joinSeq();
      void vc71_ifSeqWaiting();
      void vc72_segue();
      void vc73_setMark();
      void vc74_clearMark();

      // Video Script Opcodes, Feeble Files
      void vc75_setScale();
      void vc76_setScaleXOffs();
      void vc77_setScaleYOffs();
      void vc78_computeXY();
      void vc79_computePosNum();
      void vc80_setOverlayImage();
      void vc81_setRandom();
      void vc82_getPathValue();
      void vc83_playSoundLoop();
      void vc84_stopSoundLoop();

      void setScriptCondition(bool cond);
      bool getScriptCondition();
      void setScriptReturn(int ret);
      int getScriptReturn();

      // Opcodes, common
      void o_invalid();
      void o_at();
      void o_notAt();
      void o_carried();
      void o_notCarried();
      void o_isAt();
      void o_zero();
      void o_notZero();
      void o_eq();
      void o_notEq();
      void o_gt();
      void o_lt();
      void o_eqf();
      void o_notEqf();
      void o_ltf();
      void o_gtf();
      void o_chance();
      void o_isRoom();
      void o_isObject();
      void o_state();
      void o_oflag();
      void o_destroy();
      void o_place();
      void o_copyff();
      void o_clear();
      void o_let();
      void o_add();
      void o_sub();
      void o_addf();
      void o_subf();
      void o_mul();
      void o_div();
      void o_mulf();
      void o_divf();
      void o_mod();
      void o_modf();
      void o_random();
      void o_goto();
      void o_oset();
      void o_oclear();
      void o_putBy();
      void o_inc();
      void o_dec();
      void o_setState();
      void o_print();
      void o_message();
      void o_msg();
      void o_end();
      void o_done();
      void o_process();
      void o_when();
      void o_if1();
      void o_if2();
      void o_isCalled();
      void o_is();
      void o_debug();
      void o_comment();
      void o_haltAnimation();
      void o_restartAnimation();
      void o_getParent();
      void o_getNext();
      void o_getChildren();
      void o_picture();
      void o_loadZone();
      void o_killAnimate();
      void o_defWindow();
      void o_window();
      void o_cls();
      void o_closeWindow();
      void o_addBox();
      void o_delBox();
      void o_enableBox();
      void o_disableBox();
      void o_moveBox();
      void o_doIcons();
      void o_isClass();
      void o_setClass();
      void o_unsetClass();
      void o_waitSync();
      void o_sync();
      void o_defObj();
      void o_here();
      void o_doClassIcons();
      void o_playTune();
      void o_setAdjNoun();
      void o_saveUserGame();
      void o_loadUserGame();
      void o_copysf();
      void o_restoreIcons();
      void o_freezeZones();
      void o_placeNoIcons();
      void o_clearTimers();
      void o_setDollar();
      void o_isBox();

      int16 moreText(Item *i);
      void lobjFunc(Item *i, const char *f);
      uint confirmYesOrNo(uint16 x, uint16 y);
      uint continueOrQuit();
      void printScroll();
      virtual void printStats();
      void synchChain(Item *i);

protected:
      bool drawImage_clip(VC10_state *state);

      void drawImage_init(int16 image, uint16 palette, int16 x, int16 y, uint16 flags);

      virtual void drawImage(VC10_state *state);
      void drawBackGroundImage(VC10_state *state);
      void drawVertImage(VC10_state *state);
      void drawVertImageCompressed(VC10_state *state);
      void drawVertImageUncompressed(VC10_state *state);

      void setMoveRect(uint16 x, uint16 y, uint16 width, uint16 height);

      void horizontalScroll(VC10_state *state);
      void verticalScroll(VC10_state *state);

      int vcReadVarOrWord();
      uint vcReadNextWord();
      uint vcReadNextByte();
      uint vcReadVar(uint var);
      void vcWriteVar(uint var, int16 value);
      void vcSkipNextInstruction();

      int getScale(int16 y, int16 x);
      void checkScrollX(int16 x, int16 xpos);
      void checkScrollY(int16 y, int16 ypos);
      void centreScroll();

      void clearVideoWindow(uint16 windowNum, uint16 color);
      void clearVideoBackGround(uint16 windowNum, uint16 color);

      void setPaletteSlot(uint16 srcOffs, uint8 dstOffs);
      void checkWaitEndTable();

      void startOverlayAnims();
      void startAnOverlayAnim();

      bool itemIsSiblingOf(uint16 val);
      bool itemIsParentOf(uint16 a, uint16 b);
      bool vc_maybe_skip_proc_1(uint16 a, int16 b);

      bool isVgaQueueEmpty();
      void haltAnimation();
      void restartAnimation();
      void addVgaEvent(uint16 num, uint8 type, const byte *code_ptr, uint16 cur_sprite, uint16 curZoneNum);
      void deleteVgaEvent(VgaTimerEntry * vte);
      void processVgaEvents();
      void animateEvent(const byte *code_ptr, uint16 curZoneNum, uint16 cur_sprite);
      void scrollEvent();
      void drawStuff(const byte *src, uint offs);
      void playerDamageEvent(VgaTimerEntry * vte, uint dx);
      void monsterDamageEvent(VgaTimerEntry * vte, uint dx);

      VgaSprite *findCurSprite();

      bool isSpriteLoaded(uint16 id, uint16 zoneNum);

      void resetWindow(WindowBlock *window);
      void freeBox(uint index);

      void sendWindow(uint a);

      virtual void colorWindow(WindowBlock *window);
      void colorBlock(WindowBlock *window, uint16 x, uint16 y, uint16 w, uint16 h);

      void restoreWindow(WindowBlock *window);
      void restoreBlock(uint16 h, uint16 w, uint16 y, uint16 x);

      byte *getBackBuf();
      byte *getBackGround();
      byte *getScaleBuf();

      byte *convertImage(VC10_state *state, bool compressed);

      bool decrunchFile(byte *src, byte *dst, uint32 size);
      void loadVGABeardFile(uint16 id);
      void loadVGAVideoFile(uint16 id, uint8 type);
      bool loadVGASoundFile(uint16 id, uint8 type);

      void openGameFile();
      void readGameFile(void *dst, uint32 offs, uint32 size);

      void dimp_idle();
      void timer_callback();
      virtual void timer_proc1();

      virtual void animateSprites();

      void dirtyClips();
      void dirtyClipCheck(int16 x, int16 y, int16 w, int16 h);
      void dirtyBackGround();
      void restoreBackGround();
      void saveBackGround(VgaSprite *vsp);

      void clearSurfaces();
      void displayScreen();

      void dumpVideoScript(const byte *src, bool one_opcode_only);
      virtual void dumpVgaFile(const byte *vga);
      void dumpVgaScript(const byte *ptr, uint res, uint sprite_id);
      void dumpVgaScriptAlways(const byte *ptr, uint res, uint sprite_id);
      void dumpVgaBitmaps(const byte *vga, byte *vga1, int res);
      void dumpSingleBitmap(int file, int image, const byte *offs, int w, int h, byte base);
      void dumpBitmap(const char *filename, const byte *offs, int w, int h, int flags, const byte *palette, byte base);

      void fillBackFromBackGround(uint16 height, uint16 width);
      void fillBackFromFront();
      void fillBackGroundFromBack();
      void fillBackGroundFromFront();

      virtual void doOutput(const byte *src, uint len);
      void clsCheck(WindowBlock *window);

      void quickLoadOrSave();
      void shutdown();

      byte *vc10_uncompressFlip(const byte *src, uint w, uint h);
      byte *vc10_flip(const byte *src, uint w, uint h);

      Item *getNextItemPtrStrange();

      virtual bool loadGame(const char *filename, bool restartMode = false);
      virtual bool saveGame(uint slot, const char *caption);

      void openTextWindow();
      void tidyIconArray(uint i);

      virtual void windowNewLine(WindowBlock *window);
      void windowScroll(WindowBlock *window);
      void windowDrawChar(WindowBlock *window, uint x, uint y, byte chr);

      void loadMusic(uint16 track);
      void playModule(uint16 music);
      virtual void playMusic(uint16 music, uint16 track);
      void stopMusic();

      void checkTimerCallback();
      void delay(uint delay);
      void pause();

      void waitForMark(uint i);
      void scrollScreen();

      void decodeColumn(byte *dst, const byte *src, int height);
      void decodeRow(byte *dst, const byte *src, int width);
      void hitarea_stuff_helper_2();
      void fastFadeIn();
      void slowFadeIn();

      virtual void vcStopAnimation(uint16 zone, uint16 sprite);

      virtual bool confirmOverWrite(WindowBlock *window);
      int16 matchSaveGame(const char *name, uint16 max);
      void disableFileBoxes();
      virtual void userGame(bool load);
      void userGameBackSpace(WindowBlock *window, int x, byte b = 0);
      void fileError(WindowBlock *window, bool save_error);

      int countSaveGames();

      virtual char *genSaveName(int slot);
};

class AGOSEngine_Elvira1 : public AGOSEngine {
public:
      AGOSEngine_Elvira1(OSystem *system);
      //~AGOSEngine_Elvira1();

      virtual void setupGame();
      virtual void setupOpcodes();
      virtual void setupVideoOpcodes(VgaOpcodeProc *op);

      virtual void executeOpcode(int opcode);

      void oe1_present();
      void oe1_notPresent();
      void oe1_worn();
      void oe1_notWorn();
      void oe1_notCarried();
      void oe1_isNotAt();
      void oe1_sibling();
      void oe1_notSibling();
      void oe1_isIn();
      void oe1_isNotIn();
      void oe1_isPlayer();
      void oe1_canPut();
      void oe1_create();
      void oe1_copyof();
      void oe1_copyfo();
      void oe1_whatO();
      void oe1_weigh();
      void oe1_setFF();
      void oe1_moveDirn();
      void oe1_score();
      void oe1_look();
      void oe1_doClass();
      void oe1_pObj();
      void oe1_pName();
      void oe1_pcName();
      void oe1_isCalled();
      void oe1_cFlag();
      void oe1_rescan();
      void oe1_setUserItem();
      void oe1_getUserItem();
      void oe1_whereTo();
      void oe1_doorExit();
      void oe1_loadGame();
      void oe1_clearUserItem();
      void oe1_findMaster();
      void oe1_nextMaster();
      void oe1_animate();
      void oe1_stopAnimate();
      void oe1_menu();
      void oe1_enableInput();
      void oe1_setTime();
      void oe1_ifTime();
      void oe1_playTune();
      void oe1_bitClear();
      void oe1_bitSet();
      void oe1_bitTest();
      void oe1_zoneDisk();
      void oe1_printStats();
      void oe1_stopTune();
      void oe1_printPlayerDamage();
      void oe1_printMonsterDamage();
      void oe1_pauseGame();
      void oe1_printPlayerHit();
      void oe1_printMonsterHit();

protected:
      typedef void (AGOSEngine_Elvira1::*OpcodeProcElvira1) ();
      struct OpcodeEntryElvira1 {
            OpcodeProcElvira1 proc;
            const char *desc;
      };

      const OpcodeEntryElvira1 *_opcodesElvira1;
};

class AGOSEngine_Elvira2 : public AGOSEngine_Elvira1 {
public:
      AGOSEngine_Elvira2(OSystem *system);
      //~AGOSEngine_Elvira2();

      virtual void setupGame();
      virtual void setupOpcodes();
      virtual void setupVideoOpcodes(VgaOpcodeProc *op);

      virtual void executeOpcode(int opcode);

      void oe2_moveDirn();
      void oe2_doClass();
      void oe2_pObj();
      void oe2_isCalled();
      void oe2_menu();
      void oe2_drawItem();
      void oe2_doTable();
      void oe2_pauseGame();
      void oe2_setDoorOpen();
      void oe2_setDoorClosed();
      void oe2_setDoorLocked();
      void oe2_ifDoorOpen();
      void oe2_ifDoorClosed();
      void oe2_ifDoorLocked();
      void oe2_storeItem();
      void oe2_getItem();
      void oe2_bSet();
      void oe2_bClear();
      void oe2_bZero();
      void oe2_bNotZero();
      void oe2_getOValue();
      void oe2_setOValue();
      void oe2_ink();
      void oe2_printStats();
      void oe2_setSuperRoom();
      void oe2_getSuperRoom();
      void oe2_setExitOpen();
      void oe2_setExitClosed();
      void oe2_setExitLocked();
      void oe2_ifExitOpen();
      void oe2_ifExitClosed();
      void oe2_ifExitLocked();
      void oe2_playEffect();
      void oe2_getDollar2();
      void oe2_setSRExit();
      void oe2_printPlayerDamage();
      void oe2_printMonsterDamage();
      void oe2_isAdjNoun();
      void oe2_b2Set();
      void oe2_b2Clear();
      void oe2_b2Zero();
      void oe2_b2NotZero();

      virtual void printStats();
protected:
      typedef void (AGOSEngine_Elvira2::*OpcodeProcElvira2) ();
      struct OpcodeEntryElvira2 {
            OpcodeProcElvira2 proc;
            const char *desc;
      };

      const OpcodeEntryElvira2 *_opcodesElvira2;

      virtual void readItemChildren(Common::SeekableReadStream *in, Item *item, uint tmp);

      virtual bool loadGame(const char *filename, bool restartMode = false);
      virtual bool saveGame(uint slot, const char *caption);

      virtual void addArrows(WindowBlock *window, uint8 num);
      virtual void removeArrows(WindowBlock *window, uint num);

      virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y);
      virtual bool hasIcon(Item *item);
      virtual uint itemGetIconNumber(Item *item);
      virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr);

      virtual void moveDirn(Item *i, uint x);
      virtual int canPlace(Item *x, Item *y);
      virtual int sizeOfRec(Item *o, int d);
      virtual int weightOf(Item *x);

      int changeExitStates(SubSuperRoom *sr, int n, int d, uint16 s);
      uint16 getExitState(Item *item, uint16 x, uint16 d);
      void setExitState(Item *i, uint16 n, uint16 d, uint16 s);
      void setSRExit(Item *i, int n, int d, uint16 s);

      virtual void listSaveGames(char *dst);
      virtual bool confirmOverWrite(WindowBlock *window);
      virtual void userGame(bool load);
      virtual int userGameGetKey(bool *b, char *buf, uint maxChar);

      virtual char *genSaveName(int slot);
};

class AGOSEngine_Waxworks : public AGOSEngine_Elvira2 {
public:
      AGOSEngine_Waxworks(OSystem *system);
      //~AGOSEngine_Waxworks();

      virtual void setupGame();
      virtual void setupOpcodes();
      virtual void setupVideoOpcodes(VgaOpcodeProc *op);

      virtual void executeOpcode(int opcode);

      void boxTextMessage(const char *x);
      void boxTextMsg(const char *x);
      void printBox();
      uint16 getBoxSize();
      uint16 checkFit(char *Ptr, int width, int lines);

      void oww_goto();
      void oww_addTextBox();
      void oww_setShortText();
      void oww_setLongText();
      void oww_printLongText();
      void oww_whereTo();
      void oww_textMenu();
      void oww_pauseGame();
      void oww_boxMessage();
      void oww_boxMsg();
      void oww_boxLongText();
      void oww_printBox();
      void oww_boxPObj();
      void oww_lockZones();
      void oww_unlockZones();

protected:
      typedef void (AGOSEngine_Waxworks::*OpcodeProcWaxworks) ();
      struct OpcodeEntryWaxworks {
            OpcodeProcWaxworks proc;
            const char *desc;
      };

      const OpcodeEntryWaxworks *_opcodesWaxworks;

      virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y);

      virtual void addArrows(WindowBlock *window, uint8 num);
      virtual void removeArrows(WindowBlock *window, uint num);

      virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr);

      virtual bool loadTablesIntoMem(uint16 subr_id);

      virtual void moveDirn(Item *i, uint x);

      virtual bool confirmOverWrite(WindowBlock *window);

      virtual char *genSaveName(int slot);
};

class AGOSEngine_Simon1 : public AGOSEngine_Waxworks {
public:
      AGOSEngine_Simon1(OSystem *system);
      //~AGOSEngine_Simon1();

      virtual void setupGame();
      virtual void setupOpcodes();
      virtual void setupVideoOpcodes(VgaOpcodeProc *op);

      virtual void executeOpcode(int opcode);

      // Opcodes, Simon 1
      void os1_animate();
      void os1_pauseGame();
      void os1_screenTextBox();
      void os1_screenTextMsg();
      void os1_playEffect();
      void os1_screenTextPObj();
      void os1_getPathPosn();
      void os1_scnTxtLongText();
      void os1_mouseOn();
      void os1_mouseOff();
      void os1_loadBeard();
      void os1_unloadBeard();
      void os1_unloadZone();
      void os1_loadStrings();
      void os1_unfreezeZones();
      void os1_specialFade();

protected:
      typedef void (AGOSEngine_Simon1::*OpcodeProcSimon1) ();
      struct OpcodeEntrySimon1 {
            OpcodeProcSimon1 proc;
            const char *desc;
      };

      const OpcodeEntrySimon1 *_opcodesSimon1;

      virtual void drawImage(VC10_state *state);
      void drawMaskedImage(VC10_state *state);
      void draw32ColorImage(VC10_state *state);

      virtual void dumpVgaFile(const byte *vga);

      virtual void clearName();

      virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y);

      virtual void initMouse();
      virtual void handleMouseMoved();

      virtual void addArrows(WindowBlock *window, uint8 num);
      virtual void removeArrows(WindowBlock *window, uint num);

      virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr);

      virtual void playSpeech(uint16 speech_id, uint16 vga_sprite_id);

      virtual void listSaveGames(char *dst);
      virtual void userGame(bool load);
      virtual int userGameGetKey(bool *b, char *buf, uint maxChar);

      virtual void playMusic(uint16 music, uint16 track);

      virtual void vcStopAnimation(uint16 zone, uint16 sprite);

      virtual char *genSaveName(int slot);
};

class AGOSEngine_Simon2 : public AGOSEngine_Simon1 {
public:
      AGOSEngine_Simon2(OSystem *system);
      //~AGOSEngine_Simon2();

      virtual void setupGame();
      virtual void setupOpcodes();
      virtual void setupVideoOpcodes(VgaOpcodeProc *op);

      virtual void executeOpcode(int opcode);

      void os2_printLongText();
      void os2_rescan();
      void os2_animate();
      void os2_stopAnimate();
      void os2_playTune();
      void os2_screenTextPObj();
      void os2_mouseOn();
      void os2_mouseOff();
      void os2_isShortText();
      void os2_clearMarks();
      void os2_waitMark();

protected:
      typedef void (AGOSEngine_Simon2::*OpcodeProcSimon2) ();
      struct OpcodeEntrySimon2 {
            OpcodeProcSimon2 proc;
            const char *desc;
      };

      const OpcodeEntrySimon2 *_opcodesSimon2;

      virtual void clearName();

      virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y);

      virtual void addArrows(WindowBlock *window, uint8 num);
      virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr);

      virtual void playSpeech(uint16 speech_id, uint16 vga_sprite_id);

      virtual char *genSaveName(int slot);
};

class AGOSEngine_Feeble : public AGOSEngine_Simon2 {
public:
      AGOSEngine_Feeble(OSystem *system);
      //~AGOSEngine_Feeble();

      virtual void setupGame();
      virtual void setupOpcodes();
      virtual void setupVideoOpcodes(VgaOpcodeProc *op);

      virtual void executeOpcode(int opcode);

      void off_chance();
      void off_jumpOut();
      void off_addTextBox();
      void off_printLongText();
      void off_addBox();
      void off_oracleTextDown();
      void off_oracleTextUp();
      void off_ifTime();
      void off_setTime();
      void off_saveUserGame();
      void off_loadUserGame();
      void off_listSaveGames();
      void off_checkCD();
      void off_screenTextBox();
      void off_isAdjNoun();
      void off_hyperLinkOn();
      void off_hyperLinkOff();
      void off_checkPaths();
      void off_screenTextPObj();
      void off_mouseOn();
      void off_mouseOff();
      void off_loadVideo();
      void off_playVideo();
      void off_centreScroll();
      void off_resetPVCount();
      void off_setPathValues();
      void off_stopClock();
      void off_restartClock();
      void off_setColour();
      void off_b3Set();
      void off_b3Clear();
      void off_b3Zero();
      void off_b3NotZero();

protected:
      typedef void (AGOSEngine_Feeble::*OpcodeProcFeeble) ();
      struct OpcodeEntryFeeble {
            OpcodeProcFeeble proc;
            const char *desc;
      };

      const OpcodeEntryFeeble *_opcodesFeeble;

      virtual uint16 to16Wrapper(uint value);
      virtual uint16 readUint16Wrapper(const void *src);
      virtual uint32 readUint32Wrapper(const void *src);

      virtual void drawImage(VC10_state *state);
      void scaleClip(int16 h, int16 w, int16 y, int16 x, int16 scrollY);

      void drawMousePart(int image, byte x, byte y);
      virtual void initMouse();
      virtual void drawMousePointer();

      virtual void animateSprites();
      void animateSpritesByY();

      void oracleLogo();
      void swapCharacterLogo();
      virtual void timer_proc1();

      virtual void addArrows(WindowBlock *window, uint8 num);
      virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr);

      virtual void resetVerbs();
      virtual void setVerb(HitArea * ha);
      virtual void hitarea_leave(HitArea * ha, bool state = false);
      void invertBox(HitArea *ha, bool state);

      virtual void windowNewLine(WindowBlock *window);

      virtual void clearName();

      virtual void drawIconArray(uint i, Item *item_ptr, int line, int classMask);

      virtual void colorWindow(WindowBlock *window);

      virtual void dumpVgaFile(const byte *vga);

      virtual void doOutput(const byte *src, uint len);

      virtual void printScreenText(uint vga_sprite_id, uint color, const char *string_ptr, int16 x, int16 y, int16 width);

      void printInteractText(uint16 num, const char *string);
      void sendInteractText(uint16 num, const char *fmt, ...);

      void checkLinkBox();
      void hyperLinkOn(uint16 x);
      void hyperLinkOff();
      void linksUp();
      void linksDown();

      void checkUp(WindowBlock *window);
      void checkDown(WindowBlock *window);
      virtual void inventoryUp(WindowBlock *window);
      virtual void inventoryDown(WindowBlock *window);

      void oracleTextUp();
      void oracleTextDown();
      void scrollOracle();
      void scrollOracleUp();
      void scrollOracleDown();

      void listSaveGames(int n);
      void saveUserGame(int slot);
      void windowBackSpace(WindowBlock *window);

      virtual char *genSaveName(int slot);
};

class AGOSEngine_PuzzlePack : public AGOSEngine_Feeble {
public:
      AGOSEngine_PuzzlePack(OSystem *system);
      //~AGOSEngine_PuzzlePack();

      virtual void setupGame();
      virtual void setupOpcodes();

      virtual void executeOpcode(int opcode);

      void opp_iconifyWindow();
      void opp_restoreOopsPosition();
      void opp_loadMouseImage();
      void opp_message();
      void opp_setShortText();
      void opp_loadHiScores();
      void opp_checkHiScores();
      void opp_sync();
      void opp_saveUserGame();
      void opp_loadUserGame();
      void opp_playTune();
      void opp_saveOopsPosition();
      void opp_resetGameTime();
      void opp_resetPVCount();
      void opp_setPathValues();
      void opp_restartClock();

protected:
      typedef void (AGOSEngine_PuzzlePack::*OpcodeProcPuzzlePack) ();
      struct OpcodeEntryPuzzlePack {
            OpcodeProcPuzzlePack proc;
            const char *desc;
      };

      const OpcodeEntryPuzzlePack *_opcodesPuzzlePack;

      virtual void initMouse();
      virtual void handleMouseMoved();
      virtual void drawMousePointer();

      virtual void resetVerbs();

      void loadMouseImage();

      virtual char *genSaveName(int slot);
};

} // End of namespace AGOS

#endif

Generated by  Doxygen 1.6.0   Back to index