mapwright 0.23.0__tar.gz → 0.23.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mapwright-0.23.0 → mapwright-0.23.1}/CHANGELOG.md +18 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/PKG-INFO +1 -1
- {mapwright-0.23.0 → mapwright-0.23.1}/pyproject.toml +1 -1
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/__init__.py +1 -1
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/atlas_renderer.py +2 -3
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/settlement.py +2 -1
- {mapwright-0.23.0 → mapwright-0.23.1}/.github/workflows/ci.yml +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/.github/workflows/publish.yml +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/.gitignore +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/LICENSE +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/NOTICE +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/README.md +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/age-old.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/age-old.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/age-young.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/age-young.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/archipelago.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/archipelago.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/arctic.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/arctic.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/README.md +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/city_castle_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/city_large_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/city_town_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/city_village_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/decoration_compass_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/decoration_creature_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/decoration_ship_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/dune_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/hill_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/hill_2.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/manifest.json +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_mid_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_old_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_old_2.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_young_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_young_2.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_cactus_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_deciduous_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_deciduous_2.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_pine_1.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_pine_2.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/citadel.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/citadel.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/continent.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/continent.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/desert.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/desert.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/dungeon.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/dungeon.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/fortress-town.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/fortress-town.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/grid-city.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/grid-city.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/highlands.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/highlands.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/hint.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/hint.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/islands.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/islands.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/metropolis.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/metropolis.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/pangaea.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/pangaea.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/port.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/port.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/regions.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/regions.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/roads.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/roads.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/shantytown.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/shantytown.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/template-atoll.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/template-atoll.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/template-isthmus.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/template-isthmus.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/terrain-town.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/terrain-town.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-blueprint.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-blueprint.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-citadel-neon.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-citadel-neon.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-dune.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-dune.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-dungeon-blueprint.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-dungeon-blueprint.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-neon.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-neon.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-parchment.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-parchment.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/town.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/town.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/tropical.png +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/tropical.svg +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/examples/benchmark.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/examples/gallery.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/_geometry.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/_graph.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/_serde.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/affordances.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/config.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/dungeon.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/dungeon_renderer.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/names.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/regions.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/rng.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/roads.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/settlement_renderer.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/svg_renderer.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/terrain.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/themes.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_affordances.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_api_contract.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_atlas_renderer.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_config.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_dungeon.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_dungeon_renderer.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_geometry.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_graph.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_names.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_properties.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_regions.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_rng.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_roads.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_serialize.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_settlement.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_svg_renderer.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_terrain.py +0 -0
- {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_themes.py +0 -0
|
@@ -8,6 +8,24 @@ All notable changes to mapwright are documented here. The format follows
|
|
|
8
8
|
`tests/test_api_contract.py`). While the version is `0.x`, minor versions may
|
|
9
9
|
make breaking changes; these will always be noted here.
|
|
10
10
|
|
|
11
|
+
## [0.23.1] — 2026-06-06
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- **Atlas ocean decorations no longer silently vanish.** `AtlasRenderer` used a
|
|
15
|
+
symbol pick purely as an existence test (discarding the drawn symbol) and then
|
|
16
|
+
independently coin-flipped between `decoration.ship` and `decoration.creature`.
|
|
17
|
+
On an art pack that supplied only one of the two slots, roughly half the ocean
|
|
18
|
+
decorations were dropped because the coin flip selected the absent slot. The
|
|
19
|
+
renderer now decides the slot once and stamps it (a missing slot is a harmless
|
|
20
|
+
no-op), which also removes the wasted RNG draws that made output sensitive to
|
|
21
|
+
which decoration slots a pack happened to define.
|
|
22
|
+
- **Terrain-shaped coastal towns no longer place their footprint in the water.**
|
|
23
|
+
The settlement footprint's minimum-core clamp ran on every ray, including rays
|
|
24
|
+
that had stopped just shy of water — pushing those vertices back out past the
|
|
25
|
+
shoreline (while still flagging them as water-bounded), so the derived coastline
|
|
26
|
+
chord could sit in open sea. The clamp now applies only to rays not stopped by
|
|
27
|
+
water; inland/cliff-hemmed towns keep their minimum core.
|
|
28
|
+
|
|
11
29
|
## [0.23.0] — 2026-06-05
|
|
12
30
|
|
|
13
31
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mapwright
|
|
3
|
-
Version: 0.23.
|
|
3
|
+
Version: 0.23.1
|
|
4
4
|
Summary: Domain-neutral procedural fantasy map & world generation: Voronoi terrain, hydraulic erosion, biomes, rivers, Markov place-names, and shaded-relief SVG.
|
|
5
5
|
Project-URL: Homepage, https://github.com/sligara7/mapwright
|
|
6
6
|
Project-URL: Repository, https://github.com/sligara7/mapwright
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "mapwright"
|
|
7
|
-
version = "0.23.
|
|
7
|
+
version = "0.23.1"
|
|
8
8
|
description = "Domain-neutral procedural fantasy map & world generation: Voronoi terrain, hydraulic erosion, biomes, rivers, Markov place-names, and shaded-relief SVG."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -285,9 +285,8 @@ class AtlasRenderer:
|
|
|
285
285
|
ocean = [c for c in terrain.cells if c.biome == Biome.OCEAN]
|
|
286
286
|
rng.shuffle(ocean)
|
|
287
287
|
for c in ocean[:3]:
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
self._stamp(img, slot, c.cx * s, c.cy * s, rng, width_override=3.0)
|
|
288
|
+
slot = "decoration.ship" if rng.random() < 0.5 else "decoration.creature"
|
|
289
|
+
self._stamp(img, slot, c.cx * s, c.cy * s, rng, width_override=3.0)
|
|
291
290
|
self._stamp(img, "decoration.compass", W - s * 4.5, H - s * 3.5, rng, width_override=6.0)
|
|
292
291
|
return img
|
|
293
292
|
|
|
@@ -855,7 +855,8 @@ class SettlementGenerator:
|
|
|
855
855
|
wob = 1.0 + sum(a * math.sin((h + 1) * (ang + twist) + p)
|
|
856
856
|
for h, (a, p) in enumerate(zip(amps, phases)))
|
|
857
857
|
r *= max(0.6, min(1.0, wob))
|
|
858
|
-
|
|
858
|
+
if not hit_water: # keep a minimum core size, but
|
|
859
|
+
r = max(r, radius * 0.28) # never push past the shoreline
|
|
859
860
|
pts.append((ccx + dx * r, ccy + dy * r))
|
|
860
861
|
water.append(hit_water)
|
|
861
862
|
return pts, self._coast_edge(pts, water)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|