Zones can now define spawn rules in TOML: - [[spawns]] sections specify mob type, max count, and respawn timer - SpawnRule dataclass stores configuration - load_zone() parses spawn rules from TOML - Added example spawn rules to treehouse zone (squirrel, crow) This is configuration infrastructure only - actual spawning logic will be handled by the game loop in a future phase.
101 lines
2.8 KiB
Python
101 lines
2.8 KiB
Python
"""Tests for per-zone mob spawn rules."""
|
|
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
from mudlib.zone import SpawnRule, Zone
|
|
from mudlib.zones import load_zone
|
|
|
|
|
|
def test_zone_default_no_spawn_rules():
|
|
"""Zone() has empty spawn_rules list by default."""
|
|
zone = Zone(name="test", width=10, height=10)
|
|
assert zone.spawn_rules == []
|
|
|
|
|
|
def test_zone_with_spawn_rules():
|
|
"""Zone with spawn rules stores them."""
|
|
rule1 = SpawnRule(mob="rat", max_count=3, respawn_seconds=300)
|
|
rule2 = SpawnRule(mob="goblin", max_count=1, respawn_seconds=600)
|
|
zone = Zone(name="test", width=10, height=10, spawn_rules=[rule1, rule2])
|
|
|
|
assert len(zone.spawn_rules) == 2
|
|
assert zone.spawn_rules[0].mob == "rat"
|
|
assert zone.spawn_rules[0].max_count == 3
|
|
assert zone.spawn_rules[0].respawn_seconds == 300
|
|
assert zone.spawn_rules[1].mob == "goblin"
|
|
assert zone.spawn_rules[1].max_count == 1
|
|
assert zone.spawn_rules[1].respawn_seconds == 600
|
|
|
|
|
|
def test_load_zone_with_spawn_rules():
|
|
"""TOML with [[spawns]] loads spawn rules."""
|
|
toml_content = """
|
|
name = "testzone"
|
|
width = 10
|
|
height = 10
|
|
|
|
[[spawns]]
|
|
mob = "rat"
|
|
max_count = 3
|
|
respawn_seconds = 300
|
|
|
|
[[spawns]]
|
|
mob = "goblin"
|
|
max_count = 1
|
|
respawn_seconds = 600
|
|
"""
|
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".toml", delete=False) as f:
|
|
f.write(toml_content)
|
|
f.flush()
|
|
temp_path = Path(f.name)
|
|
|
|
try:
|
|
zone = load_zone(temp_path)
|
|
assert len(zone.spawn_rules) == 2
|
|
assert zone.spawn_rules[0].mob == "rat"
|
|
assert zone.spawn_rules[0].max_count == 3
|
|
assert zone.spawn_rules[0].respawn_seconds == 300
|
|
assert zone.spawn_rules[1].mob == "goblin"
|
|
assert zone.spawn_rules[1].max_count == 1
|
|
assert zone.spawn_rules[1].respawn_seconds == 600
|
|
finally:
|
|
temp_path.unlink()
|
|
|
|
|
|
def test_load_zone_without_spawn_rules():
|
|
"""TOML without spawns defaults to empty list."""
|
|
toml_content = """
|
|
name = "testzone"
|
|
width = 10
|
|
height = 10
|
|
|
|
[terrain]
|
|
rows = [".........."]
|
|
"""
|
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".toml", delete=False) as f:
|
|
f.write(toml_content)
|
|
f.flush()
|
|
temp_path = Path(f.name)
|
|
|
|
try:
|
|
zone = load_zone(temp_path)
|
|
assert zone.spawn_rules == []
|
|
finally:
|
|
temp_path.unlink()
|
|
|
|
|
|
def test_spawn_rule_fields():
|
|
"""SpawnRule has mob, max_count, respawn_seconds fields."""
|
|
rule = SpawnRule(mob="rat", max_count=5, respawn_seconds=120)
|
|
assert rule.mob == "rat"
|
|
assert rule.max_count == 5
|
|
assert rule.respawn_seconds == 120
|
|
|
|
|
|
def test_spawn_rule_defaults():
|
|
"""SpawnRule has sensible defaults for max_count and respawn_seconds."""
|
|
rule = SpawnRule(mob="rat")
|
|
assert rule.mob == "rat"
|
|
assert rule.max_count == 1
|
|
assert rule.respawn_seconds == 300
|