1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-28 08:48:48 +02:00
vcmi/client/lobby/OptionsTab.h
Arseniy Shestakov ac66fc7f42 Full rework of pre-game interface and networking
New features for players:
* Loading for multiplayer. Any save could be used for multiplayer.
* Restart for multiplayer. All clients will restart together.
* Loading from single save.
* Hotseat mixed with network game. Multiple players per client.
* Now connection to server could be cancelled.
* Return to menu on disconnections instead of crashes.
* Restoring of last selected map, save or campaign on next run.

TLDR on important changes in engine code:
* UI: work with server separated from UI
* UI: all explitic blitting replaced with IntObject's
* UI: all new code use smart pointers instead of DISPOSE
* Gameplay always start through lobby controlled by server.
* Threads receiving netpacks now shared for lobby and gameplay.
* Campaigns: heroes for crossover now serialized as JsonNode.
2018-04-04 14:24:26 +07:00

128 lines
3.5 KiB
C++

/*
* OptionsTab.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 "../../lib/StartInfo.h"
#include "../../lib/mapping/CMap.h"
class CSlider;
class CLabel;
class CMultiLineLabel;
class CFilledTexture;
class CAnimImage;
class CComponentBox;
/// The options tab which is shown at the map selection phase.
class OptionsTab : public CIntObject
{
std::shared_ptr<CPicture> background;
std::shared_ptr<CLabel> labelTitle;
std::shared_ptr<CMultiLineLabel> labelSubTitle;
std::shared_ptr<CMultiLineLabel> labelPlayerNameAndHandicap;
std::shared_ptr<CMultiLineLabel> labelStartingTown;
std::shared_ptr<CMultiLineLabel> labelStartingHero;
std::shared_ptr<CMultiLineLabel> labelStartingBonus;
std::shared_ptr<CLabel> labelPlayerTurnDuration;
std::shared_ptr<CLabel> labelTurnDurationValue;
public:
enum SelType
{
TOWN,
HERO,
BONUS
};
struct CPlayerSettingsHelper
{
const PlayerSettings & settings;
const SelType type;
CPlayerSettingsHelper(const PlayerSettings & settings, SelType type)
: settings(settings), type(type)
{}
/// visible image settings
size_t getImageIndex();
std::string getImageName();
std::string getName(); /// name visible in options dialog
std::string getTitle(); /// title in popup box
std::string getSubtitle(); /// popup box subtitle
std::string getDescription(); /// popup box description, not always present
};
class CPlayerOptionTooltipBox : public CWindowObject, public CPlayerSettingsHelper
{
std::shared_ptr<CFilledTexture> backgroundTexture;
std::shared_ptr<CLabel> labelTitle;
std::shared_ptr<CLabel> labelSubTitle;
std::shared_ptr<CAnimImage> image;
std::shared_ptr<CLabel> labelAssociatedCreatures;
std::shared_ptr<CComponentBox> boxAssociatedCreatures;
std::shared_ptr<CLabel> labelHeroSpeciality;
std::shared_ptr<CAnimImage> imageSpeciality;
std::shared_ptr<CLabel> labelSpecialityName;
std::shared_ptr<CTextBox> textBonusDescription;
void genHeader();
void genTownWindow();
void genHeroWindow();
void genBonusWindow();
public:
CPlayerOptionTooltipBox(CPlayerSettingsHelper & helper);
};
/// Image with current town/hero/bonus
struct SelectedBox : public CIntObject, public CPlayerSettingsHelper
{
std::shared_ptr<CAnimImage> image;
std::shared_ptr<CLabel> subtitle;
SelectedBox(Point position, PlayerSettings & settings, SelType type);
void clickRight(tribool down, bool previousState) override;
void update();
};
struct PlayerOptionsEntry : public CIntObject
{
PlayerInfo pi;
PlayerSettings s;
std::shared_ptr<CLabel> labelPlayerName;
std::shared_ptr<CMultiLineLabel> labelWhoCanPlay;
std::shared_ptr<CPicture> background;
std::shared_ptr<CButton> buttonTownLeft;
std::shared_ptr<CButton> buttonTownRight;
std::shared_ptr<CButton> buttonHeroLeft;
std::shared_ptr<CButton> buttonHeroRight;
std::shared_ptr<CButton> buttonBonusLeft;
std::shared_ptr<CButton> buttonBonusRight;
std::shared_ptr<CButton> flag;
std::shared_ptr<SelectedBox> town;
std::shared_ptr<SelectedBox> hero;
std::shared_ptr<SelectedBox> bonus;
enum {HUMAN_OR_CPU, HUMAN, CPU} whoCanPlay;
PlayerOptionsEntry(const PlayerSettings & S);
void hideUnavailableButtons();
};
std::shared_ptr<CSlider> sliderTurnDuration;
std::map<PlayerColor, std::shared_ptr<PlayerOptionsEntry>> entries;
OptionsTab();
void recreate();
};