From dd5286097bacfa711d1b773fa596d72dcf0cbd51 Mon Sep 17 00:00:00 2001 From: Jared Miller Date: Sat, 14 Feb 2026 11:54:47 -0500 Subject: [PATCH] Export safe flag and home_region in zone TOML --- src/mudlib/export.py | 5 ++ tests/test_zone_export.py | 118 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) diff --git a/src/mudlib/export.py b/src/mudlib/export.py index 2789b21..13c3aaa 100644 --- a/src/mudlib/export.py +++ b/src/mudlib/export.py @@ -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) diff --git a/tests/test_zone_export.py b/tests/test_zone_export.py index 693065e..8e1412f 100644 --- a/tests/test_zone_export.py +++ b/tests/test_zone_export.py @@ -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()