diff --git a/src/Screens.c b/src/Screens.c index 0ab31d598..cc567af76 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -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,