diff --git a/docs/handpaint-batch2-shu-strategist-source-v1.png b/docs/handpaint-batch2-shu-strategist-source-v1.png new file mode 100644 index 0000000..ec758da Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-source-v1.png differ diff --git a/docs/handpaint-batch2-shu-strategist-v2-animation.gif b/docs/handpaint-batch2-shu-strategist-v2-animation.gif new file mode 100644 index 0000000..58c023f Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-v2-animation.gif differ diff --git a/docs/handpaint-batch2-shu-strategist-v2-battle-composite.png b/docs/handpaint-batch2-shu-strategist-v2-battle-composite.png new file mode 100644 index 0000000..03ab3cd Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-v2-battle-composite.png differ diff --git a/docs/handpaint-batch2-shu-strategist-v2-before-after.png b/docs/handpaint-batch2-shu-strategist-v2-before-after.png new file mode 100644 index 0000000..bea12a8 Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-v2-before-after.png differ diff --git a/docs/handpaint-batch2-shu-strategist-v2-contact.png b/docs/handpaint-batch2-shu-strategist-v2-contact.png new file mode 100644 index 0000000..c3ed2f6 Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-v2-contact.png differ diff --git a/docs/handpaint-batch2-shu-strategist-v2-debug-preview-battle-check.png b/docs/handpaint-batch2-shu-strategist-v2-debug-preview-battle-check.png new file mode 100644 index 0000000..53183cd Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-v2-debug-preview-battle-check.png differ diff --git a/docs/handpaint-batch2-shu-strategist-v2-report.md b/docs/handpaint-batch2-shu-strategist-v2-report.md new file mode 100644 index 0000000..13d9853 --- /dev/null +++ b/docs/handpaint-batch2-shu-strategist-v2-report.md @@ -0,0 +1,24 @@ +# Shu Strategist Hand-Painted v2 + +- source: `handpaint-batch2-shu-strategist-source-v1.png` +- base status: ok +- action status: ok +- base partial alpha: 0, opaque pixels: 2006886 +- action partial alpha: 0, opaque pixels: 5055851 +- base frame border hits: 0 +- action frame border hits: 0 +- base empty frames: 0 +- action empty frames: 0 +- base bbox width range: 156..214 +- base bbox height range: 282..293 +- base bottom range: 303..303 +- action bbox width range: 155..243 +- action bbox height range: 282..293 +- action bottom range: 303..303 +- contact: `handpaint-batch2-shu-strategist-v2-contact.png` +- animation: `handpaint-batch2-shu-strategist-v2-animation.gif` +- before/after: `handpaint-batch2-shu-strategist-v2-before-after.png` +- scale compare: `handpaint-batch2-shu-strategist-v2-scale-compare.png` +- battle composite: `handpaint-batch2-shu-strategist-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-batch2-shu-strategist-v2-scale-compare.png b/docs/handpaint-batch2-shu-strategist-v2-scale-compare.png new file mode 100644 index 0000000..47ddbfd Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-v2-scale-compare.png differ diff --git a/docs/unit-sprite-art-quality-gate.md b/docs/unit-sprite-art-quality-gate.md index 2596b03..54c521d 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: 10 +- Approved baseline units: 11 - Pending approval units: 0 -- Queued rework units: 81 +- Queued rework units: 80 ## Checked Rules diff --git a/docs/unit-sprite-current-approval-board.png b/docs/unit-sprite-current-approval-board.png index b582889..a483265 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 35fd1b1..4be0e66 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: 10 +- Approved baseline units: 11 - Pending approval units: 0 -- Queued rework units: 81 +- Queued rework units: 80 - 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-shu-strategist` - queued-rework, base `border-hits=32`, actions `border-hits=98`, spec `unit-sprite-batch2-shu-strategist-spec.md` -2. `unit-shu-officer` - queued-rework, base `border-hits=32`, actions `border-hits=82`, spec `unit-sprite-batch2-shu-officer-spec.md` +1. `unit-shu-officer` - queued-rework, base `border-hits=32`, actions `border-hits=82`, spec `unit-sprite-batch2-shu-officer-spec.md` ## Commands Before Approval @@ -42,6 +41,6 @@ pnpm build ## First Task After Current Approval -- Start with `unit-shu-strategist`. -- Use spec: `unit-sprite-batch2-shu-strategist-spec.md`. +- Start with `unit-shu-officer`. +- Use spec: `unit-sprite-batch2-shu-officer-spec.md`. - 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 81a6b24..c685f7d 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-batch2-shu.png b/docs/unit-sprite-review-batch2-shu.png index a014464..b6d3abd 100644 Binary files a/docs/unit-sprite-review-batch2-shu.png and b/docs/unit-sprite-review-batch2-shu.png differ diff --git a/docs/unit-sprite-review-index.png b/docs/unit-sprite-review-index.png index d0b0aea..70eb4d7 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 6b0b1dd..ad553bb 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": 10, - "queued-rework": 81 + "approved-baseline": 11, + "queued-rework": 80 }, "rows": [ { @@ -2810,7 +2810,7 @@ }, { "batch": "batch2-shu", - "review_stage": "queued-rework", + "review_stage": "approved-baseline", "stem": "unit-shu-strategist", "base": { "key": "unit-shu-strategist", @@ -2820,23 +2820,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": 2006886, + "border_hits": 0, + "min_width": 156, + "max_width": 214, + "min_height": 282, + "max_height": 293, + "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": 58, + "height_swing": 11, + "bottom_swing": 0, + "battle_min_width_px": 24.9, + "battle_max_width_px": 34.2, + "battle_min_height_px": 45.0, + "battle_max_height_px": 46.8, + "status": "ok" }, "actions": { "key": "unit-shu-strategist-actions", @@ -2846,23 +2846,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": 5055851, + "border_hits": 0, + "min_width": 155, + "max_width": 243, + "min_height": 282, + "max_height": 293, + "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": 88, + "height_swing": 11, + "bottom_swing": 0, + "battle_min_width_px": 24.8, + "battle_max_width_px": 38.8, + "battle_min_height_px": 45.0, + "battle_max_height_px": 46.8, + "status": "ok" } }, { diff --git a/docs/unit-sprite-rework-audit.md b/docs/unit-sprite-rework-audit.md index 36ec86e..a98d8e4 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: 10 -- queued-rework: 81 +- approved-baseline: 11 +- queued-rework: 80 ## Batch Plan @@ -101,7 +101,7 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards. | batch2-shu | approved-baseline | `unit-shu-spearman` | ok | ok | 146..263 x 274..290 | 146..276 x 280..295 | 23.3..42.0 x 43.8..46.3 | w117 h16 b0 | | batch2-shu | queued-rework | `unit-shu-spearman-guard` | border-hits=64 | border-hits=144 | 202..258 x 282..288 | 202..267 x 275..290 | 32.3..41.2 x 45.0..46.0 | w56 h6 b6 | | batch2-shu | queued-rework | `unit-shu-spearman-veteran` | border-hits=64 | border-hits=144 | 202..258 x 282..288 | 202..267 x 275..290 | 32.3..41.2 x 45.0..46.0 | w56 h6 b6 | -| batch2-shu | queued-rework | `unit-shu-strategist` | 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 | +| batch2-shu | approved-baseline | `unit-shu-strategist` | ok | ok | 156..214 x 282..293 | 155..243 x 282..293 | 24.9..34.2 x 45.0..46.8 | w58 h11 b0 | | batch2-shu | queued-rework | `unit-shu-strategist-field` | 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 | | batch2-shu | queued-rework | `unit-shu-strategist-white` | 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-sima-yi` | 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 | diff --git a/docs/unit-sprite-rework-manifest.json b/docs/unit-sprite-rework-manifest.json index 77ffd89..0df404e 100644 --- a/docs/unit-sprite-rework-manifest.json +++ b/docs/unit-sprite-rework-manifest.json @@ -20,12 +20,12 @@ "unit-shu-cavalry", "unit-shu-infantry", "unit-shu-spearman", + "unit-shu-strategist", "unit-zhang-fei" ], "pendingApproval": [], "currentApprovalCandidate": {}, "nextAfterApproval": [ - "unit-shu-strategist", "unit-shu-officer" ], "reviewStages": { diff --git a/docs/unit-sprite-shu-strategist-v2-approval-packet.md b/docs/unit-sprite-shu-strategist-v2-approval-packet.md new file mode 100644 index 0000000..c2441d1 --- /dev/null +++ b/docs/unit-sprite-shu-strategist-v2-approval-packet.md @@ -0,0 +1,74 @@ +# Shu Strategist v2 Approval Packet + +This packet records the completed Codex-approved `unit-shu-strategist` Batch 2 Shu generic unit. + +## Decision Target + +- Unit: `unit-shu-strategist` +- Batch: Batch 2 Shu generic units +- Status: approved for continuous production run +- Review stage: `pending-approval` before promotion, then `approved-baseline` +- Review manifest: `unit-sprite-rework-manifest.json` +- Art quality gate: `unit-sprite-art-quality-gate.md` +- Next unit after approval: `unit-shu-officer` +- Commit/push/deploy: allowed after release gate verification + +## Visual Evidence + +- Approval board at review time: `unit-sprite-current-approval-board.png` +- Source art: `handpaint-batch2-shu-strategist-source-v1.png` +- Contact sheet: `handpaint-batch2-shu-strategist-v2-contact.png` +- Animation GIF: `handpaint-batch2-shu-strategist-v2-animation.gif` +- Previous/v2 comparison: `handpaint-batch2-shu-strategist-v2-before-after.png` +- 50px/72px scale comparison: `handpaint-batch2-shu-strategist-v2-scale-compare.png` +- Battle-scale map composite: `handpaint-batch2-shu-strategist-v2-battle-composite.png` +- Local browser debug sprite preview: `handpaint-batch2-shu-strategist-v2-debug-preview-battle-check.png` +- Approved/pending deliverables board: `unit-sprite-review-approved-and-pending.png` +- Batch 2 inventory board: `unit-sprite-review-batch2-shu.png` +- Review index: `unit-sprite-review-index.png` + +## Technical Evidence + +- Base sheet: `src/assets/images/units/unit-shu-strategist.png` +- Action sheet: `src/assets/images/units/unit-shu-strategist-actions.png` +- Base sheet size: `5008x1252` +- Action sheet size: `11268x1252` +- Base partial alpha: `0` +- Action partial alpha: `0` +- Base frame border hits: `0` +- Action frame border hits: `0` +- Base frame empty count: `0` +- Action frame empty count: `0` +- Base bbox range: `156..214 x 282..293` +- Action bbox range: `155..243 x 282..293` +- Base bottom range: `303..303` +- Action bottom range: `303..303` +- Audit status: `ok` + +## Completed Verification + +- `python scripts/assemble-handpaint-shu-infantry-quality-sample.py --source docs\handpaint-batch2-shu-strategist-source-v1.png --stem unit-shu-strategist --work-dir tmp\handpaint-shu-strategist-v2 --output-prefix handpaint-batch2-shu-strategist-v2 --fit-width-scale 0.96 --min-frame-height 282 --stretch-x 1.12` +- Technical alpha/border/bbox inspection passed +- `python scripts/audit-unit-sprite-sheets.py` +- `pnpm build` +- Local browser URL: `http://127.0.0.1:4173/heros_web/?debug&debugSpritePreview=unit-shu-strategist&v=shu-strategist-v2-final` +- Local browser debug sprite preview passed with `debugSpritePreview=unit-shu-strategist` +- Local browser console errors: `0` +- Build and browser verification passed locally. + +## Quality Note + +This v2 candidate keeps the v1 hand-painted source but widens the assembled frame enough to pass the 50px battle-readability gate. It is approved because: + +- It has a distinct fan and flowing robe silhouette, separating it from swords, spears, bows, and mounted units. +- The 50px preview remains readable without bases, rings, glow marks, or completion badges. +- Idle, walk, command, hurt, and attack frames use clear pose changes while keeping stable bottom alignment. +- The unit remains inside the 313px frame with no border hits, no partial alpha, and no empty frames. +- It matches the approved Shu batch style without feeling like a duplicate of Guan Yu or the archer. + +Reject or request revision if: + +- The white robe silhouette feels too close to Liu Bei in a dense battle roster. +- The fan becomes unreadable at 50px during a darker or busier map. +- The unit appears to drift sideways across idle/walk loops. +- Any future action frame crops the fan, robe hem, or extended sleeve. diff --git a/src/assets/images/units/unit-shu-strategist-actions.png b/src/assets/images/units/unit-shu-strategist-actions.png index f8787f9..40005f2 100644 Binary files a/src/assets/images/units/unit-shu-strategist-actions.png and b/src/assets/images/units/unit-shu-strategist-actions.png differ diff --git a/src/assets/images/units/unit-shu-strategist.png b/src/assets/images/units/unit-shu-strategist.png index bbf57ed..069ee84 100644 Binary files a/src/assets/images/units/unit-shu-strategist.png and b/src/assets/images/units/unit-shu-strategist.png differ