diff --git a/docs/handpaint-batch4-wu-strategist-fire-source-v1.png b/docs/handpaint-batch4-wu-strategist-fire-source-v1.png new file mode 100644 index 0000000..f434002 Binary files /dev/null and b/docs/handpaint-batch4-wu-strategist-fire-source-v1.png differ diff --git a/docs/handpaint-batch4-wu-strategist-fire-v2-animation.gif b/docs/handpaint-batch4-wu-strategist-fire-v2-animation.gif new file mode 100644 index 0000000..a309ffa Binary files /dev/null and b/docs/handpaint-batch4-wu-strategist-fire-v2-animation.gif differ diff --git a/docs/handpaint-batch4-wu-strategist-fire-v2-battle-composite.png b/docs/handpaint-batch4-wu-strategist-fire-v2-battle-composite.png new file mode 100644 index 0000000..4ed648d Binary files /dev/null and b/docs/handpaint-batch4-wu-strategist-fire-v2-battle-composite.png differ diff --git a/docs/handpaint-batch4-wu-strategist-fire-v2-before-after.png b/docs/handpaint-batch4-wu-strategist-fire-v2-before-after.png new file mode 100644 index 0000000..f200299 Binary files /dev/null and b/docs/handpaint-batch4-wu-strategist-fire-v2-before-after.png differ diff --git a/docs/handpaint-batch4-wu-strategist-fire-v2-contact.png b/docs/handpaint-batch4-wu-strategist-fire-v2-contact.png new file mode 100644 index 0000000..390e4ba Binary files /dev/null and b/docs/handpaint-batch4-wu-strategist-fire-v2-contact.png differ diff --git a/docs/handpaint-batch4-wu-strategist-fire-v2-debug-preview-battle-check.png b/docs/handpaint-batch4-wu-strategist-fire-v2-debug-preview-battle-check.png new file mode 100644 index 0000000..2cf775f Binary files /dev/null and b/docs/handpaint-batch4-wu-strategist-fire-v2-debug-preview-battle-check.png differ diff --git a/docs/handpaint-batch4-wu-strategist-fire-v2-report.md b/docs/handpaint-batch4-wu-strategist-fire-v2-report.md new file mode 100644 index 0000000..8e35be1 --- /dev/null +++ b/docs/handpaint-batch4-wu-strategist-fire-v2-report.md @@ -0,0 +1,24 @@ +# Wu Fire Strategist Hand-Painted v2 + +- source: `handpaint-batch4-wu-strategist-fire-source-v1.png` +- base status: ok +- action status: ok +- base partial alpha: 0, opaque pixels: 2175298 +- action partial alpha: 0, opaque pixels: 5096970 +- base frame border hits: 0 +- action frame border hits: 0 +- base empty frames: 0 +- action empty frames: 0 +- base bbox width range: 170..207 +- base bbox height range: 286..290 +- base bottom range: 303..303 +- action bbox width range: 163..248 +- action bbox height range: 286..295 +- action bottom range: 303..303 +- contact: `handpaint-batch4-wu-strategist-fire-v2-contact.png` +- animation: `handpaint-batch4-wu-strategist-fire-v2-animation.gif` +- before/after: `handpaint-batch4-wu-strategist-fire-v2-before-after.png` +- scale compare: `handpaint-batch4-wu-strategist-fire-v2-scale-compare.png` +- battle composite: `handpaint-batch4-wu-strategist-fire-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-batch4-wu-strategist-fire-v2-scale-compare.png b/docs/handpaint-batch4-wu-strategist-fire-v2-scale-compare.png new file mode 100644 index 0000000..3692935 Binary files /dev/null and b/docs/handpaint-batch4-wu-strategist-fire-v2-scale-compare.png differ diff --git a/docs/unit-sprite-art-quality-gate.md b/docs/unit-sprite-art-quality-gate.md index eb60965..64a327b 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: 69 +- Approved baseline units: 70 - Pending approval units: 0 -- Queued rework units: 22 +- Queued rework units: 21 ## Checked Rules diff --git a/docs/unit-sprite-batch-queue.json b/docs/unit-sprite-batch-queue.json index d0306f3..9af51ed 100644 --- a/docs/unit-sprite-batch-queue.json +++ b/docs/unit-sprite-batch-queue.json @@ -71,13 +71,14 @@ "unit-wu-officer-harbor", "unit-wu-officer-river", "unit-wu-strategist", + "unit-wu-strategist-fire", "unit-zhang-fei" ], "pendingApproval": [], "nextAfterApproval": [], "stageCounts": { - "approved-baseline": 69, - "queued-rework": 22 + "approved-baseline": 70, + "queued-rework": 21 }, "batches": [ { @@ -685,24 +686,10 @@ "label": "Batch 4 Wu generic units", "total": 16, "stageCounts": { - "approved-baseline": 13, - "queued-rework": 3 + "approved-baseline": 14, + "queued-rework": 2 }, "units": [ - { - "stem": "unit-wu-strategist-fire", - "reviewStage": "queued-rework", - "queueRole": "queued rework", - "baseStatus": "border-hits=32", - "actionStatus": "border-hits=98", - "battleBasePx": [ - 38.8, - 39.3, - 44.7, - 44.9 - ], - "spec": null - }, { "stem": "unit-wu-strategist-river", "reviewStage": "queued-rework", @@ -912,6 +899,20 @@ 46.3 ], "spec": null + }, + { + "stem": "unit-wu-strategist-fire", + "reviewStage": "approved-baseline", + "queueRole": "approved reference", + "baseStatus": "ok", + "actionStatus": "ok", + "battleBasePx": [ + 27.2, + 33.1, + 45.7, + 46.3 + ], + "spec": null } ] }, diff --git a/docs/unit-sprite-batch-queue.md b/docs/unit-sprite-batch-queue.md index 9c833aa..1cb0ca4 100644 --- a/docs/unit-sprite-batch-queue.md +++ b/docs/unit-sprite-batch-queue.md @@ -6,9 +6,9 @@ Use this as the long-running queue for the full hand-painted sprite rework. It i ## Current State -- Approved baseline units: 69 +- Approved baseline units: 70 - Pending approval units: 0 -- Queued rework units: 22 +- Queued rework units: 21 - Manifest: `docs/unit-sprite-rework-manifest.json` - Audit: `docs/unit-sprite-rework-audit.json` @@ -98,11 +98,10 @@ No next unit is currently defined. - Batch key: `batch4-wu` - Total units: 16 -- Stage counts: approved-baseline 13, queued-rework 3 +- Stage counts: approved-baseline 14, queued-rework 2 | unit | role | stage | status | battle base px | spec | | --- | --- | --- | --- | --- | --- | -| `unit-wu-strategist-fire` | queued rework | queued-rework | base border-hits=32; actions border-hits=98 | 38.8..39.3 x 44.7..44.9 | | | `unit-wu-strategist-river` | queued rework | queued-rework | base border-hits=32; actions border-hits=98 | 38.8..39.3 x 44.7..44.9 | | | `unit-wu-yi` | queued rework | queued-rework | base border-hits=32; actions border-hits=82 | 31.9..40.6 x 44.6..44.6 | | | `unit-wu-archer` | approved reference | approved-baseline | technical ok | 28.3..34.3 x 46.0..46.0 | | @@ -118,6 +117,7 @@ No next unit is currently defined. | `unit-wu-officer-harbor` | approved reference | approved-baseline | technical ok | 25.2..42.5 x 45.4..46.0 | | | `unit-wu-officer-river` | approved reference | approved-baseline | technical ok | 26.2..42.5 x 43.6..45.7 | | | `unit-wu-strategist` | approved reference | approved-baseline | technical ok | 25.7..40.7 x 46.0..46.3 | | +| `unit-wu-strategist-fire` | approved reference | approved-baseline | technical ok | 27.2..33.1 x 45.7..46.3 | | ### Batch 5 remaining rebel/bandit units diff --git a/docs/unit-sprite-current-approval-board.png b/docs/unit-sprite-current-approval-board.png index 2e65b98..8bac10c 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-next-steps.md b/docs/unit-sprite-next-steps.md index 4f7f7b0..228e0c8 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: 69 +- Approved baseline units: 70 - Pending approval units: 0 -- Queued rework units: 22 +- Queued rework units: 21 - Manifest: `docs/unit-sprite-rework-manifest.json` - Audit: `docs/unit-sprite-rework-audit.json` - Current approval board: not generated until the next pending sample. diff --git a/docs/unit-sprite-review-approved-and-pending.png b/docs/unit-sprite-review-approved-and-pending.png index 826832a..2c0162e 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-batch4-wu.png b/docs/unit-sprite-review-batch4-wu.png index f9273ae..d5dabe6 100644 Binary files a/docs/unit-sprite-review-batch4-wu.png and b/docs/unit-sprite-review-batch4-wu.png differ diff --git a/docs/unit-sprite-review-index.png b/docs/unit-sprite-review-index.png index deca7d2..e68b346 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 0a9fadd..7808151 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": 69, - "queued-rework": 22 + "approved-baseline": 70, + "queued-rework": 21 }, "rows": [ { @@ -4748,7 +4748,7 @@ }, { "batch": "batch4-wu", - "review_stage": "queued-rework", + "review_stage": "approved-baseline", "stem": "unit-wu-strategist-fire", "base": { "key": "unit-wu-strategist-fire", @@ -4758,23 +4758,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": 2175298, + "border_hits": 0, + "min_width": 170, + "max_width": 207, + "min_height": 286, + "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": 37, + "height_swing": 4, + "bottom_swing": 0, + "battle_min_width_px": 27.2, + "battle_max_width_px": 33.1, + "battle_min_height_px": 45.7, + "battle_max_height_px": 46.3, + "status": "ok" }, "actions": { "key": "unit-wu-strategist-fire-actions", @@ -4784,23 +4784,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": 5096970, + "border_hits": 0, + "min_width": 163, + "max_width": 248, + "min_height": 286, + "max_height": 295, + "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": 85, + "height_swing": 9, + "bottom_swing": 0, + "battle_min_width_px": 26.0, + "battle_max_width_px": 39.6, + "battle_min_height_px": 45.7, + "battle_max_height_px": 47.1, + "status": "ok" } }, { diff --git a/docs/unit-sprite-rework-audit.md b/docs/unit-sprite-rework-audit.md index c985e3e..6faeebf 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: 69 -- queued-rework: 22 +- approved-baseline: 70 +- queued-rework: 21 ## Batch Plan @@ -135,7 +135,7 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards. | batch4-wu | approved-baseline | `unit-wu-officer-harbor` | ok | ok | 158..266 x 284..288 | 153..291 x 273..294 | 25.2..42.5 x 45.4..46.0 | w108 h4 b0 | | batch4-wu | approved-baseline | `unit-wu-officer-river` | ok | ok | 164..266 x 273..286 | 161..286 x 272..293 | 26.2..42.5 x 43.6..45.7 | w102 h13 b0 | | batch4-wu | approved-baseline | `unit-wu-strategist` | ok | ok | 161..255 x 288..290 | 161..265 x 288..290 | 25.7..40.7 x 46.0..46.3 | w94 h2 b0 | -| batch4-wu | queued-rework | `unit-wu-strategist-fire` | 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 | +| batch4-wu | approved-baseline | `unit-wu-strategist-fire` | ok | ok | 170..207 x 286..290 | 163..248 x 286..295 | 27.2..33.1 x 45.7..46.3 | w37 h4 b0 | | batch4-wu | queued-rework | `unit-wu-strategist-river` | 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 | | batch4-wu | queued-rework | `unit-wu-yi` | border-hits=32 | border-hits=82 | 200..254 x 279..279 | 200..263 x 275..279 | 31.9..40.6 x 44.6..44.6 | w54 h0 b6 | | batch7-unique-officer | queued-rework | `unit-yan-yan` | border-hits=32 | border-hits=82 | 194..254 x 279..279 | 194..263 x 275..279 | 31.0..40.6 x 44.6..44.6 | w60 h0 b6 | diff --git a/docs/unit-sprite-rework-manifest.json b/docs/unit-sprite-rework-manifest.json index 54da66e..0429bb4 100644 --- a/docs/unit-sprite-rework-manifest.json +++ b/docs/unit-sprite-rework-manifest.json @@ -79,6 +79,7 @@ "unit-wu-officer-harbor", "unit-wu-officer-river", "unit-wu-strategist", + "unit-wu-strategist-fire", "unit-zhang-fei" ], "pendingApproval": [], diff --git a/docs/unit-sprite-wu-strategist-fire-v2-approval-packet.md b/docs/unit-sprite-wu-strategist-fire-v2-approval-packet.md new file mode 100644 index 0000000..d5ad541 --- /dev/null +++ b/docs/unit-sprite-wu-strategist-fire-v2-approval-packet.md @@ -0,0 +1,36 @@ +# Wu Fire Strategist v2 Approval Packet + +- status: approved during continuous production run +- unit: `unit-wu-strategist-fire` +- source art: `handpaint-batch4-wu-strategist-fire-source-v1.png` +- contact sheet: `handpaint-batch4-wu-strategist-fire-v2-contact.png` +- animation GIF: `handpaint-batch4-wu-strategist-fire-v2-animation.gif` +- before/after: `handpaint-batch4-wu-strategist-fire-v2-before-after.png` +- scale compare: `handpaint-batch4-wu-strategist-fire-v2-scale-compare.png` +- battle composite: `handpaint-batch4-wu-strategist-fire-v2-battle-composite.png` +- browser check: `handpaint-batch4-wu-strategist-fire-v2-debug-preview-battle-check.png` +- current board: `unit-sprite-current-approval-board.png` +- debug URL: `http://127.0.0.1:4173/heros_web/?debug&debugSpritePreview=unit-wu-strategist-fire&v=wu-strategist-fire-v2` + +## Visual Decision + +Approved for the continuous batch run. v2 reads as a Wu strategist first through the fan, scroll, robe silhouette, and scholar headpiece, while the crimson inner robe and flame embroidery distinguish it as a fire-tactic variant. The fire theme stays on the unit art rather than relying on detached effects. + +## Technical Checks + +- base status: ok +- action status: ok +- 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 +- battle scale from sample gate: 27.2..33.1 x 45.7..46.3 +- local build: passed +- Local browser console errors: `0` +- Local browser 404s: `0` + +## Notes + +v1 was visually sound but too narrow at 50px for the stricter art gate. v2 widens the robe silhouette while keeping all frames inside the 313px boundary and preserving fully opaque unit pixels. diff --git a/src/assets/images/units/unit-wu-strategist-fire-actions.png b/src/assets/images/units/unit-wu-strategist-fire-actions.png index 647ad57..17bc79d 100644 Binary files a/src/assets/images/units/unit-wu-strategist-fire-actions.png and b/src/assets/images/units/unit-wu-strategist-fire-actions.png differ diff --git a/src/assets/images/units/unit-wu-strategist-fire.png b/src/assets/images/units/unit-wu-strategist-fire.png index 4bddcb1..5cea301 100644 Binary files a/src/assets/images/units/unit-wu-strategist-fire.png and b/src/assets/images/units/unit-wu-strategist-fire.png differ