From b24b286be3429eb795349cb65e6b9f46a1ba883a Mon Sep 17 00:00:00 2001 From: Alan <alanjfogel@gmail.com> Date: Fri, 31 Jan 2025 14:07:25 -0600 Subject: [PATCH] Added King, Knight, Queen implementations --- .godot/editor/editor_layout.cfg | 8 +- .godot/editor/filesystem_update4 | 6 + ...state-c2a7af834e91ff64325daddf58e45dc0.cfg | 2 +- .godot/editor/project_metadata.cfg | 4 +- .godot/editor/script_editor_cache.cfg | 50 +++++++- .godot/global_script_class_cache.cfg | 18 +++ .godot/uid_cache.bin | Bin 3040 -> 3145 bytes scenes/King.tscn | 10 ++ scenes/Knight.tscn | 10 ++ scenes/Queen.tscn | 10 ++ scripts/Bishop.gd | 2 +- scripts/King.gd | 33 ++++++ scripts/Knight.gd | 39 +++++++ scripts/Queen.gd | 109 ++++++++++++++++++ scripts/game.gd | 14 ++- 15 files changed, 301 insertions(+), 14 deletions(-) create mode 100644 scenes/King.tscn create mode 100644 scenes/Knight.tscn create mode 100644 scenes/Queen.tscn diff --git a/.godot/editor/editor_layout.cfg b/.godot/editor/editor_layout.cfg index 5340275..f258697 100644 --- a/.godot/editor/editor_layout.cfg +++ b/.godot/editor/editor_layout.cfg @@ -25,8 +25,8 @@ dock_5="Inspector,Node,History" [EditorNode] -open_scenes=PackedStringArray("res://scenes/game.tscn", "res://scenes/explosion.tscn", "res://scenes/Pawn.tscn", "res://scenes/Rook.tscn", "res://scenes/Bishop.tscn") -current_scene="res://scenes/Bishop.tscn" +open_scenes=PackedStringArray("res://scenes/game.tscn", "res://scenes/explosion.tscn", "res://scenes/Pawn.tscn", "res://scenes/Rook.tscn", "res://scenes/Bishop.tscn", "res://scenes/Queen.tscn", "res://scenes/King.tscn", "res://scenes/Knight.tscn") +current_scene="res://scenes/Knight.tscn" center_split_offset=-313 selected_default_debugger_tab_idx=0 selected_main_editor_idx=2 @@ -34,8 +34,8 @@ selected_bottom_panel_item=0 [ScriptEditor] -open_scripts=["res://scripts/Bishop.gd", "res://scripts/game.gd", "res://scripts/Pawn.gd", "res://scripts/Piece.gd", "res://scripts/Rook.gd"] -selected_script="res://scripts/Bishop.gd" +open_scripts=["res://scripts/Bishop.gd", "res://scripts/game.gd", "res://scripts/King.gd", "res://scripts/Knight.gd", "res://scripts/Pawn.gd", "res://scripts/Piece.gd", "res://scripts/Queen.gd", "res://scripts/Rook.gd"] +selected_script="res://scripts/Knight.gd" open_help=[] script_split_offset=70 list_split_offset=0 diff --git a/.godot/editor/filesystem_update4 b/.godot/editor/filesystem_update4 index 8a81da6..ab798cc 100644 --- a/.godot/editor/filesystem_update4 +++ b/.godot/editor/filesystem_update4 @@ -15,3 +15,9 @@ res://scenes/Rook.tscn res://scripts/Piece.gd res://scripts/Bishop.gd res://scenes/Bishop.tscn +res://scripts/Queen.gd +res://scenes/Queen.tscn +res://scripts/King.gd +res://scenes/King.tscn +res://scripts/Knight.gd +res://scenes/Knight.tscn diff --git a/.godot/editor/game.tscn-editstate-c2a7af834e91ff64325daddf58e45dc0.cfg b/.godot/editor/game.tscn-editstate-c2a7af834e91ff64325daddf58e45dc0.cfg index 81cedcf..beea376 100644 --- a/.godot/editor/game.tscn-editstate-c2a7af834e91ff64325daddf58e45dc0.cfg +++ b/.godot/editor/game.tscn-editstate-c2a7af834e91ff64325daddf58e45dc0.cfg @@ -175,4 +175,4 @@ Anim={ "zfar": 4000.01, "znear": 0.05 } -selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@16886/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@PanelContainer@98/MainScreen/@CanvasItemEditor@9272/@VSplitContainer@9094/@HSplitContainer@9096/@HSplitContainer@9098/@Control@9099/@SubViewportContainer@9100/@SubViewport@9101/Node2D/Sprite2D")]) +selected_nodes=Array[NodePath]([NodePath("/root/@EditorNode@16886/@Panel@13/@VBoxContainer@14/DockHSplitLeftL/DockHSplitLeftR/DockHSplitMain/@VBoxContainer@25/DockVSplitCenter/@VSplitContainer@52/@VBoxContainer@53/@PanelContainer@98/MainScreen/@CanvasItemEditor@9272/@VSplitContainer@9094/@HSplitContainer@9096/@HSplitContainer@9098/@Control@9099/@SubViewportContainer@9100/@SubViewport@9101/Node2D")]) diff --git a/.godot/editor/project_metadata.cfg b/.godot/editor/project_metadata.cfg index c1e3fa6..234bcac 100644 --- a/.godot/editor/project_metadata.cfg +++ b/.godot/editor/project_metadata.cfg @@ -13,8 +13,8 @@ last_selected_language="GDScript" [recent_files] -scripts=["res://scripts/Bishop.gd", "res://scripts/Rook.gd", "res://scripts/Pawn.gd", "res://scripts/Piece.gd", "@GDScript", "int", "res://background.gd", "res://chess_board.tscn::GDScript_fv0wj", "res://tile_container.gd", "res://chess_board.gd"] -scenes=["res://scenes/Bishop.tscn", "res://scenes/Rook.tscn", "res://scenes/Pawn.tscn", "res://scenes/explosion.tscn", "res://scenes/game.tscn", "res://scenes/chess_board.tscn", "res://chess_board.tscn"] +scripts=["res://scripts/Knight.gd", "res://scripts/King.gd", "res://scripts/Queen.gd", "res://scripts/Bishop.gd", "res://scripts/Rook.gd", "res://scripts/Pawn.gd", "res://scripts/Piece.gd", "@GDScript", "int", "res://background.gd"] +scenes=["res://scenes/Knight.tscn", "res://scenes/King.tscn", "res://scenes/Queen.tscn", "res://scenes/Bishop.tscn", "res://scenes/Rook.tscn", "res://scenes/Pawn.tscn", "res://scenes/explosion.tscn", "res://scenes/game.tscn", "res://scenes/chess_board.tscn", "res://chess_board.tscn"] [color_picker] diff --git a/.godot/editor/script_editor_cache.cfg b/.godot/editor/script_editor_cache.cfg index ca83cea..abc1aa4 100644 --- a/.godot/editor/script_editor_cache.cfg +++ b/.godot/editor/script_editor_cache.cfg @@ -3,11 +3,11 @@ state={ "bookmarks": PackedInt32Array(), "breakpoints": PackedInt32Array(), -"column": 31, +"column": 20, "folded_lines": Array[int]([]), "h_scroll_position": 0, -"row": 122, -"scroll_position": 95.0, +"row": 121, +"scroll_position": 111.0, "selection": false, "syntax_highlighter": "GDScript" } @@ -59,7 +59,7 @@ state={ state={ "bookmarks": PackedInt32Array(), "breakpoints": PackedInt32Array(), -"column": 19, +"column": 3, "folded_lines": Array[int]([]), "h_scroll_position": 0, "row": 80, @@ -67,3 +67,45 @@ state={ "selection": false, "syntax_highlighter": "GDScript" } + +[res://scripts/Queen.gd] + +state={ +"bookmarks": PackedInt32Array(), +"breakpoints": PackedInt32Array(), +"column": 0, +"folded_lines": Array[int]([]), +"h_scroll_position": 0, +"row": 0, +"scroll_position": 0.0, +"selection": false, +"syntax_highlighter": "GDScript" +} + +[res://scripts/King.gd] + +state={ +"bookmarks": PackedInt32Array(), +"breakpoints": PackedInt32Array(), +"column": 0, +"folded_lines": Array[int]([]), +"h_scroll_position": 0, +"row": 0, +"scroll_position": 0.0, +"selection": false, +"syntax_highlighter": "GDScript" +} + +[res://scripts/Knight.gd] + +state={ +"bookmarks": PackedInt32Array(), +"breakpoints": PackedInt32Array(), +"column": 40, +"folded_lines": Array[int]([]), +"h_scroll_position": 0, +"row": 11, +"scroll_position": 3.0, +"selection": false, +"syntax_highlighter": "GDScript" +} diff --git a/.godot/global_script_class_cache.cfg b/.godot/global_script_class_cache.cfg index 762b814..9cec9a2 100644 --- a/.godot/global_script_class_cache.cfg +++ b/.godot/global_script_class_cache.cfg @@ -12,6 +12,18 @@ list=Array[Dictionary]([{ "path": "res://scripts/board.gd" }, { "base": &"Piece", +"class": &"King", +"icon": "", +"language": &"GDScript", +"path": "res://scripts/King.gd" +}, { +"base": &"Piece", +"class": &"Knight", +"icon": "", +"language": &"GDScript", +"path": "res://scripts/Knight.gd" +}, { +"base": &"Piece", "class": &"Pawn", "icon": "", "language": &"GDScript", @@ -24,6 +36,12 @@ list=Array[Dictionary]([{ "path": "res://scripts/Piece.gd" }, { "base": &"Piece", +"class": &"Queen", +"icon": "", +"language": &"GDScript", +"path": "res://scripts/Queen.gd" +}, { +"base": &"Piece", "class": &"Rook", "icon": "", "language": &"GDScript", diff --git a/.godot/uid_cache.bin b/.godot/uid_cache.bin index 6909301c1a32ae2cb252b0ca334ad9019df34af7..0a703b13c29539a5c4174156c62d6af09d92da24 100644 GIT binary patch delta 116 zcmaDLeo}(bdL!d~?o4mieK*S2vSo-fFfbIQ7F+4-7bmCYr55W4mZqlW>6H{G=bejx m>-_l8gCa3>CEl5N>0lM&4?R8$r>c5NV5rE;OwT9*s{sI;#wnNp delta 10 RcmX>p@j#r>Vk6^yZU7bw1Fir7 diff --git a/scenes/King.tscn b/scenes/King.tscn new file mode 100644 index 0000000..787fe4b --- /dev/null +++ b/scenes/King.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://dp63wl0rqfl2e"] + +[ext_resource type="Script" path="res://scripts/King.gd" id="1_ohp73"] +[ext_resource type="Texture2D" uid="uid://cdogixbq8ay3t" path="res://assets/Resized Chess Piece Assets/White_king.png" id="2_n8anr"] + +[node name="Node2D" type="Node2D"] +script = ExtResource("1_ohp73") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_n8anr") diff --git a/scenes/Knight.tscn b/scenes/Knight.tscn new file mode 100644 index 0000000..dc45522 --- /dev/null +++ b/scenes/Knight.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://chdgfilxbspil"] + +[ext_resource type="Script" path="res://scripts/Knight.gd" id="1_1c76x"] +[ext_resource type="Texture2D" uid="uid://mf4a3jclbwih" path="res://assets/Resized Chess Piece Assets/White_knight.png" id="2_22smc"] + +[node name="Node2D" type="Node2D"] +script = ExtResource("1_1c76x") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_22smc") diff --git a/scenes/Queen.tscn b/scenes/Queen.tscn new file mode 100644 index 0000000..6e919fe --- /dev/null +++ b/scenes/Queen.tscn @@ -0,0 +1,10 @@ +[gd_scene load_steps=3 format=3 uid="uid://de2b4xoiogohv"] + +[ext_resource type="Script" path="res://scripts/Queen.gd" id="1_bpbtf"] +[ext_resource type="Texture2D" uid="uid://cb3vq168iyomb" path="res://assets/Resized Chess Piece Assets/White_Queen.png" id="2_h1wfq"] + +[node name="Node2D" type="Node2D"] +script = ExtResource("1_bpbtf") + +[node name="Sprite2D" type="Sprite2D" parent="."] +texture = ExtResource("2_h1wfq") diff --git a/scripts/Bishop.gd b/scripts/Bishop.gd index 1e272c8..5b69d5f 100644 --- a/scripts/Bishop.gd +++ b/scripts/Bishop.gd @@ -78,5 +78,5 @@ func get_valid_moves(board_state: Array, pos: Vector2) -> Array[Vector2]: valid_moves.append(Vector2(x, y - 1)) if y < 7 and (board_state[x][y + 1] == null or not board_state[x][y + 1].is_white): valid_moves.append(Vector2(x, y + 1)) - + return valid_moves diff --git a/scripts/King.gd b/scripts/King.gd index e69de29..133a17d 100644 --- a/scripts/King.gd +++ b/scripts/King.gd @@ -0,0 +1,33 @@ +extends Piece + +class_name King + +enum Upgrade { + # Add any specific upgrades for King here +} + +func _init(is_white: bool, position: Vector2): + super._init(is_white, position) + +func get_valid_moves(board_state: Array, pos: Vector2) -> Array[Vector2]: + var valid_moves: Array[Vector2] = [] + var x = pos.x + var y = pos.y + + # TODO: STILL NEEDS TO IMPLEMENT CASTLING + # TODO: STILL NEEDS TO IMPLEMENT CHECKING FOR CHECK + + # Check moves in all directions (one square) + var directions = [ + Vector2(1, 0), Vector2(-1, 0), Vector2(0, 1), Vector2(0, -1), # Cardinal directions + Vector2(1, 1), Vector2(-1, -1), Vector2(1, -1), Vector2(-1, 1) # Diagonal directions + ] + + for direction in directions: + var new_x = x + direction.x + var new_y = y + direction.y + if new_x >= 0 and new_x < 8 and new_y >= 0 and new_y < 8: + if board_state[new_x][new_y] == null or board_state[new_x][new_y].is_white != is_white: + valid_moves.append(Vector2(new_x, new_y)) + + return valid_moves diff --git a/scripts/Knight.gd b/scripts/Knight.gd index e69de29..fd49fc1 100644 --- a/scripts/Knight.gd +++ b/scripts/Knight.gd @@ -0,0 +1,39 @@ +extends Piece + +class_name Knight + +enum Upgrade { + LONGER_L_MOVE, +} + +func _init(is_white: bool, position: Vector2): + super._init(is_white, position) + # Testing upgrades + #upgrades.append(Upgrade.LONGER_L_MOVE) + +func get_valid_moves(board_state: Array, pos: Vector2) -> Array[Vector2]: + var valid_moves: Array[Vector2] = [] + var x = pos.x + var y = pos.y + + # Define all possible moves for a knight + var moves = [ + Vector2(x + 2, y + 1), Vector2(x + 2, y - 1), + Vector2(x - 2, y + 1), Vector2(x - 2, y - 1), + Vector2(x + 1, y + 2), Vector2(x + 1, y - 2), + Vector2(x - 1, y + 2), Vector2(x - 1, y - 2) + ] + # Check for LONGER_L_MOVE upgrade + if Upgrade.LONGER_L_MOVE in upgrades: + moves += [ + Vector2(x + 3, y + 1), Vector2(x + 3, y - 1), + Vector2(x - 3, y + 1), Vector2(x - 3, y - 1), + Vector2(x + 1, y + 3), Vector2(x + 1, y - 3), + Vector2(x - 1, y + 3), Vector2(x - 1, y - 3) + ] + for move in moves: + if move.x >= 0 and move.x < 8 and move.y >= 0 and move.y < 8: + if board_state[move.x][move.y] == null or board_state[move.x][move.y].is_white != is_white: + valid_moves.append(move) + + return valid_moves diff --git a/scripts/Queen.gd b/scripts/Queen.gd index e69de29..7e65fc9 100644 --- a/scripts/Queen.gd +++ b/scripts/Queen.gd @@ -0,0 +1,109 @@ +extends Piece + +class_name Queen + +enum Upgrade { + # Add any specific upgrades for Queen here +} + +func _init(is_white: bool, position: Vector2): + super._init(is_white, position) + +func get_valid_moves(board_state: Array, pos: Vector2) -> Array[Vector2]: + var valid_moves: Array[Vector2] = [] + var x = pos.x + var y = pos.y + + # Check moves in the right direction + for i in range(x + 1, 8): + if board_state[i][y] == null: + valid_moves.append(Vector2(i, y)) + elif not board_state[i][y].is_white: + valid_moves.append(Vector2(i, y)) + break + else: + break + + # Check moves in the left direction + for i in range(x - 1, -1, -1): + if board_state[i][y] == null: + valid_moves.append(Vector2(i, y)) + elif not board_state[i][y].is_white: + valid_moves.append(Vector2(i, y)) + break + else: + break + + # Check moves upwards + for i in range(y - 1, -1, -1): + if board_state[x][i] == null: + valid_moves.append(Vector2(x, i)) + elif not board_state[x][i].is_white: + valid_moves.append(Vector2(x, i)) + break + else: + break + + # Check moves downwards + for i in range(y + 1, 8): + if board_state[x][i] == null: + valid_moves.append(Vector2(x, i)) + elif not board_state[x][i].is_white: + valid_moves.append(Vector2(x, i)) + break + else: + break + + # Check moves in the top-right diagonal + for i in range(1, 8): + if x + i < 8 and y - i >= 0: + if board_state[x + i][y - i] == null: + valid_moves.append(Vector2(x + i, y - i)) + elif not board_state[x + i][y - i].is_white: + valid_moves.append(Vector2(x + i, y - i)) + break + else: + break + else: + break + + # Check moves in the top-left diagonal + for i in range(1, 8): + if x - i >= 0 and y - i >= 0: + if board_state[x - i][y - i] == null: + valid_moves.append(Vector2(x - i, y - i)) + elif not board_state[x - i][y - i].is_white: + valid_moves.append(Vector2(x - i, y - i)) + break + else: + break + else: + break + + # Check moves in the bottom-right diagonal + for i in range(1, 8): + if x + i < 8 and y + i < 8: + if board_state[x + i][y + i] == null: + valid_moves.append(Vector2(x + i, y + i)) + elif not board_state[x + i][y + i].is_white: + valid_moves.append(Vector2(x + i, y + i)) + break + else: + break + else: + break + + # Check moves in the bottom-left diagonal + for i in range(1, 8): + if x - i >= 0 and y + i < 8: + if board_state[x - i][y + i] == null: + valid_moves.append(Vector2(x - i, y + i)) + elif not board_state[x - i][y + i].is_white: + valid_moves.append(Vector2(x - i, y + i)) + break + else: + break + else: + break + + return valid_moves diff --git a/scripts/game.gd b/scripts/game.gd index ebad288..1c6eddc 100644 --- a/scripts/game.gd +++ b/scripts/game.gd @@ -45,12 +45,16 @@ func _ready() -> void: #hard-coded setup of pieces board[0][7] = Rook.new(true, Vector2(0, 7)) board[1][7] = Bishop.new(true, Vector2(1, 7)) - board[3][7] = Pawn.new(true, Vector2(3, 7)) + board[2][7] = King.new(true, Vector2(2, 7)) + board[3][6] = Queen.new(true, Vector2(3, 6)) board[4][7] = Pawn.new(true, Vector2(4, 7)) + board[5][7] = Knight.new(true, Vector2(5, 7)) + board[6][7] = Pawn.new(true, Vector2(6, 7)) board[7][7] = Rook.new(true, Vector2(7, 7)) board[0][4] = Rook.new(false, Vector2(0, 4)) board[1][5] = Bishop.new(false, Vector2(1, 5)) + board[3][2] = Queen.new(false, Vector2(3, 2)) board[3][5] = Pawn.new(false, Vector2(3, 5)) board[4][4] = Pawn.new(false, Vector2(4, 4)) board[3][4] = Pawn.new(false, Vector2(3, 4)) @@ -115,6 +119,13 @@ func draw_pieces(): piece_scene = preload("res://scenes/Rook.tscn") elif board[x][y] is Bishop: piece_scene = preload("res://scenes/Bishop.tscn") + elif board[x][y] is Queen: + piece_scene = preload("res://scenes/Queen.tscn") + elif board[x][y] is King: + piece_scene = preload("res://scenes/King.tscn") + elif board[x][y] is Knight: + piece_scene = preload("res://scenes/Knight.tscn") + # Add other piece types here (e.g., Knight, Bishop, Queen, King) if piece_scene: @@ -311,7 +322,6 @@ func unselect_piece(): func highlight_tiles(): # Clear the previously selected valid moves remove_highlight() - print("selected_piece_position: ", selected_piece_position) valid_moves = selected_piece_value.get_valid_moves(board, selected_piece_position) for child in tile_container.get_children(): -- GitLab