diff --git a/docs/handpaint-batch5-rebel-archer-veteran-source-v1.png b/docs/handpaint-batch5-rebel-archer-veteran-source-v1.png new file mode 100644 index 0000000..31ed459 Binary files /dev/null and b/docs/handpaint-batch5-rebel-archer-veteran-source-v1.png differ diff --git a/docs/handpaint-batch5-rebel-archer-veteran-v1-animation.gif b/docs/handpaint-batch5-rebel-archer-veteran-v1-animation.gif new file mode 100644 index 0000000..94e78db Binary files /dev/null and b/docs/handpaint-batch5-rebel-archer-veteran-v1-animation.gif differ diff --git a/docs/handpaint-batch5-rebel-archer-veteran-v1-battle-composite.png b/docs/handpaint-batch5-rebel-archer-veteran-v1-battle-composite.png new file mode 100644 index 0000000..d1a2d1f Binary files /dev/null and b/docs/handpaint-batch5-rebel-archer-veteran-v1-battle-composite.png differ diff --git a/docs/handpaint-batch5-rebel-archer-veteran-v1-before-after.png b/docs/handpaint-batch5-rebel-archer-veteran-v1-before-after.png new file mode 100644 index 0000000..e63d3e2 Binary files /dev/null and b/docs/handpaint-batch5-rebel-archer-veteran-v1-before-after.png differ diff --git a/docs/handpaint-batch5-rebel-archer-veteran-v1-contact.png b/docs/handpaint-batch5-rebel-archer-veteran-v1-contact.png new file mode 100644 index 0000000..72051d5 Binary files /dev/null and b/docs/handpaint-batch5-rebel-archer-veteran-v1-contact.png differ diff --git a/docs/handpaint-batch5-rebel-archer-veteran-v1-debug-preview-battle-check.png b/docs/handpaint-batch5-rebel-archer-veteran-v1-debug-preview-battle-check.png new file mode 100644 index 0000000..182bddd Binary files /dev/null and b/docs/handpaint-batch5-rebel-archer-veteran-v1-debug-preview-battle-check.png differ diff --git a/docs/handpaint-batch5-rebel-archer-veteran-v1-report.md b/docs/handpaint-batch5-rebel-archer-veteran-v1-report.md new file mode 100644 index 0000000..3aff0a2 --- /dev/null +++ b/docs/handpaint-batch5-rebel-archer-veteran-v1-report.md @@ -0,0 +1,24 @@ +# Rebel Veteran Archer Hand-Painted v1 + +- source: `handpaint-batch5-rebel-archer-veteran-source-v1.png` +- base status: ok +- action status: ok +- base partial alpha: 0, opaque pixels: 1732450 +- action partial alpha: 0, opaque pixels: 4389689 +- base frame border hits: 0 +- action frame border hits: 0 +- base empty frames: 0 +- action empty frames: 0 +- base bbox width range: 182..233 +- base bbox height range: 286..290 +- base bottom range: 303..303 +- action bbox width range: 162..243 +- action bbox height range: 224..290 +- action bottom range: 303..303 +- contact: `handpaint-batch5-rebel-archer-veteran-v1-contact.png` +- animation: `handpaint-batch5-rebel-archer-veteran-v1-animation.gif` +- before/after: `handpaint-batch5-rebel-archer-veteran-v1-before-after.png` +- scale compare: `handpaint-batch5-rebel-archer-veteran-v1-scale-compare.png` +- battle composite: `handpaint-batch5-rebel-archer-veteran-v1-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-batch5-rebel-archer-veteran-v1-scale-compare.png b/docs/handpaint-batch5-rebel-archer-veteran-v1-scale-compare.png new file mode 100644 index 0000000..9e201e8 Binary files /dev/null and b/docs/handpaint-batch5-rebel-archer-veteran-v1-scale-compare.png differ diff --git a/docs/unit-sprite-art-quality-gate.md b/docs/unit-sprite-art-quality-gate.md index a4f05d5..3283980 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: 23 +- Approved baseline units: 24 - Pending approval units: 0 -- Queued rework units: 68 +- Queued rework units: 67 ## Checked Rules diff --git a/docs/unit-sprite-current-approval-board.png b/docs/unit-sprite-current-approval-board.png index 3aa65ee..a77bbc0 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 e873f7d..c3c414f 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: 23 +- Approved baseline units: 24 - Pending approval units: 0 -- Queued rework units: 68 +- Queued rework units: 67 - 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,11 +14,10 @@ This file is generated by `scripts/write-unit-sprite-next-steps.py`. ## Next Unit Queue -1. `unit-rebel-archer-veteran` - queued-rework, base `border-hits=64`, actions `border-hits=140` -2. `unit-rebel-cavalry-veteran` - queued-rework, base `border-hits=64`, actions `border-hits=144` -3. `unit-rebel-leader` - queued-rework, base `border-hits=32`, actions `border-hits=72` -4. `unit-rebel-leader-warlord` - queued-rework, base `border-hits=32`, actions `border-hits=78` -5. `unit-rebel-ragged` - queued-rework, base `border-hits=32`, actions `border-hits=72` +1. `unit-rebel-cavalry-veteran` - queued-rework, base `border-hits=64`, actions `border-hits=144` +2. `unit-rebel-leader` - queued-rework, base `border-hits=32`, actions `border-hits=72` +3. `unit-rebel-leader-warlord` - queued-rework, base `border-hits=32`, actions `border-hits=78` +4. `unit-rebel-ragged` - queued-rework, base `border-hits=32`, actions `border-hits=72` ## Commands Before Approval @@ -45,5 +44,5 @@ pnpm build ## First Task After Current Approval -- Start with `unit-rebel-archer-veteran`. +- Start with `unit-rebel-cavalry-veteran`. - Generate source art, assemble sheets, produce contact/GIF/before-after/scale/battle screenshots, then rerun the gates. diff --git a/docs/unit-sprite-rebel-archer-veteran-v1-approval-packet.md b/docs/unit-sprite-rebel-archer-veteran-v1-approval-packet.md new file mode 100644 index 0000000..d4ec99f --- /dev/null +++ b/docs/unit-sprite-rebel-archer-veteran-v1-approval-packet.md @@ -0,0 +1,44 @@ +# Rebel Veteran Archer v1 Approval Packet + +- unit: `unit-rebel-archer-veteran` +- version: `v1` +- source: `docs/handpaint-batch5-rebel-archer-veteran-source-v1.png` +- contact sheet: `docs/handpaint-batch5-rebel-archer-veteran-v1-contact.png` +- animation: `docs/handpaint-batch5-rebel-archer-veteran-v1-animation.gif` +- battle preview: `docs/handpaint-batch5-rebel-archer-veteran-v1-debug-preview-battle-check.png` +- before/after: `docs/handpaint-batch5-rebel-archer-veteran-v1-before-after.png` +- scale compare: `docs/handpaint-batch5-rebel-archer-veteran-v1-scale-compare.png` +- current approval board: `docs/unit-sprite-current-approval-board.png` + +## Visual Decision + +Approved for the continuous production run. + +- 50px battle readability: pass +- Yellow Turban veteran identity: pass +- archer bow/quiver silhouette: pass +- avoids Guan Yu/hero officer read: pass +- opaque unit body: pass +- frame boundary safety: pass +- idle/action scale stability: pass + +## Technical Checks + +- local browser URL: `http://127.0.0.1:4173/heros_web/?debug&debugSpritePreview=unit-rebel-archer-veteran&v=rebel-archer-veteran-v1-final` +- Local browser console errors: `0` +- 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: `182..233` +- base bbox height range: `286..290` +- base bottom range: `303..303` +- action bbox width range: `162..243` +- action bbox height range: `224..290` +- action bottom range: `303..303` + +## Notes + +The v1 sheet keeps the rebel archer readable without turning the unit into an ornate unique general. The compact soldier silhouette, bow, and quiver stay visible at battle scale while the palette remains aligned with the Yellow Turban enemy set. diff --git a/docs/unit-sprite-review-approved-and-pending.png b/docs/unit-sprite-review-approved-and-pending.png index bc63a1c..bfdd815 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-batch5-rebel-other.png b/docs/unit-sprite-review-batch5-rebel-other.png index 0e7c525..9902a1a 100644 Binary files a/docs/unit-sprite-review-batch5-rebel-other.png and b/docs/unit-sprite-review-batch5-rebel-other.png differ diff --git a/docs/unit-sprite-review-index.png b/docs/unit-sprite-review-index.png index ddab419..35ddd9e 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 dab4db5..a873b99 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": 23, - "queued-rework": 68 + "approved-baseline": 24, + "queued-rework": 67 }, "rows": [ { @@ -1613,7 +1613,7 @@ }, { "batch": "batch5-rebel-other", - "review_stage": "queued-rework", + "review_stage": "approved-baseline", "stem": "unit-rebel-archer-veteran", "base": { "key": "unit-rebel-archer-veteran", @@ -1623,23 +1623,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 2099347, - "border_hits": 64, - "min_width": 249, - "max_width": 250, - "min_height": 276, - "max_height": 277, - "min_bottom": 281, - "max_bottom": 287, + "opaque_pixels": 1732450, + "border_hits": 0, + "min_width": 182, + "max_width": 233, + "min_height": 286, + "max_height": 290, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 1, - "height_swing": 1, - "bottom_swing": 6, - "battle_min_width_px": 39.8, - "battle_max_width_px": 39.9, - "battle_min_height_px": 44.1, - "battle_max_height_px": 44.2, - "status": "border-hits=64" + "width_swing": 51, + "height_swing": 4, + "bottom_swing": 0, + "battle_min_width_px": 29.1, + "battle_max_width_px": 37.2, + "battle_min_height_px": 45.7, + "battle_max_height_px": 46.3, + "status": "ok" }, "actions": { "key": "unit-rebel-archer-veteran-actions", @@ -1649,23 +1649,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 4686309, - "border_hits": 140, - "min_width": 223, - "max_width": 259, - "min_height": 275, - "max_height": 278, - "min_bottom": 274, - "max_bottom": 289, + "opaque_pixels": 4389689, + "border_hits": 0, + "min_width": 162, + "max_width": 243, + "min_height": 224, + "max_height": 290, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 36, - "height_swing": 3, - "bottom_swing": 15, - "battle_min_width_px": 35.6, - "battle_max_width_px": 41.4, - "battle_min_height_px": 43.9, - "battle_max_height_px": 44.4, - "status": "border-hits=140" + "width_swing": 81, + "height_swing": 66, + "bottom_swing": 0, + "battle_min_width_px": 25.9, + "battle_max_width_px": 38.8, + "battle_min_height_px": 35.8, + "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 efa5746..5de0e30 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: 23 -- queued-rework: 68 +- approved-baseline: 24 +- queued-rework: 67 ## Batch Plan @@ -80,7 +80,7 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards. | 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 | | batch1-approved-rebel | approved-baseline | `unit-rebel-archer` | ok | ok | 185..263 x 272..278 | 116..284 x 228..288 | 29.6..42.0 x 43.5..44.4 | w78 h6 b1 | | batch5-rebel-other | approved-baseline | `unit-rebel-archer-fire` | ok | ok | 161..249 x 288..295 | 161..252 x 285..295 | 25.7..39.8 x 46.0..47.1 | w88 h7 b0 | -| batch5-rebel-other | queued-rework | `unit-rebel-archer-veteran` | border-hits=64 | border-hits=140 | 249..250 x 276..277 | 223..259 x 275..278 | 39.8..39.9 x 44.1..44.2 | w1 h1 b6 | +| batch5-rebel-other | approved-baseline | `unit-rebel-archer-veteran` | ok | ok | 182..233 x 286..290 | 162..243 x 224..290 | 29.1..37.2 x 45.7..46.3 | w51 h4 b0 | | batch1-approved-rebel | approved-baseline | `unit-rebel-cavalry` | ok | ok | 139..289 x 266..281 | 167..286 x 186..282 | 22.2..46.2 x 42.5..44.9 | w150 h15 b3 | | batch5-rebel-other | queued-rework | `unit-rebel-cavalry-veteran` | border-hits=64 | border-hits=144 | 166..296 x 282..288 | 166..305 x 274..290 | 26.5..47.3 x 45.0..46.0 | w130 h6 b6 | | batch5-rebel-other | queued-rework | `unit-rebel-leader` | border-hits=32 | border-hits=72 | 200..254 x 266..266 | 200..263 x 265..266 | 31.9..40.6 x 42.5..42.5 | w54 h0 b6 | diff --git a/docs/unit-sprite-rework-manifest.json b/docs/unit-sprite-rework-manifest.json index 380cbc7..3027ed2 100644 --- a/docs/unit-sprite-rework-manifest.json +++ b/docs/unit-sprite-rework-manifest.json @@ -16,6 +16,7 @@ "unit-rebel", "unit-rebel-archer", "unit-rebel-archer-fire", + "unit-rebel-archer-veteran", "unit-rebel-cavalry", "unit-shu-archer", "unit-shu-cavalry", @@ -38,7 +39,6 @@ "pendingApproval": [], "currentApprovalCandidate": {}, "nextAfterApproval": [ - "unit-rebel-archer-veteran", "unit-rebel-cavalry-veteran", "unit-rebel-leader", "unit-rebel-leader-warlord", diff --git a/src/assets/images/units/unit-rebel-archer-veteran-actions.png b/src/assets/images/units/unit-rebel-archer-veteran-actions.png index 11721f3..d514500 100644 Binary files a/src/assets/images/units/unit-rebel-archer-veteran-actions.png and b/src/assets/images/units/unit-rebel-archer-veteran-actions.png differ diff --git a/src/assets/images/units/unit-rebel-archer-veteran.png b/src/assets/images/units/unit-rebel-archer-veteran.png index 68eb65a..538a86f 100644 Binary files a/src/assets/images/units/unit-rebel-archer-veteran.png and b/src/assets/images/units/unit-rebel-archer-veteran.png differ