class_name PawnSpriteFrames extends RefCounted
## Builds a SpriteFrames resource from a {idle, walk, dead} atlas trio for a
## peasant character. Atlases are 128×128 with 4 rows (down/left/right/up)
## × 4 frames (32×32 cells).  Idle + Walk produce 4 directional animations
## each (loop=true); Dead is a single frame (loop=false) from row 0.
##
## Created via PawnSpriteFrames.build(atlases) from Pawn._ready().  The
## returned SpriteFrames is assigned to an AnimatedSprite2D's sprite_frames.

const CELL: int = 32
const DIRS: Array[StringName] = [&"down", &"left", &"right", &"up"]

## Build a SpriteFrames containing:
##   idle_down/left/right/up   — 4 frames each, loop, 4 fps
##   walk_down/left/right/up   — 4 frames each, loop, 8 fps
##   dead                      — 1 frame, no loop (from idle/dead row 0 col 0)
##
## `atlases` is a Dictionary with three Texture2D values keyed by "idle",
## "walk", "dead".  Each texture is 128×128.
static func build(atlases: Dictionary) -> SpriteFrames:
	var sf := SpriteFrames.new()
	# AnimatedSprite2D auto-creates a `default` animation; remove it so the
	# scene doesn't render an empty placeholder if a caller mistypes an anim name.
	if sf.has_animation(&"default"):
		sf.remove_animation(&"default")

	_add_directional(sf, &"idle", atlases["idle"], true, 4.0)
	_add_directional(sf, &"walk", atlases["walk"], true, 8.0)

	# Dead — single 32×32 frame from row 0 (down-facing) of the dead atlas.
	sf.add_animation(&"dead")
	sf.set_animation_loop(&"dead", false)
	var dead_at := AtlasTexture.new()
	dead_at.atlas = atlases["dead"]
	dead_at.region = Rect2(0, 0, CELL, CELL)
	sf.add_frame(&"dead", dead_at)

	return sf


static func _add_directional(sf: SpriteFrames, prefix: StringName, tex: Texture2D, loop: bool, fps: float) -> void:
	for row in 4:
		var anim_name := StringName("%s_%s" % [prefix, DIRS[row]])
		sf.add_animation(anim_name)
		sf.set_animation_loop(anim_name, loop)
		sf.set_animation_speed(anim_name, fps)
		for col in 4:
			var at := AtlasTexture.new()
			at.atlas = tex
			at.region = Rect2(col * CELL, row * CELL, CELL, CELL)
			sf.add_frame(anim_name, at)
