ArmT1Mex脚本解析- from fonter456

script,也就是脚本,主要是用来描述一个模型是如何运动的。
TA的脚本基于C语言,懂C语言的会很容易看懂,不懂的也可以很容易修改一些部分来达到效果。
下面TA-EXCESS II alpha1e版的ARM的T1采矿机的脚本,估计每个版本的都一样,如果你的版本不一样也可以对照看看

下面是脚本的注释:

#define TA //定义为TA脚本,告诉TA这是TA的脚本
#include “sfxtype.h” //这个脚本使用了"sfxtype.h",也就是冒烟冒泡库中的子程序
#include “exptype.h” //这个脚本使用了"exptype.h",也就是死亡炸飞库中的子程序
piece base, building, hammer1, hammer2, decor1, decor2, decor3, decor4;
//上面的piece后面的是这个模型的部件的名称,一个模型是由许多部件组成的,你可以用3dobuilder打开模型的3do文件来查看这个脚本所描述的部件。

static-var ExtractionDelay; //自定义一个静态变量ExtractionDelay,这个变量的意思是开采延时,后面用
SmokeUnit(HealthPercent, SleepTime) //这是单位冒烟的脚本,HealthPercent和SleepTime是自定义的变量
{
while( get BUILD_PERCENT_LEFT ) //调用get函数和BUILD_PERCENT_LEFT函数来得到正在被建造的单位还差多少就完工
{
sleep 500; //延迟500毫秒,也就是0.5秒
}
while( TRUE )
{
HealthPercent = get HEALTH; //给自定义的变量HealthPercent赋值为get HEALTH,get HEALTH的意思是获取单位当前的生命值的百分比
if( HealthPercent < 60 ) //如果HealthPercent小于60
{
emit-sfx 256 | 1 from decor1; //调用冒烟冒泡库中的子程序256,从decor1部件的源点中放出一团烟1
SleepTime = 350; //令SleepTime = 350毫秒
}
if( HealthPercent < 30 ) //如果HealthPercent小于30
{
emit-sfx 256 | 2 from hammer1; //调用冒烟冒泡库中的子程序256,从hammer1部件的源点中放出一团烟2
emit-sfx 256 | 2 from decor2; //调用冒烟冒泡库中的子程序256,从hammer1部件的源点中放出一团烟2
SleepTime = 250; //令SleepTime = 250毫秒
}
sleep SleepTime; //延迟与上面的SleepTime相同的时间
}
}
//上面的冒烟脚本是描述单位怎么冒烟的,调用了"sfxtype.h"里面的子程序来冒烟
整个解析就是检查单位的生命是否小于60%,小于就从decor1部件每隔350毫秒放出一团烟雾1,如果小于30%,则从hammer1和
decor2每隔250毫秒各放出一团烟雾2,注意烟雾1和烟雾2不同,烟雾2有些火光。具体可以看看在游戏中的效果,用司令造两个然后回收一下,回收到60%血和30%血对比一下就知道了。

FirstHammer() //第一个锤头,
{
move hammer1 to y-axis [6.000000] speed [6.000000]; //把部件hammer1沿Y轴以6的速度移动到6的位置
sleep 750; //延迟750毫秒
move hammer1 to y-axis [5.000000] speed [5.000000]; //把部件hammer1沿Y轴以5的速度移动到5的位置
sleep 200; //延迟200毫秒
move hammer1 to y-axis [3.000000] speed [20.000000]; //把部件hammer1沿Y轴以20的速度移动到3的位置
sleep 100; //延迟100毫秒
move hammer1 to y-axis [0.000000] speed [60.000000]; //把部件hammer1沿Y轴以60的速度移动到0的位置
return (0); //返回
}
SecondHammer() //第二个锤头
{
move hammer2 to y-axis [6.000000] speed [6.000000];
sleep 750;
move hammer2 to y-axis [5.000000] speed [5.000000];
sleep 200;
move hammer2 to y-axis [3.000000] speed [20.000000];
sleep 100;
move hammer2 to y-axis [0.000000] speed [60.000000];
return (0);
}
//上面两个是描述采矿机采矿时的动作,是两个锤头一上一下的运动,进游戏一看就明白。锤头的初始位置是0,最高位置是6,整个过程是先慢慢上升到顶,再从慢到快(速度从5变到20再到60)急速下落,回到原位,进游戏具体观察吧。

Go() //这个小脚本的名字是GO()
{
while( TRUE ) //当处于TRUE的状态下
{
start-script FirstHammer(); //开始上面的FirstHammer(),第一个锤头运动方式的小脚本
sleep ExtractionDelay; //延迟ExtractionDelay这个变量的时间
start-script SecondHammer(); //开始上面的SecondHammer(),第二个锤头运动方式的小脚本
sleep ExtractionDelay; //延迟ExtractionDelay这个变量的时间
}
}
//这里就是调用两个锤头的小脚本来做整个运动了,锤头1先运动,延迟ExtractionDelay的时间后锤头2运动,延迟后锤头1再运动,如此反复
ExtractionDelay是我们最开始时定义的静态变量,有什么用呢?我们希望采矿机根据采矿效率有不同的速度,就靠这个来表示,它的值大,两个锤之间运动的间隔就长,我们就感到采矿慢了。

