任务:实现 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.txt
  • boss_taunts_prompt.txt
  • boss_thinking_prompt.txt
  • boss_defeat_prompt.txt
  • boss_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': '我就是你。'
    }
}

请为每个倾向的 tauntsthinking 补全 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 文件。
  • 确保代码可运行,导入依赖正确。
  • 包含必要的注释。

开始实现吧!如有疑问,随时沟通。

posted @ 2026-03-16 23:32  神秘园欢迎您  阅读(12)  评论(0)    收藏  举报