检定对象
在 ADVMaker 中,检定通过 ADVUserCheck 对象来描述,通常可以在对话或者选项的 check 字段中进行配置,当游戏执行到这个检定时,会自动掷出骰子,计算最终点数,并与目标值比较,然后根据成功或失败分别跳转。
ADVUserCheck 参数详解
一个检定由几个核心部分组成,理解它们就像组装一台简单的戏剧机器。下面我们逐一说明。
骰子(dice)
dice 决定了“用什么投掷”。你可以选择两种提供骰子的方式,推荐使用简洁的骰子表达式;如果你需要完全掌控随机逻辑,也可以传入一个自定义骰子对象。无论哪种方式,框架都会呼唤它来产生一个随机整数。
dice 的默认值取决于你选择什么检定方法,检定方法会在综合示例这一章讲到。
目标值(target)
target 是检定的“及格线”。当在检定方式为 d20 模式时,投出的点数(加上修正后)必须大于或等于目标值,才算成功。在 percent 模式下为小于等于。
你可以直接写一个固定数字,比如 15;但更具动态感的是传入一个函数,比如 () => character.strength。这样,目标值就能跟随角色的状态实时变化——角色越强,检定就越容易通过。
目标介绍(targetDesc)
你可以介绍一个这个目标值,例如:敏捷检定【困难】
修正值(modifier)
环境、装备、或者剧情中的增益与减益,这些都可以通过 modifier 来表达。它是一个数组,每个元素都是一条修正记录,包含两个字段:
name:一段简短的字符串,用来告诉玩家这个修正来自何处,例如"力量加成"或"受伤惩罚"。这会让检定界面显得透明而可信。value:一个返回数值的函数,它决定了这条修正加多少(或减多少)。正值会提升检定结果,负值则会拖后腿。
所有 modifier 的数值会在骰子结果后累加。框架会在检定展示时自动列出这些修正名称和数值,让玩家清晰了解成功或失败的原因。
成功与失败的动作(success / fail)
这是检定的分岔路口。success 和 fail 各自接收一个动作:通过后该做什么,失败后该做什么。你可以填入场景或对话的 ID,也可以填入一个选项数组,或者干脆嵌入另一个检定来实现连环判定。这两个属性都是必填的,因为检定的意义就在于分支。
成功与失败的回调(onSuccess / onFail)
除了改变剧情走向,有时你还需要“悄悄”做点事情:记录一个成就、播放一阵音效、修改某个看不见的属性。onSuccess 和 onFail 就是为这种副作用准备的。它们都是函数,分别在检定成功或失败时被调用,而不会影响 success 和 fail 所指向的主流程。两者默认都是“什么也不做”。
下表列出了定义一个检定所需的全部属性:
| 参数名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
dice | ADVDice 或 DiceExpression | 根据检定方式 | 本次检定使用的骰子。 |
target | number 或 () => number | 无,必填 | 检定的目标值。投掷出的点数大于等于该值即为成功,反之为失败。可以传入一个函数,在检定时动态计算目标值,例如 () => player.strength。 |
modifier | { name: string; value: () => number }[] | [] | 修正值数组。每个修正项包含一个 name(显示给玩家的修正原因,如“力量加成”)和一个 value 函数(返回修正的数值)。所有修正值会累加到骰子结果上。 |
success | ADVUserNext | 无,必填 | 检定成功时执行的动作。可以是场景/对话 ID、选项数组、检定对象、null 或函数。 |
fail | ADVUserNext | 无,必填 | 检定失败时执行的动作,规则同上。 |
onSuccess | () => void | () => {} | 成功时的回调函数,用于执行一些副作用,如播放音效、记录成就等。 |
onFail | () => void | () => {} | 失败时的回调函数。 |
提示:
target和modifier的值都可以是动态函数,这意味着你可以根据角色当前的状态(血量、技能等级、装备等)实时调整难度和加成,让游戏更具动态性。