scummvm/engines/simon/simon.h

1186 lines
28 KiB
C
Raw Normal View History

/* ScummVM - Scumm Interpreter
2006-05-05 00:42:37 +00:00
* Copyright (C) 2001 Ludvig Strigeus
2006-01-18 17:39:49 +00:00
* Copyright (C) 2001-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 SIMON_H
#define SIMON_H
#include "engines/engine.h"
#include "common/rect.h"
2002-12-01 15:36:36 +00:00
#include "common/util.h"
#include "simon/animation.h"
#include "simon/midi.h"
2002-11-29 22:13:20 +00:00
#include "simon/sound.h"
2005-11-19 11:37:41 +00:00
#include "simon/vga.h"
2003-10-03 19:42:27 +00:00
namespace Simon {
/* Various other settings */
//#define DUMP_FILE_NR 8
//#define DUMP_BITMAPS_FILE_NR 8
uint fileReadItemID(Common::File *in);
2003-03-06 19:16:24 +00:00
#define CHECK_BOUNDS(x, y) assert((uint)(x) < ARRAYSIZE(y))
struct Child;
struct SubObject;
struct Item;
struct WindowBlock;
struct Subroutine;
struct SubroutineLine;
struct TimeEvent;
2004-03-14 17:50:40 +00:00
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;
2006-03-16 07:08:05 +00:00
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;
uint16 image;
2005-10-05 11:37:26 +00:00
uint16 palette;
2002-07-07 19:06:48 +00:00
uint16 x, y; /* actually signed numbers */
uint16 flags;
uint16 priority;
2006-04-10 23:44:17 +00:00
uint16 windowNum, 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;
int32 param;
VgaTimerEntry() { memset(this, 0, sizeof(*this)); }
};
enum SIMONGameType {
GType_ELVIRA = 0,
GType_ELVIRA2 = 1,
GType_WW = 2,
GType_SIMON1 = 3,
GType_SIMON2 = 4,
GType_FF = 6,
GType_PP = 7
};
struct GameFileDescription {
const char *fileName;
uint16 fileType;
const char *md5;
};
struct GameDescription {
const char *name;
SIMONGameType gameType;
GameIds gameId;
const char *extra;
int filesCount;
GameFileDescription *filesDescriptions;
uint32 features;
Common::Language language;
Common::Platform platform;
};
struct GameSpecificSettings;
2004-01-27 16:28:39 +00:00
class Debugger;
class SimonEngine : public Engine {
2004-01-27 16:28:39 +00:00
friend class Debugger;
friend class MoviePlayer;
2004-01-27 16:28:39 +00:00
GUI::Debugger *getDebugger();
typedef void (SimonEngine::*OpcodeProc) ();
void setupOpcodes();
const OpcodeProc *_opcode_table;
int _numOpcodes;
typedef void (SimonEngine::*VgaOpcodeProc) ();
void setupVgaOpcodes();
const VgaOpcodeProc *_vga_opcode_table;
public:
GameDescription *_gameDescription;
bool initGame(void);
void setupGame();
int getGameId() const { return _gameDescription->gameId; }
int getGameType() const { return _gameDescription->gameType; }
uint32 getFeatures() const { return _gameDescription->features; }
Common::Language getLanguage() const { return _gameDescription->language; }
Common::Platform getPlatform() const { return _gameDescription->platform; }
const char *getFileName(int type) const {
for (int i = 0; i < _gameDescription->filesCount; i++) {
if (_gameDescription->filesDescriptions[i].fileType == type)
return _gameDescription->filesDescriptions[i].fileName;
}
error("getFileName: Invalid type %d", type);
}
2003-06-15 11:52:42 +00:00
protected:
void playSting(uint a);
const byte *_vcPtr; /* video code ptr */
uint16 _vc_get_out_of_code;
uint32 *_gameOffsetsPtr;
2006-05-04 02:23:52 +00:00
uint _vgaBaseDelay;
uint _tableIndexBase;
uint _textIndexBase;
uint _numVideoOpcodes;
uint _vgaMemSize;
uint _tableMemSize;
uint _musicIndexBase;
uint _soundIndexBase;
uint _numVars;
const GameSpecificSettings *gss;
byte _keyPressed;
typedef enum {
FORMAT_NONE,
FORMAT_MP3,
FORMAT_WAV,
FORMAT_VOC
} SoundFormat;
Common::File *_gameFile;
byte *_strippedTxtMem;
byte *_textMem;
uint _textSize;
uint _stringTabNum, _stringTabPos, _stringtab_numalloc;
byte **_stringTabPtr;
Item **_itemArrayPtr;
uint _itemArraySize;
uint _itemArrayInited;
byte *_itemHeapPtr;
uint _itemHeapCurPos;
uint _itemHeapSize;
byte *_iconFilePtr;
const byte *_codePtr;
2002-07-07 19:06:48 +00:00
byte **_localStringtable;
uint _stringIdLocalMin, _stringIdLocalMax;
byte *_roomsList;
2006-09-19 11:59:13 +00:00
byte *_xtblList;
byte *_xtablesHeapPtrOrg;
uint _xtablesHeapCurPosOrg;
Subroutine *_xsubroutineListOrg;
byte *_tblList;
byte *_tablesHeapPtr, *_tablesHeapPtrOrg, *_tablesheapPtrNew;
uint _tablesHeapSize, _tablesHeapCurPos, _tablesHeapCurPosOrg;
uint _tablesHeapCurPosNew;
2006-09-19 11:59:13 +00:00
Subroutine *_subroutineListOrg;
2006-09-19 11:59:13 +00:00
Subroutine *_subroutineList;
uint _subroutine;
uint _dxSurfacePitch;
uint _recursionDepth;
uint32 _lastVgaTick;
2005-10-05 11:37:26 +00:00
uint16 _marks;
bool _scriptVar2;
bool _runScriptReturn1;
bool _runScriptCondition[40];
int _runScriptReturn[40];
bool _skipVgaWait;
bool _noParentNotify;
2005-11-10 00:53:00 +00:00
bool _beardLoaded;
bool _hitarea_unk_3;
bool _mortalFlag;
2006-05-02 18:15:00 +00:00
bool _updateScreen;
bool _usePaletteDelay;
bool _syncFlag2;
bool _inCallBack;
bool _cepeFlag;
byte _copyPartialMode;
bool _fastMode;
2006-04-15 22:37:48 +00:00
bool _useBackGround;
2002-12-06 14:40:40 +00:00
uint16 _debugMode;
uint16 _language;
bool _pause;
bool _startMainScript;
bool _continousMainScript;
bool _startVgaScript;
bool _continousVgaScript;
bool _drawImagesDebug;
bool _dumpImages;
bool _speech;
2003-03-07 12:29:33 +00:00
bool _subtitles;
bool _vgaVar9;
int16 _chanceModifier;
2006-03-16 07:08:05 +00:00
bool _restoreWindow6;
int _scrollX, _scrollXMax, _scrollWidth;
int _scrollY, _scrollYMax, _scrollHeight;
int _scrollCount, _scrollFlag;
2005-10-05 11:37:26 +00:00
const byte *_scrollImage;
byte _boxStarHeight;
uint16 _hyperLink, _newLines;
uint16 _oracleMaxScrollY, _noOracleScroll;
uint16 _interactY;
2005-11-18 22:34:41 +00:00
int16 _scriptVerb, _scriptNoun1, _scriptNoun2;
int16 _scriptAdj1, _scriptAdj2;
2005-10-19 11:32:25 +00:00
uint16 _curWindow;
WindowBlock *_textWindow;
Item *_subjectItem, *_objectItem;
Item *_currentPlayer;
Item *_hitAreaObjectItem;
HitArea *_lastHitArea;
HitArea *_lastNameOn;
HitArea *_lastHitArea3;
Item *_hitAreaSubjectItem;
2006-04-06 10:47:37 +00:00
HitArea *_currentVerbBox, *_lastVerbOn;
uint _needHitAreaRecalc;
uint _verbHitArea;
2006-03-16 10:30:59 +00:00
uint16 _defaultVerb;
uint _currentBoxNumber;
uint _iOverflow;
2005-10-05 11:37:26 +00:00
uint16 _windowNum;
uint _printCharCurPos, _printCharMaxPos, _printCharPixelCount;
uint _numLettersToPrint;
uint _numTextBoxes;
uint _lastTime;
uint32 _clockStopped, _gameStoppedClock;
time_t _timeStore;
TimeEvent *_firstTimeStruct, *_pendingDeleteTimeEvent;
int _mouseX, _mouseY;
int _mouseXOld, _mouseYOld;
enum {
kMaxCursorWidth = 40,
kMaxCursorHeight = 40
};
byte _mouseData[kMaxCursorWidth * kMaxCursorHeight];
byte _animatePointer;
byte _mouseCursor, _mouseAnim, _mouseAnimMax;
byte _currentMouseCursor, _currentMouseAnim;
byte _oldMouseCursor, _oldMouseAnimMax;
uint _mouseHideCount;
bool _mouseToggle;
byte _leftButtonDown;
byte _rightButtonDown;
bool _noRightClick;
Item *_dummyItem1;
Item *_dummyItem2;
Item *_dummyItem3;
volatile uint16 _lockWord;
uint16 _scrollUpHitArea;
uint16 _scrollDownHitArea;
bool _fastFadeOutFlag;
bool _unkPalFlag;
byte _paletteFlag;
uint _fastFadeCount;
volatile uint16 _fastFadeInFlag;
int _screenWidth, _screenHeight;
2006-04-20 00:54:30 +00:00
uint16 _noOverWrite;
2006-04-10 23:44:17 +00:00
bool _rejectBlock;
2006-04-20 00:54:30 +00:00
bool _exitCutscene;
uint _soundFileId;
int16 _lastMusicPlayed;
int16 _nextMusicToPlay;
bool _showPreposition;
bool _showMessageFlag;
uint _vgaSpriteChanged;
byte *_vgaMemPtr, *_vgaMemEnd, *_vgaMemBase;
byte *_vgaFrozenBase, *_vgaRealBase;
byte *_zoneBuffers;
2002-07-07 19:06:48 +00:00
byte *_curVgaFile1;
byte *_curVgaFile2;
byte *_curSfxFile;
uint16 _syncCount, _timer5, _timer4;
2005-10-05 11:37:26 +00:00
uint16 _frameRate;
2006-04-10 23:44:17 +00:00
uint16 _zoneNumber;
uint16 _vgaWaitFor, _lastVgaWaitFor;
uint16 _vgaCurSpriteId, _vgaCurZoneNum;
uint16 _vgaCurSpritePriority;
int16 _baseY;
float _scale;
Common::Rect _feebleRect;
int _scaleX, _scaleY, _scaleWidth, _scaleHeight;
VgaTimerEntry *_nextVgaTimerToProcess;
Item *_objectArray[20];
Item *_itemStore[20];
2002-07-07 19:06:48 +00:00
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 *_windowArray[16];
byte _fcsData1[8];
bool _fcsData2[8];
TextLocation _textLocation1, _textLocation2, _textLocation3, _textLocation4;
int _freeStringSlot;
byte _stringReturnBuffer[2][180];
HitArea _hitAreas[250];
VgaPointersEntry _vgaBufferPointers[450];
VgaSprite _vgaSprites[180];
VgaSleepStruct _vgaSleepStructs[60];
const uint16 *_pathFindArray[100];
2005-11-18 14:16:28 +00:00
uint8 _pathValues[400];
uint16 _PVCount;
uint16 _GPVCount;
2005-11-18 14:16:28 +00:00
uint8 _pathValues1[400];
uint16 _PVCount1;
uint16 _GPVCount1;
uint8 _currentPalette[1024];
uint8 _displayPalette[1024];
byte _videoBuf1[3000];
2006-04-10 23:44:17 +00:00
VgaTimerEntry _vgaTimerList[900];
2006-04-06 10:47:37 +00:00
WindowBlock *_windowList;
byte _lettersToPrintBuf[80];
MidiPlayer midi;
2005-12-29 21:21:16 +00:00
bool _native_mt32;
int _vgaTickCounter;
MoviePlayer *_moviePlay;
Sound *_sound;
bool _effectsPaused;
bool _ambientPaused;
bool _musicPaused;
2004-01-27 16:28:39 +00:00
Debugger *_debugger;
int _saveLoadRowCurPos;
int _numSaveGameRows;
bool _saveDialogFlag;
bool _saveOrLoad;
2006-06-02 08:06:50 +00:00
bool _saveLoadEdit;
byte _saveLoadType, _saveLoadSlot;
char _saveLoadName[108];
int _sdlMouseX, _sdlMouseY;
2006-04-15 22:37:48 +00:00
byte *_backGroundBuf;
byte *_frontBuf;
byte *_backBuf;
byte *_scaleBuf;
Common::RandomSource _rnd;
const byte *_vc10BasePtrOld;
byte _hebrewCharWidths[32];
2003-06-15 11:52:42 +00:00
public:
SimonEngine(OSystem *syst);
virtual ~SimonEngine();
2003-06-15 11:52:42 +00:00
protected:
uint16 to16Wrapper(uint value);
uint16 readUint16Wrapper(const void *src);
uint32 readUint32Wrapper(const void *src);
int allocGamePcVars(Common::File *in);
void setUserFlag(Item *item, int a, int b);
void createPlayer();
void allocateStringTable(int num);
void setupStringTable(byte *mem, int num);
void setupLocalStringTable(byte *mem, int num);
void readGamePcText(Common::File *in);
void readItemChildren(Common::File *in, Item *item, uint tmp);
void readItemFromGamePc(Common::File *in, Item *item);
void loadGamePcFile();
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, int pan, int vol, uint type);
void loadVoice(uint speechId);
2006-05-05 05:59:03 +00:00
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(uint a);
void readSubroutine(Common::File *in, Subroutine *sub);
SubroutineLine *createSubroutineLine(Subroutine *sub, int a);
void readSubroutineLine(Common::File *in, SubroutineLine *new_table, Subroutine *sub);
byte *readSingleOpcode(Common::File *in, byte *ptr);
void readSubroutineBlock(Common::File *in);
Subroutine *getSubroutineByID(uint subroutine_id);
/* used in debugger */
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();
Item *getNextItemPtr();
uint getNextItemID();
uint getItem1ID() {return 1;}
Item *me();
Item *actor();
byte getByte();
int getNextWord();
uint getNextVarContents();
uint getVarWrapper();
uint getVarOrWord();
uint getVarOrByte();
uint readVariable(uint variable);
void writeNextVarContents(uint16 contents);
void writeVariable(uint variable, uint16 contents);
void setItemParent(Item *item, Item *parent);
uint itemPtrToID(Item *id);
Item *derefItem(uint item);
2005-10-03 14:08:07 +00:00
void setItemState(Item *item, int value);
void showMessageFormat(const char *s, ...);
const byte *getStringPtrByID(uint stringId);
const byte *getLocalStringByID(uint stringId);
uint getNextStringID();
void addTimeEvent(uint timeout, uint subroutine_id);
void delTimeEvent(TimeEvent *te);
2005-11-10 00:53:00 +00:00
bool isRoom(Item *item);
bool isObject(Item *item);
void itemChildrenChanged(Item *item);
void unlinkItem(Item *item);
void linkItem(Item *item, Item *parent);
void stopAnimateSimon1(uint a);
void stopAnimateSimon2(uint a, uint b);
2006-04-14 09:57:43 +00:00
void enableBox(uint hitarea);
void disableBox(uint hitarea);
2006-03-16 07:08:05 +00:00
void moveBox(uint hitarea, int x, int y);
2006-05-03 01:11:50 +00:00
bool isBoxDead(uint hitarea);
2006-04-14 09:57:43 +00:00
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();
2006-03-16 10:30:59 +00:00
void resetVerbs();
void setVerb(HitArea * ha);
void hitarea_leave(HitArea * ha, bool state = false);
void leaveHitAreaById(uint hitarea_id);
void sendSync(uint a);
2006-05-03 01:11:50 +00:00
void waitForSync(uint a);
2002-07-07 19:06:48 +00:00
uint getOffsetOfChild2Param(SubObject *child, uint prop);
void setTextColor(uint color);
void scriptMouseOn();
void scriptMouseOff();
2006-05-03 01:11:50 +00:00
void freezeBottom();
void unfreezeBottom();
2002-12-04 22:40:16 +00:00
2004-03-14 17:50:40 +00:00
TextLocation *getTextLocation(uint a);
void setup_cond_c_helper();
void checkLinkBox();
void hyperLinkOn(uint16 x);
void hyperLinkOff();
void linksUp();
void linksDown();
void oracleTextUp();
void oracleTextDown();
void listSaveGames(int n);
void saveUserGame(int slot);
void windowBackSpace(WindowBlock *window);
void oracleLogo();
void scrollOracle();
void scrollOracleUp();
void scrollOracleDown();
void swapCharacterLogo();
2005-12-08 06:12:04 +00:00
void mouseOff();
void mouseOn();
2006-09-19 11:59:13 +00:00
bool loadTablesIntoMem(uint subr_id);
bool loadTablesOldIntoMem(uint subr_id);
bool loadTablesNewIntoMem(uint subr_id);
2006-09-19 11:59:13 +00:00
bool loadXTablesIntoMem(uint subr_id);
void loadTextIntoMem(uint stringId);
bool loadRoomItems(uint item);
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();
2006-05-03 01:11:50 +00:00
void killAllTimers();
2005-12-13 00:20:11 +00:00
void endCutscene();
void runSubroutine101();
void checkUp(WindowBlock *window);
void checkDown(WindowBlock *window);
void inventoryUp(WindowBlock *window);
void inventoryDown(WindowBlock *window);
2006-05-03 01:11:50 +00:00
WindowBlock *openWindow(uint x, uint y, uint w, uint h, uint flags, uint fill_color, uint text_color);
uint getWindowNum(WindowBlock *window);
2006-05-03 01:11:50 +00:00
void clearWindow(WindowBlock *window);
void changeWindow(uint a);
void closeWindow(uint a);
void windowPutChar(WindowBlock *window, byte c, byte b = 0);
2006-05-03 01:11:50 +00:00
HitArea *findBox(uint hitarea_id);
2006-04-15 07:56:55 +00:00
void boxController(uint x, uint y, uint mode);
2006-05-03 01:11:50 +00:00
void handleVerbClicked(uint verb);
void clearName();
void displayName(HitArea * ha);
2006-05-03 01:11:50 +00:00
void resetNameWindow();
2006-04-06 10:47:37 +00:00
void displayBoxStars();
void hitarea_stuff();
2006-05-03 01:11:50 +00:00
void invertBox_FF(HitArea *ha, bool state);
void invertBox(HitArea * ha, byte a, byte b, byte c, byte d);
2006-04-06 10:47:37 +00:00
void handleMouseMoved();
void pollMouseXY();
2005-12-13 00:20:11 +00:00
void drawMousePointer();
void drawMousePointer_FF();
void drawMousePart(int image, byte x, byte y);
void defineArrowBoxes(WindowBlock *window);
void removeArrows(WindowBlock *window, uint num);
void draw_icon_c(WindowBlock *window, uint icon, uint x, uint y);
bool has_item_childflag_0x10(Item *item);
uint itemGetIconNumber(Item *item);
uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr);
void drawIconArray(uint i, Item *item_ptr, int line, int classMask);
void drawIconArray_FF(uint i, Item *item_ptr, int line, int classMask);
void drawIconArray_Simon(uint i, Item *item_ptr, int line, int classMask);
void removeIconArray(uint num);
void loadIconData();
void loadIconFile();
void processSpecialKeys();
void hitarea_stuff_helper();
2006-04-06 10:47:37 +00:00
void permitInput();
uint getFeebleFontSize(byte chr);
void showmessage_helper_3(uint a, uint b);
void showmessage_print_char(byte chr);
void set_video_mode_internal(uint16 mode, uint16 vga_res_id);
2002-07-07 19:06:48 +00:00
2005-12-13 00:20:11 +00:00
void loadZone(uint vga_res);
2005-10-05 11:37:26 +00:00
void loadSprite(uint windowNum, uint vga_res, uint vga_sprite_id, uint x, uint y, uint palette);
2005-12-13 00:20:11 +00:00
void playSpeech(uint speech_id, uint vga_sprite_id);
2006-05-03 01:11:50 +00:00
void skipSpeech();
2002-07-07 19:06:48 +00:00
bool printNameOf(Item *item, uint x, uint y);
2006-05-03 01:11:50 +00:00
bool printTextOf(uint a, uint x, uint y);
void printVerbOf(uint hitarea_id);
void showActionString(const byte *string);
void printScreenText(uint vga_sprite_id, uint color, const char *string_ptr, int16 x, int16 y, int16 width);
2006-05-03 01:11:50 +00:00
void sendInteractText(uint16 num, const char *fmt, ...);
void printInteractText(uint16 num, const char *string);
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);
2006-04-10 23:44:17 +00:00
byte *allocBlock(uint32 size);
void checkNoOverWrite(byte *end);
void checkRunningAnims(byte *end);
void checkAnims(uint a, byte *end);
void checkZonePtrs(byte *end);
2006-05-03 01:11:50 +00:00
void setZoneBuffers();
void runVgaScript();
2003-06-15 11:52:42 +00:00
public:
bool getBitFlag(uint bit);
void setBitFlag(uint bit, bool value);
// Simon1/Simon2 video script opcodes
2005-10-05 12:16:49 +00:00
void vc1_fadeOut();
2005-05-06 13:22:48 +00:00
void vc2_call();
void vc3_loadSprite();
2005-10-05 12:16:49 +00:00
void vc4_fadeIn();
2005-05-06 13:22:48 +00:00
void vc5_skip_if_neq();
void vc6_skip_ifn_sib_with_a();
void vc7_skip_if_sib_with_a();
void vc8_skip_if_parent_is();
void vc9_skip_if_unk3_is();
void vc10_draw();
void vc11_clearPathFinder();
void vc12_delay();
void vc13_addToSpriteX();
void vc14_addToSpriteY();
2006-04-14 09:57:43 +00:00
void vc15_sync();
void vc16_waitSync();
2005-05-06 13:22:48 +00:00
void vc17_setPathfinderItem();
void vc18_jump();
void vc19_chain_to_script();
2005-10-05 12:16:49 +00:00
void vc20_setRepeat();
void vc21_endRepeat();
2005-05-06 13:22:48 +00:00
void vc22_setSpritePalette();
void vc23_setSpritePriority();
void vc24_setSpriteXY();
void vc25_halt_sprite();
2005-10-05 12:16:49 +00:00
void vc26_setSubWindow();
2005-05-06 13:22:48 +00:00
void vc27_resetSprite();
void vc28_dummy_op();
void vc29_stopAllSounds();
2005-10-05 11:37:26 +00:00
void vc30_setFrameRate();
void vc31_setWindow();
2005-05-06 13:22:48 +00:00
void vc32_copyVar();
2005-10-05 12:16:49 +00:00
void vc33_setMouseOn();
void vc34_setMouseOff();
void vc35_clearWindow();
void vc36_setWindowImage();
2005-05-06 13:22:48 +00:00
void vc37_addToSpriteY();
void vc38_skipIfVarZero();
void vc39_setVar();
void vc40();
void vc41();
void vc42_delayIfNotEQ();
void vc43_skipIfBitClear();
void vc44_skipIfBitSet();
void vc45_setSpriteX();
void vc46_setSpriteY();
void vc47_addToVar();
void vc48_setPathFinder();
void vc49_setBit();
void vc50_clearBit();
2006-04-14 09:57:43 +00:00
void vc51_enableBox();
2005-05-06 13:22:48 +00:00
void vc52_playSound();
2006-04-14 09:57:43 +00:00
void vc53_panSFX();
2005-05-06 13:22:48 +00:00
void vc54_no_op();
2006-04-14 09:57:43 +00:00
void vc55_moveBox();
2005-05-06 13:22:48 +00:00
void vc56_delay();
2006-09-19 11:59:13 +00:00
void vc57_blackPalette();
2005-05-06 13:22:48 +00:00
void vc58();
void vc59();
void vc60_killSprite();
void vc61_setMaskImage();
2005-10-05 11:37:26 +00:00
void vc62_fastFadeOut();
void vc63_fastFadeIn();
// Simon2 specific Video Script Opcodes
2005-10-05 11:37:26 +00:00
void vc64_skipIfSpeechEnded();
void vc65_slowFadeIn();
2005-05-06 13:22:48 +00:00
void vc66_skipIfNotEqual();
void vc67_skipIfGE();
void vc68_skipIfLE();
void vc69_playTrack();
void vc70_queueMusic();
void vc71_checkMusicQueue();
void vc72_play_track_2();
2005-10-05 11:37:26 +00:00
void vc73_setMark();
void vc74_clearMark();
2005-11-19 11:37:41 +00:00
// Feeble specific Video Script Opcodes
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, Simon 1 and later
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_addTextBox();
void o_setShortText();
void o_setLongText();
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_waitEndTune();
void o_ifEndTune();
void o_setAdjNoun();
void o_saveUserGame();
void o_loadUserGame();
void o_stopTune();
void o_pauseGame();
void o_copysf();
void o_restoreIcons();
void o_freezeZones();
void o_placeNoIcons();
void o_clearTimers();
void o_setDollar();
void o_isBox();
void o_doTable();
void o_storeItem();
void o_getItem();
void o_bSet();
void o_bClear();
void o_bZero();
void o_bNotZero();
void o_getOValue();
void o_setOValue();
void o_ink();
void o_screenTextBox();
void o_screenTextMsg();
void o_playEffect();
void o_getDollar2();
void o_isAdjNoun();
void o_b2Set();
void o_b2Clear();
void o_b2Zero();
void o_b2NotZero();
void o_lockZones();
void o_unlockZones();
void o_getPathPosn();
void o_scnTxtLongText();
void o_mouseOn();
void o_unloadZone();
void o_unfreezeZones();
2006-09-19 11:59:13 +00:00
uint16 getDoorState(Item *item, uint16 d);
uint16 getExitOf(Item *item, uint16 d);
// Opcodes, Waxworks only
void oww_whereTo();
void oww_menu();
void oww_textMenu();
void oww_ifDoorOpen();
// Opcodes, Simon 1 only
void o1_printLongText();
void o1_rescan();
void o1_animate();
void o1_stopAnimate();
void o1_playTune();
void o1_screenTextPObj();
void o1_mouseOff();
void o1_loadBeard();
void o1_unloadBeard();
void o1_loadStrings();
void o1_specialFade();
// Opcodes, Simon 2 and later
void o2_printLongText();
void o2_rescan();
void o2_animate();
void o2_stopAnimate();
void o2_playTune();
void o2_screenTextPObj();
void o2_mouseOff();
void o2_isShortText();
void o2_clearMarks();
void o2_waitMark();
// Opcodes, Feeble Files only
void o3_chance();
void o3_jumpOut();
void o3_addTextBox();
void o3_printLongText();
void o3_addBox();
void o3_oracleTextDown();
void o3_oracleTextUp();
void o3_ifTime();
void o3_playTune();
void o3_setTime();
void o3_saveUserGame();
void o3_loadUserGame();
void o3_listSaveGames();
void o3_checkCD();
void o3_screenTextBox();
void o3_isAdjNoun();
void o3_hyperLinkOn();
void o3_hyperLinkOff();
void o3_checkPaths();
void o3_screenTextPObj();
void o3_mouseOff();
void o3_loadVideo();
void o3_playVideo();
void o3_centreScroll();
void o3_resetPVCount();
void o3_setPathValues();
void o3_stopClock();
void o3_restartClock();
void o3_setColour();
void o3_b3Set();
void o3_b3Clear();
void o3_b3Zero();
void o3_b3NotZero();
// Opcodes, Puzzle Pack only
void o4_opcode30();
void o4_opcode38();
void o4_loadHiScores();
void o4_checkHiScores();
2003-06-15 11:52:42 +00:00
protected:
2005-11-19 11:37:41 +00:00
void drawImages(VC10_state *state);
void drawImages_Feeble(VC10_state *state);
bool drawImages_clip(VC10_state *state);
void scaleClip(int16 h, int16 w, int16 y, int16 x, int16 scrollY);
void horizontalScroll(VC10_state *state);
void verticalScroll(VC10_state *state);
2005-12-13 00:20:11 +00:00
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();
2005-11-18 13:47:47 +00:00
2003-03-07 03:26:30 +00:00
bool itemIsSiblingOf(uint16 val);
bool itemIsParentOf(uint16 a, uint16 b);
bool vc_maybe_skip_proc_1(uint16 a, int16 b);
void addVgaEvent(uint16 num, const byte *code_ptr, uint16 cur_sprite, uint16 curZoneNum, int32 param = 0);
void deleteVgaEvent(VgaTimerEntry * vte);
void processVgaEvents();
void animateEvent(const byte *code_ptr, uint16 curZoneNum, uint16 cur_sprite);
void panEvent(uint16 curZoneNum, uint16 cur_sprite, int32 param);
void scrollEvent();
2005-12-13 00:20:11 +00:00
VgaSprite *findCurSprite();
2006-04-10 23:44:17 +00:00
bool isSpriteLoaded(uint16 id, uint16 zoneNum);
void resetWindow(WindowBlock *window);
void delete_hitarea_by_index(uint index);
2006-04-06 10:47:37 +00:00
void windowPutChar(uint a);
void restoreWindow(WindowBlock *window);
void colorWindow(WindowBlock *window);
void restoreBlock(uint h, uint w, uint y, uint x);
byte *getFrontBuf();
byte *getBackBuf();
2006-04-15 22:37:48 +00:00
byte *getBackGround();
byte *getScaleBuf();
byte *loadVGAFile(uint id, uint type, uint32 &dstSize);
void loadSimonVGAFile(uint vga_id);
int init();
int go();
void openGameFile();
void readGameFile(void *dst, uint32 offs, uint32 size);
void timer_callback();
void timer_proc1();
void animateSprites();
2006-04-21 00:26:18 +00:00
void animateSpritesDebug();
void animateSpritesByY();
void dx_clear_surfaces(uint num_lines);
void dx_update_screen_and_palette();
void dump_video_script(const byte *src, bool one_opcode_only);
void dump_vga_file(const byte *vga);
void dump_vga_script(const byte *ptr, uint res, uint sprite_id);
void dump_vga_script_always(const byte *ptr, uint res, uint sprite_id);
void dump_vga_bitmaps(const byte *vga, byte *vga1, int res);
void dump_single_bitmap(int file, int image, const byte *offs, int w, int h, byte base);
void dump_bitmap(const char *filename, const byte *offs, int w, int h, int flags, const byte *palette, byte base);
2006-04-15 22:37:48 +00:00
void clearBackFromTop(uint lines);
void fillFrontFromBack(uint x, uint y, uint w, uint h);
void fillBackGroundFromBack(uint lines);
void fillBackFromFront(uint x, uint y, uint w, uint h);
void print_char_helper_1(const byte *src, uint len);
void print_char_helper_5(WindowBlock *window);
2005-12-13 00:20:11 +00:00
void quickLoadOrSave();
void shutdown();
2005-11-08 11:34:56 +00:00
byte *vc10_uncompressFlip(const byte *src, uint w, uint h);
byte *vc10_flip(const byte *src, uint w, uint h);
Item *getNextItemPtrStrange();
2005-12-13 00:20:11 +00:00
bool saveGame(uint slot, char *caption);
bool loadGame(uint slot);
void openTextWindow();
void tidyIconArray(uint i);
void video_putchar_newline(WindowBlock *window);
void video_putchar_drawchar(WindowBlock *window, uint x, uint y, byte chr);
void loadMusic(uint music);
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();
2003-05-24 12:26:28 +00:00
void vc_kill_sprite(uint file, uint sprite);
void set_dummy_cursor();
void set_volume(int volume);
2006-06-02 08:06:50 +00:00
void userGame(bool load);
void disableFileBoxes();
int userGameGetKey(bool *b, char *buf);
void userGameBackSpace(WindowBlock *window, int x, byte b = 0);
void listSaveGames(char *buf);
void fileError(WindowBlock *window, bool save_error);
2005-12-13 00:20:11 +00:00
int countSaveGames();
int displaySaveGameList(int curpos, bool load, char *dst);
2006-05-03 01:11:50 +00:00
char *genSaveName(int slot);
};
2003-10-03 19:42:27 +00:00
} // End of namespace Simon
#endif