diff --git a/docs/battle-map-terrain-atlas-pipeline.md b/docs/battle-map-terrain-atlas-pipeline.md index 54a4962..5f3348b 100644 --- a/docs/battle-map-terrain-atlas-pipeline.md +++ b/docs/battle-map-terrain-atlas-pipeline.md @@ -2,7 +2,7 @@ ## Scope -The first sixty-two 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 sixty-four 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 @@ -22,6 +22,7 @@ The first sixty-two campaign battles now use the same hand-painted tactical map - Colossal maps can use a 136px tile target through `COLOSSAL_LARGE_MAP_TILE_SIZE` when 144px output hits WebP encoding error 6. - Gigantic maps can use a 128px tile target through `GIGANTIC_LARGE_MAP_TILE_SIZE` when 136px output would exceed the known WebP encoder comfort range. - Immense maps can use a 120px tile target through `IMMENSE_LARGE_MAP_TILE_SIZE` when 128px output hits WebP encoding error 6. +- Vast maps can use a 112px tile target through `VAST_LARGE_MAP_TILE_SIZE` when 120px output becomes unreliable during WebP encoding. - Re-evaluate the tile target before a generated map's longest edge approaches roughly 16,384px at 192px per tile. - Use `--tile-size` only for controlled comparisons; commit the selected production size in the map config. @@ -93,6 +94,8 @@ python scripts/generate-handpaint-map-sample.py --map fifty-ninth --webp-quality python scripts/generate-handpaint-map-sample.py --map sixtieth --webp-quality 90 python scripts/generate-handpaint-map-sample.py --map sixty-first --webp-quality 90 python scripts/generate-handpaint-map-sample.py --map sixty-second --webp-quality 90 +python scripts/generate-handpaint-map-sample.py --map sixty-third --webp-quality 90 +python scripts/generate-handpaint-map-sample.py --map sixty-fourth --webp-quality 90 ``` Comparison example: @@ -165,6 +168,8 @@ python scripts/generate-handpaint-map-sample.py --map thirtieth --tile-size 192 - `src/assets/images/battle/sixtieth-battle-map.webp` - `src/assets/images/battle/sixty-first-battle-map.webp` - `src/assets/images/battle/sixty-second-battle-map.webp` +- `src/assets/images/battle/sixty-third-battle-map.webp` +- `src/assets/images/battle/sixty-fourth-battle-map.webp` ## QA Outputs @@ -290,5 +295,9 @@ python scripts/generate-handpaint-map-sample.py --map thirtieth --tile-size 192 - `docs/sixty-first-battle-map-handpaint-preview.png` - `docs/sixty-second-battle-map-handpaint-before-after.png` - `docs/sixty-second-battle-map-handpaint-preview.png` +- `docs/sixty-third-battle-map-handpaint-before-after.png` +- `docs/sixty-third-battle-map-handpaint-preview.png` +- `docs/sixty-fourth-battle-map-handpaint-before-after.png` +- `docs/sixty-fourth-battle-map-handpaint-preview.png` Browser screenshots are saved per verification run after build/deploy. diff --git a/docs/sixty-fourth-battle-map-handpaint-before-after.png b/docs/sixty-fourth-battle-map-handpaint-before-after.png new file mode 100644 index 0000000..2412af4 Binary files /dev/null and b/docs/sixty-fourth-battle-map-handpaint-before-after.png differ diff --git a/docs/sixty-fourth-battle-map-handpaint-preview.png b/docs/sixty-fourth-battle-map-handpaint-preview.png new file mode 100644 index 0000000..7290ec6 Binary files /dev/null and b/docs/sixty-fourth-battle-map-handpaint-preview.png differ diff --git a/docs/sixty-third-battle-map-handpaint-before-after.png b/docs/sixty-third-battle-map-handpaint-before-after.png new file mode 100644 index 0000000..c37441e Binary files /dev/null and b/docs/sixty-third-battle-map-handpaint-before-after.png differ diff --git a/docs/sixty-third-battle-map-handpaint-preview.png b/docs/sixty-third-battle-map-handpaint-preview.png new file mode 100644 index 0000000..d591d42 Binary files /dev/null and b/docs/sixty-third-battle-map-handpaint-preview.png differ diff --git a/scripts/generate-handpaint-map-sample.py b/scripts/generate-handpaint-map-sample.py index c8af498..7aa5d87 100644 --- a/scripts/generate-handpaint-map-sample.py +++ b/scripts/generate-handpaint-map-sample.py @@ -24,6 +24,7 @@ MASSIVE_LARGE_MAP_TILE_SIZE = 144 COLOSSAL_LARGE_MAP_TILE_SIZE = 136 GIGANTIC_LARGE_MAP_TILE_SIZE = 128 IMMENSE_LARGE_MAP_TILE_SIZE = 120 +VAST_LARGE_MAP_TILE_SIZE = 112 TILE = DEFAULT_TILE_SIZE RNG = random.Random(240704) @@ -623,6 +624,26 @@ MAP_CONFIGS = { "seed": 241314, "tile_size": IMMENSE_LARGE_MAP_TILE_SIZE, }, + "sixty-third": { + "slug": "sixty-third-battle-map", + "terrain_export": "sixtyThirdBattleMap", + "units_export": "sixtyThirdBattleUnits", + "ally_positions_export": "sixtyThirdBattleAllyPositions", + "out": BATTLE_IMAGE_DIR / "sixty-third-battle-map.webp", + "before": BATTLE_IMAGE_DIR / "sixty-third-battle-map.svg", + "seed": 241324, + "tile_size": VAST_LARGE_MAP_TILE_SIZE, + }, + "sixty-fourth": { + "slug": "sixty-fourth-battle-map", + "terrain_export": "sixtyFourthBattleMap", + "units_export": "sixtyFourthBattleUnits", + "ally_positions_export": "sixtyFourthBattleAllyPositions", + "out": BATTLE_IMAGE_DIR / "sixty-fourth-battle-map.webp", + "before": BATTLE_IMAGE_DIR / "sixty-fourth-battle-map.svg", + "seed": 241334, + "tile_size": VAST_LARGE_MAP_TILE_SIZE, + }, } @@ -1264,8 +1285,8 @@ def main() -> None: config = dict(MAP_CONFIGS[args.map]) if args.tile_size is not None: - if args.tile_size < 120: - raise ValueError("--tile-size must be 120 or greater") + if args.tile_size < VAST_LARGE_MAP_TILE_SIZE: + raise ValueError(f"--tile-size must be {VAST_LARGE_MAP_TILE_SIZE} or greater") config["tile_size"] = args.tile_size out_path = args.out or Path(config["out"]) before_path = args.before or Path(config["before"]) diff --git a/src/assets/images/battle/sixty-fourth-battle-map.svg b/src/assets/images/battle/sixty-fourth-battle-map.svg deleted file mode 100644 index 72760a1..0000000 --- a/src/assets/images/battle/sixty-fourth-battle-map.svg +++ /dev/null @@ -1,96 +0,0 @@ - - Weishui camps map - Original tactical battlefield map with Wei River crossings, Shu supply camps, Wei fortified palisades, signal towers, villages, cliffs, roads, and winter ridges. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/images/battle/sixty-fourth-battle-map.webp b/src/assets/images/battle/sixty-fourth-battle-map.webp new file mode 100644 index 0000000..d2ac3eb Binary files /dev/null and b/src/assets/images/battle/sixty-fourth-battle-map.webp differ diff --git a/src/assets/images/battle/sixty-third-battle-map.svg b/src/assets/images/battle/sixty-third-battle-map.svg deleted file mode 100644 index 8d7e3ed..0000000 --- a/src/assets/images/battle/sixty-third-battle-map.svg +++ /dev/null @@ -1,97 +0,0 @@ - - Lucheng pursuit map - Original tactical battlefield map with Lucheng pursuit roads, Shu return camps, Wei blocking forts, signal towers, rivers, villages, ridge gates, and supply routes. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/images/battle/sixty-third-battle-map.webp b/src/assets/images/battle/sixty-third-battle-map.webp new file mode 100644 index 0000000..c914c74 Binary files /dev/null and b/src/assets/images/battle/sixty-third-battle-map.webp differ diff --git a/src/game/data/battleMapAssets.ts b/src/game/data/battleMapAssets.ts index 5de4585..1c4233e 100644 --- a/src/game/data/battleMapAssets.ts +++ b/src/game/data/battleMapAssets.ts @@ -12,8 +12,8 @@ import fiftyNinthBattleMapUrl from '../../assets/images/battle/fifty-ninth-battl import sixtiethBattleMapUrl from '../../assets/images/battle/sixtieth-battle-map.webp'; import sixtyFirstBattleMapUrl from '../../assets/images/battle/sixty-first-battle-map.webp'; import sixtySecondBattleMapUrl from '../../assets/images/battle/sixty-second-battle-map.webp'; -import sixtyThirdBattleMapUrl from '../../assets/images/battle/sixty-third-battle-map.svg'; -import sixtyFourthBattleMapUrl from '../../assets/images/battle/sixty-fourth-battle-map.svg'; +import sixtyThirdBattleMapUrl from '../../assets/images/battle/sixty-third-battle-map.webp'; +import sixtyFourthBattleMapUrl from '../../assets/images/battle/sixty-fourth-battle-map.webp'; import sixtyFifthBattleMapUrl from '../../assets/images/battle/sixty-fifth-battle-map.svg'; import sixtySixthBattleMapUrl from '../../assets/images/battle/sixty-sixth-battle-map.svg'; import fiftySeventhBattleMapUrl from '../../assets/images/battle/fifty-seventh-battle-map.webp';