*if

*if 条件命令主要有三个用途:

  1. 比较[[变量类型|变量]](包括文本[[Data types|字符串]]变量),

  2. 检查一个变量是否为真,

  3. 检查一个数值变量的值是否等于、不等于、大于或小于某个特定值。

变量比较|Comparing variables

假设我们创建了值为 10 的 var1 和值为 20 的 var2。随后我们可以使用 *if 命令对它们进行比较:

*temp var1 = 10
*temp var2 = 20

*if (var1 = var2)

    10 等于 20!

    *finish

10 不等于 20!

*finish

显然这是不正确的(10 当然不等于 20!),条件检查将失败,程序会跳过两个缩进行直接执行下一个同级缩进行,也就是显示“10 不等于 20!”的那一行。但如果条件成立,程序就会执行缩进行并显示“10 等于 20”的文本。

当单个条件检查独占一行时,用括号围绕 (var1 = var2)不是严格且必需的,就如同上方示例所示。但如果你在同一行有多个条件或其他内容(例如 *choice #option),那么这些括号就是必需的,因此您最好能养成即使不严格要求也使用括号的习惯。但是否照做完全取决于您的个人选择。

相等与不等|Equality and inequality

使用基本的 *if 命令,可以用多种方式检查变量;以下是一些常见示例。

注意:对于大于、小于或不等于,大于、小于或不等于符号必须放在等号之前。

与、或、非|And / Or / Not

此外,可以使用 and 和 or 为单个 *if 语句分配两个或更多条件。请注意,当同时检查两个或更多条件时,需要用括号将它们分隔开,如下所示:

var1 是否大于 10 且 var2 大于20?(仅当两个条件都为真时继续。)

var1 是否大于 10,或者 var2 是否大于 20?(任一条件为真则继续。)

var 不大于 10 吗?(仅当 var 小于或等于 10 时继续)。

也可以检查多个条件,这需要更多括号来分隔它们:

var1 是否大于 10 且 var2 是否大于 20 且 var3 是否大于 30?请注意,每个“且”或“或”只能连接两个等式,且每个等式只能连接一个“且”或“或”。下面是个错误的示例:

将无法正常工作,因为第二个条件试图连接 (var2 > 20),而该条件已与 (var1 > 10) 相连。

var1 是否大于 10 且 var2 大于 20?或者 var1 是否大于 70?(仅当var1 大于 10 且 var2 大于 20 时继续执行,但如果这个组合条件不成立,只要 var1 大于 70 仍会继续执行。)

布尔检查|Boolean check

[[Data types|布尔]](简单的真/假)变量有一种特殊的 *if 检查,它仅检查变量是否为真。

这将检查变量是否被设为真。(变量名) 必须用括号括起来,如图所示。

注意:如果变量不是布尔类型,却使用了这种检查方式,将导致游戏停止的错误。例如,对于这种特定的简单真或假检查,一个文本值为 "true" 的字符串变量,与一个被设为的布尔变量是不同的。

你也可以通过以下方式检查布尔变量当前是否为假(即不为真):

再次强调,(变量名) 名称必须用括号括起来。(王洛木:注意括号是半角括号。)

注意

仅当此检查独占一行时,*if not(var) 才能正确工作。例如,在以下代码中,"not" 会被完全忽略,并且如果 (var) 实际上为真,反而会显示该 #选项 文本:

为了正确运行,这段代码实际上应该写成:

另一种解决方案是将 “not” 用另一对括号括起来,如下所示:

文本比较|Comparing text

假设我们有一个名为 name 的[[Data types|字符串]]变量,其中包含一些文本。您可以使用 *if 来检查其当前包含的文本是否完全等于某个特定的单词或短语,例如:

请注意,检查字符串变量时必须始终使用 "引号"。

你也可以检查一个字符串是否不等于特定的单词或短语:

多功能的 *if 命令在 ChoiceScript 中用途广泛。以下是一些常见的使用示例:

用法|Usage

*if 命令的主要用途之一是在玩家通过检查时添加特定的变化。你可以在代码块下添加各种命令,这对于将故事设置到不同路径非常有用。

将其他布尔变量设为真或假|Setting other boolean variables to true or false

如果[[Data types|布尔]]变量 "exam_passed" 为真,你可以添加代码 *set happy true 以供将来使用。

修改数值与字符串变量|Modifying numeric & string variables

在这个例子中,如果变量 "exam_passed" 为真,则 "happiness" 将增加 30,字符串变量 "graduated" 将更改为 "With Honors",并且会显示文本“你过关!”。

显示条件文本|Displaying conditional text

你也可以使用 *if 命令,在不改变任何变量的情况下,对你游戏显示的文本进行微小的调整:

(Especially for Boolean variables, this can also be done relatively easily using multireplacearrow-up-right--so for example, @{exam_passed passed it,|) would do the same thing as the *if clause above.)

(对于布尔变量,使用[[Multireplace|多重替换]]也能相对轻松地实现——例如,@{exam_passed 通过了考试,|) 的效果与上述 *if 子句相同。)

*if 与 [[Elseif|*elseif]] 和 [[Else|*else]] 结合使用|*if used in combination with [[Elseif|*elseif]] and [[Else|*else]]

当您需要根据不同条件显示一系列不同选项时,仅使用*if命令也能实现,但通常最好结合使用相关的 *elseif*else 命令。一个实用的指导原则arrow-up-right是:

当您希望向部分玩家展示多个额外信息片段,且结果非互斥且非强制时,使用 *if/*if/*if... 的组合。

当您希望向部分玩家精确展示多个可能额外信息片段中的某一个,且结果互斥但非强制时,使用 *if/*elseif/*elseif... 的组合(不使用 *else)。

(虽然您可以使用一系列 *if 命令来实现此效果,但通过使用 *elseif 来明确表达结果的互斥性是更佳的编码实践。这将有助于任何审阅者和编辑者,也包括您自己。)

当每个人都需要恰好获得一个选项时,使用 *if/*else*if/*elseif/*else 来处理互斥且必须选择的结果会比较好。

例如,对于后者:

以上述例子为例,向玩家显示的文本(你今天非常沮丧。)由角色当前的 "happiness" 决定。系统会逐一检查每个*if*elseif 条件块,直到找到为真的条件,然后显示相应的信息。如果所有条件均不适用(即“happiness”实际达到 80 或更高),系统将默认执行末尾的“兜底” *else 语句。*else 语句本身不应设定具体条件,因为它本质上表示“若以上条件均不满足,则执行此操作”。

ChoiceScript 的代码执行顺序也是从上到下,因此在安排代码结构时必须格外小心。确保你的条件检查代码按数值递增或递减的顺序排列,并在最后添加一个兜底的 *else 语句。如果上面的例子以 *if happiness < 80 开头,接着写 *elseif happiness < 60,那么第二个条件将永远无法被触发——因为所有小于 60 的 "happiness" 值也都小于 80!

注意|Note

ChoiceScript 逻辑的基本要求是,任何将 [[Elseif|*elseif]] 或 [[Else|*else]] 命令与 *if 结合使用的情况,都必须以 [[Finish|*finish]]、[[Goto_Scene|*goto_scene]]、[[Goto|*goto]]、[[Goto random scene|*goto_random_scene]]、[[Ending|*ending]] 或 [[Ref Commands|*gotoref]]命令结束,如上例所示。以下代码将导致错误:

ChoiceScript 会崩溃,因为它没有被告知在找到有效条件并显示相应文本后该做什么。

不过,通过使用[[Implicit Control Flow|隐式控制流]],可以避免这一要求。