HelpCenter:SMBX/Script/Basic/2

如果想阅览 SMBX 基础脚本教程的全部内容，请访问：SMBX 基础脚本合集

如果想阅览 SMBX 基础脚本的 TeaScript 简介的内容，请访问：SMBX 基础脚本 1 开始

## 语句概念

语句是所有编程里最重要的组成，它支撑着程序的运行。语句是作为游戏内脚本最基础的元素，支撑着游戏的运行，所有脚本都是基于一句句语句组成。

分支语句是作为语句的一种，它的逻辑是对一个条件进行判断，如果条件达成，则运行达成的对应语句，否则跳过该语句。

此图可以解析为：开始执行脚本，到 If 分支，如果结果为 True，则运行对应语句，否则直接结束该 If 语句运行下一个语句。

它的格式为：

```
if condition then
 expression
end if

```

例如：

```
dim a as integer, b as integer
a = 5
b = 4
if a > b then
 call showmsg("A 大于 B")
end if
call showmsg("啥事都没发生哦~")

```

此图可以解析为：开始执行脚本，到 If 分支，如果结果为True，则运行对应语句，否则运行另一个 Else 对应的语句，然后结束 If 语句运行下一个语句。

它的格式为：

```
if condition then
 expression
else
 expression
end if

```

例如：

```
dim a as integer, b as integer
a = 99
b = 100
if a > b then
 call showmsg("A 大于 B")
else
 call showmsg("B 大于 A")
end if
call showmsg("啥事都没发生哦~")

```

### If ... then ... elseif ... then ... else 语句

If ... Then ... elseif ... then ... else 是 If 分支的另外一种，它可以判断多种条件并进一步缩小条件范围。它的逻辑是：

此图可以解析为：开始执行脚本，到 If 分支，如果结果为True，则运行对应语句，否则运行另一个 Elseif 对应的语句，再次判断，以此类推，直到最后一个 else，然后结束 If 组合语句运行下一个语句。

它的格式为：

```
1	if condition1 then
2	  expression
3	elseif ''condition 2 then
4	  expression
5	elseif ''condition 3 then
6	  expression
7	elseif ''condition n then
8	  expression
9	else
10	  expression
11	end if

```

例如：

```
1	dim a as integer, b as integer
2	a = 320
4	if a < 100 then
5	  a = a
6	elseif a >= 100 and a < 500 then
7	  a = a * 0.9
8	elseif a >= 500 and a < 1000 then
9	  a = a * 0.85
10	elseif a >= 1000 and a < 2000 then
11	  a = a * 0.8
12	else
13	  a = a * 0.75
14	end if

```

不论是什么 If 语句，后面都要加上：End IF，这样才表示完整的一个 If 分支语句。否则不加的话运行会报错。

### Select ... case 语句

Select ... Case 类似于 C 语言里的 Switch (conditions) {case n}，它的作用和 If 语句类似，不过相对于单分支，select ... case 可以做到需要多分支的情况下能够更方便的解读，If 语句一般适用于条件数较少的语句，Select 语句可以使用于条件数非常多的语句。

它的作用是：select 是该语句的入口， ... 代表需要判断的条件，之后进入到 case 语句，然后根据条件，选出符合该条件的语句并执行，否则会跳跃到下一个重新选择，如果以上都不符合，会跳过该语句执行下面的语句。

它的格式为：

```
1	select case condition
2	  case expression1
3	    execute expression
4	  case expression2
5	    execute expression
6	  case expression3
7	    execute expression
8	  case expressionn
9	    execute expression
10	  case else
11	    execute expression
12	end select

```

例如：

```
1	dim a as integer
2	a = 9
3	select case a mod 8
4	  case 0 to 3
5	    call showmsg("请这边1号柜")
6	  case 4 to 7
7	    call showmsg("请这边2号柜")
8	end select

```

## 循环语句

循环语句，顾名思义，用来执行一个脚本语句，在最后面然后回退到对应的语句开头，不断执行，直到某个条件才结束进行下一个语句。

### Do ... Loop 语句

Do ... Loop 语句是运用最广的，也是最优的循环语句方案。

他的执行顺序如下：从 Do 开始，运行Do里面的所有语句，到最后的Loop，再一次回到开头 Do 的位置，重复执行。直到某个条件不达成了跳出语句。

