extends Control const CardDisplay = preload("res://Systems/CardDisplay.gd") var Selected_Node = "" var Turn = 0 var Location_X = "" var Location_Y = "" var turn_indicator: ColorRect var p1String: RichTextLabel var p2String: RichTextLabel var p1Points = 0 var p2Points = 0 var pos = Vector2(25, 25) var Areas: PackedStringArray # this is seperate the Areas for special circumstances, like castling. var Special_Area: PackedStringArray var light_style = StyleBoxFlat.new() var dark_style = StyleBoxFlat.new() var highlight_style = StyleBoxFlat.new() var deck_manager: DeckManager var card_display: CardDisplay var has_moved = false # Track if piece has moved this turn var currently_moving_piece = null func _ready(): deck_manager = DeckManager.new() card_display = CardDisplay.new() add_child(deck_manager) add_child(card_display) card_display.update_hand(deck_manager.hand) deck_manager.connect("hand_updated", func(hand): card_display.update_hand(hand)) light_style.bg_color = Color(0.8, 0.8, 0.8, 1) dark_style.bg_color = Color(0.2, 0.2, 0.2, 1) highlight_style.bg_color = Color(0, 0.3, 0, 1) # Get reference to the turn indicator turn_indicator = $TurnIndicator p1String = $Player1Points p2String = $Player2Points p1String.text = "0" p2String.text = "0" # Set initial color for white's turn update_turn_indicator() func update_turn_indicator(): if Turn == 0: # White's turn turn_indicator.color = Color(1, 1, 1, 1) # White else: # Black's turn turn_indicator.color = Color(0, 0, 0, 1) # Black func reset_highlights(): var Flow = get_node("Flow") for button in Flow.get_children(): var coord = button.name.split("-") var isWhiteSquare = (int(coord[0]) + int(coord[1])) % 2 == 0 if isWhiteSquare: button.add_theme_stylebox_override("normal", light_style) else: button.add_theme_stylebox_override("normal", dark_style) func _on_flow_send_location(location: String): if Selected_Node != "" && Selected_Node == location: reset_highlights() Selected_Node = "" return # variables for later var number = 0 Location_X = "" var node = get_node("Flow/" + location) # This is to try and grab the X and Y coordinates from the board while location.substr(number, 1) != "-": Location_X += location.substr(number, 1) number += 1 Location_Y = location.substr(number + 1) # Now... we need to figure out how to select the pieces. If there is a valid move, do stuff. # If we re-select, just go to that other piece if Selected_Node == "" && node.get_child_count() != 0 && node.get_child(0).Item_Color == Turn: Selected_Node = location Get_Moveable_Areas() elif Selected_Node != "" && node.get_child_count() != 0 && node.get_child(0).Item_Color == Turn && node.get_child(0).name == "Rook": # Castling for i in Areas: if i == node.name: var king = get_node("Flow/" + Selected_Node).get_child(0) var rook = node.get_child(0) # Using a seperate array because Areas wouldn't be really consistant... king.reparent(get_node("Flow/" + Special_Area[1])) rook.reparent(get_node("Flow/" + Special_Area[0])) king.position = pos rook.position = pos # We have to get the parent because it will break lmao. Update_Game(king.get_parent()) # En Passant elif Selected_Node != "" && node.get_child_count() != 0 && node.get_child(0).Item_Color != Turn && node.get_child(0).name == "Pawn" && Special_Area.size() != 0 && Special_Area[0] == node.name && node.get_child(0).get("En_Passant") == true: for i in Special_Area: if i == node.name: var pawn = get_node("Flow/" + Selected_Node).get_child(0) node.get_child(0).free() pawn.reparent(get_node("Flow/" + Special_Area[1])) pawn.position = pos Update_Game(pawn.get_parent()) elif Selected_Node != "" && node.get_child_count() != 0 && node.get_child(0).Item_Color == Turn: # Re-select Selected_Node = location Get_Moveable_Areas() elif Selected_Node != "" && node.get_child_count() != 0 && node.get_child(0).Item_Color != Turn: # Taking over a piece for i in Areas: if i == node.name: var Piece = get_node("Flow/" + Selected_Node).get_child(0) var captured_piece = node.get_child(0) # Add points to the capturing player if Turn == 0: # White's turn p1Points += captured_piece.Points p1String.text = str(p1Points) else: # Black's turn p2Points += captured_piece.Points p2String.text = str(p2Points) # Win conditions if captured_piece.name == "King": print("Damn, you win!") node.get_child(0).free() Piece.reparent(node) Piece.position = pos Update_Game(node) elif Selected_Node != "" && node.get_child_count() == 0: # Moving a piece for i in Areas: if i == node.name: var Piece = get_node("Flow/" + Selected_Node).get_child(0) Piece.reparent(node) Piece.position = pos Update_Game(node) func Update_Game(node): Selected_Node = "" if Turn == 0: Turn = 1 else: Turn = 0 update_turn_indicator() reset_highlights(); deck_manager.update_card_durations() has_moved = false currently_moving_piece = null var Flow = get_node("Flow") # get the en-passantable pieces and undo them var things = Flow.get_children() for i in things: if i.get_child_count() != 0 && i.get_child(0).name == "Pawn" && i.get_child(0).Item_Color == Turn && i.get_child(0).En_Passant == true: i.get_child(0).set("En_Passant", false) # Remove the abilities once they are either used or not used if node.get_child(0).name == "Pawn": if node.get_child(0).Double_Start == true: node.get_child(0).En_Passant = true node.get_child(0).Double_Start = false if node.get_child(0).name == "King": node.get_child(0).Castling = false if node.get_child(0).name == "Rook": node.get_child(0).Castling = false # Below is the movement that is used for the pieces func Get_Moveable_Areas(): var Flow = get_node("Flow") for button in Flow.get_children(): var coord = button.name.split("-") var isWhiteSquare = (int(coord[0]) + int(coord[1])) % 2 == 0 if isWhiteSquare: button.add_theme_stylebox_override("normal", light_style) else: button.add_theme_stylebox_override("normal", dark_style) # Clearing the arrays Areas.clear() Special_Area.clear() var Piece = get_node("Flow/" + Selected_Node).get_child(0) # For the selected piece that we have, we can get the movement that we need here. var moves = Piece.get_valid_moves(Flow, Selected_Node) Areas = moves.regular_moves Special_Area = moves.special_moves # Highlight valid moves for move in Areas: var button = Flow.get_node(move) var isWhiteSquare = (int(move.split("-")[0]) + int(move.split("-")[1])) % 2 == 0 var baseStyle = dark_style if isWhiteSquare: baseStyle = light_style var combinedStyle = StyleBoxFlat.new() combinedStyle.bg_color = baseStyle.bg_color + highlight_style.bg_color button.add_theme_stylebox_override("normal", combinedStyle) # One function that shortens everything. Its also a pretty good way to see if we went off the board or not. func Is_Null(Location): if get_node_or_null("Flow/" + Location) == null: return true else: return false