extends Node const MAX_PEERS = 4 var world_scene = preload("res://scenes/game/world.tscn") var player_scene = preload("res://scenes/player/Player.tscn") var human_player_scene = preload("res://scenes/player/HumanPlayer.tscn") var bot_player_scene = preload("res://scenes/player/BotPlayer.tscn") var players = {} signal players_changed(players) signal connection_failed() signal connection_succeeded() signal game_ready() signal game_start() signal game_ended() signal game_error(msg) func _ready(): var arguments = {} for argument in OS.get_cmdline_args(): if argument.split("=")[0] == "port": host_game(int(argument.split("=")[1])) func host_game(port:int): var host = NetworkedMultiplayerENet.new() host.create_server(port, MAX_PEERS) get_tree().set_network_peer(host) get_tree().connect("network_peer_connected", self, "_player_connected") get_tree().connect("network_peer_disconnected", self,"_player_disconnected") get_tree().connect("server_disconnected", self, "_server_disconnected") func join_game(ip, port:int): get_tree().connect("connected_to_server", self, "_connected_ok") get_tree().connect("connection_failed", self, "_connected_fail") var host = NetworkedMultiplayerENet.new() host.create_client(ip, port) get_tree().set_network_peer(host) func _connected_ok(): rpc("set_player", get_tree().get_network_unique_id()) emit_signal("connection_succeeded") func _connected_fail(): get_tree().set_network_peer(null) emit_signal("connection_failed") remote func set_player(id, new_name:String = " ", new_color:Color = Color.black, ready:bool = false): if (get_tree().is_network_server()): for p_id in players: rpc_id(id, "set_player", p_id, players[p_id].name, players[p_id].color, ready) rpc_id(p_id, "set_player", id, new_name, new_color, ready) players[id] = {"name" : new_name, "color" : new_color, "ready" : ready} emit_signal("players_changed", players) func prepare_game(bots:bool): get_tree().set_pause(true) var world = world_scene.instance() get_tree().get_root().add_child(world) get_tree().get_root().get_node("main_menu").hide() for p_id in players: var controls var player = players[p_id] var _player_scene = player_scene.instance() _player_scene.set_network_master(p_id) _player_scene.set_name(str(p_id)) _player_scene.set_player_name(player.name) _player_scene.set_player_color(player.color) world.get_node("players").add_child(_player_scene) if p_id == get_tree().get_network_unique_id(): controls = human_player_scene.instance() controls.set_name("HumanControl_" + str(p_id)) world.add_child(controls) controls.set_player(_player_scene.get_path()) controls.set_network_master(p_id) _player_scene.set_start(_player_scene.get_index()) if bots: for index in range(MAX_PEERS-players.size()): var bot_index = players.size() + index var _player_scene = player_scene.instance() _player_scene.set_name("bot_player" + str(bot_index)) world.get_node("players").add_child(_player_scene) _player_scene.add_to_group("bots") if get_tree().is_network_server(): var bot = bot_player_scene.instance() bot.set_name("bot" + str(bot_index)) world.add_child(bot) bot.set_player(_player_scene.get_path()) bot.set_network_master(get_tree().get_network_unique_id()) _player_scene.set_start(bot_index) remote func post_start_game(): get_tree().set_pause(false) func local_game(name:String, color:Color, bots:bool): var localhost = NetworkedMultiplayerENet.new() localhost.create_server(0, 0) get_tree().set_network_peer(localhost) players[get_tree().get_network_unique_id()] = { "name" : name, "color" : color } prepare_game(bots) post_start_game() func quit_game(): if (has_node("/root/world")): get_node("/root/world").queue_free() players.clear() get_tree().set_network_peer(null) get_tree().get_root().get_node("main_menu").show()