diff options
Diffstat (limited to 'engines/agos/simon.h')
-rw-r--r-- | engines/agos/simon.h | 1191 |
1 files changed, 1191 insertions, 0 deletions
diff --git a/engines/agos/simon.h b/engines/agos/simon.h new file mode 100644 index 0000000000..90f3a1506c --- /dev/null +++ b/engines/agos/simon.h @@ -0,0 +1,1191 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * 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 AGOS_AGOS_H +#define AGOS_AGOS_H + +#include "engines/engine.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 Simon { + +/* Various other settings */ +//#define DUMP_FILE_NR 8 +//#define DUMP_BITMAPS_FILE_NR 8 + +uint fileReadItemID(Common::File *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; + uint16 image; + uint16 palette; + uint16 x, y; /* actually signed numbers */ + uint16 flags; + uint16 priority; + 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; + +class Debugger; + +class SimonEngine : public Engine { + friend class Debugger; + friend class MoviePlayer; + + 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); + } + +protected: + void playSting(uint a); + + const byte *_vcPtr; /* video code ptr */ + uint16 _vc_get_out_of_code; + + + uint32 *_gameOffsetsPtr; + + 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; + + byte **_localStringtable; + uint _stringIdLocalMin, _stringIdLocalMax; + + byte *_roomsList; + + 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; + + uint _dxSurfacePitch; + + uint _recursionDepth; + + uint32 _lastVgaTick; + + uint16 _marks; + + bool _scriptVar2; + bool _runScriptReturn1; + bool _runScriptCondition[40]; + int _runScriptReturn[40]; + bool _skipVgaWait; + bool _noParentNotify; + bool _beardLoaded; + bool _hitarea_unk_3; + bool _mortalFlag; + bool _updateScreen; + bool _usePaletteDelay; + bool _syncFlag2; + bool _inCallBack; + bool _cepeFlag; + byte _copyPartialMode; + bool _fastMode; + bool _useBackGround; + + uint16 _debugMode; + uint16 _language; + bool _pause; + bool _startMainScript; + bool _continousMainScript; + bool _startVgaScript; + bool _continousVgaScript; + bool _drawImagesDebug; + bool _dumpImages; + bool _speech; + bool _subtitles; + bool _vgaVar9; + int16 _chanceModifier; + bool _restoreWindow6; + int _scrollX, _scrollXMax, _scrollWidth; + int _scrollY, _scrollYMax, _scrollHeight; + int _scrollCount, _scrollFlag; + const byte *_scrollImage; + byte _boxStarHeight; + + 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 *_currentVerbBox, *_lastVerbOn; + uint _needHitAreaRecalc; + uint _verbHitArea; + uint16 _defaultVerb; + uint _currentBoxNumber; + uint _iOverflow; + + 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; + + uint16 _noOverWrite; + bool _rejectBlock; + + bool _exitCutscene; + + uint _soundFileId; + int16 _lastMusicPlayed; + int16 _nextMusicToPlay; + + bool _showPreposition; + bool _showMessageFlag; + + uint _vgaSpriteChanged; + + byte *_vgaMemPtr, *_vgaMemEnd, *_vgaMemBase; + byte *_vgaFrozenBase, *_vgaRealBase; + byte *_zoneBuffers; + + byte *_curVgaFile1; + byte *_curVgaFile2; + byte *_curSfxFile; + + uint16 _syncCount, _timer5, _timer4; + + uint16 _frameRate; + + 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]; + + 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]; + + uint8 _pathValues[400]; + uint16 _PVCount; + uint16 _GPVCount; + + uint8 _pathValues1[400]; + uint16 _PVCount1; + uint16 _GPVCount1; + + uint8 _currentPalette[1024]; + uint8 _displayPalette[1024]; + + byte _videoBuf1[3000]; + + VgaTimerEntry _vgaTimerList[900]; + + WindowBlock *_windowList; + + byte _lettersToPrintBuf[80]; + + MidiPlayer midi; + bool _native_mt32; + + int _vgaTickCounter; + + MoviePlayer *_moviePlay; + + Sound *_sound; + + bool _effectsPaused; + bool _ambientPaused; + bool _musicPaused; + + Debugger *_debugger; + + int _saveLoadRowCurPos; + int _numSaveGameRows; + bool _saveDialogFlag; + bool _saveOrLoad; + bool _saveLoadEdit; + + byte _saveLoadType, _saveLoadSlot; + char _saveLoadName[108]; + + int _sdlMouseX, _sdlMouseY; + + byte *_backGroundBuf; + byte *_frontBuf; + byte *_backBuf; + byte *_scaleBuf; + + Common::RandomSource _rnd; + + const byte *_vc10BasePtrOld; + byte _hebrewCharWidths[32]; + +public: + SimonEngine(OSystem *syst); + virtual ~SimonEngine(); + +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); + + 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); + 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); + + 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); + + 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(); + + void resetVerbs(); + void setVerb(HitArea * ha); + 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 setTextColor(uint color); + void scriptMouseOn(); + void scriptMouseOff(); + void freezeBottom(); + void unfreezeBottom(); + + 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(); + + void mouseOff(); + void mouseOn(); + + bool loadTablesIntoMem(uint subr_id); + bool loadTablesOldIntoMem(uint subr_id); + bool loadTablesNewIntoMem(uint subr_id); + 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(); + void killAllTimers(); + + void endCutscene(); + void runSubroutine101(); + + void checkUp(WindowBlock *window); + void checkDown(WindowBlock *window); + void inventoryUp(WindowBlock *window); + void inventoryDown(WindowBlock *window); + + WindowBlock *openWindow(uint x, uint y, uint w, uint h, uint flags, uint fill_color, uint text_color); + uint getWindowNum(WindowBlock *window); + void clearWindow(WindowBlock *window); + void changeWindow(uint a); + void closeWindow(uint a); + void windowPutChar(WindowBlock *window, byte c, byte b = 0); + + HitArea *findBox(uint hitarea_id); + void boxController(uint x, uint y, uint mode); + void handleVerbClicked(uint verb); + void clearName(); + void displayName(HitArea * ha); + void resetNameWindow(); + void displayBoxStars(); + void hitarea_stuff(); + void invertBox_FF(HitArea *ha, bool state); + void invertBox(HitArea * ha, byte a, byte b, byte c, byte d); + + void handleMouseMoved(); + void pollMouseXY(); + 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(); + + 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); + + void loadZone(uint vga_res); + + void loadSprite(uint windowNum, uint vga_res, uint vga_sprite_id, uint x, uint y, uint palette); + void playSpeech(uint speech_id, uint vga_sprite_id); + 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); + + void printScreenText(uint vga_sprite_id, uint color, const char *string_ptr, int16 x, int16 y, int16 width); + 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); + + byte *allocBlock(uint32 size); + void checkNoOverWrite(byte *end); + void checkRunningAnims(byte *end); + void checkAnims(uint a, byte *end); + void checkZonePtrs(byte *end); + void setZoneBuffers(); + + void runVgaScript(); + +public: + bool getBitFlag(uint bit); + void setBitFlag(uint bit, bool value); + + // Simon1/Simon2 video script opcodes + void vc1_fadeOut(); + void vc2_call(); + void vc3_loadSprite(); + void vc4_fadeIn(); + 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(); + void vc15_sync(); + void vc16_waitSync(); + void vc17_setPathfinderItem(); + void vc18_jump(); + void vc19_chain_to_script(); + void vc20_setRepeat(); + void vc21_endRepeat(); + void vc22_setSpritePalette(); + void vc23_setSpritePriority(); + void vc24_setSpriteXY(); + void vc25_halt_sprite(); + void vc26_setSubWindow(); + void vc27_resetSprite(); + void vc28_dummy_op(); + void vc29_stopAllSounds(); + void vc30_setFrameRate(); + void vc31_setWindow(); + void vc32_copyVar(); + void vc33_setMouseOn(); + void vc34_setMouseOff(); + void vc35_clearWindow(); + void vc36_setWindowImage(); + 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(); + void vc51_enableBox(); + void vc52_playSound(); + void vc53_panSFX(); + void vc54_no_op(); + void vc55_moveBox(); + void vc56_delay(); + void vc57_blackPalette(); + void vc58(); + void vc59(); + void vc60_killSprite(); + void vc61_setMaskImage(); + void vc62_fastFadeOut(); + void vc63_fastFadeIn(); + + // Simon2 specific Video Script Opcodes + void vc64_skipIfSpeechEnded(); + void vc65_slowFadeIn(); + void vc66_skipIfNotEqual(); + void vc67_skipIfGE(); + void vc68_skipIfLE(); + void vc69_playTrack(); + void vc70_queueMusic(); + void vc71_checkMusicQueue(); + void vc72_play_track_2(); + void vc73_setMark(); + void vc74_clearMark(); + + // 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(); + + 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_checkTiles(); + void o4_opcode38(); + void o4_loadHiScores(); + void o4_checkHiScores(); + void o4_loadUserGame(); + void o4_saveOopsPosition(); + void o4_resetGameTime(); + void o4_resetPVCount(); + void o4_setPathValues(); + +protected: + 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); + + 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(); + + 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(); + + VgaSprite *findCurSprite(); + + bool isSpriteLoaded(uint16 id, uint16 zoneNum); + + void resetWindow(WindowBlock *window); + void delete_hitarea_by_index(uint index); + + 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(); + 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(); + 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); + + 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); + + 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(); + + 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(); + + void vc_kill_sprite(uint file, uint sprite); + + void set_dummy_cursor(); + + void set_volume(int volume); + + 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); + + int countSaveGames(); + int displaySaveGameList(int curpos, bool load, char *dst); + + char *genSaveName(int slot); +}; + +} // End of namespace Simon + +#endif |