1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-12-22 22:13:35 +02:00
vcmi/lib/NetPacksLobby.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

312 lines
7.2 KiB
C++

/*
* NetPacksLobby.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 "NetPacksBase.h"
#include "StartInfo.h"
class CCampaignState;
class CLobbyScreen;
class CServerHandler;
class CMapInfo;
struct StartInfo;
class CMapGenOptions;
struct ClientPlayer;
class CVCMIServer;
struct CPackForLobby : public CPack
{
bool checkClientPermissions(CVCMIServer * srv) const
{
return false;
}
bool applyOnServer(CVCMIServer * srv)
{
return true;
}
void applyOnServerAfterAnnounce(CVCMIServer * srv) {}
bool applyOnLobbyHandler(CServerHandler * handler)
{
return true;
}
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler) {}
};
struct CLobbyPackToPropagate : public CPackForLobby
{
};
struct CLobbyPackToServer : public CPackForLobby
{
bool checkClientPermissions(CVCMIServer * srv) const;
void applyOnServerAfterAnnounce(CVCMIServer * srv);
};
struct LobbyClientConnected : public CLobbyPackToPropagate
{
// Set by client before sending pack to server
std::string uuid;
std::vector<std::string> names;
StartInfo::EMode mode;
// Changed by server before announcing pack
int clientId;
int hostClientId;
LobbyClientConnected()
: mode(StartInfo::INVALID), clientId(-1), hostClientId(-1)
{}
bool checkClientPermissions(CVCMIServer * srv) const;
bool applyOnLobbyHandler(CServerHandler * handler);
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler);
bool applyOnServer(CVCMIServer * srv);
void applyOnServerAfterAnnounce(CVCMIServer * srv);
template <typename Handler> void serialize(Handler & h, const int version)
{
h & uuid;
h & names;
h & mode;
h & clientId;
h & hostClientId;
}
};
struct LobbyClientDisconnected : public CLobbyPackToPropagate
{
int clientId;
bool shutdownServer;
LobbyClientDisconnected() : shutdownServer(false) {}
bool checkClientPermissions(CVCMIServer * srv) const;
bool applyOnServer(CVCMIServer * srv);
void applyOnServerAfterAnnounce(CVCMIServer * srv);
bool applyOnLobbyHandler(CServerHandler * handler);
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & clientId;
h & shutdownServer;
}
};
struct LobbyChatMessage : public CLobbyPackToPropagate
{
std::string playerName, message;
bool checkClientPermissions(CVCMIServer * srv) const;
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & playerName;
h & message;
}
};
struct LobbyGuiAction : public CLobbyPackToPropagate
{
enum EAction : ui8 {
NONE, NO_TAB, OPEN_OPTIONS, OPEN_SCENARIO_LIST, OPEN_RANDOM_MAP_OPTIONS
} action;
LobbyGuiAction() : action(NONE) {}
bool checkClientPermissions(CVCMIServer * srv) const;
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & action;
}
};
struct LobbyStartGame : public CLobbyPackToPropagate
{
// Set by server
std::shared_ptr<StartInfo> initializedStartInfo;
LobbyStartGame() : initializedStartInfo(nullptr) {}
bool checkClientPermissions(CVCMIServer * srv) const;
bool applyOnServer(CVCMIServer * srv);
void applyOnServerAfterAnnounce(CVCMIServer * srv);
bool applyOnLobbyHandler(CServerHandler * handler);
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & initializedStartInfo;
}
};
struct LobbyChangeHost : public CLobbyPackToPropagate
{
int newHostConnectionId;
LobbyChangeHost() : newHostConnectionId(-1) {}
bool checkClientPermissions(CVCMIServer * srv) const;
bool applyOnServer(CVCMIServer * srv);
bool applyOnServerAfterAnnounce(CVCMIServer * srv);
template <typename Handler> void serialize(Handler & h, const int version)
{
h & newHostConnectionId;
}
};
struct LobbyUpdateState : public CLobbyPackToPropagate
{
LobbyState state;
bool hostChanged; // Used on client-side only
LobbyUpdateState() : hostChanged(false) {}
bool applyOnLobbyHandler(CServerHandler * handler);
void applyOnLobbyScreen(CLobbyScreen * lobby, CServerHandler * handler);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & state;
}
};
struct LobbySetMap : public CLobbyPackToServer
{
std::shared_ptr<CMapInfo> mapInfo;
std::shared_ptr<CMapGenOptions> mapGenOpts;
LobbySetMap() : mapInfo(nullptr), mapGenOpts(nullptr) {}
bool applyOnServer(CVCMIServer * srv);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & mapInfo;
h & mapGenOpts;
}
};
struct LobbySetCampaign : public CLobbyPackToServer
{
std::shared_ptr<CCampaignState> ourCampaign;
LobbySetCampaign() {}
bool applyOnServer(CVCMIServer * srv);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & ourCampaign;
}
};
struct LobbySetCampaignMap : public CLobbyPackToServer
{
int mapId;
LobbySetCampaignMap() : mapId(-1) {}
bool applyOnServer(CVCMIServer * srv);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & mapId;
}
};
struct LobbySetCampaignBonus : public CLobbyPackToServer
{
int bonusId;
LobbySetCampaignBonus() : bonusId(-1) {}
bool applyOnServer(CVCMIServer * srv);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & bonusId;
}
};
struct LobbyChangePlayerOption : public CLobbyPackToServer
{
enum EWhat : ui8 {UNKNOWN, TOWN, HERO, BONUS};
ui8 what;
si8 direction; //-1 or +1
PlayerColor color;
LobbyChangePlayerOption() : what(UNKNOWN), direction(0), color(PlayerColor::CANNOT_DETERMINE) {}
bool checkClientPermissions(CVCMIServer * srv) const;
bool applyOnServer(CVCMIServer * srv);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & what;
h & direction;
h & color;
}
};
struct LobbySetPlayer : public CLobbyPackToServer
{
PlayerColor clickedColor;
LobbySetPlayer() : clickedColor(PlayerColor::CANNOT_DETERMINE){}
bool applyOnServer(CVCMIServer * srv);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & clickedColor;
}
};
struct LobbySetTurnTime : public CLobbyPackToServer
{
ui8 turnTime;
LobbySetTurnTime() : turnTime(0) {}
bool applyOnServer(CVCMIServer * srv);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & turnTime;
}
};
struct LobbySetDifficulty : public CLobbyPackToServer
{
ui8 difficulty;
LobbySetDifficulty() : difficulty(0) {}
bool applyOnServer(CVCMIServer * srv);
template <typename Handler> void serialize(Handler &h, const int version)
{
h & difficulty;
}
};
struct LobbyForceSetPlayer : public CLobbyPackToServer
{
ui8 targetConnectedPlayer;
PlayerColor targetPlayerColor;
LobbyForceSetPlayer() : targetConnectedPlayer(-1), targetPlayerColor(PlayerColor::CANNOT_DETERMINE) {}
bool applyOnServer(CVCMIServer * srv);
template <typename Handler> void serialize(Handler & h, const int version)
{
h & targetConnectedPlayer;
h & targetPlayerColor;
}
};