From a2dabbc37aa72efaebed95186eeda280efd340af Mon Sep 17 00:00:00 2001
From: Luna <lucidlyluna@gmail.com>
Date: Tue, 15 May 2018 23:45:19 -0400
Subject: [PATCH] [WIP] Figure out how the hell I'm gonna do this

---
 project.godot          |  5 +--
 scripts/custom_game.gd |  7 ++---
 scripts/lobby.gd       | 12 ++++++--
 scripts/menu.gd        | 31 +++++++++++--------
 scripts/networking.gd  | 82 +++++++++++++++++++++++++-------------------------
 5 files changed, 71 insertions(+), 66 deletions(-)

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: