diff --git a/ClassicalSharp/2D/Screens/DeathScreen.cs b/ClassicalSharp/2D/Screens/DeathScreen.cs index b7d6efdfd..320bdd919 100644 --- a/ClassicalSharp/2D/Screens/DeathScreen.cs +++ b/ClassicalSharp/2D/Screens/DeathScreen.cs @@ -11,16 +11,15 @@ namespace ClassicalSharp.Gui.Screens { } public override void Init() { + textFont = new Font(game.FontName, 40); base.Init(); - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 40); ContextRecreated(); } protected override void ContextRecreated() { string score = game.Chat.Status1.Text; widgets = new Widget[] { - TextWidget.Create(game, "Game over!", regularFont) + TextWidget.Create(game, "Game over!", textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, -150), TextWidget.Create(game, score, titleFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, -75), diff --git a/ClassicalSharp/2D/Screens/Menu/EditHotkeyScreen.cs b/ClassicalSharp/2D/Screens/Menu/EditHotkeyScreen.cs index 8304ee61e..187ec9e1e 100644 --- a/ClassicalSharp/2D/Screens/Menu/EditHotkeyScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/EditHotkeyScreen.cs @@ -51,8 +51,6 @@ namespace ClassicalSharp.Gui.Screens { public override void Init() { base.Init(); game.Keyboard.KeyRepeat = true; - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 16); ContextRecreated(); } @@ -63,18 +61,18 @@ namespace ClassicalSharp.Gui.Screens { bool existed = origHotkey.BaseKey != Key.Unknown; InputWidget input; - input = MenuInputWidget.Create(game, 500, 30, curHotkey.Text, regularFont, new StringValidator()) + input = MenuInputWidget.Create(game, 500, 30, curHotkey.Text, textFont, new StringValidator()) .SetLocation(Anchor.Centre, Anchor.Centre, 0, -35); input.ShowCaret = true; widgets = new Widget[] { - Make(0, -150, "Key: " + curHotkey.BaseKey, 300, titleFont, BaseKeyClick), - Make(0, -100, "Modifiers:" + flags, 300, titleFont, ModifiersClick), + Make(0, -150, "Key: " + curHotkey.BaseKey, BaseKeyClick), + Make(0, -100, "Modifiers:" + flags, ModifiersClick), input, - Make(-100, 10, "Input stays open: " + staysOpen, 300, titleFont, LeaveOpenClick), + Make(-100, 10, "Input stays open: " + staysOpen, LeaveOpenClick), - Make(0, 80, existed ? "Save changes" : "Add hotkey", 300, titleFont, SaveChangesClick), - Make(0, 130, existed ? "Remove hotkey" : "Cancel", 300, titleFont, RemoveHotkeyClick), + Make(0, 80, existed ? "Save changes" : "Add hotkey", SaveChangesClick), + Make(0, 130, existed ? "Remove hotkey" : "Cancel", RemoveHotkeyClick), MakeBack(false, titleFont, SwitchPause), }; } @@ -85,8 +83,8 @@ namespace ClassicalSharp.Gui.Screens { base.Dispose(); } - ButtonWidget Make(int x, int y, string text, int width, Font font, ClickHandler onClick) { - return ButtonWidget.Create(game, width, text, font, onClick) + ButtonWidget Make(int x, int y, string text, ClickHandler onClick) { + return ButtonWidget.Create(game, 300, text, titleFont, onClick) .SetLocation(Anchor.Centre, Anchor.Centre, x, y); } diff --git a/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs b/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs index 41ed8016e..bbb757908 100644 --- a/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/GenLevelScreen.cs @@ -30,8 +30,6 @@ namespace ClassicalSharp.Gui.Screens { public override void Init() { base.Init(); game.Keyboard.KeyRepeat = true; - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 16); ContextRecreated(); } @@ -44,7 +42,7 @@ namespace ClassicalSharp.Gui.Screens { MakeLabel(-150, -80, "Width:"), MakeLabel(-150, -40, "Height:"), MakeLabel(-150, 0, "Length:"), MakeLabel(-140, 40, "Seed:"), - TextWidget.Create(game, "Generate new level", regularFont) + TextWidget.Create(game, "Generate new level", textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, -130), ButtonWidget.Create(game, 200, "Flatgrass", titleFont, GenFlatgrassClick) @@ -58,7 +56,7 @@ namespace ClassicalSharp.Gui.Screens { InputWidget MakeInput(int y, bool seed, string value) { MenuInputValidator validator = seed ? new SeedValidator() : new IntegerValidator(1, 8192); InputWidget input = MenuInputWidget.Create(game, 200, 30, value, - regularFont, validator) + textFont, validator) .SetLocation(Anchor.Centre, Anchor.Centre, 0, y); input.Active = false; @@ -67,7 +65,7 @@ namespace ClassicalSharp.Gui.Screens { } TextWidget MakeLabel(int x, int y, string text) { - TextWidget label = TextWidget.Create(game, text, regularFont) + TextWidget label = TextWidget.Create(game, text, textFont) .SetLocation(Anchor.Centre, Anchor.Centre, x, y); label.XOffset = -110 - label.Width / 2; @@ -135,23 +133,23 @@ namespace ClassicalSharp.Gui.Screens { public override void Init() { base.Init(); - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 16); ContextRecreated(); } protected override void ContextRecreated() { widgets = new Widget[] { - ButtonWidget.Create(game, 400, "Small", titleFont, GenSmallClick) - .SetLocation(Anchor.Centre, Anchor.Centre, 0, -100), - ButtonWidget.Create(game, 400, "Normal", titleFont, GenMediumClick) - .SetLocation(Anchor.Centre, Anchor.Centre, 0, -50), - ButtonWidget.Create(game, 400, "Huge", titleFont, GenHugeClick) - .SetLocation(Anchor.Centre, Anchor.Centre, 0, 0), + Make(-100, "Small", GenSmallClick), + Make( -50, "Normal", GenMediumClick), + Make( 0, "Huge", GenHugeClick), MakeBack(false, titleFont, SwitchPause), }; } + ButtonWidget Make(int y, string text, ClickHandler onClick) { + return ButtonWidget.Create(game, 400, text, titleFont, onClick) + .SetLocation(Anchor.Centre, Anchor.Centre, 0, y); + } + void GenSmallClick(Game game, Widget widget) { DoGen(128); } void GenMediumClick(Game game, Widget widget) { DoGen(256); } void GenHugeClick(Game game, Widget widget) { DoGen(512); } diff --git a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs index 1422928ba..682a2fe8f 100644 --- a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreen.cs @@ -20,12 +20,10 @@ namespace ClassicalSharp.Gui.Screens { protected ClickHandler leftPage, rightPage; public override void Init() { - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 16); - base.Init(); - - if (keyNames == null) + base.Init(); + if (keyNames == null) { keyNames = Enum.GetNames(typeof(Key)); + } } protected void MakeWidgets(int y, int arrowsY) { diff --git a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs index f938661bd..82e052300 100644 --- a/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs +++ b/ClassicalSharp/2D/Screens/Menu/KeyBindingsScreens.cs @@ -163,7 +163,7 @@ namespace ClassicalSharp.Gui.Screens { widgets = new Widget[binds.Length + 5]; MakeWidgets(-40, 10); - widgets[index++] = TextWidget.Create(game, "&eRight click to remove the key binding", regularFont) + widgets[index++] = TextWidget.Create(game, "&eRight click to remove the key binding", textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, 100); } } diff --git a/ClassicalSharp/2D/Screens/Menu/MenuOptionsScreen.cs b/ClassicalSharp/2D/Screens/Menu/MenuOptionsScreen.cs index f7637e0ad..785d8084c 100644 --- a/ClassicalSharp/2D/Screens/Menu/MenuOptionsScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/MenuOptionsScreen.cs @@ -35,8 +35,6 @@ namespace ClassicalSharp.Gui.Screens { public override void Init() { base.Init(); - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 16); game.Keyboard.KeyRepeat = true; } @@ -143,7 +141,7 @@ namespace ClassicalSharp.Gui.Screens { const int extHelpY = 100; void MakeExtendedHelp(string[] desc) { - extendedHelp = new TextGroupWidget(game, desc.Length, regularFont, null) + extendedHelp = new TextGroupWidget(game, desc.Length, textFont, null) .SetLocation(Anchor.Min, Anchor.Min, 0, 0); extendedHelp.Init(); for (int i = 0; i < desc.Length; i++) @@ -185,7 +183,7 @@ namespace ClassicalSharp.Gui.Screens { activeButton = button; InputClosed(); - input = MenuInputWidget.Create(game, 400, 30, button.GetValue(game), regularFont, validator) + input = MenuInputWidget.Create(game, 400, 30, button.GetValue(game), textFont, validator) .SetLocation(Anchor.Centre, Anchor.Centre, 0, 110); input.ShowCaret = true; diff --git a/ClassicalSharp/2D/Screens/Menu/MenuScreen.cs b/ClassicalSharp/2D/Screens/Menu/MenuScreen.cs index 1b8cb4398..c0a0fd774 100644 --- a/ClassicalSharp/2D/Screens/Menu/MenuScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/MenuScreen.cs @@ -11,7 +11,7 @@ namespace ClassicalSharp.Gui.Screens { HandlesAllInput = true; } protected Widget[] widgets; - protected Font titleFont, regularFont; + protected Font titleFont, textFont; protected int IndexOfWidget(Widget w) { for (int i = 0; i < widgets.Length; i++) { @@ -28,6 +28,9 @@ namespace ClassicalSharp.Gui.Screens { } public override void Init() { + if (titleFont == null) titleFont = new Font(game.FontName, 16, FontStyle.Bold); + if (textFont == null) textFont = new Font(game.FontName, 16); + game.Graphics.ContextLost += ContextLost; game.Graphics.ContextRecreated += ContextRecreated; } @@ -35,7 +38,7 @@ namespace ClassicalSharp.Gui.Screens { public override void Dispose() { ContextLost(); if (titleFont != null) titleFont.Dispose(); - if (regularFont != null) regularFont.Dispose(); + if (textFont != null) textFont.Dispose(); game.Graphics.ContextLost -= ContextLost; game.Graphics.ContextRecreated -= ContextRecreated; diff --git a/ClassicalSharp/2D/Screens/Menu/NostalgiaScreen.cs b/ClassicalSharp/2D/Screens/Menu/NostalgiaScreen.cs index b86bf562d..809e56447 100644 --- a/ClassicalSharp/2D/Screens/Menu/NostalgiaScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/NostalgiaScreen.cs @@ -40,7 +40,7 @@ namespace ClassicalSharp.Gui.Screens { MakeOpt(1, -100, "Use CPE", onClick, GetCPE, SetCPE), MakeOpt(1, -50, "Use server textures", onClick, GetTexs, SetTexs), - TextWidget.Create(game, "&eButtons on the right require restarting game", regularFont) + TextWidget.Create(game, "&eButtons on the right require restarting game", textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, 100), MakeBack(false, titleFont, SwitchBack), null, null, diff --git a/ClassicalSharp/2D/Screens/Menu/OptionsGroupScreen.cs b/ClassicalSharp/2D/Screens/Menu/OptionsGroupScreen.cs index 61a56653e..78205f442 100644 --- a/ClassicalSharp/2D/Screens/Menu/OptionsGroupScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/OptionsGroupScreen.cs @@ -15,8 +15,6 @@ namespace ClassicalSharp.Gui.Screens { public override void Init() { base.Init(); game.Events.HackPermissionsChanged += CheckHacksAllowed; - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 16); ContextRecreated(); } @@ -51,7 +49,7 @@ namespace ClassicalSharp.Gui.Screens { void MakeDesc() { string text = descriptions[selectedI]; - widgets[widgets.Length - 1] = TextWidget.Create(game, text, regularFont) + widgets[widgets.Length - 1] = TextWidget.Create(game, text, textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, 100); } diff --git a/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs b/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs index 77a82a165..14692c02d 100644 --- a/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/PauseScreen.cs @@ -12,7 +12,6 @@ namespace ClassicalSharp.Gui.Screens { public override void Init() { base.Init(); - titleFont = new Font(game.FontName, 16, FontStyle.Bold); game.Events.HackPermissionsChanged += CheckHacksAllowed; ContextRecreated(); } diff --git a/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs b/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs index 6d1407d07..9eabcc30f 100644 --- a/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs +++ b/ClassicalSharp/2D/Screens/Menu/SaveLevelScreen.cs @@ -49,8 +49,6 @@ namespace ClassicalSharp.Gui.Screens { public override void Init() { base.Init(); game.Keyboard.KeyRepeat = true; - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 16); ContextRecreated(); } @@ -60,7 +58,7 @@ namespace ClassicalSharp.Gui.Screens { } protected override void ContextRecreated() { - input = MenuInputWidget.Create(game, 500, 30, "", regularFont, new PathValidator()) + input = MenuInputWidget.Create(game, 500, 30, "", textFont, new PathValidator()) .SetLocation(Anchor.Centre, Anchor.Centre, 0, -30); input.ShowCaret = true; @@ -69,7 +67,7 @@ namespace ClassicalSharp.Gui.Screens { .SetLocation(Anchor.Centre, Anchor.Centre, 0, 20), ButtonWidget.Create(game, 200, "Save schematic", titleFont, SaveSchematic) .SetLocation(Anchor.Centre, Anchor.Centre, -150, 120), - TextWidget.Create(game, "&eCan be imported into MCEdit", regularFont) + TextWidget.Create(game, "&eCan be imported into MCEdit", textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 110, 120), MakeBack(false, titleFont, SwitchPause), input, @@ -143,7 +141,7 @@ namespace ClassicalSharp.Gui.Screens { void MakeDescWidget(string text) { DisposeDescWidget(); - desc = TextWidget.Create(game, text, regularFont) + desc = TextWidget.Create(game, text, textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, 65); } diff --git a/ClassicalSharp/2D/Screens/Overlays/Overlay.cs b/ClassicalSharp/2D/Screens/Overlays/Overlay.cs index eae2e9716..fa9fbafa9 100644 --- a/ClassicalSharp/2D/Screens/Overlays/Overlay.cs +++ b/ClassicalSharp/2D/Screens/Overlays/Overlay.cs @@ -16,10 +16,7 @@ namespace ClassicalSharp.Gui.Screens { public Overlay(Game game) : base(game) { } public override void Init() { - base.Init(); - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 16); - + base.Init(); if (game.Graphics.LostContext) return; MakeButtons(); RedrawText(); @@ -73,7 +70,7 @@ namespace ClassicalSharp.Gui.Screens { for (int i = 1; i < 4; i++) { if (lines[i] == null) continue; - labels[i] = TextWidget.Create(game, lines[i], regularFont) + labels[i] = TextWidget.Create(game, lines[i], textFont) .SetLocation(Anchor.Centre, Anchor.Centre, 0, -70 + 20 * i); labels[i].Colour = new FastColour(224, 224, 224); } diff --git a/ClassicalSharp/2D/Screens/Overlays/TexIdsOverlay.cs b/ClassicalSharp/2D/Screens/Overlays/TexIdsOverlay.cs index 70774f3c0..6e4268d9d 100644 --- a/ClassicalSharp/2D/Screens/Overlays/TexIdsOverlay.cs +++ b/ClassicalSharp/2D/Screens/Overlays/TexIdsOverlay.cs @@ -17,12 +17,11 @@ namespace ClassicalSharp.Gui.Screens { int dynamicVb; public override void Init() { + textFont = new Font(game.FontName, 8); base.Init(); if (vertices == null) { vertices = new VertexP3fT2fC4b[verticesCount]; } - regularFont.Dispose(); - regularFont = new Font(game.FontName, 8); ContextRecreated(); } @@ -55,7 +54,7 @@ namespace ClassicalSharp.Gui.Screens { base.ContextRecreated(); dynamicVb = game.Graphics.CreateDynamicVb(VertexFormat.P3fT2fC4b, verticesCount); idAtlas = new TextAtlas(game, 16); - idAtlas.Pack("0123456789", regularFont, "f"); + idAtlas.Pack("0123456789", textFont, "f"); UpdateTileSize(); } diff --git a/ClassicalSharp/Rendering/Env/WeatherRenderer.cs b/ClassicalSharp/Rendering/Env/WeatherRenderer.cs index 19f8e62f3..0b6a65d19 100644 --- a/ClassicalSharp/Rendering/Env/WeatherRenderer.cs +++ b/ClassicalSharp/Rendering/Env/WeatherRenderer.cs @@ -77,14 +77,14 @@ namespace ClassicalSharp.Renderers { float x2 = x + 1, y2 = y + height, z2 = z + 1; v.X = x1; v.Y = y1; v.Z = z1; v.U = 0; v.V = v1; vertices[vCount++] = v; - v.Y = y2; v.V = v2; vertices[vCount++] = v; + v.Y = y2; v.V = v2; vertices[vCount++] = v; v.X = x2; v.Z = z2; v.U = 1; vertices[vCount++] = v; - v.Y = y1; v.V = v1; vertices[vCount++] = v; + v.Y = y1; v.V = v1; vertices[vCount++] = v; v.Z = z1; vertices[vCount++] = v; - v.Y = y2; v.V = v2; vertices[vCount++] = v; + v.Y = y2; v.V = v2; vertices[vCount++] = v; v.X = x1; v.Z = z2; v.U = 0; vertices[vCount++] = v; - v.Y = y1; v.V = v1; vertices[vCount++] = v; + v.Y = y1; v.V = v1; vertices[vCount++] = v; } if (particles && (rainAcc >= 0.25 || moved)) { rainAcc = 0; diff --git a/src/Client/Input.c b/src/Client/Input.c index 5a932f5d4..967eb9528 100644 --- a/src/Client/Input.c +++ b/src/Client/Input.c @@ -263,7 +263,7 @@ bool Hotkeys_IsHotkey(Key key, STRING_TRANSIENT String* text, bool* moreInput) { UInt8 flags = 0; if (Key_IsControlPressed()) flags |= HOTKEYS_FLAG_CTRL; if (Key_IsShiftPressed()) flags |= HOTKEYS_FLAG_SHIFT; - if (Key_IsAltPressed()) flags |= HOTKEYS_FLAT_ALT; + if (Key_IsAltPressed()) flags |= HOTKEYS_FLAG_ALT; String_Clear(text); *moreInput = false; diff --git a/src/Client/Input.h b/src/Client/Input.h index dc6e303b4..b9cfffeaa 100644 --- a/src/Client/Input.h +++ b/src/Client/Input.h @@ -129,7 +129,7 @@ HotkeyData HotkeysList[HOTKEYS_MAX_COUNT]; StringsBuffer HotkeysText; #define HOTKEYS_FLAG_CTRL 1 #define HOTKEYS_FLAG_SHIFT 2 -#define HOTKEYS_FLAT_ALT 4 +#define HOTKEYS_FLAG_ALT 4 void Hotkeys_Add(Key baseKey, UInt8 flags, STRING_PURE String* text, bool more); bool Hotkeys_Remove(Key baseKey, UInt8 flags); diff --git a/src/Client/Menus.c b/src/Client/Menus.c index 857863a57..faed7b986 100644 --- a/src/Client/Menus.c +++ b/src/Client/Menus.c @@ -39,7 +39,7 @@ typedef void (*Menu_ContextRecreated)(GuiElement* elem); Screen_Layout \ Widget** WidgetsPtr; \ Int32 WidgetsCount; \ -FontDesc TitleFont, RegularFont; \ +FontDesc TitleFont, TextFont; \ Menu_ContextRecreated ContextRecreated; typedef struct MenuScreen_ { MenuScreen_Layout } MenuScreen; @@ -58,6 +58,23 @@ typedef struct OptionsGroupScreen_ { Int32 SelectedI; } OptionsGroupScreen; +typedef struct DeathScreen_ { + MenuScreen_Layout + Widget* Widgets[4]; + TextWidget Title, Score; + ButtonWidget Gen, Load; +} DeathScreen; + +typedef struct EditHotkeyScreen_ { + MenuScreen_Layout + HotkeyData CurHotkey, OrigHotkey; + Int32 SelectedI; + bool SupressNextPress; + MenuInputWidget Input; + ButtonWidget Buttons[6]; + Widget* Widgets[7]; +} EditHotkeyScreen; + void Menu_FreeWidgets(Widget** widgets, Int32 widgetsCount) { if (widgets == NULL) return; @@ -338,7 +355,7 @@ bool MenuScreen_HandlesMouseMove(GuiElement* elem, Int32 x, Int32 y) { MenuScreen* screen = (MenuScreen*)elem; return Menu_HandleMouseMove(screen->WidgetsPtr, screen->WidgetsCount, x, y) >= 0; } -bool MenuScreen_HandlesMouseMove(GuiElement* elem, Int32 x, Int32 y, MouseButton btn) { return true; } +bool MenuScreen_HandlesMouseUp(GuiElement* elem, Int32 x, Int32 y, MouseButton btn) { return true; } bool MenuScreen_HandlesMouseScroll(GuiElement* elem, Real32 delta) { return true; } bool MenuScreen_HandlesKeyDown(GuiElement* elem, Key key) { @@ -360,6 +377,14 @@ void MenuScreen_ContextRecreated(void* obj) { void MenuScreen_Init(GuiElement* elem) { MenuScreen* screen = (MenuScreen*)elem; + + if (screen->TitleFont.Handle == NULL) { + Platform_MakeFont(&screen->TitleFont, &Game_FontName, 16, FONT_STYLE_BOLD); + } + if (screen->TextFont.Handle == NULL) { + Platform_MakeFont(&screen->TextFont, &Game_FontName, 16, FONT_STYLE_NORMAL); + } + Event_RegisterVoid(&GfxEvents_ContextLost, screen, MenuScreen_ContextLost); Event_RegisterVoid(&GfxEvents_ContextRecreated, screen, MenuScreen_ContextRecreated); } @@ -379,8 +404,8 @@ void MenuScreen_Free(GuiElement* elem) { if (screen->TitleFont.Handle != NULL) { Platform_FreeFont(&screen->TitleFont); } - if (screen->RegularFont.Handle != NULL) { - Platform_FreeFont(&screen->RegularFont); + if (screen->TextFont.Handle != NULL) { + Platform_FreeFont(&screen->TextFont); } Event_UnregisterVoid(&GfxEvents_ContextLost, screen, MenuScreen_ContextLost); @@ -401,7 +426,7 @@ void MenuScreen_MakeInstance(MenuScreen* screen, Widget** widgets, Int32 count, screen->VTABLE->HandlesKeyUp = MenuScreen_HandlesKeyUp; screen->VTABLE->HandlesKeyPress = MenuScreen_HandlesKeyPress; screen->VTABLE->HandlesMouseDown = MenuScreen_HandlesMouseDown; - screen->VTABLE->HandlesMouseUp = MenuScreen_HandlesMouseMove; + screen->VTABLE->HandlesMouseUp = MenuScreen_HandlesMouseUp; screen->VTABLE->HandlesMouseMove = MenuScreen_HandlesMouseMove; screen->VTABLE->HandlesMouseScroll = MenuScreen_HandlesMouseScroll; @@ -422,16 +447,20 @@ void MenuScreen_MakeInstance(MenuScreen* screen, Widget** widgets, Int32 count, *#########################################################################################################################*/ GuiElementVTABLE PauseScreen_VTABLE; PauseScreen PauseScreen_Instance; -void PauseScreen_Make(PauseScreen* screen, Int32 i, Int32 dir, Int32 y, const UInt8* title, Widget_LeftClick onClick) { - String text = String_FromRaw(title, UInt16_MaxValue); +void PauseScreen_Make(PauseScreen* screen, Int32 i, Int32 dir, Int32 y, const UInt8* title, Widget_LeftClick onClick) { ButtonWidget* btn = &screen->Buttons[i]; + screen->Widgets[i] = (Widget*)btn; + + String text = String_FromReadonly(title); ButtonWidget_Create(btn, &text, 300, &screen->TitleFont, onClick); Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, dir * 160, y); } -void PauseScreen_MakeClassic(PauseScreen* screen, Int32 i, Int32 y, const UInt8* title, Widget_LeftClick onClick) { - String text = String_FromRaw(title, UInt16_MaxValue); +void PauseScreen_MakeClassic(PauseScreen* screen, Int32 i, Int32 y, const UInt8* title, Widget_LeftClick onClick) { ButtonWidget* btn = &screen->Buttons[i]; + screen->Widgets[i] = (Widget*)btn; + + String text = String_FromReadonly(title); ButtonWidget_Create(btn, &text, 400, &screen->TitleFont, onClick); Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, 0, y); } @@ -445,7 +474,7 @@ void PauseScreen_Hotkeys(GuiElement* a, GuiElement* b) { Gui_SetNewScre void PauseScreen_NostalgiaOptions(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(NostalgiaScreen_MakeInstance()); } void PauseScreen_Game(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(NULL); } void PauseScreen_ClassicOptions(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(ClassicOptionsScreen_MakeInstance()); } -void PauseScreen_QuitGame(GuiElement* a, GuiElement* b) { Window_Close(); } +void PauseScreen_Quit(GuiElement* a, GuiElement* b) { Window_Close(); } void PauseScreen_CheckHacksAllowed(void* obj) { if (Game_UseClassicOptions) return; @@ -455,10 +484,6 @@ void PauseScreen_CheckHacksAllowed(void* obj) { void PauseScreen_ContextRecreated(void* obj) { PauseScreen* screen = (PauseScreen*)obj; - Int32 i; - for (i = 0; i < Array_Elems(screen->Buttons); i++) { - screen->Widgets[i] = &screen->Buttons[i]; - } FontDesc* font = &screen->TitleFont; if (Game_UseClassicOptions) { @@ -469,7 +494,8 @@ void PauseScreen_ContextRecreated(void* obj) { PauseScreen_MakeClassic(screen, 4, 150, "Nostalgia options...", PauseScreen_NostalgiaOptions); String back = String_FromConst("Back to game"); - Menu_MakeBack(&screen->Buttons[5], 400, &back, 25, font, PauseScreen_QuitGame); + screen->Widgets[5] = (Widget*)(&screen->Buttons[5]); + Menu_MakeBack(&screen->Buttons[5], 400, &back, 25, font, PauseScreen_Game); /* Disable nostalgia options in classic mode*/ if (Game_ClassicMode) { screen->Widgets[4] = NULL; } @@ -484,9 +510,12 @@ void PauseScreen_ContextRecreated(void* obj) { PauseScreen_Make(screen, 5, -1, 50, "Hotkeys...", PauseScreen_Hotkeys); String quitMsg = String_FromConst("Quit game"); - ButtonWidget_Create(&screen->Buttons[6], &quitMsg, 120, font, PauseScreen_QuitGame); - Widget_SetLocation((Widget*)(&screen->Buttons[6]), ANCHOR_MAX, ANCHOR_MAX, 5, 5); - Menu_MakeDefaultBack(&screen->Buttons[7], true, font, PauseScreen_QuitGame); + screen->Widgets[6] = (Widget*)(&screen->Buttons[6]); + ButtonWidget_Create(&screen->Buttons[6], &quitMsg, 120, font, PauseScreen_Quit); + Widget_SetLocation(screen->Widgets[6], ANCHOR_MAX, ANCHOR_MAX, 5, 5); + + screen->Widgets[7] = (Widget*)(&screen->Buttons[7]); + Menu_MakeDefaultBack(&screen->Buttons[7], true, font, PauseScreen_Game); } if (!ServerConnection_IsSinglePlayer) { @@ -499,7 +528,6 @@ void PauseScreen_ContextRecreated(void* obj) { void PauseScreen_Init(GuiElement* elem) { PauseScreen* screen = (PauseScreen*)elem; MenuScreen_Init(elem); - Platform_MakeFont(&screen->TitleFont, &Game_FontName, 16, FONT_STYLE_BOLD); Event_RegisterVoid(&UserEvents_HackPermissionsChanged, screen, PauseScreen_CheckHacksAllowed); screen->ContextRecreated(elem); } @@ -518,7 +546,7 @@ Screen* PauseScreen_MakeInstance(void) { screen->VTABLE->Init = PauseScreen_Init; screen->VTABLE->Free = PauseScreen_Free; - return screen; + return (Screen*)screen; } @@ -542,17 +570,19 @@ void OptionsGroupScreen_CheckHacksAllowed(void* obj) { screen->Buttons[5].Disabled = !LocalPlayer_Instance.Hacks.CanAnyHacks; /* env settings */ } -void OptionsGroupScreen_Make(OptionsGroupScreen* screen, Int32 i, Int32 dir, Int32 y, const UInt8* title, Widget_LeftClick onClick) { - String text = String_FromRaw(title, UInt16_MaxValue); +void OptionsGroupScreen_Make(OptionsGroupScreen* screen, Int32 i, Int32 dir, Int32 y, const UInt8* title, Widget_LeftClick onClick) { ButtonWidget* btn = &screen->Buttons[i]; + screen->Widgets[i] = (Widget*)btn; + + String text = String_FromReadonly(title); ButtonWidget_Create(btn, &text, 300, &screen->TitleFont, onClick); Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, dir * 160, y); } void OptionsGroupScreen_MakeDesc(OptionsGroupScreen* screen) { - String text = String_FromRaw(optsGroup_descs[screen->SelectedI], UInt16_MaxValue); - screen->Widgets[8] = &screen->Desc; - TextWidget_Create(&screen->Desc, &text, &screen->RegularFont); + screen->Widgets[8] = (Widget*)(&screen->Desc); + String text = String_FromReadonly(optsGroup_descs[screen->SelectedI]); + TextWidget_Create(&screen->Desc, &text, &screen->TextFont); Widget_SetLocation((Widget*)(&screen->Desc), ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 100); } @@ -566,11 +596,6 @@ void OptionsGroupScreen_Nostalgia(GuiElement* a, GuiElement* b) { Gui_SetNewScre void OptionsGroupScreen_ContextRecreated(void* obj) { OptionsGroupScreen* screen = (OptionsGroupScreen*)obj; - Int32 i; - for (i = 0; i < Array_Elems(screen->Buttons); i++) { - screen->Widgets[i] = &screen->Buttons[i]; - } - screen->Widgets[8] = NULL; /* Description text widget placeholder */ OptionsGroupScreen_Make(screen, 0, -1, -100, "Misc options...", OptionsGroupScreen_Misc); OptionsGroupScreen_Make(screen, 1, -1, -50, "Gui options...", OptionsGroupScreen_Gui); @@ -579,7 +604,10 @@ void OptionsGroupScreen_ContextRecreated(void* obj) { OptionsGroupScreen_Make(screen, 4, 1, -50, "Hacks settings...", OptionsGroupScreen_Hacks); OptionsGroupScreen_Make(screen, 5, 1, 0, "Env settings...", OptionsGroupScreen_Env); OptionsGroupScreen_Make(screen, 6, 1, 50, "Nostalgia options...", OptionsGroupScreen_Nostalgia); - Menu_MakeDefaultBack(&screen->Buttons[7], false, &screen->TitleFont, Menu_SwitchPause); + + screen->Widgets[7] = (Widget*)(&screen->Buttons[7]); + Menu_MakeDefaultBack(&screen->Buttons[7], false, &screen->TitleFont, Menu_SwitchPause); + screen->Widgets[8] = NULL; /* Description text widget placeholder */ if (screen->SelectedI >= 0) { OptionsGroupScreen_MakeDesc(screen); } OptionsGroupScreen_CheckHacksAllowed(obj); @@ -588,8 +616,6 @@ void OptionsGroupScreen_ContextRecreated(void* obj) { void OptionsGroupScreen_Init(GuiElement* elem) { OptionsGroupScreen* screen = (OptionsGroupScreen*)elem; MenuScreen_Init(elem); - Platform_MakeFont(&screen->TitleFont, &Game_FontName, 16, FONT_STYLE_BOLD); - Platform_MakeFont(&screen->RegularFont, &Game_FontName, 16, FONT_STYLE_NORMAL); Event_RegisterVoid(&UserEvents_HackPermissionsChanged, screen, OptionsGroupScreen_CheckHacksAllowed); screen->ContextRecreated(elem); } @@ -623,36 +649,271 @@ Screen* OptionsGroupScreen_MakeInstance(void) { screen->VTABLE->HandlesMouseMove = OptionsGroupScreen_HandlesMouseMove; screen->SelectedI = -1; - return screen; + return (Screen*)screen; } /*########################################################################################################################* *------------------------------------------------------DeathScreen--------------------------------------------------------* *#########################################################################################################################*/ - -void DeathScreen_Gen(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(GenLevelScreen_MakeInstance()); } +GuiElementVTABLE DeathScreen_VTABLE; +DeathScreen DeathScreen_Instance; +void DeathScreen_Gen(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(GenLevelScreen_MakeInstance()); } void DeathScreen_Load(GuiElement* a, GuiElement* b) { Gui_SetNewScreen(LoadLevelScreen_MakeInstance()); } void DeathScreen_Init(GuiElement* elem) { - base.Init(); - titleFont = new Font(game.FontName, 16, FontStyle.Bold); - regularFont = new Font(game.FontName, 40); - ContextRecreated(); + DeathScreen* screen = (DeathScreen*)elem; + Platform_MakeFont(&screen->TextFont, &Game_FontName, 40, FONT_STYLE_NORMAL); + MenuScreen_Init(elem); + screen->ContextRecreated(elem); } -public override bool HandlesKeyDown(Key key) { return true; } +bool DeathScreen_HandlesKeyDown(GuiElement* elem, Key key) { return true; } void DeathScreen_ContextRecreated(void* obj) { - string score = game.Chat.Status1.Text; - widgets = new Widget[]{ - TextWidget.Create(game, "Game over!", regularFont) - .SetLocation(Anchor.Centre, Anchor.Centre, 0, -150), - TextWidget.Create(game, score, titleFont) - .SetLocation(Anchor.Centre, Anchor.Centre, 0, -75), - ButtonWidget.Create(game, 400, "Generate new level...", titleFont, GenLevelClick) - .SetLocation(Anchor.Centre, Anchor.Centre, 0, 25), - ButtonWidget.Create(game, 400, "Load level...", titleFont, LoadLevelClick) - .SetLocation(Anchor.Centre, Anchor.Centre, 0, 75), - }; + DeathScreen* screen = (DeathScreen*)obj; + + String title = String_FromConst("Game over!"); + screen->Widgets[0] = (Widget*)(&screen->Title); + TextWidget_Create(&screen->Title, &title, &screen->TextFont); + Widget_SetLocation(screen->Widgets[0], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -150); + + String score = String_FromRawArray(Chat_Status[1].Buffer); + screen->Widgets[1] = (Widget*)(&screen->Score); + TextWidget_Create(&screen->Score, &score, &screen->TitleFont); + Widget_SetLocation(screen->Widgets[1], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -75); + + String gen = String_FromConst("Generate new level...") + screen->Widgets[2] = (Widget*)(&screen->Gen); + ButtonWidget_Create(&screen->Gen, &gen, 400, &screen->TitleFont, DeathScreen_Gen); + Widget_SetLocation(screen->Widgets[2], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 25); + + String load = String_FromConst("Load level..."); + screen->Widgets[3] = (Widget*)(&screen->Load); + ButtonWidget_Create(&screen->Load, &load, 400, &screen->TitleFont, DeathScreen_Load); + Widget_SetLocation(screen->Widgets[3], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, 75); +} + +Screen* DeathScreen_MakeInstance(void) { + DeathScreen* screen = &DeathScreen_Instance; + MenuScreen_MakeInstance((MenuScreen*)screen, screen->Widgets, Array_Elems(screen->Widgets), DeathScreen_ContextRecreated); + DeathScreen_VTABLE = *screen->VTABLE; + screen->VTABLE = &DeathScreen_VTABLE; + + screen->VTABLE->Init = DeathScreen_Init; + screen->VTABLE->HandlesKeyDown = DeathScreen_HandlesKeyDown; + return (Screen*)screen; +} + + +/*########################################################################################################################* +*----------------------------------------------------EditHotkeyScreen-----------------------------------------------------* +*#########################################################################################################################*/ +GuiElementVTABLE EditHotkeyScreen_VTABLE; +EditHotkeyScreen EditHotkeyScreen_Instance; +void EditHotkeyScreen_Make(EditHotkeyScreen* screen, Int32 i, Int32 x, Int32 y, STRING_PURE String* text, Widget_LeftClick onClick) { + ButtonWidget* btn = &screen->Buttons[i]; + screen->Widgets[i] = (Widget*)btn; + + ButtonWidget_Create(btn, text, 300, &screen->TitleFont, onClick); + Widget_SetLocation((Widget*)btn, ANCHOR_CENTRE, ANCHOR_CENTRE, x, y); +} + +void EditHotkeyScreen_MakeFlags(UInt8 flags, STRING_TRANSIENT String* str) { + if (flags == 0) String_AppendConst(str, " None"); + if (flags & HOTKEYS_FLAG_CTRL) String_AppendConst(str, " Ctrl"); + if (flags & HOTKEYS_FLAG_SHIFT) String_AppendConst(str, " Shift"); + if (flags & HOTKEYS_FLAG_ALT) String_AppendConst(str, " Alt"); +} + +void EditHotkeyScreen_MakeBaseKey(EditHotkeyScreen* screen, Widget_LeftClick onClick) { + UInt8 textBuffer[String_BufferSize(STRING_SIZE)]; + String text = String_InitAndClearArray(textBuffer); + + String_AppendConst(&text, "Key: "); + String_AppendConst(&text, Key_Names[screen->CurHotkey.BaseKey]); + EditHotkeyScreen_Make(screen, 0, 0, -150, &text, onClick); +} + +void EditHotkeyScreen_MakeModifiers(EditHotkeyScreen* screen, Widget_LeftClick onClick) { + UInt8 textBuffer[String_BufferSize(STRING_SIZE)]; + String text = String_InitAndClearArray(textBuffer); + + String_AppendConst(&text, "Modifiers:"); + EditHotkeyScreen_MakeFlags(screen->CurHotkey.Flags, &text); + EditHotkeyScreen_Make(screen, 1, 0, -100, &text, onClick); +} + +void EditHotkeyScreen_MakeLeaveOpen(EditHotkeyScreen* screen, Widget_LeftClick onClick) { + UInt8 textBuffer[String_BufferSize(STRING_SIZE)]; + String text = String_InitAndClearArray(textBuffer); + + String_AppendConst(&text, "Input stays open: "); + String_AppendConst(&text, screen->CurHotkey.StaysOpen ? "ON" : "OFF"); + EditHotkeyScreen_Make(screen, 2, -100, 10, &text, onClick); +} + +void EditHotkeyScreen_LeaveOpen(GuiElement* elem, GuiElement* widget) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)elem; + /* Reset 'waiting for key..' state of two other buttons */ + if (screen->SelectedI == 0) { + EditHotkeyScreen_MakeBaseKey(screen, EditHotkeyScreen_BaseKey); + screen->SupressNextPress = false; + } else if (screen->SelectedI == 1) { + EditHotkeyScreen_MakeModifiers(screen, EditHotkeyScreen_Modifiers); + screen->SupressNextPress = false; + } + + screen->SelectedI = -1; + screen->CurHotkey.StaysOpen = !screen->CurHotkey.StaysOpen; + EditHotkeyScreen_MakeLeaveOpen(screen, EditHotkeyScreen_LeaveOpen); +} + +void EditHotkeyScreen_SaveChanges(GuiElement* elem, GuiElement* widget) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)elem; + HotkeyData hotkey = screen->OrigHotkey; + if (hotkey.BaseKey != Key_Unknown) { + Hotkeys_Remove(hotkey.BaseKey, hotkey.Flags); + Hotkeys_UserRemovedHotkey(hotkey.BaseKey, hotkey.Flags); + } + + hotkey = screen->CurHotkey; + if (hotkey.BaseKey != Key_Unknown) { + String text = screen->Input.Base.Text; + Hotkeys_Add(hotkey.BaseKey, hotkey.Flags, &text, hotkey.StaysOpen); + Hotkeys_UserAddedHotkey(hotkey.BaseKey, hotkey.Flags, hotkey.StaysOpen, &text); + } + Gui_SetNewScreen(HotkeyListScreen_MakeInstance()); +} + +void EditHotkeyScreen_RemoveHotkey(GuiElement* elem, GuiElement* widget) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)elem; + HotkeyData hotkey = screen->OrigHotkey; + if (hotkey.BaseKey != Key_Unknown) { + Hotkeys_Remove(hotkey.BaseKey, hotkey.Flags); + Hotkeys_UserRemovedHotkey(hotkey.BaseKey, hotkey.Flags); + } + Gui_SetNewScreen(HotkeyListScreen_MakeInstance()); +} + +void EditHotkeyScreen_BaseKey(GuiElement* elem, GuiElement* widget) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)elem; + screen->SelectedI = 0; + screen->SupressNextPress = true; + String msg = String_FromConst("Key: press a key.."); + ButtonWidget_SetText(&screen->Buttons[0], &msg); +} + +void EditHotkeyScreen_Modifiers(GuiElement* elem, GuiElement* widget) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)elem; + screen->SelectedI = 1; + screen->SupressNextPress = true; + String msg = String_FromConst("Modifiers: press a key.."); + ButtonWidget_SetText(&screen->Buttons[1], &msg); +} + +void EditHotkeyScreen_Init(GuiElement* elem) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)screen; + MenuScreen_Init(elem); + Key_KeyRepeat = true; + screen->ContextRecreated(elem); +} + +void EditHotkeyScreen_Render(GuiElement* elem, Real64 delta) { + MenuScreen_Render(elem, delta); + Int32 cX = Game_Width / 2, cY = Game_Height / 2; + PackedCol grey = PACKEDCOL_CONST(150, 150, 150, 255); + GfxCommon_Draw2DFlat(cX - 250, cY - 65, 500, 2, grey); + GfxCommon_Draw2DFlat(cX - 250, cY + 45, 500, 2, grey); +} + +void EditHotkeyScreen_Free(GuiElement* elem) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)elem; + Key_KeyRepeat = false; + screen->SelectedI = -1; + MenuScreen_Free(elem); +} + +bool EditHotkeyScreen_HandlesKeyPress(GuiElement* elem, UInt8 key) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)screen; + if (screen->SupressNextPress) { + screen->SupressNextPress = false; + return true; + } + return Elem_HandlesKeyPress(&screen->Input.Base, key); +} + +bool EditHotkeyScreen_HandlesKeyDown(GuiElement* elem, Key key) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)screen; + if (screen->SelectedI >= 0) { + if (screen->SelectedI == 0) { + screen->CurHotkey.BaseKey = key; + EditHotkeyScreen_MakeBaseKey(screen, EditHotkeyScreen_BaseKey); + } else if (screen->SelectedI == 1) { + if (key == Key_ControlLeft || key == Key_ControlRight) screen->CurHotkey.Flags |= HOTKEYS_FLAG_CTRL; + else if (key == Key_ShiftLeft || key == Key_ShiftRight) screen->CurHotkey.Flags |= HOTKEYS_FLAG_SHIFT; + else if (key == Key_AltLeft || key == Key_AltRight) screen->CurHotkey.Flags |= HOTKEYS_FLAG_ALT; + else screen->CurHotkey.Flags = 0; + + EditHotkeyScreen_MakeModifiers(screen, EditHotkeyScreen_Modifiers); + } + + screen->SupressNextPress = true; + screen->SelectedI = -1; + return true; + } + return Elem_HandlesKeyDown(&screen->Input.Base, key) || MenuScreen_HandlesKeyDown(elem, key); +} + +bool EditHotkeyScreen_HandlesKeyUp(GuiElement* elem, Key key) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)screen; + return Elem_HandlesKeyUp(&screen->Input.Base, key); +} + +void EditHotkeyScreen_ContextRecreated(void* obj) { + EditHotkeyScreen* screen = (EditHotkeyScreen*)obj; + MenuInputValidator validator = MenuInputValidator_String(); + String text = String_MakeNull(); + + bool existed = screen->OrigHotkey.BaseKey != Key_Unknown; + if (existed) { + text = StringsBuffer_UNSAFE_Get(&HotkeysText, screen->OrigHotkey.TextIndex); + } + + EditHotkeyScreen_MakeBaseKey(screen, EditHotkeyScreen_BaseKey); + EditHotkeyScreen_MakeModifiers(screen, EditHotkeyScreen_Modifiers); + EditHotkeyScreen_MakeLeaveOpen(screen, EditHotkeyScreen_LeaveOpen); + + String addText = String_FromReadonly(existed ? "Save changes" : "Add hotkey"); + EditHotkeyScreen_Make(screen, 3, 0, 80, &addText, EditHotkeyScreen_SaveChanges); + String remText = String_FromReadonly(existed ? "Remove hotkey" : "Cancel"); + EditHotkeyScreen_Make(screen, 4, 0, 130, &remText, EditHotkeyScreen_RemoveHotkey); + + screen->Widgets[5] = (Widget*)(&screen->Buttons[5]); + Menu_MakeDefaultBack(&screen->Buttons[5], false, &screen->TitleFont, Menu_SwitchPause); + + screen->Widgets[6] = (Widget*)(&screen->Input); + MenuInputWidget_Create(&screen->Input, 500, 30, &text, &screen->TextFont, &validator); + Widget_SetLocation(screen->Widgets[6], ANCHOR_CENTRE, ANCHOR_CENTRE, 0, -35); + screen->Input.Base.ShowCaret = true; +} + +Screen* EditHotkeyScreen_MakeInstance(HotkeyData original) { + EditHotkeyScreen* screen = &EditHotkeyScreen_Instance; + MenuScreen_MakeInstance((MenuScreen*)screen, screen->Widgets, Array_Elems(screen->Widgets), DeathScreen_ContextRecreated); + EditHotkeyScreen_VTABLE = *screen->VTABLE; + screen->VTABLE = &EditHotkeyScreen_VTABLE; + + screen->VTABLE->Init = EditHotkeyScreen_Init; + screen->VTABLE->Render = EditHotkeyScreen_Render; + screen->VTABLE->Free = EditHotkeyScreen_Free; + + screen->VTABLE->HandlesKeyPress = EditHotkeyScreen_HandlesKeyPress; + screen->VTABLE->HandlesKeyDown = EditHotkeyScreen_HandlesKeyDown; + screen->VTABLE->HandlesKeyUp = EditHotkeyScreen_HandlesKeyUp; + + screen->SelectedI = -1; + screen->OrigHotkey = original; + screen->CurHotkey = original; + return (Screen*)screen; } \ No newline at end of file diff --git a/src/Client/OpenGLApi.c b/src/Client/OpenGLApi.c index 770dda3a3..f88ab8ce4 100644 --- a/src/Client/OpenGLApi.c +++ b/src/Client/OpenGLApi.c @@ -506,8 +506,7 @@ bool Gfx_WarnIfNecessary(void) { Chat_AddRaw(tmp3, "&cIt is likely you need to install video card drivers."); } - UInt8* rendererRaw = glGetString(GL_RENDERER); - String renderer = String_FromRaw(rendererRaw, UInt16_MaxValue); + String renderer = String_FromReadonly(glGetString(GL_RENDERER)); String intel = String_FromConst("Intel"); if (!String_ContainsString(&renderer, &intel)) return false;