diff --git a/docs/handpaint-batch4-wu-cavalry-elite-source-v1.png b/docs/handpaint-batch4-wu-cavalry-elite-source-v1.png new file mode 100644 index 0000000..c5e3605 Binary files /dev/null and b/docs/handpaint-batch4-wu-cavalry-elite-source-v1.png differ diff --git a/docs/handpaint-batch4-wu-cavalry-elite-v2-animation.gif b/docs/handpaint-batch4-wu-cavalry-elite-v2-animation.gif new file mode 100644 index 0000000..ad3e810 Binary files /dev/null and b/docs/handpaint-batch4-wu-cavalry-elite-v2-animation.gif differ diff --git a/docs/handpaint-batch4-wu-cavalry-elite-v2-battle-composite.png b/docs/handpaint-batch4-wu-cavalry-elite-v2-battle-composite.png new file mode 100644 index 0000000..8f16404 Binary files /dev/null and b/docs/handpaint-batch4-wu-cavalry-elite-v2-battle-composite.png differ diff --git a/docs/handpaint-batch4-wu-cavalry-elite-v2-before-after.png b/docs/handpaint-batch4-wu-cavalry-elite-v2-before-after.png new file mode 100644 index 0000000..0ed3871 Binary files /dev/null and b/docs/handpaint-batch4-wu-cavalry-elite-v2-before-after.png differ diff --git a/docs/handpaint-batch4-wu-cavalry-elite-v2-contact.png b/docs/handpaint-batch4-wu-cavalry-elite-v2-contact.png new file mode 100644 index 0000000..f1c1239 Binary files /dev/null and b/docs/handpaint-batch4-wu-cavalry-elite-v2-contact.png differ diff --git a/docs/handpaint-batch4-wu-cavalry-elite-v2-debug-preview-battle-check.png b/docs/handpaint-batch4-wu-cavalry-elite-v2-debug-preview-battle-check.png new file mode 100644 index 0000000..33e1365 Binary files /dev/null and b/docs/handpaint-batch4-wu-cavalry-elite-v2-debug-preview-battle-check.png differ diff --git a/docs/handpaint-batch4-wu-cavalry-elite-v2-report.md b/docs/handpaint-batch4-wu-cavalry-elite-v2-report.md new file mode 100644 index 0000000..115599b --- /dev/null +++ b/docs/handpaint-batch4-wu-cavalry-elite-v2-report.md @@ -0,0 +1,24 @@ +# Wu Elite Cavalry v2 sprite report + +- source: `handpaint-batch4-wu-cavalry-elite-source-v1.png` +- base status: ok +- action status: ok +- base partial alpha: 0, opaque pixels: 2104014 +- action partial alpha: 0, opaque pixels: 5001102 +- base frame border hits: 0 +- action frame border hits: 0 +- base empty frames: 0 +- action empty frames: 0 +- base bbox width range: 229..255 +- base bbox height range: 288..288 +- base bottom range: 303..303 +- action bbox width range: 220..286 +- action bbox height range: 267..288 +- action bottom range: 303..303 +- contact: `handpaint-batch4-wu-cavalry-elite-v2-contact.png` +- animation: `handpaint-batch4-wu-cavalry-elite-v2-animation.gif` +- before/after: `handpaint-batch4-wu-cavalry-elite-v2-before-after.png` +- scale compare: `handpaint-batch4-wu-cavalry-elite-v2-scale-compare.png` +- battle composite: `handpaint-batch4-wu-cavalry-elite-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-cavalry-elite-v2-scale-compare.png b/docs/handpaint-batch4-wu-cavalry-elite-v2-scale-compare.png new file mode 100644 index 0000000..a90f537 Binary files /dev/null and b/docs/handpaint-batch4-wu-cavalry-elite-v2-scale-compare.png differ diff --git a/docs/unit-sprite-art-quality-gate.md b/docs/unit-sprite-art-quality-gate.md index 11a2e54..2693f94 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: 63 +- Approved baseline units: 64 - Pending approval units: 0 -- Queued rework units: 28 +- Queued rework units: 27 ## Checked Rules diff --git a/docs/unit-sprite-batch-queue.json b/docs/unit-sprite-batch-queue.json index ac02d73..0435767 100644 --- a/docs/unit-sprite-batch-queue.json +++ b/docs/unit-sprite-batch-queue.json @@ -62,6 +62,7 @@ "unit-wu-archer-naval", "unit-wu-archer-river", "unit-wu-cavalry", + "unit-wu-cavalry-elite", "unit-wu-infantry", "unit-wu-officer", "unit-wu-strategist", @@ -70,8 +71,8 @@ "pendingApproval": [], "nextAfterApproval": [], "stageCounts": { - "approved-baseline": 63, - "queued-rework": 28 + "approved-baseline": 64, + "queued-rework": 27 }, "batches": [ { @@ -679,24 +680,10 @@ "label": "Batch 4 Wu generic units", "total": 16, "stageCounts": { - "approved-baseline": 7, - "queued-rework": 9 + "approved-baseline": 8, + "queued-rework": 8 }, "units": [ - { - "stem": "unit-wu-cavalry-elite", - "reviewStage": "queued-rework", - "queueRole": "queued rework", - "baseStatus": "border-hits=64", - "actionStatus": "border-hits=144", - "battleBasePx": [ - 26.5, - 47.3, - 45.0, - 46.0 - ], - "spec": null - }, { "stem": "unit-wu-cavalry-river", "reviewStage": "queued-rework", @@ -865,6 +852,20 @@ ], "spec": null }, + { + "stem": "unit-wu-cavalry-elite", + "reviewStage": "approved-baseline", + "queueRole": "approved reference", + "baseStatus": "ok", + "actionStatus": "ok", + "battleBasePx": [ + 36.6, + 40.7, + 46.0, + 46.0 + ], + "spec": null + }, { "stem": "unit-wu-infantry", "reviewStage": "approved-baseline", diff --git a/docs/unit-sprite-batch-queue.md b/docs/unit-sprite-batch-queue.md index f4b7e7c..ed5b183 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: 63 +- Approved baseline units: 64 - Pending approval units: 0 -- Queued rework units: 28 +- Queued rework units: 27 - 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 7, queued-rework 9 +- Stage counts: approved-baseline 8, queued-rework 8 | unit | role | stage | status | battle base px | spec | | --- | --- | --- | --- | --- | --- | -| `unit-wu-cavalry-elite` | queued rework | queued-rework | base border-hits=64; actions border-hits=144 | 26.5..47.3 x 45.0..46.0 | | | `unit-wu-cavalry-river` | queued rework | queued-rework | base border-hits=64; actions border-hits=144 | 25.6..46.5 x 45.0..46.2 | | | `unit-wu-infantry-marine` | queued rework | queued-rework | base border-hits=32; actions border-hits=82 | 30.7..44.2 x 44.6..44.6 | | | `unit-wu-infantry-river` | queued rework | queued-rework | base border-hits=32; actions border-hits=82 | 30.7..44.2 x 44.6..44.6 | | @@ -115,6 +114,7 @@ No next unit is currently defined. | `unit-wu-archer-naval` | approved reference | approved-baseline | technical ok | 33.9..36.6 x 44.2..46.0 | | | `unit-wu-archer-river` | approved reference | approved-baseline | technical ok | 33.4..36.6 x 46.0..46.0 | | | `unit-wu-cavalry` | approved reference | approved-baseline | technical ok | 28.3..40.3 x 43.8..46.3 | | +| `unit-wu-cavalry-elite` | approved reference | approved-baseline | technical ok | 36.6..40.7 x 46.0..46.0 | | | `unit-wu-infantry` | approved reference | approved-baseline | technical ok | 25.2..33.1 x 46.0..46.5 | | | `unit-wu-officer` | approved reference | approved-baseline | technical ok | 25.4..32.9 x 46.0..46.0 | | | `unit-wu-strategist` | approved reference | approved-baseline | technical ok | 25.7..40.7 x 46.0..46.3 | | diff --git a/docs/unit-sprite-current-approval-board.png b/docs/unit-sprite-current-approval-board.png index 149aa73..dc8e3b0 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 d99bb9c..a426db1 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: 63 +- Approved baseline units: 64 - Pending approval units: 0 -- Queued rework units: 28 +- Queued rework units: 27 - 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 9e5bf65..30ec5a1 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 d24bfb4..eb7914a 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 f39c467..9d624f3 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 15e50b8..4296355 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": 63, - "queued-rework": 28 + "approved-baseline": 64, + "queued-rework": 27 }, "rows": [ { @@ -4235,7 +4235,7 @@ }, { "batch": "batch4-wu", - "review_stage": "queued-rework", + "review_stage": "approved-baseline", "stem": "unit-wu-cavalry-elite", "base": { "key": "unit-wu-cavalry-elite", @@ -4245,23 +4245,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 2540801, - "border_hits": 64, - "min_width": 166, - "max_width": 296, - "min_height": 282, + "opaque_pixels": 2104014, + "border_hits": 0, + "min_width": 229, + "max_width": 255, + "min_height": 288, "max_height": 288, - "min_bottom": 281, - "max_bottom": 287, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 130, - "height_swing": 6, - "bottom_swing": 6, - "battle_min_width_px": 26.5, - "battle_max_width_px": 47.3, - "battle_min_height_px": 45.0, + "width_swing": 26, + "height_swing": 0, + "bottom_swing": 0, + "battle_min_width_px": 36.6, + "battle_max_width_px": 40.7, + "battle_min_height_px": 46.0, "battle_max_height_px": 46.0, - "status": "border-hits=64" + "status": "ok" }, "actions": { "key": "unit-wu-cavalry-elite-actions", @@ -4271,23 +4271,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 5689665, - "border_hits": 144, - "min_width": 166, - "max_width": 305, - "min_height": 274, - "max_height": 290, - "min_bottom": 273, - "max_bottom": 289, + "opaque_pixels": 5001102, + "border_hits": 0, + "min_width": 220, + "max_width": 286, + "min_height": 267, + "max_height": 288, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 139, - "height_swing": 16, - "bottom_swing": 16, - "battle_min_width_px": 26.5, - "battle_max_width_px": 48.7, - "battle_min_height_px": 43.8, - "battle_max_height_px": 46.3, - "status": "border-hits=144" + "width_swing": 66, + "height_swing": 21, + "bottom_swing": 0, + "battle_min_width_px": 35.1, + "battle_max_width_px": 45.7, + "battle_min_height_px": 42.7, + "battle_max_height_px": 46.0, + "status": "ok" } }, { diff --git a/docs/unit-sprite-rework-audit.md b/docs/unit-sprite-rework-audit.md index 39a5184..3eb63a0 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: 63 -- queued-rework: 28 +- approved-baseline: 64 +- queued-rework: 27 ## Batch Plan @@ -126,7 +126,7 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards. | batch4-wu | approved-baseline | `unit-wu-archer-naval` | ok | ok | 212..229 x 277..288 | 191..256 x 277..288 | 33.9..36.6 x 44.2..46.0 | w17 h11 b0 | | batch4-wu | approved-baseline | `unit-wu-archer-river` | ok | ok | 209..229 x 288..288 | 209..252 x 233..288 | 33.4..36.6 x 46.0..46.0 | w20 h0 b0 | | batch4-wu | approved-baseline | `unit-wu-cavalry` | ok | ok | 177..252 x 274..290 | 177..261 x 274..290 | 28.3..40.3 x 43.8..46.3 | w75 h16 b0 | -| batch4-wu | queued-rework | `unit-wu-cavalry-elite` | 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 | +| batch4-wu | approved-baseline | `unit-wu-cavalry-elite` | ok | ok | 229..255 x 288..288 | 220..286 x 267..288 | 36.6..40.7 x 46.0..46.0 | w26 h0 b0 | | batch4-wu | queued-rework | `unit-wu-cavalry-river` | border-hits=64 | border-hits=144 | 160..291 x 282..289 | 160..300 x 274..290 | 25.6..46.5 x 45.0..46.2 | w131 h7 b7 | | batch4-wu | approved-baseline | `unit-wu-infantry` | ok | ok | 158..207 x 288..291 | 158..281 x 288..291 | 25.2..33.1 x 46.0..46.5 | w49 h3 b0 | | batch4-wu | queued-rework | `unit-wu-infantry-marine` | border-hits=32 | border-hits=82 | 192..277 x 279..279 | 192..286 x 275..279 | 30.7..44.2 x 44.6..44.6 | w85 h0 b6 | diff --git a/docs/unit-sprite-rework-manifest.json b/docs/unit-sprite-rework-manifest.json index e869e1e..dd5a564 100644 --- a/docs/unit-sprite-rework-manifest.json +++ b/docs/unit-sprite-rework-manifest.json @@ -70,6 +70,7 @@ "unit-wu-archer-naval", "unit-wu-archer-river", "unit-wu-cavalry", + "unit-wu-cavalry-elite", "unit-wu-infantry", "unit-wu-officer", "unit-wu-strategist", diff --git a/docs/unit-sprite-wu-cavalry-elite-v2-approval-packet.md b/docs/unit-sprite-wu-cavalry-elite-v2-approval-packet.md new file mode 100644 index 0000000..a2fd8f2 --- /dev/null +++ b/docs/unit-sprite-wu-cavalry-elite-v2-approval-packet.md @@ -0,0 +1,36 @@ +# Wu Elite Cavalry v2 Approval Packet + +- status: approved during continuous production run +- unit: `unit-wu-cavalry-elite` +- source art: `handpaint-batch4-wu-cavalry-elite-source-v1.png` +- contact sheet: `handpaint-batch4-wu-cavalry-elite-v2-contact.png` +- animation GIF: `handpaint-batch4-wu-cavalry-elite-v2-animation.gif` +- before/after: `handpaint-batch4-wu-cavalry-elite-v2-before-after.png` +- scale compare: `handpaint-batch4-wu-cavalry-elite-v2-scale-compare.png` +- battle composite: `handpaint-batch4-wu-cavalry-elite-v2-battle-composite.png` +- browser check: `handpaint-batch4-wu-cavalry-elite-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-cavalry-elite&v=wu-cavalry-elite-v2` + +## Visual Decision + +Approved for the continuous batch run. v2 reads clearly as elite Wu cavalry through the compact horse silhouette, mounted rider, red lacquer armor, teal saddle cloth, and contained cavalry weapon. It stays distinct from the baseline Wu cavalry and from the Wei/Shu cavalry references. + +## 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: 36.6..40.7 x 46.0..46.0 +- local build: passed +- Local browser console errors: `0` +- Local browser 404s: `0` + +## Notes + +v1 was discarded because the mounted silhouette was too small for battle-scale readability. v2 restores cavalry presence while keeping all frames contained inside the tile. diff --git a/src/assets/images/units/unit-wu-cavalry-elite-actions.png b/src/assets/images/units/unit-wu-cavalry-elite-actions.png index 7f0412e..1621049 100644 Binary files a/src/assets/images/units/unit-wu-cavalry-elite-actions.png and b/src/assets/images/units/unit-wu-cavalry-elite-actions.png differ diff --git a/src/assets/images/units/unit-wu-cavalry-elite.png b/src/assets/images/units/unit-wu-cavalry-elite.png index 53b46cb..fdf50c9 100644 Binary files a/src/assets/images/units/unit-wu-cavalry-elite.png and b/src/assets/images/units/unit-wu-cavalry-elite.png differ