//以下gok的激光坦克的脚本,讲解护盾的部分
#define TA // This is a TA script
#include “sfxtype.h”
#include “exptype.h”
piece base, turret, sleeve1, sleeve2, barrel1, barrel2, flare1, flare2, baseshadow,
shield, shi1, shi2, shi3;
static-var laser, reloading, shieldon, shieldblocks, shieldpower, damagenow, lastdamage;
// Signal definitions
#define SIG_AIM 2
ShieldHitFX() //护盾效果显示的脚本
{
signal 256; //信号256
set-signal-mask 256; //信号256,用于终止脚本避免占用内存的设置
show shi1;
show shi2;
show shi3; //同时显示三个部件
sleep 150;
hide shi1; //0.15秒后隐藏部件1
sleep 100;
hide shi2; //再过0.1秒后隐藏部件2
sleep 100;
hide shi3; //最后隐藏部件3
return (0);
}
ShieldUnit() //护盾的具体运作方式的脚本
{
while( TRUE ) //当有效时
{
sleep 1000; //延迟1秒,未知原因
//no sub-zero power levels
if( shieldpower < 0 )
{
shieldpower = 0; //这段if的作用为使护盾能量最小值为0,避免出现负数
}
//shield generator is active and recharges
if( shieldon == 1 )
{
shieldpower = shieldpower + 5 + (lastdamage / 220 ); //护盾每秒回复5,还有护盾受到伤害后损失能量
//limit maximum charge
if( shieldpower > 400 )
{
shieldpower = 400; //护盾能量最大值是400
if( Rand( 1, 30 ) <= 2 )
{
start-script ShieldHitFX();
}
}
}
//shield generator becomes charged enough to start blocking shots!
if( shieldblocks == 0 )
{
if( shieldpower >= 200 )
{
shieldblocks = 1;
set ARMORED to 1;
start-script ShieldHitFX();
}
}
}
}
HitByWeapon(anglex, anglez)
{
damagenow = get HEALTH;
damagenow = damagenow * 11;
if( shieldblocks == 1 )
{
start-script ShieldHitFX();
shieldpower = shieldpower - (3 * ( lastdamage - damagenow ));
lastdamage = damagenow;
if( shieldpower <= 0 )
{
set ARMORED to 0;
shieldblocks = 0;
shieldpower = 0;
}
return (0);
}
if( damagenow <= lastdamage - 22 )
{
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 <50.000000>;
turn base to z-axis anglez speed <50.000000>;
wait-for-turn base around z-axis;
wait-for-turn base around x-axis;
turn base to z-axis <0.000000> speed <20.000000>;
turn base to x-axis <0.000000> speed <20.000000>;
}
Reload()
{
reloading = 1;
sleep 2000;
reloading = 0;
return (0);
}
Create()
{
hide flare1;
hide flare2;
laser = flare1;
reloading = 0;
shieldon = 0;
shieldblocks = 0;
shieldpower = 0;
damagenow = 1100;
lastdamage = 1100;
set ARMORED to 0;
spin shi1 around y-axis speed <800.000000>;
spin shi2 around y-axis speed <700.000000>;
spin shi3 around y-axis speed <600.000000>;
hide shi1;
hide shi2;
hide shi3;
dont-cache shi1;
dont-cache shi2;
dont-cache shi3;
spin flare1 around z-axis speed <300.000000>;
spin flare2 around z-axis speed <-300.000000>;
while( get BUILD_PERCENT_LEFT )
{
sleep 1000;
}
shieldon = 1;
shieldblocks = 1;
shieldpower = 400;
set ARMORED to 1;
start-script ShieldUnit();
}
StartMoving()
{
dont-cache base;
}
StopMoving()
{
cache base;
}
RestoreAfterDelay()
{
sleep 3000;
laser = flare1;
turn turret to y-axis <0.000000> speed <80.000000>;
turn sleeve1 to x-axis <0.000000> speed <40.000000>;
turn sleeve2 to x-axis <0.000000> speed <40.000000>;
}
SweetSpot(piecenum)
{
piecenum = base;
}
QueryPrimary(piecenum)
{
piecenum = laser;
}
AimFromPrimary(piecenum)
{
piecenum = turret;
}
AimPrimary(heading, pitch)
{
signal SIG_AIM;
set-signal-mask SIG_AIM;
turn turret to y-axis heading speed <120.000000>;
turn sleeve1 to x-axis <0.000000> - pitch speed <60.000000>;
turn sleeve2 to x-axis <0.000000> - pitch speed <60.000000>;
while( reloading == 1 )
{
sleep 100;
}
turn turret to y-axis heading speed <120.000000>;
turn sleeve1 to x-axis <0.000000> - pitch speed <60.000000>;
turn sleeve2 to x-axis <0.000000> - pitch speed <60.000000>;
wait-for-turn turret around y-axis;
wait-for-turn sleeve1 around x-axis;
wait-for-turn sleeve2 around x-axis;
start-script RestoreAfterDelay();
return (1);
}
FirePrimary()
{
if( laser == flare1 )
{
laser = flare2;
show flare1;
move barrel1 to z-axis [-1.500000] speed [100.000000];
sleep 150;
hide flare1;
move barrel1 to z-axis [0.000000] speed [3.000000];
return (0);
}
start-script Reload();
laser = flare1;
show flare2;
move barrel2 to z-axis [-1.500000] speed [100.000000];
sleep 150;
hide flare2;
move barrel2 to z-axis [0.000000] speed [3.000000];
}
Killed(severity, corpsetype)
{
hide shi1;
hide shi2;
hide shi3;
hide flare1;
hide flare2;
if( severity <= 25 )
{
corpsetype = 1;
explode base type BITMAPONLY | BITMAP2;
explode turret type BITMAPONLY | BITMAP2;
explode sleeve1 type BITMAPONLY | BITMAP5;
explode sleeve2 type BITMAPONLY | BITMAP5;
explode barrel1 type BITMAPONLY | BITMAP5;
explode barrel2 type BITMAPONLY | BITMAP5;
return (0);
}
if( severity <= 50 )
{
corpsetype = 2;
explode base type SHATTER | BITMAP4;
explode turret type BITMAPONLY | BITMAP1;
explode sleeve1 type BITMAPONLY | BITMAP5;
explode sleeve2 type BITMAPONLY | BITMAP5;
explode barrel1 type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP2;
explode barrel2 type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP2;
return (0);
}
corpsetype = 3;
explode base type SHATTER | BITMAP4;
explode turret type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP2;
explode sleeve1 type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP2;
explode sleeve2 type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP2;
explode barrel1 type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP2;
explode barrel2 type FALL | SMOKE | FIRE | EXPLODE_ON_HIT | BITMAP2;
}