class_name CardBurner extends Playable @onready var cursor: CandleCursor = %CandleCursor @onready var ancors: Array[Control] = [%Ancor1, %Ancor2, %Ancor3, %Ancor4] signal card_burned var cards : Array[Card] = [] var _submitted := false func _ready(): print_debug("CardBurner.gd: %s._ready()" % self.name) super._ready() %SkipButton.pressed.connect(card_burned.emit) ## Main play coroutine - simple linear flow for burning a card func play() -> void: print_debug("CardBurner: Starting card burning sequence") # 1. Get all card names from the board (excluding stickies which start with "p") var card_names: Array[StringName] = [] for item_name in State.save_game.board_positions.keys(): if not item_name.begins_with("p"): card_names.append(item_name) print_debug("CardBurner: Found %d cards to choose from" % card_names.size()) # 2. Get card instances and shuffle them var stack : Array = HardCards.get_cards_by_name_array(card_names)["cards"] stack.shuffle() cards = [] # 3. Populate the 4 anchor slots with random cards for ancor: Control in ancors: var card: Card = stack.pop_front() cards.append(card) ancor.add_child(card) print_debug("CardBurner: Added card '%s' to anchor" % card.name) print("CardBurner: ", len(cards)) # 4. Wait for player to burn a card (or skip) print_debug("CardBurner: Waiting for player to burn a card...") handle_direction_input(Vector2.UP) await card_burned # 5. Play vanish animation and wait for completion print_debug("CardBurner: Card burned, playing vanish animation") $AnimationPlayer.play("vanish") await $AnimationPlayer.animation_finished print_debug("CardBurner: Sequence complete") func handle_hover(card: Draggable) -> void: if not card is Card: return selection = cards.find(card) func handle_mouse_button(event: InputEventMouseButton, card: Card) -> void: if event.button_index == MOUSE_BUTTON_MASK_LEFT and event.is_pressed() and not event.is_echo(): _submit(card) func _submit(card : Card): _submitted = true %SkipButton.visible = false await card.torch() card_burned.emit() func _input(event: InputEvent) -> void: if _submitted: return if event.is_action_pressed("ui_up"): handle_direction_input(Vector2.UP) elif event.is_action_pressed("ui_down"): handle_direction_input(Vector2.DOWN) elif event.is_action_pressed("ui_left"): handle_direction_input(Vector2.LEFT) elif event.is_action_pressed("ui_right"): handle_direction_input(Vector2.RIGHT) elif event.is_action_pressed("ui_accept"): _submit(cards[selection]) var focus_cards: bool = false: set(focus): if _submitted: return focus_cards = focus if focus_cards: cursor.visible = true %SkipButton.release_focus() else: cursor.visible = false %SkipButton.grab_focus() var selection: int: set(value): if _submitted: return selection = value % len(cards) for i in range(len(cards)): var card := cards[i] card.highlighted = (selection == i) card.burn_state = Card.burned.SINGED if card.highlighted else Card.burned.NOT if card.highlighted: cursor.gamepad_target = card.global_position + Vector2(-120, 150) func handle_direction_input(direction: Vector2) -> void: if _submitted: return if not cursor.gamepad_mode: cursor.gamepad_mode = true focus_cards = focus_cards match direction: Vector2.UP: focus_cards = true cursor.visible = true %SkipButton.release_focus() selection = selection Vector2.DOWN: focus_cards = false cursor.visible = false %SkipButton.grab_focus() Vector2.LEFT: focus_cards = true selection -= 1 Vector2.RIGHT: focus_cards = true selection += 1 if not focus_cards: cursor.gamepad_target += Vector2(0, 50)