Finished biorifle, began work on pulsegun.
Added some extra particle effects just for kicks. Made various actors freeze-aware. Tweaked a couple things here and there.
This commit is contained in:
parent
d718eb6a9c
commit
73e8e8ada9
96 changed files with 1437 additions and 133 deletions
|
|
@ -4,7 +4,6 @@ Class FlakAmmo : Ammo
|
|||
{
|
||||
Tag "Flak Shells";
|
||||
Inventory.PickupMessage "You picked up 10 Flak Shells.";
|
||||
Inventory.PickupSound "ut/ammo";
|
||||
Inventory.Amount 10;
|
||||
Inventory.MaxAmount 50;
|
||||
Ammo.BackpackAmount 50;
|
||||
|
|
@ -41,7 +40,7 @@ Class ChunkLight : DynamicLight
|
|||
Default
|
||||
{
|
||||
DynamicLight.Type "Point";
|
||||
Args 255,224,8;
|
||||
Args 255,224,128,8;
|
||||
}
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
|
|
@ -55,6 +54,7 @@ Class ChunkLight : DynamicLight
|
|||
Destroy();
|
||||
return;
|
||||
}
|
||||
if ( globalfreeze || level.frozen ) return;
|
||||
args[LIGHT_RED] = 255*target.alpha;
|
||||
args[LIGHT_GREEN] = 224*target.alpha;
|
||||
args[LIGHT_BLUE] = 128*target.alpha;
|
||||
|
|
@ -84,6 +84,7 @@ Class ChunkTrail : Actor
|
|||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( globalfreeze || level.frozen ) return;
|
||||
A_SpawnParticle("FFFF00",SPF_FULLBRIGHT,1,8,startalphaf:alpha);
|
||||
A_SpawnParticle("E0A000",SPF_FULLBRIGHT,1,16,startalphaf:alpha*0.6);
|
||||
A_SpawnParticle("804000",SPF_FULLBRIGHT,1,32,startalphaf:alpha*0.3);
|
||||
|
|
@ -111,7 +112,7 @@ Class FlakChunk : Actor
|
|||
{
|
||||
Actor lasthit;
|
||||
ChunkTrail trail;
|
||||
double rollvel, pitchvel;
|
||||
double rollvel, pitchvel, yawvel;
|
||||
double lifetime, lifespeed;
|
||||
int lifetics;
|
||||
Default
|
||||
|
|
@ -119,7 +120,7 @@ Class FlakChunk : Actor
|
|||
Obituary "%o was ripped to shreds by %k's Flak Cannon.";
|
||||
Radius 4;
|
||||
Height 4;
|
||||
Speed 80;
|
||||
Speed 50;
|
||||
DamageFunction Random[Flak](12,18);
|
||||
DamageType 'Shredded';
|
||||
BounceType "Doom";
|
||||
|
|
@ -142,12 +143,15 @@ Class FlakChunk : Actor
|
|||
trail.target = self;
|
||||
trail.speed = 0.5;
|
||||
rollvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1);
|
||||
pitchvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1);
|
||||
yawvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1);
|
||||
scale *= Frandom[Flak](0.8,1.2);
|
||||
SetState(ResolveState("Spawn")+Random[Flak](0,3));
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( globalfreeze || level.frozen ) return;
|
||||
lifetics++;
|
||||
if ( lifetics > 3 )
|
||||
{
|
||||
|
|
@ -160,15 +164,24 @@ Class FlakChunk : Actor
|
|||
if ( InStateSequence(CurState,FindState("Death")) ) return;
|
||||
A_SetRoll(roll+rollvel,SPF_INTERPOLATE);
|
||||
A_SetPitch(pitch+pitchvel,SPF_INTERPOLATE);
|
||||
A_SetAngle(angle+pitchvel,SPF_INTERPOLATE);
|
||||
}
|
||||
action void A_HandleBounce()
|
||||
{
|
||||
A_SprayDecal("WallCrack",-8);
|
||||
int numpt = Random[Flak](8,12);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](2,4);
|
||||
A_SpawnParticle("FFA000",SPF_FULLBRIGHT,Random[Flak](10,20),FRandom[Flak](1.2,3.6),0,0,0,0,pvel.x,pvel.y,pvel.z,0,0,0,3.0,-1,-0.25);
|
||||
}
|
||||
A_Gravity();
|
||||
invoker.rollvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed);
|
||||
invoker.pitchvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed);
|
||||
invoker.yawvel = FRandom[Flak](50,100)*RandomPick[Flak](-1,1)*(vel.length()/speed);
|
||||
vel = (vel.unit()+(FRandom[Flak](-0.4,0.4),FRandom[Flak](-0.4,0.4),FRandom[Flak](-0.4,0.4))).unit()*vel.length();
|
||||
A_PlaySound("flak/bounce",volume:0.3);
|
||||
A_AlertMonsters();
|
||||
if ( vel.length() < 4.0 ) ExplodeMissile();
|
||||
}
|
||||
override int DoSpecialDamage( Actor target, int damage, Name damagetype )
|
||||
|
|
@ -177,6 +190,7 @@ Class FlakChunk : Actor
|
|||
{
|
||||
if ( target != lasthit ) target.SpawnBlood(pos,AngleTo(target),damage);
|
||||
A_PlaySound("flak/meat",volume:0.3);
|
||||
A_AlertMonsters();
|
||||
}
|
||||
lasthit = target;
|
||||
return damage;
|
||||
|
|
@ -249,6 +263,7 @@ Class SlugSmoke : Actor
|
|||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( globalfreeze || level.frozen ) return;
|
||||
lifetime += lifespeed;
|
||||
if ( waterlevel <= 0 ) A_SpawnParticle("AAAAAA",0,50,16.0,velx:FRandom[Flak](-0.5,0.5),vely:FRandom[Flak](-0.5,0.5),velz:FRandom[Flak](-0.5,0.5),accelz:0.05,startalphaf:scale.x,sizestep:1.0);
|
||||
scale.x = max(0,1-lifetime);
|
||||
|
|
@ -278,6 +293,7 @@ Class SlugLight : DynamicLight
|
|||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( globalfreeze || level.frozen ) return;
|
||||
args[LIGHT_RED] = 255*lifetime;
|
||||
args[LIGHT_GREEN] = 224*lifetime;
|
||||
args[LIGHT_BLUE] = 128*lifetime;
|
||||
|
|
@ -320,6 +336,7 @@ Class FlakSlug : Actor
|
|||
A_Explode(Random[Flak](60,80),150);
|
||||
A_QuakeEx(4,4,4,8,0,200,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.2);
|
||||
A_PlaySound("flak/explode",CHAN_VOICE);
|
||||
A_AlertMonsters();
|
||||
if ( !Tracer ) Spawn("SlugSmoke",pos);
|
||||
Spawn("SlugLight",pos);
|
||||
Vector3 x, y, z;
|
||||
|
|
@ -337,6 +354,12 @@ Class FlakSlug : Actor
|
|||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed*FRandom[Flak](0.5,1.5);
|
||||
p.target = target;
|
||||
}
|
||||
int numpt = Random[Flak](40,80);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
Vector3 pvel = (FRandom[Flak](-1,1),FRandom[Flak](-1,1),FRandom[Flak](-1,1)).unit()*FRandom[Flak](2,4);
|
||||
A_SpawnParticle("FFA000",SPF_FULLBRIGHT,Random[Flak](20,40),FRandom[Flak](4.8,7.2),0,0,0,0,pvel.x,pvel.y,pvel.z,0,0,0,3.0,-1,-0.25);
|
||||
}
|
||||
}
|
||||
States
|
||||
{
|
||||
|
|
@ -356,6 +379,7 @@ Class FlakSlug : Actor
|
|||
|
||||
Class FlakLight : DynamicLight
|
||||
{
|
||||
int cnt;
|
||||
Default
|
||||
{
|
||||
DynamicLight.Type "Point";
|
||||
|
|
@ -376,57 +400,14 @@ Class FlakLight : DynamicLight
|
|||
Destroy();
|
||||
return;
|
||||
}
|
||||
SetOrigin(target.pos,true);
|
||||
}
|
||||
}
|
||||
|
||||
Class FlakMuzzle : Actor
|
||||
{
|
||||
Vector3 ofs;
|
||||
|
||||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
let l = Spawn("FlakLight",pos);
|
||||
l.target = self;
|
||||
if ( target ) ofs = target.Vec3To(self);
|
||||
else ofs = (0,0,0);
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !target )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
bInvisible = (target != players[consoleplayer].camera);
|
||||
SetOrigin(target.Vec3Offset(ofs.x-target.vel.x,ofs.y-target.vel.y,ofs.z-target.vel.z),true);
|
||||
}
|
||||
Default
|
||||
{
|
||||
RenderStyle "Add";
|
||||
Radius 0.1;
|
||||
Height 0;
|
||||
Scale 0.08;
|
||||
+NOGRAVITY;
|
||||
+NOBLOCKMAP;
|
||||
+DONTSPLASH;
|
||||
}
|
||||
States
|
||||
{
|
||||
Spawn:
|
||||
FMUZ A 3 Bright;
|
||||
Stop;
|
||||
if ( target.player ) SetOrigin(target.pos+(0,0,target.player.viewheight),true);
|
||||
else SetOrigin(target.pos,true);
|
||||
if ( cnt++ > 2 ) Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
Class FlakCannon : UTWeapon
|
||||
{
|
||||
action void A_Selecting()
|
||||
{
|
||||
A_PlaySound("flak/select",CHAN_WEAPON);
|
||||
}
|
||||
action void A_Loading( bool first = false )
|
||||
{
|
||||
if ( first ) A_PlaySound("flak/load",CHAN_WEAPON);
|
||||
|
|
@ -439,13 +420,15 @@ Class FlakCannon : UTWeapon
|
|||
if ( weap.Ammo1.Amount <= 0 ) return;
|
||||
if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return;
|
||||
A_PlaySound("flak/fire",CHAN_WEAPON);
|
||||
A_AlertMonsters();
|
||||
A_QuakeEx(1,1,1,3,0,64,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.05);
|
||||
Vector3 x, y, z;
|
||||
double a, s;
|
||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||
Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+2.0*y-3.0*z;
|
||||
let m = Spawn("FlakMuzzle",pos+(0,0,player.viewheight)+20.0*x+5.0*y-3.0*z);
|
||||
m.target = self;
|
||||
A_Overlay(-2,"MuzzleFlash");
|
||||
A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
|
||||
A_OverlayRenderstyle(-2,STYLE_Add);
|
||||
[x, y, z] = Matrix4.GetAxes(BulletSlope(),angle,roll);
|
||||
Actor p;
|
||||
for ( int i=0; i<8; i++ )
|
||||
|
|
@ -459,6 +442,12 @@ Class FlakCannon : UTWeapon
|
|||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
||||
p.target = self;
|
||||
}
|
||||
int numpt = Random[Flak](20,30);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
Vector3 pvel = (x+(FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8))).unit()*FRandom[Flak](2,4);
|
||||
A_SpawnParticle("FFA000",SPF_FULLBRIGHT,Random[Flak](10,20),FRandom[Flak](2.4,3.6),0,origin.x-pos.x,origin.y-pos.y,origin.z-pos.z,pvel.x,pvel.y,pvel.z,0,0,-0.1,3.0,-1,-0.25);
|
||||
}
|
||||
}
|
||||
action void A_FireSlug()
|
||||
{
|
||||
|
|
@ -467,24 +456,33 @@ Class FlakCannon : UTWeapon
|
|||
if ( weap.Ammo1.Amount <= 0 ) return;
|
||||
if ( !weap.DepleteAmmo(weap.bAltFire,true,1) ) return;
|
||||
A_PlaySound("flak/altfire",CHAN_WEAPON);
|
||||
A_QuakeEx(2,2,2,10,0,64,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
||||
A_AlertMonsters();
|
||||
A_QuakeEx(2,2,2,6,0,64,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:0.1);
|
||||
Vector3 x, y, z;
|
||||
double a, s;
|
||||
[x, y, z] = Matrix4.GetAxes(pitch,angle,roll);
|
||||
Vector3 origin = pos+(0,0,player.viewheight)+10.0*x+2.0*y-3.0*z;
|
||||
let m = Spawn("FlakMuzzle",pos+(0,0,player.viewheight)+20.0*x+5.0*y-3.0*z);
|
||||
m.target = self;
|
||||
A_Overlay(-2,"MuzzleFlash");
|
||||
A_OverlayFlags(-2,PSPF_RENDERSTYLE|PSPF_FORCESTYLE,true);
|
||||
A_OverlayRenderstyle(-2,STYLE_Add);
|
||||
Actor p = Spawn("FlakSlug",origin);
|
||||
p.angle = angle;
|
||||
p.pitch = BulletSlope();
|
||||
p.vel = (cos(p.angle)*cos(p.pitch),sin(p.angle)*cos(p.pitch),-sin(p.pitch))*p.speed;
|
||||
p.target = self;
|
||||
int numpt = Random[Flak](10,15);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
{
|
||||
Vector3 pvel = (x+(FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8),FRandom[Flak](-.8,.8))).unit()*FRandom[Flak](2,4);
|
||||
A_SpawnParticle("FFA000",SPF_FULLBRIGHT,Random[Flak](10,20),FRandom[Flak](2.4,3.6),0,origin.x-pos.x,origin.y-pos.y,origin.z-pos.z,pvel.x,pvel.y,pvel.z,0,0,-0.1,3.0,-1,-0.25);
|
||||
}
|
||||
}
|
||||
|
||||
Default
|
||||
{
|
||||
Tag "Flak Cannon";
|
||||
Inventory.PickupMessage "You got the Flak Cannon.";
|
||||
Weapon.UpSound "flak/select";
|
||||
Weapon.SlotNumber 8;
|
||||
Weapon.AmmoType "FlakAmmo";
|
||||
Weapon.AmmoUse 1;
|
||||
|
|
@ -500,8 +498,7 @@ Class FlakCannon : UTWeapon
|
|||
FPCK B -1;
|
||||
Stop;
|
||||
Ready:
|
||||
FLKS A 1 A_Selecting();
|
||||
FLKS BCDEFGHIJKLMNOPQRSTUVWXYZ 1;
|
||||
FLKS ABCDEFGHIJKLMNOPQRSTUVWXYZ 1;
|
||||
FKS2 ABC 1;
|
||||
FLKL A 1 A_Loading(true);
|
||||
FLKL BCDEFGHIJKLMNO 1;
|
||||
|
|
@ -534,5 +531,12 @@ Class FlakCannon : UTWeapon
|
|||
FLKD ABCDEFGHIJ 2;
|
||||
FLKD J 1 A_Lower(int.max);
|
||||
Wait;
|
||||
MuzzleFlash:
|
||||
FMUZ A 3 Bright
|
||||
{
|
||||
let l = Spawn("FlakLight",pos);
|
||||
l.target = self;
|
||||
}
|
||||
Stop;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue