Skip to content

feat(appearance): author model manifests and reference visual layers #194

Description

@zoeyrose

Parent: atrinik/classic#224

Blocked by the contract frozen in atrinik/classic#225.

Outcome

Extend the authoritative atrinik/content@main model/catalog and Classic runtime target with bounded model-driven appearance manifests, validation, packaging, and the human/non-humanoid reference assets needed by the first Classic vertical slice.

This repository owns authored bodies, overlays, masks, palettes, anchors, clips, identities, licensing, and attribution. Rendering and the Classic wire contract remain in atrinik/classic.

Authored contract

Add one versioned surface—integrated with tools/content_catalog and the authoritative schema rather than a second parser—that can represent:

  • stable appearance-family IDs and declared presentation backend/capabilities;
  • normalized clips/poses mapped to ordered direction/frame resources and timing;
  • optional visual slots and compatible component IDs;
  • per-frame origin, pixel-snapped anchor/attachment, component bounds, and front/behind ordering;
  • explicit tint masks/channels and finite palette/swatches;
  • fallback face/animation identity;
  • aliases/migrations and exact Classic target projection; and
  • source, author, license, transformation, notice, distribution, and admission facts for every member.

Validate missing/duplicate/ambiguous IDs, wrong families/slots/frames, incomplete direction or pose coverage, unsafe paths/dimensions, invalid anchors/pivots/order cycles, excess components/masks/palettes, unknown references, nondeterminism, and absent/conflicting provenance. Unknown or unlicensed visual members fail closed.

Reference content

Produce human-created final assets under the policy tracked by #77:

  • one existing human appearance family with a neutral base body;
  • head, torso, and main-hand component slots;
  • one helmet, one armour/clothing layer, and one held weapon;
  • every direction/frame needed by existing idle, movement, and attack animation states;
  • one authored tint mask and two explicit palettes;
  • a deterministic two-handed/conflict fixture;
  • one deliberately incomplete component for fallback tests; and
  • one non-humanoid family declaring no equipment slots and using authored full-frame clips/current animation fallback.

Extracting a layer from inherited art is a transformation and requires exact provenance, attribution, license compatibility, and human review. Generated visual assets are not accepted as final shipped art. Temporary design drop-ins, if used, remain clearly marked, excluded from release, and tracked to replacement.

Runtime output

  • Extend python3 tools/build_runtime.py --target classic deterministically; keep all generated output isolated under build/.
  • Preserve existing PNG, bmaps, animations, and atrinik.0 behavior for unconverted and fallback models.
  • Permit a partial appearance catalog: registering one family must not require manifests, empty slot sets, rebuilt art, or identity changes for any unconverted family. Classic packages contain legacy and appearance-enabled resources side by side.
  • Emit a bounded manifest/catalog and immutable members suitable for the Classic client/server staging decision made by the design issue.
  • Use stable names/content identities; never serialize filesystem enumeration or release-local numeric face IDs as durable appearance IDs.
  • Coordinate generic face/animation/spriteset identity with #61. Do not encode Classic packet layout, client cache layout, GPU pages, or archive offsets into authored semantics.

Acceptance criteria

  • The authoritative schema/catalog contains the reference appearance families, clips, slots, components, anchors/orders, masks/palettes, fallbacks, and exact typed references with stable IDs.
  • Golden composed frames cover every reference direction and idle/move/attack frame, both palettes, front/behind ordering, the two-handed conflict, and the incomplete-component atomic fallback.
  • The non-humanoid fixture validates with zero clothing slots and retains complete modern clip/legacy fallback behavior.
  • Shuffled enumeration, clean/incremental builds, Linux/Windows paths, and repeated Classic target builds produce identical logical output and digests.
  • Negative fixtures reject all missing, duplicate, ambiguous, incompatible, cyclic, oversized, malformed, unsafe, and unlicensed cases with stable source-located diagnostics.
  • Every new or extracted final visual has exact human authorship/upstream source, transformations, license, attribution, notice, and release admission recorded; temporary generated drop-ins cannot enter the Classic target.
  • Existing unconverted faces/animations and current Classic collection remain byte/semantically usable as the fallback path.
  • A package containing only the opted-in reference family renders a deterministic mixed scene while representative unregistered families remain on their existing resources with no placeholder appearance records.
  • python3 tools/validate.py, an isolated python3 tools/build_runtime.py --target classic, and git diff --check pass.

Non-goals

  • Implementing the Classic client compositor or wire protocol.
  • Converting every player model, item, NPC, or monster in this first issue.
  • Guessing clothing layers, masks, or palettes from inventory icons.
  • Committing generated runtime output to authored source.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Fields

    Priority

    None yet

    Start date

    None yet

    Target date

    None yet

    Effort

    None yet

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions