Files
urm03/scripts/mech.gd
T
vh 5ba185f775 feat: wire _ph placeholder sprites into actors (mech, grunt, burster, slug, scrap)
Operator asked for placeholder sprites for playtest feel. Actors now
render the hand-authored pixel maps (tools/aseprite/maps -> assets/
sprites_ph, committed) via code-created Sprite2D — no scene texture
UIDs to hand-author. Dynamic feedback preserved: grunt/burster heat
tint + hit flash drive sprite.modulate, heat-aura ring stays a _draw
overlay; salvage fade drives modulate.a. Arena floor/walls, HUD, and
FX stay primitives. CLAUDE.md greybox-art note updated (was 'no
sprites'); real art (watercolor scenery + pixel sprites) still later.

Smoke gate 3/3 green on nh3-dev headless 4.7.1.
2026-08-14 22:39:03 -07:00

51 lines
1.2 KiB
GDScript

class_name Mech
extends CharacterBody2D
## M03, greybox slab. Piloting is positioning ONLY (canon: no aim, no
## combos) — movement input is the entire control surface.
signal hull_changed(hull: float, hull_max: float)
signal destroyed
@export var move_speed := 160.0
@export var accel := 900.0
@export var decel := 1200.0
@export var hull_max := 100.0
@export var dash_decay := 4.0
var hull: float
var _dash := Vector2.ZERO
const SPRITE := preload("res://assets/sprites_ph/m03_ph.png")
func _ready() -> void:
add_to_group("mech")
hull = hull_max
var spr := Sprite2D.new()
spr.texture = SPRITE
add_child(spr)
func _physics_process(delta: float) -> void:
var dir := Input.get_vector("move_left", "move_right", "move_up", "move_down")
var rate := accel if dir != Vector2.ZERO else decel
_dash = _dash.lerp(Vector2.ZERO, 1.0 - exp(-dash_decay * delta))
velocity = velocity.move_toward(dir * move_speed, rate * delta) + _dash
move_and_slide()
velocity -= _dash
func impulse(v: Vector2) -> void:
_dash += v
func take_damage(amount: float) -> void:
if hull <= 0.0:
return
hull = maxf(hull - amount, 0.0)
hull_changed.emit(hull, hull_max)
if hull <= 0.0:
# The run manager decides what death means (tally + relaunch).
destroyed.emit()