*if
*if 条件命令主要有三个用途:
比较[[变量类型|变量]](包括文本[[Data types|字符串]]变量),
检查一个变量是否为真,
检查一个数值变量的值是否等于、不等于、大于或小于某个特定值。
变量比较|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 multireplace--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|*elseif]] 和 [[Else|*else]] 结合使用|*if used in combination with [[Elseif|*elseif]] and [[Else|*else]]当您需要根据不同条件显示一系列不同选项时,仅使用*if命令也能实现,但通常最好结合使用相关的 *elseif 和 *else 命令。一个实用的指导原则是:
当您希望向部分玩家展示多个额外信息片段,且结果非互斥且非强制时,使用 *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|隐式控制流]],可以避免这一要求。