diff --git a/docs/handpaint-batch7-cao-cao-source-v1.png b/docs/handpaint-batch7-cao-cao-source-v1.png new file mode 100644 index 0000000..1c11582 Binary files /dev/null and b/docs/handpaint-batch7-cao-cao-source-v1.png differ diff --git a/docs/handpaint-batch7-cao-cao-v2-animation.gif b/docs/handpaint-batch7-cao-cao-v2-animation.gif new file mode 100644 index 0000000..129af55 Binary files /dev/null and b/docs/handpaint-batch7-cao-cao-v2-animation.gif differ diff --git a/docs/handpaint-batch7-cao-cao-v2-battle-composite.png b/docs/handpaint-batch7-cao-cao-v2-battle-composite.png new file mode 100644 index 0000000..c88cfcb Binary files /dev/null and b/docs/handpaint-batch7-cao-cao-v2-battle-composite.png differ diff --git a/docs/handpaint-batch7-cao-cao-v2-before-after.png b/docs/handpaint-batch7-cao-cao-v2-before-after.png new file mode 100644 index 0000000..6303e06 Binary files /dev/null and b/docs/handpaint-batch7-cao-cao-v2-before-after.png differ diff --git a/docs/handpaint-batch7-cao-cao-v2-contact.png b/docs/handpaint-batch7-cao-cao-v2-contact.png new file mode 100644 index 0000000..c29616b Binary files /dev/null and b/docs/handpaint-batch7-cao-cao-v2-contact.png differ diff --git a/docs/handpaint-batch7-cao-cao-v2-debug-preview-battle-check.png b/docs/handpaint-batch7-cao-cao-v2-debug-preview-battle-check.png new file mode 100644 index 0000000..a4edf11 Binary files /dev/null and b/docs/handpaint-batch7-cao-cao-v2-debug-preview-battle-check.png differ diff --git a/docs/handpaint-batch7-cao-cao-v2-report.md b/docs/handpaint-batch7-cao-cao-v2-report.md new file mode 100644 index 0000000..60ea38d --- /dev/null +++ b/docs/handpaint-batch7-cao-cao-v2-report.md @@ -0,0 +1,24 @@ +# Cao Cao Handpainted Sprite v2 + +- source: `handpaint-batch7-cao-cao-source-v1.png` +- base status: ok +- action status: ok +- base partial alpha: 0, opaque pixels: 2319008 +- action partial alpha: 0, opaque pixels: 5617892 +- base frame border hits: 0 +- action frame border hits: 0 +- base empty frames: 0 +- action empty frames: 0 +- base bbox width range: 206..228 +- base bbox height range: 290..296 +- base bottom range: 303..303 +- action bbox width range: 186..252 +- action bbox height range: 270..296 +- action bottom range: 303..303 +- contact: `handpaint-batch7-cao-cao-v2-contact.png` +- animation: `handpaint-batch7-cao-cao-v2-animation.gif` +- before/after: `handpaint-batch7-cao-cao-v2-before-after.png` +- scale compare: `handpaint-batch7-cao-cao-v2-scale-compare.png` +- battle composite: `handpaint-batch7-cao-cao-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-batch7-cao-cao-v2-scale-compare.png b/docs/handpaint-batch7-cao-cao-v2-scale-compare.png new file mode 100644 index 0000000..0c1eb92 Binary files /dev/null and b/docs/handpaint-batch7-cao-cao-v2-scale-compare.png differ diff --git a/docs/unit-sprite-art-quality-gate.md b/docs/unit-sprite-art-quality-gate.md index cb16feb..a99b419 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: 72 +- Approved baseline units: 73 - Pending approval units: 0 -- Queued rework units: 19 +- Queued rework units: 18 ## Checked Rules diff --git a/docs/unit-sprite-batch-queue.json b/docs/unit-sprite-batch-queue.json index 623db41..fb3daf5 100644 --- a/docs/unit-sprite-batch-queue.json +++ b/docs/unit-sprite-batch-queue.json @@ -3,6 +3,7 @@ "manifest": "docs/unit-sprite-rework-manifest.json", "audit": "docs/unit-sprite-rework-audit.json", "approvedBaseline": [ + "unit-cao-cao", "unit-guan-yu", "unit-liu-bei", "unit-meng-huo", @@ -79,8 +80,8 @@ "pendingApproval": [], "nextAfterApproval": [], "stageCounts": { - "approved-baseline": 72, - "queued-rework": 19 + "approved-baseline": 73, + "queued-rework": 18 }, "batches": [ { @@ -1166,23 +1167,10 @@ "label": "Batch 7 unique officers", "total": 19, "stageCounts": { - "queued-rework": 19 + "approved-baseline": 1, + "queued-rework": 18 }, "units": [ - { - "stem": "unit-cao-cao", - "reviewStage": "queued-rework", - "queueRole": "queued rework", - "baseStatus": "border-hits=64", - "actionStatus": "border-hits=144", - "battleBasePx": [ - 33.2, - 43.3, - 45.0, - 46.0 - ], - "spec": null - }, { "stem": "unit-fa-zheng", "reviewStage": "queued-rework", @@ -1434,6 +1422,20 @@ 44.9 ], "spec": null + }, + { + "stem": "unit-cao-cao", + "reviewStage": "approved-baseline", + "queueRole": "approved reference", + "baseStatus": "ok", + "actionStatus": "ok", + "battleBasePx": [ + 32.9, + 36.4, + 46.3, + 47.3 + ], + "spec": null } ] } diff --git a/docs/unit-sprite-batch-queue.md b/docs/unit-sprite-batch-queue.md index e5c77f4..7ffbcd3 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: 72 +- Approved baseline units: 73 - Pending approval units: 0 -- Queued rework units: 19 +- Queued rework units: 18 - Manifest: `docs/unit-sprite-rework-manifest.json` - Audit: `docs/unit-sprite-rework-audit.json` @@ -157,11 +157,10 @@ No next unit is currently defined. - Batch key: `batch7-unique-officer` - Total units: 19 -- Stage counts: queued-rework 19 +- Stage counts: approved-baseline 1, queued-rework 18 | unit | role | stage | status | battle base px | spec | | --- | --- | --- | --- | --- | --- | -| `unit-cao-cao` | queued rework | queued-rework | base border-hits=64; actions border-hits=144 | 33.2..43.3 x 45.0..46.0 | | | `unit-fa-zheng` | queued rework | queued-rework | base border-hits=32; actions border-hits=98 | 38.8..39.3 x 44.7..44.9 | | | `unit-gong-zhi` | queued rework | queued-rework | base border-hits=32; actions border-hits=82 | 31.9..40.6 x 44.6..44.6 | | | `unit-huang-quan` | queued rework | queued-rework | base border-hits=32; actions border-hits=82 | 31.9..40.6 x 44.6..44.6 | | @@ -180,3 +179,4 @@ No next unit is currently defined. | `unit-yi-ji` | queued rework | queued-rework | base border-hits=32; actions border-hits=98 | 38.8..39.3 x 44.7..44.9 | | | `unit-zhao-yun` | queued rework | queued-rework | base border-hits=64; actions border-hits=144 | 26.5..47.3 x 45.0..46.0 | | | `unit-zhuge-liang` | queued rework | queued-rework | base border-hits=32; actions border-hits=98 | 38.8..39.3 x 44.7..44.9 | | +| `unit-cao-cao` | approved reference | approved-baseline | technical ok | 32.9..36.4 x 46.3..47.3 | | diff --git a/docs/unit-sprite-cao-cao-v2-approval-packet.md b/docs/unit-sprite-cao-cao-v2-approval-packet.md new file mode 100644 index 0000000..d6de67f --- /dev/null +++ b/docs/unit-sprite-cao-cao-v2-approval-packet.md @@ -0,0 +1,37 @@ +# Cao Cao v2 Approval Packet + +- status: approved during continuous production run +- unit: `unit-cao-cao` +- source art: `handpaint-batch7-cao-cao-source-v1.png` +- contact sheet: `handpaint-batch7-cao-cao-v2-contact.png` +- animation GIF: `handpaint-batch7-cao-cao-v2-animation.gif` +- before/after: `handpaint-batch7-cao-cao-v2-before-after.png` +- scale compare: `handpaint-batch7-cao-cao-v2-scale-compare.png` +- battle composite: `handpaint-batch7-cao-cao-v2-battle-composite.png` +- browser check: `handpaint-batch7-cao-cao-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-cao-cao&v=cao-cao-v2` + +## Visual Decision + +Approved for the continuous batch run. v2 reads as Cao Cao through dark iron armor, gold trim, a crimson cloak, and a compact command-sword silhouette. It is visually heavier than the generic Wei officer without borrowing Liu Bei's yellow robe, Guan Yu's polearm shape, or Zhang Fei's broad red-brown brawler profile. + +## 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: 32.9..36.4 x 46.3..47.3 +- action battle scale from audit: 29.7..40.3 x 43.1..47.3 +- local build: passed +- Local browser console errors: `0` +- Local browser 404s: `0` + +## Notes + +v1 was rejected because the battle-scale body width was too narrow for a boss unit. v2 keeps the same source art but widens the assembled silhouette so the cloak and sword read clearly inside the 50px tactical tile. diff --git a/docs/unit-sprite-current-approval-board.png b/docs/unit-sprite-current-approval-board.png index e2b08fb..1cbd934 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 eb3391a..551b511 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: 72 +- Approved baseline units: 73 - Pending approval units: 0 -- Queued rework units: 19 +- Queued rework units: 18 - 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 599dccc..9e504fe 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-batch7-unique-officer.png b/docs/unit-sprite-review-batch7-unique-officer.png index 869f7fd..2c2d7d5 100644 Binary files a/docs/unit-sprite-review-batch7-unique-officer.png and b/docs/unit-sprite-review-batch7-unique-officer.png differ diff --git a/docs/unit-sprite-review-index.png b/docs/unit-sprite-review-index.png index eda1654..b214d3f 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 f636752..216daa6 100644 --- a/docs/unit-sprite-rework-audit.json +++ b/docs/unit-sprite-rework-audit.json @@ -11,13 +11,13 @@ "batch7-unique-officer": 19 }, "stage_counts": { - "approved-baseline": 72, - "queued-rework": 19 + "approved-baseline": 73, + "queued-rework": 18 }, "rows": [ { "batch": "batch7-unique-officer", - "review_stage": "queued-rework", + "review_stage": "approved-baseline", "stem": "unit-cao-cao", "base": { "key": "unit-cao-cao", @@ -27,23 +27,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 2291395, - "border_hits": 64, - "min_width": 208, - "max_width": 271, - "min_height": 282, - "max_height": 288, - "min_bottom": 281, - "max_bottom": 287, + "opaque_pixels": 2319008, + "border_hits": 0, + "min_width": 206, + "max_width": 228, + "min_height": 290, + "max_height": 296, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 63, + "width_swing": 22, "height_swing": 6, - "bottom_swing": 6, - "battle_min_width_px": 33.2, - "battle_max_width_px": 43.3, - "battle_min_height_px": 45.0, - "battle_max_height_px": 46.0, - "status": "border-hits=64" + "bottom_swing": 0, + "battle_min_width_px": 32.9, + "battle_max_width_px": 36.4, + "battle_min_height_px": 46.3, + "battle_max_height_px": 47.3, + "status": "ok" }, "actions": { "key": "unit-cao-cao-actions", @@ -53,23 +53,23 @@ 1252 ], "partial_alpha": 0, - "opaque_pixels": 5125963, - "border_hits": 144, - "min_width": 208, - "max_width": 280, - "min_height": 275, - "max_height": 290, - "min_bottom": 274, - "max_bottom": 289, + "opaque_pixels": 5617892, + "border_hits": 0, + "min_width": 186, + "max_width": 252, + "min_height": 270, + "max_height": 296, + "min_bottom": 303, + "max_bottom": 303, "empty_frames": 0, - "width_swing": 72, - "height_swing": 15, - "bottom_swing": 15, - "battle_min_width_px": 33.2, - "battle_max_width_px": 44.7, - "battle_min_height_px": 43.9, - "battle_max_height_px": 46.3, - "status": "border-hits=144" + "width_swing": 66, + "height_swing": 26, + "bottom_swing": 0, + "battle_min_width_px": 29.7, + "battle_max_width_px": 40.3, + "battle_min_height_px": 43.1, + "battle_max_height_px": 47.3, + "status": "ok" } }, { diff --git a/docs/unit-sprite-rework-audit.md b/docs/unit-sprite-rework-audit.md index acb1535..c482abd 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: 72 -- queued-rework: 19 +- approved-baseline: 73 +- queued-rework: 18 ## Batch Plan @@ -52,7 +52,7 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards. | batch | stage | stem | base | actions | base bbox | action bbox | battle base px | motion swing | | --- | --- | --- | --- | --- | --- | --- | --- | --- | -| batch7-unique-officer | queued-rework | `unit-cao-cao` | border-hits=64 | border-hits=144 | 208..271 x 282..288 | 208..280 x 275..290 | 33.2..43.3 x 45.0..46.0 | w63 h6 b6 | +| batch7-unique-officer | approved-baseline | `unit-cao-cao` | ok | ok | 206..228 x 290..296 | 186..252 x 270..296 | 32.9..36.4 x 46.3..47.3 | w22 h6 b0 | | batch7-unique-officer | queued-rework | `unit-fa-zheng` | 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-gong-zhi` | 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 | | batch1-approved-core | approved-baseline | `unit-guan-yu` | ok | ok | 190..270 x 276..291 | 172..296 x 171..289 | 30.4..43.1 x 44.1..46.5 | w80 h15 b4 | diff --git a/docs/unit-sprite-rework-manifest.json b/docs/unit-sprite-rework-manifest.json index a4a1d44..280ff5d 100644 --- a/docs/unit-sprite-rework-manifest.json +++ b/docs/unit-sprite-rework-manifest.json @@ -11,6 +11,7 @@ ] }, "approvedBaseline": [ + "unit-cao-cao", "unit-guan-yu", "unit-liu-bei", "unit-meng-huo", diff --git a/src/assets/images/units/unit-cao-cao-actions.png b/src/assets/images/units/unit-cao-cao-actions.png index 4c81823..5935133 100644 Binary files a/src/assets/images/units/unit-cao-cao-actions.png and b/src/assets/images/units/unit-cao-cao-actions.png differ diff --git a/src/assets/images/units/unit-cao-cao.png b/src/assets/images/units/unit-cao-cao.png index e6c6fe9..39c97eb 100644 Binary files a/src/assets/images/units/unit-cao-cao.png and b/src/assets/images/units/unit-cao-cao.png differ