aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/core/game_object.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/core/game_object.h')
-rw-r--r--engines/titanic/core/game_object.h964
1 files changed, 964 insertions, 0 deletions
diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h
new file mode 100644
index 0000000000..53e26b5f6b
--- /dev/null
+++ b/engines/titanic/core/game_object.h
@@ -0,0 +1,964 @@
+/* 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 TITANIC_GAME_OBJECT_H
+#define TITANIC_GAME_OBJECT_H
+
+#include "common/stream.h"
+#include "titanic/support/mouse_cursor.h"
+#include "titanic/support/credit_text.h"
+#include "titanic/support/movie_range_info.h"
+#include "titanic/sound/proximity.h"
+#include "titanic/support/rect.h"
+#include "titanic/support/movie_clip.h"
+#include "titanic/core/named_item.h"
+#include "titanic/pet_control/pet_section.h"
+#include "titanic/pet_control/pet_text.h"
+
+namespace Titanic {
+
+enum Find { FIND_GLOBAL = 1, FIND_ROOM = 2, FIND_PET = 4, FIND_MAILMAN = 8 };
+enum Found { FOUND_NONE = 0, FOUND_GLOBAL = 1, FOUND_ROOM = 2, FOUND_PET = 3, FOUND_MAILMAN = 4 };
+
+class CDontSaveFileItem;
+class CMailMan;
+class CMusicRoom;
+class CRoomItem;
+class CStarControl;
+class CMouseDragStartMsg;
+class CTrueTalkNPC;
+class CVideoSurface;
+class OSMovie;
+
+class CGameObject : public CNamedItem {
+ friend class OSMovie;
+ DECLARE_MESSAGE_MAP;
+private:
+ static int _soundHandles[4];
+private:
+ /**
+ * Load a visual resource for the object
+ */
+ void loadResource(const CString &name);
+
+ /**
+ * Process and remove any registered movie range info
+ */
+ void processMoveRangeInfo();
+
+ /**
+ * Merges one rect into another, and returns true if there was
+ * a common intersection
+ */
+ bool clipRect(const Rect &rect1, Rect &rect2) const;
+protected:
+ static CCreditText *_credits;
+protected:
+ double _field34;
+ double _field38;
+ double _field3C;
+ int _field40;
+ int _field44;
+ int _field48;
+ int _field4C;
+ CMovieClipList _movieClips;
+ int _initialFrame;
+ CMovieRangeInfoList _movieRangeInfoList;
+ int _frameNumber;
+ CPetText *_text;
+ uint _textBorder;
+ uint _textBorderRight;
+ int _field9C;
+ Common::Point _savedPos;
+ CVideoSurface *_surface;
+ CString _resource;
+ int _fieldB8;
+protected:
+ /**
+ * Saves the current position the object is located at
+ */
+ void savePosition();
+
+ /**
+ * Resets the object back to the previously saved starting position
+ */
+ void resetPosition();
+
+ /**
+ * Check for starting to drag the object
+ */
+ bool checkStartDragging(CMouseDragStartMsg *msg);
+
+ /**
+ * Goto a new view
+ */
+ void gotoView(const CString &viewName, const CString &clipName);
+
+ /**
+ * Parses a view into it's components of room, node, and view,
+ * and locates the designated view
+ */
+ CViewItem * parseView(const CString &viewString);
+
+ /**
+ * Loads a movie
+ */
+ void loadMovie(const CString &name, bool pendingFlag = true);
+
+ /**
+ * Loads an image
+ */
+ void loadImage(const CString &name, bool pendingFlag = true);
+
+ void inc54();
+ void dec54();
+
+ /**
+ * Locks/hides the mouse
+ */
+ void lockMouse();
+
+ /**
+ * Unlocks/shows the mouse
+ */
+ void unlockMouse();
+
+ /**
+ * Hides the mouse cursor
+ */
+ void hideMouse();
+
+ /**
+ * Shows the mouse cursor
+ */
+ void showMouse();
+
+ /**
+ * Disable the mouse
+ */
+ void disableMouse();
+
+ /**
+ * Enable the mouse
+ */
+ void enableMouse();
+
+ void mouseLockE4();
+ void mouseUnlockE4();
+
+ void mouseSaveState(int v1, int v2, int v3);
+
+ /**
+ * Lock the input handler
+ */
+ void lockInputHandler();
+
+ /**
+ * Unlock the input handler
+ */
+ void unlockInputHandler();
+
+ /**
+ * Load a sound
+ */
+ void loadSound(const CString &name);
+
+ /**
+ * Plays a sound
+ * @param resName Filename of sound to play
+ * @param volume Volume level
+ */
+ int playSound(const CString &name, uint volume = 100, int val3 = 0, bool repeated = false);
+
+ /**
+ * Plays a sound
+ * @param resName Filename of sound to play
+ * @param prox Proximity object with the sound data
+ */
+ int playSound(const CString &name, CProximity &prox);
+
+ /**
+ * Queues a sound to play after a specified one finishes
+ * @param resName Filename of sound to play
+ * @param volume Volume level
+ */
+ int queueSound(const CString &name, uint priorHandle, uint volume = 100, int val3 = 0, bool repeated = false);
+
+ /**
+ * Stop a sound
+ * @param handle Sound handle
+ * @param seconds Optional number of seconds to transition sound off
+ */
+ void stopSound(int handle, uint seconds = 0);
+
+ /**
+ * Returns true if a sound with the specified handle is active
+ */
+ bool isSoundActive(int handle) const;
+
+ /**
+ * Sets the volume for a sound
+ * @param handle Sound handle
+ * @param volume Volume percentage (0 to 100)
+ * @param seconds Number of seconds to transition to the new volume
+ */
+ void setSoundVolume(int handle, uint percent, uint seconds);
+
+ /**
+ * Plays a sound, and saves it's handle in the global sound handles list
+ * @param resName Filename of sound to play
+ * @param mode Volume mode level
+ * @param initialMute If set, sound transitions in from mute over 2 seconds
+ * @param repeated Flag for repeating sounds
+ * @param handleIndex Slot 0 to 3 in the shared sound handle list to store the sound's handle
+ */
+ void playGlobalSound(const CString &resName, int mode, bool initialMute, bool repeated, int handleIndex);
+
+ /**
+ * Stops a sound saved in the global sound handle list
+ * @param transition If set, the sound transitions to silent before stopping
+ * @param handleIndex Index of sound to stop. If -1, all global sounds are stopped
+ */
+ void stopGlobalSound(bool transition, int handleIndex);
+
+ /**
+ * Updates the volume for a global sound based on the specified mode's volume
+ * @param mode Volume level mode
+ * @param seconds Number of seconds to transition to new volume
+ * @param handleIndex Index of global sound to update. If -1, all global sounds are updated
+ */
+ void setGlobalSoundVolume(int mode, uint seconds, int handleIndex);
+
+ void sound8(bool flag) const;
+
+ /**
+ * Adds a timer
+ */
+ int addTimer(int endVal, uint firstDuration, uint repeatDuration);
+
+ /**
+ * Adds a timer
+ */
+ int addTimer(uint firstDuration, uint repeatDuration = 0);
+
+ /**
+ * Stops a timer
+ */
+ void stopTimer(int id);
+
+ /**
+ * Start an animation timer
+ */
+ int startAnimTimer(const CString &action, uint firstDuration, uint repeatDuration = 0);
+
+ /**
+ * Stop an animation timer
+ */
+ void stopAnimTimer(int id);
+
+ /**
+ * Causes the game to sleep for the specified time
+ */
+ void sleep(uint milli);
+
+ /**
+ * Get the current mouse cursor position
+ */
+ Point getMousePos() const;
+
+ /*
+ * Compares the current view's name in a Room.Node.View tuplet
+ * string form to the passed string
+ */
+ bool compareViewNameTo(const CString &name) const;
+
+ /**
+ * Compare the name of the parent room to the item to a passed string
+ */
+ int compareRoomNameTo(const CString &name);
+
+ /**
+ * Gets the first object under the system MailMan
+ */
+ CGameObject *getMailManFirstObject() const;
+
+ /**
+ * Gets the next object under the system MailMan
+ */
+ CGameObject *getMailManNextObject(CGameObject *prior) const;
+
+ /**
+ * Find mail by room flags
+ */
+ CGameObject *findMailByFlags(int mode, uint roomFlags);
+
+ /**
+ * Find next mail from a given prior one
+ */
+ CGameObject *getNextMail(CGameObject *prior);
+
+ /**
+ * Finds an object by name within the object's room
+ */
+ CGameObject *findRoomObject(const CString &name) const;
+
+ /**
+ * FInds an object under the current room
+ */
+ CGameObject *findInRoom(const CString &name);
+
+ /**
+ * Moves the object to be under the current view
+ */
+ void moveToView();
+
+ /**
+ * Moves the object to be under the specified view
+ */
+ void moveToView(const CString &name);
+
+ /**
+ * Change the view
+ */
+ bool changeView(const CString &viewName, const CString &clipName);
+
+ /**
+ * Change the view
+ */
+ bool changeView(const CString &viewName);
+
+ /**
+ * Play an arbitrary clip
+ */
+ void playClip(const CString &name, uint flags = 0);
+
+ /**
+ * Play a clip
+ */
+ void playClip(uint startFrame, uint endFrame);
+
+ /**
+ * Play a cutscene
+ */
+ void playCutscene(uint startFrame, uint endFrame);
+
+ /**
+ * Play a clip randomly from a passed list of names
+ */
+ void playRandomClip(const char *const *names, uint flags = 0);
+
+ /**
+ * Return the current view/node/room as a single string
+ */
+ CString getViewFullName() const;
+
+ /**
+ * Returns true if a clip exists in the list with a given name
+ * and starting frame number
+ */
+ bool clipExistsByStart(const CString &name, int startFrame = 0) const;
+
+ /**
+ * Returns true if a clip exists in the list with a given name
+ * and ending frame number
+ */
+ bool clipExistsByEnd(const CString &name, int endFrame = 0) const;
+
+ /**
+ * Clear the PET display
+ */
+ void petClear() const;
+
+ /**
+ * Returns the MailMan
+ */
+ CMailMan *getMailMan() const;
+
+ /**
+ * Gets the don't save container object
+ */
+ CDontSaveFileItem *getDontSave() const;
+
+ /**
+ * Returns a child of the Dont Save area of the project of the given class
+ */
+ CTreeItem *getDontSaveChild(ClassDef *classDef) const;
+
+ /**
+ * Returns the special hidden room container
+ */
+ CRoomItem *getHiddenRoom() const;
+
+ /**
+ * Locates a room with the given name
+ */
+ CRoomItem *locateRoom(const CString &name) const;
+
+ /**
+ * Scan the specified room for an item by name
+ */
+ CTreeItem *findUnder(CTreeItem *parent, const CString &name) const;
+
+ /**
+ * Finds a room by name
+ */
+ CRoomItem *findRoomByName(const CString &name);
+
+ /**
+ * Returns the music room instance from the game manager
+ */
+ CMusicRoom *getMusicRoom() const;
+
+ /**
+ * Set's the player's passenger class
+ */
+ void setPassengerClass(int newClass);
+
+ /**
+ * Overrides whether the object's movie has audio timing
+ */
+ void movieSetAudioTiming(bool flag);
+
+ void fn10(int v1, int v2, int v3);
+
+ /**
+ * Gets the duration of a specified clip in milliseconds
+ */
+ int getClipDuration(const CString &name, int frameRate = 14) const;
+
+ /**
+ * Returns the current system tick count
+ */
+ uint32 getTicksCount();
+
+ /**
+ * Gets a resource from the DAT file
+ */
+ Common::SeekableReadStream *getResource(const CString &name);
+
+ /**
+ * Returns true if a mail with a specified Id exists
+ */
+ bool mailExists(int id) const;
+
+ /**
+ * Returns a specified mail, if one exists
+ */
+ CGameObject *findMail(int id) const;
+
+ /**
+ * Resets the Mail Man value
+ */
+ void resetMail();
+
+ /**
+ * Locks the PET, disabling all input. Can be called multiple times
+ */
+ void petLockInput();
+
+ /**
+ * Unlocks PET input
+ */
+ void petUnlockInput();
+
+ /**
+ * Flag to quit the game
+ */
+ void quitGame();
+
+ /**
+ * Set the frame rate for the currently loaded movie
+ */
+ void setMovieFrameRate(double rate);
+
+ /**
+ * Set up the text and borders for the object
+ */
+ void setText(const CString &str, int border = 0, int borderRight = 0);
+
+ /**
+ * Sets whether the text will use borders
+ */
+ void setTextHasBorders(bool hasBorders);
+
+ /**
+ * Sets the bounds for a previously defined text area
+ */
+ void setTextBounds();
+
+ /**
+ * Sets the color for the object's text
+ */
+ void setTextColor(byte r, byte g, byte b);
+
+ /**
+ * Sets the font number to use for text
+ */
+ void setTextFontNumber(int fontNumber);
+
+ /**
+ * Gets the width of the text contents
+ */
+ int getTextWidth() const;
+
+ /**
+ * Returns the text cursor
+ */
+ CTextCursor *getTextCursor() const;
+
+ /**
+ * Scroll text up
+ */
+ void scrollTextUp();
+
+ /**
+ * Scroll text down
+ */
+ void scrollTextDown();
+
+ /**
+ * Gets a new random number
+ */
+ int getRandomNumber(int max, int *oldVal = nullptr);
+public:
+ Rect _bounds;
+ bool _isMail;
+ int _id;
+ uint _roomFlags;
+ int _field60;
+ CursorId _cursorId;
+ bool _visible;
+public:
+ /**
+ * Initializes statics
+ */
+ static void init();
+
+ /**
+ * Deinitializes statics
+ */
+ static void deinit();
+public:
+ CLASSDEF;
+ CGameObject();
+ ~CGameObject();
+
+ /**
+ * Save the data for the class to file
+ */
+ virtual void save(SimpleFile *file, int indent);
+
+ /**
+ * Load the data for the class from file
+ */
+ virtual void load(SimpleFile *file);
+
+ /**
+ * Returns the clip list, if any, associated with the item
+ */
+ virtual const CMovieClipList *getMovieClips() const { return &_movieClips; }
+
+ /**
+ * Allows the item to draw itself
+ */
+ virtual void draw(CScreenManager *screenManager);
+
+ /**
+ * Gets the bounds occupied by the item
+ */
+ virtual Rect getBounds() const;
+
+ /**
+ * Called when the view changes
+ */
+ virtual void viewChange();
+
+ /**
+ * Allows the item to draw itself
+ */
+ void draw(CScreenManager *screenManager, const Rect &destRect, const Rect &srcRect);
+
+ /**
+ * Allows the item to draw itself
+ */
+ void draw(CScreenManager *screenManager, const Point &destPos);
+
+ /**
+ * Allows the item to draw itself
+ */
+ void draw(CScreenManager *screenManager, const Point &destPos, const Rect &srcRect);
+
+ /**
+ * Returns true if the item is the PET control
+ */
+ virtual bool isPet() const;
+
+ /**
+ * Checks the passed point is validly in the object,
+ * with extra checking of object flags status
+ */
+ bool checkPoint(const Point &pt, bool ignore40 = false, bool visibleOnly = false);
+
+ /**
+ * Set the position of the object
+ */
+ void setPosition(const Point &newPos);
+
+ /**
+ * Get the centre of the game object's bounds
+ */
+ Point getControid() const;
+
+ /**
+ * Change the object's status
+ */
+ void playMovie(uint flags);
+
+ /**
+ * Play the movie specified in _resource
+ */
+ void playMovie(int startFrame, int endFrame, uint flags);
+
+ /**
+ * Play the movie specified in _resource
+ */
+ void playMovie(int startFrame, int endFrame, int initialFrame, uint flags);
+
+ /**
+ * Returns true if the object has a currently active movie
+ */
+ bool hasActiveMovie() const;
+
+ /**
+ * Stops any movie currently playing for the object
+ */
+ void stopMovie();
+
+ /**
+ * Get the current movie frame
+ */
+ int getMovieFrame() const;
+
+ /**
+ * Returns the object's frame number
+ */
+ int getFrameNumber() const { return _frameNumber; }
+
+ /**
+ * Loads a frame
+ */
+ void loadFrame(int frameNumber);
+
+ /**
+ * Load the surface
+ */
+ void loadSurface();
+
+ /**
+ * Marks the area occupied by the object as dirty, requiring re-rendering
+ */
+ void makeDirty();
+
+ /**
+ * Marks the area in the passed rect as dirty, and requiring re-rendering
+ */
+ void makeDirty(const Rect &r);
+
+ /**
+ * Sets whether the object is visible
+ */
+ void setVisible(bool val);
+
+ /**
+ * Return the player's passenger class
+ */
+ int getPassengerClass() const;
+
+ /**
+ * Return the player's previous passenger class
+ */
+ int getPriorClass() const;
+
+ /**
+ * Sets the mail identifier for an object
+ */
+ void setMailId(int mailId);
+
+ /**
+ * Returns true if there's an attached surface which has a frame
+ * ready for display
+ */
+ bool surfaceHasFrame() const;
+
+ /**
+ * Finds an item in various system areas
+ */
+ Found find(const CString &name, CGameObject **item, int findAreas);
+
+ /**
+ * Returns a hidden object
+ */
+ CGameObject *getHiddenObject(const CString &name) const;
+
+ /**
+ * Sets up credits text
+ */
+ void createCredits();
+
+ /**
+ * Support function for drag moving
+ */
+ void dragMove(const Point &pt);
+
+ /**
+ * Returns the currently dragging item (if any) if it's a game object
+ */
+ CGameObject *getDraggingObject() const;
+
+ bool compareRoomFlags(int mode, uint flags1, uint flags2);
+
+ /*--- CGameManager Methods ---*/
+
+ /**
+ * Return the current room
+ */
+ CRoomItem *getRoom() const;
+
+ /**
+ * Return the current node
+ */
+ CNodeItem *getNode() const;
+
+ /**
+ * Return the current room
+ */
+ CViewItem *getView() const;
+
+ /**
+ * Get the current room name
+ */
+ CString getRoomName() const;
+
+ /**
+ * Get the current node and room in the form "room.node"
+ */
+ CString getRoomNodeName() const;
+
+ /**
+ * Adds an object to the mail list
+ */
+ void addMail(int mailId);
+
+ /**
+ * Remove an object from the mail list
+ */
+ void removeMail(int id, int v);
+
+ /**
+ * Return the full Id of the current view in a
+ * room.node.view tuplet form
+ */
+ CString getFullViewName();
+
+ /*--- CPetControl Methods ---*/
+
+ /**
+ * Returns the PET control
+ */
+ CPetControl *getPetControl() const;
+
+ /**
+ * Moves a specified item to the carry parcel
+ */
+ void petAddToCarryParcel(CGameObject *obj);
+
+ /**
+ * Add the item to the inventory
+ */
+ void petAddToInventory();
+
+ CTreeItem *petContainerRemove(CGameObject *obj);
+
+ bool petCheckNode(const CString &name);
+
+ /**
+ * Dismiss a bot
+ */
+ bool petDismissBot(const CString &name);
+
+ /**
+ * Is Doorbot or Bellbot present in the current view
+ */
+ bool petDoorOrBellbotPresent() const;
+
+ /**
+ * Display a message in the PET
+ */
+ void petDisplayMessage(int unused, const CString &msg);
+
+ /**
+ * Display a message in the PET
+ */
+ void petDisplayMessage(const CString &msg);
+
+ /**
+ * Gets the entry number used when last arriving at the well
+ */
+ int petGetRoomsWellEntry() const;
+
+ /**
+ * Hide the PET
+ */
+ void petHide();
+
+ /**
+ * Hides the text cursor in the current section, if applicable
+ */
+ void petHideCursor();
+
+ /**
+ * Highlights a glyph in the currently active PET section
+ */
+ void petHighlightGlyph(int id);
+
+ /**
+ * Called when the status of an item in the inventory has changed
+ */
+ void petInvChange();
+
+ /**
+ * Moves the item from it's original position to be under the hidden room
+ */
+ void petMoveToHiddenRoom();
+
+ /**
+ * Gives the player a new assigned room in the specified passenger class
+ */
+ void petReassignRoom(int passClassNum);
+
+ /**
+ * Sets a new area in the PET
+ */
+ void petSetArea(PetArea newArea) const;
+
+ /**
+ * Set the remote target in the PET to this object
+ */
+ void petSetRemoteTarget();
+
+ /**
+ * Sets the entry number for arriving at the well
+ */
+ void petSetRoomsWellEntry(int entryNum);
+
+ void petSetRooms1D4(int v);
+
+
+ /**
+ * Show the PET
+ */
+ void petShow();
+
+ /**
+ * Shows the text cursor in the current section, if applicable
+ */
+ void petShowCursor();
+
+ /**
+ * Summon a bot
+ */
+ void petOnSummonBot(const CString &name, int val);
+
+ /*--- CStarControl Methods ---*/
+
+ /**
+ * Returns the star control
+ */
+ CStarControl *getStarControl() const;
+
+ void starFn1(int v);
+ bool starFn2();
+
+ /*--- CTrueTalkManager Methods ---*/
+
+ /**
+ * Stop a conversation with the NPC
+ */
+ void endTalking(CTrueTalkNPC *npc, bool viewFlag, CViewItem *view = nullptr);
+
+ /**
+ * Start a conversation with the NPC
+ */
+ void startTalking(CTrueTalkNPC *npc, uint id, CViewItem *view = nullptr);
+
+ /**
+ * Start a conversation with the NPC
+ */
+ void startTalking(const CString &name, uint id, CViewItem *view = nullptr);
+
+ /**
+ * Sets a dial region for a given NPC
+ */
+ void talkSetDialRegion(const CString &name, int dialNum, int regionNum);
+
+ /**
+ * Gets a dial region for a given NPC
+ */
+ int talkGetDialRegion(const CString &name, int dialNum);
+
+ /*--- CVideoSurface Methods ---*/
+
+ /**
+ * Signal a movie event for the given frame
+ */
+ void movieEvent(int frameNumber);
+
+ /**
+ * Signal a movie event at the end of all currently
+ * playing ranges
+ */
+ void movieEvent();
+
+ /*--- CGameState Methods ---*/
+
+ void setState1C(bool flag);
+ void stateInc14();
+ int stateGet14() const;
+ void stateSet24();
+ int stateGet24() const;
+ void stateInc38();
+ int stateGet38() const;
+
+ /**
+ * Gets the game state node changed counter
+ */
+ uint getNodeChangedCtr() const;
+
+ /**
+ * Gets the game state node enter ticks
+ */
+ uint getNodeEnterTicks() const;
+};
+
+} // End of namespace Titanic
+
+#endif /* TITANIC_GAME_OBJECT_H */