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:
Marisa the Magician 2018-05-17 02:17:10 +02:00
commit 73e8e8ada9
96 changed files with 1437 additions and 133 deletions

View file

@ -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;
}
}