124 lines
3.2 KiB
GDScript
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
|