CoreT1LasTank脚本分析- from fonter456

下面TA-EXCESS II alpha1e版的CORE的T1激光坦克的脚本,估计每个版本的都一样,如果你的版本不一样也可以对照看看

下面是脚本的注释:

#define TA
#include “sfxtype.h”
#include “exptype.h”
piece base, hull, lplate, rplate, ltrack, lshadow, rtrack, rshadow, turret, pitchturret, barrel, flare1, flare2, fire;
static-var DamageNow, LastDamage; //设置两个静态变量DamageNow和LastDamage,后面用
SmokeUnit(HealthPercent, SleepTime) //冒烟脚本,不解析了
{
signal 8;
set-signal-mask 8;
while( get BUILD_PERCENT_LEFT )
{
sleep 500;
}
while( TRUE )
{
HealthPercent = get HEALTH;
if( HealthPercent < 60 )
{
emit-sfx 256 | 1 from pitchturret;
SleepTime = 300;
}
if( HealthPercent < 30 )
{
emit-sfx 256 | 2 from lplate;
emit-sfx 256 | 1 from rplate;
SleepTime = 200;
}
sleep SleepTime;
}
}
HitByWeapon(AngleX, AngleZ) //被武器打中的脚本
{
DamageNow = get HEALTH; //令变量DamageNow=当前生命的百分比
if( DamageNow <= LastDamage - 10 ) //如果变量DamageNow<=LastDamage - 10
{
signal 128;
set-signal-mask 128;
LastDamage = DamageNow; //
turn base to z-axis AngleZ speed <105.000000>; //以105的速度沿水平方向Z轴转动base部件到AngleZ这个角度
turn base to x-axis AngleX speed <105.000000>; //同上,X轴方向
wait-for-turn base around z-axis;
wait-for-turn base around x-axis;
turn base to z-axis <0.000000> speed <30.000000>; //以30的速度转回到原位
turn base to x-axis <0.000000> speed <30.000000>;
return (0);
}
LastDamage = DamageNow; //懂C语言的话就明白的
}
//上面这个脚本是单位被击中时摇晃一下的脚本,开头时设置两个静态变量DamageNow和LastDamage
//AngleX, AngleZ,是"anglex" 和 “anglez” 是被击中部位的 X 和 Z 坐标 。不用管。

RockUnit(AngleX, AngleZ) //小脚本,摇晃单位,
{
turn base to x-axis AngleX speed <25.000000>;
turn base to z-axis AngleZ speed <25.000000>;
wait-for-turn base around z-axis;
wait-for-turn base around x-axis;
turn base to z-axis <0.000000> speed <10.000000>;
turn base to x-axis <0.000000> speed <10.000000>;
}
//上面这个脚本是单位攻击别人,时摇晃一下的脚本,根据攻击攻击的方向往反方向摇晃一下,模拟后坐力

Create() //出生状态脚本,不详细解析了
{
DamageNow = 100;
LastDamage = 100;

hide flare1;
hide flare2; //把炮口的火光1和火光2隐藏起来
dont-cache flare1; //不阻止火光1和2的动态贴图的播放
dont-cache flare2;

spin flare1 around z-axis speed <200.00>; //旋转火光1和2
spin flare2 around z-axis speed <-210.00>;

start-script SmokeUnit();
}
//对火光1和2的描述比较多,普通的单位一个炮管只有一个火光(一般什么特殊效果都没有,就是开炮时出现一下),TA-EXCESS II的有内外两层火光还带动态贴图,还要旋转。

StartMoving() //开始移动的脚本
{
dont-cache ltrack; //不阻止左边履带的动态贴图的播放
dont-cache rtrack; //右边履带
}
///在部件ltrack和ltrack上贴履带的动态贴图,在移动时播放,使看起来履带有动
StopMoving() //停止移动的脚本
{
cache ltrack; //阻止左边履带的动态贴图的播放
cache rtrack; //右边履带
}
//停止移动就阻止动态贴图播放,这样履带就像不动了。如果你的单位没这些效果,例如TA的那些古老的原始的坦克,就删去这两段脚本吧。

RestoreAfterDelay() //返回初始的状态的脚本
{
sleep 4000; //延迟4000毫秒,就是不攻击之后4秒
turn turret to y-axis <0.000000> speed <90.000000>; //炮台以90的速度转动回到原位0
turn pitchturret to x-axis <0.000000> speed <30.000000>; //子炮台也回归原位,
start-script SmokeUnit();//Smoke script seems to disappear sometimes. This should fix the issue.
}
//就是让炮台炮管不攻击一段时间后,回归原位的脚本。炮台水平转回原位,子炮台(一般是炮管)上下方向转到原位

SweetSpot(PieceNum) //“甜点”,其实是指这个单位的整体参考位置,维修,被别人打都是对准这个位置
{
PieceNum = turret; //指定部件是炮台,会以炮台的原点为“甜点”
}

QueryPrimary(PieceNum) //第一武器参考点
{
PieceNum = fire; //炮口火光位置上的一个无模型的部件,TA可以建这种无模型部件,一般是用来做冒烟冒泡的原点,这里是用来做炮弹的出发点。
}
AimFromPrimary(PieceNum) //这个脚本是要以子炮台作为瞄准的部件
{
PieceNum = pitchturret; //部件是子炮台
}
AimPrimary(Heading, Pitch) //炮台瞄准的脚本
{
signal 2;
set-signal-mask 2;
turn turret to y-axis Heading speed <180.00>; //炮台水平转动到目标,这个<180.00>就是炮台的转速
turn pitchturret to x-axis <0.00> - Pitch speed <60.00>; //炮管上下转动到目标,
wait-for-turn turret around y-axis;
wait-for-turn pitchturret around x-axis;
start-script RestoreAfterDelay(); //调用上面的小脚本让炮台炮管不攻击时返回原位
return (1);
}
//瞄准的方式是炮台水平对准目标,炮管上下对准目标,这样就能对准目标了,这里最重要的就是炮台的转动速度,瞄得快才能早开炮,其他没什么好改的了。炮管的上下瞄准也有一点重要。