需要注意的是，直接脚本运行 Do ... Loop 的话，如果不给予一个跳出语句的条件，那么会造成游戏的崩溃。所以一般在最后面加一句：call sleep(1)。但直接运行脚本是不起作用的，必须由事件触发脚本才能令 Sleep 起作用。

格式如下：

```
1	do [{While|Until} condition]
2	  expressions
3	'call sleep(1) 用于事件调用脚本，不加的话直接运行会造成游戏崩溃。
4	loop [{While|Until} condition]
5	'P.S. 你只能选择一个作为条件。并且{}里面也只能选择一个，否则会报错。
6	'如果选择了'While'关键字，游戏会重复执行'Do'语句中的语句，直到'condition'返回真。
7	'如果选择了'Until'关键字，游戏将重复执行'Do'语句内的语句，直到'condition'返回假。

```

某人编写的"Rosalina"其中一个脚本的例子如下：

```
1	do
2	 if (keypress(-17) or keypress(-15)) and char(1).status = 4 and v(EffectLoop) = 0 then
3	  v(EffectLoop) = 1
4	  call AudioSet(2,1004,0,"")
5	  select case rnd
6	   case 0 to 0.33
7	    call AudioSet(2,1005,0,"")
8	   case 0.33 to 0.66
9	    call AudioSet(2,1006,0,"")
10	   case 0.66 to 1
11	    call AudioSet(2,1007,0,"")
12	  end select
13	 end if
14	 call sleep(1)
15	loop

```

以及一个简单的计数程序如下：

```
1	dim a as integer
2	do until a >= 20
3	 a += 1
4	 val(Time) = a
5	 call sleep(64)
6	loop

```

### Goto 语句

Goto 是一种古老的编程的循环方式，它最简单，但缺点是容易在多个 Goto 语句造成顺序混乱，因此不建议使用。

他的格式如下：

```
1	Label:
2	  Expressions
3	Goto Label

```

其中，Label是标签名，可以自定义。

Goto 语句不能出现2个相同的 Label，而且无法跨函数使用，也不能在 With 使用。

### For ... Step 语句

For ... Step 是 Visual Basic 里的一个循环语句的一种，但与 Do ... Loop 不同的是它是逐步运行，也就是赋予一个条件，然后根据 Step 的参数进行逐步运行，当达到条件的时候，那么就会跳出该语句并运行下一句，否则会返回开头重复执行。

Step 可以写也可以不写，如果没有调用的话默认的值是 1。

格式如下：

```
1	For variable = startvalue to endvalue [Step stepvalue]
2	  Expressions
3	  [Judgment Statement]
4	  [Exit For] '跳出该语句
5	  ...
6	Next

```

## 自定义函数语句

一般程序足够大的时候，显然放在主函数已经不适合了，因为这样会有一些问题：比如想调用只能重新赋值，非常麻烦1，但自定义函数可以解决这一切。

在绝大多数语言中，大部分程序里面会包含几个自定义函数和1个主函数。作用是可以更方便的调用赋值以及调整软件运行。

比如 C++ 里，他是这样的：

```
1	#include <iostream>
2	using namespace std;
3
4	int Helper(x,y) {
5	  cout << x << "," << y;
6	  cout << endl;
7	}
8
9	int main() {
10	  Helper(9,6);
11	}

```

在 SMBX 中，也可以做到自定义函数哦。

它的格式如下：

```
1	Script name([srg as type], ... [return type])
2	  Expressions
3	End Script

```

其中，Name 是功能&过程&函数名， Arg 是参数名， Type 可以是 Double 和 String。

只有 1 个或没有 Retun，如果没有 Return，则将是一个过程，或者他将是一个函数。参数的数量没有限制。

如果它是一个函数，则可以使用以下代码来定义函数的返回值。

```
1	return expression

```

要在自定义函数/过程中使用参数，请输入以下代码。

```
1	param(pname)

```

返回名称为'pname'的双精度型参数的值。

pname(name)参数名称

你只能在 "Dim strparam as string" 才能得到一个字符串参数。

```
1	strParam(pname)

```

返回名称为'pname'的字符串类型参数的值。pname(Name)参数名称

## Array 数组

数组是 TeaScript 的一个被 5438A38A 不被公开的功能，它的作用和大部分语言的数组类似，但调用起来确有区别。

拿C语言来说，数组是这样的一个例子：

