Mobile: When flying/noclip is enabled, change the 'jump' button to two separate 'up' and 'down' buttons

This commit is contained in:
UnknownShadow200 2020-10-25 23:55:46 +11:00
parent 58a9b57e79
commit e777be1e90

View File

@ -1886,32 +1886,78 @@ void DisconnectScreen_Show(const cc_string* title, const cc_string* message) {
*--------------------------------------------------------TouchScreen------------------------------------------------------*
*#########################################################################################################################*/
#ifdef CC_BUILD_TOUCH
#define TOUCH_NUM_BTNS 3
static struct TouchScreen {
Screen_Body
cc_uint8 binds[TOUCH_NUM_BTNS];
struct FontDesc font;
struct ThumbstickWidget thumbstick;
struct ButtonWidget btns[TOUCH_NUM_BTNS];
} TouchScreen;
static struct Widget* touch_widgets[4] = {
(struct Widget*)&TouchScreen.thumbstick, (struct Widget*)&TouchScreen.btns[0],
(struct Widget*)&TouchScreen.btns[1], (struct Widget*)&TouchScreen.btns[2]
};
#define TOUCH_MAX_VERTICES (THUMBSTICKWIDGET_MAX + TOUCH_NUM_BTNS * BUTTONWIDGET_MAX)
static const struct TouchBindDesc {
#define TOUCH_MAX_BTNS 4
struct TouchBindDesc {
const char* text;
cc_uint8 bind, width;
cc_int16 x, y;
MenuClick OnClick;
} touchDescs[TOUCH_NUM_BTNS] = {
{ "Jump", KEYBIND_JUMP, 100, 50, 90 },
{ "", KEYBIND_COUNT, 100, 50, 50 },
{ "More", KEYBIND_COUNT, 100, 50, 10 },
Widget_LeftClick OnClick;
};
static struct TouchScreen {
Screen_Body
const struct TouchBindDesc* descs;
int numDescs;
struct FontDesc font;
struct ThumbstickWidget thumbstick;
struct ButtonWidget btns[TOUCH_MAX_BTNS];
} TouchScreen;
static struct Widget* touch_widgets[1 + TOUCH_MAX_BTNS] = {
(struct Widget*)&TouchScreen.thumbstick, (struct Widget*)&TouchScreen.btns[0],
(struct Widget*)&TouchScreen.btns[1], (struct Widget*)&TouchScreen.btns[2],
(struct Widget*)&TouchScreen.btns[3]
};
#define TOUCH_MAX_VERTICES (THUMBSTICKWIDGET_MAX + TOUCH_MAX_BTNS * BUTTONWIDGET_MAX)
static void TouchScreen_UpdateModeText(void* screen);
static void TouchScreen_ModeClick(void* s, void* w) {
Input_Placing = !Input_Placing;
TouchScreen_UpdateModeText(s);
}
static void TouchScreen_MoreClick(void* s, void* w) { TouchMoreScreen_Show(); }
static const struct TouchBindDesc normDescs[3] = {
{ "Jump", KEYBIND_JUMP, 100, 50, 90, NULL },
{ "", KEYBIND_COUNT, 100, 50, 50, TouchScreen_ModeClick },
{ "More", KEYBIND_COUNT, 100, 50, 10, TouchScreen_MoreClick },
};
static const struct TouchBindDesc hackDescs[4] = {
{ "Up", KEYBIND_FLY_UP, 100, 50, 130, NULL },
{ "Down", KEYBIND_FLY_DOWN, 100, 50, 90, NULL },
{ "", KEYBIND_COUNT, 100, 50, 50, TouchScreen_ModeClick },
{ "More", KEYBIND_COUNT, 100, 50, 10, TouchScreen_MoreClick },
};
static void TouchScreen_InitButtons(struct TouchScreen* s) {
struct HacksComp* hacks = &LocalPlayer_Instance.Hacks;
const struct TouchBindDesc* desc;
int i;
if (hacks->Flying || hacks->Noclip) {
s->descs = hackDescs;
s->numDescs = Array_Elems(hackDescs);
} else {
s->descs = normDescs;
s->numDescs = Array_Elems(normDescs);
}
s->numWidgets = 1 + s->numDescs;
for (i = 0; i < s->numDescs; i++) {
desc = &s->descs[i];
ButtonWidget_Init(&s->btns[i], desc->width, desc->OnClick);
}
}
static void TouchScreen_HacksChanged(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen;
/* InitButtons changes number of widgets, hence */
/* must destroy graphics resources BEFORE that */
Screen_ContextLost(s);
TouchScreen_InitButtons(s);
Gui_Refresh(s);
}
static void TouchScreen_ContextLost(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen;
Font_Free(&s->font);
@ -1920,15 +1966,10 @@ static void TouchScreen_ContextLost(void* screen) {
static void TouchScreen_UpdateModeText(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen;
ButtonWidget_SetConst(&s->btns[1], Input_Placing ? "Place" : "Delete", &s->font);
ButtonWidget_SetConst(&s->btns[s->numDescs - 2],
Input_Placing ? "Place" : "Delete", &s->font);
}
static void TouchScreen_ModeClick(void* s, void* w) {
Input_Placing = !Input_Placing;
TouchScreen_UpdateModeText(s);
}
static void TouchScreen_MoreClick(void* s, void* w) { TouchMoreScreen_Show(); }
static void TouchScreen_ContextRecreated(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen;
const struct TouchBindDesc* desc;
@ -1936,8 +1977,8 @@ static void TouchScreen_ContextRecreated(void* screen) {
Screen_CreateVb(screen);
Drawer2D_MakeFont(&s->font, 16, FONT_FLAGS_BOLD);
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
desc = &touchDescs[i];
for (i = 0; i < s->numDescs; i++) {
desc = &s->descs[i];
ButtonWidget_SetConst(&s->btns[i], desc->text, &s->font);
}
TouchScreen_UpdateModeText(s);
@ -1962,11 +2003,11 @@ static int TouchScreen_PointerDown(void* screen, int id, int x, int y) {
s->thumbstick.active |= id; return true;
}
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
for (i = 0; i < s->numDescs; i++) {
if (!Widget_Contains(&s->btns[i], x, y)) continue;
if (s->binds[i] < KEYBIND_COUNT) {
Input_SetPressed(KeyBinds[s->binds[i]], true);
if (s->descs[i].bind < KEYBIND_COUNT) {
Input_SetPressed(KeyBinds[s->descs[i].bind], true);
} else {
s->btns[i].MenuClick(screen, &s->btns[i]);
}
@ -1982,11 +2023,11 @@ static int TouchScreen_PointerUp(void* screen, int id, int x, int y) {
//Chat_Add1("POINTER UP: %i", &id);
s->thumbstick.active &= ~id;
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
for (i = 0; i < s->numDescs; i++) {
if (!(s->btns[i].active & id)) continue;
if (s->binds[i] < KEYBIND_COUNT) {
Input_SetPressed(KeyBinds[s->binds[i]], false);
if (s->descs[i].bind < KEYBIND_COUNT) {
Input_SetPressed(KeyBinds[s->descs[i].bind], false);
}
s->btns[i].active &= ~id;
return true;
@ -2001,33 +2042,28 @@ static void TouchScreen_GetMovement(float* xMoving, float* zMoving) {
struct LocalPlayerInput touchInput;
static void TouchScreen_Init(void* screen) {
struct TouchScreen* s = (struct TouchScreen*)screen;
int i;
s->widgets = touch_widgets;
s->numWidgets = Array_Elems(touch_widgets);
s->maxVertices = TOUCH_MAX_VERTICES;
Event_Register_(&UserEvents.HacksStateChanged, screen, TouchScreen_HacksChanged);
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
ButtonWidget_Init(&s->btns[i], touchDescs[i].width, touchDescs[i].OnClick);
s->binds[i] = touchDescs[i].bind;
}
TouchScreen_InitButtons(s);
ThumbstickWidget_Init(&s->thumbstick);
touchInput.GetMovement = TouchScreen_GetMovement;
LocalPlayer_Instance.input.next = &touchInput;
}
static void TouchScreen_Layout(void* screen) {
struct TouchScreen* s;
struct TouchScreen* s = (struct TouchScreen*)screen;
const struct TouchBindDesc* desc;
int i, height;
s = (struct TouchScreen*)screen;
HUDScreen_Layout(Gui_HUD);
height = Gui_HUD->hotbar.height;
for (i = 0; i < TOUCH_NUM_BTNS; i++) {
Widget_SetLocation(&s->btns[i], ANCHOR_MAX, ANCHOR_MAX,
touchDescs[i].x, touchDescs[i].y);
for (i = 0; i < s->numDescs; i++) {
desc = &s->descs[i];
Widget_SetLocation(&s->btns[i], ANCHOR_MAX, ANCHOR_MAX, desc->x, desc->y);
s->btns[i].yOffset += height;
Widget_Layout(&s->btns[i]);
}
@ -2035,8 +2071,12 @@ static void TouchScreen_Layout(void* screen) {
Widget_SetLocation(&s->thumbstick, ANCHOR_MIN, ANCHOR_MAX, 30, 70);
}
static void TouchScreen_Free(void* s) {
Event_Unregister_(&UserEvents.HacksStateChanged, s, TouchScreen_HacksChanged);
}
static const struct ScreenVTABLE TouchScreen_VTABLE = {
TouchScreen_Init, Screen_NullUpdate, Screen_NullFunc,
TouchScreen_Init, Screen_NullUpdate, TouchScreen_Free,
TouchScreen_Render, Screen_BuildMesh,
Screen_FInput, Screen_FInput, Screen_FKeyPress, Screen_FText,
TouchScreen_PointerDown, TouchScreen_PointerUp, Screen_FPointer, Screen_FMouseScroll,