diff --git a/.godot/editor/editor_layout.cfg b/.godot/editor/editor_layout.cfg index 5340275d1cdece8de6d3ff2a79f7e6e4aae32235..f2586975e7f02a2628341cabdc9711af6c49fc77 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 8a81da6e616bb3b6cdd13b0f990fedf8b2323b90..ab798cc10cb9c00987fc47d18ad5d4511595e2b7 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 81cedcfc1bd0657711ec8285c8f52ab07757da4c..beea37665ebfb99b06ab1fd4b1dda18e6ed5bd9d 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 c1e3fa645ab47e14b9f1dd39526a3581f8eab5f6..234bcac911cf37eb96e5d3516495e085a2f30199 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 ca83cea20e4bee17fa1dd950928e4b5b85a86001..abc1aa413843d273a2df55d457afbd8dcb24d524 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 762b81469a7443462bc783be98bb3e86ab69e7e9..9cec9a219d38e9683baf917cb767ca8ce201977a 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 Binary files a/.godot/uid_cache.bin and b/.godot/uid_cache.bin differ diff --git a/scenes/King.tscn b/scenes/King.tscn new file mode 100644 index 0000000000000000000000000000000000000000..787fe4bab14a946ad8127af1641b311f4eb5d543 --- /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 0000000000000000000000000000000000000000..dc45522d62ff3224eaeb179e067bf89acd889109 --- /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 0000000000000000000000000000000000000000..6e919fe7d23570cc756079629376960161829c34 --- /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 1e272c8b3330fa0376cc2cfafbd72b524672fb00..5b69d5fc83f99b42ce6178b93495b5878673c5ea 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..133a17de26b2922572afd42303124ddabf03c25d 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fd49fc15211f693ac8580f2dc5b0efa778fba875 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 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..7e65fc9f82bff6cad48a0dd88c47f1582e7fff1b 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 ebad2889558a200ce72502010552ceeafb9f6dca..1c6eddcef65e05f85f9a64aeb9b3f4b37df5fe24 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():