Opened 9 years ago
Last modified 4 years ago
#3806 new enhancement
[PATCH] Gamesetup - Optionally allow players to setup the game
Reported by: | elexis | Owned by: | Imarok |
---|---|---|---|
Priority: | Should Have | Milestone: | Backlog |
Component: | UI – Game setup | Keywords: | patch |
Cc: | rogue-spectre | Patch: | Phab:D431 |
Description (last modified by )
It would be nice if players could pick their own civilizations without having to communicate it via chat to the host.
Since it is a delicate issue to balance the teams, the setting could be implemented using a dropdownlist, giving players different degrees of freedom (none, civs only, civs+teams, all gamesettings)).
There is an according TODO in gamesetup.js
:
// TODO: Shouldn't players be able to choose their own assignment? for (let i = 0; i < g_MaxPlayers; ++i) { Engine.GetGUIObjectByName("playerAssignment["+i+"]").hidden = true; Engine.GetGUIObjectByName("playerCiv["+i+"]").hidden = true; Engine.GetGUIObjectByName("playerTeam["+i+"]").hidden = true; }
(Previous releases had signficantly imbalanced civilizations, so no sane host would have allowed players to pick OP civs. With alpha 19, balance is significantly improved, so that this feature becomes actually useful).
The remaining TODOs are: server code:
rewrite changeSetting message to send only the value and the name of the changed settingForward the changeSetting message only to the hostOnly accept new settings message from host
gamesetup.js:
- When recieving a changesetting message from server, check if change is legit. If so send new settings to server
Attachments (25)
Change History (49)
comment:1 by , 9 years ago
Cc: | added |
---|---|
Priority: | Nice to Have → Should Have |
comment:2 by , 9 years ago
This is also a requirement for #3556. It is probably not simple, as the the controller of the gamesetup must not assume that it can access the server directly via the ScriptInterface, but needs to send the settings via network.
comment:3 by , 8 years ago
Owner: | set to |
---|
comment:4 by , 8 years ago
My solution would be:
Adding a new scriptfunction that sends a message(like chatmessage or readymessage) with the new setings to the server.
Make the server listen to it.
If the server recieves the message he applies the new values and updates the client with his UpdateGameAttributes
function.
Is this draft right/ok?
by , 8 years ago
Attachment: | 3806_player_gamesetup_v0.5.patch added |
---|
WIP Patch: already implemented a test button to set the revealMap
setting to false, that can be used by every player
comment:5 by , 8 years ago
PlayersCanChange
-> GuestSettings
?
Color & Civilization & Team
=> Color, Civilization and Team
by , 8 years ago
Attachment: | 3806_player_gamesetup_v0.6.patch added |
---|
still WIP, changed PlayersCanChange
to GuestSettings
by , 8 years ago
Attachment: | 3806_player_gamesetup_v0.9.patch added |
---|
This patch works completley. One little bug is that the guestsettings setting sometimes resets. Also I need to cleanup the code to remove comments, warnings and follow the CodingConventions.
by , 8 years ago
Attachment: | 3806_player_gamesetup_v1.1.patch added |
---|
Fixes the ticket. The additional loading state will be removed when elexis made his patch for gamesetup.js
comment:6 by , 8 years ago
Keywords: | review patch added |
---|---|
Milestone: | Backlog → Alpha 21 |
by , 8 years ago
Attachment: | 3806_player_gamesetup_v1.2.patch added |
---|
Removed SetNetworkGameAttributes as it is unneeded now, removed the TODO mentioned in the ticket description, extended initDropdowns and some cleanup
by , 8 years ago
Attachment: | 3806_player_gamesetup_v1.4_rebased.patch added |
---|
Removed the additonal loading state and done some cleanup
by , 8 years ago
Attachment: | 3806_player_gamesetup_v1.5.patch added |
---|
pass string as ref and reverted L74
comment:7 by , 8 years ago
TODO:
- Let player A not cange player B's color (same with civ and team)
- Ensure the change was valid (maybe in a new ticket)
by , 8 years ago
Attachment: | 3806_player_gamesetup_v1.7.patch added |
---|
Let player only change their own color/team/civ if guestsetting!="all", removed the CStr8->CStr changes
comment:8 by , 8 years ago
Description: | modified (diff) |
---|---|
Keywords: | review patch removed |
by , 8 years ago
Attachment: | 3806_player_gamesetup_v1.7.1.patch added |
---|
removed the failed hunk and added guest_settings.json that wasn't included in the previous patch
by , 8 years ago
Attachment: | 3806_player_gamesetup_v2.0.patch added |
---|
ChangeSettingMessage only sends changed setting and value, forward ChangeSettingMessage only to host, ignore every AssignPlayerMessage not coming from host, ignore every SetGameAttributesMessage not coming from host
comment:9 by , 8 years ago
Description: | modified (diff) |
---|
by , 8 years ago
Attachment: | 3806_player_gamesetup_v2.3.patch added |
---|
cpp part is finished. js part needs to wait for #3994
by , 8 years ago
Attachment: | 3806_player_gamesetup_v2.4.patch added |
---|
reverted the renaming of SetNetworkGameAttributes
by , 8 years ago
Attachment: | 3556_dedServer_v0.2.patch added |
---|
Only the part of sending gameSetup and assignments over network
by , 8 years ago
Attachment: | 3556_dedServer_v1.1.patch added |
---|
WIP Also handle StartNetworkGame, KickPlayer, SetNetworkPlayerStatus, ClearAllPlayerReady over network. Delete SetTurnLength ScriptFunction because it's unused.
by , 8 years ago
Attachment: | 3556_dedServer_v1.3.1.patch added |
---|
Don't remove SetTurnLength. Add Transition for NMT_KICKED when syncing
comment:10 by , 8 years ago
Thanks for working on this big ticket and splitting the patch into smaller managable subsets!
Here my review of your patch that replaces the direct C++ access to the server with network interaction:
- Seems to work on linux here, testing briefly with two instances.
m_GUIDToAssign
->m_GUID
.- Use
ENSURE
for the sake of consistency (and cross fingers that for example hotloadingsession.js
won't setg_IsNetworked
to false triggering the breakpoint for example). - Use
CStr
instead ofstd::string
. - Since the code doesn't care about the return value of the
KickPlayer
functions anymore the return value should be changed from bool to void too. - Comment for
ClearAllPlayerReady
in the header of theNetClient
missing - The new ready message type is not needed. There already is a ready message type which can be reused to reset the ready state of others.
The code could reject the message if a client that isn't the controller tries to reset the state of someone else. However calling
SetPlayerReady
once for every player when wanting to clear the ready state of all clients causes the sending of a playerassignment message for each client (even for observers). Better use a new message typeClearReady
. - The patch leaves the two
ClearAllPlayerReady()
of the server unused and copies theCNetServerWorker
one, while it should just call that if an authorized client wants to reset ready. - Since r8511, the
CNetServer
runs in the main thread, while theCNetServerWorker
runs in a separate thread, so that it can respond to messages even when the main thread is dying. Thus theCNetServer
contains almost no code (50 lines vs. 1450 lines of the server worker). TheCNetServer
functions only push the data from the GUI to the worker and don't do anything else. Kicking (#3241) violates this principle and should be made coherent (not necessarily in this patch). Since the code aims to not interact with the server from the GUI anymore, some of these functions became unused and should be removed, for exampleAssignPlayer
(others are still used by the autostart / commandline options)
comment:11 by , 8 years ago
Bug: The startgame button is disabled for the host, even if there are no other clients or if they are all ready. Without the patch, the client of the host joins the server, appears as not-ready and then is set to ready right afterwards. With your patch, it just remains not-ready. The reason seems to be gamesetup using emptystring as the GUID for the localhost (yay gamesetup). Came up with that, but it results in an unstoppable readyspam:
@@ -1103,14 +1096,76 @@ bool CNetServerWorker::OnReady(void* con CNetServerSession* session = (CNetServerSession*)context; CNetServerWorker& server = session->GetServer(); CReadyMessage* message = (CReadyMessage*)event->GetParamRef(); - message->m_GUID = session->GetGUID(); + if (session->GetGUID() == server.m_HostGUID) + server.SetPlayerReady(message->m_GUID, message->m_Status); + else + { + message->m_GUID = session->GetGUID(); + server.Broadcast(message); + } - server.Broadcast(message); + return true;
There may be further tedious related fallacies, but couldn't test yet due to that bug.
mainlog.html
contains all NetMessages send and received by the server, maybe that helps debugging. (At least when greping the file it does)
- Your proposed network protocol change seems to fulfil the requirements for having multiple controllers. (If there are multiple controllers, the game still shouldn't be started without the consent of all other clients. The ready/startgame button would have the startgame-functionality when all other clients are ready and the ready-functionality otherwise. This distinction will be done in the gamesetup script, not inside the server.)
if (session->GetGUID() != server.m_HostGUID)
-> what did I say about theif (!no) else
pattern?- You nuked the second
CReadyMessage
message, but you should also mergeSendReadyMessage
andSendSetPlayerStatusMessage
since they do the same thing.
by , 8 years ago
Attachment: | 3556_dedServer_v1.5.patch added |
---|
simplify ready message removed some if (!
by , 8 years ago
Attachment: | 3556_dedServer_v1.5.1.patch added |
---|
Rename SendKickPlayerMessage, Modify comment and remove the kick/ban LOGERROR
by , 8 years ago
Attachment: | 3556_dedServer_v1.5.2.patch added |
---|
Tell me if that works on windows and I'll commit it.
comment:13 by , 8 years ago
Keywords: | patch added |
---|---|
Summary: | Gamesetup - Optionally allow players to setup the game → [PATCH] Gamesetup - Optionally allow players to setup the game |
Thanks, that's a big step forward!
by , 8 years ago
Attachment: | 3806_player_gamesetup_v2.4_rebased.patch added |
---|
rebased version of the cpp part (introduces CChangeSettingMessage)
comment:14 by , 8 years ago
Keywords: | review added |
---|
comment:15 by , 8 years ago
Keywords: | review removed |
---|
comment:18 by , 7 years ago
Description: | modified (diff) |
---|---|
Patch: | → Phab:D431 |
comment:19 by , 7 years ago
Milestone: | Backlog → Alpha 23 |
---|
Would be really awesome to finish this for the upcoming release
comment:20 by , 7 years ago
Milestone: | Alpha 23 → Backlog |
---|
comment:21 by , 6 years ago
Component: | UI & Simulation → Game setup |
---|
Move tickets to Game Setup
as UI & Simulation
got some sub components.
comment:23 by , 4 years ago
refs r25077:
Separate Game Settings from the GUI Gamesetup
Split the gamesetup in two: the 'GameAttributes' part into gamesettings/ and the GUI/Presentation part in gamesetup/. This makes it easier to separate the presentation from the data.
The immediate benefit is that campaigns & autostart scripts don't need to load the gamesetup folder at all. This also makes it much easier for any modder that would want to to change the GameSetup itself.
Each 'game attribute' is given a unique class extending GameSetting (with a few exceptions), in charge of:
'Serializing' to the JSON-compatible 'InitAttributes' format, which is used for persisted settings, network synchronization, map script settings, hotloading. Deserializing from the same format. Watching for settings it depends on (such that e.g. unexploring the map also unreveals it).
The GUI controls remain in charge of presenting the state accurately, however they now directly subscribe to changes of the GameSettings for update. The updating logic in general has been lightened on the GUI side, making it more straightforward to know when something will update, and reducing un-necessary computations (in theory - in practice, I believe the gamesetup was already fairly good about this). The 'Controller' class of the gamesetup have also been lightened, since more responsibility now lies with GameSettings. In particular, this include code to actually launch a game.
In general the GameSettings class is permissive - the GUI gamesetup has tighter restriction for what the player can/cannot modify. This is intended to give flexibility for campaign maps, which may want to change arbitrary settings.
Further work would be useful, non-exhaustively:
the setting of default values remains messy. They currently exist somethings in GameSettings, sometimes in the GUI gamesetup, and in the simulation itself (in case attributes are not set). the availability and 'lockedness' of settings remains a work-in-progress. some attributes, like disabled technologies, should probably be removed and triggers used instead. the Handling of AI and player-specific data could be improved. settings Persistence should follow its own path - not all settings are worth persisting. GAIA settings are added simulation-side but not in the GUI, which is confusing.
Thanks langbart & Freagarach for testing.
Follows the gamesetup rewrite in rP23374.
Refs #3049
Differential Revision: https://code.wildfiregames.com/D3243
#2932 was a duplicate, with a less general aim.
I think this is an important issue.