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 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);
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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
|
||||
if (!s)
|
||||
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()) {
|
||||
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;
|
||||
}
|
||||
|
||||
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) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue