Export safe flag and home_region in zone TOML

This commit is contained in:
Jared Miller 2026-02-14 11:54:47 -05:00
parent 68c18572d6
commit dd5286097b
Signed by: shmup
GPG key ID: 22B5C6D66A38B06C
2 changed files with 123 additions and 0 deletions

View file

@ -28,6 +28,8 @@ def export_zone(zone: Zone) -> str:
lines.append(f"toroidal = {str(zone.toroidal).lower()}")
lines.append(f"spawn_x = {zone.spawn_x}")
lines.append(f"spawn_y = {zone.spawn_y}")
if zone.safe:
lines.append("safe = true")
lines.append("")
# Terrain section
@ -80,6 +82,9 @@ def export_zone(zone: Zone) -> str:
lines.append(f'mob = "{spawn_rule.mob}"')
lines.append(f"max_count = {spawn_rule.max_count}")
lines.append(f"respawn_seconds = {spawn_rule.respawn_seconds}")
if spawn_rule.home_region is not None:
hr = spawn_rule.home_region
lines.append(f"home_region = {{ x = {hr['x']}, y = {hr['y']} }}")
lines.append("")
return "\n".join(lines)

View file

@ -320,3 +320,121 @@ def test_export_zone_with_spawn_rules():
assert 'mob = "crow"' in toml_str
assert "max_count = 1" in toml_str
assert "respawn_seconds = 300" in toml_str
def test_export_safe_zone():
"""Export includes safe = true when zone is safe."""
terrain = [["." for _ in range(3)] for _ in range(3)]
zone = Zone(
name="sanctuary",
width=3,
height=3,
terrain=terrain,
safe=True,
)
result = export_zone(zone)
assert "safe = true" in result
def test_export_unsafe_zone_omits_safe():
"""Export omits safe field when zone is not safe (default)."""
terrain = [["." for _ in range(3)] for _ in range(3)]
zone = Zone(
name="wilderness",
width=3,
height=3,
terrain=terrain,
safe=False,
)
result = export_zone(zone)
assert "safe" not in result
def test_export_spawn_with_home_region():
"""Export includes home_region on spawn rules when present."""
terrain = [["." for _ in range(5)] for _ in range(5)]
zone = Zone(
name="forest",
width=5,
height=5,
terrain=terrain,
spawn_rules=[
SpawnRule(
mob="squirrel",
max_count=2,
respawn_seconds=180,
home_region={"x": [5, 15], "y": [3, 10]},
)
],
)
result = export_zone(zone)
assert "home_region" in result
assert "x = [5, 15]" in result
assert "y = [3, 10]" in result
def test_export_spawn_without_home_region():
"""Export omits home_region when not set."""
terrain = [["." for _ in range(5)] for _ in range(5)]
zone = Zone(
name="forest",
width=5,
height=5,
terrain=terrain,
spawn_rules=[SpawnRule(mob="goblin", max_count=1)],
)
result = export_zone(zone)
assert "home_region" not in result
def test_export_safe_zone_round_trip():
"""Safe zone survives export/import round-trip."""
terrain = [["." for _ in range(3)] for _ in range(3)]
zone = Zone(
name="temple",
width=3,
height=3,
terrain=terrain,
safe=True,
)
with tempfile.NamedTemporaryFile(mode="w", suffix=".toml", delete=False) as f:
f.write(export_zone(zone))
temp_path = pathlib.Path(f.name)
try:
reloaded = load_zone(temp_path)
assert reloaded.safe is True
finally:
temp_path.unlink()
def test_export_home_region_round_trip():
"""Home region on spawn rules survives export/import round-trip."""
terrain = [["." for _ in range(5)] for _ in range(5)]
zone = Zone(
name="woods",
width=5,
height=5,
terrain=terrain,
spawn_rules=[
SpawnRule(
mob="deer",
max_count=3,
respawn_seconds=120,
home_region={"x": [1, 4], "y": [1, 4]},
)
],
)
with tempfile.NamedTemporaryFile(mode="w", suffix=".toml", delete=False) as f:
f.write(export_zone(zone))
temp_path = pathlib.Path(f.name)
try:
reloaded = load_zone(temp_path)
assert len(reloaded.spawn_rules) == 1
rule = reloaded.spawn_rules[0]
assert rule.home_region == {"x": [1, 4], "y": [1, 4]}
finally:
temp_path.unlink()