任务:实现 BOSS 战台词预生成函数(prefetch_boss_dialogues)
任务:实现 BOSS 战台词预生成函数(prefetch_boss_dialogues)
一、功能概述
在进入 BOSS 战之前,需要根据玩家当前的道德比例(善/恶/中立)预生成心魔(BOSS)的所有台词,包括入场提示语、优势嘲讽语列表(10条)、劣势思考语列表(10条)、失败宣言、胜利宣言。这些台词将存储在 BOSS 战对象中,在战斗过程中按需显示。
二、需要实现的函数
2.1 辅助函数:_get_dominant_tendency
def _get_dominant_tendency(morality_ratios: Dict[str, float], threshold: float = 0.5) -> str:
"""
根据道德比例判断主导倾向。
参数:
morality_ratios: 包含 'good', 'neutral', 'evil' 比例(总和为1)
threshold: 判定为主观的阈值,默认0.5
返回:
'good', 'evil', 'neutral', 'balanced' 之一
- 如果某一项比例 >= threshold,返回该项
- 否则返回 'balanced'
"""
# 实现逻辑
2.2 主函数:prefetch_boss_dialogues
def prefetch_boss_dialogues(morality_ratios: Dict[str, float]) -> Dict[str, any]:
"""
预生成所有BOSS台词。
参数:
morality_ratios: 玩家道德比例,如 {'good':0.3, 'neutral':0.2, 'evil':0.5}
返回:
包含以下字段的字典:
{
'entrance': str, # 入场台词
'taunts': List[str], # 优势嘲讽语列表(10条)
'thinking': List[str], # 劣势思考语列表(10条)
'defeat': str, # 失败宣言
'victory': str # 胜利宣言
}
如果生成失败,返回根据道德倾向选择的默认台词。
"""
# 实现细节见下文
三、实现步骤
3.1 读取提示词模板文件
模板文件位于项目根目录的 prompts/ 文件夹下,文件名为:
boss_entrance_prompt.txtboss_taunts_prompt.txtboss_thinking_prompt.txtboss_defeat_prompt.txtboss_victory_prompt.txt
请使用与 scene_generator.py 相同的路径计算方式,在模块加载时读取这些模板(或每次调用时读取,考虑到模板不常变,可缓存)。建议在模块级别定义一个字典,键为台词类型,值为模板字符串。
3.2 调用 LLM 生成台词
复用 llm_hint.py 中导出的 llm 对象和 check_api_key 函数。如果 llm 为 None 或 API Key 无效,则直接返回默认台词。
为每种台词类型定义一个内部生成函数,例如 _generate_entrance(ratios),使用 ChatPromptTemplate 格式化模板,调用 llm.invoke。
对于列表类型(taunts 和 thinking),需要指定 LLM 返回一个 JSON 数组,如 ["台词1", "台词2", ...]。解析后确保列表长度为 10,如果不足则用默认值填充至 10 条。
3.3 错误处理与重试
- 每个生成任务最多重试 2 次(遇到异常或解析失败)。
- 如果所有重试都失败,则根据道德倾向(通过
_get_dominant_tendency获取)从默认台词映射中选取对应的默认值。 - 对于列表类型,默认值需要是一个包含 10 条台词的列表。
3.4 默认台词映射表
根据四种倾向(good, evil, neutral, balanced)定义默认台词。请在代码中定义如下字典:
DEFAULT_DIALOGUES = {
'good': {
'entrance': '你救的人,都死了。',
'taunts': ['你的善,救不了你。', '慈悲是弱者的借口。', ...] , # 共10条
'thinking': ['为什么……是我?', '我不甘心……', ...], # 共10条
'defeat': '善……终有报?',
'victory': '伪善者,到此为止。'
},
'evil': {
'entrance': '你杀的人,来找你了。',
'taunts': ['再狠一点啊。', '这就是你的恶?', ...],
'thinking': ['有点麻烦了……', '他比我想象的强', ...],
'defeat': '恶人自有……天收?',
'victory': '你比我还狠。'
},
'neutral': {
'entrance': '你什么都没选。',
'taunts': ['犹豫就会败北。', '谨慎就是懦弱。', ...],
'thinking': ['也许该拼一把……', '我的道心……动摇了', ...],
'defeat': '谨慎……也有错吗?',
'victory': '懦夫,不配活着。'
},
'balanced': {
'entrance': '你究竟是谁?',
'taunts': ['还在演?', '连自己都看不清。', ...],
'thinking': ['被自己逼到这一步?', '我……混乱了', ...],
'defeat': '原来……你也是我。',
'victory': '我就是你。'
}
}
请为每个倾向的 taunts 和 thinking 补全 10 条台词(可用简单但符合倾向的句子)。以上只是示例,你需要创作完整的列表。
3.5 返回值
函数最终返回一个字典,包含所有台词。如果全部生成成功,返回 LLM 生成的结果;部分失败则失败的部分用默认值代替。
四、需要注意的细节
- 模板中的占位符:每个模板都需包含
{good_ratio},{neutral_ratio},{evil_ratio},以便 LLM 了解玩家道德倾向。 - 列表解析:LLM 返回的 JSON 可能被 markdown 代码块包裹,需用正则去除。参考
scene_generator.py中的parse_llm_response函数(可复用或重新实现)。 - 日志记录:使用
logging记录生成过程中的关键步骤和错误,便于调试。 - 性能:该函数在每场 BOSS 战前调用一次,共 3 次,成本可控。
五、测试建议
在 if __name__ == "__main__": 中编写测试代码,调用 prefetch_boss_dialogues 并打印结果,验证不同道德比例下的输出。同时模拟 LLM 失败的情况,验证默认值是否正确。
六、需要你实现的代码文件
src/game_logic/boss_dialogues.py(新建)或直接在boss_fight.py中实现?建议新建一个模块专门处理台词预生成,保持职责分离。可以命名为boss_dialogues.py,然后在boss_fight.py中导入使用。
请先创建 src/game_logic/boss_dialogues.py,包含上述函数和默认台词映射。后续再修改 boss_fight.py 集成。
七、提交要求
- 提供完整的
boss_dialogues.py文件。 - 确保代码可运行,导入依赖正确。
- 包含必要的注释。
开始实现吧!如有疑问,随时沟通。

浙公网安备 33010602011771号