 [WIP] Split up lobby -> menu, lobby, custom_game
lobby.gd had gotten big, bloated, ugly, and hard to read. It needed a
refactor. The first thing I did is split up the *GUI* into the logical
steps it should be. So the new flow is:
- Start the game
- Click "Quick Play"
- Matchmaking begins on my dedicated server
- Start the game
- Click "Custom Game"
- *Only now* am I presented with server / client options
- Start the game
- Click "Singleplayer"
- Singleplayer
NOW, and only now, and NO MATTER WHAT PATH I TAKE, I am taken to the
*lobby*, which now is where I:
- Choose my name
- Choose hero
- See list of players
- Get my team assigned
- Anything else that I might like to put in
The point here is that this has *nothing* to do with handshaking /
matchmaking / etc! This is just part of the game! At this point I have
*already been connected* to the server. I've already been aquainted with
my other players. The game has begun.
I put the things that don't belong in any of these flows in
networking.gd, a sort of model-view sorta thing. All of these flows use
some sort of networking thing like `init_server` that tbh should be
*completely* abstracted from the UI.
It's totally a WIP!!! Above is the IDEA, but below is what I've actually
*done*:
- Made the scenes, made a passable UI for each one that at least
indicates ~what they'll do
- Made the corresponding scripts, and split up the lobby script into
ABOUT where I think it'll end up, but no promises
It still errors all over the place, and it's nowhere near properly
organized. PLUS, I'd also like to rewrite a lot of the code / rename
things as part of the initial refactor goal of making me able to
actually think about networking.
7 years ago |
|
- extends Control
-
- var port = null # Defined by command-line argument with default
-
- func _ready():
- if get_tree().is_network_server():
- get_node("LevelSelect").show()
-
- get_node("Username").connect("text_changed", self, "_send_name")
- get_node("StartGame").connect("pressed", self, "_start_game")
-
- var spectating = util.args.get_value("-silent")
- get_node("Spectating").pressed = spectating
- #
- get_node("Spectating").connect("toggled", networking, "set_spectating") # TODO
- # get_node("CustomGame/LevelSelect").connect("item_selected", self, "select_level") TODO
- # _send_name()
-
- func _collect_info():
- var my_id = get_tree().get_network_unique_id()
- var my_info = networking.players[my_id]
- if not "username" in my_info:
- my_info.username = get_node("Username").get_text()
- if not "hero" in my_info:
- my_info.hero = get_node("HeroSelect/Hero").get_selected_id()
- if not "is_right_team" in my_info:
- my_info.is_right_team = false # Server assigns team, wait for that
-
- func select_hero(hero):
- var description = get_node("HeroSelect").hero_text[hero]
- get_node("HeroDescription").set_text(description)
- var my_id = get_tree().get_network_unique_id()
- networking.players[my_id].hero = hero
- rpc("set_hero", get_tree().get_network_unique_id(), hero)
-
- sync func set_hero(peer, hero):
- networking.players[peer].hero = hero
- render_player_list()
-
- func _send_name():
- var name = get_node("Username").text
- rpc("_set_name", get_tree().get_network_unique_id(), name)
-
- sync func _set_name(peer, name):
- networking.players[peer].username = name
- render_player_list()
-
- func render_player_list():
- if has_node("PlayerSettings"):
- var list = ""
- var hero_names = get_node("HeroSelect").hero_names
- for p in networking.players:
- list += "%-15s" % networking.players[p].username
- list += "%-20s" % hero_names[networking.players[p].hero]
- if networking.players[p].is_right_team:
- list += "Right Team"
- else:
- list += "Left Team"
- list += "\n"
- get_node("JoinedGameLobby/PlayerList").set_text(list)
-
- sync func assign_team(peer, is_right_team):
- networking.players[peer].is_right_team = is_right_team
- if peer == get_tree().get_network_unique_id():
- if is_right_team:
- get_node("Team").set_text("Right Team")
- else:
- get_node("Team").set_text("Left Team")
- render_player_list()
-
- func _start_game():
- _collect_info()
- var level = 2 # TODO
- networking.rpc_id(1, "start_game", level)
-
|