diff --git a/project.godot b/project.godot index 9e4b16b..7ba129f 100644 --- a/project.godot +++ b/project.godot @@ -17,10 +17,7 @@ config/icon="res://icon.png" [autoload] util="*res://scripts/util.gd" - -[display] - -window/stretch/mode="2d" +networking="*res://scripts/networking.gd" [input] diff --git a/scripts/custom_game.gd b/scripts/custom_game.gd index 653ce27..57cce07 100644 --- a/scripts/custom_game.gd +++ b/scripts/custom_game.gd @@ -1,15 +1,12 @@ extends Control -onready var networking = preload("res://scripts/networking.gd").new() - func _ready(): - add_child(networking) - get_node("Server").connect("pressed", self, "_start_server") get_node("Client").connect("pressed", self, "_start_client") func _start_server(): - networking.start_server(_get_port()) + # Custom Game can assume we're playing as well + networking.start_server(_get_port(), true) _show_lobby() func _start_client(): diff --git a/scripts/lobby.gd b/scripts/lobby.gd index f126de1..906b5f4 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -3,30 +3,36 @@ extends Control var port = null # Defined by command-line argument with default # var my_info = {} -var server_playing = true +remote var players = {} var global_server_ip = "nv.cosinegaming.com" var ip = null var players_done = [] var is_connected = false # Technically this can be done with ENetcetera but it's easier this way onready var matchmaking = preload("res://scripts/matchmaking.gd").new() -onready var networking = preload("res://scripts/networking.gd").new() var matchmaker_tcp +var right_team_next = false func _ready(): add_child(matchmaking) - add_child(networking) if get_tree().is_network_server(): get_node("LevelSelect").show() + get_tree().connect("network_peer_connected", self, "_register_player") + get_node("Username").connect("text_changed", self, "_send_name") get_node("StartGame").connect("pressed", self, "_start_game") # get_node("CustomGame/LevelSelect").connect("item_selected", self, "select_level") TODO _send_name() +func _register_player(peer): + players[peer] = {} + if is_network_server(): + rset(peer, "players", players) + func _collect_info(): var my_id = get_tree().get_network_unique_id() var my_info = networking.players[my_id] diff --git a/scripts/menu.gd b/scripts/menu.gd index 2e5f122..578da9f 100644 --- a/scripts/menu.gd +++ b/scripts/menu.gd @@ -3,6 +3,7 @@ extends Control func _ready(): randomize() _gui_setup() + _arg_actions() # GUI @@ -30,6 +31,8 @@ func _option_sel(button_name, option): option = int(option) button.select(option) +func _arg_actions(): + var o = util.args # if o.get_value("-silent"): # server_playing = false # if o.get_value("-hero"): @@ -39,23 +42,25 @@ func _option_sel(button_name, option): # select_hero(get_node("PlayerSettings/HeroSelect").get_selected_id()) # if o.get_value("-level"): # _option_sel("CustomGame/LevelSelect", o.get_value("-level")) - # if o.get_value("-server"): - # call_deferred("_server_init") - # if o.get_value("-matchmaker"): - # call_deferred("_matchmaker_init") - # if o.get_value("-client"): - # call_deferred("_client_init") # if o.get_value("-port"): # port = o.get_value("-port") - # if o.get_value("-start-game"): - # my_info.start_game = true - # if o.get_value("-singleplayer"): - # call_deferred("_singleplayer_init") # if o.get_value("-ai"): # my_info.is_ai = true # if not o.get_value("-no-record") and not o.get_value("-ai"): # my_info.record = true - # if o.get_value('-h'): - # o.print_help() - # quit() + if o.get_value("-server"): + networking.call_deferred("start_server") + get_tree().change_scene("res://scenes/lobby.tscn") + # if o.get_value("-matchmaker"): + # call_deferred("_matchmaker_init") + if o.get_value("-client"): + networking.call_deferred("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'): + o.print_help() + quit() diff --git a/scripts/networking.gd b/scripts/networking.gd index f06bb4a..28bf2a8 100644 --- a/scripts/networking.gd +++ b/scripts/networking.gd @@ -2,20 +2,23 @@ extends Node onready var matchmaking = preload("res://scripts/matchmaking.gd").new() -var players = {} +remote var players = [] # TODO: Should we abstract server so variables like this aren't cluttering everything up? var players_done = [] 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 my_info = {} +var my_info = { + hero: 0, + username: "Nickname", +} func _ready(): add_child(matchmaking) - # get_tree().connect("network_peer_connected", self, "connect_player") + get_tree().connect("network_peer_connected", self, "_register_player") get_tree().connect("network_peer_disconnected", self, "disconnect_player") - get_tree().connect("connected_to_server", self, "_on_connect") + # get_tree().connect("connected_to_server", self, "_on_connect") # func connect_global_server(): TODO # ip = global_server_ip @@ -45,7 +48,7 @@ func _connect_to_matchmaker(game_port): matchmaker_tcp.put_var(matchmaking.messages.ready_to_connect) matchmaker_tcp.put_var(game_port) -func start_server(port): +func start_server(port, server_playing=false): # collect_info() TODO var peer = NetworkedMultiplayerENet.new() print("Starting server on port " + str(port)) @@ -53,15 +56,16 @@ func start_server(port): get_tree().set_network_peer(peer) # As soon as we're listening, let the matchmaker know _connect_to_matchmaker(port) + if server_playing: + players[1] = my_info # is_connected = true TODO # get_node("CustomGame/Server").set_text("Serving!") # get_node("JoinedGameLobby").show() - # if server_playing: - # players[1] = my_info # if "start_game" in my_info and my_info.start_game: TODO # start_game() sync func start_game(level): + print(var2str(players)) rpc("_pre_configure_game", level) func disconnect_player(id): @@ -69,51 +73,45 @@ func disconnect_player(id): rpc("unregister_player", id) # call_deferred("render_player_list") TODO -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") +# 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 _register_player(new_peer, info): - players[new_peer] = info +remote func _register_player(new_peer): + players.push(new_peer) + if get_tree().is_network_server(): + # I tell new player about all the existing people + rset_id(new_peer, "players", players) # render_player_list() TODO - if (get_tree().is_network_server()): - var right_team_count = 0 + # var right_team_count = 0 # Send current players' info to new player - for old_peer in players: # 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 - # You'd think this part could be met with a simple `rpc(`, but actually it can't - # My best guess is this is because we haven't registered the names yet, but I'm not sure (TODO) - if old_peer != 1: - # Send old player, new player's info (not us, no infinite loop) - rpc_id(old_peer, "_register_player", new_peer, info) - if begun: - rpc_id(old_peer, "_spawn_player", new_peer) - rpc_id(old_peer, "_begin_player_deferred", new_peer) # Spawning is deferred - # if not server_playing: TODO - # # We didn't catch this in players - # rpc_id(1, "_spawn_player", new_peer) - # rpc_id(1, "_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) - if not begun and players.size() == matchmaking.GAME_SIZE: - start_game() - if begun: - rpc_id(new_peer, "_pre_configure_game", my_info.level) - rpc_id(new_peer, "_post_configure_game") + # 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 + # 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) + # if not begun and players.size() == matchmaking.GAME_SIZE: + # start_game() + # if begun: + # rpc_id(new_peer, "_pre_configure_game", my_info.level) + # rpc_id(new_peer, "_post_configure_game") sync func _unregister_player(peer): players.erase(peer) get_node("/root/Level/Players/%d" % peer).queue_free() sync func _spawn_player(p): - var hero = players[p].hero + var hero = 0 + if players[p].has("hero"): # TODO: Rethink how we do this whole shenanigan + hero = players[p].hero var player = load("res://scenes/heroes/" + str(hero) + ".tscn").instance() player.set_name(str(p)) player.set_network_master(p) @@ -121,6 +119,7 @@ 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 @@ -133,6 +132,7 @@ sync func _pre_configure_game(level): 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: