You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.8 KiB
119 lines
3.8 KiB
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()
|