From 9080781b08830449e3f762ab45924a15446435ef Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 27 Feb 2016 23:22:38 -0500 Subject: TITANIC: Add mouse events, cleanup of existing events --- engines/titanic/messages/messages.cpp | 87 +++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 engines/titanic/messages/messages.cpp (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp new file mode 100644 index 0000000000..f60ad12cd7 --- /dev/null +++ b/engines/titanic/messages/messages.cpp @@ -0,0 +1,87 @@ +/* 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. + * + */ + +#include "titanic/messages/messages.h" +#include "titanic/core/game_object.h" + +namespace Titanic { + +CMessage::CMessage() : CSaveableObject() { +} + +void CMessage::save(SimpleFile *file, int indent) const { + file->writeNumberLine(0, indent); +} + +void CMessage::load(SimpleFile *file) { + file->readNumber(); + CSaveableObject::load(file); +} + +/*------------------------------------------------------------------------*/ + +CAutoSoundEvent::CAutoSoundEvent() : CGameObject(), _fieldBC(-1), _fieldC0(0xFFFFFF) { +} + +void CAutoSoundEvent::save(SimpleFile *file, int indent) const { + file->writeNumberLine(1, indent); + file->writeNumberLine(_fieldBC, indent); + file->writeNumberLine(_fieldC0, indent); + + CGameObject::save(file, indent); +} + +void CAutoSoundEvent::load(SimpleFile *file) { + file->readNumber(); + _fieldBC = file->readNumber(); + _fieldC0 = file->readNumber(); + + CGameObject::load(file); +} + +/*------------------------------------------------------------------------*/ + +CDoorAutoSoundEvent::CDoorAutoSoundEvent() : CAutoSoundEvent(), +_string1("z#44.wav"), _string2("z#43.wav"), _fieldDC(25), _fieldE0(25) { +} + +void CDoorAutoSoundEvent::save(SimpleFile *file, int indent) const { + file->writeNumberLine(1, indent); + file->writeQuotedLine(_string1, indent); + file->writeQuotedLine(_string2, indent); + file->writeNumberLine(_fieldDC, indent); + file->writeNumberLine(_fieldE0, indent); + + CAutoSoundEvent::save(file, indent); +} + +void CDoorAutoSoundEvent::load(SimpleFile *file) { + file->readNumber(); + _string1 = file->readString(); + _string2 = file->readString(); + _fieldDC = file->readNumber(); + _fieldE0 = file->readNumber(); + + CAutoSoundEvent::load(file); +} + +} // End of namespace Titanic -- cgit v1.2.3 From 5dce31417cd257785b9bbc790a9686e64a4aff37 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 2 Mar 2016 19:21:31 -0500 Subject: TITANIC: More saveable classes implemented --- engines/titanic/messages/messages.cpp | 47 ----------------------------------- 1 file changed, 47 deletions(-) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index f60ad12cd7..c2a6197d4a 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -37,51 +37,4 @@ void CMessage::load(SimpleFile *file) { CSaveableObject::load(file); } -/*------------------------------------------------------------------------*/ - -CAutoSoundEvent::CAutoSoundEvent() : CGameObject(), _fieldBC(-1), _fieldC0(0xFFFFFF) { -} - -void CAutoSoundEvent::save(SimpleFile *file, int indent) const { - file->writeNumberLine(1, indent); - file->writeNumberLine(_fieldBC, indent); - file->writeNumberLine(_fieldC0, indent); - - CGameObject::save(file, indent); -} - -void CAutoSoundEvent::load(SimpleFile *file) { - file->readNumber(); - _fieldBC = file->readNumber(); - _fieldC0 = file->readNumber(); - - CGameObject::load(file); -} - -/*------------------------------------------------------------------------*/ - -CDoorAutoSoundEvent::CDoorAutoSoundEvent() : CAutoSoundEvent(), -_string1("z#44.wav"), _string2("z#43.wav"), _fieldDC(25), _fieldE0(25) { -} - -void CDoorAutoSoundEvent::save(SimpleFile *file, int indent) const { - file->writeNumberLine(1, indent); - file->writeQuotedLine(_string1, indent); - file->writeQuotedLine(_string2, indent); - file->writeNumberLine(_fieldDC, indent); - file->writeNumberLine(_fieldE0, indent); - - CAutoSoundEvent::save(file, indent); -} - -void CDoorAutoSoundEvent::load(SimpleFile *file) { - file->readNumber(); - _string1 = file->readString(); - _string2 = file->readString(); - _fieldDC = file->readNumber(); - _fieldE0 = file->readNumber(); - - CAutoSoundEvent::load(file); -} - } // End of namespace Titanic -- cgit v1.2.3 From fbcd4de457cfa18d121158e6be45ade57a3428f1 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 6 Mar 2016 22:57:45 -0500 Subject: TITANIC: Overall message handling method --- engines/titanic/messages/messages.cpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index c2a6197d4a..f9648f9dfb 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -22,6 +22,7 @@ #include "titanic/messages/messages.h" #include "titanic/core/game_object.h" +#include "titanic/core/tree_item.h" namespace Titanic { @@ -37,4 +38,32 @@ void CMessage::load(SimpleFile *file) { CSaveableObject::load(file); } +bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) { + // If no target was specified, then there's nothing to do + if (!target) + return false; + + bool result = false; + CTreeItem *item = target; + CTreeItem *nextItem = nullptr; + do { + if (flags & MSGFLAG_SCAN) + nextItem = item->scan(target); + + if (!(flags & MSGFLAG_CLASS_DEF) || item->isInstanceOf(*classDef)) { + bool handled = true; // item->handleEvent(this); + + if (handled) { + result = true; + if (flags & MSGFLAG_BREAK_IF_HANDLED) + return true; + } + } + + item = nextItem; + } while (nextItem); + + return result; +} + } // End of namespace Titanic -- cgit v1.2.3 From 3103c9aaa9d14a5f6ad360eab2637c0be3141428 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Mon, 7 Mar 2016 08:11:06 -0500 Subject: TITANIC: Implemented message target classes --- engines/titanic/messages/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index f9648f9dfb..1f7a5a07d4 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -51,7 +51,7 @@ bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) { nextItem = item->scan(target); if (!(flags & MSGFLAG_CLASS_DEF) || item->isInstanceOf(*classDef)) { - bool handled = true; // item->handleEvent(this); + bool handled = perform(item); if (handled) { result = true; -- cgit v1.2.3 From bad72e2ae491cb99843f3af971725231e3defb2e Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sat, 12 Mar 2016 19:23:00 -0500 Subject: TITANIC: Implement various post-load methods --- engines/titanic/messages/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index 1f7a5a07d4..1e49994915 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -50,7 +50,7 @@ bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) { if (flags & MSGFLAG_SCAN) nextItem = item->scan(target); - if (!(flags & MSGFLAG_CLASS_DEF) || item->isInstanceOf(*classDef)) { + if (!(flags & MSGFLAG_CLASS_DEF) || item->isInstanceOf(classDef)) { bool handled = perform(item); if (handled) { -- cgit v1.2.3 From a8d94d448ea977bdd5b1171e177de6dd714792a2 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 17 Mar 2016 19:58:59 -0400 Subject: TITANIC: Fixes to make message handling const, adding CEnterRoomMsg handlers --- engines/titanic/messages/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index 1e49994915..00debc562c 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -38,7 +38,7 @@ void CMessage::load(SimpleFile *file) { CSaveableObject::load(file); } -bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) { +bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) const { // If no target was specified, then there's nothing to do if (!target) return false; -- cgit v1.2.3 From 9565fbaeac8f48ea0090ebbd751a18eacc6d1230 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Fri, 18 Mar 2016 21:34:04 -0400 Subject: TITANIC: Implement input translator event methods --- engines/titanic/messages/messages.cpp | 57 +++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index 00debc562c..b44748d899 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -21,6 +21,7 @@ */ #include "titanic/messages/messages.h" +#include "titanic/messages/mouse_messages.h" #include "titanic/core/game_object.h" #include "titanic/core/tree_item.h" @@ -66,4 +67,60 @@ bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) c return result; } +bool CMessage::isMouseMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isButtonDownMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isButtonUpMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isMouseMoveMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isDoubleClickMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isEnterRoomMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isPreEnterRoomMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isleaveRoomMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isEnterNodeMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isPreEnterNodeMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isLeaveNodeMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isEnterViewMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isPreEnterViewMsg() const { + return dynamic_cast(this) != nullptr; +} + +bool CMessage::isLeaveViewMsg() const { + return dynamic_cast(this) != nullptr; +} + } // End of namespace Titanic -- cgit v1.2.3 From 7d2d624908e9265be108d650a161a378add9d40d Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 23 Mar 2016 20:51:42 -0400 Subject: TITANIC: More view event handling, beginnings of mouse cursor loading --- engines/titanic/messages/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index b44748d899..9202305353 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -84,7 +84,7 @@ bool CMessage::isMouseMoveMsg() const { } bool CMessage::isDoubleClickMsg() const { - return dynamic_cast(this) != nullptr; + return dynamic_cast(this) != nullptr; } bool CMessage::isEnterRoomMsg() const { -- cgit v1.2.3 From 66e198d665a8aacd1724848a40e6533f3d5cfebc Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 24 Mar 2016 07:49:59 -0400 Subject: TITANIC: Cleanup and fixes for message hierarchy --- engines/titanic/messages/messages.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index 9202305353..28b8856578 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -39,7 +39,7 @@ void CMessage::load(SimpleFile *file) { CSaveableObject::load(file); } -bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) const { +bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) { // If no target was specified, then there's nothing to do if (!target) return false; @@ -51,7 +51,7 @@ bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) c if (flags & MSGFLAG_SCAN) nextItem = item->scan(target); - if (!(flags & MSGFLAG_CLASS_DEF) || item->isInstanceOf(classDef)) { + if (!classDef || item->isInstanceOf(classDef)) { bool handled = perform(item); if (handled) { -- cgit v1.2.3 From c948e8812ebb619f22adb7794da6dcfb6d5d6b9e Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 24 Mar 2016 21:02:25 -0400 Subject: TITANIC: Support methods needed by CTelevision --- engines/titanic/messages/messages.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index 28b8856578..1c3d406b1b 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -24,6 +24,7 @@ #include "titanic/messages/mouse_messages.h" #include "titanic/core/game_object.h" #include "titanic/core/tree_item.h" +#include "titanic/titanic.h" namespace Titanic { @@ -67,6 +68,17 @@ bool CMessage::execute(CTreeItem *target, const ClassDef *classDef, int flags) { return result; } +bool CMessage::execute(const CString &target, const ClassDef *classDef, int flags) { + // Scan for the target by name + CProjectItem *project = g_vm->_window->_project; + for (CTreeItem *treeItem = project; treeItem; treeItem = treeItem->scan(project)) { + if (treeItem->getName().compareToIgnoreCase(target)) + return execute(treeItem, classDef, flags); + } + + return false; +} + bool CMessage::isMouseMsg() const { return dynamic_cast(this) != nullptr; } -- cgit v1.2.3 From 51dc36a9a52f95815b4b1109b080d070247bf247 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 6 Apr 2016 23:28:42 -0400 Subject: TITANIC: Furhter in-progress message handling conversion --- engines/titanic/messages/messages.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index 1c3d406b1b..9f46fef6ca 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -23,6 +23,7 @@ #include "titanic/messages/messages.h" #include "titanic/messages/mouse_messages.h" #include "titanic/core/game_object.h" +#include "titanic/core/message_target.h" #include "titanic/core/tree_item.h" #include "titanic/titanic.h" @@ -79,6 +80,33 @@ bool CMessage::execute(const CString &target, const ClassDef *classDef, int flag return false; } +const MSGMAP_ENTRY *CMessage::findMapEntry(const CTreeItem *treeItem, const ClassDef *classDef) { + // Iterate through the class and any parent classes + for (const MSGMAP *msgMap = treeItem->getMessageMap(); msgMap->pFnGetBaseMap; + msgMap = msgMap->pFnGetBaseMap()) { + // Iterate through the map entries for this class + for (const MSGMAP_ENTRY *entry = msgMap->lpEntries; + entry->_class != nullptr; ++entry) { + // Check if the class or any of it's ancesotrs is handled by this entry + for (const ClassDef *entryDef = entry->_class; entryDef; entryDef = entryDef->_parent) { + if (entryDef == classDef) + return entry; + } + } + } + + return nullptr; +} + +bool CMessage::perform(CTreeItem *treeItem) { + const MSGMAP_ENTRY *entry = findMapEntry(treeItem, getType()); + return entry && (*treeItem.*(entry->_fn))(this); +} + +bool CMessage::supports(const CTreeItem *treeItem, ClassDef *classDef) { + return findMapEntry(treeItem, classDef) != nullptr; +} + bool CMessage::isMouseMsg() const { return dynamic_cast(this) != nullptr; } -- cgit v1.2.3 From b9ad4ff7277505054b0de88b78e0034a462a026b Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Sun, 29 May 2016 09:33:03 -0400 Subject: TITANIC: Fix dispatching messages by target name --- engines/titanic/messages/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index 9f46fef6ca..e25c22fc7e 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -73,7 +73,7 @@ bool CMessage::execute(const CString &target, const ClassDef *classDef, int flag // Scan for the target by name CProjectItem *project = g_vm->_window->_project; for (CTreeItem *treeItem = project; treeItem; treeItem = treeItem->scan(project)) { - if (treeItem->getName().compareToIgnoreCase(target)) + if (!treeItem->getName().compareToIgnoreCase(target)) return execute(treeItem, classDef, flags); } -- cgit v1.2.3 From 5ccc0a66da38d23520234e7060efaf966d3345b9 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Wed, 29 Jun 2016 19:53:16 -0400 Subject: TITANIC: Removed const modifier from all saveable objects Turns out that CGameObject::save regenerates the _movieRangeInfo list. So the const suffix can no longer be used for the entire hierarchy --- engines/titanic/messages/messages.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'engines/titanic/messages/messages.cpp') diff --git a/engines/titanic/messages/messages.cpp b/engines/titanic/messages/messages.cpp index e25c22fc7e..5f587c975d 100644 --- a/engines/titanic/messages/messages.cpp +++ b/engines/titanic/messages/messages.cpp @@ -32,7 +32,7 @@ namespace Titanic { CMessage::CMessage() : CSaveableObject() { } -void CMessage::save(SimpleFile *file, int indent) const { +void CMessage::save(SimpleFile *file, int indent) { file->writeNumberLine(0, indent); } -- cgit v1.2.3