Approve Nanman infantry handpainted sprite v1

This commit is contained in:
2026-07-01 17:14:27 +09:00
parent 0dfc6228dd
commit cf7f2f0cd9
20 changed files with 119 additions and 52 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 886 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 140 KiB

View File

@@ -0,0 +1,24 @@
# Nanman Infantry Hand-Painted v1
- source: `handpaint-batch6-nanman-infantry-source-v1.png`
- base status: ok
- action status: ok
- base partial alpha: 0, opaque pixels: 1837668
- action partial alpha: 0, opaque pixels: 4558579
- base frame border hits: 0
- action frame border hits: 0
- base empty frames: 0
- action empty frames: 0
- base bbox width range: 152..219
- base bbox height range: 288..288
- base bottom range: 303..303
- action bbox width range: 152..243
- action bbox height range: 265..288
- action bottom range: 303..303
- contact: `handpaint-batch6-nanman-infantry-v1-contact.png`
- animation: `handpaint-batch6-nanman-infantry-v1-animation.gif`
- before/after: `handpaint-batch6-nanman-infantry-v1-before-after.png`
- scale compare: `handpaint-batch6-nanman-infantry-v1-scale-compare.png`
- battle composite: `handpaint-batch6-nanman-infantry-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

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -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: 29 - Approved baseline units: 30
- Pending approval units: 0 - Pending approval units: 0
- Queued rework units: 62 - Queued rework units: 61
## Checked Rules ## Checked Rules

Binary file not shown.

Before

Width:  |  Height:  |  Size: 684 KiB

After

Width:  |  Height:  |  Size: 658 KiB

View File

@@ -0,0 +1,44 @@
# Nanman Infantry v1 Approval Packet
- unit: `unit-nanman-infantry`
- version: `v1`
- source: `docs/handpaint-batch6-nanman-infantry-source-v1.png`
- contact sheet: `docs/handpaint-batch6-nanman-infantry-v1-contact.png`
- animation: `docs/handpaint-batch6-nanman-infantry-v1-animation.gif`
- battle preview: `docs/handpaint-batch6-nanman-infantry-v1-debug-preview-battle-check.png`
- before/after: `docs/handpaint-batch6-nanman-infantry-v1-before-after.png`
- scale compare: `docs/handpaint-batch6-nanman-infantry-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
- regular Nanman infantry identity: pass
- shield/short-weapon silhouette: pass
- visibly less ornate than Meng Huo: 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-nanman-infantry&v=nanman-infantry-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: `152..219`
- base bbox height range: `288..288`
- base bottom range: `303..303`
- action bbox width range: `152..243`
- action bbox height range: `265..288`
- action bottom range: `303..303`
## Notes
The v1 sheet carries the Nanman palette and shield shape from the Meng Huo anchor, but keeps the armor and stance simpler so the unit reads as regular infantry.

View File