```
1	#include <stdio.h>
2	int main() {
3	  int array[5];
4	  array[4] = 36;
5	  printf("%d",array[4]);
6	}

```

但如若在 SMBX 里创建数组，你只能在 Variable 窗口里，按住 Shift 点击 New，才能成功创建。

### Call Redim

对于 Array，游戏里有一个函数可以修改数组里的值或字符串。

call Redim 的作用是调用 TeaScript 里的数组数据，他的格式如下：

```
1	call redim(type, array_name, array_value)
2	'type 可以是0或1。设置为 0 将释放该数组的内存。设置为 1 将改变数组的内存大小。

```

一个例子如下：

```
1	call redim(0,myarray,3)
2	array(myarray(1)) = 6
3	array(myarray(2)) = 8
4	array(myarray(3)) = array(myarray(1)) + array(myarray(2))

```

## 系统变量

系统变量是内置在游戏里的独有变量，他拥有名称和对应的参数，并且会随着游戏的影响而更改。

一些系统变量是只读的，无法修改，但绝大多数系统变量是可以通过脚本编辑的。

### 内置系统变量

下列是原版里内置的系统变量：

* NCount 现存NPC数量
* BCount 现存砖块数量
* BGOCount 现存BGO数量
* WCount 现存Warp数量
* LCount 现存图层数量
* GameMode 游戏模式 0 单人, 1 双人, 2 对战
* ScrSplitstyle 表示屏幕拆分状态。
* Player1scrX 表示player1的摄像机的左上角x坐标。
* Player1scrY 表示player1的摄像机的左上角y坐标。
* Player2scrX 表示player2的摄像机的左上角x坐标。
* Player2scrY 表示player2的摄像机的左上角y坐标。
* WldInvCount 表示大地图中的背包中有多少个物品。(就是SMB3的那个背包)
* Playerhealth 表示玩家的1-up数 (Writable)
* CoinCount 表示当前金币数 (Writable)
* Score 表示当前分数 (Writable)
* StarCount 表示星星数量。
* Param1 表示从事件传输的第一个参数。
* Param2 表示从事件传输的第二个参数。
* Param3 表示从事件传输的第三个参数。
* BPlayer1Health 表示在战斗模式下第一位玩家的1-up数量。
* BPlayer2Health 表示在战斗模式下第二位玩家的1-up数量。
* EnableLighting 启用视线系统 (WriteOnly)。
* Starcoincount 表示获得的星币数量。
* Disablesave 表示是否禁止玩家存档 (WriteOnly)。

### 额外系统变量

除了这些，5438A38A 还内置了许多看似无法使用的系统变量，但并未向大众公开，疑似是Beta阶段测试用的，但未证实。不过后来有人挖出了其隐藏内容并公布于众。下面是编辑器看不到的系统变量：

* Gametitle(String) 表示游戏窗口标题。
* Gametime(double) 表示游戏计时器。
* Actncount(double) 表示当前屏幕上有多少NPC。
* Actbcount(Double) 表示当前屏幕上有多少方块。
* Invtimewhenhurt(Double) 表示当玩家受伤时的无敌时间。
* Fluddrestorespeed(Double) 表示喷水器(FLUDD)的蓄力时间。
* Playerbasestatus(Double) 表示玩家受伤时将拥有的状态以及再次受到伤害时将死亡的状态。Showhud(Double) 表示是否显示HUD。
* Grabshellinsmb3way(Double) 表示壳类是否可以从上方举起(0=on;1=off)。
* Systime(Doule) 表示你今日的游戏时间。
* Second(Double) 本机时间的秒。
* Minute(Double) 本机时间的分钟。
* Hour(Double) 本机时间的小时。
* Day(Double) 本机时间的日。
* Month(Double) 本机时间的月。
* Year(Double)本机时间的年。
* Yoshiflyable(Double) 表示是否启用耀西滞空。
* Enablepause(Double) 表示游戏是否可以暂停。
* Enablesmb3statussys(Double) 表示是否启用SMB3的Power Up系统。
* Enablewalljump(Double) 表示是否开启踢墙跳。
* Disablejump(Double) 表示是否关闭跳跃。
* Disablespinjump(Double)表示是否关闭旋转跳。
* Disableduck(Double) 表示是否关闭玩家的混合(Blend)。
* Spinjumpfloating(Double) 表示玩家是否可以使用旋转跳像浣熊马里奥那样滞空。
* DisableShellDash(Double) 表示是否关闭龟壳装的冲刺能力。
* DisableHammerShield(Double) 表示是否关闭锤子装的防御能力。
* DisableLinkShield(Double) 表示是否关闭林克的盾防。
* DisableLinkSwordDouble) 表示是否关闭林克的剑击(关闭后仍会播放攻击动画)。
* Disableclimbing(Double) 表示是否关闭玩家的攀爬能力。
* Syslang(Double) 返回当前系统的语言所对应的ID。
* Enableinertiafornpc(Double) 效果未知。
* Shellcanhitblockside(Double) 表示龟壳是否可以在方块边缘反弹，效果未知。
* Npcstyle(Double) 表示NPC样式，效果未知。
* Disablesharedfludd(Double) 效果未知。
* Disablesysconstreset(Double) 效果未知。
* Machinecode(返回一个值) 相关值未知。

