Files
ai-town/engine-python/app/state.py
empty cec3e95a4b feat(engine): add story arc system for narrative-driven world
- Add StoryArc and StoryEventResult models
- Create story_arcs.py with progress tracking logic
- Implement two story arcs: civil_unrest and golden_age
- Progress updates based on faction power balance
- Trigger story events when progress reaches threshold
- Add 3 tests for story arc system

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 12:06:14 +08:00

54 lines
1.6 KiB
Python

import json
from pathlib import Path
from .models import WorldState, AgentState, GlobalMeter, Stance, Factions, FactionData
from .story_arcs import get_default_story_arcs
STATE_FILE = Path(__file__).parent.parent / "state.json"
def get_default_state() -> WorldState:
"""创建默认的世界状态"""
return WorldState(
tick=0,
weather="sunny",
town_mood=0,
agents={
"alice": AgentState(
emotion="calm",
goal="探索小镇",
memory=[],
stance=Stance(optimism=0.6, fear=0.4),
faction="neutral",
),
"bob": AgentState(
emotion="calm",
goal="与人交流",
memory=[],
stance=Stance(optimism=0.4, fear=0.6),
faction="neutral",
),
},
events=[],
global_meter=GlobalMeter(value=0, threshold=100, cooldown=0),
factions=Factions(
optimists=FactionData(power=0, members=[]),
fearful=FactionData(power=0, members=[])
),
story_arcs=get_default_story_arcs(),
)
def load_state() -> WorldState:
"""从文件加载状态,如果不存在则创建默认状态"""
if STATE_FILE.exists():
with open(STATE_FILE, "r", encoding="utf-8") as f:
data = json.load(f)
return WorldState(**data)
return get_default_state()
def save_state(state: WorldState) -> None:
"""保存状态到文件"""
with open(STATE_FILE, "w", encoding="utf-8") as f:
json.dump(state.model_dump(), f, ensure_ascii=False, indent=2)