From 98a56d9e5ecf570f5709770bbebdaea82489d167 Mon Sep 17 00:00:00 2001 From: 2ManyProjects Date: Sat, 1 Feb 2025 11:19:35 -0600 Subject: [PATCH] added explosive boots, removed certain effects from applying twice on the first turn --- Systems/Cards/Explosiveboots.gd | 126 ++++++++++++++++++++++++++++++++ Systems/Cards/Supernova.gd | 14 ++-- Systems/DeckManager.gd | 8 +- 3 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 Systems/Cards/Explosiveboots.gd diff --git a/Systems/Cards/Explosiveboots.gd b/Systems/Cards/Explosiveboots.gd new file mode 100644 index 0000000..a493f13 --- /dev/null +++ b/Systems/Cards/Explosiveboots.gd @@ -0,0 +1,126 @@ +class_name ExplosiveBootsCard extends Card + +const CAPTURE_RADIUS = 1 +var valid = false; +func _init(): + duration = 1 + super._init() + cardName = "Explosive Boots" + rank = Rank.RANK_2 + effectType = EffectType.PIECE_EFFECT + description = "All enemy units within 1 radius of the moving peice 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 + 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 >= 8 or target_y < 0 or target_y >= 8: + 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 tile = board_flow.get_node(tile_name) + + var existing_overlay = tile.get_node_or_null("ExplosiveBootsOverlay") + if existing_overlay: + existing_overlay.queue_free() + + var overlay = ColorRect.new() + overlay.name = "ExplosiveBootsOverlay" + overlay.color = Color(1, 0, 0, 0.3) + overlay.size = tile.size + overlay.mouse_filter = Control.MOUSE_FILTER_IGNORE + tile.add_child(overlay) + overlay.show() + + if tile.get_child_count() > 1: # > 1 because we just added the overlay + var piece = tile.get_child(0) + if piece.Item_Color != target_piece.Item_Color: + game_state.updatePoints(piece) + piece.queue_free() + + # Setup timer to remove overlays + var timer = Timer.new() + board_flow.add_child(timer) + timer.wait_time = 0.5 + 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 = Color(0.8, 0.8, 0.8, 1) if isWhite else Color(0.2, 0.2, 0.2, 1) + 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 attached_piece.get_parent().get_parent().owner.isPlayerTurn() and attached_piece and remaining_turns > 0: + # print(attached_piece.get_parent().get_parent(), attached_piece.get_parent().get_parent().owner) + var piece = attached_piece + var flow = attached_piece.get_parent().get_parent() + var state = attached_piece.get_parent().get_parent().owner + + # 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 = attached_piece.get_parent().get_parent().owner + if game_state.is_connected("turn_changed", on_turn_changed): + game_state.disconnect("turn_changed", on_turn_changed) + super.remove_effect() diff --git a/Systems/Cards/Supernova.gd b/Systems/Cards/Supernova.gd index dd143ac..0e97c4f 100644 --- a/Systems/Cards/Supernova.gd +++ b/Systems/Cards/Supernova.gd @@ -1,14 +1,14 @@ class_name SupernovaCard extends Card const CAPTURE_RADIUS = 3 -var started = false; +var valid = false; func _init(): duration = 5 super._init() cardName = "Supernova" rank = Rank.RANK_0 effectType = EffectType.PIECE_EFFECT - description = "All enemy units within 3 radius are captured" + description = "All enemy units within 3 radius of the king are captured" unitWhitelist = ["King"] remaining_turns = duration @@ -17,6 +17,10 @@ func apply_effect(target_piece = null, board_flow = null, game_state = null): 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 king_pos = target_piece.get_parent().name.split("-") var king_x = int(king_pos[0]) @@ -43,17 +47,15 @@ func apply_effect(target_piece = null, board_flow = null, game_state = null): for tile_name in tiles_to_check: var tile = board_flow.get_node(tile_name) - # Remove any existing overlay var existing_overlay = tile.get_node_or_null("SupernovaOverlay") if existing_overlay: existing_overlay.queue_free() - # Create new overlay var overlay = ColorRect.new() overlay.name = "SupernovaOverlay" overlay.color = Color(1, 0, 0, 0.3) overlay.size = tile.size - overlay.mouse_filter = Control.MOUSE_FILTER_IGNORE # Make sure overlay doesn't block input + overlay.mouse_filter = Control.MOUSE_FILTER_IGNORE tile.add_child(overlay) overlay.show() @@ -78,7 +80,6 @@ func apply_effect(target_piece = null, board_flow = null, game_state = null): ) timer.start() - setup_persistent_effect(game_state) return true func reset_tile_styles(board_flow, tiles_to_check): @@ -115,6 +116,7 @@ func on_turn_changed(): # 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(): diff --git a/Systems/DeckManager.gd b/Systems/DeckManager.gd index 5d410ec..13a4645 100644 --- a/Systems/DeckManager.gd +++ b/Systems/DeckManager.gd @@ -5,7 +5,7 @@ const DoubleTimeCard = preload("res://Systems/Cards/Doubletime.gd") const HopscotchCard = preload("res://Systems/Cards/Hopscotch.gd") const DrunkDrivingCard = preload("res://Systems/Cards/Drunkdriving.gd") const SupernovaCard = preload("res://Systems/Cards/Supernova.gd") - +const ExplosiveBootsCard = preload("res://Systems/Cards/Explosiveboots.gd") var deck: Array = [] var hand: Array = [] var discard: Array = [] @@ -25,8 +25,10 @@ func _init(): func initializeStartingDeck(): deck.clear(); - for i in range(2): - deck.append(DoubleTimeCard.new()) + # for i in range(2): + # deck.append(DoubleTimeCard.new()) + deck.append(ExplosiveBootsCard.new()) + deck.append(DoubleTimeCard.new()) deck.append(DrunkDrivingCard.new()) deck.append(HopscotchCard.new()) deck.append(SupernovaCard.new())