online multiplayer chess game (note server currently down)
add a option to disable premoves
| -rw-r--r-- | Globals.gd | 9 | ||||
| -rw-r--r-- | Utils.gd | 2 | ||||
| -rw-r--r-- | project.godot | 6 | ||||
| -rw-r--r-- | ui/board/Board.gd | 10 | ||||
| -rw-r--r-- | ui/checkboxbutton/CheckBoxButton.gd | 2 | ||||
| -rw-r--r-- | ui/menus/settings/Settings.gd | 44 | ||||
| -rw-r--r-- | ui/menus/settings/Settings.tscn | 130 |
7 files changed, 127 insertions, 76 deletions
@@ -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" @@ -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"] |