LingChat AI-Galgame 剧情创作指南
本指南将教你如何使用我们独特的剧情脚本系统,创作出由AI赋予灵魂、充满互动与惊喜的Galgame故事。
你不需要编写任何代码,只需要学会使用我们简单直观的剧情脚本(.txt
文件),就能构建出完整的游戏世界。
第一章:核心理念——编剧的魔杖
传统的Galgame剧情是固定的,玩家的每一次选择都通向一个预设好的分支。而我们的系统引入了AI驱动的核心理念,这意味着:
- 角色拥有“灵魂”:AI角色(如“浅川夏帆”)不再是念台词的木偶。她会根据你的角色设定(Persona)和实时对话,生成真正属于她自己的反应和台词。
- 对话充满“不确定性”:你不需要写死每一句对话。你可以给AI一个“内心活动”或“情境提示”,让她自己组织语言。这使得每一次游玩体验都可能有些微不同,更具真实感。
- 剧情分支更加“智能”:除了玩家的选择,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_Name
和Player_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
(可选): 可以给玩家一些提示,告诉他当前的输入可能会有什么影响。
# AI说完话
- Type: Dialogue
Character: 浅川夏帆
Mode: Preset
Content: "那...就到这里了。你回家也早点开始复习哦。"
# 停下来,等玩家回应
- Type: WaitForPlayerInput
# AI根据玩家的回应,生成下一句话
- Type: Dialogue
Character: 浅川夏帆
Mode: Prompt
Content: "这是你的内心活动:听了[玩家名]的话,你点点头,但心里还是觉得有点空落落的。你对他挥了挥手,再次叮嘱他路上小心。"
第四章:剧情的流转——结束与分支
每个单元的结尾都需要一个 EndCondition
,它决定了接下来会发生什么。
1. 线性结局 (Linear
)
- 用途:一本道的剧情,当前单元结束后,直接进入下一个指定单元。
- 写法:
EndCondition:
Type: Linear
NextUnitID: SchoolGate_02 # 直接指定下一个单元的ID
2. 自由时间 (FreeTime
)
- 用途:提供一个“聊天沙盒”,让玩家可以在特定场景下与AI自由对话,直到触发结束语。
- 写法:
EndCondition:
Type: FreeTime
# 给玩家的提示
InstructionToPlayer: "你已进入自由聊天时间。点击右上方按钮或输入“时间不早了”可结束对话。"
# 触发结束的关键词
ExitPromptInInputBox: "时间不早了,我们开始学习吧!"
# 结束后跳转的单元ID
NextUnitID: Park_04
3. 分支结局 (Branching
)
用途:故事的核心玩法!让剧情根据玩家的选择或AI的决定走向不同的道路。
Method: PlayerChoice
(玩家选择):- 用途:经典的选项分支。
- 写法:在
Branches
下定义多个选项(A, B, C...),每个选项包含DisplayText
(显示给玩家看的选项文本)和NextUnitID
(选择后跳转的单元ID)。
yamlEndCondition: Type: Branching Method: PlayerChoice Branches: A: DisplayText: "上前打个招呼" NextUnitID: Park_Encounter_05A B: DisplayText: "还是不要打扰她了,悄悄离开" NextUnitID: GoHome_Quietly_05B
Method: AIChoice
(AI决定):- 用途:最具革命性的功能! 让AI角色根据之前的对话,自己做出决定,从而影响剧情走向。
- 写法:这需要两步Prompt。
DecisionPromptForAI
: 给AI的决策指令。这个指令会生成一段AI的台词,这段台词会显示给玩家,表明AI做出了什么决定。JudgePromptForSystem
: 给系统的判断指令。这是一个隐藏的指令,它会分析AI生成的决策台词,并输出一个简单的'A'或'B'来告诉引擎应该走哪个分支。你必须包含{AI_LAST_RESPONSE}
占位符。
- 示例剖析:
yamlEndCondition: 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
第五章:优秀编剧的最佳实践
- 节奏为王:巧妙地混合
Preset
和Prompt
模式。用Preset
稳定主线,用Prompt
增添血肉和真实感。 - 善用
WaitForPlayerInput
:不要让AI自言自语说太长。在关键节点插入等待,让玩家参与进来,这是“互动”的核心。 - 精准的Prompt:给AI的指令(无论是对话还是旁白)要清晰、具体。提供“内心活动”和“情感状态”远比直接命令它“说一句话”效果好。
- 为AI决策铺垫:在使用
AIChoice
前,确保前面的对话已经为AI提供了足够的信息来做判断。例如,在邀请玩家一起学习前,先问问玩家的计划。 - 画出你的故事树:在开始写之前,可以简单画一个流程图,标明每个
UnitID
以及它们之间的跳转关系,这会让你思路更清晰。 - 亲自测试!:由于AI的存在,你写的脚本可能会产生意想不到的效果。一定要亲自运行和测试你的剧情,看看AI的反应是否符合预期,并根据测试结果微调你的
Prompt
。