### 时间系统变量

除了系统变量，5438A38A 还加入了时间系统 - lvltimer(param)，与系统变量不同的是，时间变量是单独的一个整体，它包含的内容如下：

* Count(Double)表示计时器的当前编号
* Intv(Double)表示计时器的计时间隔 (65 为一秒。)
* Type(Double)表示计时器的计时模式
* Show(Double)表示是否显示计时器
* X(Double)表示计时器的x坐标
* Y(Double)表示计时器的y坐标
* Color(Double / Int32)表示计时器的颜色

## 游戏数据变量

游戏数据变量是游戏内 Blocks，NPCs，BGOs，Warps，Char 等里的数据变量，他们都有单独的数据，并且不一样。

他们的基本格式是这样： type(ID).param 其中 type 是上面几种的其中一种，param 是参数。

要注意的是，每个物件都包含数据，电脑资源会使用一部分性能去计算该数据，所以一旦物件的数量足够多（尤其是NPC），那么会造成CPU超负荷，电脑的卡死。

所以要避免屏幕上出现超级多的NPC。

由于 5438A38A 对一些数据不公开，所以一些没有公开到教程的数据将会用“\*"标记。

### NPC

npc(ID).param

对于 NPC 的 ival 的含义，请访问：SMBX 高级脚本 2 自定义关卡的使用

* X(Double) 表示NPC的横坐标
* Y(Double) 表示NPC的纵坐标
* prX(Double) 表示NPC的源横坐标
* prY(Double) 表示NPC的源纵坐标
* Xsp(Double) 表示NPC的横向速度
* Ysp(Double) 表示NPC的纵向速度
* ID(Double/Int32) 表示NPC的类别ID，例: 10是SMB3金币
* addvx(Double) 表示NPC的横向平台加速度
* addvy(Double) 表示NPC的纵向平台加速度
* facing(Double/bool) 表示NPC的朝向
* friendly(Double/bool) 表示NPC是否友好
* NoMove(Double/bool) 表示NPC是否处于不移动状态
* curframe(Double/Int32) 表示NPC的当前帧
* health(Double/Int32) 表示NPC的血量
* advSet(Double/Int32) 表示NPC的附加数据
* permID(Double+ReadOnly) 表示NPC的永久ID
* alive(Double/bool) 表示NPC是否还活着
* Name(String) 表示NPC的名字
* ivala(Double/Int32) 表示NPC的自定义变量A
* ivalb(Double/Int32) 表示NPC的自定义变量B
* ivalc(Double/Int32) 表示NPC的自定义变量C

