Removal of all RNG damage (excluding minigun).
Enhanced Shock Rifle is now actually instakill as it's meant to be. Enhanced Shock Rifle is disabled by default for deathmatch (toggleable). Implemented Instagib Deathmatch through flak_instagib cvar. Fixed a small typo in the modeldef entry of the enhanced shock ball shockwave.
This commit is contained in:
parent
d69eaa682f
commit
cbb498378e
14 changed files with 74 additions and 44 deletions
|
|
@ -497,7 +497,7 @@ Class BioGel : Actor
|
|||
invoker.deadtimer = -2;
|
||||
if ( invoker.atline ) invoker.atline.RemoteActivate(target,invoker.atside,SPAC_Impact,pos);
|
||||
UTMainHandler.DoBlast(self,Min(175,int(Scale.x*50)),20000*Scale.x);
|
||||
A_Explode(int(Random[GES](18,26)*Scale.x),Min(175,int(Scale.x*50)));
|
||||
A_Explode(int(20*Scale.x),Min(175,int(Scale.x*50)));
|
||||
A_PlaySound("ges/explode",CHAN_VOICE);
|
||||
int numpt = Min(300,int(Scale.x*30))+Random[GES](-10,10);
|
||||
for ( int i=0; i<numpt; i++ )
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ Class UTChainsaw : UTWeapon
|
|||
LineTrace(angle,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = Random[Chainsaw](20,30);
|
||||
int dmg = 20;
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||
d.HitActor.vel -= x*(500/d.HitActor.mass);
|
||||
vel += x*(100/mass);
|
||||
|
|
@ -98,9 +98,9 @@ Class UTChainsaw : UTWeapon
|
|||
LineTrace(ang,90,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = Random[Chainsaw](20,30);
|
||||
int dmg = 20;
|
||||
if ( d.HitLocation.z >= (d.HitActor.pos.z+d.HitActor.height*0.8) )
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg*2,'Decapitated',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg*3,'Decapitated',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||
else dmg = d.HitActor.DamageMobj(invoker,self,dmg,'slashed',DMG_USEANGLE,atan2(d.HitDir.y,d.HitDir.x));
|
||||
d.HitActor.vel = -y*(1200/d.HitActor.mass);
|
||||
vel += x*(100/mass);
|
||||
|
|
@ -164,6 +164,7 @@ Class UTChainsaw : UTWeapon
|
|||
Weapon.SelectionOrder 9;
|
||||
+WEAPON.MELEEWEAPON;
|
||||
+FORCEPAIN;
|
||||
+NOEXTREMEDEATH;
|
||||
}
|
||||
States
|
||||
{
|
||||
|
|
|
|||
|
|
@ -206,7 +206,7 @@ Class UTRocket : Actor
|
|||
}
|
||||
Wait;
|
||||
Death:
|
||||
TNT1 A 0 A_RocketExplode(Random[Eightball](90,120),160);
|
||||
TNT1 A 0 A_RocketExplode(100,160);
|
||||
SSMX ABCDEFGHIJ 2 Bright;
|
||||
Stop;
|
||||
}
|
||||
|
|
@ -278,7 +278,7 @@ Class UTGrenade : UTRocket
|
|||
}
|
||||
Goto Spawn;
|
||||
Death:
|
||||
TNT1 A 0 A_RocketExplode(Random[Eightball](100,150),140);
|
||||
TNT1 A 0 A_RocketExplode(120,140);
|
||||
Goto Super::Death+1;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -335,7 +335,7 @@ Class Enforcer : UTWeapon
|
|||
LineTrace(atan2(dir.y,dir.x),10000,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = Random[Enforcer](12,17);
|
||||
int dmg = 17;
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
|
||||
double mm = 3000;
|
||||
if ( FRandom[Enforcer](0,1) < 0.2 ) mm *= 5;
|
||||
|
|
|
|||
|
|
@ -165,7 +165,7 @@ Class FlakChunk : Actor
|
|||
Radius 2;
|
||||
Height 2;
|
||||
Speed 32;
|
||||
DamageFunction Random[Flak](15,20);
|
||||
DamageFunction 16;
|
||||
DamageType 'Shredded';
|
||||
BounceType "Hexen";
|
||||
BounceFactor 1.0;
|
||||
|
|
@ -452,7 +452,7 @@ Class FlakSlug : Actor
|
|||
A_NoGravity();
|
||||
A_SetScale(1.2);
|
||||
UTMainHandler.DoBlast(self,120,75000);
|
||||
A_Explode(Random[Flak](70,80),120);
|
||||
A_Explode(70,120);
|
||||
A_QuakeEx(4,4,4,8,0,170,"",QF_RELATIVE|QF_SCALEDOWN,falloff:120,rollIntensity:0.2);
|
||||
A_PlaySound("flak/explode",CHAN_VOICE);
|
||||
A_AlertMonsters();
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ Class ImpactHammer : UTWeapon
|
|||
LineTrace(angle,60,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = int(Random[Impact](90,120)*realcharge);
|
||||
int dmg = int(60*realcharge);
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||
d.HitActor.vel = x*(8000/d.HitActor.mass)*realcharge;
|
||||
if ( d.HitActor.bNOBLOOD )
|
||||
|
|
@ -95,7 +95,7 @@ Class ImpactHammer : UTWeapon
|
|||
else if ( d.HitType != TRACE_HitNone )
|
||||
{
|
||||
realcharge = max(1.0,realcharge);
|
||||
int dmg = int(Random[Impact](16,24)*realcharge); // It's a flat damage of 36 on UT, but I think it's more fair for it to scale
|
||||
int dmg = int(24*realcharge); // It's a flat damage on UT, but I think it's more fair for it to scale
|
||||
dmg = DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||
TraceBleed(dmg,invoker);
|
||||
vel -= x*(1200/mass)*realcharge;
|
||||
|
|
@ -140,13 +140,13 @@ Class ImpactHammer : UTWeapon
|
|||
double dscale = d.Distance/120.;
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = int(Random[Impact](25,35)*dscale);
|
||||
int dmg = int(20*dscale);
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||
d.HitActor.vel = x*(4000/d.HitActor.mass)*dscale;
|
||||
}
|
||||
else if ( d.HitType != TRACE_HitNone )
|
||||
{
|
||||
int dmg = int(Random[Impact](16,24)*dscale);
|
||||
int dmg = int(24*dscale);
|
||||
dmg = DamageMobj(invoker,self,dmg,'impact',DMG_THRUSTLESS);
|
||||
vel -= x*(600/mass)*dscale;
|
||||
if ( d.HitType == TRACE_HitWall ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation-d.HitDir*4);
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ Class PulseBall : Actor
|
|||
Obituary "%o ate %k's burning plasma death.";
|
||||
DamageType 'Pulsed';
|
||||
RenderStyle "Add";
|
||||
DamageFunction Random[Pulse](20,30);
|
||||
DamageFunction 20;
|
||||
PROJECTILE;
|
||||
+EXPLODEONWATER;
|
||||
+SKYEXPLODE;
|
||||
|
|
@ -373,12 +373,12 @@ Class PulseBolt : Actor
|
|||
if ( !damagedactor )
|
||||
{
|
||||
accdamage = min(0.5*(level.time-lasthit),0.1);
|
||||
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](80,100)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
t.Results.HitActor.DamageMobj(self,target,int(72*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
accdamage = 0;
|
||||
}
|
||||
else if ( t.Results.HitActor != damagedactor )
|
||||
{
|
||||
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](80,100)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
t.Results.HitActor.DamageMobj(self,target,int(72*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
accdamage = 0;
|
||||
}
|
||||
lasthit = level.time;
|
||||
|
|
@ -386,7 +386,7 @@ Class PulseBolt : Actor
|
|||
accdamage += 1./TICRATE;
|
||||
if ( accdamage > 0.17 )
|
||||
{
|
||||
t.Results.HitActor.DamageMobj(self,target,int(Random[Pulse](80,100)*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
t.Results.HitActor.DamageMobj(self,target,int(72*accdamage),'zapped',DMG_USEANGLE,atan2(x.y,x.x));
|
||||
accdamage = 0;
|
||||
}
|
||||
}
|
||||
|
|
@ -428,7 +428,7 @@ Class PulseBolt : Actor
|
|||
}
|
||||
else if ( damagedactor )
|
||||
{
|
||||
damagedactor.DamageMobj(self,target,int(Random[Pulse](65,75)*accdamage),'zapped');
|
||||
damagedactor.DamageMobj(self,target,int(72*accdamage),'zapped');
|
||||
accdamage = 0;
|
||||
damagedactor = null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ Class Razor2 : Actor
|
|||
Radius 2;
|
||||
Height 2;
|
||||
Speed 25;
|
||||
DamageFunction (Random[Ripper](20,25)*((DamageType=='Decapitated')?3:1.0));
|
||||
DamageFunction (int(30*((DamageType=='Decapitated')?3.5:1.0)));
|
||||
DamageType 'Shredded';
|
||||
Obituary "%k ripped a chunk of meat out of %o with the Ripper.";
|
||||
BounceType "Hexen";
|
||||
|
|
@ -200,7 +200,7 @@ Class Razor2Alt : Razor2
|
|||
A_AlertMonsters();
|
||||
A_SprayDecal("RazorBlast",20);
|
||||
UTMainHandler.DoBlast(self,90,87000);
|
||||
A_Explode(Random[Ripper](30,50),90,damagetype:'RipperAltDeath');
|
||||
A_Explode(34,90,damagetype:'RipperAltDeath');
|
||||
A_QuakeEx(3,3,3,10,0,140,"",QF_RELATIVE|QF_SCALEDOWN,falloff:90,rollIntensity:0.1);
|
||||
int numpt = Random[Ripper](10,20);
|
||||
Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch));
|
||||
|
|
|
|||
|
|
@ -342,7 +342,7 @@ Class ShockBeam : Actor
|
|||
let b = t.Results.HitActor.target;
|
||||
UTMainHandler.DoBlast(b,250,70000);
|
||||
b.ExplodeMissile(null,self);
|
||||
b.A_Explode(Random[ASMD](150,180),250);
|
||||
b.A_Explode(165,250);
|
||||
b.A_QuakeEx(6,6,6,60,0,1200,"",QF_RELATIVE|QF_SCALEDOWN,falloff:250,rollIntensity:0.2);
|
||||
b.A_SprayDecal("BigShockMark1",100);
|
||||
b.A_SprayDecal("BigShockMark2",100);
|
||||
|
|
@ -362,7 +362,7 @@ Class ShockBeam : Actor
|
|||
}
|
||||
else
|
||||
{
|
||||
t.Results.HitActor.DamageMobj(self,target,Random[ASMD](35,50),'jolted',DMG_USEANGLE,atan2(t.Results.HitVector.y,t.Results.HitVector.x));
|
||||
t.Results.HitActor.DamageMobj(self,target,40,'jolted',DMG_USEANGLE,atan2(t.Results.HitVector.y,t.Results.HitVector.x));
|
||||
UTMainHandler.DoKnockback(t.Results.HitActor,t.Results.HitVector,60000);
|
||||
let r = Spawn("ShockBeamRing",pos);
|
||||
r.angle = atan2(t.Results.HitVector.y,t.Results.HitVector.x);
|
||||
|
|
@ -569,7 +569,7 @@ Class SuperShockBeam : Actor
|
|||
let b = t.Results.HitActor.target;
|
||||
UTMainHandler.DoBlast(b,400,70000);
|
||||
b.ExplodeMissile(null,self);
|
||||
b.A_Explode(Random[ASMD](15000,16000),400);
|
||||
b.A_Explode(int.max,400);
|
||||
b.A_QuakeEx(9,9,9,60,0,2400,"",QF_RELATIVE|QF_SCALEDOWN,falloff:400,rollIntensity:0.4);
|
||||
b.A_SprayDecal("BigShockMark1",100);
|
||||
b.A_SprayDecal("SBigShockMark2",100);
|
||||
|
|
@ -593,7 +593,10 @@ Class SuperShockBeam : Actor
|
|||
// the actor may "cease to exist" if it dies after the call to ExplodeMissile, so guard against that
|
||||
if ( t.Results.HitActor )
|
||||
{
|
||||
t.Results.HitActor.DamageMobj(self,target,Random[ASMD](3500,5000),'joltedX',DMG_USEANGLE|DMG_THRUSTLESS,atan2(t.Results.HitVector.y,t.Results.HitVector.x));
|
||||
// damage was 1000 in UT but it's meant to be instakill and players couldn't reach that health legitimately anyway, so rather than
|
||||
// some absurd number they settled for that
|
||||
// we ain't goin' that way here
|
||||
t.Results.HitActor.DamageMobj(self,target,int.max,'joltedX',DMG_USEANGLE|DMG_THRUSTLESS,atan2(t.Results.HitVector.y,t.Results.HitVector.x));
|
||||
UTMainHandler.DoKnockback(t.Results.HitActor,t.Results.HitVector,60000);
|
||||
}
|
||||
let r = Spawn("SuperShockBeamRing",pos);
|
||||
|
|
@ -632,7 +635,7 @@ Class SuperShockBeam : Actor
|
|||
if ( !flak_classicsshock )
|
||||
{
|
||||
UTMainHandler.DoBlast(self,50,60000);
|
||||
A_Explode(Random[ASMD](500,800),50);
|
||||
A_Explode(int.max,50);
|
||||
}
|
||||
A_QuakeEx(6,6,6,5,0,100,"",QF_RELATIVE|QF_SCALEDOWN,falloff:50,rollIntensity:0.2);
|
||||
A_PlaySound("shock/hit",CHAN_VOICE,attenuation:0.5);
|
||||
|
|
@ -841,7 +844,7 @@ Class ShockBall : Actor
|
|||
action void A_BallExplode()
|
||||
{
|
||||
UTMainHandler.DoBlast(self,70,70000);
|
||||
A_Explode(Random[ASMD](50,60),70);
|
||||
A_Explode(55,70);
|
||||
A_SprayDecal("ShockMarkBig",16);
|
||||
Spawn("ShockExplLight",pos);
|
||||
A_SetScale(1.0);
|
||||
|
|
@ -905,7 +908,7 @@ Class SuperShockBall : Actor
|
|||
action void A_BallExplode()
|
||||
{
|
||||
UTMainHandler.DoBlast(self,120,70000);
|
||||
A_Explode(Random[ASMD](4000,5000),120);
|
||||
A_Explode(int.max,120);
|
||||
A_SprayDecal("ShockMarkBig",16);
|
||||
Spawn("SuperShockExplLight",pos);
|
||||
A_SetScale(1.5);
|
||||
|
|
@ -1129,23 +1132,23 @@ Class EnhancedShockAmmo : Ammo
|
|||
{
|
||||
int ticcnt;
|
||||
|
||||
override void BeginPlay()
|
||||
{
|
||||
Super.BeginPlay();
|
||||
if ( deathmatch )
|
||||
{
|
||||
MaxAmount /= 2;
|
||||
BackpackMaxAmount /= 2;
|
||||
}
|
||||
}
|
||||
override void Tick()
|
||||
{
|
||||
Super.Tick();
|
||||
if ( !Owner ) return;
|
||||
ticcnt++;
|
||||
if ( ticcnt < 105 ) return;
|
||||
ticcnt = 0;
|
||||
if ( Amount > 0 ) Amount--;
|
||||
if ( deathmatch && flak_instagib )
|
||||
{
|
||||
if ( ticcnt < 35 ) return;
|
||||
ticcnt = 0;
|
||||
if ( Amount < MaxAmount ) Amount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( ticcnt < 105 ) return;
|
||||
ticcnt = 0;
|
||||
if ( Amount > 0 ) Amount--;
|
||||
}
|
||||
}
|
||||
Default
|
||||
{
|
||||
|
|
|
|||
|
|
@ -102,10 +102,10 @@ Class SniperRifle : UTWeapon
|
|||
LineTrace(angle,10000,BulletSlope(),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d);
|
||||
if ( d.HitType == TRACE_HitActor )
|
||||
{
|
||||
int dmg = Random[Sniper](45,60);
|
||||
int dmg = 45;
|
||||
if ( d.HitLocation.z >= (d.HitActor.pos.z+d.HitActor.height*0.81) )
|
||||
{
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,dmg+70,'Decapitated',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
|
||||
dmg = d.HitActor.DamageMobj(invoker,self,100,'Decapitated',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x));
|
||||
UTMainHandler.DoKnockback(d.HitActor,d.HitDir,35000);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -1549,7 +1549,7 @@ Class UTMainHandler : EventHandler
|
|||
else if ( e.Replacee == 'BFG9000' ) e.Replacement = 'WarheadLauncher';
|
||||
else if ( e.Replacee == 'Mace' )
|
||||
{
|
||||
if ( !Random[Replacements](0,6) ) e.Replacement = 'EnhancedShockRifle';
|
||||
if ( (!deathmatch || flak_dmsshock) && !Random[Replacements](0,6) ) e.Replacement = 'EnhancedShockRifle';
|
||||
else e.Replacement = 'WarheadLauncher';
|
||||
}
|
||||
else if ( (e.Replacee == 'Clip') || (e.Replacee == 'GoldWandAmmo') || (e.Replacee == 'GoldWandHefty') ) e.Replacement = 'EClip';
|
||||
|
|
@ -1605,7 +1605,7 @@ Class UTMainHandler : EventHandler
|
|||
else if ( Random[Replacements](0,1) ) e.Replacement = 'MiniAmmo';
|
||||
else e.Replacement = 'RifleAmmo';
|
||||
}
|
||||
else if ( e.Replacee == 'InvulnerabilitySphere' ) e.Replacement = 'EnhancedShockRifle';
|
||||
else if ( e.Replacee == 'InvulnerabilitySphere' ) e.Replacement = (!deathmatch||flak_dmsshock)?'EnhancedShockRifle':'UDamage';
|
||||
else if ( (e.Replacee == 'Berserk') || (e.Replacee == 'ArtiTomeOfPower') || (e.Replacee == 'ArtiEgg') ) e.Replacement = 'UDamage';
|
||||
else if ( (e.Replacee == 'Soulsphere') || (e.Replacee == 'ArtiSuperHealth') ) e.Replacement = 'UTHealthPack';
|
||||
else if ( (e.Replacee == 'Megasphere') || (e.Replacee == 'ArtiInvulnerability') ) e.Replacement = 'UTShieldBelt';
|
||||
|
|
@ -1877,15 +1877,38 @@ Class UTMainHandler : EventHandler
|
|||
override void WorldThingSpawned( WorldEvent e )
|
||||
{
|
||||
if ( flak_nobosstelefrag && e.Thing.bBOSS ) e.Thing.bNOTELEFRAG = true;
|
||||
if ( deathmatch && flak_instagib )
|
||||
{
|
||||
if ( (e.Thing is 'EnhancedShockRifle') || (e.Thing is 'EnhancedShockAmmo') ) return;
|
||||
if ( e.Thing is 'Inventory' ) e.Thing.Destroy();
|
||||
}
|
||||
}
|
||||
|
||||
override void PlayerEntered( PlayerEvent e )
|
||||
{
|
||||
if ( deathmatch && flak_instagib )
|
||||
{
|
||||
players[e.playernumber].mo.GiveInventory("EnhancedShockRifle",1);
|
||||
if ( players[e.playernumber].bot )
|
||||
{
|
||||
// fix bots not having the weapon raised when changing map
|
||||
let ess = Weapon(players[e.playernumber].mo.FindInventory("EnhancedShockRifle"));
|
||||
players[e.playernumber].ReadyWeapon = ess;
|
||||
players[e.playernumber].PendingWeapon = WP_NOCHANGE;
|
||||
players[e.playernumber].mo.BringUpWeapon();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if ( flak_translocator )
|
||||
players[e.playernumber].mo.GiveInventory("Translocator",1);
|
||||
}
|
||||
override void PlayerRespawned( PlayerEvent e )
|
||||
{
|
||||
if ( deathmatch && flak_instagib )
|
||||
{
|
||||
players[e.playernumber].mo.GiveInventory("EnhancedShockRifle",1);
|
||||
return;
|
||||
}
|
||||
if ( flak_translocator )
|
||||
players[e.playernumber].mo.GiveInventory("Translocator",1);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue