aboutsummaryrefslogtreecommitdiff
path: root/scumm/scumm.h
diff options
context:
space:
mode:
authorMax Horn2002-08-21 16:07:07 +0000
committerMax Horn2002-08-21 16:07:07 +0000
commitce46866403fdcc479cf9d67e4d430409b15dadc3 (patch)
tree75ebfaa1ed13f549959d76d3ce101c3e66f5451b /scumm/scumm.h
parent662256f25dbe43abf67077a804e225738765f009 (diff)
downloadscummvm-rg350-ce46866403fdcc479cf9d67e4d430409b15dadc3.tar.gz
scummvm-rg350-ce46866403fdcc479cf9d67e4d430409b15dadc3.tar.bz2
scummvm-rg350-ce46866403fdcc479cf9d67e4d430409b15dadc3.zip
Initial revision
svn-id: r4785
Diffstat (limited to 'scumm/scumm.h')
-rw-r--r--scumm/scumm.h1414
1 files changed, 1414 insertions, 0 deletions
diff --git a/scumm/scumm.h b/scumm/scumm.h
new file mode 100644
index 0000000000..930d25e5d5
--- /dev/null
+++ b/scumm/scumm.h
@@ -0,0 +1,1414 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001 Ludvig Strigeus
+ * Copyright (C) 2001/2002 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#ifndef SCUMM_H
+#define SCUMM_H
+
+#include "engine.h"
+#include "bundle.h"
+#include "timer.h"
+#include "sound.h"
+
+#define SCUMMVM_VERSION "0.2.2 CVS"
+#define SCUMMVM_CVS "2002-08-03"
+
+#define SWAP(a,b) do{int tmp=a; a=b; b=tmp; } while(0)
+#define ARRAYSIZE(x) (sizeof(x)/sizeof(x[0]))
+
+class GameDetector;
+class Gui;
+class NewGui;
+class Scumm;
+class IMuse;
+class Actor;
+struct ScummDebugger;
+struct Serializer;
+struct FindObjectInRoom;
+
+typedef void (Scumm::*OpcodeProc)();
+
+// Use g_scumm from error() ONLY
+extern Scumm *g_scumm;
+
+/* System Wide Constants */
+enum {
+ NUM_MIXER = 4,
+ NUM_SCRIPT_SLOT = 40,
+ NUM_LOCALSCRIPT = 60,
+ NUM_SHADOW_PALETTE = 8,
+ MAX_ACTORS = 30,
+ KEY_SET_OPTIONS = 3456 // WinCE
+};
+
+enum {
+ kDefaultMasterVolume = 192,
+ kDefaultSFXVolume = 192,
+ kDefaultMusicVolume = 192
+};
+
+struct ScummPoint {
+ int x, y;
+};
+
+struct MemBlkHeader {
+ uint32 size;
+};
+
+struct VerbSlot {
+ int16 x, y;
+ int16 right, bottom;
+ int16 oldleft, oldtop, oldright, oldbottom;
+ uint8 verbid;
+ uint8 color, hicolor, dimcolor, bkcolor, type;
+ uint8 charset_nr, curmode;
+ uint8 saveid;
+ uint8 key;
+ bool center;
+ uint8 field_1B;
+ uint16 imgindex;
+};
+
+class ObjectData {
+public:
+ uint32 offs_obim_to_room;
+ uint32 offs_obcd_to_room;
+ int16 walk_x, walk_y;
+ uint16 obj_nr;
+ int16 x_pos;
+ int16 y_pos;
+ uint16 width;
+ uint16 height;
+ byte actordir;
+ byte parent;
+ byte parentstate;
+ byte state;
+ byte fl_object_index;
+};
+
+struct ScriptSlot {
+ uint32 offs;
+ int32 delay;
+ uint16 number;
+ uint16 newfield;
+ byte status;
+ byte where;
+ byte unk1, unk2, freezeCount, didexec;
+ byte cutsceneOverride;
+ byte unk5;
+};
+
+struct NestedScript {
+ uint16 number;
+ uint8 where;
+ uint8 slot;
+};
+
+enum ResTypes {
+ rtFirst = 1,
+ rtRoom = 1,
+ rtScript = 2,
+ rtCostume = 3,
+ rtSound = 4,
+ rtInventory = 5,
+ rtCharset = 6,
+ rtString = 7,
+ rtVerb = 8,
+ rtActorName = 9,
+ rtBuffer = 10,
+ rtScaleTable = 11,
+ rtTemp = 12,
+ rtFlObject = 13,
+ rtMatrix = 14,
+ rtBox = 15,
+ rtObjectName = 16,
+ rtRoomScripts = 17,
+ rtLast = 17,
+ rtNumTypes = 18
+};
+
+enum {
+ LIGHTMODE_dark = 0,
+ LIGHTMODE_actor_base = 1,
+ LIGHTMODE_screen = 2,
+ LIGHTMODE_flashlight = 4,
+ LIGHTMODE_actor_color = 8
+};
+
+enum {
+ MBS_LEFT_CLICK = 0x8000,
+ MBS_RIGHT_CLICK = 0x4000,
+ MBS_MOUSE_MASK = (MBS_LEFT_CLICK | MBS_RIGHT_CLICK),
+ MBS_MAX_KEY = 0x0200
+};
+
+#define _maxRooms res.num[rtRoom]
+#define _maxScripts res.num[rtScript]
+#define _maxCostumes res.num[rtCostume]
+#define _maxInventoryItems res.num[rtInventory]
+#define _maxCharsets res.num[rtCharset]
+#define _maxStrings res.num[rtString]
+#define _maxVerbs res.num[rtVerb]
+#define _maxActorNames res.num[rtActorName]
+#define _maxBuffer res.num[rtBuffer]
+#define _maxScaleTable res.num[rtScaleTable]
+#define _maxTemp res.num[rtTemp]
+#define _maxFLObject res.num[rtFlObject]
+#define _maxMatrixes res.num[rtMatrix]
+#define _maxBoxes res.num[rtBox]
+
+#define _baseRooms res.address[rtRoom]
+#define _baseScripts res.address[rtScript]
+#define _baseInventoryItems res.address[rtInventory]
+#define _baseFLObject res.address[rtFlObject]
+#define _baseArrays res.address[rtString]
+
+#define _roomFileOffsets res.roomoffs[rtRoom]
+
+struct CharsetRenderer {
+ Scumm *_vm;
+ int _top;
+ int _drawTop;
+ int _left, _left2;
+ byte _center;
+ int _right;
+ byte _color;
+ bool _hasMask;
+ bool _blitAlso;
+
+ int _strLeft, _strRight, _strTop, _strBottom;
+ byte _curId;
+
+ int _xpos2, _ypos2;
+
+ int _bufPos;
+ byte _unk12, _disableOffsX;
+ byte *_ptr;
+ byte _unk2, _bpp;
+ byte _invNumBits;
+ uint32 _charOffs;
+ byte *_charPtr;
+ int _width, _height;
+ int _offsX, _offsY;
+ byte _bitMask, _revBitMask;
+ int _bottom;
+ int _virtScreenHeight;
+
+ byte _ignoreCharsetMask;
+
+ byte *_backbuff_ptr, *_bgbak_ptr;
+ byte *_mask_ptr;
+ byte *_dest_ptr;
+
+ byte _colorMap[16];
+ byte _buffer[512];
+
+ void drawBits();
+ void printChar(int chr);
+ void printCharOld(int chr);
+ int getSpacing(char chr);
+ int getStringWidth(int a, byte *str, int pos);
+ void addLinebreaks(int a, byte *str, int pos, int maxwidth);
+};
+
+#define ARRAY_HDR_SIZE 6
+struct ArrayHeader {
+ int16 dim1_size;
+ int16 type;
+ int16 dim2_size;
+ byte data[1];
+};
+
+struct SentenceTab {
+ byte unk5;
+ byte unk2;
+ uint16 unk4;
+ uint16 unk3;
+ byte unk;
+ byte pad;
+};
+
+struct StringTab {
+ int16 t_xpos, t_ypos;
+ int16 t_right;
+ int16 xpos, ypos;
+ int16 right;
+ byte color, t_color;
+ byte charset, t_charset;
+ bool center, t_center;
+ bool overhead, t_overhead;
+ bool no_talk_anim, t_no_talk_anim;
+};
+
+enum GameId {
+ GID_TENTACLE = 1,
+ GID_MONKEY2 = 2,
+ GID_INDY4 = 3,
+ GID_MONKEY = 4,
+ GID_SAMNMAX = 5,
+ GID_MONKEY_EGA = 6,
+ GID_LOOM256 = 7,
+ GID_ZAK256 = 8,
+ GID_INDY3_256 = 9,
+ GID_LOOM = 10,
+ GID_FT = 11,
+ GID_DIG = 12,
+ GID_MONKEY_VGA = 13,
+ GID_CMI = 14,
+
+ /* Simon the Sorcerer */
+ GID_SIMON_FIRST = 20,
+ GID_SIMON_LAST = GID_SIMON_FIRST + 3,
+};
+
+enum GameFeatures {
+ GF_NEW_OPCODES = 1,
+ GF_AFTER_V6 = 2,
+ GF_AFTER_V7 = 4,
+ GF_HAS_ROOMTABLE = GF_AFTER_V7,
+ GF_USE_KEY = 8,
+ GF_NEW_COSTUMES = GF_AFTER_V7,
+ GF_USE_ANGLES = GF_AFTER_V7,
+ GF_DRAWOBJ_OTHER_ORDER = 16,
+
+ GF_DEFAULT = GF_USE_KEY,
+
+ GF_SMALL_HEADER = 32,
+ GF_EXTERNAL_CHARSET = GF_SMALL_HEADER,
+ GF_SMALL_NAMES = 64,
+ GF_OLD_BUNDLE = 128,
+ GF_16COLOR = 256,
+ GF_OLD256 = 512,
+ GF_AUDIOTRACKS = 1024,
+ GF_NO_SCALLING = 2048,
+ GF_ADLIB_DEFAULT = 4096,
+ GF_AMIGA = 8192,
+ GF_HUMONGOUS = 16384,
+ GF_AFTER_V8 = 32768
+};
+
+enum WhereIsObject {
+ WIO_NOT_FOUND = -1,
+ WIO_INVENTORY = 0,
+ WIO_ROOM = 1,
+ WIO_GLOBAL = 2,
+ WIO_LOCAL = 3,
+ WIO_FLOBJECT = 4
+};
+
+enum MouseButtonStatus {
+ msDown = 1,
+ msClicked = 2
+};
+
+#include "gfx.h"
+#include "boxes.h"
+
+class Scumm : public Engine {
+public:
+ /* Put often used variables at the top.
+ * That results in a shorter form of the opcode
+ * on some architectures. */
+ IMuse *_imuse;
+ Gui *_gui;
+ NewGui *_newgui;
+ uint32 _features;
+ VerbSlot *_verbs;
+ ObjectData *_objs;
+ ScummDebugger *_debugger;
+ Bundle * _bundle;
+ Timer * _timer;
+ Sound * _sound;
+
+ struct {
+ byte mode[rtNumTypes];
+ uint16 num[rtNumTypes];
+ uint32 tags[rtNumTypes];
+ const char *name[rtNumTypes];
+ byte **address[rtNumTypes];
+ byte *flags[rtNumTypes];
+ byte *roomno[rtNumTypes];
+ uint32 *roomoffs[rtNumTypes];
+ } res;
+
+ struct {
+ uint32 cutScenePtr[5];
+ byte cutSceneScript[5];
+ int16 cutSceneData[5];
+ int16 cutSceneScriptIndex;
+ byte cutSceneStackPointer;
+ ScriptSlot slot[NUM_SCRIPT_SLOT];
+ NestedScript nest[15];
+ int16 localvar[NUM_SCRIPT_SLOT][17];
+ } vm;
+
+ struct {
+ int16 x, y;
+ } mouse;
+
+ /* Init functions, etc */
+ byte _fastMode;
+ char *getGameName();
+
+ /* video buffer */
+ byte *_videoBuffer;
+
+ /* system call object */
+
+ /* Scumm main loop */
+
+ void mainRun();
+
+ /* _insane vars */
+
+ int _insaneFlag;
+ int _insaneState;
+ int videoFinished;
+
+
+ void scummInit();
+ void scummMain(int argc, char **argv); // is it still used ?
+ int scummLoop(int delta);
+ void initScummVars();
+
+ void pauseGame(bool user);
+ void shutDown(int i);
+ void setOptions(void);
+
+ void main();
+ void parseCommandLine(int argc, char **argv);
+ void showHelpAndExit();
+ bool detectGame();
+ void processKbd();
+ void clear_fullRedraw();
+
+ int checkKeyHit();
+ void convertKeysToClicks();
+
+ /* Random number generation */
+ uint32 _randSeed1, _randSeed2;
+ void initRandSeeds();
+ uint getRandomNumber(uint max);
+ uint getRandomNumberRng(uint min, uint max);
+
+ /* Core variable definitions */
+ byte _gameId;
+ const char *_gameText;
+
+ /* Core class/array definitions */
+ Gdi gdi;
+
+ Actor *_actors; // Has MAX_ACTORS elements
+
+ uint16 *_inventory;
+ byte *_arrays;
+ uint16 *_newNames;
+ int16 *_vars;
+ int16 _varwatch;
+ byte *_bitVars;
+
+ /* Global resource tables */
+ int _numVariables, _numBitVariables, _numLocalObjects;
+ int _numGlobalObjects, _numArray, _numVerbs, _numFlObject;
+ int _numInventory, _numRooms, _numScripts, _numSounds;
+ int _numCharsets, _numCostumes, _numNewNames, _numGlobalScripts;
+ int NUM_ACTORS;
+
+ /* Current objects - can go in their respective classes */
+ byte _curActor;
+ int _curVerb;
+ int _curVerbSlot;
+ int _curPalIndex;
+ byte _currentRoom;
+ VirtScreen *_curVirtScreen;
+
+ bool _egoPositioned;
+ int _keyPressed;
+ uint16 _lastKeyHit;
+ uint16 _mouseButStat;
+ byte _leftBtnPressed, _rightBtnPressed;
+
+ int16 _virtual_mouse_x, _virtual_mouse_y, _bootParam;
+ uint16 _debugMode, _currentDrive, _soundCardType;
+ byte _mousePresent;
+
+ /* Not sure where this stuff goes */
+ byte isMaskActiveAt(int l, int t, int r, int b, byte *mem);
+ void startScene(int room, Actor *a, int b);
+ void setupScummVarsOld(); // Both of these will simply be one
+ void setupScummVarsNew(); // 'setupScummVars' in each Scumm_Vx
+ byte *_objectOwnerTable, *_objectRoomTable, *_objectStateTable;
+ byte _numObjectsInRoom;
+ int8 _userPut;
+ int _resourceHeaderSize;
+ void unkRoomFunc3(int a, int b, int c, int d, int e);
+ void palManipulate(int a, int b, int c, int d, int e);
+ void setScaleItem(int slot, int a, int b, int c, int d);
+ void clearClickedStatus();
+ void startManiac();
+
+ /* GUI class */
+ void drawString(int a);
+ int getKeyInput(int a);
+
+ /* Save/Load class - some of this may be GUI */
+ byte _saveLoadFlag, _saveLoadSlot;
+ bool _doAutosave;
+ bool _saveLoadCompatible;
+ char _saveLoadName[32];
+
+ bool saveState(int slot, bool compat);
+ bool loadState(int slot, bool compat);
+ void saveOrLoad(Serializer *s);
+
+ bool getSavegameName(int slot, char *desc);
+ void makeSavegameName(char *out, int slot, bool compatible);
+ void saveLoadResource(Serializer *ser, int type, int index);
+
+ /* Heap and memory management */
+ uint32 _maxHeapThreshold, _minHeapThreshold;
+ void checkRange(int max, int min, int no, const char *str);
+ void lock(int type, int i);
+ void unlock(int type, int i);
+ void heapClear(int mode);
+ void unkHeapProc2(int a, int b);
+
+ /* Script VM - should be in Script class */
+ uint32 _localScriptList[NUM_LOCALSCRIPT];
+ byte *_scriptPointer, *_scriptOrgPointer, *_scriptPointerStart;
+ byte _opcode, _numNestedScripts, _currentScript;
+ uint16 _curExecScript;
+ const OpcodeProc *_opcodes;
+ const char **_opcodes_lookup;
+ byte **_lastCodePtr;
+ int _resultVarNumber, _scummStackPos;
+ int16 _localParamList[16], _scummStack[150];
+
+ OpcodeProc getOpcode(int i) { return _opcodes[i]; }
+ void initializeLocals(int slot, int16 *vars);
+ int getScriptSlot();
+ void runScript(int script, int a, int b, int16 *lvarptr);
+ void stopScriptNr(int script);
+ void runScriptNested(int script);
+ void executeScript();
+ void updateScriptPtr();
+ void getScriptBaseAddress();
+ void getScriptEntryPoint();
+ byte fetchScriptByte();
+ int fetchScriptWord();
+ void ignoreScriptWord() { fetchScriptWord(); }
+ void ignoreScriptByte() { fetchScriptByte(); }
+ int getVarOrDirectWord(byte mask);
+ int getVarOrDirectByte(byte mask);
+ void getResultPos();
+ void setResult(int result);
+ int readVar(uint var);
+ void writeVar(uint var, int value);
+ void push(int a);
+ int pop();
+ void runHook(int i);
+ bool isScriptInUse(int script);
+ int getStringLen(byte *ptr);
+
+ void freezeScripts(int scr);
+ void unfreezeScripts();
+ void runAllScripts();
+ void setupOpcodes();
+ void setupOpcodes2();
+ void cutscene(int16 *args);
+ void endCutscene();
+ void exitCutscene();
+ void runExitScript();
+ void runEntryScript();
+
+ void beginOverride();
+ void endOverride();
+ void killScriptsAndResources();
+ void checkAndRunVar33();
+ void decreaseScriptDelay(int amount);
+ bool isScriptRunning(int script);
+ bool isRoomScriptRunning(int script);
+ void arrayop_1(int a, byte *ptr);
+ void copyString(byte *dst, byte *src, int len);
+ void doSentence(int c, int b, int a);
+ int popRoomAndObj(int *room);
+ int getWordVararg(int16 *ptr);
+ void decodeParseString();
+ void decodeParseString2(int a, int b);
+
+ /* Script VM or Object class? */
+ void stopObjectCode();
+ void stopObjectScript(int script);
+
+ /* Should be in Resource class */
+ byte _encbyte;
+ void *_fileHandle;
+ char *_resFilePrefix, *_resFilePath;
+ uint32 _fileOffset;
+ char *_exe_name;
+ bool _dynamicRoomOffsets;
+ byte _resourceMapper[128];
+ uint32 _allocatedSize;
+ byte _expire_counter;
+
+ void allocateArrays();
+ void openRoom(int room);
+ void deleteRoomOffsets();
+ void readRoomsOffsets();
+ void askForDisk(const char *filename);
+ bool openResourceFile(const char *filename);
+ void loadPtrToResource(int type, int i, byte *ptr);
+ void readResTypeList(int id, uint32 tag, const char *name);
+ char *resTypeFromId(int id);
+ void allocResTypeData(int id, uint32 tag, int num, const char *name, int mode);
+ byte *createResource(int type, int index, uint32 size);
+ void nukeResource(int type, int i);
+ byte *getResourceAddress(int type, int i);
+ byte *getStringAddress(int i);
+ byte *getStringAddressVar(int i);
+ void ensureResourceLoaded(int type, int i);
+ int loadResource(int type, int i);
+ int getResourceRoomNr(int type, int index);
+ int readSoundResource(int type, int index);
+ void setResourceCounter(int type, int index, byte flag);
+ void validateResource(const char *str, int type, int index);
+ void increaseResourceCounter();
+ bool isResourceInUse(int type, int i);
+ bool isResourceLoaded(int type, int index);
+ void initRoomSubBlocks();
+ void loadRoomObjects();
+ void loadRoomObjectsSmall();
+ void readArrayFromIndexFile();
+ void readMAXS();
+ bool isGlobInMemory(int type, int index);
+ virtual void readIndexFile();
+ virtual void loadCharset(int i);
+ void nukeCharset(int i);
+
+ bool fileReadFailed(void *handle);
+ void clearFileReadFailed(void *handle);
+
+ int _lastLoadedRoom, _roomResource;
+ byte _resFilePathId, _fileReadFailed;
+ byte *findResourceData(uint32 tag, byte *ptr);
+ int getResourceDataSize(byte *ptr);
+
+ int getArrayId();
+ void nukeArray(int a);
+ int defineArray(int a, int b, int c, int d);
+ int readArray(int array, int index, int base);
+ void writeArray(int array, int index, int base, int value);
+
+ void resourceStats();
+ void expireResources(uint32 size);
+ void freeResources();
+ void destroy();
+ void dumpResource(char *tag, int index, byte *ptr);
+
+
+ /* Should be in Object class */
+ byte OF_OWNER_ROOM;
+ int getInventorySlot();
+ void SamInventoryHack(int obj); // FIXME: Sam and Max hack
+ int findInventory(int owner, int index);
+ int getInventoryCount(int owner);
+
+ void setupRoomObject(ObjectData *od, byte *room);
+ void removeObjectFromRoom(int obj);
+ void loadFlObject(uint object, uint room);
+ void nukeFlObjects(int min, int max);
+ int findFlObjectSlot();
+ void addObjectToInventory(uint obj, uint room);
+ void fixObjectFlags();
+ bool getClass(int obj, int cls);
+ void putClass(int obj, int cls, bool set);
+ int getState(int obj);
+ void putState(int obj, int state);
+ void setObjectState(int obj, int state, int x, int y);
+ int getOwner(int obj);
+ void putOwner(int obj, int owner);
+ void setOwnerOf(int obj, int owner);
+ void clearOwnerOf(int obj);
+ int getObjectRoom(int obj);
+ int getObjX(int obj);
+ int getObjY(int obj);
+ void getObjectXYPos(int object, int &x, int &y) { int dir; getObjectXYPos(object, x, y, dir); }
+ void getObjectXYPos(int object, int &x, int &y, int &dir);
+ int getObjOldDir(int obj);
+ int getObjNewDir(int obj);
+ int getObjectIndex(int object);
+ int whereIsObject(int object);
+ int findObject(int x, int y);
+ void findObjectInRoom(FindObjectInRoom *fo, byte findWhat, uint object, uint room);
+ int getObjectOrActorXY(int object, int &x, int &y); // Object and Actor...
+ int getObjActToObjActDist(int a, int b); // Not sure how to handle
+ byte *getObjOrActorName(int obj); // these three..
+
+ void addObjectToDrawQue(int object);
+ void clearDrawObjectQueue();
+ void processDrawQue();
+
+ uint32 getOBCDOffs(int object);
+ byte *getOBCDFromObject(int obj);
+ int getDistanceBetween(bool is_obj_1, int b, int c, bool is_obj_2, int e, int f);
+
+ /* Should be in Costume class */
+ void cost_decodeData(Actor *a, int frame, uint usemask);
+ int cost_frameToAnim(Actor *a, int frame);
+
+
+ /* Should be in Verb class */
+ uint16 _verbMouseOver;
+ int _inventoryOffset;
+ void redrawVerbs();
+ void checkExecVerbs();
+ void verbMouseOver(int verb);
+ int checkMouseOver(int x, int y);
+ void drawVerb(int verb, int mode);
+ void runInputScript(int a, int cmd, int mode);
+ void restoreVerbBG(int verb);
+ void drawVerbBitmap(int verb, int x, int y);
+ int getVerbEntrypoint(int obj, int entry);
+ int getVerbSlot(int id, int mode);
+ void killVerb(int slot);
+ void runVerbCode(int script, int entry, int a, int b, int16 *vars);
+ void setVerbObject(uint room, uint object, uint verb);
+
+ /* Should be in Actor class */
+ Actor *derefActor(int id);
+ Actor *derefActorSafe(int id, const char *errmsg);
+ Actor *getFirstActor() { return _actors; }
+ void showActors();
+
+ uint32 *_classData;
+
+ int getAngleFromPos(int x, int y);
+
+ void walkActors();
+ void playActorSounds();
+ void setActorRedrawFlags();
+ void resetActorBgs();
+ void processActors();
+ int getActorFromPos(int x, int y);
+ void faceActorToObj(int act, int obj);
+ void actorFollowCamera(int act);
+
+ bool isCostumeInUse(int i);
+
+ /* Actor talking stuff */
+ byte _actorToPrintStrFor;
+ int _sentenceNum;
+ SentenceTab sentence[6];
+ StringTab string[6];
+ void actorTalk();
+ void stopTalk();
+
+ /* Akos Class */
+
+ bool akos_increaseAnims(byte *akos, Actor *a);
+ bool akos_increaseAnim(Actor *a, int i, byte *aksq, uint16 *akfo, int numakfo);
+
+ void akos_queCommand(byte cmd, Actor *a, int param_1, int param_2);
+ bool akos_compare(int a, int b, byte cmd);
+ void akos_decodeData(Actor *a, int frame, uint usemask);
+ int akos_frameToAnim(Actor *a, int frame);
+ bool akos_hasManyDirections(Actor *a);
+
+
+ /* Should be in Graphics class? */
+ uint16 _screenB, _screenH;
+ int _scrHeight, _scrWidth, _realHeight, _realWidth;
+ VirtScreen virtscr[4]; // Virtual screen areas
+ CameraData camera; // 'Camera' - viewport
+ ColorCycle _colorCycle[16]; // Palette cycles
+
+ uint32 _ENCD_offs, _EXCD_offs;
+ uint32 _CLUT_offs, _EPAL_offs;
+ uint32 _IM00_offs, _PALS_offs;
+
+ //ender: fullscreen
+ bool _fullRedraw, _BgNeedsRedraw, _shakeEnabled;
+ bool _screenEffectFlag, _completeScreenRedraw;
+
+ int _cursorHotspotX, _cursorHotspotY, _cursorWidth, _cursorHeight;
+ byte _cursorAnimate, _cursorAnimateIndex, _grabbedCursor[2048];
+ int8 _cursorState;
+
+ byte _newEffect, _switchRoomEffect2, _switchRoomEffect;
+ bool _doEffect;
+
+ uint16 _flashlightXStrips, _flashlightYStrips;
+ bool _flashlightIsDrawn;
+
+ void getGraphicsPerformance();
+ void initScreens(int a, int b, int w, int h);
+ void initVirtScreen(int slot, int number, int top, int width, int height, bool twobufs, bool fourextra);
+ void initBGBuffers(int height);
+ void initCycl(byte *ptr); // Color cycle
+
+ void createSpecialPalette(int16 a, int16 b, int16 c, int16 d, int16 e, int16 colorMin, int16 colorMax);
+
+ void drawObject(int obj, int arg);
+ void drawRoomObjects(int arg);
+ void drawRoomObject(int i, int arg);
+ void drawBox(int x, int y, int x2, int y2, int color);
+ void drawBomp(BompDrawData *bd, int param1, byte *dataPtr, int param2, int param3);
+
+ void restoreBG(int left, int top, int right, int bottom);
+ void redrawBGStrip(int start, int num);
+ void redrawBGAreas();
+
+ void moveCamera();
+ void cameraMoved();
+ void setCameraAtEx(int at);
+ void setCameraAt(int pos_x, int pos_y);
+ void panCameraTo(int x, int y);
+ void setCameraFollows(Actor *a);
+ void clampCameraPos(ScummPoint *pt);
+
+ byte *getPalettePtr();
+ void setPalette(int pal);
+ void setPaletteFromPtr(byte *ptr);
+ void setPaletteFromRes();
+ void setPalColor(int index, int r, int g, int b);
+ void setDirtyColors(int min, int max);
+ byte *findPalInPals(byte *pal, int index);
+ void swapPalColors(int a, int b);
+ void cyclePalette();
+ void stopCycle(int i);
+ void palManipulate();
+ int remapPaletteColor(int r, int g, int b, uint threshold);
+ void moveMemInPalRes(int start, int end, byte direction);
+ void setupShadowPalette(int slot, int rfact, int gfact, int bfact, int from, int to);
+ void darkenPalette(int a, int b, int c, int d, int e);
+ void desaturatePalette();
+
+ void setShake(int mode);
+
+ void setCursor(int cursor);
+ void setCursorImg(uint img, uint room, uint imgindex);
+ void setCursorHotspot2(int x, int y);
+ void grabCursor(int x, int y, int w, int h);
+ void grabCursor(byte *ptr, int width, int height);
+ void makeCursorColorTransparent(int a);
+ void setupCursor() { _cursorAnimate = 1; }
+ void decompressDefaultCursor(int index);
+ void useIm01Cursor(byte *im, int w, int h);
+ void useBompCursor(byte *im, int w, int h);
+
+
+ void updateDirtyRect(int virt, int left, int right, int top, int bottom, uint32 dirtybits);
+ void setDirtyRange(int slot, int a, int height);
+ void drawDirtyScreenParts();
+ void updateDirtyScreen(int slot);
+
+ VirtScreen *findVirtScreen(int y);
+ static void setVirtscreenDirty(VirtScreen *vs, int left, int top, int right, int bottom);
+
+ void drawFlashlight();
+
+ void fadeIn(int effect);
+ void fadeOut(int effect);
+
+ void unkScreenEffect1();
+ void unkScreenEffect2();
+ void unkScreenEffect3();
+ void unkScreenEffect4();
+ void unkScreenEffect5(int a);
+ void unkScreenEffect6();
+ void transitionEffect(int a); // former unkScreenEffect7
+
+ void decompressBomp(byte *dst, byte *src, int w, int h);
+ uint _shakeFrame;
+ int _screenStartStrip, _screenEndStrip;
+ int _screenLeft, _screenTop;
+ uint16 _enqueue_b, _enqueue_c, _enqueue_d, _enqueue_e;
+ int _enqueuePos;
+ BlastObject _enqueuedObjects[32];
+
+ void enqueueObject(int a, int b, int c, int d, int e, int f, int g, int h, int mode);
+ void clearEnqueue() { _enqueuePos = 0; }
+ void drawBlastObjects();
+ void drawBlastObject(BlastObject *eo);
+ void removeBlastObjects();
+ void removeBlastObject(BlastObject *eo);
+
+ int _drawObjectQueNr;
+ byte _drawObjectQue[200];
+ int16 _palManipStart, _palManipEnd, _palManipCounter;
+ uint32 gfxUsageBits[200];
+ byte *_shadowPalette;
+ int _shadowPaletteSize;
+ byte _currentPalette[0x300];
+
+ byte _proc_special_palette[256];
+ int _palDirtyMin, _palDirtyMax;
+ byte _bkColor;
+ uint16 _lastXstart;
+
+ byte _haveMsg;
+ bool _useTalkAnims;
+ uint16 _defaultTalkDelay;
+ bool _use_adlib;
+ int tempMusic;
+ int _saveSound;
+ uint16 _soundParam, _soundParam2, _soundParam3;
+ int current_cd_sound, _cd_loops, _cd_frame, _cd_track, _cd_end;
+
+ /* Walkbox / Navigation class */
+ int _maxBoxVertexHeap, _boxPathVertexHeapIndex, _boxMatrixItem;
+ byte *_boxMatrixPtr4, *_boxMatrixPtr1, *_boxMatrixPtr3;
+
+ uint16 _extraBoxFlags[65];
+
+ PathNode *unkMatrixProc2(PathVertex *vtx, int i);
+ bool areBoxesNeighbours(int i, int j);
+ void addToBoxMatrix(byte b);
+ bool compareSlope(int X1, int Y1, int X2, int Y2, int X3, int Y3);
+ void *addToBoxVertexHeap(int size);
+ PathVertex *addPathVertex();
+ bool checkXYInBoxBounds(int box, int x, int y);
+ uint distanceFromPt(int x, int y, int ptx, int pty);
+ ScummPoint closestPtOnLine(int ulx, int uly, int llx, int lly, int x, int y);
+ void getBoxCoordinates(int boxnum, BoxCoords *bc);
+ byte getMaskFromBox(int box);
+ Box *getBoxBaseAddr(int box);
+ byte getBoxFlags(int box);
+ int getBoxScale(int box);
+ byte getNumBoxes();
+ byte *getBoxMatrixBaseAddr();
+ int getPathToDestBox(byte from, byte to);
+ bool findPathTowards(Actor *a, byte box, byte box2, byte box3, int16 &foundPathX, int16 &foundPathY);
+ void findPathTowardsOld(Actor *a, byte box, byte box2, byte box3, ScummPoint gateLoc[5]);
+ void getGates(int trap1, int trap2, ScummPoint gateA[2], ScummPoint gateB[2]);
+ bool inBoxQuickReject(int box, int x, int y, int threshold);
+ AdjustBoxResult getClosestPtOnBox(int box, int x, int y);
+ int getSpecialBox(int param1, int param2);
+
+ void setBoxFlags(int box, int val);
+ void setBoxScale(int box, int b);
+ void createBoxMatrix();
+
+
+ /* String class */
+ CharsetRenderer charset;
+ byte _charsetColor;
+ uint16 _noSubtitles; // Skip all subtitles?
+ byte _charsetData[15][16];
+ void initCharset(int charset);
+ void restoreCharsetBg();
+ int hasCharsetMask(int x, int y, int x2, int y2);
+ void CHARSET_1();
+ void description();
+ byte *_msgPtrToAdd;
+ byte *addMessageToStack(byte *msg);
+ void unkAddMsgToStack2(int var);
+ void unkAddMsgToStack3(int var);
+ void unkAddMsgToStack4(int var);
+ void unkAddMsgToStack5(int var);
+ void unkMessage1();
+ void unkMessage2();
+ void clearMsgQueue();
+ int _numInMsgStack;
+ byte *_messagePtr;
+ int16 _talkDelay;
+ bool _keepText;
+
+
+ /* Should be in System class */
+ void fileClose(void *file);
+ void *fileOpen(const char *filename, int mode);
+ void fileSeek(void *file, long offs, int whence);
+ void fileRead(void *handle, void *ptr, uint32 size);
+ bool fileEof(void *handle);
+ uint32 filePos(void *handle);
+ bool checkFixedDisk();
+ int _cdrom;
+
+ int fileReadByte();
+ uint32 fileReadDwordLE();
+ uint32 fileReadDwordBE();
+ int fileReadByte(void *handle);
+ uint32 fileReadDwordLE(void *handle);
+ uint32 fileReadDwordBE(void *handle);
+
+#if defined(SCUMM_LITTLE_ENDIAN)
+ uint32 fileReadDword() { return fileReadDwordLE(); }
+ uint32 fileReadDword(void *handle) { return fileReadDwordLE(handle); }
+#elif defined(SCUMM_BIG_ENDIAN)
+ uint32 fileReadDword() { return fileReadDwordBE(); }
+ uint32 fileReadDword(void *handle) { return fileReadDwordBE(handle); }
+#endif
+ uint fileReadWordLE();
+ uint fileReadWordBE();
+ uint fileReadWordLE(void *handle);
+ uint fileReadWordBE(void *handle);
+
+ /* Version 5 script opcodes */
+ void o5_actorFollowCamera();
+ void o5_actorFromPos();
+ void o5_actorSet();
+ void o5_add();
+ void o5_and();
+ void o5_animateActor();
+ void o5_badOpcode();
+ void o5_breakHere();
+ void o5_chainScript();
+ void o5_cursorCommand();
+ void o5_cutscene();
+ void o5_debug();
+ void o5_decrement();
+ void o5_delay();
+ void o5_delayVariable();
+ void o5_divide();
+ void o5_doSentence();
+ void o5_drawBox();
+ void o5_drawObject();
+ void o5_dummy();
+ void o5_endCutscene();
+ void o5_equalZero();
+ void o5_expression();
+ void o5_faceActor();
+ void o5_findInventory();
+ void o5_findObject();
+ void o5_freezeScripts();
+ void o5_getActorCostume();
+ void o5_getActorElevation();
+ void o5_getActorFacing();
+ void o5_getActorMoving();
+ void o5_getActorRoom();
+ void o5_getActorScale();
+ void o5_getActorWalkBox();
+ void o5_getActorWidth();
+ void o5_getActorX();
+ void o5_getActorY();
+ void o5_getAnimCounter();
+ void o5_getClosestObjActor();
+ void o5_getDist();
+ void o5_getInventoryCount();
+ void o5_getObjectOwner();
+ void o5_getObjectState();
+ void o5_getRandomNr();
+ void o5_getScriptRunning();
+ void o5_getVerbEntrypoint();
+ void o5_ifClassOfIs();
+ void o5_increment();
+ void o5_isActorInBox();
+ void o5_isEqual();
+ void o5_isGreater();
+ void o5_isGreaterEqual();
+ void o5_isLess();
+ void o5_isNotEqual();
+ void o5_isSoundRunning();
+ void o5_jumpRelative();
+ void o5_lessOrEqual();
+ void o5_lights();
+ void o5_loadRoom();
+ void o5_loadRoomWithEgo();
+ void o5_matrixOps();
+ void o5_move();
+ void o5_multiply();
+ void o5_notEqualZero();
+ void o5_or();
+ void o5_overRide();
+ void o5_panCameraTo();
+ void o5_pickupObject();
+ void o5_print();
+ void o5_printEgo();
+ void o5_pseudoRoom();
+ void o5_putActor();
+ void o5_putActorAtObject();
+ void o5_putActorInRoom();
+ void o5_quitPauseRestart();
+ void o5_resourceRoutines();
+ void o5_roomOps();
+ void o5_saveRestoreVerbs();
+ void o5_setCameraAt();
+ void o5_setClass();
+ void o5_setObjectName();
+ void o5_setOwnerOf();
+ void o5_setState();
+ void o5_setVarRange();
+ void o5_soundKludge();
+ void o5_startMusic();
+ void o5_startObject();
+ void o5_startScript();
+ void o5_startSound();
+ void o5_stopMusic();
+ void o5_stopObjectCode();
+ void o5_stopObjectScript();
+ void o5_stopScript();
+ void o5_stopSound();
+ void o5_stringOps();
+ void o5_subtract();
+ void o5_verbOps();
+ void o5_wait();
+ void o5_walkActorTo();
+ void o5_walkActorToActor();
+ void o5_walkActorToObject();
+ void o5_oldRoomEffect();
+ void o5_pickupObjectOld();
+
+ /* Version 6 script opcodes */
+ int getStackList(int16 *args, uint maxnum);
+ void setStringVars(int i);
+ void unkMiscOp9();
+
+ void o6_setBlastObjectWindow();
+ void o6_pushByte();
+ void o6_pushWord();
+ void o6_pushByteVar();
+ void o6_pushWordVar();
+ void o6_invalid();
+ void o6_byteArrayRead();
+ void o6_wordArrayRead();
+ void o6_byteArrayIndexedRead();
+ void o6_wordArrayIndexedRead();
+ void o6_dup();
+ void o6_zero();
+ void o6_eq();
+ void o6_neq();
+ void o6_gt();
+ void o6_lt();
+ void o6_le();
+ void o6_ge();
+ void o6_add();
+ void o6_sub();
+ void o6_mul();
+ void o6_div();
+ void o6_land();
+ void o6_lor();
+ void o6_kill();
+ void o6_writeByteVar();
+ void o6_writeWordVar();
+ void o6_byteArrayWrite();
+ void o6_wordArrayWrite();
+ void o6_byteArrayIndexedWrite();
+ void o6_wordArrayIndexedWrite();
+ void o6_byteVarInc();
+ void o6_wordVarInc();
+ void o6_byteArrayInc();
+ void o6_wordArrayInc();
+ void o6_byteVarDec();
+ void o6_wordVarDec();
+ void o6_byteArrayDec();
+ void o6_wordArrayDec();
+ void o6_jumpTrue();
+ void o6_jumpFalse();
+ void o6_jump();
+ void o6_startScriptEx();
+ void o6_startScript();
+ void o6_startObject();
+ void o6_setObjectState();
+ void o6_setObjectXY();
+ void o6_stopObjectCode();
+ void o6_endCutscene();
+ void o6_cutScene();
+ void o6_stopMusic();
+ void o6_freezeUnfreeze();
+ void o6_cursorCommand();
+ void o6_breakHere();
+ void o6_ifClassOfIs();
+ void o6_setClass();
+ void o6_getState();
+ void o6_setState();
+ void o6_setOwner();
+ void o6_getOwner();
+ void o6_startSound();
+ void o6_stopSound();
+ void o6_startMusic();
+ void o6_stopObjectScript();
+ void o6_panCameraTo();
+ void o6_actorFollowCamera();
+ void o6_setCameraAt();
+ void o6_loadRoom();
+ void o6_stopScript();
+ void o6_walkActorToObj();
+ void o6_walkActorTo();
+ void o6_putActorInRoom();
+ void o6_putActorAtObject();
+ void o6_faceActor();
+ void o6_animateActor();
+ void o6_doSentence();
+ void o6_pickupObject();
+ void o6_loadRoomWithEgo();
+ void o6_getRandomNumber();
+ void o6_getRandomNumberRange();
+ void o6_getActorMoving();
+ void o6_getScriptRunning();
+ void o6_getActorRoom();
+ void o6_getObjectX();
+ void o6_getObjectY();
+ void o6_getObjectOldDir();
+ void o6_getObjectNewDir();
+ void o6_getActorWalkBox();
+ void o6_getActorCostume();
+ void o6_findInventory();
+ void o6_getInventoryCount();
+ void o6_getVerbFromXY();
+ void o6_beginOverride();
+ void o6_endOverride();
+ void o6_setObjectName();
+ void o6_isSoundRunning();
+ void o6_setBoxFlags();
+ void o6_createBoxMatrix();
+ void o6_resourceRoutines();
+ void o6_roomOps();
+ void o6_actorSet();
+ void o6_verbOps();
+ void o6_getActorFromXY();
+ void o6_findObject();
+ void o6_pseudoRoom();
+ void o6_getActorElevation();
+ void o6_getVerbEntrypoint();
+ void o6_arrayOps();
+ void o6_saveRestoreVerbs();
+ void o6_drawBox();
+ void o6_getActorWidth();
+ void o6_wait();
+ void o6_getActorScaleX();
+ void o6_getActorAnimCounter1();
+ void o6_soundKludge();
+ void o6_isAnyOf();
+ void o6_quitPauseRestart();
+ void o6_isActorInBox();
+ void o6_delay();
+ void o6_delayLonger();
+ void o6_delayVeryLong();
+ void o6_stopSentence();
+ void o6_print_0();
+ void o6_print_1();
+ void o6_print_2();
+ void o6_print_3();
+ void o6_printActor();
+ void o6_printEgo();
+ void o6_talkActor();
+ void o6_talkEgo();
+ void o6_dim();
+ void o6_runVerbCodeQuick();
+ void o6_runScriptQuick();
+ void o6_dim2();
+ void o6_abs();
+ void o6_distObjectObject();
+ void o6_distObjectPt();
+ void o6_distPtPt();
+ void o6_dummy_stacklist();
+ void o6_miscOps();
+ void o6_breakMaybe();
+ void o6_pickOneOf();
+ void o6_pickOneOfDefault();
+ void o6_jumpToScript();
+ void o6_isRoomScriptRunning();
+ void o6_kernelFunction();
+ void o6_getAnimateVariable();
+ void o6_drawBlastObject();
+ void o6_getActorPriority();
+
+ /* Scumm Vars */
+ byte VAR_EGO;
+ byte VAR_CAMERA_POS_X;
+ byte VAR_HAVE_MSG;
+ byte VAR_ROOM;
+ byte VAR_OVERRIDE;
+ byte VAR_MACHINE_SPEED;
+ byte VAR_ME;
+ byte VAR_NUM_ACTOR;
+ byte VAR_CURRENT_LIGHTS;
+ byte VAR_CURRENTDRIVE;
+ byte VAR_TMR_1;
+ byte VAR_TMR_2;
+ byte VAR_TMR_3;
+ byte VAR_MUSIC_FLAG;
+ byte VAR_ACTOR_RANGE_MIN;
+ byte VAR_ACTOR_RANGE_MAX;
+ byte VAR_CAMERA_MIN_X;
+ byte VAR_CAMERA_MAX_X;
+ byte VAR_TIMER_NEXT;
+ byte VAR_VIRT_MOUSE_X;
+ byte VAR_VIRT_MOUSE_Y;
+ byte VAR_ROOM_RESOURCE;
+ byte VAR_LAST_SOUND;
+ byte VAR_CUTSCENEEXIT_KEY;
+ byte VAR_OPTIONS_KEY;
+ byte VAR_TALK_ACTOR;
+ byte VAR_CAMERA_FAST_X;
+ byte VAR_SCROLL_SCRIPT;
+ byte VAR_ENTRY_SCRIPT;
+ byte VAR_ENTRY_SCRIPT2;
+ byte VAR_EXIT_SCRIPT;
+ byte VAR_EXIT_SCRIPT2;
+ byte VAR_VERB_SCRIPT;
+ byte VAR_SENTENCE_SCRIPT;
+ byte VAR_HOOK_SCRIPT;
+ byte VAR_CUTSCENE_START_SCRIPT;
+ byte VAR_CUTSCENE_END_SCRIPT;
+ byte VAR_CHARINC;
+ byte VAR_WALKTO_OBJ;
+ byte VAR_DEBUGMODE;
+ byte VAR_HEAPSPACE;
+ byte VAR_RESTART_KEY;
+ byte VAR_PAUSE_KEY;
+ byte VAR_MOUSE_X;
+ byte VAR_MOUSE_Y;
+ byte VAR_TIMER;
+ byte VAR_TMR_4;
+ byte VAR_SOUNDCARD;
+ byte VAR_VIDEOMODE;
+ byte VAR_SAVELOADDIALOG_KEY;
+ byte VAR_FIXEDDISK;
+ byte VAR_CURSORSTATE;
+ byte VAR_USERPUT;
+ byte VAR_SOUNDRESULT;
+ byte VAR_TALKSTOP_KEY;
+ byte VAR_59;
+
+ byte VAR_SOUNDPARAM;
+ byte VAR_SOUNDPARAM2;
+ byte VAR_SOUNDPARAM3;
+ byte VAR_MOUSEPRESENT;
+ byte VAR_PERFORMANCE_1;
+ byte VAR_PERFORMANCE_2;
+ byte VAR_ROOM_FLAG;
+ byte VAR_GAME_LOADED;
+ byte VAR_NEW_ROOM;
+ byte VAR_VERSION;
+
+ byte VAR_V5_DRAWFLAGS;
+ byte VAR_MI1_TIMER;
+ byte VAR_V5_OBJECT_LO;
+ byte VAR_V5_OBJECT_HI;
+ byte VAR_V5_TALK_STRING_Y;
+ byte VAR_V5_CHARFLAG;
+
+ byte VAR_V6_SCREEN_WIDTH;
+ byte VAR_V6_SCREEN_HEIGHT;
+ byte VAR_V6_EMSSPACE;
+ byte VAR_V6_RANDOM_NR;
+
+ byte VAR_STRING2DRAW;
+ byte VAR_CAMERA_POS_Y;
+
+ byte VAR_CAMERA_MIN_Y;
+ byte VAR_CAMERA_MAX_Y;
+ byte VAR_CAMERA_THRESHOLD_X;
+ byte VAR_CAMERA_THRESHOLD_Y;
+ byte VAR_CAMERA_SPEED_X;
+ byte VAR_CAMERA_SPEED_Y;
+ byte VAR_CAMERA_ACCEL_X;
+ byte VAR_CAMERA_ACCEL_Y;
+
+ byte VAR_CAMERA_DEST_X;
+
+ byte VAR_CAMERA_DEST_Y;
+
+ byte VAR_CAMERA_FOLLOWED_ACTOR;
+
+ byte VAR_LEFTBTN_DOWN;
+ byte VAR_RIGHTBTN_DOWN;
+ byte VAR_LEFTBTN_HOLD;
+ byte VAR_RIGHTBTN_HOLD;
+
+ byte VAR_UNK_SCRIPT;
+ byte VAR_UNK_SCRIPT_2;
+
+ byte VAR_DEFAULT_TALK_DELAY;
+ byte VAR_CHARSET_MASK;
+
+ byte VAR_CUSTOMSCALETABLE;
+ byte VAR_VIDEONAME;
+
+ void launch();
+
+ Scumm(GameDetector *detector, OSystem *syst);
+ virtual ~Scumm();
+
+ void go();
+
+ void setupGUIColors();
+ byte getDefaultGUIColor(int color);
+ void waitForTimer(int msec_delay);
+
+ void updateCursor();
+ void animateCursor();
+ void updatePalette();
+};
+
+class Scumm_v3 : public Scumm
+{
+public:
+ Scumm_v3(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
+
+ void readIndexFile();
+ virtual void loadCharset(int no);
+};
+
+class Scumm_v4 : public Scumm_v3
+{
+public:
+ Scumm_v4(GameDetector *detector, OSystem *syst) : Scumm_v3(detector, syst) {}
+
+ void loadCharset(int no);
+};
+
+class Scumm_v5 : public Scumm
+{
+public:
+ Scumm_v5(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
+};
+
+class Scumm_v6 : public Scumm
+{
+public:
+ Scumm_v6(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
+};
+
+class Scumm_v7 : public Scumm
+{
+public:
+ Scumm_v7(GameDetector *detector, OSystem *syst) : Scumm(detector, syst) {}
+};
+
+extern uint16 _debugLevel;
+
+extern const byte revBitMask[8];
+//void blitToScreen(Scumm *s, byte *src, int x, int y, int w, int h);
+
+#if defined(__GNUC__)
+void CDECL error(const char *s, ...) NORETURN;
+#else
+void CDECL NORETURN error(const char *s, ...);
+#endif
+
+void CDECL warning(const char *s, ...);
+void CDECL debug(int level, const char *s, ...);
+void checkHeap();
+
+/* Direction conversion functions (between old dir and new dir format) */
+int newDirToOldDir(int dir);
+int oldDirToNewDir(int dir);
+
+int normalizeAngle(int angle);
+int fromSimpleDir(int dirtype, int dir);
+int toSimpleDir(int dirtype, int dir);
+int numSimpleDirDirections(int dirType);
+
+
+#endif