diff --git a/other/ddnet.appdata.xml b/other/ddnet.appdata.xml index 7c465abeb..36c0b5a70 100644 --- a/other/ddnet.appdata.xml +++ b/other/ddnet.appdata.xml @@ -37,6 +37,7 @@ intense + diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index ced8cca59..ea3e68a8b 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -154,6 +154,8 @@ CGraphics_Threaded::CGraphics_Threaded() m_RenderEnable = true; m_DoScreenshot = false; + + png_init(0, 0); // ignore_convention } void CGraphics_Threaded::ClipEnable(int x, int y, int w, int h) @@ -521,8 +523,6 @@ int CGraphics_Threaded::LoadPNG(CImageInfo *pImg, const char *pFilename, int Sto png_t Png; // ignore_convention // open file for reading - png_init(0, 0); // ignore_convention - IOHANDLE File = m_pStorage->OpenFile(pFilename, IOFLAG_READ, StorageType, aCompleteFilename, sizeof(aCompleteFilename)); if(File) io_close(File); diff --git a/src/engine/client/http.cpp b/src/engine/client/http.cpp index 9333636d2..388a9430c 100644 --- a/src/engine/client/http.cpp +++ b/src/engine/client/http.cpp @@ -250,8 +250,8 @@ size_t CGet::OnData(char *pData, size_t DataSize) CGetFile::CGetFile(IStorage *pStorage, const char *pUrl, const char *pDest, int StorageType, CTimeout Timeout, bool LogProgress) : CRequest(pUrl, Timeout, LogProgress), m_pStorage(pStorage), - m_StorageType(StorageType), - m_File(0) + m_File(0), + m_StorageType(StorageType) { str_copy(m_aDest, pDest, sizeof(m_aDest)); diff --git a/src/engine/client/http.h b/src/engine/client/http.h index 79ab1f7bb..a29514499 100644 --- a/src/engine/client/http.h +++ b/src/engine/client/http.h @@ -101,12 +101,13 @@ class CGetFile : public CRequest IStorage *m_pStorage; - char m_aDest[MAX_PATH_LENGTH]; char m_aDestFull[MAX_PATH_LENGTH]; - int m_StorageType; IOHANDLE m_File; protected: + char m_aDest[MAX_PATH_LENGTH]; + int m_StorageType; + virtual int OnCompletion(int State); public: diff --git a/src/game/client/components/menus.cpp b/src/game/client/components/menus.cpp index 718266262..7c91e7375 100644 --- a/src/game/client/components/menus.cpp +++ b/src/game/client/components/menus.cpp @@ -99,6 +99,26 @@ CMenus::CMenus() m_ServerProcess.Process = 0; m_ServerProcess.Initialized = false; + + for(SUIAnimator &animator : m_aAnimatorsSettingsTab) + { + animator.m_YOffset = -2.5f; + animator.m_HOffset = 5.0f; + animator.m_WOffset = 5.0f; + animator.m_RepositionLabel = true; + } + + for(SUIAnimator &animator : m_aAnimatorsBigPage) + { + animator.m_YOffset = -5.0f; + animator.m_HOffset = 5.0f; + } + + for(SUIAnimator &animator : m_aAnimatorsSmallPage) + { + animator.m_YOffset = -2.5f; + animator.m_HOffset = 2.5f; + } } float CMenus::ButtonColorMul(const void *pID) @@ -222,14 +242,43 @@ void CMenus::DoButton_KeySelect(const void *pID, const char *pText, int Checked, UI()->DoLabel(&Temp, pText, Temp.h * ms_FontmodHeight, 0); } -int CMenus::DoButton_MenuTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Corners, const ColorRGBA *pDefaultColor, const ColorRGBA *pActiveColor, const ColorRGBA *pHoverColor, float EdgeRounding, int AlignVertically) +int CMenus::DoButton_MenuTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Corners, SUIAnimator *pAnimator, const ColorRGBA *pDefaultColor, const ColorRGBA *pActiveColor, const ColorRGBA *pHoverColor, float EdgeRounding, int AlignVertically) { + bool MouseInside = UI()->MouseInside(pRect); + CUIRect Rect = *pRect; + + if(pAnimator != NULL) + { + int64 Time = time_get_microseconds(); + + if(pAnimator->m_Time + (int64)100000 < Time) + { + pAnimator->m_Value = pAnimator->m_Active ? 1 : 0; + pAnimator->m_Time = Time; + } + + pAnimator->m_Active = Checked || MouseInside; + + if(pAnimator->m_Active) + pAnimator->m_Value = clamp(pAnimator->m_Value + (Time - pAnimator->m_Time) / 100000.f, 0, 1); + else + pAnimator->m_Value = clamp(pAnimator->m_Value - (Time - pAnimator->m_Time) / 100000.f, 0, 1); + + Rect.w += pAnimator->m_Value * pAnimator->m_WOffset; + Rect.h += pAnimator->m_Value * pAnimator->m_HOffset; + Rect.x += pAnimator->m_Value * pAnimator->m_XOffset; + Rect.y += pAnimator->m_Value * pAnimator->m_YOffset; + + pAnimator->m_Time = Time; + } + if(Checked) { ColorRGBA ColorMenuTab = ms_ColorTabbarActive; if(pActiveColor) ColorMenuTab = *pActiveColor; - RenderTools()->DrawUIRect(pRect, ColorMenuTab, Corners, EdgeRounding); + + RenderTools()->DrawUIRect(&Rect, ColorMenuTab, Corners, EdgeRounding); } else { @@ -238,18 +287,37 @@ int CMenus::DoButton_MenuTab(const void *pID, const char *pText, int Checked, co ColorRGBA HoverColorMenuTab = ms_ColorTabbarHover; if(pHoverColor) HoverColorMenuTab = *pHoverColor; - RenderTools()->DrawUIRect(pRect, HoverColorMenuTab, Corners, EdgeRounding); + + RenderTools()->DrawUIRect(&Rect, HoverColorMenuTab, Corners, EdgeRounding); } else { ColorRGBA ColorMenuTab = ms_ColorTabbarInactive; if(pDefaultColor) ColorMenuTab = *pDefaultColor; - RenderTools()->DrawUIRect(pRect, ColorMenuTab, Corners, EdgeRounding); + + RenderTools()->DrawUIRect(&Rect, ColorMenuTab, Corners, EdgeRounding); } } + CUIRect Temp; - pRect->HMargin(2.0f, &Temp); + + if(pAnimator != NULL) + { + if(pAnimator->m_RepositionLabel) + { + Rect.x += Rect.w - pRect->w + Rect.x - pRect->x; + Rect.y += Rect.h - pRect->h + Rect.y - pRect->y; + } + + if(!pAnimator->m_ScaleLabel) + { + Rect.w = pRect->w; + Rect.h = pRect->h; + } + } + + Rect.HMargin(2.0f, &Temp); UI()->DoLabel(&Temp, pText, Temp.h * ms_FontmodHeight, 0, -1, AlignVertically); return UI()->DoButtonLogic(pID, pText, Checked, pRect); @@ -1059,7 +1127,7 @@ int CMenus::RenderMenubar(CUIRect r) pHomeButtonColorHover = &HomeButtonColorAlertHover; } - if(DoButton_MenuTab(&s_StartButton, pHomeScreenButtonLabel, false, &Button, CUI::CORNER_T, pHomeButtonColor, pHomeButtonColor, pHomeButtonColorHover, 10.0f, 0)) + if(DoButton_MenuTab(&s_StartButton, pHomeScreenButtonLabel, false, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_HOME], pHomeButtonColor, pHomeButtonColor, pHomeButtonColorHover, 10.0f, 0)) { m_ShowStart = true; m_DoubleClickIndex = -1; @@ -1075,7 +1143,7 @@ int CMenus::RenderMenubar(CUIRect r) { Box.VSplitLeft(100.0f, &Button, &Box); static int s_NewsButton = 0; - if(DoButton_MenuTab(&s_NewsButton, Localize("News"), m_ActivePage == PAGE_NEWS, &Button, CUI::CORNER_T)) + if(DoButton_MenuTab(&s_NewsButton, Localize("News"), m_ActivePage == PAGE_NEWS, &Button, CUI::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_NEWS])) { NewPage = PAGE_NEWS; m_DoubleClickIndex = -1; @@ -1085,7 +1153,7 @@ int CMenus::RenderMenubar(CUIRect r) { Box.VSplitLeft(100.0f, &Button, &Box); static int s_DemosButton = 0; - if(DoButton_MenuTab(&s_DemosButton, Localize("Demos"), m_ActivePage == PAGE_DEMOS, &Button, CUI::CORNER_T)) + if(DoButton_MenuTab(&s_DemosButton, Localize("Demos"), m_ActivePage == PAGE_DEMOS, &Button, CUI::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_DEMOS])) { DemolistPopulate(); NewPage = PAGE_DEMOS; @@ -1096,7 +1164,7 @@ int CMenus::RenderMenubar(CUIRect r) { Box.VSplitLeft(100.0f, &Button, &Box); static int s_InternetButton = 0; - if(DoButton_MenuTab(&s_InternetButton, Localize("Internet"), m_ActivePage == PAGE_INTERNET, &Button, CUI::CORNER_TL)) + if(DoButton_MenuTab(&s_InternetButton, Localize("Internet"), m_ActivePage == PAGE_INTERNET, &Button, CUI::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_INTERNET])) { if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_INTERNET) ServerBrowser()->Refresh(IServerBrowser::TYPE_INTERNET); @@ -1106,7 +1174,7 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitLeft(100.0f, &Button, &Box); static int s_LanButton = 0; - if(DoButton_MenuTab(&s_LanButton, Localize("LAN"), m_ActivePage == PAGE_LAN, &Button, 0)) + if(DoButton_MenuTab(&s_LanButton, Localize("LAN"), m_ActivePage == PAGE_LAN, &Button, CUI::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_LAN])) { if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_LAN) ServerBrowser()->Refresh(IServerBrowser::TYPE_LAN); @@ -1116,7 +1184,7 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitLeft(100.0f, &Button, &Box); static int s_FavoritesButton = 0; - if(DoButton_MenuTab(&s_FavoritesButton, Localize("Favorites"), m_ActivePage == PAGE_FAVORITES, &Button, 0)) + if(DoButton_MenuTab(&s_FavoritesButton, Localize("Favorites"), m_ActivePage == PAGE_FAVORITES, &Button, CUI::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_FAVORITES])) { if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_FAVORITES) ServerBrowser()->Refresh(IServerBrowser::TYPE_FAVORITES); @@ -1126,7 +1194,7 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitLeft(90.0f, &Button, &Box); static int s_DDNetButton = 0; - if(DoButton_MenuTab(&s_DDNetButton, "DDNet", m_ActivePage == PAGE_DDNET, &Button, 0)) + if(DoButton_MenuTab(&s_DDNetButton, "DDNet", m_ActivePage == PAGE_DDNET, &Button, CUI::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_DDNET])) { if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_DDNET) { @@ -1139,7 +1207,7 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitLeft(90.0f, &Button, &Box); static int s_KoGButton = 0; - if(DoButton_MenuTab(&s_KoGButton, "KoG", m_ActivePage == PAGE_KOG, &Button, CUI::CORNER_TR)) + if(DoButton_MenuTab(&s_KoGButton, "KoG", m_ActivePage == PAGE_KOG, &Button, CUI::CORNER_T, &m_aAnimatorsBigPage[BIG_TAB_KOG])) { if(ServerBrowser()->GetCurrentType() != IServerBrowser::TYPE_KOG) { @@ -1197,7 +1265,7 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitRight(33.0f, &Box, &Button); static int s_QuitButton = 0; ColorRGBA QuitColor(1, 0, 0, 0.5f); - if(DoButton_MenuTab(&s_QuitButton, "\xEE\x97\x8D", 0, &Button, CUI::CORNER_T, NULL, NULL, &QuitColor, 10.0f, 0)) + if(DoButton_MenuTab(&s_QuitButton, "\xEE\x97\x8D", 0, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_QUIT], NULL, NULL, &QuitColor, 10.0f, 0)) { if(m_pClient->Editor()->HasUnsavedData() || (Client()->GetCurrentRaceTime() / 60 >= g_Config.m_ClConfirmQuitTime && g_Config.m_ClConfirmQuitTime >= 0)) { @@ -1213,13 +1281,13 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitRight(33.0f, &Box, &Button); static int s_SettingsButton = 0; - if(DoButton_MenuTab(&s_SettingsButton, "\xEE\xA2\xB8", m_ActivePage == PAGE_SETTINGS, &Button, CUI::CORNER_T, NULL, NULL, NULL, 10.0f, 0)) + if(DoButton_MenuTab(&s_SettingsButton, "\xEE\xA2\xB8", m_ActivePage == PAGE_SETTINGS, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_SETTINGS], NULL, NULL, NULL, 10.0f, 0)) NewPage = PAGE_SETTINGS; Box.VSplitRight(10.0f, &Box, &Button); Box.VSplitRight(33.0f, &Box, &Button); static int s_EditorButton = 0; - if(DoButton_MenuTab(&s_EditorButton, "\xEE\x8F\x89", 0, &Button, CUI::CORNER_T, NULL, NULL, NULL, 10.0f, 0)) + if(DoButton_MenuTab(&s_EditorButton, "\xEE\x8F\x89", 0, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_EDITOR], NULL, NULL, NULL, 10.0f, 0)) { g_Config.m_ClEditor = 1; } @@ -1230,14 +1298,14 @@ int CMenus::RenderMenubar(CUIRect r) Box.VSplitRight(33.0f, &Box, &Button); static int s_DemoButton = 0; - if(DoButton_MenuTab(&s_DemoButton, "\xEE\x80\xAC", m_ActivePage == PAGE_DEMOS, &Button, CUI::CORNER_T, NULL, NULL, NULL, 10.0f, 0)) + if(DoButton_MenuTab(&s_DemoButton, "\xEE\x80\xAC", m_ActivePage == PAGE_DEMOS, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_DEMOBUTTON], NULL, NULL, NULL, 10.0f, 0)) NewPage = PAGE_DEMOS; Box.VSplitRight(10.0f, &Box, &Button); Box.VSplitRight(33.0f, &Box, &Button); static int s_ServerButton = 0; - if(DoButton_MenuTab(&s_ServerButton, "\xEE\xA0\x8B", m_ActivePage == g_Config.m_UiPage, &Button, CUI::CORNER_T, NULL, NULL, NULL, 10.0f, 0)) + if(DoButton_MenuTab(&s_ServerButton, "\xEE\xA0\x8B", m_ActivePage == g_Config.m_UiPage, &Button, CUI::CORNER_T, &m_aAnimatorsSmallPage[SMALL_TAB_SERVER], NULL, NULL, NULL, 10.0f, 0)) NewPage = g_Config.m_UiPage; } diff --git a/src/game/client/components/menus.h b/src/game/client/components/menus.h index 59f4c9e23..fb10107ec 100644 --- a/src/game/client/components/menus.h +++ b/src/game/client/components/menus.h @@ -79,7 +79,7 @@ class CMenus : public CComponent int DoButton_Sprite(const void *pID, int ImageID, int SpriteID, int Checked, const CUIRect *pRect, int Corners); int DoButton_Toggle(const void *pID, int Checked, const CUIRect *pRect, bool Active); int DoButton_Menu(const void *pID, const char *pText, int Checked, const CUIRect *pRect, const char *pImageName = 0, int Corners = CUI::CORNER_ALL, float r = 5.0f, float FontFactor = 0.0f, vec4 ColorHot = vec4(1.0f, 1.0f, 1.0f, 0.75f), vec4 Color = vec4(1, 1, 1, 0.5f), int AlignVertically = 1, bool CheckForActiveColorPicker = false); - int DoButton_MenuTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Corners, const ColorRGBA *pDefaultColor = NULL, const ColorRGBA *pActiveColor = NULL, const ColorRGBA *pHoverColor = NULL, float EdgeRounding = 10, int AlignVertically = 1); + int DoButton_MenuTab(const void *pID, const char *pText, int Checked, const CUIRect *pRect, int Corners, SUIAnimator *pAnimator = NULL, const ColorRGBA *pDefaultColor = NULL, const ColorRGBA *pActiveColor = NULL, const ColorRGBA *pHoverColor = NULL, float EdgeRounding = 10, int AlignVertically = 1); int DoButton_CheckBox_Common(const void *pID, const char *pText, const char *pBoxText, const CUIRect *pRect); int DoButton_CheckBox(const void *pID, const char *pText, int Checked, const CUIRect *pRect); @@ -561,6 +561,8 @@ public: PAGE_NETWORK, PAGE_GHOST, + PAGE_LENGTH, + SETTINGS_LANGUAGE = 0, SETTINGS_GENERAL, SETTINGS_PLAYER, @@ -571,8 +573,33 @@ public: SETTINGS_SOUND, SETTINGS_DDNET, SETTINGS_ASSETS, + + SETTINGS_LENGTH, + + BIG_TAB_NEWS = 0, + BIG_TAB_INTERNET, + BIG_TAB_LAN, + BIG_TAB_FAVORITES, + BIG_TAB_DDNET, + BIG_TAB_KOG, + BIG_TAB_DEMOS, + + BIG_TAB_LENGTH, + + SMALL_TAB_HOME = 0, + SMALL_TAB_QUIT, + SMALL_TAB_SETTINGS, + SMALL_TAB_EDITOR, + SMALL_TAB_DEMOBUTTON, + SMALL_TAB_SERVER, + + SMALL_TAB_LENGTH, }; + SUIAnimator m_aAnimatorsBigPage[BIG_TAB_LENGTH]; + SUIAnimator m_aAnimatorsSmallPage[SMALL_TAB_LENGTH]; + SUIAnimator m_aAnimatorsSettingsTab[SETTINGS_LENGTH]; + // DDRace int DoButton_CheckBox_DontCare(const void *pID, const char *pText, int Checked, const CUIRect *pRect); sorted_array m_lDemos; diff --git a/src/game/client/components/menus_browser.cpp b/src/game/client/components/menus_browser.cpp index 97168d024..25551cce1 100644 --- a/src/game/client/components/menus_browser.cpp +++ b/src/game/client/components/menus_browser.cpp @@ -1368,15 +1368,15 @@ void CMenus::RenderServerbrowser(CUIRect MainView) ms_ColorTabbarInactive = ColorRGBA(0.0f, 0.0f, 0.0f, 0.15f); static int s_FiltersTab = 0; - if(DoButton_MenuTab(&s_FiltersTab, Localize("Filter"), ToolboxPage == 0, &TabButton0, CUI::CORNER_BL, NULL, NULL, NULL, 4.0f)) + if(DoButton_MenuTab(&s_FiltersTab, Localize("Filter"), ToolboxPage == 0, &TabButton0, CUI::CORNER_BL, NULL, NULL, NULL, NULL, 4.0f)) ToolboxPage = 0; static int s_InfoTab = 0; - if(DoButton_MenuTab(&s_InfoTab, Localize("Info"), ToolboxPage == 1, &TabButton1, 0, NULL, NULL, NULL, 4.0f)) + if(DoButton_MenuTab(&s_InfoTab, Localize("Info"), ToolboxPage == 1, &TabButton1, 0, NULL, NULL, NULL, NULL, 4.0f)) ToolboxPage = 1; static int s_FriendsTab = 0; - if(DoButton_MenuTab(&s_FriendsTab, Localize("Friends"), ToolboxPage == 2, &TabButton2, CUI::CORNER_BR, NULL, NULL, NULL, 4.0f)) + if(DoButton_MenuTab(&s_FriendsTab, Localize("Friends"), ToolboxPage == 2, &TabButton2, CUI::CORNER_BR, NULL, NULL, NULL, NULL, 4.0f)) ToolboxPage = 2; ms_ColorTabbarActive = Active; diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 2684d8a76..2613dfa18 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -1496,7 +1496,7 @@ void CMenus::RenderSettings(CUIRect MainView) { TabBar.HSplitTop(10, &Button, &TabBar); TabBar.HSplitTop(26, &Button, &TabBar); - if(DoButton_MenuTab(aTabs[i], aTabs[i], g_Config.m_UiSettingsPage == i, &Button, CUI::CORNER_R)) + if(DoButton_MenuTab(aTabs[i], aTabs[i], g_Config.m_UiSettingsPage == i, &Button, CUI::CORNER_R, &m_aAnimatorsSettingsTab[i])) g_Config.m_UiSettingsPage = i; } @@ -1572,7 +1572,7 @@ ColorHSLA CMenus::RenderHSLColorPicker(const CUIRect *pRect, unsigned int *pColo { ColorHSLA HSLColor(*pColor, false); ColorRGBA RGBColor = color_cast(HSLColor); - + ColorRGBA Outline(1, 1, 1, 0.25f); const float OutlineSize = 3.0f; Outline.a *= ButtonColorMul(pColor); @@ -1701,7 +1701,7 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) Chat.HSplitTop(20.0f, &Section, &Chat); Chat.HSplitTop(10.0f, 0x0, &Chat); - + UI()->DoLabelScaled(&Section, Localize("Messages"), 20.0f, -1); const float LineSize = 25.0f; @@ -1717,13 +1717,12 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) DoLine_ColorPicker(&ResetIDs[i++], LineSize, WantedPickerPosition, LabelSize, LineSpacing, &Chat, Localize("System message"), &g_Config.m_ClMessageSystemColor, ColorRGBA(1.0f, 1.0f, 0.5f), true, true, &g_Config.m_ClShowChatSystem); DoLine_ColorPicker(&ResetIDs[i++], LineSize, WantedPickerPosition, LabelSize, LineSpacing, &Chat, Localize("Highlighted message"), &g_Config.m_ClMessageHighlightColor, ColorRGBA(1.0f, 0.5f, 0.5f)); DoLine_ColorPicker(&ResetIDs[i++], LineSize, WantedPickerPosition, LabelSize, LineSpacing, &Chat, Localize("Team message"), &g_Config.m_ClMessageTeamColor, ColorRGBA(0.65f, 1.0f, 0.65f)); - DoLine_ColorPicker(&ResetIDs[i++], LineSize, WantedPickerPosition, LabelSize, LineSpacing, &Chat, Localize("Friend message"), &g_Config.m_ClMessageFriendColor, ColorRGBA(1.0f, 0.137f, 0.137f), true, true, & g_Config.m_ClMessageFriend); + DoLine_ColorPicker(&ResetIDs[i++], LineSize, WantedPickerPosition, LabelSize, LineSpacing, &Chat, Localize("Friend message"), &g_Config.m_ClMessageFriendColor, ColorRGBA(1.0f, 0.137f, 0.137f), true, true, &g_Config.m_ClMessageFriend); DoLine_ColorPicker(&ResetIDs[i++], LineSize, WantedPickerPosition, LabelSize, LineSpacing, &Chat, Localize("Normal message"), &g_Config.m_ClMessageColor, ColorRGBA(1.0f, 1.0f, 1.0f)); str_format(aBuf, sizeof(aBuf), "%s (echo)", Localize("Client message")); DoLine_ColorPicker(&ResetIDs[i++], LineSize, WantedPickerPosition, LabelSize, LineSpacing, &Chat, aBuf, &g_Config.m_ClMessageClientColor, ColorRGBA(0.5f, 0.78f, 1.0f)); - // ***** Chat Preview ***** // Chat.HSplitTop(10.0f, 0x0, &Chat); @@ -1749,7 +1748,7 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) const float RealMsgPaddingY = (!g_Config.m_ClChatOld ? CChat::MESSAGE_PADDING_Y : 0) * 2; const float RealMsgPaddingTee = (!g_Config.m_ClChatOld ? CChat::MESSAGE_TEE_SIZE + CChat::MESSAGE_TEE_PADDING_RIGHT : 0) * 2; const float RealOffsetY = RealFontSize + RealMsgPaddingY; - + const float X = 5.0f + RealMsgPaddingX / 2.0f + Chat.x; float Y = Chat.y; @@ -1876,7 +1875,7 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) TextRender()->TextColor(TeamColor); if(g_Config.m_ClShowIDs) TextRender()->TextEx(&Cursor, "11: Your Teammate: ", -1); - else + else TextRender()->TextEx(&Cursor, "Your Teammate: ", -1); TextRender()->TextEx(&Cursor, "Let's speedrun this!", -1); if(!g_Config.m_ClChatOld) diff --git a/src/game/client/components/menus_settings_assets.cpp b/src/game/client/components/menus_settings_assets.cpp index 5c2e96979..e3d608ff7 100644 --- a/src/game/client/components/menus_settings_assets.cpp +++ b/src/game/client/components/menus_settings_assets.cpp @@ -310,13 +310,13 @@ void CMenus::RenderSettingsCustom(CUIRect MainView) Page2Tab.VSplitLeft(TabsW / 4, &Page2Tab, &Page3Tab); Page3Tab.VSplitLeft(TabsW / 4, &Page3Tab, &Page4Tab); - if(DoButton_MenuTab((void *)&Page1Tab, Localize("Entities"), s_CurCustomTab == 0, &Page1Tab, 5, NULL, NULL, NULL, 4)) + if(DoButton_MenuTab((void *)&Page1Tab, Localize("Entities"), s_CurCustomTab == 0, &Page1Tab, 5, NULL, NULL, NULL, NULL, 4)) s_CurCustomTab = 0; - if(DoButton_MenuTab((void *)&Page2Tab, Localize("Game"), s_CurCustomTab == 1, &Page2Tab, 0, NULL, NULL, NULL, 4)) + if(DoButton_MenuTab((void *)&Page2Tab, Localize("Game"), s_CurCustomTab == 1, &Page2Tab, 0, NULL, NULL, NULL, NULL, 4)) s_CurCustomTab = 1; - if(DoButton_MenuTab((void *)&Page3Tab, Localize("Emoticons"), s_CurCustomTab == 2, &Page3Tab, 0, NULL, NULL, NULL, 4)) + if(DoButton_MenuTab((void *)&Page3Tab, Localize("Emoticons"), s_CurCustomTab == 2, &Page3Tab, 0, NULL, NULL, NULL, NULL, 4)) s_CurCustomTab = 2; - if(DoButton_MenuTab((void *)&Page4Tab, Localize("Particles"), s_CurCustomTab == 3, &Page4Tab, 10, NULL, NULL, NULL, 4)) + if(DoButton_MenuTab((void *)&Page4Tab, Localize("Particles"), s_CurCustomTab == 3, &Page4Tab, 10, NULL, NULL, NULL, NULL, 4)) s_CurCustomTab = 3; if(s_CurCustomTab == 0) diff --git a/src/game/client/components/skins.cpp b/src/game/client/components/skins.cpp index 15bc9e07d..d5272adc2 100644 --- a/src/game/client/components/skins.cpp +++ b/src/game/client/components/skins.cpp @@ -30,6 +30,22 @@ static bool IsVanillaSkin(const char *pName) return false; } +int CSkins::CGetPngFile::OnCompletion(int State) +{ + State = CGetFile::OnCompletion(State); + + if(State != HTTP_ERROR && State != HTTP_ABORTED && !m_pSkins->LoadSkinPNG(m_Info, m_aDest, m_aDest, m_StorageType)) + { + State = HTTP_ERROR; + } + return State; +} + +CSkins::CGetPngFile::CGetPngFile(CSkins *pSkins, IStorage *pStorage, const char *pUrl, const char *pDest, int StorageType, CTimeout Timeout, bool LogProgress) : + CGetFile(pStorage, pUrl, pDest, StorageType, Timeout, LogProgress), m_pSkins(pSkins) +{ +} + int CSkins::SkinScan(const char *pName, int IsDir, int DirType, void *pUser) { CSkins *pSelf = (CSkins *)pUser; @@ -92,12 +108,32 @@ static void CheckMetrics(CSkin::SSkinMetricVariable &Metrics, uint8_t *pImg, int int CSkins::LoadSkin(const char *pName, const char *pPath, int DirType) { - char aBuf[512]; CImageInfo Info; - if(!Graphics()->LoadPNG(&Info, pPath, DirType) || !Graphics()->CheckImageDivisibility(pPath, Info, g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridy, true)) + if(!LoadSkinPNG(Info, pName, pPath, DirType)) + return 0; + return LoadSkin(pName, Info); +} + +bool CSkins::LoadSkinPNG(CImageInfo &Info, const char *pName, const char *pPath, int DirType) +{ + char aBuf[512]; + if(!Graphics()->LoadPNG(&Info, pPath, DirType)) { str_format(aBuf, sizeof(aBuf), "failed to load skin from %s", pName); Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "game", aBuf); + return false; + } + return true; +} + +int CSkins::LoadSkin(const char *pName, CImageInfo &Info) +{ + char aBuf[512]; + + if(!Graphics()->CheckImageDivisibility(pName, Info, g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridx, g_pData->m_aSprites[SPRITE_TEE_BODY].m_pSet->m_Gridy, true)) + { + str_format(aBuf, sizeof(aBuf), "skin failed image divisibility: %s", pName); + Console()->Print(IConsole::OUTPUT_LEVEL_ADDINFO, "game", aBuf); return 0; } @@ -366,7 +402,7 @@ int CSkins::FindImpl(const char *pName) char aPath[MAX_PATH_LENGTH]; str_format(aPath, sizeof(aPath), "downloadedskins/%s.png", d.front().m_aName); Storage()->RenameFile(d.front().m_aPath, aPath, IStorage::TYPE_SAVE); - LoadSkin(d.front().m_aName, aPath, IStorage::TYPE_SAVE); + LoadSkin(d.front().m_aName, d.front().m_pTask->m_Info); d.front().m_pTask = nullptr; } if(d.front().m_pTask && (d.front().m_pTask->State() == HTTP_ERROR || d.front().m_pTask->State() == HTTP_ABORTED)) @@ -382,7 +418,7 @@ int CSkins::FindImpl(const char *pName) char aUrl[256]; str_format(aUrl, sizeof(aUrl), "%s%s.png", g_Config.m_ClSkinDownloadUrl, pName); str_format(Skin.m_aPath, sizeof(Skin.m_aPath), "downloadedskins/%s.%d.tmp", pName, pid()); - Skin.m_pTask = std::make_shared(Storage(), aUrl, Skin.m_aPath, IStorage::TYPE_SAVE, CTimeout{0, 0, 0}, false); + Skin.m_pTask = std::make_shared(this, Storage(), aUrl, Skin.m_aPath, IStorage::TYPE_SAVE, CTimeout{0, 0, 0}, false); m_pClient->Engine()->AddJob(Skin.m_pTask); m_aDownloadSkins.add(Skin); return -1; diff --git a/src/game/client/components/skins.h b/src/game/client/components/skins.h index 4b6c35aff..8ec94f750 100644 --- a/src/game/client/components/skins.h +++ b/src/game/client/components/skins.h @@ -12,9 +12,21 @@ class CSkins : public CComponent { public: + class CGetPngFile : public CGetFile + { + CSkins *m_pSkins; + + protected: + virtual int OnCompletion(int State); + + public: + CGetPngFile(CSkins *pSkins, IStorage *pStorage, const char *pUrl, const char *pDest, int StorageType = -2, CTimeout Timeout = CTimeout{4000, 500, 5}, bool LogProgress = true); + CImageInfo m_Info; + }; + struct CDownloadSkin { - std::shared_ptr m_pTask; + std::shared_ptr m_pTask; char m_aPath[MAX_PATH_LENGTH]; char m_aName[24]; @@ -35,7 +47,9 @@ private: sorted_array m_aDownloadSkins; char m_EventSkinPrefix[24]; + bool LoadSkinPNG(CImageInfo &Info, const char *pName, const char *pPath, int DirType); int LoadSkin(const char *pName, const char *pPath, int DirType); + int LoadSkin(const char *pName, CImageInfo &Info); int FindImpl(const char *pName); static int SkinScan(const char *pName, int IsDir, int DirType, void *pUser); }; diff --git a/src/game/client/ui.h b/src/game/client/ui.h index aa3b19cbb..9c7ff3371 100644 --- a/src/game/client/ui.h +++ b/src/game/client/ui.h @@ -102,6 +102,21 @@ public: void HMargin(float Cut, CUIRect *pOtherRect) const; }; +struct SUIAnimator +{ + bool m_Active; + bool m_ScaleLabel; + bool m_RepositionLabel; + + int64 m_Time; + float m_Value; + + float m_XOffset; + float m_YOffset; + float m_WOffset; + float m_HOffset; +}; + class CUI; class CUIElement diff --git a/src/game/editor/editor.cpp b/src/game/editor/editor.cpp index 68b5f8bcc..9eb8ab49a 100644 --- a/src/game/editor/editor.cpp +++ b/src/game/editor/editor.cpp @@ -5524,6 +5524,24 @@ void CEditor::RenderServerSettingsEditor(CUIRect View, bool ShowServerSettingsEd str_copy(m_aSettingsCommand, m_Map.m_lSettings[s_CommandSelectedIndex].m_aCommand, sizeof(m_aSettingsCommand)); UI()->SetActiveItem(&m_CommandBox); } + + ToolBar.VSplitRight(25.0f, &ToolBar, &Button); + Button.VSplitRight(5.0f, &Button, 0); + static int s_DownButton = 0; + if(s_CommandSelectedIndex < m_Map.m_lSettings.size() - 1 && DoButton_Editor(&s_DownButton, "▼", 0, &Button, 0, "Move command down")) + { + std::swap(m_Map.m_lSettings[s_CommandSelectedIndex], m_Map.m_lSettings[s_CommandSelectedIndex + 1]); + s_CommandSelectedIndex++; + } + + ToolBar.VSplitRight(25.0f, &ToolBar, &Button); + Button.VSplitRight(5.0f, &Button, 0); + static int s_UpButton = 0; + if(s_CommandSelectedIndex > 0 && DoButton_Editor(&s_UpButton, "▲", 0, &Button, 0, "Move command up")) + { + std::swap(m_Map.m_lSettings[s_CommandSelectedIndex], m_Map.m_lSettings[s_CommandSelectedIndex - 1]); + s_CommandSelectedIndex--; + } } } diff --git a/src/game/version.h b/src/game/version.h index d29b55d7f..ffb1997af 100644 --- a/src/game/version.h +++ b/src/game/version.h @@ -3,11 +3,11 @@ #ifndef GAME_VERSION_H #define GAME_VERSION_H #ifndef GAME_RELEASE_VERSION -#define GAME_RELEASE_VERSION "15.2.3" +#define GAME_RELEASE_VERSION "15.2.4" #endif #define GAME_VERSION "0.6.4, " GAME_RELEASE_VERSION #define GAME_NETVERSION "0.6 626fce9a778df4d4" #define GAME_NAME "DDNet" -#define CLIENT_VERSIONNR 15023 +#define CLIENT_VERSIONNR 15024 extern const char *GIT_SHORTREV_HASH; #endif