![]() |
关于Virtools脚本语言,请见VSL。 |
![]() |
不完善的条目 | |
---|---|---|
![]() |
此条目需要专业人士进行改进 | |
---|---|---|
![](/images/thumb/7/7b/Virtools_Script_Deobfuscation.png/320px-Virtools_Script_Deobfuscation.png)
脚本在 Ballance 方面是指游戏文件(可使用 Virtools 查看和修改)中的相关脚本,控制着游戏的加载和运行。
脚本可以被加密使得在 Virtools 中查看时仅显示 [Script Hidden]
。这些需要相应的解密工具。
目前常常利用脚本添加存档点的火苗、柱子的渐变、灯塔上灯的影子等。但因脚本控制着游戏的加载和运行,可实现的功能远不止于此。
目录
运用脚本的实例
运行原理
一般在自制地图文件中的脚本被Ballance加载时不会激活,因此需要特殊手段激活脚本使其运作生效。
目前在不改动游戏文件的情况下唯一可行的方法是机关替换。被替换入关卡内的机关会被游戏激活,同时其脚本也会被激活。在此机关上使用名为Active Script 或Active Object 的BB可以使关卡内任意物件的脚本被激活。
一般替换入脚本内的机关为PH\PS_FourFlames.nmo(出生点盘点火),因为所有关卡都需要一个出生盘点火以保证关卡的正常加载。因此,将其解密后可作为脚本插入地图的通用模板使用。
新版的素材包内附有脚本插入模板的vt工程文件,梨栠的制图模板中自带有一个已经解密的出生盘点火。
脚本实现框架
此处仅对于脚本常使用的一些框架、模板进行简要介绍。
玩家球操控
非物理状态下操控
球在盘点处生成和换球结束时,游戏会将玩家球物理化,使得其坐标、旋转角等参数无法直接调整,目前的解决方案是在操作玩家球之前先将其反物理化,即可进行设置坐标等操作。
值得注意的是,非物理物件的玩家球不受物理系统的控制,也就是说玩家球的速度会丢失,静止在反物理化时的位置,无法发生任何碰撞,且玩家无法直接控制玩家球运动。所以在进行操作之后,务必将玩家球重新物理化。重新物理化时需判断玩家球的种类,再根据种类读取Balls.nmo内的相应参数,并使用对应球的物理化BB进行物理化。
玩家球共对应两种物理化BB。其中木球和石球共用一种,可设定球碰撞箱半径进行物理化;纸球独有一种,直接调用纸球的网格进行物理化。
通过此方法操作玩家球会不可避免地使其丢失当前速度,重新物理化后的玩家球速度为0。
部分可实现实例:
- 传送门(配合BB:Box Box Intersection可实现);
- 瞬移、闪现等类似功能。
物理状态下操控
当玩家球依然属于物理物件时,也可对玩家球进行部分操作。例如,可对其施加额外的力。
使用的BB:Set Physics Force可从已解密的Gameplay.nmo中提取得到。
若不加控制地持续施加力,会使玩家球脱离玩家掌控,游戏难以正常进行。一般的控制手段分两种:
- 使用BB:Key Event,以按键控制;
- 使用BB:Box Box Intersection,以碰撞检测控制;
部分可实现实例:
- 区域内玩家球反重力、零重力(或以按键控制);
- 球向上飞行或加速下落;
自定义物理属性
一般对于路面进行此操作。
一般方案是使用BB:Physicalize手动对路面进行物理化而不归入路面组,由此可自行设定其参数。其物理化所需参数信息如下表:
参数变量名 | 类型 | 释义 |
---|---|---|
Fixed? | bool | 是否为固定(不可移动)物理物件, 默认为TRUE(仅对于路面、钢轨及Stopper) |
Friction | float | 摩擦力 |
Elasticity | float | 弹力 |
Mass | float | 质量(在Fixed?参数为TRUE时无意义) |
Collision Group | String | 碰撞组 |
Start Frozen | bool | 是否初始时冻结 |
Enable Collision | bool | 是否允许碰撞,默认为TRUE |
Automatic Calculate Mass Center |
bool | 是否自动计算质量中心 |
Linear Speed Dampening | float | 线性阻尼 |
Rot Speed Dampening | float | 旋转阻尼 |
Collision Surface | String | 碰撞表面,一般为当前网格的名字 |
concave 1 | Mesh | 物理化时所使用的网格 |
此方法配合BB:Group Iterator(组迭代器)可实现按组物理化为路面,归入指定组的物件将会被物理化成相同参数的路面。这样可以节约BB、脚本数量,也可满足制图者归组的习惯。
值得注意的是,手动物理化出的路面虽然无需归入原版路面组,但仍需要归入声音组,选择性归入影子组。
可行的另一方案是使用BB:Set Cell等BB对Array操作,直接更改游戏路面参数。不过这样做具有全局性,将会使所有路面均改变物理参数,一般来说不推荐这么做。