McRogueFace/shade_sprite/__init__.py
John McCardle 80e14163f9 Shade sprite module: faction generation, asset scanning, TextureCache
Extends the shade_sprite module (for merchant-shade.itch.io character
sprite sheets) with procedural faction generation and asset management:

- FactionGenerator: seed-based faction recipes with Biome, Element,
  Aesthetic, and RoleType enums for thematic variety
- AssetLibrary: filesystem scanner that discovers and categorizes
  layer PNGs by type (skins, clothes, hair, etc.)
- TextureCache: avoids redundant disk I/O when building many variants
- CharacterAssembler: HSL shift documentation, method improvements
- Demo expanded to 6 interactive scenes (animation viewer, HSL recolor,
  character gallery, faction generator, layer compositing, equipment)
- EVALUATION.md: 7DRL readiness assessment of the full module
- 329-line faction generation test suite

Assets themselves are not included -- sprite sheets are external
dependencies, some under commercial license.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 23:17:24 -05:00

96 lines
2.3 KiB
Python

"""shade_sprite - Sprite animation and compositing for Merchant Shade sprite packs.
A standalone module for McRogueFace that loads, composites, and animates
layered pixel art character sheets. Supports multiple sprite sheet formats
including the Puny Characters pack (paid & free), RPG Maker creatures,
and slime sheets.
Quick start:
from shade_sprite import AnimatedSprite, Direction, PUNY_29
import mcrfpy
tex = mcrfpy.Texture("Warrior-Red.png", 32, 32)
sprite = mcrfpy.Sprite(texture=tex, pos=(100, 100), scale=2.0)
scene.children.append(sprite)
anim = AnimatedSprite(sprite, PUNY_29)
anim.play("walk")
anim.direction = Direction.E
def tick_anims(timer, runtime):
anim.tick(timer.interval)
mcrfpy.Timer("anim", tick_anims, 50)
For layered characters:
from shade_sprite import CharacterAssembler, PUNY_29
assembler = CharacterAssembler(PUNY_29)
assembler.add_layer("skins/Human1.png")
assembler.add_layer("clothes/BasicBlue-Body.png", hue_shift=120.0)
assembler.add_layer("hair/M-Hairstyle1-Black.png")
texture = assembler.build("my_character")
For procedural factions:
from shade_sprite import FactionGenerator, AssetLibrary
lib = AssetLibrary()
gen = FactionGenerator(seed=42, library=lib)
recipe = gen.generate()
textures = recipe.build_role_textures(assembler)
"""
from .formats import (
Direction,
AnimFrame,
AnimDef,
SheetFormat,
PUNY_29,
PUNY_24,
CREATURE_RPGMAKER,
SLIME,
ALL_FORMATS,
detect_format,
)
from .animation import AnimatedSprite
from .assembler import CharacterAssembler, TextureCache
from .assets import AssetLibrary, LayerFile
from .factions import (
FactionRecipe,
FactionGenerator,
RoleDefinition,
Biome,
Element,
Aesthetic,
RoleType,
)
__all__ = [
# Core classes
"AnimatedSprite",
"CharacterAssembler",
"TextureCache",
# Format definitions
"Direction",
"AnimFrame",
"AnimDef",
"SheetFormat",
# Predefined formats
"PUNY_29",
"PUNY_24",
"CREATURE_RPGMAKER",
"SLIME",
"ALL_FORMATS",
# Utilities
"detect_format",
# Asset scanning
"AssetLibrary",
"LayerFile",
# Faction generation
"FactionRecipe",
"FactionGenerator",
"RoleDefinition",
"Biome",
"Element",
"Aesthetic",
"RoleType",
]