Create() //出生脚本
{
ExtractionDelay = 0; //将静态变量ExtractionDelay的值置为0

dont-shade building; //不要对部件building使用光源渲染,下面几句也是这个意思
dont-shade hammer1;
dont-shade hammer2;
dont-shade decor1;
dont-shade decor2;
dont-shade decor3;
dont-shade decor4;
start-script SmokeUnit(); //开始上面的单位冒烟小脚本,检查是否需要冒烟
}
//Create()脚本是用来定义单位出生时的状态,例如那些部分需要隐藏起来之类,比如开炮时炮口的火光就需要
TA-EXCESS II的作者认为TA的光源渲染不如他自己画贴图的高光和变暗漂亮,所以在单位出生时就禁止了所有部件的光源渲染,不过这样单位运动的话亮暗都是固定的,不会有变化。

Activate() //活动状态
{
start-script Go(); //开始小脚本Go()
}
//这里很简单,如果单位处于活动状态,对于采矿器来说活动状态就是采矿,那么就开始小脚本Go()来使模型动起来。

SweetSpot(PieceNum) //不明这个脚本的含义
{
PieceNum = building;
}
//具体不明,但似乎是这个单位的代表点,例如我要攻击(或这修理之类)这个单位,就往这里指定的这个部件的源点打。例如这里是往building这个部件的源点。TA因为是使用3D立体碰撞,所以会存在需要一个点来确定打单位那部分的问题。这个点还有许多方面要用,例如飞机维修坪也需要这个点确定飞机停在什么地方。

SetSpeed(ExtractionRate) //这里就是具体定义ExtractionDelay这个静态变量的小脚本
{
ExtractionDelay = 1400 - ExtractionRate / 3; //ExtractionDelay=1400减去采矿效率除以3
if( ExtractionDelay <= 325 ) //如果结果小于等于325
{
ExtractionDelay = 325; //那就让它等于325
}
}
//这里就是具体定义ExtractionDelay这个静态变量到底等于多少的脚本啦,可以看到采矿效率ExtractionRate(系统函数)越大,变量就越小,两个锤头运动间隔就越短,感觉采矿就越快。

Killed(Severity, CorpseType) //死亡脚本
{
if( Severity <= 50 ) //不清楚具体什么小于50%,理解是伤害的程度
{
CorpseType = 1; //尸体模式=1
explode decor1 type BITMAPONLY | BITMAP3; //调用死亡炸飞库中的子程序炸飞decor1部件,下面几句同样
explode decor2 type BITMAPONLY | BITMAP3; //炸飞decor2
explode decor3 type BITMAPONLY | BITMAP3; //炸飞decor3
explode decor4 type BITMAPONLY | BITMAP3; //炸飞decor4
return (0); //返回
}
CorpseType = 2; //尸体模式=2
explode building type SHATTER | BITMAP5;
explode decor1 type BITMAPONLY | BITMAP1;
explode decor2 type BITMAPONLY | BITMAP1;
explode hammer1 type FALL | SMOKE | EXPLODE_ON_HIT | BITMAP1;
explode hammer2 type FALL | SMOKE | EXPLODE_ON_HIT | BITMAP1;
}

//上面的脚本就是描述单位怎么死的,调用了"exptype.h"里面的子程序来炸飞一些部件。详细是什么意思可以查看"exptype.h"文件,里面有解析。
尸体分了两种模式,有的单位还分更多。根据Severity这个程度来决定怎么死。

上面的内容挺多的,不过对于一个采矿机来说,不过4种状态——出生Create() ,活动Activate(),死亡Killed(),还有一种是不活动DeActivate(),不过TA-EXCESS II的作者取消了这种状态。也就是说这个MOD的采矿机是不能像原版的那样关闭的(其实也没人会那么无聊关闭采矿机),一造出来就一直活动。
这3种状态分别调用了一些小脚本,例如出生Create()调用了冒烟,活动Activate()调用了GO()来运动。死亡Killed()没有调用脚本,而调用了库中的炸飞子程序。

如果我们要做个采矿机,其实也简单,只要改以下几点
冒烟:
1.从那个部件冒烟 2.剩百分之几生命冒烟 3.隔多久冒一团烟 4.冒那种烟(查"sfxtype.h"看看烟都有哪几种方式)
运动:
部件要怎么运动这就好改了吧,沿X轴Y轴Z轴运动,运动间延迟等等都是比较简单的。
出生:
没什么好改的,改改部件的名称跟自己的模型一样就行,需要光源渲染的就不用dont-shade啦。
死亡:
爱炸飞那个部件就炸飞那个部件。查"exptype.h"看看那些各代表什么模式就好了。

写一个脚本不容易,改一个就是这么简单!
ArmT1Mex.jpg
ArmT1Mex.rar (2.07 KB)