online multiplayer chess game (note server currently down)
add a option to disable premoves
bendn 2022-10-24
parent 7bda076 · commit a44f982
-rw-r--r--Globals.gd9
-rw-r--r--Utils.gd2
-rw-r--r--project.godot6
-rw-r--r--ui/board/Board.gd10
-rw-r--r--ui/checkboxbutton/CheckBoxButton.gd2
-rw-r--r--ui/menus/settings/Settings.gd44
-rw-r--r--ui/menus/settings/Settings.tscn130
7 files changed, 127 insertions, 76 deletions
diff --git a/Globals.gd b/Globals.gd
index 235667a..3feceab 100644
--- a/Globals.gd
+++ b/Globals.gd
@@ -1,15 +1,18 @@
extends Node
var team := "w"
-var piece_set := "california"
-var board_color1: Color = Color(0.870588, 0.890196, 0.901961)
-var board_color2: Color = Color(0.54902, 0.635294, 0.678431)
var spectating := false
var local: LocalMultiplayer = null
var playing := false setget , get_playing
var chat: Chat = null
var grid: Grid = null
+# config vars
+var piece_set: String = Settings.default_settings_data.piece_set
+var board_color1: Color = Settings.default_settings_data.board_color1
+var board_color2: Color = Settings.default_settings_data.board_color2
+var premoves: bool = Settings.default_settings_data.premoves
+
func reset_vars() -> void:
team = "w"
diff --git a/Utils.gd b/Utils.gd
index 156313d..c68ef22 100644
--- a/Utils.gd
+++ b/Utils.gd
@@ -156,7 +156,7 @@ func request() -> int: # returns err
return error
-func walk_dir(path := "res://assets/pieces", only_dir := true, exclude := []) -> PoolStringArray: # walk the directory, finding the asset packs
+func walk_dir(path, only_dir := true, exclude := []) -> PoolStringArray: # walk the directory, finding the asset packs
var files := [] # init the files
var dir := Directory.new() # init the directory
if dir.open(path) == OK: # open the directory
diff --git a/project.godot b/project.godot
index 615b210..37525ce 100644
--- a/project.godot
+++ b/project.godot
@@ -210,6 +210,11 @@ _global_script_classes=[ {
"path": "res://saveload.gd"
}, {
"base": "Control",
+"class": "Settings",
+"language": "GDScript",
+"path": "res://ui/menus/settings/Settings.gd"
+}, {
+"base": "Control",
"class": "SliderButton",
"language": "GDScript",
"path": "res://ui/slider_button/SliderButton.gd"
@@ -300,6 +305,7 @@ _global_script_class_icons={
"ResignButton": "",
"Restrict": "",
"SaveLoader": "",
+"Settings": "",
"SliderButton": "",
"StatusLabel": "",
"Stockfish": "",
diff --git a/ui/board/Board.gd b/ui/board/Board.gd
index e6af0d5..a72b4f3 100644
--- a/ui/board/Board.gd
+++ b/ui/board/Board.gd
@@ -299,6 +299,8 @@ func square_clicked(clicked_square: BackgroundSquare) -> void:
if p and p.color == team:
if chess.turn != team:
+ if !Globals.premoves:
+ return
clicked_square.show_premove_indicators()
else:
clicked_square.show_move_indicators()
@@ -401,9 +403,9 @@ func auto_flip():
func _on_turn_over():
- if auto_change_team:
- team = chess.turn
- auto_flip()
+ # if auto_change_team:
+ # team = chess.turn
+ # auto_flip()
if is_my_turn():
set_take_move_circle_color()
@@ -422,7 +424,7 @@ func _on_turn_over():
Log.debug(["Executing premove:", san])
move(san, true, false) # make the move, send it to the opponent, dont prompt for premoves
premove = {}
- else:
+ elif Globals.premoves:
set_take_move_circle_color(premove_color)
SaveLoad.save("user://game.json", {pgn = chess.pgn(), fen = chess.fen()})
clear_last_clicked()
diff --git a/ui/checkboxbutton/CheckBoxButton.gd b/ui/checkboxbutton/CheckBoxButton.gd
index 178fcca..b985583 100644
--- a/ui/checkboxbutton/CheckBoxButton.gd
+++ b/ui/checkboxbutton/CheckBoxButton.gd
@@ -12,5 +12,5 @@ func _toggled(p: bool):
func _ready():
- assert(toggle_mode)
+ toggle_mode = true
_toggled(pressed)
diff --git a/ui/menus/settings/Settings.gd b/ui/menus/settings/Settings.gd
index 3d569a0..f9737a6 100644
--- a/ui/menus/settings/Settings.gd
+++ b/ui/menus/settings/Settings.gd
@@ -1,16 +1,13 @@
extends Control
+class_name Settings
const file = "user://chess.settings"
-onready var piece_sets: PoolStringArray = Utils.walk_dir()
-onready var piece_set_button: GridMenuButton = find_node("PieceSet")
-onready var fullscreenbutton := find_node("FullscreenButton")
-onready var vsyncbutton := find_node("VsyncButton")
-onready var borderlessbutton := find_node("Borderless")
-onready var preview: Preview = find_node("Preview")
-onready var board_color1: ColorPickerButtonBetter = find_node("boardcolor1")
-onready var board_color2: ColorPickerButtonBetter = find_node("boardcolor2")
-onready var rainbow = find_node("rainbow")
+onready var piece_sets: PoolStringArray = Utils.walk_dir("res://assets/pieces")
+onready var piece_set_button: GridMenuButton = $"%PieceSet"
+onready var preview: Preview = $"%Preview"
+onready var board_color1: ColorPickerButtonBetter = $"%boardcolor1"
+onready var board_color2: ColorPickerButtonBetter = $"%boardcolor2"
onready var settings: Dictionary = default_settings_data setget set_settings
@@ -18,12 +15,21 @@ const default_settings_data := {
vsync = false,
fullscreen = false,
borderless = false,
+ premoves = false,
piece_set = "california",
board_color1 = Color(0.870588, 0.890196, 0.901961),
board_color2 = Color(0.54902, 0.635294, 0.678431),
rainbow = false
}
+onready var node_map := {
+ vsync = $"%VsyncButton",
+ fullscreen = $"%FullscreenButton",
+ borderless = $"%Borderless",
+ premoves = $"%premoves",
+ rainbow = $"%rainbow",
+}
+
var ignore_set_settings = false
@@ -36,13 +42,11 @@ func set_settings(new_settings: Dictionary) -> void:
func update_button_visuals(set: Dictionary = settings) -> void:
ignore_set_settings = true
- vsyncbutton.pressed = set.vsync
- fullscreenbutton.pressed = set.fullscreen
- if is_instance_valid(borderlessbutton):
- borderlessbutton.pressed = !set.borderless
+ for k in settings:
+ if k in node_map:
+ node_map[k].pressed = set[k]
board_color1.color = set.board_color1
board_color2.color = set.board_color2
- rainbow.pressed = set.rainbow
preview.update_preview(set.board_color1, set.board_color2, set.piece_set)
ignore_set_settings = false
@@ -51,15 +55,17 @@ func _ready() -> void:
var lod = SaveLoad.load(file)
settings = lod if Utils.dict_cmp(lod, default_settings_data) else default_settings_data
if OS.has_feature("HTML5"):
- borderlessbutton.queue_free()
+ node_map.borderless.queue_free()
for i in piece_sets: # add the items
piece_set_button.add_icon_item(load("res://assets/pieces/" + i + "/wP.png"), i, Vector2(75, 75))
piece_set_button.selected = Array(piece_sets).find(settings.piece_set)
update_vars()
update_button_visuals()
+ save()
func update_vars() -> void:
+ Globals.premoves = settings.premoves
Globals.piece_set = settings.piece_set
Globals.board_color1 = settings.board_color1
Globals.board_color2 = settings.board_color2
@@ -67,6 +73,9 @@ func update_vars() -> void:
OS.window_fullscreen = settings.fullscreen
OS.window_borderless = settings.borderless
ColorBack.rainbow = settings.rainbow
+
+
+func save() -> void:
SaveLoad.save(file, settings)
@@ -116,3 +125,8 @@ func _on_resetbutton_pressed() -> void:
func _on_rainbow_toggled(button_pressed: bool) -> void:
ColorBack.rainbow = button_pressed
self.settings.rainbow = button_pressed
+
+
+func set_premoves(button_pressed: bool) -> void:
+ self.settings.premoves = button_pressed
+ Globals.premoves = button_pressed
diff --git a/ui/menus/settings/Settings.tscn b/ui/menus/settings/Settings.tscn
index c9fe238..1d8147e 100644
--- a/ui/menus/settings/Settings.tscn
+++ b/ui/menus/settings/Settings.tscn
@@ -50,30 +50,57 @@ rect_min_size = Vector2( 0, 24 )
[node name="TabContainer" type="TabContainer" parent="V/H/V"]
margin_top = 34.0
margin_right = 400.0
-margin_bottom = 356.0
+margin_bottom = 222.0
rect_min_size = Vector2( 400, 0 )
-size_flags_vertical = 0
+size_flags_horizontal = 4
+size_flags_vertical = 4
custom_constants/hseparation = 20
drag_to_rearrange_enabled = true
-use_hidden_tabs_for_min_size = true
-[node name=" board" type="VBoxContainer" parent="V/H/V/TabContainer"]
+[node name=" gameplay" type="VBoxContainer" parent="V/H/V/TabContainer"]
+anchor_right = 1.0
+anchor_bottom = 1.0
+margin_left = 40.0
+margin_top = 94.0
+margin_right = -40.0
+margin_bottom = -40.0
+alignment = 1
+
+[node name="premoves" type="Button" parent="V/H/V/TabContainer/ gameplay"]
+unique_name_in_owner = true
+margin_left = 78.0
+margin_right = 241.0
+margin_bottom = 54.0
+hint_tooltip = "allows you to makea move before your opponent moves"
+size_flags_horizontal = 4
+text = "premoves"
+script = ExtResource( 3 )
+
+[node name=" view" type="VBoxContainer" parent="V/H/V/TabContainer"]
+visible = false
anchor_right = 1.0
anchor_bottom = 1.0
margin_left = 40.0
margin_top = 94.0
margin_right = -40.0
margin_bottom = -40.0
+mouse_filter = 2
alignment = 1
-[node name="boardcolor1" parent="V/H/V/TabContainer/ board" instance=ExtResource( 5 )]
+[node name="board" type="HBoxContainer" parent="V/H/V/TabContainer/ view"]
+margin_right = 40.0
+margin_bottom = 40.0
+
+[node name="boardcolor1" parent="V/H/V/TabContainer/ view/board" instance=ExtResource( 5 )]
+unique_name_in_owner = true
margin_left = 63.0
margin_right = 257.0
margin_bottom = 54.0
size_flags_horizontal = 4
text = "boardcolor1"
-[node name="boardcolor2" parent="V/H/V/TabContainer/ board" instance=ExtResource( 5 )]
+[node name="boardcolor2" parent="V/H/V/TabContainer/ view/board" instance=ExtResource( 5 )]
+unique_name_in_owner = true
margin_left = 63.0
margin_top = 64.0
margin_right = 257.0
@@ -81,7 +108,8 @@ margin_bottom = 118.0
size_flags_horizontal = 4
text = "boardcolor2"
-[node name="PieceSet" parent="V/H/V/TabContainer/ board" instance=ExtResource( 6 )]
+[node name="PieceSet" parent="V/H/V/TabContainer/ view/board" instance=ExtResource( 6 )]
+unique_name_in_owner = true
margin_left = 60.0
margin_top = 128.0
margin_right = 260.0
@@ -92,63 +120,59 @@ text = "piece set"
icon = ExtResource( 7 )
offset = Vector2( 50, -50 )
-[node name=" win" type="VBoxContainer" parent="V/H/V/TabContainer"]
-visible = false
-anchor_right = 1.0
-anchor_bottom = 1.0
-margin_left = 40.0
-margin_top = 94.0
-margin_right = -40.0
-margin_bottom = -40.0
-mouse_filter = 2
-alignment = 1
+[node name="screen" type="HBoxContainer" parent="V/H/V/TabContainer/ view"]
+margin_right = 40.0
+margin_bottom = 40.0
-[node name="FullscreenButton" type="Button" parent="V/H/V/TabContainer/ win"]
+[node name="FullscreenButton" type="Button" parent="V/H/V/TabContainer/ view/screen"]
+unique_name_in_owner = true
margin_left = 77.0
-margin_top = 3.0
+margin_top = 262.0
margin_right = 243.0
-margin_bottom = 57.0
+margin_bottom = 316.0
+hint_tooltip = "to go fullscreen"
focus_mode = 0
-size_flags_horizontal = 4
+size_flags_horizontal = 3
toggle_mode = true
text = "fullscreen"
script = ExtResource( 3 )
-[node name="VsyncButton" type="Button" parent="V/H/V/TabContainer/ win"]
+[node name="VsyncButton" type="Button" parent="V/H/V/TabContainer/ view/screen"]
+unique_name_in_owner = true
margin_left = 109.0
-margin_top = 67.0
+margin_top = 326.0
margin_right = 210.0
-margin_bottom = 121.0
+margin_bottom = 380.0
+hint_tooltip = "syncs the refresh rate with the monitor preventing screen tearing
+"
focus_mode = 0
-size_flags_horizontal = 4
+size_flags_horizontal = 3
toggle_mode = true
text = "vsync"
script = ExtResource( 3 )
-[node name="Borderless" type="Button" parent="V/H/V/TabContainer/ win"]
+[node name="Borderless" type="Button" parent="V/H/V/TabContainer/ view/screen"]
+unique_name_in_owner = true
margin_left = 93.0
-margin_top = 131.0
+margin_top = 390.0
margin_right = 226.0
-margin_bottom = 185.0
+margin_bottom = 444.0
focus_mode = 0
-size_flags_horizontal = 4
+size_flags_horizontal = 3
toggle_mode = true
-text = "borders"
+text = "borderless"
script = ExtResource( 3 )
+__meta__ = {
+"_editor_description_": "removes the borders of the screen"
+}
-[node name="misc" type="VBoxContainer" parent="V/H/V/TabContainer"]
-visible = false
-anchor_right = 1.0
-anchor_bottom = 1.0
-margin_left = 40.0
-margin_top = 94.0
-margin_right = -40.0
-margin_bottom = -40.0
-
-[node name="rainbow" type="Button" parent="V/H/V/TabContainer/misc"]
-margin_left = 37.0
-margin_right = 283.0
-margin_bottom = 54.0
+[node name="rainbow" type="Button" parent="V/H/V/TabContainer/ view"]
+unique_name_in_owner = true
+margin_left = 400.0
+margin_top = -128.0
+margin_right = 646.0
+margin_bottom = 306.0
+hint_tooltip = "try it and see"
focus_mode = 0
size_flags_horizontal = 4
toggle_mode = true
@@ -170,6 +194,7 @@ text = "Preview"
align = 1
[node name="Preview" type="GridContainer" parent="V/H/V2"]
+unique_name_in_owner = true
margin_top = 34.0
margin_right = 500.0
margin_bottom = 434.0
@@ -184,12 +209,13 @@ __meta__ = {
}
[connection signal="pressed" from="V/resetbutton" to="." method="_on_resetbutton_pressed"]
-[connection signal="changed" from="V/H/V/TabContainer/ board/boardcolor1" to="." method="_on_boardcolor1_changed"]
-[connection signal="newcolor" from="V/H/V/TabContainer/ board/boardcolor1" to="." method="_on_boardcolor1_newcolor"]
-[connection signal="changed" from="V/H/V/TabContainer/ board/boardcolor2" to="." method="_on_boardcolor2_changed"]
-[connection signal="newcolor" from="V/H/V/TabContainer/ board/boardcolor2" to="." method="_on_boardcolor2_newcolor"]
-[connection signal="selected" from="V/H/V/TabContainer/ board/PieceSet" to="." method="_on_PieceSet_selected"]
-[connection signal="toggled" from="V/H/V/TabContainer/ win/FullscreenButton" to="." method="_on_FullscreenButton_toggled"]
-[connection signal="toggled" from="V/H/V/TabContainer/ win/VsyncButton" to="." method="_on_VsyncButton_toggled"]
-[connection signal="toggled" from="V/H/V/TabContainer/ win/Borderless" to="." method="_on_Borderless_toggled"]
-[connection signal="toggled" from="V/H/V/TabContainer/misc/rainbow" to="." method="_on_rainbow_toggled"]
+[connection signal="toggled" from="V/H/V/TabContainer/ gameplay/premoves" to="." method="set_premoves"]
+[connection signal="changed" from="V/H/V/TabContainer/ view/board/boardcolor1" to="." method="_on_boardcolor1_changed"]
+[connection signal="newcolor" from="V/H/V/TabContainer/ view/board/boardcolor1" to="." method="_on_boardcolor1_newcolor"]
+[connection signal="changed" from="V/H/V/TabContainer/ view/board/boardcolor2" to="." method="_on_boardcolor2_changed"]
+[connection signal="newcolor" from="V/H/V/TabContainer/ view/board/boardcolor2" to="." method="_on_boardcolor2_newcolor"]
+[connection signal="selected" from="V/H/V/TabContainer/ view/board/PieceSet" to="." method="_on_PieceSet_selected"]
+[connection signal="toggled" from="V/H/V/TabContainer/ view/screen/FullscreenButton" to="." method="_on_FullscreenButton_toggled"]
+[connection signal="toggled" from="V/H/V/TabContainer/ view/screen/VsyncButton" to="." method="_on_VsyncButton_toggled"]
+[connection signal="toggled" from="V/H/V/TabContainer/ view/screen/Borderless" to="." method="_on_Borderless_toggled"]
+[connection signal="toggled" from="V/H/V/TabContainer/ view/rainbow" to="." method="_on_rainbow_toggled"]