* \*bkupx(Double) 表示NPC的备用横坐标
* \*bkupy(Double) 表示NPC的备用纵坐标
* \*curtimer(Double) 表示NPC的自定义计时器
* \*scount(Double) 表示在同一位置有多少个NPC
* \*zpos(Double) 表示NPC的z坐标
* \*inwater(Double) 表示该NPC是否为水生NPC
* \*forecolor(Double/int32) 表示NPC的前景色。你可以使用rgba(红,绿,蓝,透明度)或一个整数来设置
* \*Hide(Double) 表示NPC是否为隐藏状态
* \*extx(Double) 表示NPC图像位于GFX扩展坐标系的横坐标
* \*exty(Double) 表示NPC图像位于GFX扩展坐标系的纵坐标
* \*forecolor\_r(Integer) 表示NPC前景色的红色色度值
* \*forecolor\_g(Integer) 表示NPC前景色的红色色度值
* \*forecolor\_b(Integer) 表示NPC前景色的红色色度值
* \*forecolor\_a(Integer) 表示NPC前景色的透明度
* \*Stand(Double) 表示NPC是否有重力
* \*langle(Double) 可以像自定义变量那样用
* \*target(Double) 表示NPC的目标(值为的玩家ID)
* \*Dtcplayer (Double) 决定了NPC是否可以检测到玩家
* \*Dtcliquid Double) 决定了NPC是否可以检测到流体
* \*Dtcself(Double) 决定了NPC是否可以检测到其它NPC
* \*Extset(Double) NPC的外部设置。对于泡泡和SMW快乐云，该值将决定它们所包含/投掷的NPC
* \*Talkevent(String) 当与NPC交谈时激活事件
* \*Deathevent(String) 当NPC死亡后激活事件
* \*Touchevent(String) 当触碰到NPC后激活事件
* \*Activeevent(String) 当NPC被激活后触发事件 如: P-Switch
* \*Nextframeevent(String) 当NPC出现在屏幕上是激活事件
* \*Haswing(Int32) (Double) 决定了NPC是否有翼。

其中，Haswing 有：

* *0 = 无*
* *1 = 跳跃*
* *2 = 左右徘徊*
* *3 = 上下徘徊*
* *4 = 追逐*
* *5 = 前进徘徊(遇到阻碍转向)*
* *6 = 快乐云AI*
* *7 = 由NPC-308控制*
* *8 = SMW轨道线*

### Block

block(ID).param

* X(Double) 表示方块的横坐标
* Y(Double) 表示方块的纵坐标
* Xsp(Double) 表示方块的横向速度
* Ysp(Double) 表示方块的纵向速度
* ID(Double/Int32) 表示方块的ID
* advset(Double/Int32) 表示方块的内容物(1000+NPC-ID来表示内容物为NPC)
* Name(String) 表示此对象的名字

以下是未公开的：

* **\*Haswing(Double) 表示方块所拥有的翼的种类(与NPC相同)**
* **\*Hide(Double) 表示方块是否可见**
* **\*Width(Double) 表示方块的宽**
* **\*Height(Double) 表示方块的高**
* **\*Forecolor(Double/int32) 表示方块的前景色。可用rgba函数或一个Integer类型的数来设置。**
* **\*Scriptid(Double) 表示方块的脚本ID**
* **\*extx(Double) 表示方块图像位于GFX扩展坐标系的横坐标**
* **\*exty(Double) 表示方块图像位于GFX扩展坐标系的纵坐标**
* **\*Prx(Double) 表示方块的源横坐标**
* **\*Pry(Double) 表示方块的源纵坐标**
* **\*State(Double) 设置为1，该方块将被设置为被撞击。其它值该方块将会破碎。**
* **\*PCollision(R) (Double) 该方块对于玩家而言的碰撞判定类型**
* **\*NCollision(R) (Double) 该方块对于NPC而言的碰撞判定类型**
* **\*forecolor\_r(Integer) 表示该方块的前景色红色色度值**
* **\*forecolor\_g(Integer) 表示该方块的前景色绿色色度值**
* **\*forecolor\_b(Integer) 表示该方块的前景色蓝色色度值**
* **\*forecolor\_a(Integer) 表示该方块的前景色的透明度**

### Char

char(ID).param

理论上，通过修改 char 里的参数，进行一系列编写，就可以写出一个自定义角色。想了解自定义角色的话请访问：SMBX 高级脚本 2 自定义关卡

下面列举的是原版的内容：

* X（Double）代表玩家的x坐标
* Y（Double）代表玩家的y坐标
* Status（Double / Int16）代表玩家的当前状态
* InvTime（Double）代表玩家剩余的无敌时间
* Xsp（Double）代表玩家的x轴速度
* Ysp（Double）代表玩家的y轴速度
* itemRsrv（Double / Int16）代表保留在玩家项目框中的NPC的类型ID。
* Brightness（Double / Int16）代表玩家的亮度（在灯光系统中使用）
* hitpoint（Double / Int16）表示玩家当前的血量（如果玩家是Peach，Toad或Link）
* face（Double / Bool）代表当前玩家所面对的方向
* bombcnt（Double / Int16）代表玩家当前拥有的炸弹数量
* keycnt（Double / Int16）代表玩家当前拥有的键数
* fluddcap（Double / Int16）代表玩家的F.L.U.D.D（喷水器）

