2020-11-21 08:58:42 -08:00
|
|
|
/* ScummVM - Graphic Adventure Engine
|
|
|
|
*
|
|
|
|
* ScummVM is the legal property of its developers, whose names
|
|
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
|
|
* file distributed with this source distribution.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
*/
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-26 14:34:47 -08:00
|
|
|
#include "ags/engine/ac/mouse.h"
|
2020-11-22 20:31:43 -08:00
|
|
|
#include "ags/shared/ac/common.h"
|
|
|
|
#include "ags/shared/ac/characterinfo.h"
|
2020-11-26 14:34:47 -08:00
|
|
|
#include "ags/engine/ac/draw.h"
|
|
|
|
#include "ags/engine/ac/dynobj/scriptmouse.h"
|
|
|
|
#include "ags/engine/ac/dynobj/scriptsystem.h"
|
|
|
|
#include "ags/engine/ac/gamesetup.h"
|
2020-11-22 20:31:43 -08:00
|
|
|
#include "ags/shared/ac/gamesetupstruct.h"
|
2020-11-26 14:34:47 -08:00
|
|
|
#include "ags/engine/ac/gamestate.h"
|
|
|
|
#include "ags/engine/ac/global_mouse.h"
|
|
|
|
#include "ags/engine/ac/global_plugin.h"
|
|
|
|
#include "ags/engine/ac/global_screen.h"
|
|
|
|
#include "ags/engine/ac/system.h"
|
|
|
|
#include "ags/engine/ac/viewframe.h"
|
|
|
|
#include "ags/engine/debugging/debug_log.h"
|
2020-11-22 20:31:43 -08:00
|
|
|
#include "ags/shared/gui/guibutton.h"
|
|
|
|
#include "ags/shared/gui/guimain.h"
|
2020-11-26 14:34:47 -08:00
|
|
|
#include "ags/engine/device/mousew32.h"
|
2020-11-22 20:31:43 -08:00
|
|
|
#include "ags/shared/ac/spritecache.h"
|
2020-11-26 14:34:47 -08:00
|
|
|
#include "ags/engine/gfx/graphicsdriver.h"
|
|
|
|
#include "ags/engine/gfx/gfxfilter.h"
|
|
|
|
#include "ags/shared/debugging/out.h"
|
|
|
|
#include "ags/engine/script/script_api.h"
|
|
|
|
#include "ags/engine/script/script_runtime.h"
|
|
|
|
#include "ags/engine/ac/global_game.h"
|
2021-02-24 21:19:47 -08:00
|
|
|
#include "ags/globals.h"
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 16:24:18 -08:00
|
|
|
namespace AGS3 {
|
|
|
|
|
2020-11-21 16:10:55 -08:00
|
|
|
using namespace AGS::Shared;
|
2020-11-21 08:30:51 -08:00
|
|
|
using namespace AGS::Engine;
|
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
|
2021-02-27 14:44:14 -08:00
|
|
|
|
2020-11-21 08:30:51 -08:00
|
|
|
extern ScriptSystem scsystem;
|
2021-02-24 21:19:47 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
extern CharacterInfo *playerchar;
|
2020-11-21 08:30:51 -08:00
|
|
|
extern IGraphicsDriver *gfxDriver;
|
|
|
|
|
|
|
|
extern void ags_domouse(int str);
|
|
|
|
extern int misbuttondown(int buno);
|
|
|
|
|
|
|
|
ScriptMouse scmouse;
|
2020-11-21 19:31:48 +00:00
|
|
|
int cur_mode, cur_cursor;
|
|
|
|
int mouse_frame = 0, mouse_delay = 0;
|
|
|
|
int lastmx = -1, lastmy = -1;
|
2020-11-21 08:30:51 -08:00
|
|
|
char alpha_blend_cursor = 0;
|
|
|
|
Bitmap *dotted_mouse_cursor = nullptr;
|
|
|
|
IDriverDependantBitmap *mouseCursor = nullptr;
|
|
|
|
Bitmap *blank_mouse_cursor = nullptr;
|
|
|
|
|
|
|
|
// The Mouse:: functions are static so the script doesn't pass
|
|
|
|
// in an object parameter
|
|
|
|
void Mouse_SetVisible(int isOn) {
|
2020-11-21 19:31:48 +00:00
|
|
|
if (isOn)
|
|
|
|
ShowMouseCursor();
|
|
|
|
else
|
|
|
|
HideMouseCursor();
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
int Mouse_GetVisible() {
|
2021-02-27 14:44:14 -08:00
|
|
|
if (_GP(play).mouse_cursor_hidden)
|
2020-11-21 19:31:48 +00:00
|
|
|
return 0;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SetMouseBounds(int x1, int y1, int x2, int y2) {
|
2021-02-27 14:44:14 -08:00
|
|
|
int xmax = game_to_data_coord(_GP(play).GetMainViewport().GetWidth()) - 1;
|
|
|
|
int ymax = game_to_data_coord(_GP(play).GetMainViewport().GetHeight()) - 1;
|
2020-11-21 19:31:48 +00:00
|
|
|
if ((x1 == 0) && (y1 == 0) && (x2 == 0) && (y2 == 0)) {
|
|
|
|
x2 = xmax;
|
|
|
|
y2 = ymax;
|
|
|
|
} else {
|
|
|
|
if (x1 < 0 || x1 > xmax || x2 < 0 || x2 > xmax || x1 > x2 || y1 < 0 || y1 > ymax || y2 < 0 || y2 > ymax || y1 > y2)
|
|
|
|
debug_script_warn("SetMouseBounds: arguments are out of range and will be corrected: (%d,%d)-(%d,%d), range is (%d,%d)-(%d,%d)",
|
2020-11-21 16:24:18 -08:00
|
|
|
x1, y1, x2, y2, 0, 0, xmax, ymax);
|
2020-11-21 19:31:48 +00:00
|
|
|
x1 = Math::Clamp(x1, 0, xmax);
|
|
|
|
x2 = Math::Clamp(x2, x1, xmax);
|
|
|
|
y1 = Math::Clamp(y1, 0, ymax);
|
|
|
|
y2 = Math::Clamp(y2, y1, ymax);
|
|
|
|
}
|
|
|
|
|
|
|
|
debug_script_log("Mouse bounds constrained to (%d,%d)-(%d,%d)", x1, y1, x2, y2);
|
|
|
|
data_to_game_coords(&x1, &y1);
|
|
|
|
data_to_game_round_up(&x2, &y2);
|
|
|
|
|
2021-02-27 14:44:14 -08:00
|
|
|
_GP(play).mboundx1 = x1;
|
|
|
|
_GP(play).mboundx2 = x2;
|
|
|
|
_GP(play).mboundy1 = y1;
|
|
|
|
_GP(play).mboundy2 = y2;
|
2020-11-21 19:31:48 +00:00
|
|
|
Mouse::SetMoveLimit(Rect(x1, y1, x2, y2));
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// mouse cursor functions:
|
|
|
|
// set_mouse_cursor: changes visual appearance to specified cursor
|
|
|
|
void set_mouse_cursor(int newcurs) {
|
2021-02-24 21:19:47 -08:00
|
|
|
const int hotspotx = _GP(game).mcurs[newcurs].hotx, hotspoty = _GP(game).mcurs[newcurs].hoty;
|
2020-11-21 19:31:48 +00:00
|
|
|
msethotspot(hotspotx, hotspoty);
|
|
|
|
|
|
|
|
// if it's same cursor and there's animation in progress, then don't assign a new pic just yet
|
2021-02-24 21:19:47 -08:00
|
|
|
if (newcurs == cur_cursor && _GP(game).mcurs[newcurs].view >= 0 &&
|
2020-11-21 16:24:18 -08:00
|
|
|
(mouse_frame > 0 || mouse_delay > 0)) {
|
2020-11-21 19:31:48 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// reset animation timing only if it's another cursor
|
|
|
|
if (newcurs != cur_cursor) {
|
|
|
|
cur_cursor = newcurs;
|
|
|
|
mouse_frame = 0;
|
|
|
|
mouse_delay = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Assign new pic
|
2021-02-24 21:19:47 -08:00
|
|
|
set_new_cursor_graphic(_GP(game).mcurs[newcurs].pic);
|
2020-11-21 19:31:48 +00:00
|
|
|
delete dotted_mouse_cursor;
|
|
|
|
dotted_mouse_cursor = nullptr;
|
|
|
|
|
|
|
|
// If it's inventory cursor, draw hotspot crosshair sprite upon it
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((newcurs == MODE_USE) && (_GP(game).mcurs[newcurs].pic > 0) &&
|
|
|
|
((_GP(game).hotdot > 0) || (_GP(game).invhotdotsprite > 0))) {
|
2020-11-21 19:31:48 +00:00
|
|
|
// If necessary, create a copy of the cursor and put the hotspot
|
|
|
|
// dot onto it
|
2021-01-18 20:10:44 -08:00
|
|
|
dotted_mouse_cursor = BitmapHelper::CreateBitmapCopy(_G(mousecurs)[0]);
|
2020-11-21 19:31:48 +00:00
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
if (_GP(game).invhotdotsprite > 0) {
|
2020-11-21 19:31:48 +00:00
|
|
|
draw_sprite_slot_support_alpha(dotted_mouse_cursor,
|
2021-02-24 21:19:47 -08:00
|
|
|
(_GP(game).SpriteInfos[_GP(game).mcurs[newcurs].pic].Flags & SPF_ALPHACHANNEL) != 0,
|
|
|
|
hotspotx - _GP(game).SpriteInfos[_GP(game).invhotdotsprite].Width / 2,
|
|
|
|
hotspoty - _GP(game).SpriteInfos[_GP(game).invhotdotsprite].Height / 2,
|
|
|
|
_GP(game).invhotdotsprite);
|
2020-11-21 19:31:48 +00:00
|
|
|
} else {
|
2021-02-24 21:19:47 -08:00
|
|
|
putpixel_compensate(dotted_mouse_cursor, hotspotx, hotspoty, MakeColor(_GP(game).hotdot));
|
2020-11-21 19:31:48 +00:00
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
if (_GP(game).hotdotouter > 0) {
|
|
|
|
int outercol = MakeColor(_GP(game).hotdotouter);
|
2020-11-21 19:31:48 +00:00
|
|
|
|
|
|
|
putpixel_compensate(dotted_mouse_cursor, hotspotx + get_fixed_pixel_size(1), hotspoty, outercol);
|
|
|
|
putpixel_compensate(dotted_mouse_cursor, hotspotx, hotspoty + get_fixed_pixel_size(1), outercol);
|
|
|
|
putpixel_compensate(dotted_mouse_cursor, hotspotx - get_fixed_pixel_size(1), hotspoty, outercol);
|
|
|
|
putpixel_compensate(dotted_mouse_cursor, hotspotx, hotspoty - get_fixed_pixel_size(1), outercol);
|
|
|
|
}
|
|
|
|
}
|
2021-01-18 20:10:44 -08:00
|
|
|
_G(mousecurs)[0] = dotted_mouse_cursor;
|
2020-11-21 19:31:48 +00:00
|
|
|
update_cached_mouse_cursor();
|
|
|
|
}
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// set_default_cursor: resets visual appearance to current mode (walk, look, etc)
|
|
|
|
void set_default_cursor() {
|
2020-11-21 19:31:48 +00:00
|
|
|
set_mouse_cursor(cur_mode);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// permanently change cursor graphic
|
2020-11-21 19:31:48 +00:00
|
|
|
void ChangeCursorGraphic(int curs, int newslot) {
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((curs < 0) || (curs >= _GP(game).numcursors))
|
2020-11-21 19:31:48 +00:00
|
|
|
quit("!ChangeCursorGraphic: invalid mouse cursor");
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((curs == MODE_USE) && (_GP(game).options[OPT_FIXEDINVCURSOR] == 0))
|
2020-11-21 19:31:48 +00:00
|
|
|
debug_script_warn("Mouse.ChangeModeGraphic should not be used on the Inventory cursor when the cursor is linked to the active inventory item");
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
_GP(game).mcurs[curs].pic = newslot;
|
|
|
|
_GP(spriteset).Precache(newslot);
|
2020-11-21 19:31:48 +00:00
|
|
|
if (curs == cur_mode)
|
|
|
|
set_mouse_cursor(curs);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
int Mouse_GetModeGraphic(int curs) {
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((curs < 0) || (curs >= _GP(game).numcursors))
|
2020-11-21 19:31:48 +00:00
|
|
|
quit("!Mouse.GetModeGraphic: invalid mouse cursor");
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
return _GP(game).mcurs[curs].pic;
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
void ChangeCursorHotspot(int curs, int x, int y) {
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((curs < 0) || (curs >= _GP(game).numcursors))
|
2020-11-21 19:31:48 +00:00
|
|
|
quit("!ChangeCursorHotspot: invalid mouse cursor");
|
2021-02-24 21:19:47 -08:00
|
|
|
_GP(game).mcurs[curs].hotx = data_to_game_coord(x);
|
|
|
|
_GP(game).mcurs[curs].hoty = data_to_game_coord(y);
|
2020-11-21 19:31:48 +00:00
|
|
|
if (curs == cur_cursor)
|
|
|
|
set_mouse_cursor(cur_cursor);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void Mouse_ChangeModeView(int curs, int newview) {
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((curs < 0) || (curs >= _GP(game).numcursors))
|
2020-11-21 19:31:48 +00:00
|
|
|
quit("!Mouse.ChangeModeView: invalid mouse cursor");
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
newview--;
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
_GP(game).mcurs[curs].view = newview;
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
if (newview >= 0) {
|
|
|
|
precache_view(newview);
|
|
|
|
}
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
if (curs == cur_cursor)
|
|
|
|
mouse_delay = 0; // force update
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
void SetNextCursor() {
|
|
|
|
set_cursor_mode(find_next_enabled_cursor(cur_mode + 1));
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void SetPreviousCursor() {
|
2020-11-21 19:31:48 +00:00
|
|
|
set_cursor_mode(find_previous_enabled_cursor(cur_mode - 1));
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// set_cursor_mode: changes mode and appearance
|
|
|
|
void set_cursor_mode(int newmode) {
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((newmode < 0) || (newmode >= _GP(game).numcursors))
|
2020-11-21 19:31:48 +00:00
|
|
|
quit("!SetCursorMode: invalid cursor mode specified");
|
|
|
|
|
|
|
|
guis_need_update = 1;
|
2021-02-24 21:19:47 -08:00
|
|
|
if (_GP(game).mcurs[newmode].flags & MCF_DISABLED) {
|
2020-11-21 19:31:48 +00:00
|
|
|
find_next_enabled_cursor(newmode);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (newmode == MODE_USE) {
|
|
|
|
if (playerchar->activeinv == -1) {
|
|
|
|
find_next_enabled_cursor(0);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
update_inv_cursor(playerchar->activeinv);
|
|
|
|
}
|
|
|
|
cur_mode = newmode;
|
|
|
|
set_default_cursor();
|
|
|
|
|
|
|
|
debug_script_log("Cursor mode set to %d", newmode);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void enable_cursor_mode(int modd) {
|
2021-02-24 21:19:47 -08:00
|
|
|
_GP(game).mcurs[modd].flags &= ~MCF_DISABLED;
|
2020-11-21 19:31:48 +00:00
|
|
|
// now search the interfaces for related buttons to re-enable
|
|
|
|
int uu, ww;
|
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
for (uu = 0; uu < _GP(game).numgui; uu++) {
|
2020-11-21 19:31:48 +00:00
|
|
|
for (ww = 0; ww < guis[uu].GetControlCount(); ww++) {
|
|
|
|
if (guis[uu].GetControlType(ww) != kGUIButton) continue;
|
|
|
|
GUIButton *gbpt = (GUIButton *)guis[uu].GetControl(ww);
|
|
|
|
if (gbpt->ClickAction[kMouseLeft] != kGUIAction_SetMode) continue;
|
|
|
|
if (gbpt->ClickData[kMouseLeft] != modd) continue;
|
|
|
|
gbpt->SetEnabled(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
guis_need_update = 1;
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void disable_cursor_mode(int modd) {
|
2021-02-24 21:19:47 -08:00
|
|
|
_GP(game).mcurs[modd].flags |= MCF_DISABLED;
|
2020-11-21 19:31:48 +00:00
|
|
|
// now search the interfaces for related buttons to kill
|
|
|
|
int uu, ww;
|
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
for (uu = 0; uu < _GP(game).numgui; uu++) {
|
2020-11-21 19:31:48 +00:00
|
|
|
for (ww = 0; ww < guis[uu].GetControlCount(); ww++) {
|
|
|
|
if (guis[uu].GetControlType(ww) != kGUIButton) continue;
|
|
|
|
GUIButton *gbpt = (GUIButton *)guis[uu].GetControl(ww);
|
|
|
|
if (gbpt->ClickAction[kMouseLeft] != kGUIAction_SetMode) continue;
|
|
|
|
if (gbpt->ClickData[kMouseLeft] != modd) continue;
|
|
|
|
gbpt->SetEnabled(false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (cur_mode == modd) find_next_enabled_cursor(modd);
|
|
|
|
guis_need_update = 1;
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void RefreshMouse() {
|
2020-11-21 19:31:48 +00:00
|
|
|
ags_domouse(DOMOUSE_NOCURSOR);
|
2021-01-18 20:10:44 -08:00
|
|
|
scmouse.x = game_to_data_coord(_G(mousex));
|
|
|
|
scmouse.y = game_to_data_coord(_G(mousey));
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
void SetMousePosition(int newx, int newy) {
|
2021-02-27 14:44:14 -08:00
|
|
|
const Rect &viewport = _GP(play).GetMainViewport();
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
if (newx < 0)
|
|
|
|
newx = 0;
|
|
|
|
if (newy < 0)
|
|
|
|
newy = 0;
|
|
|
|
if (newx >= viewport.GetWidth())
|
|
|
|
newx = viewport.GetWidth() - 1;
|
|
|
|
if (newy >= viewport.GetHeight())
|
|
|
|
newy = viewport.GetHeight() - 1;
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
data_to_game_coords(&newx, &newy);
|
|
|
|
Mouse::SetPosition(Point(newx, newy));
|
|
|
|
RefreshMouse();
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
int GetCursorMode() {
|
2020-11-21 19:31:48 +00:00
|
|
|
return cur_mode;
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
int IsButtonDown(int which) {
|
2020-11-21 19:31:48 +00:00
|
|
|
if ((which < 1) || (which > 3))
|
|
|
|
quit("!IsButtonDown: only works with eMouseLeft, eMouseRight, eMouseMiddle");
|
|
|
|
if (misbuttondown(which - 1))
|
|
|
|
return 1;
|
|
|
|
return 0;
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
int IsModeEnabled(int which) {
|
2021-02-24 21:19:47 -08:00
|
|
|
return (which < 0) || (which >= _GP(game).numcursors) ? 0 :
|
2020-11-21 16:24:18 -08:00
|
|
|
which == MODE_USE ? playerchar->activeinv > 0 :
|
2021-02-24 21:19:47 -08:00
|
|
|
(_GP(game).mcurs[which].flags & MCF_DISABLED) == 0;
|
2020-11-21 19:31:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void Mouse_EnableControl(bool on) {
|
|
|
|
usetup.mouse_ctrl_enabled = on; // remember setting in config
|
|
|
|
|
|
|
|
bool is_windowed = scsystem.windowed != 0;
|
|
|
|
// Whether mouse movement should be controlled by the engine - this is
|
|
|
|
// determined based on related config option.
|
|
|
|
bool should_control_mouse = usetup.mouse_ctrl_when == kMouseCtrl_Always ||
|
2020-11-21 16:24:18 -08:00
|
|
|
(usetup.mouse_ctrl_when == kMouseCtrl_Fullscreen && !is_windowed);
|
2020-11-21 19:31:48 +00:00
|
|
|
// Whether mouse movement control is supported by the engine - this is
|
|
|
|
// determined on per platform basis. Some builds may not have such
|
|
|
|
// capability, e.g. because of how backend library implements mouse utils.
|
|
|
|
bool can_control_mouse = platform->IsMouseControlSupported(is_windowed);
|
|
|
|
// The resulting choice is made based on two aforementioned factors.
|
|
|
|
on &= should_control_mouse && can_control_mouse;
|
|
|
|
if (on)
|
|
|
|
Mouse::EnableControl(!is_windowed);
|
|
|
|
else
|
|
|
|
Mouse::DisableControl();
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
int GetMouseCursor() {
|
2020-11-21 19:31:48 +00:00
|
|
|
return cur_cursor;
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void update_script_mouse_coords() {
|
2021-01-18 20:10:44 -08:00
|
|
|
scmouse.x = game_to_data_coord(_G(mousex));
|
|
|
|
scmouse.y = game_to_data_coord(_G(mousey));
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
void update_inv_cursor(int invnum) {
|
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((_GP(game).options[OPT_FIXEDINVCURSOR] == 0) && (invnum > 0)) {
|
|
|
|
int cursorSprite = _GP(game).invinfo[invnum].cursorPic;
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
// Fall back to the inventory pic if no cursor pic is defined.
|
|
|
|
if (cursorSprite == 0)
|
2021-02-24 21:19:47 -08:00
|
|
|
cursorSprite = _GP(game).invinfo[invnum].pic;
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
_GP(game).mcurs[MODE_USE].pic = cursorSprite;
|
2020-11-21 19:31:48 +00:00
|
|
|
// all cursor images must be pre-cached
|
2021-02-24 21:19:47 -08:00
|
|
|
_GP(spriteset).Precache(cursorSprite);
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((_GP(game).invinfo[invnum].hotx > 0) || (_GP(game).invinfo[invnum].hoty > 0)) {
|
2020-11-21 19:31:48 +00:00
|
|
|
// if the hotspot was set (unfortunately 0,0 isn't a valid co-ord)
|
2021-02-24 21:19:47 -08:00
|
|
|
_GP(game).mcurs[MODE_USE].hotx = _GP(game).invinfo[invnum].hotx;
|
|
|
|
_GP(game).mcurs[MODE_USE].hoty = _GP(game).invinfo[invnum].hoty;
|
2020-11-21 19:31:48 +00:00
|
|
|
} else {
|
2021-02-24 21:19:47 -08:00
|
|
|
_GP(game).mcurs[MODE_USE].hotx = _GP(game).SpriteInfos[cursorSprite].Width / 2;
|
|
|
|
_GP(game).mcurs[MODE_USE].hoty = _GP(game).SpriteInfos[cursorSprite].Height / 2;
|
2020-11-21 19:31:48 +00:00
|
|
|
}
|
|
|
|
}
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
void update_cached_mouse_cursor() {
|
|
|
|
if (mouseCursor != nullptr)
|
|
|
|
gfxDriver->DestroyDDB(mouseCursor);
|
2021-01-18 20:10:44 -08:00
|
|
|
mouseCursor = gfxDriver->CreateDDBFromBitmap(_G(mousecurs)[0], alpha_blend_cursor != 0);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
void set_new_cursor_graphic(int spriteslot) {
|
2021-02-24 21:19:47 -08:00
|
|
|
_G(mousecurs)[0] = _GP(spriteset)[spriteslot];
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
// It looks like spriteslot 0 can be used in games with version 2.72 and lower.
|
|
|
|
// The NULL check should ensure that the sprite is valid anyway.
|
2021-01-18 20:10:44 -08:00
|
|
|
if (((spriteslot < 1) && (loaded_game_file_version > kGameVersion_272)) || (_G(mousecurs)[0] == nullptr)) {
|
2020-11-21 19:31:48 +00:00
|
|
|
if (blank_mouse_cursor == nullptr) {
|
2021-02-24 21:19:47 -08:00
|
|
|
blank_mouse_cursor = BitmapHelper::CreateTransparentBitmap(1, 1, _GP(game).GetColorDepth());
|
2020-11-21 19:31:48 +00:00
|
|
|
}
|
2021-01-18 20:10:44 -08:00
|
|
|
_G(mousecurs)[0] = blank_mouse_cursor;
|
2020-11-21 19:31:48 +00:00
|
|
|
}
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2021-02-24 21:19:47 -08:00
|
|
|
if (_GP(game).SpriteInfos[spriteslot].Flags & SPF_ALPHACHANNEL)
|
2020-11-21 19:31:48 +00:00
|
|
|
alpha_blend_cursor = 1;
|
|
|
|
else
|
|
|
|
alpha_blend_cursor = 0;
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
update_cached_mouse_cursor();
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
bool is_standard_cursor_enabled(int curs) {
|
2021-02-24 21:19:47 -08:00
|
|
|
if ((_GP(game).mcurs[curs].flags & MCF_DISABLED) == 0) {
|
2020-11-21 19:31:48 +00:00
|
|
|
// inventory cursor, and they have an active item
|
|
|
|
if (curs == MODE_USE) {
|
|
|
|
if (playerchar->activeinv > 0)
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
// standard cursor that's not disabled, go with it
|
2021-02-24 21:19:47 -08:00
|
|
|
else if (_GP(game).mcurs[curs].flags & MCF_STANDARD)
|
2020-11-21 19:31:48 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
int find_next_enabled_cursor(int startwith) {
|
2021-02-24 21:19:47 -08:00
|
|
|
if (startwith >= _GP(game).numcursors)
|
2020-11-21 19:31:48 +00:00
|
|
|
startwith = 0;
|
|
|
|
int testing = startwith;
|
|
|
|
do {
|
|
|
|
if (is_standard_cursor_enabled(testing)) break;
|
|
|
|
testing++;
|
2021-02-24 21:19:47 -08:00
|
|
|
if (testing >= _GP(game).numcursors) testing = 0;
|
2020-11-21 19:31:48 +00:00
|
|
|
} while (testing != startwith);
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
if (testing != startwith)
|
|
|
|
set_cursor_mode(testing);
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
return testing;
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
int find_previous_enabled_cursor(int startwith) {
|
2020-11-21 19:31:48 +00:00
|
|
|
if (startwith < 0)
|
2021-02-24 21:19:47 -08:00
|
|
|
startwith = _GP(game).numcursors - 1;
|
2020-11-21 19:31:48 +00:00
|
|
|
int testing = startwith;
|
|
|
|
do {
|
|
|
|
if (is_standard_cursor_enabled(testing)) break;
|
|
|
|
testing--;
|
2021-02-24 21:19:47 -08:00
|
|
|
if (testing < 0) testing = _GP(game).numcursors - 1;
|
2020-11-21 19:31:48 +00:00
|
|
|
} while (testing != startwith);
|
2020-11-21 08:30:51 -08:00
|
|
|
|
2020-11-21 19:31:48 +00:00
|
|
|
if (testing != startwith)
|
|
|
|
set_cursor_mode(testing);
|
|
|
|
|
|
|
|
return testing;
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//=============================================================================
|
|
|
|
//
|
|
|
|
// Script API Functions
|
|
|
|
//
|
|
|
|
//=============================================================================
|
|
|
|
|
|
|
|
// void (int curs, int newslot)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_ChangeCursorGraphic(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT2(ChangeCursorGraphic);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void (int curs, int x, int y)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_ChangeCursorHotspot(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT3(ChangeCursorHotspot);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void (int curs, int newview)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_Mouse_ChangeModeView(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT2(Mouse_ChangeModeView);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void (int modd)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_disable_cursor_mode(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT(disable_cursor_mode);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void (int modd)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_enable_cursor_mode(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT(enable_cursor_mode);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// int (int curs)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_Mouse_GetModeGraphic(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_INT_PINT(Mouse_GetModeGraphic);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// int (int which)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_IsButtonDown(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_INT_PINT(IsButtonDown);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// int (int which)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_IsModeEnabled(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_INT_PINT(IsModeEnabled);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void ();
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_SaveCursorForLocationChange(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID(SaveCursorForLocationChange);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void ()
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_SetNextCursor(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID(SetNextCursor);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void ()
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_SetPreviousCursor(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID(SetPreviousCursor);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void (int x1, int y1, int x2, int y2)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_SetMouseBounds(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT4(SetMouseBounds);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void (int newx, int newy)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_SetMousePosition(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT2(SetMousePosition);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void ()
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_RefreshMouse(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID(RefreshMouse);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void ()
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_set_default_cursor(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID(set_default_cursor);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void (int newcurs)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_set_mouse_cursor(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT(set_mouse_cursor);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// int ()
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_GetCursorMode(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_INT(GetCursorMode);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void (int newmode)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_set_cursor_mode(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT(set_cursor_mode);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// int ()
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_Mouse_GetVisible(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_INT(Mouse_GetVisible);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// void (int isOn)
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_Mouse_SetVisible(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT(Mouse_SetVisible);
|
|
|
|
}
|
|
|
|
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_Mouse_Click(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PINT(PluginSimulateMouseClick);
|
|
|
|
}
|
|
|
|
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_Mouse_GetControlEnabled(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_BOOL(Mouse::IsControlEnabled);
|
|
|
|
}
|
|
|
|
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_Mouse_SetControlEnabled(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_VOID_PBOOL(Mouse_EnableControl);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_Mouse_GetSpeed(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
API_SCALL_FLOAT(Mouse::GetSpeed);
|
|
|
|
}
|
|
|
|
|
2021-02-16 19:45:02 -08:00
|
|
|
RuntimeScriptValue Sc_Mouse_SetSpeed(const RuntimeScriptValue *params, int32_t param_count) {
|
2020-11-21 19:31:48 +00:00
|
|
|
ASSERT_VARIABLE_VALUE("Mouse::Speed");
|
|
|
|
Mouse::SetSpeed(params[0].FValue);
|
|
|
|
return RuntimeScriptValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
void RegisterMouseAPI() {
|
2020-11-21 16:24:18 -08:00
|
|
|
ccAddExternalStaticFunction("Mouse::ChangeModeGraphic^2", Sc_ChangeCursorGraphic);
|
|
|
|
ccAddExternalStaticFunction("Mouse::ChangeModeHotspot^3", Sc_ChangeCursorHotspot);
|
|
|
|
ccAddExternalStaticFunction("Mouse::ChangeModeView^2", Sc_Mouse_ChangeModeView);
|
|
|
|
ccAddExternalStaticFunction("Mouse::Click^1", Sc_Mouse_Click);
|
|
|
|
ccAddExternalStaticFunction("Mouse::DisableMode^1", Sc_disable_cursor_mode);
|
|
|
|
ccAddExternalStaticFunction("Mouse::EnableMode^1", Sc_enable_cursor_mode);
|
|
|
|
ccAddExternalStaticFunction("Mouse::GetModeGraphic^1", Sc_Mouse_GetModeGraphic);
|
|
|
|
ccAddExternalStaticFunction("Mouse::IsButtonDown^1", Sc_IsButtonDown);
|
|
|
|
ccAddExternalStaticFunction("Mouse::IsModeEnabled^1", Sc_IsModeEnabled);
|
2020-11-21 19:31:48 +00:00
|
|
|
ccAddExternalStaticFunction("Mouse::SaveCursorUntilItLeaves^0", Sc_SaveCursorForLocationChange);
|
2020-11-21 16:24:18 -08:00
|
|
|
ccAddExternalStaticFunction("Mouse::SelectNextMode^0", Sc_SetNextCursor);
|
|
|
|
ccAddExternalStaticFunction("Mouse::SelectPreviousMode^0", Sc_SetPreviousCursor);
|
|
|
|
ccAddExternalStaticFunction("Mouse::SetBounds^4", Sc_SetMouseBounds);
|
|
|
|
ccAddExternalStaticFunction("Mouse::SetPosition^2", Sc_SetMousePosition);
|
|
|
|
ccAddExternalStaticFunction("Mouse::Update^0", Sc_RefreshMouse);
|
|
|
|
ccAddExternalStaticFunction("Mouse::UseDefaultGraphic^0", Sc_set_default_cursor);
|
|
|
|
ccAddExternalStaticFunction("Mouse::UseModeGraphic^1", Sc_set_mouse_cursor);
|
|
|
|
ccAddExternalStaticFunction("Mouse::get_ControlEnabled", Sc_Mouse_GetControlEnabled);
|
|
|
|
ccAddExternalStaticFunction("Mouse::set_ControlEnabled", Sc_Mouse_SetControlEnabled);
|
|
|
|
ccAddExternalStaticFunction("Mouse::get_Mode", Sc_GetCursorMode);
|
|
|
|
ccAddExternalStaticFunction("Mouse::set_Mode", Sc_set_cursor_mode);
|
|
|
|
ccAddExternalStaticFunction("Mouse::get_Speed", Sc_Mouse_GetSpeed);
|
|
|
|
ccAddExternalStaticFunction("Mouse::set_Speed", Sc_Mouse_SetSpeed);
|
|
|
|
ccAddExternalStaticFunction("Mouse::get_Visible", Sc_Mouse_GetVisible);
|
|
|
|
ccAddExternalStaticFunction("Mouse::set_Visible", Sc_Mouse_SetVisible);
|
2020-11-21 19:31:48 +00:00
|
|
|
|
|
|
|
/* ----------------------- Registering unsafe exports for plugins -----------------------*/
|
|
|
|
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::ChangeModeGraphic^2", (void *)ChangeCursorGraphic);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::ChangeModeHotspot^3", (void *)ChangeCursorHotspot);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::ChangeModeView^2", (void *)Mouse_ChangeModeView);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::DisableMode^1", (void *)disable_cursor_mode);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::EnableMode^1", (void *)enable_cursor_mode);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::GetModeGraphic^1", (void *)Mouse_GetModeGraphic);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::IsButtonDown^1", (void *)IsButtonDown);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::IsModeEnabled^1", (void *)IsModeEnabled);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::SaveCursorUntilItLeaves^0", (void *)SaveCursorForLocationChange);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::SelectNextMode^0", (void *)SetNextCursor);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::SelectPreviousMode^0", (void *)SetPreviousCursor);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::SetBounds^4", (void *)SetMouseBounds);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::SetPosition^2", (void *)SetMousePosition);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::Update^0", (void *)RefreshMouse);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::UseDefaultGraphic^0", (void *)set_default_cursor);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::UseModeGraphic^1", (void *)set_mouse_cursor);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::get_Mode", (void *)GetCursorMode);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::set_Mode", (void *)set_cursor_mode);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::get_Visible", (void *)Mouse_GetVisible);
|
|
|
|
ccAddExternalFunctionForPlugin("Mouse::set_Visible", (void *)Mouse_SetVisible);
|
2020-11-21 08:30:51 -08:00
|
|
|
}
|
2020-11-21 16:24:18 -08:00
|
|
|
|
|
|
|
} // namespace AGS3
|