SCI: Fixed mouse cursor hotspots in ECO1.
svn-id: r40110
This commit is contained in:
parent
df81ef750c
commit
c0805599ca
5 changed files with 35 additions and 34 deletions
|
@ -315,8 +315,7 @@ reg_t kSetCursorNew(EngineState *s, int funct_nr, int argc, reg_t *argv) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 3 : {
|
case 3 : {
|
||||||
Common::Point hotspot = Common::Point(0, 0);
|
GFX_ASSERT(gfxop_set_pointer_view(s->gfx_state, UKPV(0), UKPV(1), UKPV(2), NULL));
|
||||||
GFX_ASSERT(gfxop_set_pointer_view(s->gfx_state, UKPV(0), UKPV(1), UKPV(2), &hotspot));
|
|
||||||
s->mouse_pointer_view = UKPV(0);
|
s->mouse_pointer_view = UKPV(0);
|
||||||
s->mouse_pointer_loop = UKPV(1);
|
s->mouse_pointer_loop = UKPV(1);
|
||||||
s->mouse_pointer_cel = UKPV(2);
|
s->mouse_pointer_cel = UKPV(2);
|
||||||
|
|
|
@ -286,13 +286,13 @@ static uint8 *create_cursor(gfx_driver_t *drv, gfx_pixmap_t *pointer, int mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int scummvm_set_pointer(gfx_driver_t *drv, gfx_pixmap_t *pointer) {
|
static int scummvm_set_pointer(gfx_driver_t *drv, gfx_pixmap_t *pointer, Common::Point *hotspot) {
|
||||||
if (pointer == NULL) {
|
if ((pointer == NULL) || (hotspot == NULL)) {
|
||||||
g_system->showMouse(false);
|
g_system->showMouse(false);
|
||||||
} else {
|
} else {
|
||||||
delete[] S->pointer_data;
|
delete[] S->pointer_data;
|
||||||
S->pointer_data = create_cursor(drv, pointer, 1);
|
S->pointer_data = create_cursor(drv, pointer, 1);
|
||||||
g_system->setMouseCursor(S->pointer_data, pointer->width, pointer->height, pointer->xoffset, pointer->yoffset);
|
g_system->setMouseCursor(S->pointer_data, pointer->width, pointer->height, hotspot->x, hotspot->y);
|
||||||
g_system->showMouse(true);
|
g_system->showMouse(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -251,11 +251,13 @@ struct gfx_driver_t { /* Graphics driver */
|
||||||
|
|
||||||
/*** Mouse pointer operations ***/
|
/*** Mouse pointer operations ***/
|
||||||
|
|
||||||
int (*set_pointer)(gfx_driver_t *drv, gfx_pixmap_t *pointer);
|
int (*set_pointer)(gfx_driver_t *drv, gfx_pixmap_t *pointer, Common::Point *hotspot);
|
||||||
/* Sets a new mouse pointer.
|
/* Sets a new mouse pointer.
|
||||||
** Parameters: (gfx_driver_t *) drv: The driver to modify
|
** Parameters: (gfx_driver_t *) drv: The driver to modify
|
||||||
** (gfx_pixmap_t *) pointer: The pointer to set, or NULL to set
|
** (gfx_pixmap_t *) pointer: The pointer to set, or NULL to set
|
||||||
** no pointer
|
** no pointer
|
||||||
|
** (Common::Point *) hotspot: The coordinates of the hotspot,
|
||||||
|
** or NULL to set no pointer
|
||||||
** Returns : (int) GFX_OK or GFX_FATAL
|
** Returns : (int) GFX_OK or GFX_FATAL
|
||||||
** If pointer is not NULL, it will have been scaled to the appropriate
|
** If pointer is not NULL, it will have been scaled to the appropriate
|
||||||
** size and registered as a pixmap (if neccessary) beforehand.
|
** size and registered as a pixmap (if neccessary) beforehand.
|
||||||
|
|
|
@ -1185,33 +1185,32 @@ int gfxop_sleep(gfx_state_t *state, uint32 msecs) {
|
||||||
return GFX_OK;
|
return GFX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int _gfxop_set_pointer(gfx_state_t *state, gfx_pixmap_t *pxm) {
|
static int _gfxop_set_pointer(gfx_state_t *state, gfx_pixmap_t *pxm, Common::Point *hotspot) {
|
||||||
BASIC_CHECKS(GFX_FATAL);
|
BASIC_CHECKS(GFX_FATAL);
|
||||||
|
|
||||||
state->driver->set_pointer(state->driver, pxm);
|
state->driver->set_pointer(state->driver, pxm, hotspot);
|
||||||
|
|
||||||
return GFX_OK;
|
return GFX_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int gfxop_set_pointer_cursor(gfx_state_t *state, int nr) {
|
int gfxop_set_pointer_cursor(gfx_state_t *state, int nr) {
|
||||||
gfx_pixmap_t *new_pointer = NULL;
|
|
||||||
|
|
||||||
BASIC_CHECKS(GFX_FATAL);
|
BASIC_CHECKS(GFX_FATAL);
|
||||||
|
|
||||||
if (nr == GFXOP_NO_POINTER)
|
if (nr == GFXOP_NO_POINTER)
|
||||||
new_pointer = NULL;
|
return _gfxop_set_pointer(state, NULL, NULL);
|
||||||
else {
|
|
||||||
new_pointer = state->gfxResMan->getCursor(nr);
|
|
||||||
|
|
||||||
if (!new_pointer) {
|
gfx_pixmap_t *new_pointer = state->gfxResMan->getCursor(nr);
|
||||||
GFXWARN("Attempt to set invalid pointer #%d\n", nr);
|
|
||||||
}
|
if (!new_pointer) {
|
||||||
|
GFXWARN("Attempt to set invalid pointer #%d\n", nr);
|
||||||
|
return GFX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return _gfxop_set_pointer(state, new_pointer);
|
Common::Point p = Common::Point(new_pointer->xoffset, new_pointer->yoffset);
|
||||||
|
return _gfxop_set_pointer(state, new_pointer, &p);
|
||||||
}
|
}
|
||||||
|
|
||||||
int gfxop_set_pointer_view(gfx_state_t *state, int nr, int loop, int cel, Common::Point *hotspot) {
|
int gfxop_set_pointer_view(gfx_state_t *state, int nr, int loop, int cel, Common::Point *hotspot) {
|
||||||
int real_loop = loop;
|
int real_loop = loop;
|
||||||
int real_cel = cel;
|
int real_cel = cel;
|
||||||
gfx_pixmap_t *new_pointer = NULL;
|
gfx_pixmap_t *new_pointer = NULL;
|
||||||
|
@ -1220,24 +1219,25 @@ int gfxop_set_pointer_view(gfx_state_t *state, int nr, int loop, int cel, Common
|
||||||
|
|
||||||
new_pointer = _gfxr_get_cel(state, nr, &real_loop, &real_cel, 0); // FIXME: For now, don't palettize pointers
|
new_pointer = _gfxr_get_cel(state, nr, &real_loop, &real_cel, 0); // FIXME: For now, don't palettize pointers
|
||||||
|
|
||||||
if (hotspot) {
|
|
||||||
new_pointer->xoffset = hotspot->x;
|
|
||||||
new_pointer->yoffset = hotspot->y;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Special case for Eco Quest 1: The game is trying to hide the mouse cursor by clipping it, which is rejected
|
|
||||||
// by our graphics scaler. Hide the cursor when that happens instead.
|
|
||||||
if (new_pointer->width < 2 || new_pointer->height < 2)
|
|
||||||
return _gfxop_set_pointer(state, NULL);
|
|
||||||
|
|
||||||
if (!new_pointer) {
|
if (!new_pointer) {
|
||||||
GFXWARN("Attempt to set invalid pointer #%d\n", nr);
|
GFXWARN("Attempt to set invalid pointer #%d\n", nr);
|
||||||
return GFX_ERROR;
|
return GFX_ERROR;
|
||||||
} else {
|
}
|
||||||
if (real_loop != loop || real_cel != cel) {
|
|
||||||
GFXDEBUG("Changed loop/cel from %d/%d to %d/%d in view %d\n", loop, cel, real_loop, real_cel, nr);
|
if (real_loop != loop || real_cel != cel) {
|
||||||
}
|
GFXDEBUG("Changed loop/cel from %d/%d to %d/%d in view %d\n", loop, cel, real_loop, real_cel, nr);
|
||||||
return _gfxop_set_pointer(state, new_pointer);
|
}
|
||||||
|
|
||||||
|
// Eco Quest 1 uses a 1x1 transparent cursor to hide the cursor from the user. Some scalers don't seem to support this.
|
||||||
|
if (new_pointer->width < 2 || new_pointer->height < 2)
|
||||||
|
return _gfxop_set_pointer(state, NULL, NULL);
|
||||||
|
|
||||||
|
if (hotspot)
|
||||||
|
return _gfxop_set_pointer(state, new_pointer, hotspot);
|
||||||
|
else {
|
||||||
|
// Compute hotspot from xoffset/yoffset
|
||||||
|
Common::Point p = Common::Point(new_pointer->xoffset + (new_pointer->width >> 1), new_pointer->yoffset + new_pointer->height - 1);
|
||||||
|
return _gfxop_set_pointer(state, new_pointer, &p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -233,7 +233,7 @@ static const char *sci1_default_knames[SCI1_KNAMES_DEFAULT_ENTRIES_NR] = {
|
||||||
/*0x4e*/ "OnControl",
|
/*0x4e*/ "OnControl",
|
||||||
/*0x4f*/ "InitBresen",
|
/*0x4f*/ "InitBresen",
|
||||||
/*0x50*/ "DoBresen",
|
/*0x50*/ "DoBresen",
|
||||||
/*0x51*/ "DoAvoider",
|
/*0x51*/ SCRIPT_UNKNOWN_FUNCTION_STRING, // DoAvoider is not implemented in SCI1
|
||||||
/*0x52*/ "SetJump",
|
/*0x52*/ "SetJump",
|
||||||
/*0x53*/ "SetDebug",
|
/*0x53*/ "SetDebug",
|
||||||
/*0x54*/ "InspectObj",
|
/*0x54*/ "InspectObj",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue