- [flak_m] Implement particle meshes.
- Append heal amount to health pickups (excl. superhealth).
- Armor Bonus item.
- Overhaul Stinger explosive charge behaviour, more in line with 0.83 and the novels.
- Fix: Dispersion Pistol should only have infinite ammo in deathmatch.
- Dispersion Pistol altfire always at level 0 if below 10 ammo.
- More Fireblaster tweaks and touches and whatnot. Now fires in 3 bursts of 3 projectiles. And there's more damage and whatnot, it should stop sucking.
- Capped fire effects for huge actors.
- Reduced flames per tic on Flamethrower, to see if this causes less performance issues. May roll back if this was a bad idea.
- Snuck in some longer versions of a couple player sounds.
- [oldsounds] Added higher quality dispersion pistol select sound.
This commit is contained in:
Marisa the Magician 2019-10-02 17:40:09 +02:00
commit 0cb76eb03a
30 changed files with 270 additions and 117 deletions

View file

@ -43,7 +43,7 @@ Class UFireTrail : Actor
Class UFireball : Actor
{
Vector3 Acceleration;
double spreadf;
double spreadf, maxspeed;
int ns, nsp;
property SpreadFactor : spreadf;
@ -66,22 +66,24 @@ Class UFireball : Actor
UFireball.SpreadFactor 0.2;
UFireball.NumSmokes 1;
UFireball.NumSparks 2;
DeathSound "flamegun/exp";
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
maxspeed = 30.;
if ( bAMBUSH ) return;
let l = Spawn("UFireTrail",pos);
l.target = self;
Acceleration = vel.unit()*50;
A_PlaySound("eightball/fly",CHAN_VOICE,1.0,true,3.,pitch:1.5);
A_PlaySound("eightball/fly",CHAN_VOICE,.6,true,3.,pitch:1.5);
}
action void A_Spread()
{
vel += invoker.Acceleration/TICRATE;
vel += (FRandom[EWizFX](-1,1),FRandom[EWizFX](-1,1),FRandom[EWizFX](-1,1))*FRandom[EWizFX](.5,1.)*invoker.spreadf;
Vector3 dir = vel.unit();
if ( vel.length() > 30. ) vel = dir*30.;
if ( vel.length() > invoker.maxspeed ) vel = dir*invoker.maxspeed;
angle = atan2(dir.y,dir.x);
pitch = asin(-dir.z);
if ( waterlevel > 0 )
@ -102,6 +104,7 @@ Class UFireball : Actor
}
for ( int i=0; i<invoker.ns; i++ )
{
if ( Random[FlameGun](0,2) ) continue;
let s = Spawn("UTSmoke",pos);
s.vel = (FRandom[FlameGun](-0.2,0.2),FRandom[FlameGun](-0.2,0.2),FRandom[FlameGun](-0.2,0.2));
s.vel += vel*0.2;
@ -109,7 +112,7 @@ Class UFireball : Actor
}
for ( int i=0; i<invoker.nsp; i++ )
{
if ( Random[FlameGun](0,3) ) continue;
if ( Random[FlameGun](0,6) ) continue;
let s = Spawn("UTSpark",pos);
s.vel = (FRandom[FlameGun](-0.2,0.2),FRandom[FlameGun](-0.2,0.2),FRandom[FlameGun](-0.2,0.2));
s.ClearBounce();
@ -128,10 +131,10 @@ Class UFireball : Actor
}
else
{
A_PlaySound("flamegun/exp",CHAN_VOICE,pitch:1.2);
Spawn("UFireLight",pos);
A_Explode(GetMissileDamage(0,0),60);
UTMainHandler.DoBlast(self,60,9000);
A_PlaySound(DeathSound,CHAN_VOICE,attenuation:1.5,pitch:FRandom[ExploS](0.8,1.2));
}
A_SprayDecal("SmallRocketBlast");
Scale *= FRandom[ExploS](0.6,0.9);
@ -164,10 +167,16 @@ Class UFireball : Actor
s.scale *= FRandom[ExploS](0.9,1.3);
}
}
override void Tick()
{
Super.Tick();
if ( !isFrozen() && InStateSequence(CurState,FindState("Spawn")) )
A_Spread();
}
States
{
Spawn:
FIRB ABCDEFGHIJK 1 Bright A_Spread();
FIRB ABCDEFGHIJK 2 Bright;
Loop;
Death:
TNT1 A 0 A_FireballExplo();
@ -183,10 +192,19 @@ Class UFireball2 : UFireball
Radius 8;
Height 8;
DamageFunction 50;
Speed 5;
Speed 3;
Scale 1.5;
UFireball.SpreadFactor 0.35;
UFireball.NumSmokes 2;
UFireball.NumSparks 4;
UFireball.NumSmokes 6;
UFireball.NumSparks 12;
DeathSound "flamegun/exp2";
}
override void PostBeginPlay()
{
Super.PostBeginPlay();
Acceleration = vel.unit()*150;
maxspeed = 50.;
A_PlaySound("eightball/fly",CHAN_VOICE,1.,true,1.5,pitch:.85);
}
action void A_FireballExplo2()
{
@ -235,9 +253,9 @@ Class UFireball2 : UFireball
if ( ff ) HitNormal = -ff.bottom.Normal;
else HitNormal = BlockingCeiling.ceilingplane.Normal;
}
for ( int i=0; i<12; i++ )
for ( int i=0; i<20; i++ )
{
dir = (HitNormal*1.2+(FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1))).unit();
dir = (HitNormal*1.1+(FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1))).unit();
let s = Spawn("UFireballEmber",level.Vec3Offset(pos,HitNormal*2));
s.vel = dir*s.speed*FRandom[ExploS](0.6,1.8);
s.angle = atan2(dir.y,dir.x);
@ -266,6 +284,7 @@ Class UFireballEmber : UFireball
UFireball.SpreadFactor 0.5;
UFireball.NumSmokes 1;
UFireball.NumSparks 1;
DeathSound "";
}
States
{
@ -316,15 +335,22 @@ Class FlameGun : UnrealWeapon
UTMainHandler.DoSwing(self,(FRandom[FlameGun](-0.3,-0.2),FRandom[FlameGun](-0.2,0.2)),4,-1,3,SWING_Spring,2,2);
}
if ( !Dampener.Active(self) ) A_AlertMonsters();
Vector3 x, y, z;
Vector3 x, y, z, x2, y2, z2, dir;
double a, s;
[x, y, z] = dt_CoordUtil.GetAxes(pitch,angle,roll);
Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+3*y-z);
Actor p = Spawn(bAlt?"UFireball2":"UFireball",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;
[x2, y2, z2] = dt_CoordUtil.GetAxes(BulletSlope(),angle,roll);
for ( int i=0; i<(bAlt?1:3); i++ )
{
a = FRandom[FlameGun](0,360);
s = FRandom[FlameGun](0,bAlt?0.:.15);
dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit();
let p = Spawn(bAlt?"UFireball2":"UFireball",origin);
p.angle = atan2(dir.y,dir.x);
p.pitch = asin(-dir.z);
p.vel = dir*p.speed;
p.target = self;
}
int numpt = Random[FlameGun](10,15);
for ( int i=0; i<numpt; i++ )
{
@ -380,33 +406,36 @@ Class FlameGun : UnrealWeapon
#### # 1 A_Overlay(-9999,"Null");
FGNF A 2
{
invoker.special1 = 0;
A_PlaySound("flamegun/start",CHAN_6,Dampener.Active(self)?.1:1.);
if ( !Dampener.Active(self) ) A_AlertMonsters();
}
Hold:
FGNF B 1 A_FlameGunFire();
FGNF CDEF 1;
FGNF G 0
FGNF CDEFG 1;
FGNF H 0
{
if ( invoker.CheckAmmo(0,false,true) && (waterlevel < 2) )
invoker.special1++;
if ( invoker.CheckAmmo(0,false,true) && (waterlevel < 2) && (invoker.special1 < 3) )
A_Refire("Refire");
}
FGNF G 0 A_ClearRefire();
FGNF GHIJ 2;
FGNF H 0 A_ClearRefire();
FGNF HIJ 2;
FGNT A 0
{
if ( invoker.CheckAmmo(0,false,true) && (waterlevel < 2) )
if ( invoker.CheckAmmo(0,false,true) && (waterlevel < 2) && (invoker.special1 < 3) )
A_Refire("Fire");
}
FGNT A 0
{
invoker.special1 = 0;
A_PlaySound("flamegun/end",CHAN_6,Dampener.Active(self)?.1:1.);
A_ClearRefire();
}
FGNT ABCDEFGHIJKLM 2;
Goto Idle;
Refire:
FGNF G 2 A_PlaySound("flamegun/start",CHAN_6,Dampener.Active(self)?.1:1.);
FGNF H 2 A_PlaySound("flamegun/start",CHAN_6,Dampener.Active(self)?.1:1.);
Goto Hold;
AltFire:
#### # 1 A_Overlay(-9999,"Null");