Approve Fa Zheng handpainted sprite v2
BIN
docs/handpaint-batch7-fa-zheng-source-v1.png
Normal file
|
After Width: | Height: | Size: 2.1 MiB |
BIN
docs/handpaint-batch7-fa-zheng-v2-animation.gif
Normal file
|
After Width: | Height: | Size: 224 KiB |
BIN
docs/handpaint-batch7-fa-zheng-v2-battle-composite.png
Normal file
|
After Width: | Height: | Size: 887 KiB |
BIN
docs/handpaint-batch7-fa-zheng-v2-before-after.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
docs/handpaint-batch7-fa-zheng-v2-contact.png
Normal file
|
After Width: | Height: | Size: 204 KiB |
BIN
docs/handpaint-batch7-fa-zheng-v2-debug-preview-battle-check.png
Normal file
|
After Width: | Height: | Size: 687 KiB |
24
docs/handpaint-batch7-fa-zheng-v2-report.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Fa Zheng Handpainted Sprite v2
|
||||||
|
|
||||||
|
- source: `handpaint-batch7-fa-zheng-source-v1.png`
|
||||||
|
- base status: ok
|
||||||
|
- action status: ok
|
||||||
|
- base partial alpha: 0, opaque pixels: 2296062
|
||||||
|
- action partial alpha: 0, opaque pixels: 5507911
|
||||||
|
- base frame border hits: 0
|
||||||
|
- action frame border hits: 0
|
||||||
|
- base empty frames: 0
|
||||||
|
- action empty frames: 0
|
||||||
|
- base bbox width range: 182..221
|
||||||
|
- base bbox height range: 290..290
|
||||||
|
- base bottom range: 303..303
|
||||||
|
- action bbox width range: 183..244
|
||||||
|
- action bbox height range: 270..290
|
||||||
|
- action bottom range: 303..303
|
||||||
|
- contact: `handpaint-batch7-fa-zheng-v2-contact.png`
|
||||||
|
- animation: `handpaint-batch7-fa-zheng-v2-animation.gif`
|
||||||
|
- before/after: `handpaint-batch7-fa-zheng-v2-before-after.png`
|
||||||
|
- scale compare: `handpaint-batch7-fa-zheng-v2-scale-compare.png`
|
||||||
|
- battle composite: `handpaint-batch7-fa-zheng-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
|
||||||
BIN
docs/handpaint-batch7-fa-zheng-v2-scale-compare.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
@@ -6,9 +6,9 @@ This gate catches obvious sprite-art failures before user approval. It does not
|
|||||||
|
|
||||||
- Manifest: `docs/unit-sprite-rework-manifest.json`
|
- Manifest: `docs/unit-sprite-rework-manifest.json`
|
||||||
- Audit: `docs/unit-sprite-rework-audit.json`
|
- Audit: `docs/unit-sprite-rework-audit.json`
|
||||||
- Approved baseline units: 73
|
- Approved baseline units: 74
|
||||||
- Pending approval units: 0
|
- Pending approval units: 0
|
||||||
- Queued rework units: 18
|
- Queued rework units: 17
|
||||||
|
|
||||||
## Checked Rules
|
## Checked Rules
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
"audit": "docs/unit-sprite-rework-audit.json",
|
"audit": "docs/unit-sprite-rework-audit.json",
|
||||||
"approvedBaseline": [
|
"approvedBaseline": [
|
||||||
"unit-cao-cao",
|
"unit-cao-cao",
|
||||||
|
"unit-fa-zheng",
|
||||||
"unit-guan-yu",
|
"unit-guan-yu",
|
||||||
"unit-liu-bei",
|
"unit-liu-bei",
|
||||||
"unit-meng-huo",
|
"unit-meng-huo",
|
||||||
@@ -80,8 +81,8 @@
|
|||||||
"pendingApproval": [],
|
"pendingApproval": [],
|
||||||
"nextAfterApproval": [],
|
"nextAfterApproval": [],
|
||||||
"stageCounts": {
|
"stageCounts": {
|
||||||
"approved-baseline": 73,
|
"approved-baseline": 74,
|
||||||
"queued-rework": 18
|
"queued-rework": 17
|
||||||
},
|
},
|
||||||
"batches": [
|
"batches": [
|
||||||
{
|
{
|
||||||
@@ -1167,24 +1168,10 @@
|
|||||||
"label": "Batch 7 unique officers",
|
"label": "Batch 7 unique officers",
|
||||||
"total": 19,
|
"total": 19,
|
||||||
"stageCounts": {
|
"stageCounts": {
|
||||||
"approved-baseline": 1,
|
"approved-baseline": 2,
|
||||||
"queued-rework": 18
|
"queued-rework": 17
|
||||||
},
|
},
|
||||||
"units": [
|
"units": [
|
||||||
{
|
|
||||||
"stem": "unit-fa-zheng",
|
|
||||||
"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-gong-zhi",
|
"stem": "unit-gong-zhi",
|
||||||
"reviewStage": "queued-rework",
|
"reviewStage": "queued-rework",
|
||||||
@@ -1436,6 +1423,20 @@
|
|||||||
47.3
|
47.3
|
||||||
],
|
],
|
||||||
"spec": null
|
"spec": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"stem": "unit-fa-zheng",
|
||||||
|
"reviewStage": "approved-baseline",
|
||||||
|
"queueRole": "approved reference",
|
||||||
|
"baseStatus": "ok",
|
||||||
|
"actionStatus": "ok",
|
||||||
|
"battleBasePx": [
|
||||||
|
29.1,
|
||||||
|
35.3,
|
||||||
|
46.3,
|
||||||
|
46.3
|
||||||
|
],
|
||||||
|
"spec": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,9 +6,9 @@ Use this as the long-running queue for the full hand-painted sprite rework. It i
|
|||||||
|
|
||||||
## Current State
|
## Current State
|
||||||
|
|
||||||
- Approved baseline units: 73
|
- Approved baseline units: 74
|
||||||
- Pending approval units: 0
|
- Pending approval units: 0
|
||||||
- Queued rework units: 18
|
- Queued rework units: 17
|
||||||
- Manifest: `docs/unit-sprite-rework-manifest.json`
|
- Manifest: `docs/unit-sprite-rework-manifest.json`
|
||||||
- Audit: `docs/unit-sprite-rework-audit.json`
|
- Audit: `docs/unit-sprite-rework-audit.json`
|
||||||
|
|
||||||
@@ -157,11 +157,10 @@ No next unit is currently defined.
|
|||||||
|
|
||||||
- Batch key: `batch7-unique-officer`
|
- Batch key: `batch7-unique-officer`
|
||||||
- Total units: 19
|
- Total units: 19
|
||||||
- Stage counts: approved-baseline 1, queued-rework 18
|
- Stage counts: approved-baseline 2, queued-rework 17
|
||||||
|
|
||||||
| unit | role | stage | status | battle base px | spec |
|
| unit | role | stage | status | battle base px | spec |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| `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-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 | |
|
| `unit-huang-quan` | queued rework | queued-rework | base border-hits=32; actions border-hits=82 | 31.9..40.6 x 44.6..44.6 | |
|
||||||
| `unit-huang-zhong` | queued rework | queued-rework | base border-hits=64; actions border-hits=140 | 39.1..39.3 x 44.6..44.6 | |
|
| `unit-huang-zhong` | queued rework | queued-rework | base border-hits=64; actions border-hits=140 | 39.1..39.3 x 44.6..44.6 | |
|
||||||
@@ -180,3 +179,4 @@ No next unit is currently defined.
|
|||||||
| `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-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-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 | |
|
| `unit-cao-cao` | approved reference | approved-baseline | technical ok | 32.9..36.4 x 46.3..47.3 | |
|
||||||
|
| `unit-fa-zheng` | approved reference | approved-baseline | technical ok | 29.1..35.3 x 46.3..46.3 | |
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 362 KiB After Width: | Height: | Size: 352 KiB |
37
docs/unit-sprite-fa-zheng-v2-approval-packet.md
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# Fa Zheng v2 Approval Packet
|
||||||
|
|
||||||
|
- status: approved during continuous production run
|
||||||
|
- unit: `unit-fa-zheng`
|
||||||
|
- source art: `handpaint-batch7-fa-zheng-source-v1.png`
|
||||||
|
- contact sheet: `handpaint-batch7-fa-zheng-v2-contact.png`
|
||||||
|
- animation GIF: `handpaint-batch7-fa-zheng-v2-animation.gif`
|
||||||
|
- before/after: `handpaint-batch7-fa-zheng-v2-before-after.png`
|
||||||
|
- scale compare: `handpaint-batch7-fa-zheng-v2-scale-compare.png`
|
||||||
|
- battle composite: `handpaint-batch7-fa-zheng-v2-battle-composite.png`
|
||||||
|
- browser check: `handpaint-batch7-fa-zheng-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-fa-zheng&v=fa-zheng-v2`
|
||||||
|
|
||||||
|
## Visual Decision
|
||||||
|
|
||||||
|
Approved for the continuous batch run. v2 reads as Fa Zheng through the dark teal Yizhou official robe, black scholar hat, war fan, and bamboo-slip command poses. The silhouette is practical and severe rather than elegant, keeping him distinct from Zhuge Liang while still clearly belonging to the strategist class.
|
||||||
|
|
||||||
|
## 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: 29.1..35.3 x 46.3..46.3
|
||||||
|
- action battle scale from audit: 29.2..39.0 x 43.1..46.3
|
||||||
|
- local build: passed
|
||||||
|
- Local browser console errors: `0`
|
||||||
|
- Local browser 404s: `0`
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
v1 was rejected because the idle body read too narrow at battle scale. v2 widens the robe and sleeve mass while keeping the strategist posture restrained, so the unit remains readable without becoming a front-line officer.
|
||||||
@@ -4,9 +4,9 @@ This file is generated by `scripts/write-unit-sprite-next-steps.py`.
|
|||||||
|
|
||||||
## Current Gate
|
## Current Gate
|
||||||
|
|
||||||
- Approved baseline units: 73
|
- Approved baseline units: 74
|
||||||
- Pending approval units: 0
|
- Pending approval units: 0
|
||||||
- Queued rework units: 18
|
- Queued rework units: 17
|
||||||
- Manifest: `docs/unit-sprite-rework-manifest.json`
|
- Manifest: `docs/unit-sprite-rework-manifest.json`
|
||||||
- Audit: `docs/unit-sprite-rework-audit.json`
|
- Audit: `docs/unit-sprite-rework-audit.json`
|
||||||
- Current approval board: not generated until the next pending sample.
|
- Current approval board: not generated until the next pending sample.
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 687 KiB After Width: | Height: | Size: 695 KiB |
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 97 KiB After Width: | Height: | Size: 97 KiB |
@@ -11,8 +11,8 @@
|
|||||||
"batch7-unique-officer": 19
|
"batch7-unique-officer": 19
|
||||||
},
|
},
|
||||||
"stage_counts": {
|
"stage_counts": {
|
||||||
"approved-baseline": 73,
|
"approved-baseline": 74,
|
||||||
"queued-rework": 18
|
"queued-rework": 17
|
||||||
},
|
},
|
||||||
"rows": [
|
"rows": [
|
||||||
{
|
{
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"batch": "batch7-unique-officer",
|
"batch": "batch7-unique-officer",
|
||||||
"review_stage": "queued-rework",
|
"review_stage": "approved-baseline",
|
||||||
"stem": "unit-fa-zheng",
|
"stem": "unit-fa-zheng",
|
||||||
"base": {
|
"base": {
|
||||||
"key": "unit-fa-zheng",
|
"key": "unit-fa-zheng",
|
||||||
@@ -84,23 +84,23 @@
|
|||||||
1252
|
1252
|
||||||
],
|
],
|
||||||
"partial_alpha": 0,
|
"partial_alpha": 0,
|
||||||
"opaque_pixels": 1999925,
|
"opaque_pixels": 2296062,
|
||||||
"border_hits": 32,
|
"border_hits": 0,
|
||||||
"min_width": 243,
|
"min_width": 182,
|
||||||
"max_width": 246,
|
"max_width": 221,
|
||||||
"min_height": 280,
|
"min_height": 290,
|
||||||
"max_height": 281,
|
"max_height": 290,
|
||||||
"min_bottom": 281,
|
"min_bottom": 303,
|
||||||
"max_bottom": 287,
|
"max_bottom": 303,
|
||||||
"empty_frames": 0,
|
"empty_frames": 0,
|
||||||
"width_swing": 3,
|
"width_swing": 39,
|
||||||
"height_swing": 1,
|
"height_swing": 0,
|
||||||
"bottom_swing": 6,
|
"bottom_swing": 0,
|
||||||
"battle_min_width_px": 38.8,
|
"battle_min_width_px": 29.1,
|
||||||
"battle_max_width_px": 39.3,
|
"battle_max_width_px": 35.3,
|
||||||
"battle_min_height_px": 44.7,
|
"battle_min_height_px": 46.3,
|
||||||
"battle_max_height_px": 44.9,
|
"battle_max_height_px": 46.3,
|
||||||
"status": "border-hits=32"
|
"status": "ok"
|
||||||
},
|
},
|
||||||
"actions": {
|
"actions": {
|
||||||
"key": "unit-fa-zheng-actions",
|
"key": "unit-fa-zheng-actions",
|
||||||
@@ -110,23 +110,23 @@
|
|||||||
1252
|
1252
|
||||||
],
|
],
|
||||||
"partial_alpha": 0,
|
"partial_alpha": 0,
|
||||||
"opaque_pixels": 4453376,
|
"opaque_pixels": 5507911,
|
||||||
"border_hits": 98,
|
"border_hits": 0,
|
||||||
"min_width": 220,
|
"min_width": 183,
|
||||||
"max_width": 255,
|
"max_width": 244,
|
||||||
"min_height": 275,
|
"min_height": 270,
|
||||||
"max_height": 281,
|
"max_height": 290,
|
||||||
"min_bottom": 274,
|
"min_bottom": 303,
|
||||||
"max_bottom": 289,
|
"max_bottom": 303,
|
||||||
"empty_frames": 0,
|
"empty_frames": 0,
|
||||||
"width_swing": 35,
|
"width_swing": 61,
|
||||||
"height_swing": 6,
|
"height_swing": 20,
|
||||||
"bottom_swing": 15,
|
"bottom_swing": 0,
|
||||||
"battle_min_width_px": 35.1,
|
"battle_min_width_px": 29.2,
|
||||||
"battle_max_width_px": 40.7,
|
"battle_max_width_px": 39.0,
|
||||||
"battle_min_height_px": 43.9,
|
"battle_min_height_px": 43.1,
|
||||||
"battle_max_height_px": 44.9,
|
"battle_max_height_px": 46.3,
|
||||||
"status": "border-hits=98"
|
"status": "ok"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards.
|
|||||||
|
|
||||||
## Review Stage Counts
|
## Review Stage Counts
|
||||||
|
|
||||||
- approved-baseline: 73
|
- approved-baseline: 74
|
||||||
- queued-rework: 18
|
- queued-rework: 17
|
||||||
|
|
||||||
## Batch Plan
|
## Batch Plan
|
||||||
|
|
||||||
@@ -53,7 +53,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 |
|
| batch | stage | stem | base | actions | base bbox | action bbox | battle base px | motion swing |
|
||||||
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
|
||||||
| 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 | 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 | approved-baseline | `unit-fa-zheng` | ok | ok | 182..221 x 290..290 | 183..244 x 270..290 | 29.1..35.3 x 46.3..46.3 | w39 h0 b0 |
|
||||||
| 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 |
|
| 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 |
|
| 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 |
|
||||||
| batch7-unique-officer | queued-rework | `unit-huang-quan` | 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 |
|
| batch7-unique-officer | queued-rework | `unit-huang-quan` | 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 |
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
},
|
},
|
||||||
"approvedBaseline": [
|
"approvedBaseline": [
|
||||||
"unit-cao-cao",
|
"unit-cao-cao",
|
||||||
|
"unit-fa-zheng",
|
||||||
"unit-guan-yu",
|
"unit-guan-yu",
|
||||||
"unit-liu-bei",
|
"unit-liu-bei",
|
||||||
"unit-meng-huo",
|
"unit-meng-huo",
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.4 MiB After Width: | Height: | Size: 3.3 MiB |
|
Before Width: | Height: | Size: 598 KiB After Width: | Height: | Size: 997 KiB |