SCI32: Split kCelInfo into subops
Different subops have different call signature requirements.
This commit is contained in:
parent
8987d9a889
commit
01e6d07360
3 changed files with 34 additions and 22 deletions
|
@ -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 kGetConfig(EngineState *s, int argc, reg_t *argv);
|
||||||
reg_t kGetSierraProfileInt(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 kPrintDebug(EngineState *s, int argc, reg_t *argv);
|
||||||
|
|
||||||
reg_t kCelInfo(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 kSetLanguage(EngineState *s, int argc, reg_t *argv);
|
||||||
reg_t kScrollWindow(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);
|
reg_t kSetFontHeight(EngineState *s, int argc, reg_t *argv);
|
||||||
|
|
|
@ -559,6 +559,16 @@ static const SciKernelMapSubEntry kString_subops[] = {
|
||||||
SCI_SUBOPENTRY_TERMINATOR
|
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
|
// version, subId, function-mapping, signature, workarounds
|
||||||
static const SciKernelMapSubEntry kScrollWindow_subops[] = {
|
static const SciKernelMapSubEntry kScrollWindow_subops[] = {
|
||||||
{ SIG_SCI32, 0, MAP_CALL(ScrollWindowCreate), "oi", NULL },
|
{ 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(WinHelp), SIG_EVERYWHERE, "(.*)", NULL, NULL },
|
||||||
{ MAP_CALL(GetConfig), SIG_EVERYWHERE, "ro", NULL, NULL },
|
{ MAP_CALL(GetConfig), SIG_EVERYWHERE, "ro", NULL, NULL },
|
||||||
{ MAP_CALL(GetSierraProfileInt), SIG_EVERYWHERE, "rri", 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(SetLanguage), SIG_SINCE_SCI21MID, SIGFOR_ALL, "r", NULL, NULL },
|
||||||
{ MAP_CALL(ScrollWindow), SIG_EVERYWHERE, "i(.*)", kScrollWindow_subops, NULL },
|
{ MAP_CALL(ScrollWindow), SIG_EVERYWHERE, "i(.*)", kScrollWindow_subops, NULL },
|
||||||
{ MAP_CALL(SetFontRes), SIG_SCI21EARLY, SIGFOR_ALL, "ii", NULL, NULL },
|
{ MAP_CALL(SetFontRes), SIG_SCI21EARLY, SIGFOR_ALL, "ii", NULL, NULL },
|
||||||
|
|
|
@ -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)));
|
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) {
|
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
|
if (!s)
|
||||||
// are occupied by pieces already
|
return make_reg(0, getSciVersion());
|
||||||
|
error("not supposed to call this");
|
||||||
|
}
|
||||||
|
|
||||||
CelObjView view(argv[1].toUint16(), argv[2].toSint16(), argv[3].toSint16());
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
int16 result = 0;
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
switch (argv[0].toUint16()) {
|
reg_t kCelInfoGetPixel(EngineState *s, int argc, reg_t *argv) {
|
||||||
case 0:
|
CelObjView view(argv[0].toUint16(), argv[1].toSint16(), argv[2].toSint16());
|
||||||
result = view._origin.x;
|
return make_reg(0, view.readPixel(argv[4].toSint16(), argv[5].toSint16(), view._mirrorX));
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
return make_reg(0, result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) {
|
reg_t kScrollWindow(EngineState *s, int argc, reg_t *argv) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue