diff options
Diffstat (limited to 'engines/queen/logic.h')
-rw-r--r-- | engines/queen/logic.h | 410 |
1 files changed, 410 insertions, 0 deletions
diff --git a/engines/queen/logic.h b/engines/queen/logic.h new file mode 100644 index 0000000000..f1f93de17e --- /dev/null +++ b/engines/queen/logic.h @@ -0,0 +1,410 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2003-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 QUEENLOGIC_H +#define QUEENLOGIC_H + +#include "common/str.h" +#include "common/util.h" +#include "queen/structs.h" + +namespace Queen { + +enum RoomDisplayMode { + RDM_FADE_NOJOE = 0, // fade in, hide Joe + RDM_FADE_JOE = 1, // fade in, display Joe + RDM_NOFADE_JOE = 2, // screen does not dissolve into view + RDM_FADE_JOE_XY = 3 // display Joe at the current X, Y coords +}; + +enum JoeWalkMode { + JWM_NORMAL = 0, + JWM_MOVE = 1, + JWM_EXECUTE = 2, + JWM_SPEAK = 3 +}; + +class Credits; +class Journal; +class LineReader; +class QueenEngine; + +class Logic { + +public: + Logic(QueenEngine *vm); + virtual ~Logic(); + + uint16 currentRoom() const { return _currentRoom; } + void currentRoom(uint16 room) { + assert(room >= 1 && room <= _numRooms); + _currentRoom = room; + } + + uint16 oldRoom() const { return _oldRoom; } + void oldRoom(uint16 room) { + assert(room <= _numRooms); + _oldRoom = room; + } + + uint16 newRoom() const { return _newRoom; } + void newRoom(uint16 room) { + assert(room <= _numRooms); + _newRoom = room; + } + + ObjectData *objectData(int index) const; + uint16 roomData(int room) const { return _roomData[room]; } + GraphicData *graphicData(int index) const { return &_graphicData[index]; } + ItemData *itemData(int index) const { return &_itemData[index]; } + uint16 itemDataCount() const { return _numItems; } + + uint16 findBob(uint16 obj) const; + uint16 findFrame(uint16 obj) const; + uint16 objectForPerson(uint16 bobnum) const; + WalkOffData *walkOffPointForObject(int16 obj) const; + + uint16 walkOffCount() const { return _numWalkOffs; } + WalkOffData *walkOffData(int index) const { return &_walkOffData[index]; } + uint16 currentRoomData() const { return _roomData[_currentRoom]; } + GraphicAnim *graphicAnim(int index) const { return &_graphicAnim[index]; } + uint16 graphicAnimCount() const { return _numGraphicAnim; } + ObjectDescription *objectDescription(uint16 objNum) const { return &_objectDescription[objNum]; } + uint16 objectDescriptionCount() const { return _numObjDesc; } + uint16 currentRoomSfx() const { return _sfxName[_currentRoom]; } + + uint16 joeFacing() const { return _joe.facing; } + uint16 joeX() const { return _joe.x; } + uint16 joeY() const { return _joe.y; } + JoeWalkMode joeWalk() const { return _joe.walk; } + uint16 joeScale() const { return _joe.scale; } + uint16 joeCutFacing() const { return _joe.cutFacing; } + uint16 joePrevFacing() const { return _joe.prevFacing; } + + void joeFacing(uint16 dir) { _joe.facing = dir; } + void joePos(uint16 x, uint16 y) { _joe.x = x; _joe.y = y; } + void joeWalk(JoeWalkMode walking); + void joeScale(uint16 scale) { _joe.scale = scale; } + void joeCutFacing(uint16 dir) { _joe.cutFacing = dir; } + void joePrevFacing(uint16 dir) { _joe.prevFacing = dir; } + + int16 gameState(int index) const; + void gameState(int index, int16 newValue); + + TalkSelected *talkSelected(int index) { return &_talkSelected[index]; } + + const char *roomName(uint16 roomNum) const; + const char *objectName(uint16 objNum) const; + const char *objectTextualDescription(uint16 objNum) const; + const char *joeResponse(int i) const; + const char *verbName(Verb v) const; + + void eraseRoom(); + void setupRoom(const char *room, int comPanel, bool inCutaway); + void displayRoom(uint16 room, RoomDisplayMode mode, uint16 joeScale, int comPanel, bool inCutaway); + + int16 entryObj() const { return _entryObj; } + void entryObj(int16 obj) { _entryObj = obj; } + + ActorData *findActor(uint16 noun, const char *name = NULL) const; + bool initPerson(uint16 noun, const char *actorName, bool loadBank, Person *pp); + uint16 findPersonNumber(uint16 obj, uint16 room) const; + + //! load banks used for Joe animation + void loadJoeBanks(const char *animBank, const char *standBank); + + //! load the various bobs needed to animate Joe + void setupJoe(); + + //! setup Joe at the right place when entering a room + void setupJoeInRoom(bool autoPosition, uint16 scale); + + uint16 joeFace(); + void joeGrab(int16 grabState); + + //! change Joe clothes to dress + void joeUseDress(bool showCut); + + //! restore Joe clothes + void joeUseClothes(bool showCut); + + //! change Joe clothes to underwear + void joeUseUnderwear(); + + void makeJoeSpeak(uint16 descNum, bool objectType = false); + void makePersonSpeak(const char *sentence, Person *person, const char *voiceFilePrefix); + + //! start the specified dialogue + void startDialogue(const char *dlgFile, int personInRoom, char *cutaway); + + //! play the specified cutaway + void playCutaway(const char *cutFile, char *next = NULL); + + //! initialize the inventory + void inventorySetup(); + + //! get the inventory item for the specified inventory slot + uint16 findInventoryItem(int invSlot) const; + + //! refresh inventory contents + void inventoryRefresh(); + int16 previousInventoryItem(int16 first) const; + int16 nextInventoryItem(int16 first) const; + void removeDuplicateItems(); + uint16 numItemsInventory() const; + void inventoryInsertItem(uint16 itemNum, bool refresh = true); + void inventoryDeleteItem(uint16 itemNum, bool refresh = true); + void inventoryScroll(uint16 count, bool up); + void removeHotelItemsFromInventory(); + + //! copy data from dummy object to object + void objectCopy(int dummyObjectIndex, int objectIndex); + + //! handle a particular event when Joe walks on this area + void handleSpecialArea(Direction facing, uint16 areaNum, uint16 walkDataNum); + + //! handle the pinnacle room (== room chooser in the jungle) + void handlePinnacleRoom(); + + void update(); + + void saveState(byte *&ptr); + void loadState(uint32 ver, byte *&ptr); + + //! called after a save state has been loaded + void setupRestoredGame(); + + //! ugly hack from original code + void sceneReset() { _scene = 0; } + + //! make a scene + void sceneStart(); + + //! stop making a scene + void sceneStop(); + + void changeRoom(); + + //! enter the Journal (save/load, configuration) + virtual void useJournal() = 0; + + //! execute a special move + void executeSpecialMove(uint16 sm); + + void startCredits(const char *filename); + void stopCredits(); + + void start(); + + enum { + JOE_RESPONSE_MAX = 40, + DEFAULT_TALK_SPEED = 7 * 3, + GAME_STATE_COUNT = 211, + TALK_SELECTED_COUNT = 86 + }; + +protected: + + void initialise(); + + void asmMakeJoeUseDress(); + void asmMakeJoeUseNormalClothes(); + void asmMakeJoeUseUnderwear(); + void asmSwitchToDressPalette(); + void asmSwitchToNormalPalette(); + void asmStartCarAnimation(); + void asmStopCarAnimation(); + void asmStartFightAnimation(); + void asmWaitForFrankPosition(); + void asmMakeFrankGrowing(); + void asmMakeRobotGrowing(); + void asmShrinkRobot(); + void asmEndGame(); + void asmPutCameraOnDino(); + void asmPutCameraOnJoe(); + void asmAltIntroPanRight(); + void asmAltIntroPanLeft(); + void asmSetAzuraInLove(); + void asmPanRightFromJoe(); + void asmSetLightsOff(); + void asmSetLightsOn(); + void asmSetManequinAreaOn(); + void asmPanToJoe(); + void asmTurnGuardOn(); + void asmPanLeft320To144(); + void asmSmooch(); + void asmMakeLightningHitPlane(); + void asmScaleBlimp(); + void asmScaleEnding(); + void asmWaitForCarPosition(); + void asmShakeScreen(); + void asmAttemptPuzzle(); + void asmScaleTitle(); + void asmPanRightToHugh(); + void asmMakeWhiteFlash(); + void asmPanRightToJoeAndRita(); + void asmPanLeftToBomb(); + void asmEndDemo(); + void asmInterviewIntro(); + void asmEndInterview(); + + virtual bool preChangeRoom() = 0; + virtual bool handleSpecialMove(uint16 sm) = 0; + + + uint16 _currentRoom; + uint16 _oldRoom; + uint16 _newRoom; + + //! total number of room in game + uint16 _numRooms; + + //! first object number in room + uint16 *_roomData; + + //! background music to play in room + uint16 *_sfxName; + + //! bounding box of object + Box *_objectBox; + + //! inventory items + ItemData *_itemData; + uint16 _numItems; + + GraphicData *_graphicData; + uint16 _numGraphics; + + ObjectData *_objectData; + uint16 _numObjects; + + ObjectDescription *_objectDescription; + uint16 _numObjDesc; + + ActorData *_actorData; + uint16 _numActors; + + //! walk off point for an object + WalkOffData *_walkOffData; + uint16 _numWalkOffs; + + FurnitureData *_furnitureData; + uint16 _numFurniture; + + GraphicAnim *_graphicAnim; + uint16 _numGraphicAnim; + + //! actor initial position in room is _walkOffData[_entryObj] + int16 _entryObj; + + //! object description (Look At) + Common::StringList _objDescription; + uint16 _numDescriptions; + + Common::StringList _objName; + uint16 _numNames; + + //! room name, prefix for data files (PCX, LUM...) + Common::StringList _roomName; + + Common::StringList _verbName; + + Common::StringList _joeResponse; + + //! actor animation strings + Common::StringList _aAnim; + uint16 _numAAnim; + + //! actor names + Common::StringList _aName; + uint16 _numAName; + + //! actor filenames + Common::StringList _aFile; + uint16 _numAFile; + + struct { + uint16 x, y; + uint16 facing, cutFacing, prevFacing; + JoeWalkMode walk; + uint16 scale; + } _joe; + + int16 _gameState[GAME_STATE_COUNT]; + + TalkSelected _talkSelected[TALK_SELECTED_COUNT]; + + //! inventory items + int16 _inventoryItem[4]; + + //! puzzle counter for room T7 + uint8 _puzzleAttemptCount; + + //! cutscene counter + int _scene; + + Credits *_credits; + Journal *_journal; + + QueenEngine *_vm; +}; + +class LogicDemo : public Logic { +public: + + LogicDemo(QueenEngine *vm) : Logic(vm) {} + void useJournal(); + +protected: + + bool preChangeRoom(); + bool handleSpecialMove(uint16 sm); +}; + +class LogicInterview : public Logic { +public: + + LogicInterview(QueenEngine *vm) : Logic(vm) {} + void useJournal(); + +protected: + + bool preChangeRoom(); + bool handleSpecialMove(uint16 sm); +}; + +class LogicGame : public Logic { +public: + + LogicGame(QueenEngine *vm) : Logic(vm) {} + void useJournal(); + +protected: + + bool preChangeRoom(); + bool handleSpecialMove(uint16 sm); +}; + + +} // End of namespace Queen + +#endif |