extends Control onready var ws_client_template : PackedScene = preload("res://network/WSClient.tscn") var game_coordinator_url : String = "ws://192.168.7.112:8181" var gc_client_menus : Dictionary = {} var latest_gccid : int = 0 const HOST_JSON_TEMPLATE_STR : String = '{ "lobby_name" : "",\n "game_type" : "test",\n "username" : "",\n "private" : false,\n "password" : "",\n "max_players" : 4 } ' const JOIN_JSON_TEMPLATE_STR : String = '{ "lobby_id" : "",\n "game_type" : "test",\n "username" : "",\n "password" : "",\n "args": {} }' func _ready(): pass func _process(_delta): # read from all open sockets for gccid in gc_client_menus.keys(): var gc_client_menu = gc_client_menus[gccid] gc_client_menu["state"].text = str( gc_client_menu["ws_client"].state ) if gc_client_menu["ws_client"].state == 2: var recv_message = gc_client_menu["ws_client"].receive(true) # true argument means expect + convert to JSON if recv_message: gc_client_menu["output"].text += str(recv_message) + "\n" func host_lobby(gccid : int): var gccm = gc_client_menus[gccid] var json_parse_result : JSONParseResult = JSON.parse(gccm["input"].text) if json_parse_result.error: gccm["input"].text = HOST_JSON_TEMPLATE_STR # fill with template for ease if invalid json is provided return else: var message = json_parse_result.result message["type"] = "host_lobby" gccm["ws_client"].sock_connect_to_url(game_coordinator_url) gccm["ws_client"].send_json(message) func join_lobby(gccid : int): var gccm = gc_client_menus[gccid] var json_parse_result : JSONParseResult = JSON.parse(gccm["input"].text) if json_parse_result.error: gccm["input"].text = JOIN_JSON_TEMPLATE_STR # fill with template for ease if invalid json is provided return else: var message = json_parse_result.result message["type"] = "join_lobby" gccm["ws_client"].sock_connect_to_url(game_coordinator_url) gccm["ws_client"].send_json(message) func send_message(gccid : int): var gccm = gc_client_menus[gccid] var json_parse_result : JSONParseResult = JSON.parse(gccm["input"].text) if json_parse_result.error: gccm["input"].text = JOIN_JSON_TEMPLATE_STR # fill with template for ease if invalid json is provided return else: var message = json_parse_result.result gccm["ws_client"].send_json(message) func disconnect_client(gccid : int): var gccm : Dictionary = gc_client_menus[gccid] var disconnect_message = {"type" : "lobby_control", "command" : "disconnect"} gccm["ws_client"].send_json(disconnect_message) func reset_ws_client(gccid : int): var gccm : Dictionary = gc_client_menus[gccid] gccm["ws_client"].queue_free() gccm["ws_client"] = ws_client_template.instance() gccm["menu"].add_child( gccm["ws_client"] ) gccm["host"].disabled = false gccm["join"].disabled = false gccm["disconnect"].disabled = true gccm["send"].disabled = true func delete_gc_client(gccid : int): var gc_client_menu : Dictionary = gc_client_menus[gccid] gc_client_menu["parent"].queue_free() # remove HBoxContainer and all of its children, which together represent a gc client gc_client_menus.erase(gccid) func create_gc_client(): latest_gccid += 1 var new_gc_index : int = latest_gccid # container for all buttons var gc_client_menu : HBoxContainer = HBoxContainer.new() var ws_client : Node = ws_client_template.instance() gc_client_menu.add_child(ws_client) var delete_button : Button = Button.new() delete_button.text = "X" delete_button.connect("pressed", self, "delete_gc_client", [new_gc_index]) gc_client_menu.add_child(delete_button) var connection_state : Label = Label.new() connection_state.text = "0" gc_client_menu.add_child(connection_state) var input : TextEdit = TextEdit.new() input.rect_min_size = Vector2(400, 100) gc_client_menu.add_child(input) var output : TextEdit = TextEdit.new() output.text = "---CONNECTION OUTPUT---\n" output.rect_min_size = Vector2(400, 100) output.readonly = true gc_client_menu.add_child(output) var join_btn : Button = Button.new() join_btn.text = "Join" join_btn.connect("pressed", self, "join_lobby", [new_gc_index]) gc_client_menu.add_child(join_btn) var host_btn : Button = Button.new() host_btn.text = "Host" host_btn.connect("pressed", self, "host_lobby", [new_gc_index]) gc_client_menu.add_child(host_btn) var send_msg_btn : Button = Button.new() send_msg_btn.text = "Send" #send_msg_btn.disabled = true send_msg_btn.connect("pressed", self, "send_message", [new_gc_index]) gc_client_menu.add_child(send_msg_btn) var disconnect_btn : Button = Button.new() disconnect_btn.text = "Disconnect" #disconnect_btn.disabled = true disconnect_btn.connect("pressed", self, "disconnect_client", [new_gc_index]) gc_client_menu.add_child(disconnect_btn) var reset_btn : Button = Button.new() reset_btn.text = "Reset WS" reset_btn.disabled = true reset_btn.connect("pressed", self, "reset_ws_client", [new_gc_index]) gc_client_menu.add_child(reset_btn) var gc_client : Dictionary = {"parent": gc_client_menu, "state" : connection_state, "ws_client" : ws_client, "join" : join_btn, "host" : host_btn, "send" : send_msg_btn, "disconnect" : disconnect_btn, "reset" : reset_btn, "input" : input, "output" : output} gc_client_menus[new_gc_index] = gc_client add_child(gc_client_menu)