Replace thirteenth battle map with hand-painted asset

This commit is contained in:
2026-07-09 15:16:12 +09:00
parent ef06801d0e
commit 4c22236e8c
7 changed files with 15 additions and 97 deletions

View File

@@ -2,7 +2,7 @@
## Scope
The first twelve campaign battles now use the same hand-painted tactical map pipeline. The renderer still reads the original scenario tile coordinates and battle logic; only the map texture asset changes from flat/vector map art to low-contrast raster terrain.
The first thirteen campaign battles now use the same hand-painted tactical map pipeline. The renderer still reads the original scenario tile coordinates and battle logic; only the map texture asset changes from flat/vector map art to low-contrast raster terrain.
## Art Direction
@@ -29,6 +29,7 @@ python scripts/generate-handpaint-map-sample.py --map ninth --webp-quality 90
python scripts/generate-handpaint-map-sample.py --map tenth --webp-quality 90
python scripts/generate-handpaint-map-sample.py --map eleventh --webp-quality 90
python scripts/generate-handpaint-map-sample.py --map twelfth --webp-quality 90
python scripts/generate-handpaint-map-sample.py --map thirteenth --webp-quality 90
```
## Current Assets
@@ -45,6 +46,7 @@ python scripts/generate-handpaint-map-sample.py --map twelfth --webp-quality 90
- `src/assets/images/battle/tenth-battle-map.webp`
- `src/assets/images/battle/eleventh-battle-map.webp`
- `src/assets/images/battle/twelfth-battle-map.webp`
- `src/assets/images/battle/thirteenth-battle-map.webp`
## QA Outputs
@@ -70,5 +72,7 @@ python scripts/generate-handpaint-map-sample.py --map twelfth --webp-quality 90
- `docs/eleventh-battle-map-handpaint-preview.png`
- `docs/twelfth-battle-map-handpaint-before-after.png`
- `docs/twelfth-battle-map-handpaint-preview.png`
- `docs/thirteenth-battle-map-handpaint-before-after.png`
- `docs/thirteenth-battle-map-handpaint-preview.png`
Browser screenshots are saved per verification run after build/deploy.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@@ -127,6 +127,15 @@ MAP_CONFIGS = {
"before": BATTLE_IMAGE_DIR / "twelfth-battle-map.svg",
"seed": 240814,
},
"thirteenth": {
"slug": "thirteenth-battle-map",
"terrain_export": "thirteenthBattleMap",
"units_export": "thirteenthBattleUnits",
"ally_positions_export": "thirteenthBattleAllyPositions",
"out": BATTLE_IMAGE_DIR / "thirteenth-battle-map.webp",
"before": BATTLE_IMAGE_DIR / "thirteenth-battle-map.svg",
"seed": 240824,
},
}

View File

@@ -1,95 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="3200" height="2400" viewBox="0 0 3200 2400">
<defs>
<linearGradient id="skyWash" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#8b8756"/>
<stop offset="0.48" stop-color="#b79a60"/>
<stop offset="1" stop-color="#77754f"/>
</linearGradient>
<radialGradient id="mudLight" cx="55%" cy="44%" r="62%">
<stop offset="0" stop-color="#d4bb7a"/>
<stop offset="0.62" stop-color="#a98d57"/>
<stop offset="1" stop-color="#716b45"/>
</radialGradient>
<linearGradient id="riverFlow" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#4e8394"/>
<stop offset="0.5" stop-color="#6ca8ad"/>
<stop offset="1" stop-color="#375e78"/>
</linearGradient>
<pattern id="grain" width="64" height="64" patternUnits="userSpaceOnUse">
<path d="M4 12h18M34 16h24M12 42h22M42 48h16" stroke="#2d2619" stroke-width="5" opacity=".18" fill="none"/>
<path d="M18 5l9 8M51 31l8 9M7 56l11-8" stroke="#e5cf8d" stroke-width="4" opacity=".16" fill="none"/>
</pattern>
</defs>
<rect width="3200" height="2400" fill="url(#skyWash)"/>
<rect width="3200" height="2400" fill="url(#mudLight)" opacity=".88"/>
<rect width="3200" height="2400" fill="url(#grain)" opacity=".65"/>
<rect x="1440" y="-80" width="270" height="2560" rx="120" fill="#5f98a6" opacity=".5"/>
<rect x="1888" y="30" width="238" height="2450" rx="105" fill="#5a90a2" opacity=".46"/>
<rect x="1538" y="-20" width="22" height="2120" rx="10" fill="#a8d5d0" opacity=".22"/>
<rect x="1998" y="90" width="18" height="1980" rx="9" fill="#a8d5d0" opacity=".2"/>
<g opacity=".42">
<ellipse cx="430" cy="310" rx="118" ry="72" fill="#718956"/>
<ellipse cx="650" cy="410" rx="156" ry="92" fill="#78905b"/>
<ellipse cx="918" cy="330" rx="132" ry="78" fill="#748a54"/>
<ellipse cx="420" cy="1715" rx="170" ry="92" fill="#708854"/>
<ellipse cx="760" cy="1788" rx="210" ry="105" fill="#778d58"/>
<ellipse cx="1045" cy="1848" rx="160" ry="86" fill="#718754"/>
<ellipse cx="2948" cy="2100" rx="185" ry="112" fill="#748b57"/>
</g>
<path d="M150 1938 L980 1938 L1430 1455 L2065 1455 L2450 1164 L2920 1164" stroke="#cbb27a" stroke-width="78" stroke-linecap="round" opacity=".92" fill="none"/>
<path d="M1020 1375 L1840 1375 L2430 895" stroke="#cbb27a" stroke-width="72" stroke-linecap="round" opacity=".88" fill="none"/>
<path d="M2450 735 L2450 1830" stroke="#cbb27a" stroke-width="68" stroke-linecap="round" opacity=".84" fill="none"/>
<path d="M150 1938 L980 1938 L1430 1455 L2065 1455 L2450 1164 L2920 1164" stroke="#6e4d2e" stroke-width="12" stroke-dasharray="46 48" opacity=".22" fill="none"/>
<path d="M1020 1375 L1840 1375 L2430 895" stroke="#6e4d2e" stroke-width="10" stroke-dasharray="44 46" opacity=".2" fill="none"/>
<g opacity=".58">
<rect x="2188" y="826" width="620" height="64" fill="#9e895f"/>
<rect x="2188" y="1438" width="620" height="64" fill="#927d58"/>
<rect x="2168" y="870" width="64" height="600" fill="#867250"/>
<rect x="2768" y="870" width="64" height="600" fill="#867250"/>
<rect x="2280" y="1018" width="390" height="300" rx="14" fill="#a58b58"/>
<rect x="2378" y="1112" width="196" height="126" fill="#756342" opacity=".5"/>
<path d="M2208 858 H2796" stroke="#d5bd81" stroke-width="10" opacity=".36" fill="none"/>
<path d="M2212 1470 H2792" stroke="#d5bd81" stroke-width="10" opacity=".3" fill="none"/>
<path d="M2242 892 V1458" stroke="#d5bd81" stroke-width="8" opacity=".25" fill="none"/>
<path d="M2796 892 V1458" stroke="#d5bd81" stroke-width="8" opacity=".25" fill="none"/>
</g>
<g opacity=".88">
<ellipse cx="1120" cy="1812" rx="165" ry="102" fill="#866b3e"/>
<rect x="1006" y="1740" width="230" height="130" fill="#a8874b"/>
<path d="M1006 1740 L1120 1662 L1236 1740Z" fill="#6b4a31"/>
<rect x="1078" y="1792" width="74" height="78" fill="#3b2b20"/>
<path d="M934 1905 C1040 1955 1235 1950 1315 1886" stroke="#d8c08a" stroke-width="18" opacity=".45" fill="none"/>
</g>
<g opacity=".78">
<circle cx="520" cy="420" r="72" fill="#41512d"/>
<circle cx="600" cy="465" r="90" fill="#536536"/>
<circle cx="710" cy="380" r="72" fill="#4f6034"/>
<circle cx="760" cy="535" r="95" fill="#44552f"/>
<circle cx="888" cy="430" r="78" fill="#526436"/>
<circle cx="528" cy="1270" r="84" fill="#4b5d33"/>
<circle cx="680" cy="1195" r="96" fill="#536a3b"/>
<circle cx="842" cy="1250" r="82" fill="#455830"/>
<circle cx="2780" cy="2055" r="88" fill="#4b5d33"/>
<circle cx="2912" cy="2130" r="104" fill="#536a3b"/>
</g>
<g opacity=".24">
<ellipse cx="930" cy="330" rx="190" ry="112" fill="#9b9366"/>
<ellipse cx="2920" cy="270" rx="230" ry="140" fill="#999165"/>
<ellipse cx="1160" cy="2190" rx="270" ry="150" fill="#9b9366"/>
</g>
<g opacity=".42">
<path d="M0 0H3200V2400H0Z" fill="none" stroke="#ead6a2" stroke-width="22"/>
<path d="M108 98H3092V2298H108Z" fill="none" stroke="#3a2c1b" stroke-width="12"/>
</g>
<rect width="3200" height="2400" fill="#101015" opacity=".035"/>
</svg>

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@@ -41,7 +41,7 @@ import seventeenthBattleMapUrl from '../../assets/images/battle/seventeenth-batt
import sixteenthBattleMapUrl from '../../assets/images/battle/sixteenth-battle-map.svg';
import sixthBattleMapUrl from '../../assets/images/battle/sixth-battle-map.webp';
import tenthBattleMapUrl from '../../assets/images/battle/tenth-battle-map.webp';
import thirteenthBattleMapUrl from '../../assets/images/battle/thirteenth-battle-map.svg';
import thirteenthBattleMapUrl from '../../assets/images/battle/thirteenth-battle-map.webp';
import thirtiethBattleMapUrl from '../../assets/images/battle/thirtieth-battle-map.svg';
import thirtyEighthBattleMapUrl from '../../assets/images/battle/thirty-eighth-battle-map.svg';
import thirtyFifthBattleMapUrl from '../../assets/images/battle/thirty-fifth-battle-map.svg';