diff options
| -rw-r--r-- | engines/sci/engine/kernel.h | 5 | ||||
| -rw-r--r-- | engines/sci/engine/kernel_tables.h | 12 | ||||
| -rw-r--r-- | 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 @@ -560,6 +560,16 @@ static const SciKernelMapSubEntry kString_subops[] = {  };  //    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 },  	{ SIG_SCI32,           1, MAP_CALL(ScrollWindowAdd),           "iriii(i)",             kScrollWindowAdd_workarounds }, @@ -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) { | 
