Export safe flag and home_region in zone TOML
This commit is contained in:
parent
68c18572d6
commit
dd5286097b
2 changed files with 123 additions and 0 deletions
|
|
@ -28,6 +28,8 @@ def export_zone(zone: Zone) -> str:
|
||||||
lines.append(f"toroidal = {str(zone.toroidal).lower()}")
|
lines.append(f"toroidal = {str(zone.toroidal).lower()}")
|
||||||
lines.append(f"spawn_x = {zone.spawn_x}")
|
lines.append(f"spawn_x = {zone.spawn_x}")
|
||||||
lines.append(f"spawn_y = {zone.spawn_y}")
|
lines.append(f"spawn_y = {zone.spawn_y}")
|
||||||
|
if zone.safe:
|
||||||
|
lines.append("safe = true")
|
||||||
lines.append("")
|
lines.append("")
|
||||||
|
|
||||||
# Terrain section
|
# Terrain section
|
||||||
|
|
@ -80,6 +82,9 @@ def export_zone(zone: Zone) -> str:
|
||||||
lines.append(f'mob = "{spawn_rule.mob}"')
|
lines.append(f'mob = "{spawn_rule.mob}"')
|
||||||
lines.append(f"max_count = {spawn_rule.max_count}")
|
lines.append(f"max_count = {spawn_rule.max_count}")
|
||||||
lines.append(f"respawn_seconds = {spawn_rule.respawn_seconds}")
|
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("")
|
lines.append("")
|
||||||
|
|
||||||
return "\n".join(lines)
|
return "\n".join(lines)
|
||||||
|
|
|
||||||
|
|
@ -320,3 +320,121 @@ def test_export_zone_with_spawn_rules():
|
||||||
assert 'mob = "crow"' in toml_str
|
assert 'mob = "crow"' in toml_str
|
||||||
assert "max_count = 1" in toml_str
|
assert "max_count = 1" in toml_str
|
||||||
assert "respawn_seconds = 300" 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()
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue