From 01e6d073604a3973d993ccefc162c437d2937660 Mon Sep 17 00:00:00 2001 From: Colin Snover Date: Mon, 2 Jan 2017 23:29:25 -0600 Subject: SCI32: Split kCelInfo into subops Different subops have different call signature requirements. --- engines/sci/engine/kernel.h | 5 +++++ engines/sci/engine/kernel_tables.h | 12 +++++++++++- engines/sci/engine/kgraphics32.cpp | 39 ++++++++++++++++++-------------------- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h index 5fb1ab6c66..335fec06ad 100644 --- a/engines/sci/engine/kernel.h +++ b/engines/sci/engine/kernel.h @@ -637,7 +637,12 @@ reg_t kMessageBox(EngineState *s, int argc, reg_t *argv); reg_t kGetConfig(EngineState *s, int argc, reg_t *argv); reg_t kGetSierraProfileInt(EngineState *s, int argc, reg_t *argv); reg_t kPrintDebug(EngineState *s, int argc, reg_t *argv); + 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 kSetLanguage(EngineState *s, int argc, reg_t *argv); reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv); reg_t kSetFontHeight(EngineState *s, int argc, reg_t *argv); diff --git a/engines/sci/engine/kernel_tables.h b/engines/sci/engine/kernel_tables.h index 1241a9753e..278d4d6614 100644 --- a/engines/sci/engine/kernel_tables.h +++ b/engines/sci/engine/kernel_tables.h @@ -559,6 +559,16 @@ static const SciKernelMapSubEntry kString_subops[] = { SCI_SUBOPENTRY_TERMINATOR }; +// version, subId, function-mapping, signature, workarounds +static const SciKernelMapSubEntry kCelInfo_subops[] = { + { SIG_SINCE_SCI21MID, 0, MAP_CALL(CelInfoGetOriginX), "iii", NULL }, + { SIG_SINCE_SCI21MID, 1, MAP_CALL(CelInfoGetOriginY), "iii", NULL }, + { SIG_SINCE_SCI21MID, 2, MAP_EMPTY(CelInfo), "iii", NULL }, + { SIG_SINCE_SCI21MID, 3, MAP_EMPTY(CelInfo), "iii", NULL }, + { SIG_SINCE_SCI21MID, 4, MAP_CALL(CelInfoGetPixel), "iiiii", NULL }, + SCI_SUBOPENTRY_TERMINATOR +}; + // version, subId, function-mapping, signature, workarounds static const SciKernelMapSubEntry kScrollWindow_subops[] = { { SIG_SCI32, 0, MAP_CALL(ScrollWindowCreate), "oi", NULL }, @@ -933,7 +943,7 @@ static SciKernelMapEntry s_kernelMap[] = { { MAP_CALL(WinHelp), SIG_EVERYWHERE, "(.*)", NULL, NULL }, { MAP_CALL(GetConfig), SIG_EVERYWHERE, "ro", NULL, NULL }, { MAP_CALL(GetSierraProfileInt), SIG_EVERYWHERE, "rri", NULL, NULL }, - { MAP_CALL(CelInfo), SIG_SINCE_SCI21MID, SIGFOR_ALL, "iiiiii", NULL, NULL }, + { MAP_CALL(CelInfo), SIG_SINCE_SCI21MID, SIGFOR_ALL, "(.*)", kCelInfo_subops, NULL }, { MAP_CALL(SetLanguage), SIG_SINCE_SCI21MID, SIGFOR_ALL, "r", NULL, NULL }, { MAP_CALL(ScrollWindow), SIG_EVERYWHERE, "i(.*)", kScrollWindow_subops, NULL }, { MAP_CALL(SetFontRes), SIG_SCI21EARLY, SIGFOR_ALL, "ii", NULL, NULL }, diff --git a/engines/sci/engine/kgraphics32.cpp b/engines/sci/engine/kgraphics32.cpp index f710df1ca5..f6aeeb7f9e 100644 --- a/engines/sci/engine/kgraphics32.cpp +++ b/engines/sci/engine/kgraphics32.cpp @@ -430,31 +430,28 @@ reg_t kCelWide32(EngineState *s, int argc, reg_t *argv) { return make_reg(0, mulru(celObj._width, Ratio(g_sci->_gfxFrameout->getCurrentBuffer().scriptWidth, celObj._xResolution))); } +// Used by Shivers 1, room 23601 to determine what blocks on the red door +// puzzle board are occupied by pieces already, and by Phantasmagoria 2 when +// saving the game from the in-game UI reg_t kCelInfo(EngineState *s, int argc, reg_t *argv) { - // Used by Shivers 1, room 23601 to determine what blocks on the red door puzzle board - // are occupied by pieces already - - CelObjView view(argv[1].toUint16(), argv[2].toSint16(), argv[3].toSint16()); + if (!s) + return make_reg(0, getSciVersion()); + error("not supposed to call this"); +} - int16 result = 0; +reg_t kCelInfoGetOriginX(EngineState *s, int argc, reg_t *argv) { + CelObjView view(argv[0].toUint16(), argv[1].toSint16(), argv[2].toSint16()); + return make_reg(0, view._origin.x); +} - switch (argv[0].toUint16()) { - case 0: - result = view._origin.x; - break; - case 1: - result = view._origin.y; - break; - case 2: - case 3: - // null operation - break; - case 4: - result = view.readPixel(argv[4].toSint16(), argv[5].toSint16(), view._mirrorX); - break; - } +reg_t kCelInfoGetOriginY(EngineState *s, int argc, reg_t *argv) { + CelObjView view(argv[0].toUint16(), argv[1].toSint16(), argv[2].toSint16()); + return make_reg(0, view._origin.y); +} - return make_reg(0, result); +reg_t kCelInfoGetPixel(EngineState *s, int argc, reg_t *argv) { + CelObjView view(argv[0].toUint16(), argv[1].toSint16(), argv[2].toSint16()); + return make_reg(0, view.readPixel(argv[4].toSint16(), argv[5].toSint16(), view._mirrorX)); } reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) { -- cgit v1.2.3