NPC 是否应该给每位玩家相同的回答?保持事实一致,而非措辞一致
当玩家向同一个虚构 NPC 提问时,回答应保持相同的共享设定,但无需使用完全相同的措辞。一条实用的设计原则是:对比每位玩家已发现的信息以及当前场景中正在发生的事情。随后,NPC 可以在回应这种状态的同时,确保既定事实、角色认知和任务信息保持连贯。
将事实与表达方式区分开来
首先写下回答的事实核心:世界中的客观事实是什么、NPC 知道什么,以及 NPC 在此时愿意透露什么。对于处于相同故事状态的玩家,保持这些核心要素稳定不变。然后,允许在表达方式上有所变化,例如用词、句长、语气,或简要提及玩家已经了解的事情。
例如,假设一位虚构的港口管理员知道东门在日落时关闭。一位还没去过东门的玩家可能会听到:“日落前走东门;之后它就会被锁上。”而一位刚刚看到守卫准备关门的玩家可能会听到:“你看到他们在做准备了。你在日落前还有时间。”虽然两句话不同,但时间安排和警告内容是一致的。
这种区分有助于避免两个常见问题:当玩家刚刚提供了相关背景时,逐字重复同一句话会显得漫不经心;而随意改变根本答案则可能让角色显得不可靠,或者增加跟进任务的难度。一项关于 NPC 对话生成的研究指出,其挑战在于让对话忠实于世界观设定、角色关系、任务结构以及透露给玩家的细节。即使是由人工撰写对话,这也是一个非常实用的设计标准。Weir 等人,《Ontologically Faithful Generation of Non-Player Character Dialogues》(非玩家角色对话的本体论忠实生成)
确定哪些玩家状态差异具有重要意义
利用可观察的故事状态来决定回答是否应该改变。相关状态可能包括玩家是否找到了某份文件、是否与另一个角色交谈过、是否开启了一条路线,或是否在特定场景期间到达。这些都是可以在故事中呈现并在选择对话时进行检查的具体事件。
不要从玩家的措辞中推测其隐藏身份或个人特质。对于这项设计任务,角色的回答可以对虚构世界中发生的事情做出反应:“你找到了账本,”或者“集市已经关门了。”它无需猜测玩家是谁、他们是怎样的人,或是他们为什么提问。这样可以确保适应性是与叙事相连,而不是与缺乏依据的用户画像相连。
一个实用的检验方法是问自己:如果两名玩家经历过相同的相关事件且处于同一场景中,他们是否应该获得相同的信息?如果是,就将该信息视为该状态下的共享信息。如果他们的发现不同,就相应地调整 NPC 可以合理解释或透露的内容。如果场景发生了变化,在不改写世界历史的前提下,更新那些随时间或环境而改变的细节。
分别追踪知识和场景状态
一份精炼的对话方案可以为每个回答列出三件事:设定事实、NPC 的知识或透露状态,以及当前的场景状况。将它们区分开来,可以更容易看清哪些可以变化,哪些绝不能改变。
对于那位港口管理员,笔记可能会这样记录:
设定事实:东门在日落时关闭。
NPC 知识:管理员知道张贴的时间表,并看到守卫在准备关门。
场景状况:日落前,大门开启;日落后,大门上锁。
尚未了解大门情况的玩家会收到基础指引。已经看到守卫的玩家可以收到简短的确认。日落后,管理员应该将大门描述为已关闭,并且仅提供既定故事所支持的备选项。如果没有既定的备选项,对话就不应为了显得热心而凭空捏造一个。
这种分离也让后续修改更安全。更改场景时间表应该促使对依赖它的每个回答进行检查。更改某句话的措辞不应意外改变任务线索。Ink 脚本文档说明了故事变量如何存储游戏状态,以及条件选项如何控制出现哪些台词。Twine 的文档同样将变量描述为可在受支持的故事格式中跨段落访问的存储值。这些工具提供了实现显式状态的方法;它们并不决定你的故事应将哪些事实视为正统设定。Ink:“Writing with Ink”,Twine Cookbook:“Variables”
以微小、清晰的方式调整回应
一个好的变化通常会先确认一项相关差异,然后回答问题。它可能会提及已发现的线索、跳过玩家已收到过的提醒,或者反映当前场景。避免同时更改多项内容,除非故事状态为每一项改动都提供了支持。
例如,一位还没找到账本的玩家可能会问:“谁出资修建了新码头?”管理员可能会说:“我听说港口委员会出资了。”在玩家找到标有委员会名称的账本记录后,管理员可以说:“账本证实了我听说的消息:是委员会出的资。”如果记录显示的付款人另有其人,NPC 就不应继续将旧传言当作事实重复;对话应当将管理员之前的认知与新确立的证据区分开来。
这个例子使用了一个虚构的细节来展示该方法,并非针对某个具体游戏的断言。关键在于清楚标明知识的变化。一个角色可以搞错、含糊其辞或不知情,但撰写时应让这种状态显得是有意为之。否则,玩家可能会将变化的回答解读为前后矛盾的连贯性错误。
比对证据获取情况,而非具体句子
在审查跨玩家或跨分支的对话时,比对每条路线所提供的信息。在故事期望玩家采取行动之前,每位玩家是否都获得了相同的核心线索?是否有一条分支在没有故事事件解释的情况下,暗示了不同的地点、截止时间、关系或起因?NPC 是否提及了玩家尚未发现的事情?比起检查每句台词是否使用了相同的措辞,这些问题能发现更多有意义的不一致。
一个简单的检查表会很有帮助:
检查项:设定;比对内容:名称、日期、地点、起因及其他既定事实
检查项:知识;比对内容:NPC 在此状态下知道什么、相信什么或被告知了什么
检查项:获取;比对内容:玩家接收到了哪条线索或指示,以及何时接收到的
检查项:场景;比对内容:随时间、地点或事件而改变的细节
检查项:措辞;比对内容:变化后是否依然传达了预期的答案
Twine 的段落(passages)以及 Ink 的节点(knots)、选项(choices)、变量(variables)和条件流(conditional flow),都是叙事项目组织分支和状态的范例。这些结构因工具和故事格式而异,因此在实现它们时请遵循相关文档。其编辑原则与具体软件无关:明确状态差异,然后检查每句台词是否依然与之兼容。Twine:“Linking Passages”,Ink:“Writing with Ink”
明确何时回答应当完全保持一致
有些回答本就应该保持稳定:重复出现的密码、张贴的开放时间,或是玩家需要记住的简短指示。如果措辞本身包含线索,或者必须与其他地方的铭文一致,请完全保留它,或者让变化后的形式显而易见地与原意等同。重新表述一个谜语、密码或引用的文档,可能会改变任务的性质,即使作者认为其含义没有改变。
同样,如果玩家状态不会影响 NPC 的知识、场景或可透露的内容,可能就没有理由写出不同的回答。当变化传达了真实的叙事差异时,它是有用的。而当它暗示了一种根本不存在的差异时,就会变成干扰杂音。
实现 NPC 连贯回答的紧凑工作流程
针对每个问题,用一句话写出符合设定的正统答案。列出可以改变 NPC 所知内容或玩家已知内容的故事事件。记录影响回答的场景条件,例如大门是否开着或会议是否已结束。仅针对这些条件起草替代措辞,并确保每个版本都保留相同的事实,除非故事状态明确确立了变化。
随后通过询问以下问题来审查各分支:处于等同状态的玩家是否获得了同等的证据?是否有任何台词预设了未被发现的事件?场景细节是否吻合?目标是塑造一个能够自然回应、同时仍属于同一个连贯世界的角色:共享事实保持可靠,而对话反映故事中发生的一切。
