class_name ExplosiveBootsCard extends Card const CAPTURE_RADIUS = 1 var valid = false; func _init(): duration = 1 super._init() cardName = "Explosive Boots" rank = Rank.RANK_3 effectType = EffectType.PIECE_EFFECT description = "All enemy units within 1 radius of the moving peice at the end of the turn are captured" unitWhitelist = ["Pawn", "Knight", "King"] remaining_turns = duration func apply_effect(target_piece = null, board_flow = null, game_state = null): attached_piece = target_piece stored_board_flow = board_flow stored_game_state = game_state if !target_piece or !board_flow or !game_state: print(cardName, " missing input param ") return false setup_persistent_effect(game_state) # dont apply on card attachment if !valid: return true var piece_pos = target_piece.get_parent().name.split("-") var piece_x = int(piece_pos[0]) var piece_y = int(piece_pos[1]) var tiles_to_check = [] for dx in range(-CAPTURE_RADIUS, CAPTURE_RADIUS + 1): for dy in range(-CAPTURE_RADIUS, CAPTURE_RADIUS + 1): if max(abs(dx), abs(dy)) > CAPTURE_RADIUS: continue var target_x = piece_x + dx var target_y = piece_y + dy if target_x < 0 or target_x >= game_state.boardXSize or target_y < 0 or target_y >= game_state.boardYSize: continue if dx == 0 and dy == 0: continue tiles_to_check.append(str(target_x) + "-" + str(target_y)) # Process tiles and add overlay for tile_name in tiles_to_check: var container = board_flow.get_node(tile_name) as PieceContainer # Handle overlay through container's overlay management container.remove_overlay("ExplosiveBootsOverlay") var overlay = ColorRect.new() overlay.name = "ExplosiveBootsOverlay" overlay.color = Color(1, 0, 0, 0.3) overlay.size = container.size overlay.mouse_filter = Control.MOUSE_FILTER_IGNORE container.add_overlay(overlay) overlay.show() # Check for pieces to affect var piece = container.get_piece() if piece != null and piece.Item_Color != target_piece.Item_Color: game_state.updatePointsAndCapture(piece) # Setup timer to remove overlays var timer = Timer.new() board_flow.add_child(timer) timer.wait_time = 1 timer.one_shot = true timer.timeout.connect(func(): for tile_name in tiles_to_check: var tile = board_flow.get_node(tile_name) var overlay = tile.get_node_or_null("ExplosiveBootsOverlay") if overlay: overlay.queue_free() timer.queue_free() ) timer.start() return true func reset_tile_styles(board_flow, tiles_to_check): for tile_name in tiles_to_check: var tile = board_flow.get_node(tile_name) if !tile: continue # Reset to original chess board pattern var coords = tile_name.split("-") var isWhite = (int(coords[0]) + int(coords[1])) % 2 == 0 var style = StyleBoxFlat.new() style.bg_color = Utils.LIGHT_CELL if isWhite else Utils.DARK_CELL tile.add_theme_stylebox_override("normal", style) func setup_persistent_effect(game_state): # Connect to the turn change signal if not already connected if !game_state.is_connected("turn_changed", on_turn_changed): game_state.connect("turn_changed", on_turn_changed) func on_turn_changed(): # print("TURN CHANGED ==================", attached_piece, " | ", remaining_turns, ) if stored_game_state.isPlayerTurn() and attached_piece and remaining_turns > 0: var piece = attached_piece var flow = stored_board_flow var state = stored_game_state # print("Debug values:") # print("- Piece: ", piece, " is null? ", piece == null) # print("- Board Flow: ", flow, " is null? ", flow == null) # print("- Game State: ", state, " is null? ", state == null) # Now try apply_effect with these values valid = true apply_effect(piece, flow, state) func remove_effect(): if attached_piece: var game_state = stored_game_state if game_state.is_connected("turn_changed", on_turn_changed): game_state.disconnect("turn_changed", on_turn_changed) super.remove_effect()