CoreT1ArtTank脚本分析- from fonter456

//下面TA-EXCESS II alpha1e版的CORE的T1双管炮坦克的脚本,估计每个版本的都一样,如果你的版本不一样也可以对照看看
//解析这个脚本的目的是介绍:如何用脚本控制攻击间隔
#define TA
#include “sfxtype.h”
#include “exptype.h”
piece base, hull, lftrack, lfshadow, rftrack, rfshadow, lbtrack, lbshadow, rbtrack, rbshadow, lplate, rplate,
turret, pitchturret, barrel1, fire1, barrel2, fire2, flare1, flare2, flare3, decor;
static-var DamageNow, LastDamage, Cannon, Reloading; //定义静态变量,cannon和Reloading是这里要解析的
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 decor;
emit-sfx 256 | 1 from lplate;
SleepTime = 300;
}
if( HealthPercent < 30 )
{
emit-sfx 256 | 2 from pitchturret;
emit-sfx 256 | 2 from rbtrack;
SleepTime = 200;
}
sleep SleepTime;
}
}
HitByWeapon(AngleX, AngleZ)
{
DamageNow = get HEALTH;
if( DamageNow <= LastDamage - 10 )
{
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;
}
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>;
}
Reload() //装弹脚本,控制攻击间隔
{
Reloading = 1; //当静态变量 Reloading=1时
sleep 3500; //延迟3500毫秒,也就是3.5秒
Reloading = 0; //Reloading=0时,什么也不做
return (0); //返回0
}
Create()
{
DamageNow = 100;
LastDamage = 100;
Cannon = fire1; //出生时Cannon = fire1,fire1是炮弹的射出点
Reloading = 0; //初生时Reloading = 0

hide flare1;
hide flare2;
hide flare3;
dont-cache flare1;
dont-cache flare2;
dont-cache flare3;

spin flare1 around z-axis speed <200.00>;
spin flare2 around z-axis speed <-200.00>;
spin flare3 around z-axis speed <2000.00>;

start-script SmokeUnit();
}
StartMoving()
{
dont-cache lftrack;
dont-cache rftrack;
dont-cache lbtrack;
dont-cache rbtrack;
}
StopMoving()
{
cache lftrack;
cache rftrack;
cache lbtrack;
cache rbtrack;
}
RestoreAfterDelay()
{
sleep 4000;
Cannon = fire1;
turn turret to y-axis <0.000000> speed <50.000000>;
turn pitchturret to x-axis <0.000000> speed <15.000000>;
start-script SmokeUnit();//Smoke script seems to disappear sometimes. This should fix the issue.
}
SweetSpot(PieceNum)
{
PieceNum = turret;
}
QueryPrimary(PieceNum) //炮弹的射出点
{
PieceNum = Cannon; //射出点为Cannon,在下面开火时再令Cannon=fire1和fire2,这样就可以让两根炮管轮流开炮了
}
AimFromPrimary(PieceNum)
{
PieceNum = pitchturret;
}
AimPrimary(Heading, Pitch) //瞄准的脚本
{
signal 2;
set-signal-mask 2;
turn turret to y-axis Heading speed <100.00>;
turn pitchturret to x-axis <0.00> - Pitch speed <30.00>;
while( Reloading == 1 ) //如果Reloading = 1
{
sleep 100; //延迟0.1秒
}
turn turret to y-axis Heading speed <100.00>;
turn pitchturret to x-axis <0.00> - Pitch speed <30.00>;
wait-for-turn turret around y-axis;
wait-for-turn pitchturret around x-axis;
start-script RestoreAfterDelay();
return (1); //返回1
}
FirePrimary() //开火的脚本
{
if( Cannon == fire1 ) //当Cannon == fire1时
{
Cannon = Fire2; //就让Cannon = Fire2,下面炮口火光动作,不管
move flare1 to x-axis [0.00] now;
move flare2 to x-axis [0.00] now;
move flare3 to x-axis [0.00] now;
move flare1 to z-axis [0.00] now;
move flare2 to z-axis [0.00] now;
move flare3 to z-axis [0.00] now;

move barrel1 to z-axis [-2.00] speed [40.00];
move flare1 to z-axis [-1.5] speed [30.00];
move flare2 to z-axis [-1.00] speed [20.00];
move flare3 to z-axis [-0.5] speed [10.00];
show flare1;
show flare2;
show flare3;
sleep 150;
hide flare1;
emit-sfx 256 | 2 from fire1;
sleep 25;
hide flare2;
sleep 25;
hide flare3;
emit-sfx 256 | 1 from fire1;
move barrel1 to z-axis [0.00] speed [2.00];
return (0); //返回0
}
Cannon = fire1; //让Cannon = fire1,到这里的目的是为了两个炮管轮流开炮
start-script Reload(); //启动Reload()脚本,延迟3.5秒,使攻击产生3.5秒的间隔

move flare1 to x-axis [-1.80] now;
move flare2 to x-axis [-1.80] now;
move flare3 to x-axis [-1.80] now; //这3句作用是把火光左右移到旁边的炮管口
move flare1 to z-axis [0.00] now;
move flare2 to z-axis [0.00] now;
move flare3 to z-axis [0.00] now; //这3句是前后移动到初始位置,因为这个火光闪时还会移动

move barrel2 to z-axis [-2.00] speed [40.00];
move flare1 to z-axis [-1.5] speed [30.00];
move flare2 to z-axis [-1.00] speed [20.00];
move flare3 to z-axis [-0.5] speed [10.00];
show flare1;
show flare2;
show flare3;
sleep 150;
hide flare1;
emit-sfx 256 | 2 from fire2;
sleep 25;
hide flare2;
sleep 25;
hide flare3;
emit-sfx 256 | 1 from fire2;
move barrel2 to z-axis [0.00] speed [2.00];
}
//这就是一般的双管炮的攻击间隔控制的过程,两根炮管各攻击一次之后,静态变量 Reloading=1,延迟3.5秒,这样就实现了两管轮流开炮后冷却一会再开炮。实际上还可以两根炮管各配一个武器,免去用Reload脚本,不过相比之下那样会消耗多一点资源。不会C语言的,只要会改延迟时间就好了,其它不用管。
//TA-EXCESS II的模型基本都是一个炮口火光,那根炮管开火就让火光“立刻移动”过去在那里闪,这样做的目的是为了节省一个炮口火光的模型,减少多边形数量而已。
Killed(Severity, CorpseType)
{
hide flare1;
hide flare2;
hide flare3;
if( Severity <= 50 )
{
CorpseType = 1;
explode lftrack type BITMAPONLY | BITMAP3;
explode rftrack type BITMAPONLY | BITMAP3;
explode lbtrack type BITMAPONLY | BITMAP1;
explode rbtrack type BITMAPONLY | BITMAP1;
explode pitchturret type SHATTER | BITMAP5;
return (0);
}
CorpseType = 2;
explode lftrack type BITMAPONLY | BITMAP3;
explode rftrack type BITMAPONLY | BITMAP3;
explode lbtrack type BITMAPONLY | BITMAP3;
explode rbtrack type BITMAPONLY | BITMAP3;
explode barrel1 type FALL | SMOKE | EXPLODE_ON_HIT | BITMAP1;
explode barrel2 type FALL | SMOKE | EXPLODE_ON_HIT | BITMAP1;
explode pitchturret type FALL | SMOKE | EXPLODE_ON_HIT | BITMAP1;
explode turret type BITMAPONLY | BITMAP5;
explode hull type SHATTER | BITMAP5;
}

//总结,3炮管,4炮管之类大概也是这样处理,只要在炮管轮流那里加其它炮管就可以。