aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/graphics/celobj32.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/graphics/celobj32.cpp')
-rw-r--r--engines/sci/graphics/celobj32.cpp32
1 files changed, 32 insertions, 0 deletions
diff --git a/engines/sci/graphics/celobj32.cpp b/engines/sci/graphics/celobj32.cpp
index 49b3b0053b..687ecd64f3 100644
--- a/engines/sci/graphics/celobj32.cpp
+++ b/engines/sci/graphics/celobj32.cpp
@@ -1081,6 +1081,38 @@ const SciSpan<const byte> CelObjView::getResPointer() const {
return *resource;
}
+Common::Point CelObjView::getLinkPosition(const int16 linkId) const {
+ const SciSpan<const byte> resource = getResPointer();
+
+ if (resource[18] < 0x84) {
+ error("%s unsupported version %u for Links", _info.toString().c_str(), resource[18]);
+ }
+
+ const SciSpan<const byte> celHeader = resource.subspan(_celHeaderOffset);
+ const int16 numLinks = celHeader.getInt16SEAt(40);
+
+ if (numLinks) {
+ const int recordSize = 6;
+ SciSpan<const byte> linkTable = resource.subspan(celHeader.getInt32SEAt(36), recordSize * numLinks);
+ for (int16 i = 0; i < numLinks; ++i) {
+ if (linkTable[4] == linkId) {
+ Common::Point point;
+ point.x = linkTable.getInt16SEAt(0);
+ if (_mirrorX) {
+ // NOTE: SSCI had an off-by-one error here (missing -1)
+ point.x = _width - point.x - 1;
+ }
+ point.y = linkTable.getInt16SEAt(2);
+ return point;
+ }
+
+ linkTable += recordSize;
+ }
+ }
+
+ return Common::Point(-1, -1);
+}
+
#pragma mark -
#pragma mark CelObjPic