diff --git a/scripts/lobby.gd b/scripts/lobby.gd index a181761..9dd6aae 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -3,34 +3,45 @@ extends Control 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") func _ready(): - if get_tree().is_network_server(): - get_node("LevelSelect").show() - else: - get_node("LevelSelect").hide() get_node("Username").connect("text_changed", self, "_send_name") - get_node("StartGame").connect("pressed", self, "_start_game") + 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", networking, "set_spectating") # TODO - # get_node("CustomGame/LevelSelect").connect("item_selected", self, "select_level") TODO - # _send_name() - # hero_select.set_hero(0) + get_node("Spectating").connect("toggled", networking, "set_spectating") + + if get_tree().is_network_server(): + # We put level in our players dict because it's automatically broadcast to other players + var level = util.args.get_value("-level") + if level == "r": + level = randi() % level_select.get_item_count() + _set_level(level) + + level_select.show() + level_select.select(level) + level_select.connect("item_selected", self, "_set_level") + else: + level_select.hide() networking.connect("info_updated", self, "render_player_list") - get_tree().connect("connected_to_server", self, "_send_settings") + get_tree().connect("connected_to_server", self, "_connected") if get_tree().is_network_server(): - _send_settings() + _connected() -func _send_settings(): - print("sending") +func _connected(): _send_name() hero_select.random_hero() + if util.args.get_value("-start-game"): + networking.start_game() + +func _set_level(level): + networking.set_info("level", level) + sync func set_hero(peer, hero): networking.players[peer].hero = hero render_player_list() @@ -40,7 +51,6 @@ func _send_name(): networking.set_info("username", name) func render_player_list(): - print(JSON.print(networking.players)) var list = "" var hero_names = hero_select.hero_names for p in networking.players: @@ -53,8 +63,3 @@ func render_player_list(): list += "\n" get_node("PlayerList").set_text(list) -func _start_game(): - _collect_info() - var level = 2 # TODO - networking.rpc_id(1, "start_game", level) - diff --git a/scripts/menu.gd b/scripts/menu.gd index 18eed84..c004be3 100644 --- a/scripts/menu.gd +++ b/scripts/menu.gd @@ -56,8 +56,6 @@ func _arg_actions(): if o.get_value("-client"): networking.start_client() get_tree().change_scene("res://scenes/lobby.tscn") - if o.get_value("-start-game"): - networking.call_deferred("start_game") # if o.get_value("-singleplayer"): # networking.call_deferred("start_singleplayer") if o.get_value('-h'): diff --git a/scripts/networking.gd b/scripts/networking.gd index 3575425..bb5329f 100644 --- a/scripts/networking.gd +++ b/scripts/networking.gd @@ -4,10 +4,8 @@ onready var matchmaking = preload("res://scripts/matchmaking.gd").new() remote var players = {} var players_done = [] -var is_connected = false # Technically this can be done with ENetcetera but it's easier this way # TODO: Should we abstract server so variables like this aren't cluttering everything up? var begun = false -# TODO: This needs to go. It carries nothing of value # ALL server negotiation should happen before ANY data is investigated (in lobby) var global_server_ip = "nv.cosinegaming.com" var matchmaker_tcp @@ -27,7 +25,6 @@ func _ready(): # _client_init() func start_client(ip="", port=0): - # collect_info() TODO if not ip: ip = util.args.get_value("-ip") if not port: @@ -36,7 +33,6 @@ func start_client(ip="", port=0): print("Connecting to " + ip + ":" + str(port)) peer.create_client(ip, port) get_tree().set_network_peer(peer) - # get_node("CustomGame/Client").set_text("Clienting!") TODO # func singleplayer_init(): TODO # # collect_info() TODO @@ -55,7 +51,6 @@ func _connect_to_matchmaker(game_port): matchmaker_tcp.put_var(game_port) func start_server(port=0): - # collect_info() TODO if not port: port = util.args.get_value("-port") var peer = NetworkedMultiplayerENet.new() @@ -66,26 +61,15 @@ func start_server(port=0): _connect_to_matchmaker(port) if not util.args.get_value("-silent"): register_player(get_tree().get_network_unique_id()) - # is_connected = true TODO - # get_node("CustomGame/Server").set_text("Serving!") - # get_node("JoinedGameLobby").show() if util.args.get_value("-start-game"): start_game() -sync func start_game(level): +master func _start_game(): + var level = players[1].level # TODO: Can we guarantee this will have level? rpc("_pre_configure_game", level) -# func _on_connect(): -# rpc("_register_player", get_tree().get_network_unique_id(), my_info) -# if util.args.get_value("-start-game"): -# rpc_id(1, "start_game") - # is_connected = true TODO - -# remote func _set_players(json): -# print(json) -# players = JSON.parse(json).result -# print("setted") -# print(JSON.print(players)) +func start_game(): + rpc_id(1, "_start_game") func send_all_info(new_peer): for p in players: @@ -102,22 +86,18 @@ remote func register_player(new_peer): if get_tree().is_network_server(): # I tell new player about all the existing people send_all_info(new_peer) - # rset_id(new_peer, "players", players) emit_signal("info_updated") - # render_player_list() TODO # var right_team_count = 0 # Send current players' info to new player - # Send new player, old player's info - # rpc_id(new_peer, "_register_player", old_peer, players[old_peer]) # if old_peer != new_peer: # # We need to assign team later, so count current # if players[old_peer].is_right_team: # right_team_count += 1 - # if begun: TODO this should belong to lobby + # if begun: TODO this should belong to lobby? # rpc_id(old_peer, "_spawn_player", new_peer) # rpc_id(old_peer, "_begin_player_deferred", new_peer) # Spawning is deferred # var assign_right_team = right_team_count * 2 < players.size() - # rpc("assign_team", new_peer, assign_right_team) + # set_info("is_right_team", assign_right_team, new_peer) # if not begun and players.size() == matchmaking.GAME_SIZE: # start_game() # if begun: @@ -166,7 +146,6 @@ sync func _spawn_player(p): get_node("/root/Level/Players").call_deferred("add_child", player) sync func _pre_configure_game(level): - level = 2 # TODO: Remove this!! begun = true # my_info.level = level # Remember the level for future player registration @@ -174,12 +153,12 @@ sync func _pre_configure_game(level): # Remove the interface so as to not fuck with things # But we still need the lobby alive to deal with networking! - for element in get_node("/root/Lobby").get_children(): - element.queue_free() + # for element in get_node("/root/Lobby").get_children(): + # element.queue_free() + get_node("/root/Lobby").hide() var world = load("res://scenes/levels/%d.tscn" % level).instance() get_node("/root").add_child(world) - print("added level!") # Load all players (including self) for p in players: diff --git a/util/start-multiple.sh b/util/start-multiple.sh index 1213138..8e4d3d7 100644 --- a/util/start-multiple.sh +++ b/util/start-multiple.sh @@ -10,5 +10,5 @@ fi util/open-multiple.sh $count "$@" sleep 1 -godot -start-game "$@" & +godot -client -start-game "$@" &