Browse Source

Add "ready" feature

master
Luna 7 years ago
parent
commit
a3036de2bb
4 changed files with 67 additions and 23 deletions
  1. +30
    -5
      scenes/lobby.tscn
  2. +18
    -9
      scripts/lobby.gd
  3. +18
    -8
      scripts/networking.gd
  4. +1
    -1
      util/server.sh

+ 30
- 5
scenes/lobby.tscn View File

@ -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


+ 18
- 9
scripts/lobby.gd View File

@ -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)


+ 18
- 8
scripts/networking.gd View File

@ -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):


+ 1
- 1
util/server.sh View File

@ -1,2 +1,2 @@
godot-server -level=2 -silent -server -start-game "$@"
godot-server -level=2 -silent -server "$@"

Loading…
Cancel
Save