Skip to content

LingChat AI-Galgame 剧情创作指南

本指南将教你如何使用我们独特的剧情脚本系统,创作出由AI赋予灵魂、充满互动与惊喜的Galgame故事。

你不需要编写任何代码,只需要学会使用我们简单直观的剧情脚本(.txt文件),就能构建出完整的游戏世界。

第一章:核心理念——编剧的魔杖

传统的Galgame剧情是固定的,玩家的每一次选择都通向一个预设好的分支。而我们的系统引入了AI驱动的核心理念,这意味着:

  1. 角色拥有“灵魂”:AI角色(如“浅川夏帆”)不再是念台词的木偶。她会根据你的角色设定(Persona)实时对话,生成真正属于她自己的反应和台词。
  2. 对话充满“不确定性”:你不需要写死每一句对话。你可以给AI一个“内心活动”或“情境提示”,让她自己组织语言。这使得每一次游玩体验都可能有些微不同,更具真实感。
  3. 剧情分支更加“智能”:除了玩家的选择,AI角色自己也可以根据与玩家的互动,自主做出决定,从而推动剧情走向不同的分支。

你的工作,就是利用手中的“魔杖”——剧情脚本,来引导和塑造这一切。

第二章:全局设定——世界的基石

在开始创作具体剧情前,我们需要先定义好世界的基石。这一切都在 story/character_config.txt 文件中完成。

1. 角色命名 (AI_Name & Player_Name)

  • AI_Name: 你的AI女主角的名字。这个名字会自动替换所有剧情脚本中的 [AI名] 占位符。
  • Player_Name: 玩家的名字。同理,它会替换 [玩家名]

2. AI的核心灵魂 (AI_Persona)

这是整个游戏最重要的部分。AI_Persona 定义了AI角色的性格、背景、价值观和行为模式。它是一切AI生成内容的“最高指令”。

编写优秀的 AI_Persona 的技巧:

  • 使用第一人称视角:用“你是XXX”的口吻来写,这能让AI更好地代入角色。
  • 描绘内外反差:如示例中的“外表文静内向,但内心细腻”,这种反差能让角色更立体。
  • 定义核心关系:明确她与玩家的关系和她对这段关系的态度(例如:“你非常看重和[玩家名]的关系”)。
  • 设定行为动机:她为什么会这么做?(例如:“很在意他对你的看法”)。
  • 加入“黄金法则”:最后一句 “记住,你不是AI助手,你就是浅川夏帆,请完全代入这个角色进行回应。” 至关重要,它能有效防止AI“出戏”,避免出现“作为一个AI模型……”之类的回答。

AI_Persona 写得越好,AI在游戏中的表现就越稳定、越符合人设。

第三章:剧情单元——故事的积木

你的整个故事是由一个个“剧情单元(Unit)”串联起来的。每个单元代表一个独立的场景。让我们来解构一个剧情单元的组成部分。

1. 基础信息

  • UnitID: 剧情单元的唯一身份证。必须是独一无二的,用于剧情跳转。推荐命名方式:场景_序号,如 Classroom_01
  • UnitName: 场景的名称,会显示给玩家看。

2. 场景参数

  • SceneCG: 该场景的背景图片。
  • BGM: 该场景的背景音乐。
  • Time: 故事发生的时间,会自动替换脚本中的 <时间> 占位符。

3. 剧情事件序列 (Events)

这是单元的核心,一个按照顺序执行的事件列表。引擎会从上到下一个个处理。

事件类型 1:旁白 (Narration)

用于描述环境、角色动作或内心独白。

  • Mode: Preset (预设模式):

    • 用途:讲述固定不变的剧情、环境描写。
    • 写法Content 后面直接写下你想显示的旁白文字。
    yaml
    - Type: Narration
      Mode: Preset
      Content: "夕阳的余晖透过窗户,洒在空无一人的教室里。"
  • Mode: Prompt (提示模式):

    • 用途:需要AI根据上下文动态生成的、富有文采的过渡或氛围描写。
    • 写法Content 后面写下给AI的指令,告诉它要生成一段什么样的旁白。
    yaml
    - Type: Narration
      Mode: Prompt
      Content: "你是一个负责剧情衔接的旁白。请描述[玩家名]看着[AI名]转身离去的背影,在<时间>的夜色下,心中涌起的一丝莫名的失落与怅然。"

事件类型 2:对话 (Dialogue)

角色的台词。

  • Character: 发言的角色,直接写名字(会被AI_NamePlayer_Name自动替换)。

  • Mode: Preset (预设模式):

    • 用途:用于推动剧情的关键性台词,或AI角色的开场白。
    • 写法Content 后面直接写下固定台词。
    yaml
    - Type: Dialogue
      Character: 浅川夏帆
      Mode: Preset
      Content: "呼...终于弄完了。今天值日还真是有点累呢。"
  • Mode: Prompt (提示模式):

    • 用途这正是AI驱动的核心! 让AI根据玩家的上一句话和当前情境,生成符合人设的台词。
    • 写法Content 后面写下给AI的**“内心活动”指令**。这非常重要,你不是在写台词,而是在描绘角色此刻的心理状态和说话意图。
    yaml
    - Type: Dialogue
      Character: 浅川夏帆
      Mode: Prompt
      Content: "这是你的内心活动:听了[玩家名]的回应,你感觉心情放松了一些。但一想到下周就要考试了,又感到一阵焦虑。你看着他,略带担忧地提起考试的话题。"

    【关键技巧】:写Prompt模式的对话时,多使用“你感觉……”、“你想要……”、“你试探性地……”、“你鼓起勇气……”等描述心理动机的词语。

