2020-09-18 16:45:42 +00:00
|
|
|
#ifndef GAME_CLIENT_COMPONENTS_MENU_BACKGROUND_H
|
|
|
|
#define GAME_CLIENT_COMPONENTS_MENU_BACKGROUND_H
|
|
|
|
|
|
|
|
#include <game/client/components/background.h>
|
|
|
|
#include <game/client/components/camera.h>
|
|
|
|
|
2023-03-18 07:07:25 +00:00
|
|
|
#include <array>
|
2022-05-18 16:00:05 +00:00
|
|
|
#include <chrono>
|
2022-05-06 21:51:24 +00:00
|
|
|
#include <string>
|
2020-09-18 16:45:42 +00:00
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
class CMenuMap : public CBackgroundEngineMap
|
|
|
|
{
|
2023-11-28 20:46:03 +00:00
|
|
|
MACRO_INTERFACE("menu_enginemap")
|
2020-09-18 16:45:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// themes
|
|
|
|
class CTheme
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CTheme() {}
|
2022-06-30 22:36:32 +00:00
|
|
|
CTheme(const char *pName, bool HasDay, bool HasNight) :
|
|
|
|
m_Name(pName), m_HasDay(HasDay), m_HasNight(HasNight) {}
|
2020-09-18 16:45:42 +00:00
|
|
|
|
2022-05-06 21:51:24 +00:00
|
|
|
std::string m_Name;
|
2020-09-18 16:45:42 +00:00
|
|
|
bool m_HasDay;
|
|
|
|
bool m_HasNight;
|
|
|
|
IGraphics::CTextureHandle m_IconTexture;
|
|
|
|
bool operator<(const CTheme &Other) const { return m_Name < Other.m_Name; }
|
|
|
|
};
|
|
|
|
|
|
|
|
class CMenuBackground : public CBackground
|
|
|
|
{
|
2022-05-18 16:00:05 +00:00
|
|
|
std::chrono::nanoseconds m_ThemeScanStartTime{0};
|
2022-04-02 11:37:59 +00:00
|
|
|
|
2022-06-23 17:59:38 +00:00
|
|
|
protected:
|
|
|
|
bool CanRenderMenuBackground() override { return false; }
|
|
|
|
|
2020-09-18 16:45:42 +00:00
|
|
|
public:
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
POS_START = 0,
|
|
|
|
POS_DEMOS,
|
|
|
|
POS_NEWS,
|
|
|
|
POS_SETTINGS_LANGUAGE,
|
|
|
|
POS_SETTINGS_GENERAL,
|
|
|
|
POS_SETTINGS_PLAYER,
|
|
|
|
POS_SETTINGS_TEE,
|
2022-06-26 22:38:49 +00:00
|
|
|
POS_SETTINGS_APPEARANCE,
|
2020-09-18 16:45:42 +00:00
|
|
|
POS_SETTINGS_CONTROLS,
|
|
|
|
POS_SETTINGS_GRAPHICS,
|
|
|
|
POS_SETTINGS_SOUND,
|
|
|
|
POS_SETTINGS_DDNET,
|
2020-09-26 07:37:35 +00:00
|
|
|
POS_SETTINGS_ASSETS,
|
|
|
|
POS_SETTINGS_RESERVED0,
|
|
|
|
POS_SETTINGS_RESERVED1,
|
|
|
|
POS_BROWSER_INTERNET,
|
|
|
|
POS_BROWSER_LAN,
|
|
|
|
POS_BROWSER_FAVORITES,
|
Add community server filter and icons, remove DDNet and KoG tabs
Remove the DDNet and KoG tabs and replace them with a community filter, which works like the country and type filters. Community information (ID, name, icon SHA256, countries, types, servers, ranked maps) is loaded dynamically from the DDNet info json.
The official checkmark icon is replaced with community icons. The icons are downloaded to the `communityicons` folder in the config directory from a URL specified in the DDNet info json. The icons are only re-downloaded when their SHA256 has changed.
Per default, the Internet tab with all communities is selected. When starting the client for the first time, only the DDNet community is selected. The community, country and type filters can also be used on the Favorites tab now. The LAN tab remains unchanged.
The country and type filters are refactored. Previously, using these filters changed the total number of servers and players that were displayed, as the filter was implemented as a separate step. Now the community, country and type filters work like the other browser filters. This also has the benefit that the server list and DDNet info json are not reloaded each time these filters are changed, as updating the local filtering/sorting is enough now.
The check for finished maps is made more efficient by using an `std::unordered_set` instead of linear search.
Closes #5654.
2023-08-28 20:08:51 +00:00
|
|
|
POS_BROWSER_CUSTOM0,
|
|
|
|
POS_BROWSER_CUSTOM1,
|
2020-09-26 07:37:35 +00:00
|
|
|
POS_BROWSER_CUSTOM2,
|
|
|
|
POS_BROWSER_CUSTOM3,
|
|
|
|
POS_RESERVED0,
|
|
|
|
POS_RESERVED1,
|
|
|
|
POS_RESERVED2,
|
2020-09-18 16:45:42 +00:00
|
|
|
|
|
|
|
NUM_POS,
|
|
|
|
|
2020-09-26 07:37:35 +00:00
|
|
|
POS_BROWSER_CUSTOM_NUM = (POS_BROWSER_CUSTOM3 - POS_BROWSER_CUSTOM0) + 1,
|
|
|
|
POS_SETTINGS_RESERVED_NUM = (POS_SETTINGS_RESERVED1 - POS_SETTINGS_RESERVED0) + 1,
|
|
|
|
POS_RESERVED_NUM = (POS_RESERVED2 - POS_RESERVED0) + 1,
|
2020-09-18 16:45:42 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
enum
|
|
|
|
{
|
|
|
|
PREDEFINED_THEMES_COUNT = 3,
|
|
|
|
};
|
|
|
|
|
|
|
|
CCamera m_Camera;
|
|
|
|
|
|
|
|
CBackgroundEngineMap *CreateBGMap() override;
|
|
|
|
|
|
|
|
vec2 m_RotationCenter;
|
2023-03-17 18:25:50 +00:00
|
|
|
std::array<vec2, NUM_POS> m_aPositions;
|
2020-09-18 16:45:42 +00:00
|
|
|
int m_CurrentPosition;
|
|
|
|
vec2 m_AnimationStartPos;
|
2020-10-13 11:15:44 +00:00
|
|
|
bool m_ChangedPosition;
|
2020-09-18 16:45:42 +00:00
|
|
|
float m_MoveTime;
|
|
|
|
|
|
|
|
bool m_IsInit;
|
|
|
|
|
|
|
|
void ResetPositions();
|
|
|
|
|
2023-11-04 10:15:43 +00:00
|
|
|
void LoadThemeIcon(CTheme &Theme);
|
2020-09-18 16:45:42 +00:00
|
|
|
static int ThemeScan(const char *pName, int IsDir, int DirType, void *pUser);
|
|
|
|
|
2022-06-11 19:38:18 +00:00
|
|
|
std::vector<CTheme> m_vThemes;
|
2020-09-18 16:45:42 +00:00
|
|
|
|
|
|
|
CMenuBackground();
|
|
|
|
~CMenuBackground() override {}
|
2022-01-31 02:11:47 +00:00
|
|
|
virtual int Sizeof() const override { return sizeof(*this); }
|
2020-09-18 16:45:42 +00:00
|
|
|
|
|
|
|
void OnInit() override;
|
|
|
|
void OnMapLoad() override;
|
|
|
|
void OnRender() override;
|
|
|
|
|
|
|
|
void LoadMenuBackground(bool HasDayHint = true, bool HasNightHint = true);
|
|
|
|
|
|
|
|
bool Render();
|
|
|
|
|
|
|
|
class CCamera *GetCurCamera() override;
|
|
|
|
|
|
|
|
void ChangePosition(int PositionNumber);
|
|
|
|
|
|
|
|
std::vector<CTheme> &GetThemes();
|
|
|
|
};
|
|
|
|
|
2023-03-17 18:25:50 +00:00
|
|
|
std::array<vec2, CMenuBackground::NUM_POS> GenerateMenuBackgroundPositions();
|
|
|
|
|
2020-09-18 16:45:42 +00:00
|
|
|
#endif
|