aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/titanic/core/game_object.cpp151
-rw-r--r--engines/titanic/core/game_object.h50
-rw-r--r--engines/titanic/core/tree_item.h10
-rw-r--r--engines/titanic/support/video_surface.h2
4 files changed, 159 insertions, 54 deletions
diff --git a/engines/titanic/core/game_object.cpp b/engines/titanic/core/game_object.cpp
index 72a6e9249b..795ed92236 100644
--- a/engines/titanic/core/game_object.cpp
+++ b/engines/titanic/core/game_object.cpp
@@ -143,6 +143,70 @@ void CGameObject::load(SimpleFile *file) {
CNamedItem::load(file);
}
+void CGameObject::draw(CScreenManager *screenManager) {
+ if (!_visible)
+ return;
+ if (_credits) {
+ error("TODO: Block in CGameObject::draw");
+ }
+
+ if (_field40) {
+ if (_field90) {
+ if (_bounds.intersects(getGameManager()->_bounds))
+ warning("TODO: _field90(screenManager);");
+ }
+ }
+ else {
+ if (!_surface) {
+ if (!_resource.empty()) {
+ loadResource(_resource);
+ _resource = "";
+ }
+ }
+
+ if (_surface) {
+ _bounds.setWidth(_surface->getWidth());
+ _bounds.setHeight(_surface->getHeight());
+
+ if (!_bounds.width() || !_bounds.height())
+ return;
+
+ if (_frameNumber >= 0) {
+ loadFrame(_frameNumber);
+ _frameNumber = -1;
+ }
+
+ if (!_clipList2.empty())
+ processClipList2();
+
+ if (_bounds.intersects(getGameManager()->_bounds)) {
+ if (_surface) {
+ Point destPos(_bounds.left, _bounds.top);
+ screenManager->blitFrom(SURFACE_BACKBUFFER, _surface, &destPos);
+ }
+
+ if (_field90)
+ warning("TODO: sub_415f80(screenManager);");
+ }
+ }
+ }
+}
+
+Rect CGameObject::getBounds() const {
+ return (_surface && _surface->proc45()) ? _bounds : Rect();
+}
+
+void CGameObject::viewChange() {
+ // Handle freeing the surfaces of objects when their view is left
+ if (_surface) {
+ _resource = _surface->_resourceKey.getString();
+ _initialFrame = getMovieFrame();
+
+ delete _surface;
+ _surface = nullptr;
+ }
+}
+
void CGameObject::stopMovie() {
if (_surface)
_surface->stopMovie();
@@ -214,54 +278,6 @@ void CGameObject::draw(CScreenManager *screenManager, const Point &destPos, cons
draw(screenManager, Rect(destPos.x, destPos.y, destPos.x + 52, destPos.y + 52), srcRect);
}
-void CGameObject::draw(CScreenManager *screenManager) {
- if (!_visible)
- return;
- if (_credits) {
- error("TODO: Block in CGameObject::draw");
- }
-
- if (_field40) {
- if (_field90) {
- if (_bounds.intersects(getGameManager()->_bounds))
- warning("TODO: _field90(screenManager);");
- }
- } else {
- if (!_surface) {
- if (!_resource.empty()) {
- loadResource(_resource);
- _resource = "";
- }
- }
-
- if (_surface) {
- _bounds.setWidth(_surface->getWidth());
- _bounds.setHeight(_surface->getHeight());
-
- if (!_bounds.width() || !_bounds.height())
- return;
-
- if (_frameNumber >= 0) {
- loadFrame(_frameNumber);
- _frameNumber = -1;
- }
-
- if (!_clipList2.empty())
- processClipList2();
-
- if (_bounds.intersects(getGameManager()->_bounds)) {
- if (_surface) {
- Point destPos(_bounds.left, _bounds.top);
- screenManager->blitFrom(SURFACE_BACKBUFFER, _surface, &destPos);
- }
-
- if (_field90)
- warning("TODO: sub_415f80(screenManager);");
- }
- }
- }
-}
-
bool CGameObject::isPet() const {
return isInstanceOf(CPetControl::_type);
}
@@ -369,6 +385,10 @@ bool CGameObject::soundFn1(int handle) {
return false;
}
+void CGameObject::soundFn2(const CString &resName, int v1, int v2, int v3, int handleIndex) {
+ warning("TODO: CGameObject::soundFn2");
+}
+
void CGameObject::soundFn3(int handle, int val2, int val3) {
if (handle != 0 && handle != -1) {
CGameManager *gameManager = getGameManager();
@@ -377,6 +397,14 @@ void CGameObject::soundFn3(int handle, int val2, int val3) {
}
}
+void CGameObject::soundFn4(int v1, int v2, int v3) {
+ warning("CGameObject::soundFn4");
+}
+
+void CGameObject::soundFn5(int v1, int v2, int v3) {
+ warning("CGameObject::soundFn5");
+}
+
void CGameObject::setVisible(bool val) {
if (val != _visible) {
_visible = val;
@@ -402,6 +430,24 @@ void CGameObject::petShowCursor() {
pet->showCursor();
}
+void CGameObject::petShow() {
+ CGameManager *gameManager = getGameManager();
+ if (gameManager) {
+ gameManager->_gameState._petActive = true;
+ gameManager->_gameState.setMode(GSMODE_SELECTED);
+ gameManager->initBounds();
+ }
+}
+
+void CGameObject::petHide() {
+ CGameManager *gameManager = getGameManager();
+ if (gameManager) {
+ gameManager->_gameState._petActive = false;
+ gameManager->_gameState.setMode(GSMODE_SELECTED);
+ gameManager->initBounds();
+ }
+}
+
void CGameObject::petSetRemoteTarget() {
CPetControl *pet = getPetControl();
if (pet)
@@ -886,6 +932,11 @@ void CGameObject::petClear() const {
petControl->resetActiveNPC();
}
+CDontSaveFileItem *CGameObject::getDontSave() const {
+ CProjectItem *project = getRoot();
+ return project ? project->getDontSaveFileItem() : nullptr;
+}
+
CPetControl *CGameObject::getPetControl() const {
return static_cast<CPetControl *>(getDontSaveChild(CPetControl::_type));
}
@@ -1005,6 +1056,10 @@ int CGameObject::getClipDuration(const CString &name, int frameRate) const {
return clip ? (clip->_endFrame - clip->_startFrame) * 1000 / frameRate : 0;
}
+uint32 CGameObject::getTickCount() {
+ return g_vm->_events->getTicksCount();
+}
+
bool CGameObject::compareRoomFlags(int mode, uint flags1, uint flags2) {
switch (mode) {
case 1:
diff --git a/engines/titanic/core/game_object.h b/engines/titanic/core/game_object.h
index 4d53bd3e6e..a744cd116a 100644
--- a/engines/titanic/core/game_object.h
+++ b/engines/titanic/core/game_object.h
@@ -36,6 +36,7 @@ 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;
@@ -157,8 +158,14 @@ protected:
bool soundFn1(int handle);
+ void soundFn2(const CString &resName, int v1, int v2, int v3, int handleIndex);
+
void soundFn3(int handle, int val2, int val3);
+ void soundFn4(int v1, int v2, int v3);
+
+ void soundFn5(int v1, int v2, int v3);
+
/**
* Adds a timer
*/
@@ -290,6 +297,11 @@ protected:
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;
@@ -337,6 +349,11 @@ protected:
*/
int getClipDuration(const CString &name, int frameRate = 14) const;
+ /**
+ * Returns the current system tick count
+ */
+ uint32 getTickCount();
+
void setState1C(bool flag);
/**
@@ -410,24 +427,39 @@ public:
virtual void load(SimpleFile *file);
/**
+ * Returns the clip list, if any, associated with the item
+ */
+ virtual const CMovieClipList *getClipList() const { return &_clipList1; }
+
+ /**
* Allows the item to draw itself
*/
- void draw(CScreenManager *screenManager, const Rect &destRect, const Rect &srcRect);
+ 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 Point &destPos);
+ void draw(CScreenManager *screenManager, const Rect &destRect, const Rect &srcRect);
/**
* Allows the item to draw itself
*/
- void draw(CScreenManager *screenManager, const Point &destPos, const Rect &srcRect);
+ void draw(CScreenManager *screenManager, const Point &destPos);
/**
* Allows the item to draw itself
*/
- virtual void draw(CScreenManager *screenManager);
+ void draw(CScreenManager *screenManager, const Point &destPos, const Rect &srcRect);
/**
* Returns true if the item is the PET control
@@ -609,6 +641,11 @@ public:
int petGetRooms1D0() const;
/**
+ * Hide the PET
+ */
+ void petHide();
+
+ /**
* Hides the text cursor in the current section, if applicable
*/
void petHideCursor();
@@ -646,6 +683,11 @@ public:
void petSetRooms1D0(int val);
/**
+ * Show the PET
+ */
+ void petShow();
+
+ /**
* Shows the text cursor in the current section, if applicable
*/
void petShowCursor();
diff --git a/engines/titanic/core/tree_item.h b/engines/titanic/core/tree_item.h
index 2ea7b4249e..77d7aa59b5 100644
--- a/engines/titanic/core/tree_item.h
+++ b/engines/titanic/core/tree_item.h
@@ -29,6 +29,7 @@
namespace Titanic {
class CGameManager;
+class CMovieClipList;
class CNamedItem;
class CProjectItem;
class CScreenManager;
@@ -128,6 +129,13 @@ public:
*/
virtual int compareTo(const CString &name, int maxLen) const { return false; }
+ virtual int proc23() const { return 0; }
+
+ /**
+ * Returns the clip list, if any, associated with the item
+ */
+ virtual const CMovieClipList *getClipList() const { return nullptr; }
+
/**
* Returns true if the given item connects to another specified view
*/
@@ -141,7 +149,7 @@ public:
/**
* Gets the bounds occupied by the item
*/
- virtual Rect getBounds() { return Rect(); }
+ virtual Rect getBounds() const { return Rect(); }
/**
* Called when the view changes
diff --git a/engines/titanic/support/video_surface.h b/engines/titanic/support/video_surface.h
index 8d0dd2ffac..6f707a39ff 100644
--- a/engines/titanic/support/video_surface.h
+++ b/engines/titanic/support/video_surface.h
@@ -54,7 +54,6 @@ protected:
static int _videoSurfaceCounter;
protected:
CScreenManager *_screenManager;
- CResourceKey _resourceKey;
Graphics::ManagedSurface *_rawSurface;
bool _pendingLoad;
void *_field40;
@@ -68,6 +67,7 @@ public:
DirectDrawSurface *_ddSurface;
bool _blitFlag;
bool _blitStyleFlag;
+ CResourceKey _resourceKey;
public:
CVideoSurface(CScreenManager *screenManager);
virtual ~CVideoSurface();