diff options
Diffstat (limited to 'engines/titanic/core/drop_target.cpp')
-rw-r--r-- | engines/titanic/core/drop_target.cpp | 172 |
1 files changed, 145 insertions, 27 deletions
diff --git a/engines/titanic/core/drop_target.cpp b/engines/titanic/core/drop_target.cpp index 05ea6445c3..13a31c3f8a 100644 --- a/engines/titanic/core/drop_target.cpp +++ b/engines/titanic/core/drop_target.cpp @@ -21,30 +21,40 @@ */ #include "titanic/core/drop_target.h" +#include "titanic/carry/carry.h" namespace Titanic { -CDropTarget::CDropTarget() : CGameObject(), _fieldC4(0), - _fieldD4(0), _fieldE4(0), _fieldF4(0), _fieldF8(0), - _fieldFC(0), _field10C(1), _field110(8), _field114(20) { +BEGIN_MESSAGE_MAP(CDropTarget, CGameObject) + ON_MESSAGE(DropObjectMsg) + ON_MESSAGE(MouseDragStartMsg) + ON_MESSAGE(EnterViewMsg) + ON_MESSAGE(VisibleMsg) + ON_MESSAGE(DropZoneLostObjectMsg) +END_MESSAGE_MAP() + +CDropTarget::CDropTarget() : CGameObject(), _itemFrame(0), + _itemMatchSize(0), _showItem(false), _fieldF4(0), _dropFrame(0), + _dragFrame(0), _dragCursorId(CURSOR_ARROW), _dropCursorId(CURSOR_HAND), + _clipFlags(20) { } void CDropTarget::save(SimpleFile *file, int indent) { file->writeNumberLine(1, indent); file->writePoint(_pos1, indent); - file->writeNumberLine(_fieldC4, indent); - file->writeQuotedLine(_string1, indent); - file->writeNumberLine(_fieldD4, indent); - file->writeQuotedLine(_string2, indent); - file->writeNumberLine(_fieldE4, indent); - file->writeQuotedLine(_string3, indent); + file->writeNumberLine(_itemFrame, indent); + file->writeQuotedLine(_itemMatchName, indent); + file->writeNumberLine(_itemMatchSize, indent); + file->writeQuotedLine(_soundName, indent); + file->writeNumberLine(_showItem, indent); + file->writeQuotedLine(_itemName, indent); file->writeNumberLine(_fieldF4, indent); - file->writeNumberLine(_fieldF8, indent); - file->writeNumberLine(_fieldFC, indent); - file->writeQuotedLine(_string4, indent); - file->writeNumberLine(_field10C, indent); - file->writeNumberLine(_field110, indent); - file->writeNumberLine(_field114, indent); + file->writeNumberLine(_dropFrame, indent); + file->writeNumberLine(_dragFrame, indent); + file->writeQuotedLine(_clipName, indent); + file->writeNumberLine(_dragCursorId, indent); + file->writeNumberLine(_dropCursorId, indent); + file->writeNumberLine(_clipFlags, indent); CGameObject::save(file, indent); } @@ -52,21 +62,129 @@ void CDropTarget::save(SimpleFile *file, int indent) { void CDropTarget::load(SimpleFile *file) { file->readNumber(); _pos1 = file->readPoint(); - _fieldC4 = file->readNumber(); - _string1 = file->readString(); - _fieldD4 = file->readNumber(); - _string2 = file->readString(); - _fieldE4 = file->readNumber(); - _string3 = file->readString(); + _itemFrame = file->readNumber(); + _itemMatchName = file->readString(); + _itemMatchSize = file->readNumber(); + _soundName = file->readString(); + _showItem = file->readNumber(); + _itemName = file->readString(); _fieldF4 = file->readNumber(); - _fieldF8 = file->readNumber(); - _fieldFC = file->readNumber(); - _string4 = file->readString(); - _field10C = file->readNumber(); - _field110 = file->readNumber(); - _field114 = file->readNumber(); + _dropFrame = file->readNumber(); + _dragFrame = file->readNumber(); + _clipName = file->readString(); + _dragCursorId = (CursorId)file->readNumber(); + _dropCursorId = (CursorId)file->readNumber(); + _clipFlags = file->readNumber(); CGameObject::load(file); } +bool CDropTarget::DropObjectMsg(CDropObjectMsg *msg) { + if (!_itemName.empty()) { + if (msg->_item->getName() != _itemName) { + if (findByName(_itemName, true)) + return false; + } + } + + if (!msg->_item->isEquals(_itemMatchName, _itemMatchSize)) + return false; + + msg->_item->detach(); + msg->_item->addUnder(this); + msg->_item->setPosition(Point(_bounds.left, _bounds.top)); + + msg->_item->loadFrame(_itemFrame); + if (_showItem) + msg->_item->setVisible(false); + + CDropZoneGotObjectMsg gotMsg(this); + gotMsg.execute(msg->_item); + playSound(_soundName); + + if (_clipName.empty()) { + loadFrame(_dropFrame); + } else { + playClip(_clipName, _clipFlags); + } + + _cursorId = _dropCursorId; + return true; +} + +bool CDropTarget::MouseDragStartMsg(CMouseDragStartMsg *msg) { + if (!checkStartDragging(msg)) + return false; + //msg->_dragItem = msg->_dragItem; + + CGameObject *obj = dynamic_cast<CGameObject *>(findByName(_itemName)); + if (_itemName.empty() || _fieldF4 || !obj) + return false; + + CDropZoneLostObjectMsg lostMsg; + lostMsg._object = this; + lostMsg.execute(obj); + + loadFrame(_dragFrame); + _cursorId = _dragCursorId; + + if (obj->_visible) { + msg->execute(obj); + } else { + msg->_dragItem = obj; + CPassOnDragStartMsg passMsg(msg->_mousePos, 1); + passMsg.execute(obj); + setVisible(true); + } + + return true; +} + +bool CDropTarget::EnterViewMsg(CEnterViewMsg *msg) { + if (!_itemName.empty()) { + CGameObject *obj = dynamic_cast<CGameObject *>(findByName(_itemName)); + if (!obj) { + loadFrame(_dragFrame); + _cursorId = _dragCursorId; + } else if (_clipName.empty()) { + loadFrame(_dropFrame); + } else { + playClip(_clipName, _clipFlags); + } + + _cursorId = _dropCursorId; + } + + return true; +} + +bool CDropTarget::VisibleMsg(CVisibleMsg *msg) { + setVisible(msg->_visible); + _fieldF4 = !msg->_visible; + return true; +} + +bool CDropTarget::DropZoneLostObjectMsg(CDropZoneLostObjectMsg *msg) { + if (!_itemName.empty()) { + CGameObject *obj = dynamic_cast<CGameObject *>(findByName(_itemName)); + if (obj) { + if (msg->_object) { + obj->detach(); + obj->addUnder(msg->_object); + } else if (dynamic_cast<CCarry *>(obj)) { + obj->petAddToInventory(); + } + + setVisible(true); + CDropZoneLostObjectMsg lostMsg(this); + lostMsg.execute(obj); + } + + loadFrame(_dragFrame); + _cursorId = _dragCursorId; + } + + return true; +} + } // End of namespace Titanic |