2 player preview animation profile
forgejo-actions edited this page 2026-07-11 10:33:50 +00:00

Player Preview Animation Profile

Purpose

Player preview animation profiles describe the clips, actions, timeline cues, effect overlays, and per-layer sprite overrides used by the character paperdoll preview and animation workbench. The default authored profile is assets/character/preview_animation_profile.json, referenced in code as the asset-relative path character/preview_animation_profile.json.

Use this profile when an authored player action needs to appear in preview, be reviewed as a fixture, or produce paperdoll snapshot images.

Steps

  1. Edit the root manifest or split fragment through the animation workbench when possible.
  2. Add or update clips with matching frame and timer counts.
  3. Add action metadata, typed cues, effects, and layer overrides for the authored action.
  4. Use scenario proof before exporting fixtures.
  5. Generate paperdoll snapshots or fixture exports for review.
  6. Run bake or validation checks before handing the profile to runtime.

Split Profile Files

The root profile file is a manifest with version: 1 and a fragments list. The editor save path writes split fragments beside the manifest in a directory named after the manifest stem. For the default profile, that means:

  • assets/character/preview_animation_profile.json
  • assets/character/preview_animation_profile/core.json
  • assets/character/preview_animation_profile/combat.json
  • assets/character/preview_animation_profile/tools.json
  • assets/character/preview_animation_profile/gathering.json
  • assets/character/preview_animation_profile/interact.json
  • assets/character/preview_animation_profile/movement.json
  • assets/character/preview_animation_profile/fishing.json
  • assets/character/preview_animation_profile/reaction.json

Fragments may contain clips, actions, action_effects, and layer_overrides. Empty buckets are omitted from the manifest, and stale fragment files are removed when a save no longer produces that bucket.

Bucket assignment is descriptor-driven. Actions prefer their category; otherwise clips, effects, and overrides are assigned from the key. The current bucket slugs are core, combat, tools, gathering, interact, movement, fishing, and reaction.

Clips

Each clip is keyed by key and displayed with name. It selects a paperdoll page, then maps animation frames to timers. frames and timers must have the same length.

Important clip fields:

  • root_motion: optional per-frame movement; when present, it must match the number of frames.
  • facing_override: forces down, up, left, or right.
  • side_only and side_fallback_facing: allow side-authored clips to stand in for left/right views.
  • body_rows and tool_rows: override facing row selection for body and tool sheets.
  • looped: marks clips that should repeat in preview.
  • tool_name_token and tool_pages: connect action clips to tool sheets; tool_pages requires a tool token.

Actions And Cues

Actions connect clips to gameplay-facing metadata. Every action needs a key and label; optional fields include category, required_equipment, gameplay_mode, stamina_cost, mana_cost, cooldown_ms, lockout_ms, interrupt_policy, completion_follow_up, and events.

Valid categories are combat, tools, gathering, interact, movement, fishing, and reaction. Valid equipment tokens include hands, farm_tool, pickaxe, axe, hammer, bug_net, fishing_rod, bow, polearm, and one_hand. Valid gameplay modes are exploration, bow_combat, polearm_combat, and one_hand_combat.

Each event has a step and can use a legacy event string or typed cues. Typed cues are preferred:

  • vfx: effect_key and optional image_path.
  • sfx: audio cue.
  • camera: camera cue.
  • hitbox: hitbox key.
  • projectile: projectile_key and optional effect_image_path.

Known legacy events include gameplay_window_open, gameplay_window_close, projectile_spawn, hit_frame, and recovery_frame.

Effects And Layer Overrides

action_effects add visual overlays for a keyed action or clip. Each effect has a key, optional facing, optional image_path, and at least one step. Steps can set frame_id, atlas, offset, flip_x, flip_y, sorting, and rotation_degrees.

layer_overrides replace or hide a paperdoll layer for a keyed action or clip. Each override has a key, optional facing, optional asset_page, a layer, and at least one step. Supported layers are body, tool, tool_a, and tool_b. Steps can set hidden, atlas, offset, sorting, flip_x, and flip_y.

Facing lookup prefers an exact facing match, then side for left/right clips, then the generic empty-facing entry.

Scenario Proof And Fixture Export

The animation workbench builds scenario proof from the selected source row and its runtime comparison. Use it before exporting fixtures so the authored clip, expected timeline labels, and observed runtime snapshots agree.

Fixture export produces an AnimationFixtureExport JSON payload with:

  • fixture_id
  • source_key and source_label
  • proof steps
  • exported frames
  • runtime_snapshots
  • pack gate references such as pack_export:replay_fixture, engine_health:animation_fixture, and scenario_proof:<source_key>

The workbench previews the JSON and uses assets/fixtures/animation/<fixture_id>.json as the default fixture destination.

Review Image Generation

Use aether-paperdoll-snapshot when reviewers need PNG sheets or GIFs instead of an in-editor preview. The packaged command name is aether-paperdoll-snapshot; from the repo, run it through Cargo:

cargo run --bin aether-paperdoll-snapshot -- --clip bow_shoot_up --facing down --step 0 --layer all --out target/paperdoll-animation-export/review/bow_shoot_up_down.png --scale 4

Batch export generates review sheets and GIFs under target/paperdoll-animation-export unless another output directory is supplied:

cargo run --bin aether-paperdoll-snapshot -- --export-all --family classic --out-dir target/paperdoll-animation-export/classic --scale 4
cargo run --bin aether-paperdoll-snapshot -- --export-all --family farmer --out-dir target/paperdoll-animation-export/farmer --scale 4

The snapshot CLI supports classic and farmer families, facings down, up, left, and right, layers all, base, outfit, tool-a, tool-b, effect, and farmer tracks such as 01body, 14head, farmer_tools, farmer_bow, fishing_right_left, and slash_effects. Tool and offhand variants can be forced with --tool-token, --tool-variant, --offhand-token, and --offhand-variant.

Expected Outputs

A valid profile save keeps the root manifest and split fragments synchronized, provides playable clip/action rows in the workbench, produces scenario proof for fixture export, and generates PNG sheets or GIFs under target/paperdoll-animation-export when snapshot export is requested.

Common Mistakes

  • Editing a split fragment without keeping the root manifest in sync.
  • Giving a clip mismatched frames and timers.
  • Adding root_motion with a different length than the clip frame list.
  • Using unsupported equipment, category, gameplay mode, facing, or layer tokens.
  • Adding effects or layer overrides without at least one step.

Validation Checklist

Before handing a profile to runtime or review:

  • Save through the workbench so the root manifest and split fragments stay in sync.
  • Confirm every clip has key, name, at least one frame, and matching frames/timers.
  • Confirm root_motion, if present, has one entry per frame.
  • Confirm action categories, equipment tokens, gameplay modes, facing tokens, and layer names use supported values.
  • Keep lockout_ms less than or equal to cooldown_ms when both are set.
  • Give every effect and layer override at least one step.
  • Keep atlas cell sizes positive and effect rotations finite.
  • Use typed cues for new authoring, and make sure cue payloads are not blank.

Recovery Paths

When preview fails, first save through the workbench to rewrite the root and fragments, then fix the first validation error in the clip/action/effect bucket. If review images look wrong, export a single frame with explicit --clip, --facing, --step, and --layer arguments before running --export-all. If a fixture proof no longer matches runtime, regenerate scenario proof from the current profile and update the fixture export.