Files
trenchlock/scripts/tetromino_definition.gd
2026-01-13 08:31:42 +01:00

124 lines
3.2 KiB
GDScript

## 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