@@ -4,9 +4,9 @@ This file is generated by `scripts/write-unit-sprite-next-steps.py`.
## Current Gate ## Current Gate
- Approved baseline units: 29 - Approved baseline units: 30
- Pending approval units: 0 - Pending approval units: 0
- Queued rework units: 62 - Queued rework units: 61
- 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.
@@ -14,15 +14,14 @@ This file is generated by `scripts/write-unit-sprite-next-steps.py`.
## Next Unit Queue ## Next Unit Queue
1. `unit-nanman-infantry` - queued-rework, base `border-hits=32`, actions `border-hits=82` 1. `unit-nanman-infantry-jungle` - queued-rework, base `border-hits=32`, actions `border-hits=82`
2. `unit-nanman-infantry-jungle` - queued-rework, base `border-hits=32`, actions `border-hits=82` 2. `unit-nanman-infantry-spear` - queued-rework, base `border-hits=32`, actions `border-hits=82`
3. `unit-nanman-infantry-spear` - queued-rework, base `border-hits=32`, actions `border-hits=82` 3. `unit-nanman-officer` - queued-rework, base `border-hits=32`, actions `border-hits=82`
4. `unit-nanman-officer` - queued-rework, base `border-hits=32`, actions `border-hits=82` 4. `unit-nanman-officer-bronze` - queued-rework, base `border-hits=64`, actions `border-hits=144`
5. `unit-nanman-officer-bronze` - queued-rework, base `border-hits=64`, actions `border-hits=144` 5. `unit-nanman-officer-warlord` - queued-rework, base `border-hits=64`, actions `border-hits=144`
6. `unit-nanman-officer-warlord` - queued-rework, base `border-hits=64`, actions `border-hits=144` 6. `unit-nanman-shaman` - queued-rework, base `border-hits=32`, actions `border-hits=98`
7. `unit-nanman-shaman` - queued-rework, base `border-hits=32`, actions `border-hits=98` 7. `unit-nanman-shaman-ember` - queued-rework, base `border-hits=32`, actions `border-hits=98`
8. `unit-nanman-shaman-ember` - queued-rework, base `border-hits=32`, actions `border-hits=98` 8. `unit-nanman-shaman-storm` - queued-rework, base `border-hits=32`, actions `border-hits=98`
9. `unit-nanman-shaman-storm` - queued-rework, base `border-hits=32`, actions `border-hits=98`
## Commands Before Approval ## Commands Before Approval
@@ -49,5 +48,5 @@ pnpm build
## First Task After Current Approval ## First Task After Current Approval
- Start with `unit-nanman-infantry`. - Start with `unit-nanman-infantry-jungle`.
- Generate source art, assemble sheets, produce contact/GIF/before-after/scale/battle screenshots, then rerun the gates. - Generate source art, assemble sheets, produce contact/GIF/before-after/scale/battle screenshots, then rerun the gates.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 272 KiB

After

Width:  |  Height:  |  Size: 281 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

View File

