Browse Source

[WIP] Figure out how the hell I'm gonna do this

master
Luna 7 years ago
parent
commit
a2dabbc37a
5 changed files with 71 additions and 66 deletions
  1. +1
    -4
      project.godot
  2. +2
    -5
      scripts/custom_game.gd
  3. +9
    -3
      scripts/lobby.gd
  4. +18
    -13
      scripts/menu.gd
  5. +41
    -41
      scripts/networking.gd

+ 1
- 4
project.godot View File

@ -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]


+ 2
- 5
scripts/custom_game.gd View File

@ -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():


+ 9
- 3
scripts/lobby.gd View File

@ -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]


+ 18
- 13
scripts/menu.gd View File

@ -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()

+ 41
- 41
scripts/networking.gd View File

@ -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:


Loading…
Cancel
Save