Browse Source
menus menus menus, network logic, dedicated server logic
menus menus menus, network logic, dedicated server logic
30 changed files with 473 additions and 695 deletions
-
2project.godot
-
160scenes/lobby/lobby_old.tscn
-
29scenes/menu/base_menu.tscn
-
38scenes/menu/direct_host.tscn
-
26scenes/menu/direct_join.tscn
-
120scenes/menu/lobby.tscn
-
28scenes/menu/local_game.tscn
-
5scenes/menu/main.tscn
-
2scenes/menu/player_settings.tscn
-
70scenes/menu/server.tscn
-
72scenes/menu/settings.tscn
-
6scenes/player/HumanPlayer.tscn
-
114scripts/game/game.gd
-
203scripts/game/game_state.gd
-
45scripts/game/local_storage.gd
-
2scripts/game/route.gd
-
5scripts/game/server.gd
-
8scripts/game/world.gd
-
83scripts/lobby/lobby.gd
-
18scripts/menu/direct_host.gd
-
8scripts/menu/direct_join.gd
-
28scripts/menu/lobby.gd
-
10scripts/menu/local_game.gd
-
28scripts/menu/main.gd
-
14scripts/menu/player_settings.gd
-
13scripts/menu/server.gd
-
22scripts/menu/settings.gd
-
4scripts/player/HumanControls.gd
-
3scripts/player/Player.gd
-
2scripts/player/raceCar.gd
@ -1,160 +0,0 @@ |
|||
[gd_scene load_steps=2 format=2] |
|||
|
|||
[ext_resource path="res://scripts/lobby/lobby.gd" type="Script" id=1] |
|||
|
|||
[node name="lobby" type="Control"] |
|||
anchor_right = 1.0 |
|||
anchor_bottom = 1.0 |
|||
margin_left = 4.0 |
|||
margin_top = -1.95001 |
|||
margin_right = 4.0 |
|||
margin_bottom = -1.95001 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
script = ExtResource( 1 ) |
|||
|
|||
[node name="players" type="Panel" parent="."] |
|||
editor/display_folded = true |
|||
visible = false |
|||
margin_left = 393.0 |
|||
margin_top = 113.0 |
|||
margin_right = 645.0 |
|||
margin_bottom = 468.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
|
|||
[node name="label" type="Label" parent="players"] |
|||
margin_left = 26.0 |
|||
margin_top = 18.0 |
|||
margin_right = 142.0 |
|||
margin_bottom = 32.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 0 |
|||
text = "Awaiting Players..." |
|||
|
|||
[node name="start" type="Button" parent="players"] |
|||
margin_left = 68.0 |
|||
margin_top = 307.0 |
|||
margin_right = 193.0 |
|||
margin_bottom = 336.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
text = "START!" |
|||
|
|||
[node name="list" type="ItemList" parent="players"] |
|||
margin_left = 25.0 |
|||
margin_top = 37.0 |
|||
margin_right = 229.0 |
|||
margin_bottom = 296.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
|
|||
[node name="connect" type="Panel" parent="."] |
|||
margin_left = 370.0 |
|||
margin_top = 157.0 |
|||
margin_right = 647.0 |
|||
margin_bottom = 401.0 |
|||
rect_pivot_offset = Vector2( 70, 63 ) |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
|
|||
[node name="name_label" type="Label" parent="connect"] |
|||
margin_left = 14.0 |
|||
margin_top = 11.0 |
|||
margin_right = 56.0 |
|||
margin_bottom = 25.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 0 |
|||
text = "Name:" |
|||
|
|||
[node name="name" type="LineEdit" parent="connect"] |
|||
margin_left = 17.0 |
|||
margin_top = 30.0 |
|||
margin_right = 173.0 |
|||
margin_bottom = 54.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
text = "Undefined" |
|||
|
|||
[node name="color_label" type="Label" parent="connect"] |
|||
margin_left = 14.0 |
|||
margin_top = 69.0 |
|||
margin_right = 56.0 |
|||
margin_bottom = 83.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 0 |
|||
text = "Color:" |
|||
|
|||
[node name="color" type="ColorPickerButton" parent="connect"] |
|||
margin_left = 20.05 |
|||
margin_top = 94.3 |
|||
margin_right = 243.05 |
|||
margin_bottom = 114.3 |
|||
text = "Color" |
|||
edit_alpha = false |
|||
|
|||
[node name="ip_label" type="Label" parent="connect"] |
|||
margin_left = 15.0 |
|||
margin_top = 128.0 |
|||
margin_right = 57.0 |
|||
margin_bottom = 142.0 |
|||
rect_pivot_offset = Vector2( 33, 7 ) |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 0 |
|||
text = "IP:" |
|||
|
|||
[node name="ip" type="LineEdit" parent="connect"] |
|||
margin_left = 17.0 |
|||
margin_top = 147.0 |
|||
margin_right = 173.0 |
|||
margin_bottom = 171.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
text = "127.0.0.1" |
|||
|
|||
[node name="host" type="Button" parent="connect"] |
|||
margin_left = 181.0 |
|||
margin_top = 31.0 |
|||
margin_right = 246.0 |
|||
margin_bottom = 51.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
text = "Host" |
|||
|
|||
[node name="join" type="Button" parent="connect"] |
|||
margin_left = 181.0 |
|||
margin_top = 149.0 |
|||
margin_right = 246.0 |
|||
margin_bottom = 169.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
text = "Join" |
|||
|
|||
[node name="quick" type="Button" parent="connect"] |
|||
margin_left = 103.0 |
|||
margin_top = 214.0 |
|||
margin_right = 168.0 |
|||
margin_bottom = 234.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
text = "Quick" |
|||
|
|||
[node name="error_label" type="Label" parent="connect"] |
|||
margin_left = 15.0 |
|||
margin_top = 177.0 |
|||
margin_right = 257.0 |
|||
margin_bottom = 191.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 0 |
|||
custom_colors/font_color = Color( 0.820312, 0.291595, 0.291595, 1 ) |
|||
align = 1 |
|||
|
|||
[node name="error" type="AcceptDialog" parent="."] |
|||
margin_right = 55.0 |
|||
margin_bottom = 58.0 |
|||
size_flags_horizontal = 2 |
|||
size_flags_vertical = 2 |
|||
[connection signal="pressed" from="players/start" to="." method="_on_start_pressed"] |
|||
[connection signal="pressed" from="connect/host" to="." method="_on_host_pressed"] |
|||
[connection signal="pressed" from="connect/join" to="." method="_on_join_pressed"] |
|||
[connection signal="pressed" from="connect/quick" to="." method="_on_quick_pressed"] |
@ -0,0 +1,29 @@ |
|||
[gd_scene load_steps=3 format=2] |
|||
|
|||
[ext_resource path="res://resources/ui/font.tres" type="DynamicFont" id=1] |
|||
[ext_resource path="res://assets/icons/return.png" type="Texture" id=2] |
|||
|
|||
[node name="menu" type="Panel"] |
|||
anchor_left = 0.5 |
|||
anchor_top = 0.5 |
|||
anchor_right = 0.5 |
|||
anchor_bottom = 0.5 |
|||
margin_left = -454.0 |
|||
margin_top = -234.5 |
|||
margin_right = 454.0 |
|||
margin_bottom = 234.5 |
|||
grow_horizontal = 2 |
|||
grow_vertical = 2 |
|||
rect_clip_content = true |
|||
size_flags_horizontal = 4 |
|||
size_flags_vertical = 4 |
|||
|
|||
[node name="back" type="Button" parent="."] |
|||
anchor_top = 1.0 |
|||
anchor_bottom = 1.0 |
|||
margin_top = -56.0 |
|||
margin_right = 132.0 |
|||
custom_fonts/font = ExtResource( 1 ) |
|||
text = "Back" |
|||
icon = ExtResource( 2 ) |
|||
flat = true |
@ -0,0 +1,72 @@ |
|||
[gd_scene load_steps=6 format=2] |
|||
|
|||
[ext_resource path="res://resources/ui/theme.tres" type="Theme" id=1] |
|||
[ext_resource path="res://scripts/menu/settings.gd" type="Script" id=2] |
|||
[ext_resource path="res://scenes/menu/base_menu.tscn" type="PackedScene" id=3] |
|||
[ext_resource path="res://scenes/menu/player_settings.tscn" type="PackedScene" id=4] |
|||
[ext_resource path="res://assets/icons/save.png" type="Texture" id=5] |
|||
|
|||
[node name="settings" type="Control"] |
|||
anchor_right = 1.0 |
|||
anchor_bottom = 1.0 |
|||
margin_left = 1.45612 |
|||
margin_top = 1.45612 |
|||
margin_right = 1.45605 |
|||
margin_bottom = 1.45612 |
|||
theme = ExtResource( 1 ) |
|||
script = ExtResource( 2 ) |
|||
|
|||
[node name="menu" parent="." instance=ExtResource( 3 )] |
|||
|
|||
[node name="tabs" type="TabContainer" parent="menu"] |
|||
anchor_left = 0.5 |
|||
anchor_top = 0.5 |
|||
anchor_right = 0.5 |
|||
anchor_bottom = 0.5 |
|||
margin_left = -438.5 |
|||
margin_top = -217.5 |
|||
margin_right = 440.5 |
|||
margin_bottom = 177.5 |
|||
tab_align = 0 |
|||
|
|||
[node name="Game" type="Tabs" parent="menu/tabs"] |
|||
anchor_right = 1.0 |
|||
anchor_bottom = 1.0 |
|||
margin_left = 4.0 |
|||
margin_top = 45.0 |
|||
margin_right = -4.0 |
|||
margin_bottom = -4.0 |
|||
|
|||
[node name="player_settings" parent="menu/tabs/Game" instance=ExtResource( 4 )] |
|||
margin_left = 15.4583 |
|||
margin_top = 10.7114 |
|||
margin_right = 380.458 |
|||
margin_bottom = 227.711 |
|||
|
|||
[node name="bots" type="CheckButton" parent="menu/tabs/Game"] |
|||
margin_left = 8.38535 |
|||
margin_top = 226.162 |
|||
margin_right = 153.385 |
|||
margin_bottom = 266.162 |
|||
text = "Bots" |
|||
|
|||
[node name="Controls" type="Tabs" parent="menu/tabs"] |
|||
visible = false |
|||
anchor_right = 1.0 |
|||
anchor_bottom = 1.0 |
|||
margin_left = 4.0 |
|||
margin_top = 45.0 |
|||
margin_right = -4.0 |
|||
margin_bottom = -4.0 |
|||
|
|||
[node name="save" type="Button" parent="menu"] |
|||
anchor_left = 1.0 |
|||
anchor_top = 1.0 |
|||
anchor_right = 1.0 |
|||
anchor_bottom = 1.0 |
|||
margin_left = -147.0 |
|||
margin_top = -56.0 |
|||
text = "Save" |
|||
icon = ExtResource( 5 ) |
|||
flat = true |
|||
[connection signal="pressed" from="menu/save" to="." method="_on_save_pressed"] |
@ -1,203 +0,0 @@ |
|||
extends Node |
|||
|
|||
# Default game port |
|||
const DEFAULT_PORT = 8128 |
|||
|
|||
# Max number of players |
|||
const MAX_PLAYERS = 4 |
|||
const MAX_PEERS = MAX_PLAYERS - 1 |
|||
|
|||
|
|||
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") |
|||
|
|||
# Name for my player |
|||
var player_name = "Undefined" |
|||
var player_color = Color("#000000") |
|||
|
|||
# Names for remote players in id:name format |
|||
var players = {} |
|||
|
|||
# Signals to let lobby GUI know what's going on |
|||
signal player_list_changed() |
|||
signal connection_failed() |
|||
signal connection_succeeded() |
|||
signal game_ended() |
|||
signal game_error(msg) |
|||
|
|||
# Callback from SceneTree |
|||
func _player_connected(id): |
|||
pass |
|||
|
|||
# Callback from SceneTree |
|||
func _player_disconnected(id): |
|||
if (get_tree().is_network_server()): |
|||
if (has_node("/root/world")): # Game is in progress |
|||
emit_signal("game_error", "Player " + players[id].name + " disconnected") |
|||
end_game() |
|||
else: # Game is not in progress |
|||
# If we are the server, send to the new dude all the already registered players |
|||
unregister_player(id) |
|||
for p_id in players: |
|||
# Erase in the server |
|||
rpc_id(p_id, "unregister_player", id) |
|||
|
|||
# Callback from SceneTree, only for clients (not server) |
|||
func _connected_ok(): |
|||
# Registration of a client beings here, tell everyone that we are here |
|||
rpc("register_player", get_tree().get_network_unique_id(), player_name, player_color) |
|||
emit_signal("connection_succeeded") |
|||
|
|||
# Callback from SceneTree, only for clients (not server) |
|||
func _server_disconnected(): |
|||
emit_signal("game_error", "Server disconnected") |
|||
end_game() |
|||
|
|||
# Callback from SceneTree, only for clients (not server) |
|||
func _connected_fail(): |
|||
get_tree().set_network_peer(null) # Remove peer |
|||
emit_signal("connection_failed") |
|||
|
|||
# Lobby management functions |
|||
remote func register_player(id, new_player_name, new_player_color): |
|||
if (get_tree().is_network_server()): |
|||
# If we are the server, let everyone know about the new player |
|||
rpc_id(id, "register_player", 1, player_name, player_color) # Send myself to new dude |
|||
for p_id in players: # Then, for each remote player |
|||
rpc_id(id, "register_player", p_id, players[p_id].name, players[p_id].color) # Send player to new dude |
|||
rpc_id(p_id, "register_player", id, new_player_name, new_player_color) # Send new dude to player |
|||
|
|||
players[id] = {"name" : new_player_name, "color" : new_player_color} |
|||
emit_signal("player_list_changed") |
|||
|
|||
remote func unregister_player(id): |
|||
players.erase(id) |
|||
emit_signal("player_list_changed") |
|||
|
|||
remote func pre_start_game(spawn_points): |
|||
# Change scene |
|||
var world = world_scene.instance() |
|||
get_tree().get_root().add_child(world) |
|||
|
|||
get_tree().get_root().get_node("lobby").hide() |
|||
|
|||
for p_id in spawn_points: |
|||
var controls |
|||
var player = player_scene.instance() |
|||
|
|||
player.set_network_master(p_id) |
|||
player.set_name(str(p_id)) |
|||
|
|||
world.get_node("players").add_child(player) |
|||
|
|||
if (p_id == get_tree().get_network_unique_id()): |
|||
# If node for this peer id, set name |
|||
player.set_player_name(player_name) |
|||
player.set_player_color(player_color) |
|||
controls = human_player_scene.instance() |
|||
controls.set_name("HumanControl_" + str(p_id)) |
|||
world.add_child(controls) |
|||
controls.set_player(player.get_path()) |
|||
controls.set_network_master(p_id) |
|||
else: |
|||
# Otherwise set name from peer |
|||
player.set_player_name(players[p_id].name) |
|||
player.set_player_color(players[p_id].color) |
|||
|
|||
player.set_start(player.get_index()) |
|||
|
|||
var bots = false |
|||
if bots: |
|||
for index in range(4-spawn_points.size()): |
|||
var bot_index = spawn_points.size() + index |
|||
var player = player_scene.instance() |
|||
player.set_name("bot_player" + str(bot_index)) |
|||
world.get_node("players").add_child(player) |
|||
player.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.get_path()) |
|||
bot.set_network_master(get_tree().get_network_unique_id()) |
|||
player.set_start(bot_index) |
|||
|
|||
|
|||
if (not get_tree().is_network_server()): |
|||
# Tell server we are ready to start |
|||
rpc_id(1, "ready_to_start", get_tree().get_network_unique_id()) |
|||
elif players.size() == 0: |
|||
post_start_game() |
|||
|
|||
remote func post_start_game(): |
|||
get_tree().set_pause(false) # Unpause and unleash the game! |
|||
|
|||
var players_ready = [] |
|||
|
|||
remote func ready_to_start(id): |
|||
assert(get_tree().is_network_server()) |
|||
|
|||
if (not id in players_ready): |
|||
players_ready.append(id) |
|||
|
|||
if (players_ready.size() == players.size()): |
|||
for p in players: |
|||
rpc_id(p, "post_start_game") |
|||
post_start_game() |
|||
|
|||
func host_game(new_player_name, new_player_color): |
|||
player_name = new_player_name |
|||
player_color = new_player_color |
|||
var host = NetworkedMultiplayerENet.new() |
|||
host.create_server(DEFAULT_PORT, MAX_PEERS) |
|||
get_tree().set_network_peer(host) |
|||
|
|||
func join_game(ip, new_player_name, new_player_color): |
|||
player_name = new_player_name |
|||
player_color = new_player_color |
|||
var host = NetworkedMultiplayerENet.new() |
|||
host.create_client(ip, DEFAULT_PORT) |
|||
get_tree().set_network_peer(host) |
|||
|
|||
func get_player_list(): |
|||
return players.values() |
|||
|
|||
func get_player_name(): |
|||
return player_name |
|||
|
|||
func get_player_color(): |
|||
return player_color |
|||
|
|||
func begin_game(): |
|||
assert(get_tree().is_network_server()) |
|||
|
|||
# Create a dictionary with peer id and respective spawn points, could be improved by randomizing |
|||
var spawn_points = {} |
|||
spawn_points[1] = 0 # Server in spawn point 0 |
|||
var spawn_point_idx = 1 |
|||
for p in players: |
|||
spawn_points[p] = spawn_point_idx |
|||
spawn_point_idx += 1 |
|||
# Call to pre-start game with the spawn points |
|||
for p in players: |
|||
rpc_id(p, "pre_start_game", spawn_points) |
|||
|
|||
pre_start_game(spawn_points) |
|||
|
|||
func end_game(): |
|||
if (has_node("/root/world")): # Game is in progress |
|||
# End it |
|||
get_node("/root/world").queue_free() |
|||
|
|||
emit_signal("game_ended") |
|||
players.clear() |
|||
get_tree().set_network_peer(null) # End networking |
|||
|
|||
func _ready(): |
|||
get_tree().connect("network_peer_connected", self, "_player_connected") |
|||
get_tree().connect("network_peer_disconnected", self,"_player_disconnected") |
|||
get_tree().connect("connected_to_server", self, "_connected_ok") |
|||
get_tree().connect("connection_failed", self, "_connected_fail") |
|||
get_tree().connect("server_disconnected", self, "_server_disconnected") |
@ -0,0 +1,45 @@ |
|||
extends Node |
|||
|
|||
const FILE_PATH = "user://local_storage" |
|||
|
|||
func read_content(): |
|||
var f = File.new() |
|||
var err = f.open(FILE_PATH, File.READ) |
|||
var content = parse_json(f.get_as_text ()) |
|||
if content == null: |
|||
content = {} |
|||
f.close() |
|||
return content |
|||
|
|||
func write_content(content:Dictionary): |
|||
var f = File.new() |
|||
var err = f.open(FILE_PATH, File.WRITE) |
|||
#var err = f.open_encrypted_with_pass(FILE_PATH, File.WRITE, OS.get_unique_id()) |
|||
f.store_string(to_json(content)) |
|||
f.close() |
|||
|
|||
func write_value(key:String, value): |
|||
var content = read_content() |
|||
content[key] = value |
|||
write_content(content) |
|||
|
|||
func read_value(key:String, default = null): |
|||
var content = read_content() |
|||
if content.has(key): |
|||
return content.get(key) |
|||
else: |
|||
return default |
|||
|
|||
func delete_value(key:String): |
|||
var content = read_content() |
|||
content.erase(key) |
|||
write_content(content) |
|||
|
|||
func write_values(new_content:Dictionary): |
|||
var content = read_content() |
|||
for key in new_content: |
|||
content[key] = new_content[key] |
|||
write_content(content) |
|||
|
|||
func read_values(): |
|||
return read_content() |
@ -1,5 +0,0 @@ |
|||
extends Node |
|||
|
|||
func _ready(): |
|||
pass # Replace with function body. |
|||
|
@ -1,83 +0,0 @@ |
|||
extends Control |
|||
|
|||
func _ready(): |
|||
# Called every time the node is added to the scene. |
|||
game_state.connect("connection_failed", self, "_on_connection_failed") |
|||
game_state.connect("connection_succeeded", self, "_on_connection_success") |
|||
game_state.connect("player_list_changed", self, "refresh_lobby") |
|||
game_state.connect("game_ended", self, "_on_game_ended") |
|||
game_state.connect("game_error", self, "_on_game_error") |
|||
|
|||
func _on_host_pressed(): |
|||
if (get_node("connect/name").text == ""): |
|||
get_node("connect/error_label").text="Invalid name!" |
|||
return |
|||
|
|||
get_node("connect").hide() |
|||
get_node("players").show() |
|||
get_node("connect/error_label").text="" |
|||
|
|||
var player_name = get_node("connect/name").text |
|||
var player_color = get_node("connect/color").color |
|||
game_state.host_game(player_name, player_color) |
|||
refresh_lobby() |
|||
|
|||
func _on_join_pressed(): |
|||
if (get_node("connect/name").text == ""): |
|||
get_node("connect/error_label").text="Invalid name!" |
|||
return |
|||
|
|||
var ip = get_node("connect/ip").text |
|||
if (not ip.is_valid_ip_address()): |
|||
get_node("connect/error_label").text="Invalid IPv4 address!" |
|||
return |
|||
|
|||
get_node("connect/error_label").text="" |
|||
get_node("connect/host").disabled=true |
|||
get_node("connect/join").disabled=true |
|||
|
|||
var player_name = get_node("connect/name").text |
|||
var player_color = get_node("connect/color").color |
|||
game_state.join_game(ip, player_name, player_color) |
|||
# refresh_lobby() gets called by the player_list_changed signal |
|||
|
|||
func _on_connection_success(): |
|||
get_node("connect").hide() |
|||
get_node("players").show() |
|||
|
|||
func _on_connection_failed(): |
|||
get_node("connect/host").disabled=false |
|||
get_node("connect/join").disabled=false |
|||
get_node("connect/error_label").set_text("Connection failed.") |
|||
|
|||
func _on_game_ended(): |
|||
show() |
|||
get_node("connect").show() |
|||
get_node("players").hide() |
|||
get_node("connect/host").disabled=false |
|||
get_node("connect/join").disabled=false |
|||
|
|||
func _on_game_error(errtxt): |
|||
get_node("error").dialog_text = errtxt |
|||
get_node("error").popup_centered_minsize() |
|||
|
|||
func refresh_lobby(): |
|||
var players = game_state.get_player_list() |
|||
players.sort() |
|||
get_node("players/list").clear() |
|||
get_node("players/list").add_item(game_state.get_player_name() + " (You)") |
|||
get_node("players/list").set_item_custom_bg_color(get_node("players/list").get_item_count()-1, game_state.get_player_color()) |
|||
for p in players: |
|||
get_node("players/list").add_item(p.name) |
|||
get_node("players/list").set_item_custom_bg_color(get_node("players/list").get_item_count()-1, p.color) |
|||
|
|||
get_node("players/start").disabled=not get_tree().is_network_server() |
|||
|
|||
func _on_start_pressed(): |
|||
game_state.begin_game() |
|||
|
|||
func _on_quick_pressed(): |
|||
var player_name = get_node("connect/name").text |
|||
var player_color = get_node("connect/color").color |
|||
game_state.host_game(player_name, player_color) |
|||
game_state.begin_game() |
@ -1,5 +1,15 @@ |
|||
extends Control |
|||
|
|||
func _ready(): |
|||
# TODO color |
|||
pass |
|||
var values = local_storage.read_values() |
|||
if values.has('player_name'): |
|||
get_name_node().set_text(values['player_name']) |
|||
if values.has('player_color'): |
|||
get_color_node().set_pick_color(Color(values['player_color'])) |
|||
|
|||
func get_name_node(): |
|||
return get_node("name") |
|||
|
|||
func get_color_node(): |
|||
return get_node("color") |
|||
|
@ -0,0 +1,22 @@ |
|||
extends Control |
|||
|
|||
onready var player_settings = get_node("menu/tabs/Game/player_settings") |
|||
|
|||
|
|||
func _ready(): |
|||
get_node("menu/back").connect("pressed",self,"_on_back_pressed") |
|||
get_node("menu/tabs/Game/bots").set_pressed(local_storage.read_value("bots", true)) |
|||
|
|||
func _on_back_pressed(): |
|||
queue_free() |
|||
get_tree().get_root().get_node("main_menu").show() |
|||
|
|||
func _on_save_pressed(): |
|||
var values = {} |
|||
values['player_name'] = player_settings.get_name_node().text |
|||
values['player_color'] = player_settings.get_color_node().color.to_html() |
|||
values['bots'] = get_node("menu/tabs/Game/bots").is_pressed() |
|||
local_storage.write_values(values) |
|||
_on_back_pressed() |
|||
|
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue