From 43a07abb46cc55d09f7415090f9f53c068c856aa Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Fri, 4 Aug 2017 18:53:00 -0500 Subject: SCI32: Implement kCelLink kCelLink exists in SSCI since 2.1mid, but it is only known to be used in Lighthouse, during the weapon creation puzzle near the end of the game. --- engines/sci/engine/kernel.h | 3 +++ engines/sci/engine/kernel_tables.h | 12 +++++++++++- engines/sci/engine/kgraphics32.cpp | 17 +++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) (limited to 'engines/sci/engine') diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index d1dce37e48..baa891650e 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -636,6 +636,9 @@ reg_t kCelInfo(EngineState *s, int argc, reg_t *argv); reg_t kCelInfoGetOriginX(EngineState *s, int argc, reg_t *argv); reg_t kCelInfoGetOriginY(EngineState *s, int argc, reg_t *argv); reg_t kCelInfoGetPixel(EngineState *s, int argc, reg_t *argv); +reg_t kCelLink(EngineState *s, int argc, reg_t *argv); +reg_t kCelLinkGetX(EngineState *s, int argc, reg_t *argv); +reg_t kCelLinkGetY(EngineState *s, int argc, reg_t *argv); reg_t kSetLanguage(EngineState *s, int argc, reg_t *argv); reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index c65356470a..ac932199d3 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -574,6 +574,16 @@ static const SciKernelMapSubEntry kCelInfo_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +// version, subId, function-mapping, signature, workarounds +static const SciKernelMapSubEntry kCelLink_subops[] = { + { SIG_SINCE_SCI21MID, 0, MAP_DUMMY(CelLink0), "", NULL }, + { SIG_SINCE_SCI21MID, 1, MAP_DUMMY(CelLink1), "", NULL }, + { SIG_SINCE_SCI21MID, 2, MAP_CALL(CelLinkGetX), "iiii", NULL }, + { SIG_SINCE_SCI21MID, 3, MAP_CALL(CelLinkGetY), "iiii", NULL }, + { SIG_SINCE_SCI21MID, 4, MAP_DUMMY(CelLink4), "", NULL }, + SCI_SUBOPENTRY_TERMINATOR +}; + // version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kScrollWindow_subops[] = { { SIG_SCI32, 0, MAP_CALL(ScrollWindowCreate), "oi", NULL }, @@ -988,7 +998,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_DUMMY(FindClass), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(CelRect), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(BaseLineSpan), SIG_EVERYWHERE, "(.*)", NULL, NULL }, - { MAP_DUMMY(CelLink), SIG_EVERYWHERE, "(.*)", NULL, NULL }, + { MAP_CALL(CelLink), SIG_SINCE_SCI21MID, SIGFOR_ALL, "(.*)", kCelLink_subops, NULL }, { MAP_DUMMY(AddPolygon), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(DeletePolygon), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_DUMMY(UpdatePolygon), SIG_EVERYWHERE, "(.*)", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index 44a3517458..c07282f53e 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -449,6 +449,23 @@ reg_t kCelInfoGetPixel(EngineState *s, int argc, reg_t *argv) { return make_reg(0, view.readPixel(argv[3].toSint16(), argv[4].toSint16(), view._mirrorX)); } +// Used by Lighthouse, room 800, script 16, when in the weapon-building puzzle +reg_t kCelLink(EngineState *s, int argc, reg_t *argv) { + if (!s) + return make_reg(0, getSciVersion()); + error("not supposed to call this"); +} + +reg_t kCelLinkGetX(EngineState *s, int argc, reg_t *argv) { + CelObjView view(argv[0].toUint16(), argv[1].toSint16(), argv[2].toSint16()); + return make_reg(0, view.getLinkPosition(argv[3].toSint16()).x); +} + +reg_t kCelLinkGetY(EngineState *s, int argc, reg_t *argv) { + CelObjView view(argv[0].toUint16(), argv[1].toSint16(), argv[2].toSint16()); + return make_reg(0, view.getLinkPosition(argv[3].toSint16()).y); +} + reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) { if (!s) return make_reg(0, getSciVersion()); -- cgit v1.2.3