76 lines
3.7 KiB
Markdown
76 lines
3.7 KiB
Markdown
# Phase 9.0R2 Character Animation Runtime Contract
|
|
|
|
## Definition
|
|
|
|
Character animation means the visible character image progresses through
|
|
authored frames whose body or limb poses differ. Position translation, bobbing,
|
|
rotation, scaling, opacity, particles and camera motion may support a frame
|
|
sequence but cannot replace it.
|
|
|
|
## Runtime States
|
|
|
|
| Tutorial phase | Hearthguard | Wayrunner | Farstring | Kindhand | Riftblade | Commit |
|
|
|---|---|---|---|---|---|---|
|
|
| Advance | `advance`, loop | `advance`, loop | `advance`, loop | `advance`, loop | `advance`, loop | none |
|
|
| Threat | `idle`, loop | `idle`, loop | `idle`, loop | `idle`, loop | `telegraph`, once/hold | none |
|
|
| Enemy attack | `guard`, once/hold | `evade_counter`, once/hold | `idle`, loop | `idle`, loop | `attack`, once/hold | front HP at Riftblade impact frame |
|
|
| Rear action | `idle`, loop | `idle`, loop | `draw_release`, once/hold | `lantern_heal`, once/hold | `hit` for Farstring, otherwise `idle` | enemy HP or front heal at rear impact frame |
|
|
| Final action | `basic_attack`, once/hold | `evade_counter`, once/hold | `draw_release`, once/hold | `lantern_heal`, once/hold | `hit`, once/hold | enemy HP at final impact frame |
|
|
| Defeat | `idle`, loop | `idle`, loop | `idle`, loop | `idle`, loop | `death`, once/hold | enemy HP reaches zero once |
|
|
| Victory | `victory`, once/hold | `idle`, loop | `idle`, loop | `idle`, loop | final death frame | one victory transition |
|
|
|
|
For non-Hearthguard Recruits, the first accepted generated action row may also
|
|
supply a restrained two-or-more-frame ready/idle sequence when no separate
|
|
idle row exists. Reusing different action poses as an erratic loop is not
|
|
allowed.
|
|
|
|
## Timing
|
|
|
|
- Each animation state declares frames, FPS, loop/non-loop and impact frame.
|
|
- Looping states wrap. Non-looping states clamp to the final frame.
|
|
- The runtime records a per-phase impact-committed flag. Crossing the impact
|
|
frame commits the value once even when one rendered delta skips multiple
|
|
frames.
|
|
- Phase duration must allow the primary non-looping action to reach its final
|
|
frame and remain readable before the next phase.
|
|
- Pausing for Restart confirmation freezes frame time and event commits.
|
|
|
|
## Reduced Motion
|
|
|
|
Reduced motion removes the advance translation and nonessential looping idle
|
|
cycles. It does not replace action states with the old static anchors. Required
|
|
actions step through their authored anticipation, impact and terminal frames at
|
|
a lower bounded FPS so their meaning remains visible.
|
|
|
|
## Art And Provenance
|
|
|
|
- Hearthguard and Riftblade runtime frames are byte-identical copies of the
|
|
accepted Phase 6 frame authority named in the asset manifest.
|
|
- Wayrunner, Farstring and Kindhand generation uses their Phase 7 canonical
|
|
anchors as image references and the `sprite-gen` component-row contract.
|
|
- The generated strips use a flat chroma background, are deterministically
|
|
extracted to transparent PNG frames, and retain request, prompt, provider
|
|
report, source image, curation and hashes.
|
|
- Runtime actor frames keep identity, handedness, equipment, facing, baseline
|
|
and play-size silhouette stable. VFX remain separate layers.
|
|
|
|
## Runtime Evidence
|
|
|
|
The fixed recording must include:
|
|
|
|
1. authored advance cycles and collision stop;
|
|
2. Riftblade telegraph and attack;
|
|
3. one visible front guard or evade/counter response;
|
|
4. one visible Farstring draw/release or Kindhand lantern/heal action;
|
|
5. final attack, enemy recoil and non-looping death;
|
|
6. victory without a reset seam.
|
|
|
|
Static captures support layout only. The animation claim requires a continuous
|
|
normal-render recording and sampled-frame proof that actor textures changed.
|
|
|
|
## Evidence Markers
|
|
|
|
- `ABG_P9_0R2_ANIMATION_ASSETS_OK`
|
|
- `ABG_P9_0R2_CHARACTER_ANIMATION_OK`
|
|
- `ABG_P9_0R2_DYNAMIC_SLICE_OK`
|