以下是未公开的：

* **\*flytime(Double) 表示玩家的可飞行时间**
* **\*pwidth(Double) 表示玩家碰撞箱的宽度**
* **\*pheight(Double) 表示玩家碰撞箱的高度**
* **\*jmpchance(Double) 在1.4.4中是玩家踩在敌人时获得分数的ID，在1.4.5中表示的是玩家是否可以跳跃**
* **\*ynpcid(Double) 表示耀西口中的NPC的ID，如果这个NPC不可以被耀西咽下，那么该值将被设置为耀西口中的NPC的ID，否则该值将先被设置为1然后变成1000，最后变成0。**
* **\*climbing(ReadOnly) 表示玩家是否处于攀爬状态**
* **\*sjumping(ReadOnly) 表示玩家目前是否处于旋转跳状态**
* **\*inwater(ReadOnly) 表示玩家目前是否在水中**
* **\*section(ReadOnly) 表示玩家当前所在场景的id**
* **\*forecolor(Integer) 表示玩家的前景色。可以使用rgba函数或一个Integer类型的整数来设置**
* **\*forecolor\_r(Integer) 表示玩家前景色的红色色度**
* **\*forecolor\_g(Integer) 表示玩家前景色的绿色色度**
* **\*forecolor\_b(Integer) 表示玩家前景色的蓝色色度**
* **\*forecolor\_a(Integer) 表示玩家前景色的透明度**
* **\*ID(Double) 表示[当前使用的]角色的id**
	+ ·        **0 - Mario**
	+ ·        **1 - Luigi**
	+ ·        **2 - Peach**
	+ ·        **3 - Toad**
	+ ·        **4 - Link**
* **\*Status(Double/Int16) 表示[当前]玩家的状态**
	+ ·        **1 – 小个子**
	+ ·        **2 – 蘑菇**
	+ ·        **3 – 火力花**
	+ ·        **4 – 叶子**
	+ ·        **5 – 浣熊装**
	+ ·        **6 – 锤子装**
	+ ·        **7 – 冰花**
	+ ·        **8 – 青蛙装**
	+ ·        **9 – 龟壳装**
	+ ·        **10 – 竹蜻蜓装**
	+ ·        **11 – 迷你菇**
	+ ·        **12 – 企鹅装**
* **ItemSlot(Double/Int16) 玩家[当前]所拥有的外置道具**
	+ **• 0: None**
	+ **• -150: 小精灵**
	+ **• -20: 金币箱**
	+ **• -19: 大炮箱**
	+ **• -18: 螺旋桨箱**
	+ **• -17: 刺猬头盔**
	+ **• -16: 板栗仔面具**
	+ **• -15: Buzzy头盔**
	+ **• -14: 透明面具**
	+ **• -13: 火箭喷水器(纵向飞行)**
	+ **• -12: 涡轮喷水器(横向飞行)**
	+ **• -11: 徘徊喷水器(纵向飞行)**
	+ **• -10: 使玩家不可见**
	+ **• -9: 使玩家不可见**
	+ **• -8: 使玩家不可见**
	+ **• -7: 使玩家不可见**
	+ **• -6: 使玩家不可见**
	+ **• -5: 巨大蘑菇**
	+ **• -4: 库巴的飞船**
	+ **• -3: 蓝鞋子**
	+ **• -2: 红鞋子**
	+ **• -1: 绿鞋子**
	+ **• 1: 绿耀西**
	+ **• 2: 蓝耀西**
	+ **• 3: 黄耀西**
	+ **• 4: 红耀西**
	+ **• 5: 黑耀西**
	+ **• 6: 紫耀西**
	+ **• 7: 粉耀西**
	+ **• 8: 青耀西**
	+ **设置为无效的值游戏将会崩溃。**

### Bitmap

bitmap(ID).param

如果想阅览 SMBX 基础脚本当前页的下一个内容，请访问：SMBX 基础脚本 3 函数

1. ↑ 如果玩家正处于攀爬状态时，该值将被设置为0且如果在此时按下跳跃键该值将会减1，直到玩家落地才会被重设为1；如果玩家位于地面按下跳跃，该值将被设置为0，直到玩家重新落地，该值将被重设为1，如果将该值强制锁定为大于1的值，则玩家可以在半空中实现跳跃和旋转跳状态的互换。