> For the complete documentation index, see [llms.txt](https://hamsterbaron.gitbook.io/hamsterbaron/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hamsterbaron.gitbook.io/hamsterbaron/mechanic-guides/condition.md).

# 条件块 / Condition

## 什么是条件块

条件块用于在一个机制被触发后，基于其元属性的设定，来决定是否启动动作块的执行。条件块的灵活运用有助于实现独特复杂的机制逻辑。

条件块是多行条件的集合。当无任何条件被设置时，意为机制一旦被触发就必定执行动作块内容。有关每行条件的判定结果如何共同影响整体条件块判定，请参考属性组章节中设定条件块表达式部分内容。

***

## 了解条件表达式

每个条件的最终运行结果都是一个*布尔类型值*，即每一行条件最终向程序返回“真” (True) 或”假” (False) 两种情况，对应判定通过与判定不通过两种结果。

Arcana 中的条件语句大致可分为三个类型：**状态检查条件** (State Predicate)，**关系运算条件** (Relational Predicate)，**成员运算条件** (Membership Predicate)。这三类条件语句的特点如下：

#### 状态检查条件

此类条件直接测试特殊对象或给定环境是否处于某一状态或拥有某一性质，通常直接规定一个布尔类型值作为要求的合法结果。这是最基础的检查条件类型。

```yaml
Conditions:
- !<TargetIsPlayer>
  is: false
#实际效果：当击中的目标实体并不是玩家时，该条件为真
```

#### 关系运算条件

此类条件将两个或多个数值做比较，并使用逻辑运算符或区间表示以判断他们之间是否满足特定关系。由于可以应用占位符变量，属于该类的许多条件语句都有广泛的应用场景。

```yaml
Conditions:
- !<Time>
  range: "0..18000" #此处也支持写为“0 <= x <= 18000”
#实际效果：当技能被触发时所在世界内时间处于0~18000之间时，该条件为真
```

#### 成员运算条件

成员运算条件用于判断某个元素是否属于某个给定的集合，列表或字典键值对空间内。是一种对目标变量进行包含关系判定的条件，本质是一次查找操作。许多基础的条件语句属于此类型。

```yaml
Conditions:
- !<Weather>
  weathers:
  - "rain"
  - "thunder"
#实际效果：技能触发时如所在世界处于雨天或雷雨天，该条件为真。
```

除以上类型外，实际运用中主要使用的特殊条件“**Variable 变量判断条件**”允许直接使用逻辑表达式，并解析常见的逻辑运算符；灵活运用该条件是利用 Arcana 的脚本开发功能开发复杂机制行为的重要内容。此条件可用于各类事件状态的判定，并可通过**变量系统**以与玩家权限与其他服务器插件灵活交互。

## 配置条件块

每个机制都必须拥有一个条件块。一个条件块中可以拥有一个或多个条件语句。一个条件语句看起来会是如下所示的格式：

```yaml
- !<ConditionName>
  #Some Params..
```

条件块可以为空，但仍需保留`Conditions: []`的格式字段，否则会导致机制初始化加载过程中报错。条件块为空时，机制将在被触发后立即运行动作块部分。

## 条件块的运行逻辑

在一个机制被触发后 (触发器被成功激活) 条件块就开始运作。每个条件块按顺序依次运行，在每行条件都具有一个布尔类型值后，根据属性组中"条件表达式类型"的表达式设定，在运算后最终得出"真"或"假"的结果，并以此决定是否进入动作块部分的动作执行。

条件表达式是一个逻辑运算式，基于每行条件的布尔类型值经过逻辑运算得出最终结果。条件语句具有顺序，以`Cn`标识。第一行条件语句被视为`C1` ，则第二个条件语句编号为`C2`，以此类推。

```yaml
Flags:
  # Other Configs..
  ConditionExpression: “C1 && !C2” #意为条件1为真但条件2为假时总体为真
Conditions:
- !<TargetIsPlayer> #此行被视为条件C1
  is: true 
- !<Time> #此行被视为条件C2
  range: “12000..18000”
```

在该示例中，展示了一个运用条件表达式设计更为复杂的条件判定流程的示范。该条件块的最终效果将为“当目标是玩家且当前世界时间不在傍晚或夜晚时，条件块判定通过”。基本的，逻辑运算式常用的三种运算符**逻辑与**`”&&”` (AND)，**逻辑或**`”||”` (OR) 以及**逻辑非**`”!”` (NOT) 均可用。

{% hint style="info" %}
**开发提示** : 条件表达式中`”ALL_TRUE”`与`”C1 && C2 && … Cn”`等效，意为<mark style="color:$warning;">全部条件均需为真</mark>。这也是默认情况下属性中条件表达式的值即为全部为真。同样的，`”ALL_FALSE”`与`”!C1 && !C2 && … !Cn”`以及`”!(C1 || C2 || .. Cn)”`等效，意为<mark style="color:$warning;">全部条件均需为假</mark>。
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hamsterbaron.gitbook.io/hamsterbaron/mechanic-guides/condition.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
