diff --git a/.godot/editor/editor_layout.cfg b/.godot/editor/editor_layout.cfg
index 3eb99a4f53a2995f5b363dc377af8a55674fc18f..5340275d1cdece8de6d3ff2a79f7e6e4aae32235 100644
--- a/.godot/editor/editor_layout.cfg
+++ b/.godot/editor/editor_layout.cfg
@@ -25,17 +25,17 @@ 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")
-current_scene="res://scenes/Pawn.tscn"
-center_split_offset=-320
+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"
+center_split_offset=-313
 selected_default_debugger_tab_idx=0
 selected_main_editor_idx=2
 selected_bottom_panel_item=0
 
 [ScriptEditor]
 
-open_scripts=["res://scripts/game.gd", "res://scripts/Pawn.gd", "res://scripts/Piece.gd", "res://scripts/Rook.gd"]
-selected_script="res://scripts/Rook.gd"
+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_help=[]
 script_split_offset=70
 list_split_offset=0
diff --git a/.godot/editor/filesystem_update4 b/.godot/editor/filesystem_update4
index b75cf9f4dfae94c8b64291b4ae23b3722d5d6397..8a81da6e616bb3b6cdd13b0f990fedf8b2323b90 100644
--- a/.godot/editor/filesystem_update4
+++ b/.godot/editor/filesystem_update4
@@ -13,3 +13,5 @@ res://scripts/board.gd
 res://scenes/Pawn.tscn
 res://scenes/Rook.tscn
 res://scripts/Piece.gd
+res://scripts/Bishop.gd
+res://scenes/Bishop.tscn
diff --git a/.godot/editor/game.tscn-editstate-c2a7af834e91ff64325daddf58e45dc0.cfg b/.godot/editor/game.tscn-editstate-c2a7af834e91ff64325daddf58e45dc0.cfg
index 1c808c5d134883258cbfbc190268831b8c4a4f23..81cedcfc1bd0657711ec8285c8f52ab07757da4c 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]([])
+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")])
diff --git a/.godot/editor/project_metadata.cfg b/.godot/editor/project_metadata.cfg
index f38656647e1cd4274b23941d3715e01cf82bea3a..c1e3fa645ab47e14b9f1dd39526a3581f8eab5f6 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/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/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/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"]
 
 [color_picker]
 