@@ -11,8 +11,8 @@
"batch7-unique-officer": 19 "batch7-unique-officer": 19
}, },
"stage_counts": { "stage_counts": {
"approved-baseline": 29, "approved-baseline": 30,
"queued-rework": 62 "queued-rework": 61
}, },
"rows": [ "rows": [
{ {
@@ -872,7 +872,7 @@
}, },
{ {
"batch": "batch6-nanman-special", "batch": "batch6-nanman-special",
"review_stage": "queued-rework", "review_stage": "approved-baseline",
"stem": "unit-nanman-infantry", "stem": "unit-nanman-infantry",
"base": { "base": {
"key": "unit-nanman-infantry", "key": "unit-nanman-infantry",
@@ -882,23 +882,23 @@
1252 1252
], ],
"partial_alpha": 0, "partial_alpha": 0,
"opaque_pixels": 2055128, "opaque_pixels": 1837668,
"border_hits": 32, "border_hits": 0,
"min_width": 192, "min_width": 152,
"max_width": 277, "max_width": 219,
"min_height": 279, "min_height": 288,
"max_height": 279, "max_height": 288,
"min_bottom": 281, "min_bottom": 303,
"max_bottom": 287, "max_bottom": 303,
"empty_frames": 0, "empty_frames": 0,
"width_swing": 85, "width_swing": 67,
"height_swing": 0, "height_swing": 0,
"bottom_swing": 6, "bottom_swing": 0,
"battle_min_width_px": 30.7, "battle_min_width_px": 24.3,
"battle_max_width_px": 44.2, "battle_max_width_px": 35.0,
"battle_min_height_px": 44.6, "battle_min_height_px": 46.0,
"battle_max_height_px": 44.6, "battle_max_height_px": 46.0,
"status": "border-hits=32" "status": "ok"
}, },
"actions": { "actions": {
"key": "unit-nanman-infantry-actions", "key": "unit-nanman-infantry-actions",
@@ -908,23 +908,23 @@
1252 1252
], ],
"partial_alpha": 0, "partial_alpha": 0,
"opaque_pixels": 4610202, "opaque_pixels": 4558579,
"border_hits": 82, "border_hits": 0,
"min_width": 192, "min_width": 152,
"max_width": 286, "max_width": 243,
"min_height": 275, "min_height": 265,
"max_height": 279, "max_height": 288,
"min_bottom": 274, "min_bottom": 303,
"max_bottom": 289, "max_bottom": 303,
"empty_frames": 0, "empty_frames": 0,
"width_swing": 94, "width_swing": 91,
"height_swing": 4, "height_swing": 23,
"bottom_swing": 15, "bottom_swing": 0,
"battle_min_width_px": 30.7, "battle_min_width_px": 24.3,
"battle_max_width_px": 45.7, "battle_max_width_px": 38.8,
"battle_min_height_px": 43.9, "battle_min_height_px": 42.3,
"battle_max_height_px": 44.6, "battle_max_height_px": 46.0,
"status": "border-hits=82" "status": "ok"
} }
}, },
{ {

View File

@@ -29,8 +29,8 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards.
## Review Stage Counts ## Review Stage Counts
- approved-baseline: 29 - approved-baseline: 30
- queued-rework: 62 - queued-rework: 61
## Batch Plan ## Batch Plan
@@ -67,7 +67,7 @@ Visual review boards are generated by `scripts/render-unit-sprite-review-boards.
| batch7-unique-officer | queued-rework | `unit-ma-dai` | 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 | | batch7-unique-officer | queued-rework | `unit-ma-dai` | 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 |
| batch7-unique-officer | queued-rework | `unit-ma-liang` | 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-ma-liang` | 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 |
| batch6-nanman-special | approved-baseline | `unit-meng-huo` | ok | ok | 174..221 x 286..288 | 149..248 x 275..289 | 27.8..35.3 x 45.7..46.0 | w47 h2 b0 | | batch6-nanman-special | approved-baseline | `unit-meng-huo` | ok | ok | 174..221 x 286..288 | 149..248 x 275..289 | 27.8..35.3 x 45.7..46.0 | w47 h2 b0 |
| batch6-nanman-special | queued-rework | `unit-nanman-infantry` | 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 | | batch6-nanman-special | approved-baseline | `unit-nanman-infantry` | ok | ok | 152..219 x 288..288 | 152..243 x 265..288 | 24.3..35.0 x 46.0..46.0 | w67 h0 b0 |
| batch6-nanman-special | queued-rework | `unit-nanman-infantry-jungle` | 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 | | batch6-nanman-special | queued-rework | `unit-nanman-infantry-jungle` | 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 |
| batch6-nanman-special | queued-rework | `unit-nanman-infantry-spear` | 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 | | batch6-nanman-special | queued-rework | `unit-nanman-infantry-spear` | 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 |
| batch6-nanman-special | queued-rework | `unit-nanman-officer` | 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 | | batch6-nanman-special | queued-rework | `unit-nanman-officer` | 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 |

View File

@@ -14,6 +14,7 @@
"unit-guan-yu", "unit-guan-yu",
"unit-liu-bei", "unit-liu-bei",
"unit-meng-huo", "unit-meng-huo",
"unit-nanman-infantry",
"unit-rebel", "unit-rebel",
"unit-rebel-archer", "unit-rebel-archer",
"unit-rebel-archer-fire", "unit-rebel-archer-fire",
@@ -44,7 +45,6 @@
"pendingApproval": [], "pendingApproval": [],
"currentApprovalCandidate": {}, "currentApprovalCandidate": {},
"nextAfterApproval": [ "nextAfterApproval": [
"unit-nanman-infantry",
"unit-nanman-infantry-jungle", "unit-nanman-infantry-jungle",
"unit-nanman-infantry-spear", "unit-nanman-infantry-spear",
"unit-nanman-officer", "unit-nanman-officer",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 528 KiB

After

Width:  |  Height:  |  Size: 850 KiB