Beta 5.
- [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:
parent
c44512e312
commit
0cb76eb03a
30 changed files with 270 additions and 117 deletions
|
|
@ -173,9 +173,14 @@ Class TarydiumExplosion : Actor
|
|||
override void PostBeginPlay()
|
||||
{
|
||||
Super.PostBeginPlay();
|
||||
A_Explode(special1,int(90*scale.x));
|
||||
UTMainHandler.DoBlast(self,90*scale.x,90000);
|
||||
A_PlaySound("flare/explode");
|
||||
A_Explode(max(10,special1),90+special1);
|
||||
UTMainHandler.DoBlast(self,90+special1,900*special1);
|
||||
UTMainHandler.DoBlast(self,200+special1,200*special1); // hurtless secondary blast, so stuff that's pretty close by gets pushed away
|
||||
// (just going off the novels here, it's supposed to be pretty strong)
|
||||
A_QuakeEx(clamp(special1/6,2,9),clamp(special1/6,2,9),clamp(special1/6,2,9),10,0,300+special1*2,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200+special1*2,rollIntensity:0.12);
|
||||
SetOrigin(Vec3Offset(0,0,16),false);
|
||||
A_PlaySound("stinger/explode",CHAN_VOICE,pitch:FRandom[Stinger](0.8,1.5));
|
||||
A_PlaySound("stinger/explode",CHAN_ITEM,pitch:FRandom[Stinger](0.8,1.5));
|
||||
let l = Spawn("TarydiumExLight",pos);
|
||||
l.args[3] = int(60*scale.x);
|
||||
scale.x *= RandomPick[Stinger](-1,1);
|
||||
|
|
@ -236,10 +241,10 @@ Class TDebuffLight : PointLightAttenuated
|
|||
Destroy();
|
||||
return;
|
||||
}
|
||||
Args[0] = min(dbf.Amount,64);
|
||||
Args[1] = min(dbf.Amount*3,192);
|
||||
Args[2] = min(dbf.Amount*4,255);
|
||||
Args[3] = int(max(dbf.victim.radius,dbf.victim.height))+60+min(dbf.amount/4,40);
|
||||
Args[0] = int(min(dbf.Amount,64));
|
||||
Args[1] = int(min(dbf.Amount*3,192));
|
||||
Args[2] = int(min(dbf.Amount*4,255));
|
||||
Args[3] = int(max(dbf.victim.radius,dbf.victim.height)+60+min(dbf.amount/4,40));
|
||||
SetOrigin(dbf.Victim.Vec3Offset(0,0,dbf.Victim.Height/2),true);
|
||||
}
|
||||
}
|
||||
|
|
@ -247,76 +252,78 @@ Class TDebuffLight : PointLightAttenuated
|
|||
Class TarydiumDebuff : Thinker
|
||||
{
|
||||
Actor victim, instigator, lite;
|
||||
int amount; // accumulated damage for the explosion
|
||||
double amount; // accumulated damage for the explosion
|
||||
Vector3 oldvel;
|
||||
bool wasonair, reentrant;
|
||||
bool wasonair, exploding;
|
||||
int explodetimer;
|
||||
|
||||
void UpdateEffect()
|
||||
{
|
||||
if ( !victim )
|
||||
{
|
||||
BlowUp();
|
||||
return;
|
||||
}
|
||||
if ( !victim ) return;
|
||||
if ( !lite )
|
||||
{
|
||||
lite = Actor.Spawn("TDebuffLight",victim.pos);
|
||||
TDebuffLight(lite).dbf = self;
|
||||
lite.Args[0] = min(Amount,64);
|
||||
lite.Args[1] = min(Amount*3,192);
|
||||
lite.Args[2] = min(Amount*4,255);
|
||||
lite.Args[3] = int(max(victim.radius,victim.height))+60+min(amount/4,40);
|
||||
}
|
||||
if ( Random[Stinger](0,amount) > 100 )
|
||||
{
|
||||
amount += 30;
|
||||
BlowUp();
|
||||
lite.Args[0] = int(min(Amount,64));
|
||||
lite.Args[1] = int(min(Amount*3,192));
|
||||
lite.Args[2] = int(min(Amount*4,255));
|
||||
lite.Args[3] = int(max(victim.radius,victim.height)+60+min(amount/4,40));
|
||||
}
|
||||
}
|
||||
|
||||
void BlowUp()
|
||||
{
|
||||
reentrant = true;
|
||||
let b = victim.Spawn("TarydiumExplosion",victim.Vec3Offset(0,0,victim.default.height/2));
|
||||
let b = victim.Spawn("TarydiumExplosion",victim.Vec3Offset(FRandom[Stinger](-victim.radius,victim.radius),FRandom[Stinger](-victim.radius,victim.radius),FRandom[Stinger](0,victim.height)));
|
||||
b.target = instigator;
|
||||
b.special1 = amount;
|
||||
b.scale *= 1.+min(1.5,amount*0.02);
|
||||
Destroy();
|
||||
b.special1 = int(amount); // in Unreal this was capped to 10, which would make it deal barely any damage
|
||||
b.scale *= .8+min(1.,amount*0.01);
|
||||
amount = amount*0.9-10; // in Unreal this falls off linearly 10 points at a time, which can take very long at full charge
|
||||
}
|
||||
|
||||
override void OnDestroy()
|
||||
{
|
||||
if ( lite ) lite.Destroy();
|
||||
Super.OnDestroy();
|
||||
}
|
||||
|
||||
override void Tick()
|
||||
{
|
||||
if ( !sting_stinger )
|
||||
if ( !sting_stinger || !victim || (amount <= .4) )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
if ( !victim || (victim.Health <= 0) )
|
||||
if ( exploding )
|
||||
{
|
||||
explodetimer--;
|
||||
if ( explodetimer > 0 ) return;
|
||||
explodetimer = Random[Stinger](3,6);
|
||||
BlowUp();
|
||||
return;
|
||||
}
|
||||
if ( victim.Health <= 0 )
|
||||
{
|
||||
exploding = true;
|
||||
return;
|
||||
}
|
||||
if ( victim.pos.z > victim.floorz ) wasonair = true;
|
||||
else
|
||||
{
|
||||
if ( wasonair && (oldvel.z < -20) )
|
||||
{
|
||||
Amount += min(int(-oldvel.z),100);
|
||||
BlowUp();
|
||||
exploding = true;
|
||||
return;
|
||||
}
|
||||
wasonair = false;
|
||||
}
|
||||
oldvel = victim.vel;
|
||||
if ( !(level.maptime%20) )
|
||||
amount *= 1.-.04/TICRATE;
|
||||
UpdateEffect();
|
||||
if ( amount <= .4 )
|
||||
{
|
||||
amount--;
|
||||
UpdateEffect();
|
||||
if ( amount <= 0 )
|
||||
{
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
Destroy();
|
||||
return;
|
||||
}
|
||||
if ( level.maptime%3 ) return;
|
||||
int numpt = clamp(int(Random[Stinger](1,3)*amount*0.02),1,8);
|
||||
|
|
@ -340,7 +347,7 @@ Class TarydiumDebuff : Thinker
|
|||
}
|
||||
}
|
||||
|
||||
static void Apply( Actor victim, Actor instigator, int amount )
|
||||
static void Apply( Actor victim, Actor instigator, double amount )
|
||||
{
|
||||
if ( !victim || (victim.Health <= 0) || !victim.bISMONSTER ) return;
|
||||
if ( !sting_stinger ) return;
|
||||
|
|
@ -446,7 +453,11 @@ Class StingerProjectile : Actor
|
|||
target.SpawnBlood(pos,AngleTo(target),damage);
|
||||
A_PlaySound("stinger/flesh");
|
||||
A_AlertMonsters();
|
||||
if ( sting_stinger ) TarydiumDebuff.Apply(target,self.target,damage/4);
|
||||
if ( sting_stinger )
|
||||
{
|
||||
TarydiumDebuff.Apply(target,self.target,10);
|
||||
damage = 2;
|
||||
}
|
||||
}
|
||||
return damage;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue