diff --git a/docs/handpaint-batch2-shu-strategist-field-source-v2.png b/docs/handpaint-batch2-shu-strategist-field-source-v2.png new file mode 100644 index 0000000..43634ae Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-field-source-v2.png differ diff --git a/docs/handpaint-batch2-shu-strategist-field-v2-animation.gif b/docs/handpaint-batch2-shu-strategist-field-v2-animation.gif new file mode 100644 index 0000000..b073e1f Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-field-v2-animation.gif differ diff --git a/docs/handpaint-batch2-shu-strategist-field-v2-battle-composite.png b/docs/handpaint-batch2-shu-strategist-field-v2-battle-composite.png new file mode 100644 index 0000000..1b2e43a Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-field-v2-battle-composite.png differ diff --git a/docs/handpaint-batch2-shu-strategist-field-v2-before-after.png b/docs/handpaint-batch2-shu-strategist-field-v2-before-after.png new file mode 100644 index 0000000..2dd8d5a Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-field-v2-before-after.png differ diff --git a/docs/handpaint-batch2-shu-strategist-field-v2-contact.png b/docs/handpaint-batch2-shu-strategist-field-v2-contact.png new file mode 100644 index 0000000..e1c2a13 Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-field-v2-contact.png differ diff --git a/docs/handpaint-batch2-shu-strategist-field-v2-debug-preview-battle-check.png b/docs/handpaint-batch2-shu-strategist-field-v2-debug-preview-battle-check.png new file mode 100644 index 0000000..cb85541 Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-field-v2-debug-preview-battle-check.png differ diff --git a/docs/handpaint-batch2-shu-strategist-field-v2-report.md b/docs/handpaint-batch2-shu-strategist-field-v2-report.md new file mode 100644 index 0000000..f95fe41 --- /dev/null +++ b/docs/handpaint-batch2-shu-strategist-field-v2-report.md @@ -0,0 +1,24 @@ +# Shu Strategist Field Hand-Painted v2 + +- source: `handpaint-batch2-shu-strategist-field-source-v2.png` +- base status: ok +- action status: ok +- base partial alpha: 0, opaque pixels: 2059816 +- action partial alpha: 0, opaque pixels: 5157870 +- base frame border hits: 0 +- action frame border hits: 0 +- base empty frames: 0 +- action empty frames: 0 +- base bbox width range: 166..206 +- base bbox height range: 277..295 +- base bottom range: 303..303 +- action bbox width range: 166..269 +- action bbox height range: 277..295 +- action bottom range: 303..303 +- contact: `handpaint-batch2-shu-strategist-field-v2-contact.png` +- animation: `handpaint-batch2-shu-strategist-field-v2-animation.gif` +- before/after: `handpaint-batch2-shu-strategist-field-v2-before-after.png` +- scale compare: `handpaint-batch2-shu-strategist-field-v2-scale-compare.png` +- battle composite: `handpaint-batch2-shu-strategist-field-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-field-v2-scale-compare.png b/docs/handpaint-batch2-shu-strategist-field-v2-scale-compare.png new file mode 100644 index 0000000..b057bbe Binary files /dev/null and b/docs/handpaint-batch2-shu-strategist-field-v2-scale-compare.png differ diff --git a/docs/unit-sprite-art-quality-gate.md b/docs/unit-sprite-art-quality-gate.md index 7e0d6bd..6460e7e 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: 48 +- Approved baseline units: 49 - Pending approval units: 0 -- Queued rework units: 43 +- Queued rework units: 42 ## Checked Rules diff --git a/docs/unit-sprite-batch-queue.json b/docs/unit-sprite-batch-queue.json index e9390a8..6627410 100644 --- a/docs/unit-sprite-batch-queue.json +++ b/docs/unit-sprite-batch-queue.json @@ -40,6 +40,7 @@ "unit-shu-spearman-guard", "unit-shu-spearman-veteran", "unit-shu-strategist", + "unit-shu-strategist-field", "unit-wei-archer", "unit-wei-cavalry", "unit-wei-infantry", @@ -55,8 +56,8 @@ "pendingApproval": [], "nextAfterApproval": [], "stageCounts": { - "approved-baseline": 48, - "queued-rework": 43 + "approved-baseline": 49, + "queued-rework": 42 }, "batches": [ { @@ -168,24 +169,10 @@ "label": "Batch 2 Shu generic units", "total": 18, "stageCounts": { - "approved-baseline": 16, - "queued-rework": 2 + "approved-baseline": 17, + "queued-rework": 1 }, "units": [ - { - "stem": "unit-shu-strategist-field", - "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-shu-strategist-white", "reviewStage": "queued-rework", @@ -423,6 +410,20 @@ 46.8 ], "spec": "unit-sprite-batch2-shu-strategist-spec.md" + }, + { + "stem": "unit-shu-strategist-field", + "reviewStage": "approved-baseline", + "queueRole": "approved reference", + "baseStatus": "ok", + "actionStatus": "ok", + "battleBasePx": [ + 26.5, + 32.9, + 44.2, + 47.1 + ], + "spec": null } ] }, diff --git a/docs/unit-sprite-batch-queue.md b/docs/unit-sprite-batch-queue.md index aa6d65f..c6ad267 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: 48 +- Approved baseline units: 49 - Pending approval units: 0 -- Queued rework units: 43 +- Queued rework units: 42 - Manifest: `docs/unit-sprite-rework-manifest.json` - Audit: `docs/unit-sprite-rework-audit.json` @@ -46,11 +46,10 @@ No next unit is currently defined. - Batch key: `batch2-shu` - Total units: 18 -- Stage counts: approved-baseline 16, queued-rework 2 +- Stage counts: approved-baseline 17, queued-rework 1 | unit | role | stage | status | battle base px | spec | | --- | --- | --- | --- | --- | --- | -| `unit-shu-strategist-field` | queued rework | queued-rework | base border-hits=32; actions border-hits=98 | 38.8..39.3 x 44.7..44.9 | | | `unit-shu-strategist-white` | queued rework | queued-rework | base border-hits=32; actions border-hits=98 | 38.8..39.3 x 44.7..44.9 | | | `unit-shu-archer` | approved reference | approved-baseline | technical ok | 25.2..41.5 x 45.4..47.1 | `unit-sprite-batch2-shu-archer-spec.md` | | `unit-shu-archer-longbow` | approved reference | approved-baseline | technical ok | 22.2..38.0 x 45.7..46.0 | | @@ -68,6 +67,7 @@ No next unit is currently defined. | `unit-shu-spearman-guard` | approved reference | approved-baseline | technical ok | 29.4..32.7 x 44.2..47.1 | | | `unit-shu-spearman-veteran` | approved reference | approved-baseline | technical ok | 26.0..32.9 x 46.3..47.1 | | | `unit-shu-strategist` | approved reference | approved-baseline | technical ok | 24.9..34.2 x 45.0..46.8 | `unit-sprite-batch2-shu-strategist-spec.md` | +| `unit-shu-strategist-field` | approved reference | approved-baseline | technical ok | 26.5..32.9 x 44.2..47.1 | | ### Batch 3 Wei generic units diff --git a/docs/unit-sprite-current-approval-board.png b/docs/unit-sprite-current-approval-board.png index 8ad9d02..d1dc6a5 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 3bbb4c8..e7dfcde 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: 48 +- Approved baseline units: 49 - Pending approval units: 0 -- Queued rework units: 43 +- Queued rework units: 42 - 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 d144b18..2bf1146 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 f72cbd9..9fcae7d 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 0cc1e5a..31623d5 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 64a8e9a..615a01d 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": 48, - "queued-rework": 43 + "approved-baseline": 49, + "queued-rework": 42 }, "rows": [ { @@ -2867,7 +2867,7 @@ }, { "batch": "batch2-shu", - "review_stage": "queued-rework", + "review_stage": "approved-baseline", "stem": "unit-shu-strategist-field", "base": { "key": "unit-shu-strategist-field", @@ -2877,23 +2877,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": 2059816, + "border_hits": 0, + "min_width": 166, + "max_width": 206, + "min_height": 277, + "max_height": 295, + "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": 40, + "height_swing": 18, + "bottom_swing": 0, + "battle_min_width_px": 26.5, + "battle_max_width_px": 32.9, + "battle_min_height_px": 44.2, + "battle_max_height_px": 47.1, + "status": "ok" }, "actions": { "key": "unit-shu-strategist-field-actions", @@ -2903,23 +2903,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": 5157870, + "border_hits": 0, + "min_width": 166, + "max_width": 269, + "min_height": 277, + "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": 103, + "height_swing": 18, + "bottom_swing": 0, + "battle_min_width_px": 26.5, + "battle_max_width_px": 43.0, + "battle_min_height_px": 44.2, + "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 90d16fb..2b74317 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: 48 -- queued-rework: 43 +- approved-baseline: 49 +- queued-rework: 42 ## Batch Plan @@ -102,7 +102,7 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards. | batch2-shu | approved-baseline | `unit-shu-spearman-guard` | ok | ok | 184..205 x 277..295 | 176..276 x 232..295 | 29.4..32.7 x 44.2..47.1 | w21 h18 b0 | | batch2-shu | approved-baseline | `unit-shu-spearman-veteran` | ok | ok | 163..206 x 290..295 | 143..276 x 221..295 | 26.0..32.9 x 46.3..47.1 | w43 h5 b0 | | 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 | approved-baseline | `unit-shu-strategist-field` | ok | ok | 166..206 x 277..295 | 166..269 x 277..295 | 26.5..32.9 x 44.2..47.1 | w40 h18 b0 | | 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 | | batch7-unique-officer | queued-rework | `unit-wang-ping` | 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 | diff --git a/docs/unit-sprite-rework-manifest.json b/docs/unit-sprite-rework-manifest.json index c11b0a1..a3fd842 100644 --- a/docs/unit-sprite-rework-manifest.json +++ b/docs/unit-sprite-rework-manifest.json @@ -48,6 +48,7 @@ "unit-shu-spearman-guard", "unit-shu-spearman-veteran", "unit-shu-strategist", + "unit-shu-strategist-field", "unit-wei-archer", "unit-wei-cavalry", "unit-wei-infantry", diff --git a/docs/unit-sprite-shu-strategist-field-v2-approval-packet.md b/docs/unit-sprite-shu-strategist-field-v2-approval-packet.md new file mode 100644 index 0000000..c6f23f8 --- /dev/null +++ b/docs/unit-sprite-shu-strategist-field-v2-approval-packet.md @@ -0,0 +1,36 @@ +# Unit Sprite Approval Packet: unit-shu-strategist-field v2 + +- Status: approved during continuous production run +- Source art: `docs/handpaint-batch2-shu-strategist-field-source-v2.png` +- Contact sheet: `docs/handpaint-batch2-shu-strategist-field-v2-contact.png` +- Animation GIF: `docs/handpaint-batch2-shu-strategist-field-v2-animation.gif` +- Before/after: `docs/handpaint-batch2-shu-strategist-field-v2-before-after.png` +- Scale compare: `docs/handpaint-batch2-shu-strategist-field-v2-scale-compare.png` +- Browser check: `docs/handpaint-batch2-shu-strategist-field-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-shu-strategist-field&v=shu-strategist-field-v2-console-clean` + +## Visual Decision + +Shu strategist field v2 is accepted as a practical battlefield tactician. The green travel robe, feather fan, and bamboo scroll separate it from the armored council officer and the cleaner white-robed strategist. + +## 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: `166..206` +- Base bbox height range: `277..295` +- Base bottom range: `303..303` +- Action bbox width range: `166..269` +- Action bbox height range: `277..295` +- Action bottom range: `303..303` +- Local build: `passed` +- Local browser console errors: `0` + +## Notes + +v2 widens the robe silhouette for tactical readability while keeping the fan and scroll compact. The unit remains fully opaque, stable on the foot baseline, and visually distinct at 50px scale. diff --git a/src/assets/images/units/unit-shu-strategist-field-actions.png b/src/assets/images/units/unit-shu-strategist-field-actions.png index f8787f9..a784f34 100644 Binary files a/src/assets/images/units/unit-shu-strategist-field-actions.png and b/src/assets/images/units/unit-shu-strategist-field-actions.png differ diff --git a/src/assets/images/units/unit-shu-strategist-field.png b/src/assets/images/units/unit-shu-strategist-field.png index bbf57ed..ee4c208 100644 Binary files a/src/assets/images/units/unit-shu-strategist-field.png and b/src/assets/images/units/unit-shu-strategist-field.png differ