class_name CardBurner extends Playable var focused: bool = false: set(focus): if is_node_ready(): if not focus == focused: if focus: process_mode = Node.PROCESS_MODE_INHERIT self.show() Input.mouse_mode = Input.MOUSE_MODE_HIDDEN if not PromptManager.icons == InputPrompt.Icons.KEYBOARD or true: handle_direction_input(Vector2.UP) else: self.hide() process_mode = Node.PROCESS_MODE_DISABLED focused = focus @onready var cursor: CandleCursor = %CandleCursor @onready var ancors: Array[Control] = [%Ancor1, %Ancor2, %Ancor3, %Ancor4] signal card_burned func _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 random_cards: Array = HardCards.get_cards_by_name_array(card_names)["cards"] random_cards.shuffle() # 3. Populate the 4 anchor slots with random cards for ancor: Control in ancors: var new_card: Card = random_cards.pop_front() ancor.add_child(new_card) new_card.owner = self new_card.has_burned.connect(card_burned.emit) print_debug("CardBurner: Added card '%s' to anchor" % new_card.name) # 4. Wait for player to burn a card (or skip) print_debug("CardBurner: Waiting for player to burn a card...") 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): if not card is Card: return card.highlighted = card.mouse_over card.burn_state = Card.burned.SINGED if card.mouse_over else Card.burned.NOT func handle_mouse_button(event: InputEventMouseButton, card: Card): if event.button_index == MOUSE_BUTTON_MASK_LEFT and event.is_pressed() and not event.is_echo(): card.burn_state = Card.burned.BURNING func _input(event: InputEvent) -> void: if focused: 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 InputEventMouse: cursor.gamepad_mode = false ancors[card_index].get_child(0)._on_mouse_exited() elif event.is_action_pressed("ui_accept"): ancors[card_index].get_child(0).burn_state = Card.burned.BURNING var focus_cards: bool = false: set(focus): focus_cards = focus if focus_cards: cursor.visible = true %SkipButton.release_focus() card_index = card_index else: cursor.visible = false %SkipButton.grab_focus() ancors[card_index].get_child(0)._on_mouse_exited() var card_index: int = 0: set(index): ancors[card_index].get_child(0)._on_mouse_exited() card_index = index % 4 handle_hover(ancors[card_index].get_child(0)) func handle_direction_input(direction: Vector2): if not cursor.gamepad_mode: for ancor in ancors: ancor.get_child(0)._on_mouse_exited() cursor.gamepad_mode = true focus_cards = focus_cards match direction: Vector2.UP: focus_cards = true cursor.visible = true %SkipButton.release_focus() card_index = card_index Vector2.DOWN: focus_cards = false cursor.visible = false %SkipButton.grab_focus() ancors[card_index].get_child(0)._on_mouse_exited() Vector2.LEFT: focus_cards = true card_index -= 1 Vector2.RIGHT: focus_cards = true card_index += 1 cursor.gamepad_target = ancors[card_index].get_child(0).global_position + Vector2(-120, 150) if not focus_cards: cursor.gamepad_target += Vector2(0, 50)