feat(engine): 实现阵营投票系统

- 新增 Votes 模型,包含 optimists/fearful 计数和 voted_users 去重列表
- 扩展 Event 模型,添加可选 faction 字段支持投票事件
- 新增 voting.py 模块处理投票逻辑
- 投票规则:每用户每 tick 限投一次,下一 tick 生效
- 投票累加到 factions.power,达到 threshold 触发阵营技能
- 添加 5 个投票系统测试用例,全部 26 个测试通过

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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
empty
2025-12-30 13:12:22 +08:00
parent 87007d9b43
commit 75e84f2ba3
4 changed files with 163 additions and 0 deletions

View File

@@ -58,6 +58,14 @@ class Factions(BaseModel):
fearful: FactionData = Field(default_factory=FactionData)
class Votes(BaseModel):
"""投票统计"""
optimists: int = 0
fearful: int = 0
# 记录本 tick 已投票的用户(用于去重)
voted_users: List[str] = Field(default_factory=list)
class FactionEventResult(BaseModel):
"""阵营事件触发结果"""
type: Optional[str] = None # "festival" | "panic" | None
@@ -104,6 +112,7 @@ class WorldState(BaseModel):
world_effects: List[WorldEffect] = Field(default_factory=list)
factions: Factions = Field(default_factory=Factions)
story_arcs: Dict[str, StoryArc] = Field(default_factory=dict)
votes: Votes = Field(default_factory=Votes)
class Event(BaseModel):
@@ -111,6 +120,7 @@ class Event(BaseModel):
text: str
user: str
ts: float
faction: Optional[str] = None # 用于投票事件: "optimists" | "fearful"
class StepRequest(BaseModel):