FirePrimary() //开火的脚本
{
move flare1 to z-axis [0.00] now;
move flare2 to z-axis [0.00] now;

move barrel to z-axis [-1.00] speed [10.00]; //炮管向后,这是模拟炮管后坐力
move flare1 to z-axis [-0.50] speed [5.00];
move flare2 to z-axis [-0.50] speed [5.00]; //flare的这4句一般的脚本是没有的,让炮口火光多点动态而已
show flare1; //这是重点,显示一下炮口的火光,不过没什么好改的
show flare2;
sleep 150; // 延迟150毫秒,就是让炮口火光显示0.15秒
hide flare1; //隐藏炮口火光1
hide flare2;
move barrel to z-axis [0.00] speed [3.00]; //移动炮管到原位
}
//开火要做的事一般只有两件,模拟一下炮管后坐力,显示一下炮口火光。模拟后座力就是炮管迅速向后(z轴负数)运动,再慢速回到原位(z轴原点0),炮口火光就是显示,然后延迟一下,再隐藏。

Killed(Severity, CorpseType) //死亡,不详细解析了
{
hide flare1; //炮口火光是开火时才有的,所以特别在死时也要隐藏一下,避免出现
hide flare2;
if( Severity <= 50 )
{
CorpseType = 1;
explode ltrack type BITMAPONLY | BITMAP3; //炸飞左履带
explode rtrack type BITMAPONLY | BITMAP3; //炸飞右履带
explode lplate type BITMAPONLY | BITMAP1; //炸飞左履带上边的保护板
explode rplate type BITMAPONLY | BITMAP1; //炸飞右履带上边的保护板
explode turret type BITMAPONLY | BITMAP5; //炸飞炮台
explode pitchturret type SHATTER | BITMAP5; //炸飞子炮台
return (0);
}
CorpseType = 2;
explode ltrack type BITMAPONLY | BITMAP3;
explode rtrack type BITMAPONLY | BITMAP3;
explode lplate type FALL | SMOKE | EXPLODE_ON_HIT | BITMAP1;
explode rplate type FALL | SMOKE | EXPLODE_ON_HIT | BITMAP1;
explode turret type BITMAPONLY | BITMAP5;
explode hull type SHATTER | BITMAP5;
explode barrel type FALL | SMOKE | EXPLODE_ON_HIT | BITMAP1;
explode pitchturret type FALL | SMOKE | EXPLODE_ON_HIT | BITMAP1;
}

一个单炮台单炮管的坦克的脚本就是这么简单,最重要的也就是瞄准和开火。被打中和开火摇晃单位之类没什么改的必要。履带运动之类看你需要了,不要就删除。通常我们会改的也只有一个地方,就是炮台的旋转速度。

一个多炮台多炮管的单位就麻烦一点,不过改起来倒是没什么难度。
CoreT1LasTank.rar (3.2 KB)
CoreT1LasTank.jpg

试着解释一下这段,可能理解有误,多多包涵。。。

作者设置了两个变量,DamageNow 和 LastDamage ,我们理解为“当前血量”和“上一次血量”,两个变量的初始值在creat()语句下都为100,下面开始进入程序。

HitByWeapon(AngleX, AngleZ) //被武器打中的脚本
{
DamageNow = get HEALTH; //令变量“当前血量”=当前生命的百分比
if( DamageNow <= LastDamage - 10 ) //如果变量“当前血量”<=“上一次血量” - 10,在第一次循环时则为(100 - 10),也就是小于等于90
{
signal 128;
set-signal-mask 128; //开始接收到“被攻击脚本”指令
LastDamage = DamageNow; //让“上一次血量”=“当前血量”
turn base to z-axis AngleZ speed <105.000000>; //下面几行都是具体实现“被攻击脚本”动作的语句,就不细说了,可以自己发挥想象去做,或者照抄
turn base to x-axis AngleX speed <105.000000>;
wait-for-turn base around z-axis;
wait-for-turn base around x-axis;
turn base to z-axis <0.000000> speed <30.000000>;
turn base to x-axis <0.000000> speed <30.000000>;
return (0);
}
LastDamage = DamageNow; //如果if判断为否,则“上一次血量”=“当前血量”,这应该是在被“次级威力攻击”的情况下的结果。
}

重点脚本分析:
下面具体分析一下作者这样安排的用意,从这个循环所表达的意义上来讲,作者有可能希望这个坦克单位有比较耐攻击的视觉效果,也就是当每次坦克遭受新的攻击时,脚本会判断单位所遭受的攻击的伤害程度,如果攻击伤害程度足够威力,可将当前血量消去10%以上时,才会被打得摇摆,如果是被一般的小激光或轻型武器击中,则可以凸显该坦克强悍的抗打击力,而出现一种“强直”状态,也就是被攻击后没有任何反应,仍然强悍作战的样子,所以这段脚本实现的目的就是为了说明,只有足够威力的攻击才能撼动这部坦克。

当然,如果再增加对“次级威力攻击”的装甲加成,那么就更加华丽了,还可以增加被“次级威力攻击”后显示防御照的视觉效果,不过这些都将影响单位的综合能力,会对整体阵营平衡起到影响,也可以作为在修改单位平衡性上一个重要环节来对待。但不管怎么说,这种脚本都属于比较有意思的构思,只是,在Excess II超快节奏的游戏方式下,是否会有人真的注意到这段脚本所引发出来的效果呢?