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>
96 lines
2.3 KiB
Python
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",
|
|
]
|