diff --git a/scenes/lobby.tscn b/scenes/lobby.tscn index 10f49eb..8381d61 100644 --- a/scenes/lobby.tscn +++ b/scenes/lobby.tscn @@ -141,7 +141,7 @@ toggle_mode = true enabled_focus_mode = 2 shortcut = null group = null -text = "Spectating" +text = "Spectating " flat = false align = 0 @@ -252,16 +252,41 @@ percent_visible = 1.0 lines_skipped = 0 max_lines_visible = -1 -[node name="StartGame" type="Button" parent="." index="7"] +[node name="Ready" type="CheckButton" parent="." index="7"] anchor_left = 0.0 anchor_top = 0.0 anchor_right = 0.0 anchor_bottom = 0.0 +margin_left = 493.0 +margin_top = 436.0 +margin_right = 628.0 +margin_bottom = 476.0 +rect_pivot_offset = Vector2( 0, 0 ) +focus_mode = 2 +mouse_filter = 0 +mouse_default_cursor_shape = 0 +size_flags_horizontal = 1 +size_flags_vertical = 1 +toggle_mode = true +enabled_focus_mode = 2 +shortcut = null +group = null +text = "Ready " +flat = false +align = 0 + +[node name="StartGame" type="Button" parent="." index="8"] + +visible = false +anchor_left = 0.0 +anchor_top = 0.0 +anchor_right = 0.0 +anchor_bottom = 0.0 margin_left = 496.0 -margin_top = 453.0 +margin_top = 491.0 margin_right = 618.0 -margin_bottom = 493.0 +margin_bottom = 531.0 rect_pivot_offset = Vector2( 0, 0 ) focus_mode = 2 mouse_filter = 0 @@ -276,7 +301,7 @@ text = "Ready!" flat = false align = 1 -[node name="VSeparator" type="VSeparator" parent="." index="8"] +[node name="VSeparator" type="VSeparator" parent="." index="9"] anchor_left = 0.0 anchor_top = 0.0 diff --git a/scripts/lobby.gd b/scripts/lobby.gd index 390a257..fa2a277 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -4,15 +4,21 @@ var port = null # Defined by command-line argument with default onready var hero_select = get_node("HeroSelect/Hero") onready var level_select = get_node("LevelSelect") +onready var start_game_button = get_node("StartGame") func _ready(): get_node("Username").connect("text_changed", self, "_send_name") - get_node("StartGame").connect("pressed", networking, "start_game") var spectating = util.args.get_value("-silent") get_node("Spectating").pressed = spectating - get_node("Spectating").connect("toggled", self, "_set_spectating") + get_node("Spectating").connect("toggled", self, "_set_info_callback", ["spectating"]) + get_node("Ready").connect("toggled", self, "_set_info_callback", ["ready"]) + start_game_button.connect("pressed", networking, "start_game") + if get_tree().is_network_server(): + start_game_button.show() + else: + start_game_button.hide() if get_tree().is_network_server(): # We put level in our players dict because it's automatically broadcast to other players @@ -47,8 +53,10 @@ func _connected(): func _set_level(level): networking.level = level -func _set_spectating(is_spectating): - networking.set_info("spectating", is_spectating) +# Because of the annoying way callbacks work (automatic parameter, optional parameter) +# We need a utility function for making these kinds of callbacks for set_info +func _set_info_callback(value, key): + networking.set_info(key, value) sync func set_hero(peer, hero): networking.players[peer].hero = hero @@ -63,17 +71,18 @@ func render_player_list(): var hero_names = hero_select.hero_names for p in networking.players: var player = networking.players[p] - var spectating = player.has("spectating") and player.spectating # A spectating server is just a dedicated server, ignore it - if not (spectating and p == 1): + if not (player.spectating and p == 1): list += "%-15s " % player.username - list += "%-20s " % hero_names[player.hero] - var team_format = "%-14s" + list += "%-10s " % hero_names[player.hero] + var team_format = "%-11s" if player.is_right_team: list += team_format % "Right Team" else: list += team_format % "Left Team" - if spectating: + var ready_text = "Ready" if player.ready else "" + list += "%-6s" % ready_text + if player.spectating: list += "Spectating" list += "\n" get_node("PlayerList").set_text(list) diff --git a/scripts/networking.gd b/scripts/networking.gd index d92c63b..6971a16 100644 --- a/scripts/networking.gd +++ b/scripts/networking.gd @@ -4,9 +4,7 @@ onready var matchmaking = preload("res://scripts/matchmaking.gd").new() remote var players = {} var players_done = [] -# TODO: Should we abstract server so variables like this aren't cluttering everything up? var begun = false -# ALL server negotiation should happen before ANY data is investigated (in lobby) var global_server_ip = "nv.cosinegaming.com" var matchmaker_tcp var right_team_next = false @@ -22,9 +20,7 @@ func _ready(): get_tree().connect("network_peer_connected", self, "register_player") get_tree().connect("connected_to_server", self, "_on_connect") -# func connect_global_server(): TODO -# ip = global_server_ip -# _client_init() + connect("info_updated", self, "_check_info") func start_client(ip="", port=0): if not ip: @@ -81,6 +77,8 @@ func send_all_info(new_peer): remote func register_player(new_peer): var info = {} info.is_right_team = right_team_next + info.ready = false + info.spectating = false right_team_next = not right_team_next players[new_peer] = info if get_tree().is_network_server(): @@ -127,9 +125,21 @@ func _on_connect(): emit_signal("info_updated") register_player(get_tree().get_network_unique_id()) +func _check_info(): + # Check for "everyone is ready" + # Only have 1 person check this, might as well be server + if get_tree().is_network_server(): + var ready = true + for p in players: + if not players[p].spectating: + if not players[p].ready: + ready = false + if ready: + start_game() + sync func _spawn_player(p): var hero = 0 - if players[p].has("hero"): # TODO: Rethink how we do this whole shenanigan + if players[p].has("hero"): hero = players[p].hero var player = load("res://scenes/heroes/" + str(hero) + ".tscn").instance() player.set_name(str(p)) @@ -149,7 +159,7 @@ sync func _pre_configure_game(level): # Load all players (including self) for p in players: - if not (players[p].has("spectating") and players[p].spectating): + if not players[p].spectating: _spawn_player(p) rpc_id(1, "_done_preconfiguring", self_peer_id) @@ -164,7 +174,7 @@ sync func _done_preconfiguring(who): sync func _post_configure_game(): # Begin all players (including self) for p in players: - if not (players[p].has("spectating") and players[p].spectating): + if not players[p].spectating: _begin_player_deferred(p) func _begin_player(peer): diff --git a/util/server.sh b/util/server.sh index d08c8bb..3f24370 100644 --- a/util/server.sh +++ b/util/server.sh @@ -1,2 +1,2 @@ -godot-server -level=2 -silent -server -start-game "$@" +godot-server -level=2 -silent -server "$@"