## Data class for tetromino shape definitions in 3D space. ## ## Stores shape geometry, combat stats, synergy tags, and cost information. ## Designed to be saved as a Resource (.tres file) for easy editor configuration. class_name TetrominoDefinition extends Resource enum ShapeType { I, O, T, S, Z, L, J } ## Shape type identifier @export var shape_type: ShapeType = ShapeType.I ## Base damage output per shot @export var base_damage: int = 10 ## Fire rate in shots per second @export var fire_rate: float = 1.0 ## Gold cost to place this tetromino @export var base_cost: int = 50 ## Synergy tags for combination effects (e.g., ["fire", "ice"]) @export var synergy_tags: PackedStringArray = [] ## 3D mesh color/tint for visual distinction @export var mesh_color: Color = Color.WHITE ## Pre-built 3D mesh for this tetromino @export var mesh: Mesh ## Detection radius for 3D adjacency synergies @export var synergy_radius: float = 2.5 ## 3D grid cells relative to anchor point var grid_cells: PackedVector3Array = [] func _init(p_shape_type: ShapeType = ShapeType.I) -> void: shape_type = p_shape_type _initialize_default_shape() ## Initialize default grid cells based on shape type (Tetris standard) func _initialize_default_shape() -> void: match shape_type: ShapeType.I: # I-piece: 4 in a row grid_cells = [Vector3i.ZERO, Vector3i.RIGHT, Vector3i.RIGHT * 2, Vector3i.RIGHT * 3] mesh_color = Color.CYAN base_damage = 8 fire_rate = 0.8 ShapeType.O: # O-piece: 2x2 square grid_cells = [Vector3i.ZERO, Vector3i.RIGHT, Vector3i.FORWARD, Vector3i.RIGHT + Vector3i.FORWARD] mesh_color = Color.YELLOW base_damage = 12 fire_rate = 1.2 ShapeType.T: # T-piece: T-shape grid_cells = [Vector3i.ZERO, Vector3i.LEFT, Vector3i.RIGHT, Vector3i.FORWARD] mesh_color = Color.MAGENTA base_damage = 10 fire_rate = 1.0 ShapeType.S: # S-piece: Zigzag grid_cells = [Vector3i.ZERO, Vector3i.RIGHT, Vector3i.FORWARD, Vector3i.LEFT + Vector3i.FORWARD] mesh_color = Color.GREEN base_damage = 9 fire_rate = 0.9 ShapeType.Z: # Z-piece: Reverse zigzag grid_cells = [Vector3i.ZERO, Vector3i.LEFT, Vector3i.FORWARD, Vector3i.RIGHT + Vector3i.FORWARD] mesh_color = Color.RED base_damage = 9 fire_rate = 0.9 ShapeType.L: # L-piece: L-shape grid_cells = [Vector3i.ZERO, Vector3i.LEFT, Vector3i.FORWARD, Vector3i.LEFT + Vector3i.FORWARD] mesh_color = Color.ORANGE base_damage = 11 fire_rate = 1.1 ShapeType.J: # J-piece: Reverse L-shape grid_cells = [Vector3i.ZERO, Vector3i.RIGHT, Vector3i.FORWARD, Vector3i.RIGHT + Vector3i.FORWARD] mesh_color = Color.BLUE base_damage = 11 fire_rate = 1.1 ## Get the display name of this tetromino func get_display_name() -> String: match shape_type: ShapeType.I: return "I" ShapeType.O: return "O" ShapeType.T: return "T" ShapeType.S: return "S" ShapeType.Z: return "Z" ShapeType.L: return "L" ShapeType.J: return "J" return "Invalid" ## Get all synergy tags as a formatted string func get_synergy_string() -> String: return ", ".join(synergy_tags) ## Check if this tetromino has a specific synergy tag func has_synergy_tag(tag: StringName) -> bool: return tag in synergy_tags