diff --git a/.godot/editor/script_editor_cache.cfg b/.godot/editor/script_editor_cache.cfg
index b3cfa14bcef6808601fc5914ff790896d00eebce..ca83cea20e4bee17fa1dd950928e4b5b85a86001 100644
--- a/.godot/editor/script_editor_cache.cfg
+++ b/.godot/editor/script_editor_cache.cfg
@@ -3,7 +3,7 @@
 state={
 "bookmarks": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
-"column": 40,
+"column": 31,
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
 "row": 122,
@@ -34,7 +34,7 @@ state={
 "column": 0,
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
-"row": 10,
+"row": 17,
 "scroll_position": 0.0,
 "selection": false,
 "syntax_highlighter": "GDScript"
@@ -45,15 +45,25 @@ state={
 state={
 "bookmarks": PackedInt32Array(),
 "breakpoints": PackedInt32Array(),
-"column": 0,
+"column": 45,
 "folded_lines": Array[int]([]),
 "h_scroll_position": 0,
-"row": 10,
+"row": 11,
 "scroll_position": 0.0,
-"selection": true,
-"selection_from_column": 0,
-"selection_from_line": 10,
-"selection_to_column": 43,
-"selection_to_line": 10,
+"selection": false,
+"syntax_highlighter": "GDScript"
+}
+
+[res://scripts/Bishop.gd]
+
+state={
+"bookmarks": PackedInt32Array(),
+"breakpoints": PackedInt32Array(),
+"column": 19,
+"folded_lines": Array[int]([]),
+"h_scroll_position": 0,
+"row": 80,
+"scroll_position": 61.0,
+"selection": false,
 "syntax_highlighter": "GDScript"
 }
diff --git a/.godot/global_script_class_cache.cfg b/.godot/global_script_class_cache.cfg
index ae52abdee53546bdc7477e1129127aebe779827d..762b81469a7443462bc783be98bb3e86ab69e7e9 100644
--- a/.godot/global_script_class_cache.cfg
+++ b/.godot/global_script_class_cache.cfg
@@ -1,4 +1,10 @@
 list=Array[Dictionary]([{
+"base": &"Piece",
+"class": &"Bishop",
+"icon": "",
+"language": &"GDScript",
+"path": "res://scripts/Bishop.gd"
+}, {
 "base": &"Sprite2D",
 "class": &"Board",
 "icon": "",
diff --git a/.godot/uid_cache.bin b/.godot/uid_cache.bin
index 0599803417112f698de30a8febc454cd55790e8a..6909301c1a32ae2cb252b0ca334ad9019df34af7 100644
Binary files a/.godot/uid_cache.bin and b/.godot/uid_cache.bin differ
diff --git a/scenes/Bishop.tscn b/scenes/Bishop.tscn
new file mode 100644
index 0000000000000000000000000000000000000000..eb713ca5904226f47d5e225afd1e94f904f6eaa9
--- /dev/null
+++ b/scenes/Bishop.tscn
@@ -0,0 +1,10 @@
+[gd_scene load_steps=3 format=3 uid="uid://bf0kea272jnpo"]
+
+[ext_resource type="Script" path="res://scripts/Bishop.gd" id="1_l7uw0"]
+[ext_resource type="Texture2D" uid="uid://b68o4mj7wcwvq" path="res://assets/sprites/bishop.png" id="2_m57j0"]
+
+[node name="Node2D" type="Node2D"]
+script = ExtResource("1_l7uw0")
+
+[node name="Sprite2D" type="Sprite2D" parent="."]
+texture = ExtResource("2_m57j0")
diff --git a/scripts/Bishop.gd b/scripts/Bishop.gd
new file mode 100644
index 0000000000000000000000000000000000000000..1e272c8b3330fa0376cc2cfafbd72b524672fb00
--- /dev/null
+++ b/scripts/Bishop.gd
@@ -0,0 +1,82 @@
+extends Piece
+
+class_name Bishop
+
+enum Upgrade {
+	MOVE_CARDINAL_ONE,
+}
+
+func _init(is_white: bool, position: Vector2):
+	super._init(is_white, position)
+	# Testing upgrades
+	upgrades.append(Upgrade.MOVE_CARDINAL_ONE)
+
+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 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
+	# Check for MOVE_CARDINAL_ONE upgrade
+	if Upgrade.MOVE_CARDINAL_ONE in upgrades:
+		# Check cardinal moves (one space)
+		if x > 0 and (board_state[x - 1][y] == null or not board_state[x - 1][y].is_white):
+			valid_moves.append(Vector2(x - 1, y))
+		if x < 7 and (board_state[x + 1][y] == null or not board_state[x + 1][y].is_white):
+			valid_moves.append(Vector2(x + 1, y))
+		if y > 0 and (board_state[x][y - 1] == null or not board_state[x][y - 1].is_white):
+			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
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/scripts/Knight.gd b/scripts/Knight.gd
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/scripts/Queen.gd b/scripts/Queen.gd
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/scripts/game.gd b/scripts/game.gd
index 1c2eac760b7ef79b1f62854b91b1253ac68c9840..ebad2889558a200ce72502010552ceeafb9f6dca 100644
--- a/scripts/game.gd
+++ b/scripts/game.gd
@@ -44,11 +44,13 @@ 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[4][7] = Pawn.new(true, Vector2(4, 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][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))
@@ -111,6 +113,8 @@ func draw_pieces():
 					piece_scene = preload("res://scenes/Pawn.tscn")
 				elif board[x][y] is Rook:
 					piece_scene = preload("res://scenes/Rook.tscn")
+				elif board[x][y] is Bishop:
+					piece_scene = preload("res://scenes/Bishop.tscn")
 				# Add other piece types here (e.g., Knight, Bishop, Queen, King)
 				
 				if piece_scene: