mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			200 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * CMainMenu.h, part of VCMI engine
 | |
|  *
 | |
|  * Authors: listed in file AUTHORS in main folder
 | |
|  *
 | |
|  * License: GNU General Public License v2.0 or later
 | |
|  * Full text of license available in license.txt file, in main folder
 | |
|  *
 | |
|  */
 | |
| #pragma once
 | |
| 
 | |
| #include "../windows/CWindowObject.h"
 | |
| #include "../../lib/json/JsonNode.h"
 | |
| #include "../../lib/LoadProgress.h"
 | |
| 
 | |
| VCMI_LIB_NAMESPACE_BEGIN
 | |
| 
 | |
| class CampaignState;
 | |
| 
 | |
| VCMI_LIB_NAMESPACE_END
 | |
| 
 | |
| class CTextInput;
 | |
| class CGStatusBar;
 | |
| class CTextBox;
 | |
| class CTabbedInt;
 | |
| class CAnimImage;
 | |
| class CAnimation;
 | |
| class CButton;
 | |
| class CFilledTexture;
 | |
| class CLabel;
 | |
| class VideoWidget;
 | |
| 
 | |
| // TODO: Find new location for these enums
 | |
| enum class ESelectionScreen : ui8 {
 | |
| 	unknown = 0, newGame, loadGame, saveGame, scenarioInfo, campaignList
 | |
| };
 | |
| 
 | |
| enum class ELoadMode : ui8
 | |
| {
 | |
| 	NONE = 0, SINGLE, MULTI, CAMPAIGN, TUTORIAL
 | |
| };
 | |
| 
 | |
| /// The main menu screens listed in the EState enum
 | |
| class CMenuScreen : public CWindowObject
 | |
| {
 | |
| 	const JsonNode & config;
 | |
| 
 | |
| 	std::shared_ptr<CTabbedInt> tabs;
 | |
| 
 | |
| 	std::shared_ptr<CPicture> background;
 | |
| 	std::shared_ptr<VideoWidget> videoPlayer;
 | |
| 	std::vector<std::shared_ptr<CPicture>> images;
 | |
| 
 | |
| 	std::shared_ptr<CIntObject> createTab(size_t index);
 | |
| 
 | |
| public:
 | |
| 	std::vector<std::string> menuNameToEntry;
 | |
| 
 | |
| 	CMenuScreen(const JsonNode & configNode);
 | |
| 
 | |
| 	void activate() override;
 | |
| 	void show(Canvas & to) override;
 | |
| 
 | |
| 	void switchToTab(size_t index);
 | |
| 	void switchToTab(std::string name);
 | |
| 	size_t getActiveTab() const;
 | |
| };
 | |
| 
 | |
| class CMenuEntry : public CIntObject
 | |
| {
 | |
| 	std::vector<std::shared_ptr<CPicture>> images;
 | |
| 	std::vector<std::shared_ptr<CButton>> buttons;
 | |
| 
 | |
| 	std::shared_ptr<CButton> createButton(CMenuScreen * parent, const JsonNode & button);
 | |
| 
 | |
| public:
 | |
| 	CMenuEntry(CMenuScreen * parent, const JsonNode & config);
 | |
| };
 | |
| 
 | |
| /// Multiplayer mode
 | |
| class CMultiMode : public WindowBase
 | |
| {
 | |
| public:
 | |
| 	ESelectionScreen screenType;
 | |
| 	std::shared_ptr<CPicture> background;
 | |
| 	std::shared_ptr<CPicture> picture;
 | |
| 	std::shared_ptr<CTextInput> playerName;
 | |
| 	std::shared_ptr<CButton> buttonHotseat;
 | |
| 	std::shared_ptr<CButton> buttonLobby;
 | |
| 	std::shared_ptr<CButton> buttonHost;
 | |
| 	std::shared_ptr<CButton> buttonJoin;
 | |
| 	std::shared_ptr<CButton> buttonCancel;
 | |
| 	std::shared_ptr<CGStatusBar> statusBar;
 | |
| 
 | |
| 	CMultiMode(ESelectionScreen ScreenType);
 | |
| 	void openLobby();
 | |
| 	void hostTCP();
 | |
| 	void joinTCP();
 | |
| 	std::string getPlayerName();
 | |
| 
 | |
| 	void onNameChange(std::string newText);
 | |
| };
 | |
| 
 | |
| /// Hot seat player window
 | |
| class CMultiPlayers : public WindowBase
 | |
| {
 | |
| 	bool host;
 | |
| 	ELoadMode loadMode;
 | |
| 	ESelectionScreen screenType;
 | |
| 	std::shared_ptr<CPicture> background;
 | |
| 	std::shared_ptr<CTextBox> textTitle;
 | |
| 	std::array<std::shared_ptr<CTextInput>, 8> inputNames;
 | |
| 	std::shared_ptr<CButton> buttonOk;
 | |
| 	std::shared_ptr<CButton> buttonCancel;
 | |
| 	std::shared_ptr<CGStatusBar> statusBar;
 | |
| 
 | |
| 	void onChange(std::string newText);
 | |
| 	void enterSelectionScreen();
 | |
| 
 | |
| public:
 | |
| 	CMultiPlayers(const std::string & firstPlayer, ESelectionScreen ScreenType, bool Host, ELoadMode LoadMode);
 | |
| };
 | |
| 
 | |
| /// Manages the configuration of pregame GUI elements like campaign screen, main menu, loading screen,...
 | |
| class CMainMenuConfig
 | |
| {
 | |
| public:
 | |
| 	static const CMainMenuConfig & get();
 | |
| 	const JsonNode & getConfig() const;
 | |
| 	const JsonNode & getCampaigns() const;
 | |
| 
 | |
| private:
 | |
| 	CMainMenuConfig();
 | |
| 
 | |
| 	const JsonNode campaignSets;
 | |
| 	const JsonNode config;
 | |
| };
 | |
| 
 | |
| /// Handles background screen, loads graphics for victory/loss condition and random town or hero selection
 | |
| class CMainMenu : public CIntObject, public IUpdateable, public std::enable_shared_from_this<CMainMenu>
 | |
| {
 | |
| 	std::shared_ptr<CFilledTexture> backgroundAroundMenu;
 | |
| 
 | |
| 	CMainMenu(); //Use CMainMenu::create
 | |
| 
 | |
| public:
 | |
| 	std::shared_ptr<CMenuScreen> menu;
 | |
| 
 | |
| 	~CMainMenu();
 | |
| 	void activate() override;
 | |
| 	void onScreenResize() override;
 | |
| 	void update() override;
 | |
| 	static void openLobby(ESelectionScreen screenType, bool host, const std::vector<std::string> & names, ELoadMode loadMode);
 | |
| 	static void openCampaignLobby(const std::string & campaignFileName, std::string campaignSet = "");
 | |
| 	static void openCampaignLobby(std::shared_ptr<CampaignState> campaign);
 | |
| 	static void startTutorial();
 | |
| 	static void openHighScoreScreen();
 | |
| 	void openCampaignScreen(std::string name);
 | |
| 
 | |
| 	static std::shared_ptr<CMainMenu> create();
 | |
| 
 | |
| 	static std::shared_ptr<CPicture> createPicture(const JsonNode & config);
 | |
| 
 | |
| };
 | |
| 
 | |
| /// Simple window to enter the server's address.
 | |
| class CSimpleJoinScreen : public WindowBase
 | |
| {
 | |
| 	std::shared_ptr<CPicture> background;
 | |
| 	std::shared_ptr<CTextBox> textTitle;
 | |
| 	std::shared_ptr<CButton> buttonOk;
 | |
| 	std::shared_ptr<CButton> buttonCancel;
 | |
| 	std::shared_ptr<CGStatusBar> statusBar;
 | |
| 	std::shared_ptr<CTextInput> inputAddress;
 | |
| 	std::shared_ptr<CTextInput> inputPort;
 | |
| 
 | |
| 	void connectToServer();
 | |
| 	void leaveScreen();
 | |
| 	void onChange(const std::string & newText);
 | |
| 	void startConnection(const std::string & addr = {}, ui16 port = 0);
 | |
| 
 | |
| public:
 | |
| 	CSimpleJoinScreen(bool host = true);
 | |
| };
 | |
| 
 | |
| class CLoadingScreen : virtual public CWindowObject, virtual public Load::Progress
 | |
| {
 | |
| 	std::vector<std::shared_ptr<CAnimImage>> progressBlocks;
 | |
| 	
 | |
| 	ImagePath getBackground();
 | |
| 
 | |
| public:	
 | |
| 	CLoadingScreen();
 | |
| 	~CLoadingScreen();
 | |
| 
 | |
| 	void tick(uint32_t msPassed) override;
 | |
| };
 | |
| 
 | |
| extern std::shared_ptr<CMainMenu> CMM;
 |