改进阶段提示和自动流转功能

This commit is contained in:
2025-11-04 17:43:27 +08:00
parent 9ed8fffcf7
commit 4027771a65
2 changed files with 219 additions and 40 deletions

View File

@@ -26,6 +26,30 @@ class WerewolfGame(BaseGame):
}
self.min_players = 6
self.max_players = 12
# 阶段名称映射:{阶段代码: {'name': 中文名称, 'role': 行动角色, 'instruction': 指令说明}}
self.phase_configs = {
'night_kill': {
'name': '狼人行动阶段',
'role': '狼人',
'instruction': '使用 `.werewolf 杀 <id>` 投票杀人'
},
'night_seer': {
'name': '预言家验人阶段',
'role': '预言家',
'instruction': '使用 `.werewolf 验 <id>` 查验身份'
},
'night_witch': {
'name': '女巫行动阶段',
'role': '女巫',
'instruction': '使用 `.werewolf 救 <id>` 救人、`.werewolf 毒 <id>` 毒人,或 `.werewolf 跳过` 不行动'
},
'day_discuss': {
'name': '白天讨论阶段',
'role': '所有玩家',
'instruction': '讨论昨晚的事件'
}
}
async def handle(self, command: str, chat_id: int, user_id: int) -> str:
"""处理狼人杀指令
@@ -86,6 +110,10 @@ class WerewolfGame(BaseGame):
except ValueError:
pass
# 女巫跳过指令
if action in ['跳过', 'pass']:
return await self._witch_pass(chat_id, user_id)
# 技能指令
if action in ['', '', '', '', '']:
if len(parts) < 2:
@@ -131,6 +159,78 @@ class WerewolfGame(BaseGame):
"""
self.db.save_game_state(chat_id, 0, 'werewolf', state_data)
def _get_phase_description(self, phase: str) -> Dict[str, str]:
"""获取阶段描述信息
Args:
phase: 阶段代码
Returns:
阶段描述字典包含name、role、instruction
"""
return self.phase_configs.get(phase, {
'name': phase,
'role': '未知',
'instruction': ''
})
def _get_next_phase(self, current_phase: str) -> Optional[str]:
"""获取下一阶段
Args:
current_phase: 当前阶段代码
Returns:
下一阶段代码如果无下一阶段则返回None
"""
phase_sequence = ['night_kill', 'night_seer', 'night_witch', 'day_discuss']
try:
current_index = phase_sequence.index(current_phase)
if current_index < len(phase_sequence) - 1:
return phase_sequence[current_index + 1]
except ValueError:
pass
return None
def _advance_phase(self, chat_id: int, state_data: Dict) -> str:
"""推进到下一阶段
Args:
chat_id: 会话ID
state_data: 游戏状态
Returns:
阶段推进提示消息
"""
current_phase = state_data.get('phase')
if not current_phase:
return ""
next_phase = self._get_next_phase(current_phase)
if not next_phase:
return ""
# 更新阶段
state_data['phase'] = next_phase
self._save_game_state(chat_id, state_data)
# 获取下一阶段描述
next_phase_desc = self._get_phase_description(next_phase)
# 构建提示消息
round_num = state_data.get('round', 1)
if next_phase.startswith('night'):
time_desc = "夜晚"
else:
time_desc = "白天"
msg = f"\n\n---\n\n## 🌙 进入下一阶段\n\n"
msg += f"**{time_desc} - {next_phase_desc['name']}**\n\n"
msg += f"👤 {next_phase_desc['role']}请行动:\n"
msg += f"{next_phase_desc['instruction']}"
return msg
def _open_game(self, chat_id: int, user_id: int) -> str:
"""主持人开房
@@ -296,8 +396,16 @@ class WerewolfGame(BaseGame):
# 私聊发送身份
await self._send_identities(chat_id, state_data)
# 获取当前阶段描述
phase_desc = self._get_phase_description('night_kill')
# 公共消息
return f"## 🎮 游戏开始!\n\n玩家已分配身份,请查看私聊消息\n\n第一夜,天黑请闭眼..."
msg = f"## 🎮 游戏开始!\n\n玩家已分配身份,请查看私聊消息\n\n"
msg += f"---\n\n## 🌙 第一夜 - {phase_desc['name']}\n\n"
msg += f"🐺 **{phase_desc['role']}请行动**\n"
msg += f"{phase_desc['instruction']}"
return msg
async def _send_identities(self, chat_id: int, state_data: Dict):
"""发送身份信息到私聊
@@ -316,7 +424,7 @@ class WerewolfGame(BaseGame):
role_details = {
'wolf': '你的技能:\n- 每晚可以投票决定杀死一个目标\n- 你认识所有狼人同伴\n- 胜利条件:杀死所有神职和平民\n\n使用 `.werewolf 杀 <id>` 投票杀人',
'seer': '你的技能:\n- 每晚可以查验一个玩家的身份\n- 胜利条件:消灭所有狼人\n\n使用 `.werewolf 验 <id>` 查验身份',
'witch': '你的技能:\n- 拥有一瓶解药和一瓶毒药\n- 每晚可以救人(只能使用一次)或毒人(只能使用一次)\n- 胜利条件:消灭所有狼人\n\n使用 `.werewolf 救 <id>` 救人\n使用 `.werewolf 毒 <id>` 毒人',
'witch': '你的技能:\n- 拥有一瓶解药和一瓶毒药\n- 每晚可以救人(只能使用一次)或毒人(只能使用一次)\n- 也可以选择跳过不行动\n- 胜利条件:消灭所有狼人\n\n使用 `.werewolf 救 <id>` 救人\n使用 `.werewolf 毒 <id>` 毒人\n使用 `.werewolf 跳过` 不行动',
'civilian': '你没有特殊技能\n\n你的胜利条件:消灭所有狼人\n\n仔细观察,通过投票帮助好人阵营获胜'
}
@@ -534,12 +642,20 @@ class WerewolfGame(BaseGame):
if not target['alive']:
return f"{target_id}号玩家已死亡!"
# 检查当前阶段
if current_phase != 'night_kill':
return f"❌ 当前不是狼人行动阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 记录投票
# 简化:只要有一个狼人投票就算成功
if state_data.get('kill_target') is None:
state_data['kill_target'] = target_id
self._save_game_state(chat_id, state_data)
return f"✅ 投票成功:刀{target_id}号玩家"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 投票成功:刀{target_id}号玩家{next_phase_msg}"
else:
return f"⚠️ 今晚已经有了投票目标:{state_data['kill_target']}"
@@ -562,6 +678,10 @@ class WerewolfGame(BaseGame):
if not current_phase or not current_phase.startswith('night'):
return "❌ 只能在夜晚使用技能!"
# 检查当前阶段
if current_phase != 'night_seer':
return f"❌ 当前不是预言家验人阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 查找目标
target = None
for p in state_data['players']:
@@ -582,7 +702,10 @@ class WerewolfGame(BaseGame):
msg = f"## 🔮 验人结果\n\n{target_id}号玩家的身份是:**{result_text}**"
await self._send_to_player(player['user_id'], msg, sender="系统")
return f"✅ 验人成功!已私聊发送结果"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 验人成功!已私聊发送结果{next_phase_msg}"
async def _witch_save(self, chat_id: int, state_data: Dict, player: Dict, target_id: int) -> str:
"""女巫救人
@@ -606,6 +729,10 @@ class WerewolfGame(BaseGame):
if not current_phase or not current_phase.startswith('night'):
return "❌ 只能在夜晚使用技能!"
# 检查当前阶段
if current_phase != 'night_witch':
return f"❌ 当前不是女巫行动阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 查找目标
target = None
for p in state_data['players']:
@@ -620,7 +747,10 @@ class WerewolfGame(BaseGame):
state_data['witch_save'] = True
self._save_game_state(chat_id, state_data)
return f"✅ 救人成功:救了{target_id}号玩家"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 救人成功:救了{target_id}号玩家{next_phase_msg}"
async def _witch_poison(self, chat_id: int, state_data: Dict, player: Dict, target_id: int) -> str:
"""女巫毒人
@@ -644,6 +774,10 @@ class WerewolfGame(BaseGame):
if not current_phase or not current_phase.startswith('night'):
return "❌ 只能在夜晚使用技能!"
# 检查当前阶段
if current_phase != 'night_witch':
return f"❌ 当前不是女巫行动阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 查找目标
target = None
for p in state_data['players']:
@@ -661,7 +795,52 @@ class WerewolfGame(BaseGame):
state_data['witch_poison'] = target_id
self._save_game_state(chat_id, state_data)
return f"✅ 毒人成功:毒了{target_id}号玩家"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 毒人成功:毒了{target_id}号玩家{next_phase_msg}"
async def _witch_pass(self, chat_id: int, user_id: int) -> str:
"""女巫跳过(不行动)
Args:
chat_id: 会话ID
user_id: 用户ID
Returns:
提示消息
"""
state_data = self._get_game_state(chat_id)
if not state_data:
return "❌ 没有正在进行的游戏!"
if state_data['status'] != 'playing':
return "❌ 游戏未开始或已结束!"
# 查找玩家
player = None
for p in state_data['players']:
if p['user_id'] == user_id:
player = p
break
if not player:
return "❌ 你不是游戏参与者!"
if player['role'] != 'witch':
return "❌ 只有女巫可以跳过!"
if not player['alive']:
return "❌ 死亡玩家无法使用技能!"
current_phase = state_data['phase']
if current_phase != 'night_witch':
return f"❌ 当前不是女巫行动阶段!当前阶段:{self._get_phase_description(current_phase)['name']}"
# 自动推进到下一阶段
next_phase_msg = self._advance_phase(chat_id, state_data)
return f"✅ 女巫选择跳过,不行动{next_phase_msg}"
def _show_status(self, chat_id: int) -> str:
"""显示游戏状态
@@ -683,11 +862,18 @@ class WerewolfGame(BaseGame):
if status != 'playing':
return "❌ 游戏未开始或已结束!"
# 获取当前阶段描述
current_phase = state_data.get('phase', 'unknown')
phase_desc = self._get_phase_description(current_phase)
# 显示玩家状态(只显示存活状态,不显示身份)
msg = f"## 🎮 游戏进行中\n\n"
msg += f"回合:第{state_data['round']}回合\n"
msg += f"阶段:{state_data['phase']}\n\n"
msg += f"**玩家状态**\n"
msg += f"**回合**:第{state_data['round']}回合\n"
msg += f"**当前阶段**{phase_desc['name']}\n"
msg += f"**行动角色**{phase_desc['role']}\n"
if phase_desc['instruction']:
msg += f"**操作指令**{phase_desc['instruction']}\n"
msg += f"\n**玩家状态**\n"
alive_count = 0
dead_count = 0
@@ -752,6 +938,7 @@ class WerewolfGame(BaseGame):
- `.werewolf 验 <id>` - 预言家验人
- `.werewolf 救 <id>` - 女巫救人
- `.werewolf 毒 <id>` - 女巫毒人
- `.werewolf 跳过` - 女巫跳过(不行动)
### 游戏规则
**人数配置**