Files
2026-02-02 04:50:13 +01:00

206 lines
5.3 KiB
C++

/* 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 3 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, see <http://www.gnu.org/licenses/>.
*
*/
#include "titanic/core/link_item.h"
#include "titanic/core/node_item.h"
#include "titanic/core/project_item.h"
#include "titanic/core/view_item.h"
namespace Titanic {
EMPTY_MESSAGE_MAP(CLinkItem, CNamedItem);
Movement CLinkItem::getMovementFromCursor(CursorId cursorId) {
if (cursorId == CURSOR_MOVE_LEFT)
return TURN_LEFT;
else if (cursorId == CURSOR_MOVE_RIGHT)
return TURN_RIGHT;
else if (cursorId == CURSOR_MOVE_FORWARD || cursorId == CURSOR_MOVE_THROUGH ||
cursorId == CURSOR_DOWN || cursorId == CURSOR_LOOK_UP ||
cursorId == CURSOR_LOOK_DOWN || cursorId == CURSOR_MAGNIFIER)
return MOVE_FORWARDS;
else if (cursorId == CURSOR_BACKWARDS)
return MOVE_BACKWARDS;
else
return MOVE_NONE;
}
CLinkItem::CLinkItem() : CNamedItem() {
_roomNumber = -1;
_nodeNumber = -1;
_viewNumber = -1;
_linkMode = 0;
_cursorId = CURSOR_ARROW;
_name = "Link";
}
CString CLinkItem::formName() {
CViewItem *view = findView();
CNodeItem *node = view->findNode();
CRoomItem *room = node->findRoom();
CViewItem *destView = getDestView();
CNodeItem *destNode = destView->findNode();
CRoomItem *destRoom = destNode->findRoom();
switch (_linkMode) {
case 1:
return CString::format("_PANL,%d,%s,%s", node->_nodeNumber,
view->getName().c_str(), destView->getName().c_str());
case 2:
return CString::format("_PANR,%d,%s,%s", node->_nodeNumber,
view->getName().c_str(), destView->getName().c_str());
case 3:
return CString::format("_TRACK,%d,%s,%d,%s",
node->_nodeNumber, view->getName().c_str(),
destNode->_nodeNumber, destView->getName().c_str());
case 4:
return CString::format("_EXIT,%d,%d,%s,%d,%d,%s",
room->_roomNumber, node->_nodeNumber, view->getName().c_str(),
destRoom->_roomNumber, destNode->_nodeNumber, destView->getName().c_str());
default:
return getName().c_str();
}
}
void CLinkItem::save(SimpleFile *file, int indent) {
file->writeNumberLine(2, indent);
file->writeQuotedLine("L", indent);
file->writeNumberLine(_cursorId, indent + 1);
file->writeNumberLine(_linkMode, indent + 1);
file->writeNumberLine(_roomNumber, indent + 1);
file->writeNumberLine(_nodeNumber, indent + 1);
file->writeNumberLine(_viewNumber, indent + 1);
file->writeQuotedLine("Hotspot", indent + 1);
file->writeNumberLine(_bounds.left, indent + 2);
file->writeNumberLine(_bounds.top, indent + 2);
file->writeNumberLine(_bounds.right, indent + 2);
file->writeNumberLine(_bounds.bottom, indent + 2);
CNamedItem::save(file, indent);
}
void CLinkItem::load(SimpleFile *file) {
int val = file->readNumber();
file->readBuffer();
switch (val) {
case 2:
_cursorId = (CursorId)file->readNumber();
// Intentional fall-through
case 1:
_linkMode = file->readNumber();
// Intentional fall-through
case 0:
_roomNumber = file->readNumber();
_nodeNumber = file->readNumber();
_viewNumber = file->readNumber();
file->readBuffer();
_bounds.left = file->readNumber();
_bounds.top = file->readNumber();
_bounds.right = file->readNumber();
_bounds.bottom = file->readNumber();
break;
default:
break;
}
CNamedItem::load(file);
if (val < 2) {
switch (_linkMode) {
case 2:
_cursorId = CURSOR_MOVE_LEFT;
break;
case 3:
_cursorId = CURSOR_MOVE_RIGHT;
break;
case 5:
_cursorId = CURSOR_MOVE_FORWARD;
break;
default:
_cursorId = CURSOR_MOVE_THROUGH;
break;
}
}
}
bool CLinkItem::connectsTo(CViewItem *destView) const {
CNodeItem *destNode = destView->findNode();
CRoomItem *destRoom = destNode->findRoom();
return _viewNumber == destView->_viewNumber &&
_nodeNumber == destNode->_nodeNumber &&
_roomNumber == destRoom->_roomNumber;
}
void CLinkItem::setDestination(int roomNumber, int nodeNumber,
int viewNumber, int linkMode) {
_roomNumber = roomNumber;
_nodeNumber = nodeNumber;
_viewNumber = viewNumber;
_linkMode = linkMode;
_name = formName();
}
CViewItem *CLinkItem::getDestView() const {
return getRoot()->findView(_roomNumber, _nodeNumber, _viewNumber);
}
CNodeItem *CLinkItem::getDestNode() const {
return getDestView()->findNode();
}
CRoomItem *CLinkItem::getDestRoom() const {
return getDestNode()->findRoom();
}
CMovieClip *CLinkItem::getClip() const {
return findRoom()->findClip(getName());
}
Movement CLinkItem::getMovement() const {
if (_bounds.isEmpty())
return MOVE_NONE;
return getMovementFromCursor(_cursorId);
}
bool CLinkItem::findPoint(Quadrant quadrant, Point &pt) {
if (_bounds.isEmpty())
return false;
pt = _bounds.getPoint(quadrant);
return true;
}
} // End of namespace Titanic