- 扩展 AgentState 添加 action_points, max_action_points, last_action_tick 字段 - 新增 ActionFeedback 模型用于返回行动执行结果 - 创建 action_points.py 模块实现行动点消耗与恢复逻辑 - 行动消耗表: vote=1, trigger_skill=2, influence=2, comment/support/chaos=0 - 每 tick 恢复 1 点行动点(不超过 max) - 行动点不足时拒绝执行并返回失败反馈 - 新增 7 个测试用例,全部 37 个测试通过 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
62 lines
2.0 KiB
Python
62 lines
2.0 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
|
|
from .faction_skills import get_default_faction_skills
|
|
|
|
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",
|
|
action_points=3,
|
|
max_action_points=3,
|
|
last_action_tick=0,
|
|
),
|
|
"bob": AgentState(
|
|
emotion="calm",
|
|
goal="与人交流",
|
|
memory=[],
|
|
stance=Stance(optimism=0.4, fear=0.6),
|
|
faction="neutral",
|
|
action_points=3,
|
|
max_action_points=3,
|
|
last_action_tick=0,
|
|
),
|
|
},
|
|
events=[],
|
|
global_meter=GlobalMeter(value=0, threshold=100, cooldown=0),
|
|
factions=Factions(
|
|
optimists=FactionData(power=0, threshold=10, skill="festival", members=[]),
|
|
fearful=FactionData(power=0, threshold=10, skill="panic", members=[])
|
|
),
|
|
story_arcs=get_default_story_arcs(),
|
|
faction_skills=get_default_faction_skills(),
|
|
)
|
|
|
|
|
|
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)
|