/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #ifndef SKY_LOGIC_H #define SKY_LOGIC_H #include "common/util.h" #include "common/random.h" namespace Sky { struct Compact; enum scriptVariableOffsets { RESULT = 0, SCREEN = 1, LOGIC_LIST_NO = 2, MOUSE_LIST_NO = 6, DRAW_LIST_NO = 8, CUR_ID = 12, MOUSE_STATUS = 13, MOUSE_STOP = 14, BUTTON = 15, SPECIAL_ITEM = 17, GET_OFF = 18, CURSOR_ID = 22, SAFEX = 25, SAFEY = 26, PLAYER_X = 27, PLAYER_Y = 28, PLAYER_MOOD = 29, PLAYER_SCREEN = 30, HIT_ID = 37, LAYER_0_ID = 41, LAYER_1_ID = 42, LAYER_2_ID = 43, LAYER_3_ID = 44, GRID_1_ID = 45, GRID_2_ID = 46, GRID_3_ID = 47, THE_CHOSEN_ONE = 51, TEXT1 = 53, MENU_LENGTH = 100, SCROLL_OFFSET = 101, MENU = 102, OBJECT_HELD = 103, LAMB_GREET = 109, RND = 115, CUR_SECTION = 143, JOEY_SECTION = 145, LAMB_SECTION = 146, KNOWS_PORT = 190, GOT_SPONSOR = 240, GOT_JAMMER = 258, CONSOLE_TYPE = 345, S15_FLOOR = 450, FOREMAN_FRIEND = 451, REICH_DOOR_FLAG = 470, CARD_STATUS = 479, CARD_FIX = 480, GUARDIAN_THERE = 640, FS_COMMAND = 643, ENTER_DIGITS = 644, LINC_DIGIT_0 = 646, LINC_DIGIT_1 = 647, LINC_DIGIT_2 = 648, LINC_DIGIT_3 = 649, LINC_DIGIT_4 = 650, LINC_DIGIT_5 = 651, LINC_DIGIT_6 = 651, LINC_DIGIT_7 = 653, LINC_DIGIT_8 = 654, LINC_DIGIT_9 = 655, DOOR_67_68_FLAG = 678, SC70_IRIS_FLAG = 693, DOOR_73_75_FLAG = 704, SC76_CABINET1_FLAG = 709, SC76_CABINET2_FLAG = 710, SC76_CABINET3_FLAG = 711, DOOR_77_78_FLAG = 719, SC80_EXIT_FLAG = 720, SC31_LIFT_FLAG = 793, SC32_LIFT_FLAG = 797, SC33_SHED_DOOR_FLAG = 798, BAND_PLAYING = 804, COLSTON_AT_TABLE = 805, SC36_NEXT_DEALER = 806, SC36_DOOR_FLAG = 807, SC37_DOOR_FLAG = 808, SC40_LOCKER_1_FLAG = 817, SC40_LOCKER_2_FLAG = 818, SC40_LOCKER_3_FLAG = 819, SC40_LOCKER_4_FLAG = 820, SC40_LOCKER_5_FLAG = 821 }; #define NUM_SKY_SCRIPTVARS 838 class AutoRoute; class Control; class Disk; class Grid; class Mouse; class MusicBase; class Screen; class Sound; class Text; class SkyCompact; class Logic; typedef void (Logic::*LogicTable) (); typedef bool (Logic::*McodeTable) (uint32, uint32, uint32); class Logic { public: Logic( SkyCompact *skyCompact, Screen *skyScreen, Disk *skyDisk, Text *skyText, MusicBase *skyMusic, Mouse *skyMouse, Sound *skySound); ~Logic(); void engine(); void useControlInstance(Control *control) { _skyControl = control; } uint16 mouseScript(uint32 scrNum, Compact *scriptComp); static uint32 _scriptVariables[NUM_SKY_SCRIPTVARS]; Grid *_skyGrid; uint16 script(uint16 scriptNo, uint16 offset); void initScreen0(); void parseSaveData(uint32 *data); private: void setupLogicTable(); void setupMcodeTable(); const LogicTable *_logicTable; const McodeTable *_mcodeTable; protected: void push(uint32); uint32 pop(); void checkModuleLoaded(uint16 moduleNo); bool collide(Compact *cpt); void initScriptVariables(); void mainAnim(); void runGetOff(); void stopAndWait(); bool checkProtection(); void nop(); void logicScript(); void autoRoute(); void arAnim(); void arTurn(); void alt(); void anim(); void turn(); void cursor(); void talk(); void listen(); void stopped(); void choose(); void frames(); void pause(); void waitSync(); void simpleAnim(); bool fnCacheChip(uint32 a, uint32 b, uint32 c); bool fnCacheFast(uint32 a, uint32 b, uint32 c); bool fnDrawScreen(uint32 a, uint32 b, uint32 c); bool fnAr(uint32 a, uint32 b, uint32 c); bool fnArAnimate(uint32 a, uint32 b, uint32 c); bool fnIdle(uint32 a, uint32 b, uint32 c); bool fnInteract(uint32 a, uint32 b, uint32 c); bool fnStartSub(uint32 a, uint32 b, uint32 c); bool fnTheyStartSub(uint32 a, uint32 b, uint32 c); bool fnAssignBase(uint32 a, uint32 b, uint32 c); bool fnDiskMouse(uint32 a, uint32 b, uint32 c); bool fnNormalMouse(uint32 a, uint32 b, uint32 c); bool fnBlankMouse(uint32 a, uint32 b, uint32 c); bool fnCrossMouse(uint32 a, uint32 b, uint32 c); bool fnCursorRight(uint32 a, uint32 b, uint32 c); bool fnCursorLeft(uint32 a, uint32 b, uint32 c); bool fnCursorDown(uint32 a, uint32 b, uint32 c); bool fnOpenHand(uint32 a, uint32 b, uint32 c); bool fnCloseHand(uint32 a, uint32 b, uint32 c); bool fnGetTo(uint32 a, uint32 b, uint32 c); bool fnSetToStand(uint32 a, uint32 b, uint32 c); bool fnTurnTo(uint32 a, uint32 b, uint32 c); bool fnArrived(uint32 a, uint32 b, uint32 c); bool fnLeaving(uint32 a, uint32 b, uint32 c); bool fnSetAlternate(uint32 a, uint32 b, uint32 c); bool fnAltSetAlternate(uint32 a, uint32 b, uint32 c); bool fnKillId(uint32 a, uint32 b, uint32 c); bool fnNoHuman(uint32 a, uint32 b, uint32 c); bool fnAddHuman(uint32 a, uint32 b, uint32 c); bool fnAddButtons(uint32 a, uint32 b, uint32 c); bool fnNoButtons(uint32 a, uint32 b, uint32 c); bool fnSetStop(uint32 a, uint32 b, uint32 c); bool fnClearStop(uint32 a, uint32 b, uint32 c); bool fnPointerText(uint32 a, uint32 b, uint32 c); bool fnQuit(uint32 a, uint32 b, uint32 c); bool fnSpeakMe(uint32 targetId, uint32 mesgNum, uint32 animNum); bool fnSpeakMeDir(uint32 targetId, uint32 mesgNum, uint32 animNum); bool fnSpeakWait(uint32 a, uint32 b, uint32 c); bool fnSpeakWaitDir(uint32 a, uint32 b, uint32 c); bool fnChooser(uint32 a, uint32 b, uint32 c); bool fnHighlight(uint32 a, uint32 b, uint32 c); bool fnTextKill(uint32 a, uint32 b, uint32 c); bool fnStopMode(uint32 a, uint32 b, uint32 c); bool fnWeWait(uint32 a, uint32 b, uint32 c); bool fnSendSync(uint32 a, uint32 b, uint32 c); bool fnSendFastSync(uint32 a, uint32 b, uint32 c); bool fnSendRequest(uint32 a, uint32 b, uint32 c); bool fnClearRequest(uint32 a, uint32 b, uint32 c); bool fnCheckRequest(uint32 a, uint32 b, uint32 c); bool fnStartMenu(uint32 a, uint32 b, uint32 c); bool fnUnhighlight(uint32 a, uint32 b, uint32 c); bool fnFaceId(uint32 a, uint32 b, uint32 c); bool fnForeground(uint32 a, uint32 b, uint32 c); bool fnBackground(uint32 a, uint32 b, uint32 c); bool fnNewBackground(uint32 a, uint32 b, uint32 c); bool fnSort(uint32 a, uint32 b, uint32 c); bool fnNoSpriteEngine(uint32 a, uint32 b, uint32 c); bool fnNoSpritesA6(uint32 a, uint32 b, uint32 c); bool fnResetId(uint32 a, uint32 b, uint32 c); bool fnToggleGrid(uint32 a, uint32 b, uint32 c); bool fnPause(uint32 a, uint32 b, uint32 c); bool fnRunAnimMod(uint32 a, uint32 b, uint32 c); bool fnSimpleMod(uint32 a, uint32 b, uint32 c); bool fnRunFrames(uint32 a, uint32 b, uint32 c); bool fnAwaitSync(uint32 a, uint32 b, uint32 c); bool fnIncMegaSet(uint32 a, uint32 b, uint32 c); bool fnDecMegaSet(uint32 a, uint32 b, uint32 c); bool fnSetMegaSet(uint32 a, uint32 b, uint32 c); bool fnMoveItems(uint32 a, uint32 b, uint32 c); bool fnNewList(uint32 a, uint32 b, uint32 c); bool fnAskThis(uint32 a, uint32 b, uint32 c); bool fnRandom(uint32 a, uint32 b, uint32 c); bool fnPersonHere(uint32 a, uint32 b, uint32 c); bool fnToggleMouse(uint32 a, uint32 b, uint32 c); bool fnMouseOn(uint32 a, uint32 b, uint32 c); bool fnMouseOff(uint32 a, uint32 b, uint32 c); bool fnFetchX(uint32 a, uint32 b, uint32 c); bool fnFetchY(uint32 a, uint32 b, uint32 c); bool fnTestList(uint32 a, uint32 b, uint32 c); bool fnFetchPlace(uint32 a, uint32 b, uint32 c); bool fnCustomJoey(uint32 a, uint32 b, uint32 c); bool fnSetPalette(uint32 a, uint32 b, uint32 c); bool fnTextModule(uint32 a, uint32 b, uint32 c); bool fnChangeName(uint32 a, uint32 b, uint32 c); bool fnMiniLoad(uint32 a, uint32 b, uint32 c); bool fnFlushBuffers(uint32 a, uint32 b, uint32 c); bool fnFlushChip(uint32 a, uint32 b, uint32 c); bool fnSaveCoods(uint32 a, uint32 b, uint32 c); bool fnPlotGrid(uint32 a, uint32 b, uint32 c); bool fnRemoveGrid(uint32 a, uint32 b, uint32 c); bool fnEyeball(uint32 a, uint32 b, uint32 c); bool fnCursorUp(uint32 a, uint32 b, uint32 c); bool fnLeaveSection(uint32 a, uint32 b, uint32 c); bool fnEnterSection(uint32 sectionNo, uint32 b, uint32 c); bool fnRestoreGame(uint32 a, uint32 b, uint32 c); bool fnRestartGame(uint32 a, uint32 b, uint32 c); bool fnNewSwingSeq(uint32 a, uint32 b, uint32 c); bool fnWaitSwingEnd(uint32 a, uint32 b, uint32 c); bool fnSkipIntroCode(uint32 a, uint32 b, uint32 c); bool fnBlankScreen(uint32 a, uint32 b, uint32 c); bool fnPrintCredit(uint32 a, uint32 b, uint32 c); bool fnLookAt(uint32 a, uint32 b, uint32 c); bool fnLincTextModule(uint32 a, uint32 b, uint32 c); bool fnTextKill2(uint32 a, uint32 b, uint32 c); bool fnSetFont(uint32 a, uint32 b, uint32 c); bool fnStartFx(uint32 a, uint32 b, uint32 c); bool fnStopFx(uint32 a, uint32 b, uint32 c); bool fnStartMusic(uint32 a, uint32 b, uint32 c); bool fnStopMusic(uint32 a, uint32 b, uint32 c); bool fnFadeDown(uint32 a, uint32 b, uint32 c); bool fnFadeUp(uint32 a, uint32 b, uint32 c); bool fnQuitToDos(uint32 a, uint32 b, uint32 c); bool fnPauseFx(uint32 a, uint32 b, uint32 c); bool fnUnPauseFx(uint32 a, uint32 b, uint32 c); bool fnPrintf(uint32 a, uint32 b, uint32 c); void stdSpeak(Compact *target, uint32 textNum, uint32 animNum, uint32 base); void fnExec(uint16 num, uint32 a, uint32 b, uint32 c); uint16 *_moduleList[16]; uint32 _stack[20]; byte _stackPtr; Compact *_compact; uint32 _objectList[30]; uint32 _currentSection; Common::RandomSource _rnd; SkyCompact *_skyCompact; Screen *_skyScreen; Disk *_skyDisk; Text *_skyText; MusicBase *_skyMusic; Sound *_skySound; AutoRoute *_skyAutoRoute; Mouse *_skyMouse; Control *_skyControl; friend class Debugger; }; } // End of namespace Sky #endif