134 lines
4.6 KiB
GDScript
134 lines
4.6 KiB
GDScript
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 reset():
|
|
remaining_turns = duration
|
|
valid = false
|
|
|
|
func apply_effect(target_piece = null, board_flow = null, game_state = null):
|
|
print("EXPLOSIVE apply_effect", )
|
|
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:
|
|
print("EXPLOSIVE apply_effect INVALID", )
|
|
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()
|