事件类型 3:等待玩家输入 (WaitForPlayerInput)

这是一个暂停标志。当引擎执行到这里,会停下来,等待玩家在终端输入回应。

  • 用途创造对话的节奏感。通常放在AI的一句台词之后,让玩家可以回应,然后再触发AI的下一句(通常是Prompt模式的)台词。这是实现真实互动的关键!
  • InstructionToPlayer (可选): 可以给玩家一些提示,告诉他当前的输入可能会有什么影响。
yaml
# AI说完话
- Type: Dialogue
  Character: 浅川夏帆
  Mode: Preset
  Content: "那...就到这里了。你回家也早点开始复习哦。"

# 停下来,等玩家回应
- Type: WaitForPlayerInput

# AI根据玩家的回应,生成下一句话
- Type: Dialogue
  Character: 浅川夏帆
  Mode: Prompt
  Content: "这是你的内心活动:听了[玩家名]的话,你点点头,但心里还是觉得有点空落落的。你对他挥了挥手,再次叮嘱他路上小心。"

第四章:剧情的流转——结束与分支

每个单元的结尾都需要一个 EndCondition,它决定了接下来会发生什么。

1. 线性结局 (Linear)

  • 用途:一本道的剧情,当前单元结束后,直接进入下一个指定单元。
  • 写法
yaml
EndCondition:
  Type: Linear
  NextUnitID: SchoolGate_02 # 直接指定下一个单元的ID

2. 自由时间 (FreeTime)

  • 用途:提供一个“聊天沙盒”,让玩家可以在特定场景下与AI自由对话,直到触发结束语。
  • 写法
yaml
EndCondition:
  Type: FreeTime
  # 给玩家的提示
  InstructionToPlayer: "你已进入自由聊天时间。点击右上方按钮或输入“时间不早了”可结束对话。"
  # 触发结束的关键词
  ExitPromptInInputBox: "时间不早了,我们开始学习吧!"
  # 结束后跳转的单元ID
  NextUnitID: Park_04

3. 分支结局 (Branching)

  • 用途:故事的核心玩法!让剧情根据玩家的选择AI的决定走向不同的道路。

  • Method: PlayerChoice (玩家选择):

    • 用途:经典的选项分支。
    • 写法:在Branches下定义多个选项(A, B, C...),每个选项包含 DisplayText(显示给玩家看的选项文本)和 NextUnitID(选择后跳转的单元ID)。
    yaml
    EndCondition:
      Type: Branching
      Method: PlayerChoice
      Branches:
        A: 
          DisplayText: "上前打个招呼"
          NextUnitID: Park_Encounter_05A
        B: 
          DisplayText: "还是不要打扰她了,悄悄离开"
          NextUnitID: GoHome_Quietly_05B
  • Method: AIChoice (AI决定):

    • 用途最具革命性的功能! 让AI角色根据之前的对话,自己做出决定,从而影响剧情走向。
    • 写法:这需要两步Prompt。
      1. DecisionPromptForAI: 给AI的决策指令。这个指令会生成一段AI的台词,这段台词会显示给玩家,表明AI做出了什么决定。
      2. JudgePromptForSystem: 给系统的判断指令。这是一个隐藏的指令,它会分析AI生成的决策台词,并输出一个简单的'A'或'B'来告诉引擎应该走哪个分支。你必须包含 {AI_LAST_RESPONSE} 占位符。
    • 示例剖析
    yaml
    EndCondition:
      Type: Branching
      Method: AIChoice
      # 1. AI根据这个Prompt,说出自己的决定 (玩家可见)
      DecisionPromptForAI: "这是你的内心活动:现在是时候做出决定了。综合刚才和[玩家名]的对话,以及他对你邀请的回应,明确告诉他,你最终决定'一起去自习室'还是'先各自回家'复习。"
      
      # 2. 系统后台根据AI说的话,进行判断 (玩家不可见)
      JudgePromptForSystem: |
        你是AI-galgame的剧情助手。请根据[浅川夏帆]的最后一句话,判断她是打算 A:去自习室学习 还是 B:在家学习。
        你只能输出'A'或'B',无需任何其他解释。
        [浅川夏帆]的回答是:{AI_LAST_RESPONSE}
        
      # 3. 根据判断结果(A或B),跳转到不同剧情
      Branches:
        A: Library_03A
        B: GoHome_03B

第五章:优秀编剧的最佳实践

  1. 节奏为王:巧妙地混合 PresetPrompt 模式。用 Preset 稳定主线,用 Prompt 增添血肉和真实感。
  2. 善用WaitForPlayerInput:不要让AI自言自语说太长。在关键节点插入等待,让玩家参与进来,这是“互动”的核心。
  3. 精准的Prompt:给AI的指令(无论是对话还是旁白)要清晰、具体。提供“内心活动”和“情感状态”远比直接命令它“说一句话”效果好。
  4. 为AI决策铺垫:在使用 AIChoice 前,确保前面的对话已经为AI提供了足够的信息来做判断。例如,在邀请玩家一起学习前,先问问玩家的计划。
  5. 画出你的故事树:在开始写之前,可以简单画一个流程图,标明每个UnitID以及它们之间的跳转关系,这会让你思路更清晰。
  6. 亲自测试!:由于AI的存在,你写的脚本可能会产生意想不到的效果。一定要亲自运行和测试你的剧情,看看AI的反应是否符合预期,并根据测试结果微调你的Prompt