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.
Files changed (130) hide show
  1. {mapwright-0.23.0 → mapwright-0.23.1}/CHANGELOG.md +18 -0
  2. {mapwright-0.23.0 → mapwright-0.23.1}/PKG-INFO +1 -1
  3. {mapwright-0.23.0 → mapwright-0.23.1}/pyproject.toml +1 -1
  4. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/__init__.py +1 -1
  5. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/atlas_renderer.py +2 -3
  6. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/settlement.py +2 -1
  7. {mapwright-0.23.0 → mapwright-0.23.1}/.github/workflows/ci.yml +0 -0
  8. {mapwright-0.23.0 → mapwright-0.23.1}/.github/workflows/publish.yml +0 -0
  9. {mapwright-0.23.0 → mapwright-0.23.1}/.gitignore +0 -0
  10. {mapwright-0.23.0 → mapwright-0.23.1}/LICENSE +0 -0
  11. {mapwright-0.23.0 → mapwright-0.23.1}/NOTICE +0 -0
  12. {mapwright-0.23.0 → mapwright-0.23.1}/README.md +0 -0
  13. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/age-old.png +0 -0
  14. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/age-old.svg +0 -0
  15. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/age-young.png +0 -0
  16. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/age-young.svg +0 -0
  17. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/archipelago.png +0 -0
  18. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/archipelago.svg +0 -0
  19. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/arctic.png +0 -0
  20. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/arctic.svg +0 -0
  21. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas.png +0 -0
  22. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/README.md +0 -0
  23. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/city_castle_1.png +0 -0
  24. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/city_large_1.png +0 -0
  25. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/city_town_1.png +0 -0
  26. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/city_village_1.png +0 -0
  27. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/decoration_compass_1.png +0 -0
  28. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/decoration_creature_1.png +0 -0
  29. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/decoration_ship_1.png +0 -0
  30. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/dune_1.png +0 -0
  31. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/hill_1.png +0 -0
  32. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/hill_2.png +0 -0
  33. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/manifest.json +0 -0
  34. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_mid_1.png +0 -0
  35. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_old_1.png +0 -0
  36. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_old_2.png +0 -0
  37. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_young_1.png +0 -0
  38. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/mountain_young_2.png +0 -0
  39. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_cactus_1.png +0 -0
  40. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_deciduous_1.png +0 -0
  41. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_deciduous_2.png +0 -0
  42. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_pine_1.png +0 -0
  43. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/atlas_pack/tree_pine_2.png +0 -0
  44. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/citadel.png +0 -0
  45. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/citadel.svg +0 -0
  46. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/continent.png +0 -0
  47. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/continent.svg +0 -0
  48. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/desert.png +0 -0
  49. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/desert.svg +0 -0
  50. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/dungeon.png +0 -0
  51. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/dungeon.svg +0 -0
  52. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/fortress-town.png +0 -0
  53. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/fortress-town.svg +0 -0
  54. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/grid-city.png +0 -0
  55. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/grid-city.svg +0 -0
  56. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/highlands.png +0 -0
  57. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/highlands.svg +0 -0
  58. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/hint.png +0 -0
  59. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/hint.svg +0 -0
  60. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/islands.png +0 -0
  61. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/islands.svg +0 -0
  62. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/metropolis.png +0 -0
  63. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/metropolis.svg +0 -0
  64. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/pangaea.png +0 -0
  65. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/pangaea.svg +0 -0
  66. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/port.png +0 -0
  67. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/port.svg +0 -0
  68. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/regions.png +0 -0
  69. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/regions.svg +0 -0
  70. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/roads.png +0 -0
  71. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/roads.svg +0 -0
  72. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/shantytown.png +0 -0
  73. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/shantytown.svg +0 -0
  74. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/template-atoll.png +0 -0
  75. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/template-atoll.svg +0 -0
  76. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/template-isthmus.png +0 -0
  77. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/template-isthmus.svg +0 -0
  78. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/terrain-town.png +0 -0
  79. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/terrain-town.svg +0 -0
  80. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-blueprint.png +0 -0
  81. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-blueprint.svg +0 -0
  82. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-citadel-neon.png +0 -0
  83. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-citadel-neon.svg +0 -0
  84. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-dune.png +0 -0
  85. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-dune.svg +0 -0
  86. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-dungeon-blueprint.png +0 -0
  87. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-dungeon-blueprint.svg +0 -0
  88. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-neon.png +0 -0
  89. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-neon.svg +0 -0
  90. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-parchment.png +0 -0
  91. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/theme-parchment.svg +0 -0
  92. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/town.png +0 -0
  93. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/town.svg +0 -0
  94. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/tropical.png +0 -0
  95. {mapwright-0.23.0 → mapwright-0.23.1}/docs/gallery/tropical.svg +0 -0
  96. {mapwright-0.23.0 → mapwright-0.23.1}/examples/benchmark.py +0 -0
  97. {mapwright-0.23.0 → mapwright-0.23.1}/examples/gallery.py +0 -0
  98. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/_geometry.py +0 -0
  99. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/_graph.py +0 -0
  100. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/_serde.py +0 -0
  101. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/affordances.py +0 -0
  102. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/config.py +0 -0
  103. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/dungeon.py +0 -0
  104. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/dungeon_renderer.py +0 -0
  105. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/names.py +0 -0
  106. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/regions.py +0 -0
  107. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/rng.py +0 -0
  108. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/roads.py +0 -0
  109. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/settlement_renderer.py +0 -0
  110. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/svg_renderer.py +0 -0
  111. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/terrain.py +0 -0
  112. {mapwright-0.23.0 → mapwright-0.23.1}/src/mapwright/themes.py +0 -0
  113. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_affordances.py +0 -0
  114. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_api_contract.py +0 -0
  115. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_atlas_renderer.py +0 -0
  116. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_config.py +0 -0
  117. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_dungeon.py +0 -0
  118. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_dungeon_renderer.py +0 -0
  119. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_geometry.py +0 -0
  120. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_graph.py +0 -0
  121. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_names.py +0 -0
  122. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_properties.py +0 -0
  123. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_regions.py +0 -0
  124. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_rng.py +0 -0
  125. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_roads.py +0 -0
  126. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_serialize.py +0 -0
  127. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_settlement.py +0 -0
  128. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_svg_renderer.py +0 -0
  129. {mapwright-0.23.0 → mapwright-0.23.1}/tests/test_terrain.py +0 -0
  130. {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.0
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.0"
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"
@@ -63,7 +63,7 @@ from .terrain import (
63
63
  compute_cell_polygons,
64
64
  )
65
65
 
66
- __version__ = "0.23.0"
66
+ __version__ = "0.23.1"
67
67
 
68
68
  __all__ = [
69
69
  "SeededRNG",
@@ -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
- if self.pack.pick("decoration.creature", rng) or self.pack.pick("decoration.ship", rng):
289
- slot = "decoration.ship" if rng.random() < 0.5 else "decoration.creature"
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
- r = max(r, radius * 0.28) # keep a minimum core size
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