diff --git a/docs/handpaint-batch4-wu-officer-river-source-v1.png b/docs/handpaint-batch4-wu-officer-river-source-v1.png new file mode 100644 index 0000000..4290bf7 Binary files /dev/null and b/docs/handpaint-batch4-wu-officer-river-source-v1.png differ diff --git a/docs/handpaint-batch4-wu-officer-river-v1-animation.gif b/docs/handpaint-batch4-wu-officer-river-v1-animation.gif new file mode 100644 index 0000000..7f67536 Binary files /dev/null and b/docs/handpaint-batch4-wu-officer-river-v1-animation.gif differ diff --git a/docs/handpaint-batch4-wu-officer-river-v1-battle-composite.png b/docs/handpaint-batch4-wu-officer-river-v1-battle-composite.png new file mode 100644 index 0000000..10f646f Binary files /dev/null and b/docs/handpaint-batch4-wu-officer-river-v1-battle-composite.png differ diff --git a/docs/handpaint-batch4-wu-officer-river-v1-before-after.png b/docs/handpaint-batch4-wu-officer-river-v1-before-after.png new file mode 100644 index 0000000..ad117da Binary files /dev/null and b/docs/handpaint-batch4-wu-officer-river-v1-before-after.png differ diff --git a/docs/handpaint-batch4-wu-officer-river-v1-contact.png b/docs/handpaint-batch4-wu-officer-river-v1-contact.png new file mode 100644 index 0000000..4879610 Binary files /dev/null and b/docs/handpaint-batch4-wu-officer-river-v1-contact.png differ diff --git a/docs/handpaint-batch4-wu-officer-river-v1-debug-preview-battle-check.png b/docs/handpaint-batch4-wu-officer-river-v1-debug-preview-battle-check.png new file mode 100644 index 0000000..92e9915 Binary files /dev/null and b/docs/handpaint-batch4-wu-officer-river-v1-debug-preview-battle-check.png differ diff --git a/docs/handpaint-batch4-wu-officer-river-v1-report.md b/docs/handpaint-batch4-wu-officer-river-v1-report.md new file mode 100644 index 0000000..27e7b7d --- /dev/null +++ b/docs/handpaint-batch4-wu-officer-river-v1-report.md @@ -0,0 +1,24 @@ +# Wu River Officer Hand-Painted v1 + +- source: `handpaint-batch4-wu-officer-river-source-v1.png` +- base status: ok +- action status: ok +- base partial alpha: 0, opaque pixels: 1900458 +- action partial alpha: 0, opaque pixels: 4574888 +- base frame border hits: 0 +- action frame border hits: 0 +- base empty frames: 0 +- action empty frames: 0 +- base bbox width range: 164..266 +- base bbox height range: 273..286 +- base bottom range: 303..303 +- action bbox width range: 161..286 +- action bbox height range: 272..293 +- action bottom range: 303..303 +- contact: `handpaint-batch4-wu-officer-river-v1-contact.png` +- animation: `handpaint-batch4-wu-officer-river-v1-animation.gif` +- before/after: `handpaint-batch4-wu-officer-river-v1-before-after.png` +- scale compare: `handpaint-batch4-wu-officer-river-v1-scale-compare.png` +- battle composite: `handpaint-batch4-wu-officer-river-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-batch4-wu-officer-river-v1-scale-compare.png b/docs/handpaint-batch4-wu-officer-river-v1-scale-compare.png new file mode 100644 index 0000000..aa22da3 Binary files /dev/null and b/docs/handpaint-batch4-wu-officer-river-v1-scale-compare.png differ diff --git a/docs/unit-sprite-art-quality-gate.md b/docs/unit-sprite-art-quality-gate.md index 2d95e6a..eb60965 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: 68 +- Approved baseline units: 69 - Pending approval units: 0 -- Queued rework units: 23 +- Queued rework units: 22 ## Checked Rules diff --git a/docs/unit-sprite-batch-queue.json b/docs/unit-sprite-batch-queue.json index 33ec175..d0306f3 100644 --- a/docs/unit-sprite-batch-queue.json +++ b/docs/unit-sprite-batch-queue.json @@ -69,14 +69,15 @@ "unit-wu-infantry-river", "unit-wu-officer", "unit-wu-officer-harbor", + "unit-wu-officer-river", "unit-wu-strategist", "unit-zhang-fei" ], "pendingApproval": [], "nextAfterApproval": [], "stageCounts": { - "approved-baseline": 68, - "queued-rework": 23 + "approved-baseline": 69, + "queued-rework": 22 }, "batches": [ { @@ -684,24 +685,10 @@ "label": "Batch 4 Wu generic units", "total": 16, "stageCounts": { - "approved-baseline": 12, - "queued-rework": 4 + "approved-baseline": 13, + "queued-rework": 3 }, "units": [ - { - "stem": "unit-wu-officer-river", - "reviewStage": "queued-rework", - "queueRole": "queued rework", - "baseStatus": "border-hits=32", - "actionStatus": "border-hits=82", - "battleBasePx": [ - 31.9, - 40.6, - 44.6, - 44.6 - ], - "spec": null - }, { "stem": "unit-wu-strategist-fire", "reviewStage": "queued-rework", @@ -898,6 +885,20 @@ ], "spec": null }, + { + "stem": "unit-wu-officer-river", + "reviewStage": "approved-baseline", + "queueRole": "approved reference", + "baseStatus": "ok", + "actionStatus": "ok", + "battleBasePx": [ + 26.2, + 42.5, + 43.6, + 45.7 + ], + "spec": null + }, { "stem": "unit-wu-strategist", "reviewStage": "approved-baseline", diff --git a/docs/unit-sprite-batch-queue.md b/docs/unit-sprite-batch-queue.md index ee518b6..9c833aa 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: 68 +- Approved baseline units: 69 - Pending approval units: 0 -- Queued rework units: 23 +- Queued rework units: 22 - 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 12, queued-rework 4 +- Stage counts: approved-baseline 13, queued-rework 3 | unit | role | stage | status | battle base px | spec | | --- | --- | --- | --- | --- | --- | -| `unit-wu-officer-river` | queued rework | queued-rework | base border-hits=32; actions border-hits=82 | 31.9..40.6 x 44.6..44.6 | | | `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 | | @@ -117,6 +116,7 @@ No next unit is currently defined. | `unit-wu-infantry-river` | approved reference | approved-baseline | technical ok | 27.5..33.1 x 45.7..45.7 | | | `unit-wu-officer` | approved reference | approved-baseline | technical ok | 25.4..32.9 x 46.0..46.0 | | | `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 | | ### 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 9ea926b..2e65b98 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 435c95a..4f7f7b0 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: 68 +- Approved baseline units: 69 - Pending approval units: 0 -- Queued rework units: 23 +- Queued rework units: 22 - 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 b34f0e8..826832a 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 8e1024b..f9273ae 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 b700790..deca7d2 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 9be0d55..0a9fadd 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": 68, - "queued-rework": 23 + "approved-baseline": 69, + "queued-rework": 22 }, "rows": [ { @@ -4634,7 +4634,7 @@ }, { "batch": "batch4-wu", - "review_stage": "queued-rework", + "review_stage": "approved-baseline", "stem": "unit-wu-officer-river", "base": { "key": "unit-wu-officer-river", @@ -4644,23 +4644,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 1985543, - "border_hits": 32, - "min_width": 200, - "max_width": 254, - "min_height": 279, - "max_height": 279, - "min_bottom": 281, - "max_bottom": 287, + "opaque_pixels": 1900458, + "border_hits": 0, + "min_width": 164, + "max_width": 266, + "min_height": 273, + "max_height": 286, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 54, - "height_swing": 0, - "bottom_swing": 6, - "battle_min_width_px": 31.9, - "battle_max_width_px": 40.6, - "battle_min_height_px": 44.6, - "battle_max_height_px": 44.6, - "status": "border-hits=32" + "width_swing": 102, + "height_swing": 13, + "bottom_swing": 0, + "battle_min_width_px": 26.2, + "battle_max_width_px": 42.5, + "battle_min_height_px": 43.6, + "battle_max_height_px": 45.7, + "status": "ok" }, "actions": { "key": "unit-wu-officer-river-actions", @@ -4670,23 +4670,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 4453784, - "border_hits": 82, - "min_width": 200, - "max_width": 263, - "min_height": 275, - "max_height": 279, - "min_bottom": 274, - "max_bottom": 289, + "opaque_pixels": 4574888, + "border_hits": 0, + "min_width": 161, + "max_width": 286, + "min_height": 272, + "max_height": 293, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 63, - "height_swing": 4, - "bottom_swing": 15, - "battle_min_width_px": 31.9, - "battle_max_width_px": 42.0, - "battle_min_height_px": 43.9, - "battle_max_height_px": 44.6, - "status": "border-hits=82" + "width_swing": 125, + "height_swing": 21, + "bottom_swing": 0, + "battle_min_width_px": 25.7, + "battle_max_width_px": 45.7, + "battle_min_height_px": 43.5, + "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 90de534..c985e3e 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: 68 -- queued-rework: 23 +- approved-baseline: 69 +- queued-rework: 22 ## Batch Plan @@ -133,7 +133,7 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards. | batch4-wu | approved-baseline | `unit-wu-infantry-river` | ok | ok | 172..207 x 286..286 | 169..286 x 270..294 | 27.5..33.1 x 45.7..45.7 | w35 h0 b0 | | batch4-wu | approved-baseline | `unit-wu-officer` | ok | ok | 159..206 x 288..288 | 154..253 x 288..288 | 25.4..32.9 x 46.0..46.0 | w47 h0 b0 | | 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 | queued-rework | `unit-wu-officer-river` | 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 | +| 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 | 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 | diff --git a/docs/unit-sprite-rework-manifest.json b/docs/unit-sprite-rework-manifest.json index 291988b..54da66e 100644 --- a/docs/unit-sprite-rework-manifest.json +++ b/docs/unit-sprite-rework-manifest.json @@ -77,6 +77,7 @@ "unit-wu-infantry-river", "unit-wu-officer", "unit-wu-officer-harbor", + "unit-wu-officer-river", "unit-wu-strategist", "unit-zhang-fei" ], diff --git a/docs/unit-sprite-wu-officer-river-v1-approval-packet.md b/docs/unit-sprite-wu-officer-river-v1-approval-packet.md new file mode 100644 index 0000000..258bcb4 --- /dev/null +++ b/docs/unit-sprite-wu-officer-river-v1-approval-packet.md @@ -0,0 +1,36 @@ +# Wu River Officer v1 Approval Packet + +- status: approved during continuous production run +- unit: `unit-wu-officer-river` +- source art: `handpaint-batch4-wu-officer-river-source-v1.png` +- contact sheet: `handpaint-batch4-wu-officer-river-v1-contact.png` +- animation GIF: `handpaint-batch4-wu-officer-river-v1-animation.gif` +- before/after: `handpaint-batch4-wu-officer-river-v1-before-after.png` +- scale compare: `handpaint-batch4-wu-officer-river-v1-scale-compare.png` +- battle composite: `handpaint-batch4-wu-officer-river-v1-battle-composite.png` +- browser check: `handpaint-batch4-wu-officer-river-v1-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-officer-river&v=wu-officer-river-v1` + +## Visual Decision + +Approved for the continuous batch run. v1 reads as a mobile Wu river officer through the compact officer sword, blue river sash, narrow cape, and headband silhouette. It is more authoritative than river infantry while staying lighter and less ceremonial than the harbor officer. + +## 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: 26.2..42.5 x 43.6..45.7 +- local build: passed +- Local browser console errors: `0` +- Local browser 404s: `0` + +## Notes + +The v1 sheet keeps the officer silhouette large enough at 50px, maintains stable base-frame height, and stays within the 313px frame without external bases, rings, or badges. diff --git a/src/assets/images/units/unit-wu-officer-river-actions.png b/src/assets/images/units/unit-wu-officer-river-actions.png index b24ae27..3436821 100644 Binary files a/src/assets/images/units/unit-wu-officer-river-actions.png and b/src/assets/images/units/unit-wu-officer-river-actions.png differ diff --git a/src/assets/images/units/unit-wu-officer-river.png b/src/assets/images/units/unit-wu-officer-river.png index f91795c..15b5253 100644 Binary files a/src/assets/images/units/unit-wu-officer-river.png and b/src/assets/images/units/unit-wu-officer-river.png differ