diff --git a/docs/handpaint-batch6-nanman-shaman-ember-source-v2.png b/docs/handpaint-batch6-nanman-shaman-ember-source-v2.png new file mode 100644 index 0000000..f2eecf7 Binary files /dev/null and b/docs/handpaint-batch6-nanman-shaman-ember-source-v2.png differ diff --git a/docs/handpaint-batch6-nanman-shaman-ember-v2-animation.gif b/docs/handpaint-batch6-nanman-shaman-ember-v2-animation.gif new file mode 100644 index 0000000..357426a Binary files /dev/null and b/docs/handpaint-batch6-nanman-shaman-ember-v2-animation.gif differ diff --git a/docs/handpaint-batch6-nanman-shaman-ember-v2-battle-composite.png b/docs/handpaint-batch6-nanman-shaman-ember-v2-battle-composite.png new file mode 100644 index 0000000..26e2fd2 Binary files /dev/null and b/docs/handpaint-batch6-nanman-shaman-ember-v2-battle-composite.png differ diff --git a/docs/handpaint-batch6-nanman-shaman-ember-v2-before-after.png b/docs/handpaint-batch6-nanman-shaman-ember-v2-before-after.png new file mode 100644 index 0000000..a545600 Binary files /dev/null and b/docs/handpaint-batch6-nanman-shaman-ember-v2-before-after.png differ diff --git a/docs/handpaint-batch6-nanman-shaman-ember-v2-contact.png b/docs/handpaint-batch6-nanman-shaman-ember-v2-contact.png new file mode 100644 index 0000000..b7a450e Binary files /dev/null and b/docs/handpaint-batch6-nanman-shaman-ember-v2-contact.png differ diff --git a/docs/handpaint-batch6-nanman-shaman-ember-v2-debug-preview-battle-check.png b/docs/handpaint-batch6-nanman-shaman-ember-v2-debug-preview-battle-check.png new file mode 100644 index 0000000..4652ed8 Binary files /dev/null and b/docs/handpaint-batch6-nanman-shaman-ember-v2-debug-preview-battle-check.png differ diff --git a/docs/handpaint-batch6-nanman-shaman-ember-v2-report.md b/docs/handpaint-batch6-nanman-shaman-ember-v2-report.md new file mode 100644 index 0000000..2a0338b --- /dev/null +++ b/docs/handpaint-batch6-nanman-shaman-ember-v2-report.md @@ -0,0 +1,24 @@ +# Nanman Ember Shaman Hand-Painted v2 + +- source: `handpaint-batch6-nanman-shaman-ember-source-v2.png` +- base status: ok +- action status: ok +- base partial alpha: 0, opaque pixels: 2187344 +- action partial alpha: 0, opaque pixels: 5528087 +- base frame border hits: 0 +- action frame border hits: 0 +- base empty frames: 0 +- action empty frames: 0 +- base bbox width range: 180..212 +- base bbox height range: 288..290 +- base bottom range: 303..303 +- action bbox width range: 180..242 +- action bbox height range: 264..290 +- action bottom range: 303..303 +- contact: `handpaint-batch6-nanman-shaman-ember-v2-contact.png` +- animation: `handpaint-batch6-nanman-shaman-ember-v2-animation.gif` +- before/after: `handpaint-batch6-nanman-shaman-ember-v2-before-after.png` +- scale compare: `handpaint-batch6-nanman-shaman-ember-v2-scale-compare.png` +- battle composite: `handpaint-batch6-nanman-shaman-ember-v2-battle-composite.png` +- manual checks: run build and local browser verification after generation +- note: battle composite is a scale review image; gameplay roster is unchanged during sample approval diff --git a/docs/handpaint-batch6-nanman-shaman-ember-v2-scale-compare.png b/docs/handpaint-batch6-nanman-shaman-ember-v2-scale-compare.png new file mode 100644 index 0000000..075609b Binary files /dev/null and b/docs/handpaint-batch6-nanman-shaman-ember-v2-scale-compare.png differ diff --git a/docs/unit-sprite-art-quality-gate.md b/docs/unit-sprite-art-quality-gate.md index ac63a2b..bcc40b1 100644 --- a/docs/unit-sprite-art-quality-gate.md +++ b/docs/unit-sprite-art-quality-gate.md @@ -6,9 +6,9 @@ This gate catches obvious sprite-art failures before user approval. It does not - Manifest: `docs/unit-sprite-rework-manifest.json` - Audit: `docs/unit-sprite-rework-audit.json` -- Approved baseline units: 36 +- Approved baseline units: 37 - Pending approval units: 0 -- Queued rework units: 55 +- Queued rework units: 54 ## Checked Rules diff --git a/docs/unit-sprite-current-approval-board.png b/docs/unit-sprite-current-approval-board.png index af1d117..afd0831 100644 Binary files a/docs/unit-sprite-current-approval-board.png and b/docs/unit-sprite-current-approval-board.png differ diff --git a/docs/unit-sprite-nanman-shaman-ember-v2-approval-packet.md b/docs/unit-sprite-nanman-shaman-ember-v2-approval-packet.md new file mode 100644 index 0000000..dba1dc1 --- /dev/null +++ b/docs/unit-sprite-nanman-shaman-ember-v2-approval-packet.md @@ -0,0 +1,36 @@ +# Unit Sprite Approval Packet: unit-nanman-shaman-ember v2 + +- Status: approved during continuous production run +- Source art: `docs/handpaint-batch6-nanman-shaman-ember-source-v2.png` +- Contact sheet: `docs/handpaint-batch6-nanman-shaman-ember-v2-contact.png` +- Animation GIF: `docs/handpaint-batch6-nanman-shaman-ember-v2-animation.gif` +- Before/after: `docs/handpaint-batch6-nanman-shaman-ember-v2-before-after.png` +- Scale compare: `docs/handpaint-batch6-nanman-shaman-ember-v2-scale-compare.png` +- Browser check: `docs/handpaint-batch6-nanman-shaman-ember-v2-debug-preview-battle-check.png` +- Current approval board: `docs/unit-sprite-current-approval-board.png` +- Debug preview URL: `http://127.0.0.1:4173/heros_web/?debug&debugSpritePreview=unit-nanman-shaman-ember&v=nanman-shaman-ember-v2-console-clean` + +## Visual Decision + +Nanman ember shaman v2 is accepted as a fire-tactic variant of the Nanman shaman. v1 was visually strong but narrowly missed the action-width gate; v2 keeps the red/orange robe mass, ember staff, and fire talisman poses while improving battle-scale width. + +## Technical Checks + +- Base partial alpha: `0` +- Action partial alpha: `0` +- Base frame border hits: `0` +- Action frame border hits: `0` +- Base empty frames: `0` +- Action empty frames: `0` +- Base bbox width range: `180..212` +- Base bbox height range: `288..290` +- Base bottom range: `303..303` +- Action bbox width range: `180..242` +- Action bbox height range: `264..290` +- Action bottom range: `303..303` +- Local build: `passed` +- Local browser console errors: `0` + +## Notes + +The fire effects are contained inside the frame and remain readable at desktop battle scale. The sprite stays fully opaque and does not rely on external bases, rings, or badges. diff --git a/docs/unit-sprite-next-steps.md b/docs/unit-sprite-next-steps.md index 86a57a6..7242ce4 100644 --- a/docs/unit-sprite-next-steps.md +++ b/docs/unit-sprite-next-steps.md @@ -4,9 +4,9 @@ This file is generated by `scripts/write-unit-sprite-next-steps.py`. ## Current Gate -- Approved baseline units: 36 +- Approved baseline units: 37 - Pending approval units: 0 -- Queued rework units: 55 +- Queued rework units: 54 - Manifest: `docs/unit-sprite-rework-manifest.json` - Audit: `docs/unit-sprite-rework-audit.json` - Current approval board: not generated until the next pending sample. @@ -14,8 +14,7 @@ This file is generated by `scripts/write-unit-sprite-next-steps.py`. ## Next Unit Queue -1. `unit-nanman-shaman-ember` - queued-rework, base `border-hits=32`, actions `border-hits=98` -2. `unit-nanman-shaman-storm` - queued-rework, base `border-hits=32`, actions `border-hits=98` +1. `unit-nanman-shaman-storm` - queued-rework, base `border-hits=32`, actions `border-hits=98` ## Commands Before Approval @@ -42,5 +41,5 @@ pnpm build ## First Task After Current Approval -- Start with `unit-nanman-shaman-ember`. +- Start with `unit-nanman-shaman-storm`. - Generate source art, assemble sheets, produce contact/GIF/before-after/scale/battle screenshots, then rerun the gates. diff --git a/docs/unit-sprite-review-approved-and-pending.png b/docs/unit-sprite-review-approved-and-pending.png index e8112ab..eca44ad 100644 Binary files a/docs/unit-sprite-review-approved-and-pending.png and b/docs/unit-sprite-review-approved-and-pending.png differ diff --git a/docs/unit-sprite-review-batch6-nanman-special.png b/docs/unit-sprite-review-batch6-nanman-special.png index da90579..ad45c49 100644 Binary files a/docs/unit-sprite-review-batch6-nanman-special.png and b/docs/unit-sprite-review-batch6-nanman-special.png differ diff --git a/docs/unit-sprite-review-index.png b/docs/unit-sprite-review-index.png index 3e32b0e..31cc6a1 100644 Binary files a/docs/unit-sprite-review-index.png and b/docs/unit-sprite-review-index.png differ diff --git a/docs/unit-sprite-rework-audit.json b/docs/unit-sprite-rework-audit.json index 503d92e..37bcb75 100644 --- a/docs/unit-sprite-rework-audit.json +++ b/docs/unit-sprite-rework-audit.json @@ -11,8 +11,8 @@ "batch7-unique-officer": 19 }, "stage_counts": { - "approved-baseline": 36, - "queued-rework": 55 + "approved-baseline": 37, + "queued-rework": 54 }, "rows": [ { @@ -1271,7 +1271,7 @@ }, { "batch": "batch6-nanman-special", - "review_stage": "queued-rework", + "review_stage": "approved-baseline", "stem": "unit-nanman-shaman-ember", "base": { "key": "unit-nanman-shaman-ember", @@ -1281,23 +1281,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 1999925, - "border_hits": 32, - "min_width": 243, - "max_width": 246, - "min_height": 280, - "max_height": 281, - "min_bottom": 281, - "max_bottom": 287, + "opaque_pixels": 2187344, + "border_hits": 0, + "min_width": 180, + "max_width": 212, + "min_height": 288, + "max_height": 290, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 3, - "height_swing": 1, - "bottom_swing": 6, - "battle_min_width_px": 38.8, - "battle_max_width_px": 39.3, - "battle_min_height_px": 44.7, - "battle_max_height_px": 44.9, - "status": "border-hits=32" + "width_swing": 32, + "height_swing": 2, + "bottom_swing": 0, + "battle_min_width_px": 28.8, + "battle_max_width_px": 33.9, + "battle_min_height_px": 46.0, + "battle_max_height_px": 46.3, + "status": "ok" }, "actions": { "key": "unit-nanman-shaman-ember-actions", @@ -1307,23 +1307,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 4453376, - "border_hits": 98, - "min_width": 220, - "max_width": 255, - "min_height": 275, - "max_height": 281, - "min_bottom": 274, - "max_bottom": 289, + "opaque_pixels": 5528087, + "border_hits": 0, + "min_width": 180, + "max_width": 242, + "min_height": 264, + "max_height": 290, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 35, - "height_swing": 6, - "bottom_swing": 15, - "battle_min_width_px": 35.1, - "battle_max_width_px": 40.7, - "battle_min_height_px": 43.9, - "battle_max_height_px": 44.9, - "status": "border-hits=98" + "width_swing": 62, + "height_swing": 26, + "bottom_swing": 0, + "battle_min_width_px": 28.8, + "battle_max_width_px": 38.7, + "battle_min_height_px": 42.2, + "battle_max_height_px": 46.3, + "status": "ok" } }, { diff --git a/docs/unit-sprite-rework-audit.md b/docs/unit-sprite-rework-audit.md index 3e3e56e..0fdd17c 100644 --- a/docs/unit-sprite-rework-audit.md +++ b/docs/unit-sprite-rework-audit.md @@ -29,8 +29,8 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards. ## Review Stage Counts -- approved-baseline: 36 -- queued-rework: 55 +- approved-baseline: 37 +- queued-rework: 54 ## Batch Plan @@ -74,7 +74,7 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards. | batch6-nanman-special | approved-baseline | `unit-nanman-officer-bronze` | ok | ok | 177..214 x 284..288 | 155..264 x 238..295 | 28.3..34.2 x 45.4..46.0 | w37 h4 b0 | | batch6-nanman-special | approved-baseline | `unit-nanman-officer-warlord` | ok | ok | 204..234 x 284..288 | 173..259 x 256..295 | 32.6..37.4 x 45.4..46.0 | w30 h4 b0 | | batch6-nanman-special | approved-baseline | `unit-nanman-shaman` | ok | ok | 190..214 x 288..288 | 197..263 x 277..290 | 30.4..34.2 x 46.0..46.0 | w24 h0 b0 | -| batch6-nanman-special | queued-rework | `unit-nanman-shaman-ember` | border-hits=32 | border-hits=98 | 243..246 x 280..281 | 220..255 x 275..281 | 38.8..39.3 x 44.7..44.9 | w3 h1 b6 | +| batch6-nanman-special | approved-baseline | `unit-nanman-shaman-ember` | ok | ok | 180..212 x 288..290 | 180..242 x 264..290 | 28.8..33.9 x 46.0..46.3 | w32 h2 b0 | | batch6-nanman-special | queued-rework | `unit-nanman-shaman-storm` | border-hits=32 | border-hits=98 | 243..246 x 280..281 | 220..255 x 275..281 | 38.8..39.3 x 44.7..44.9 | w3 h1 b6 | | batch7-unique-officer | queued-rework | `unit-pang-tong` | border-hits=32 | border-hits=98 | 243..246 x 280..281 | 220..255 x 275..281 | 38.8..39.3 x 44.7..44.9 | w3 h1 b6 | | batch1-approved-rebel | approved-baseline | `unit-rebel` | ok | ok | 195..284 x 271..281 | 180..286 x 178..289 | 31.2..45.4 x 43.3..44.9 | w89 h10 b8 | diff --git a/docs/unit-sprite-rework-manifest.json b/docs/unit-sprite-rework-manifest.json index 1b6bbf8..ffe471e 100644 --- a/docs/unit-sprite-rework-manifest.json +++ b/docs/unit-sprite-rework-manifest.json @@ -21,6 +21,7 @@ "unit-nanman-officer-bronze", "unit-nanman-officer-warlord", "unit-nanman-shaman", + "unit-nanman-shaman-ember", "unit-rebel", "unit-rebel-archer", "unit-rebel-archer-fire", @@ -51,7 +52,6 @@ "pendingApproval": [], "currentApprovalCandidate": {}, "nextAfterApproval": [ - "unit-nanman-shaman-ember", "unit-nanman-shaman-storm" ], "reviewStages": { diff --git a/src/assets/images/units/unit-nanman-shaman-ember-actions.png b/src/assets/images/units/unit-nanman-shaman-ember-actions.png index c04d232..c340c78 100644 Binary files a/src/assets/images/units/unit-nanman-shaman-ember-actions.png and b/src/assets/images/units/unit-nanman-shaman-ember-actions.png differ diff --git a/src/assets/images/units/unit-nanman-shaman-ember.png b/src/assets/images/units/unit-nanman-shaman-ember.png index 23a4e63..9f1f147 100644 Binary files a/src/assets/images/units/unit-nanman-shaman-ember.png and b/src/assets/images/units/unit-nanman-shaman-ember.png differ