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:
Marisa the Magician 2019-04-07 21:37:24 +02:00
commit cbb498378e
14 changed files with 74 additions and 44 deletions

View file

@ -39,3 +39,5 @@ server bool flak_radboots = true; // jump boots protect against damaging floor
server bool flak_blood = true; // [WIP] use doom tournament blood (disable if using another gore mod)
server bool flak_gibs = false; // [WIP/UNSTABLE] use doom tournament gibbing (disable if using another gore mod)
server bool flak_doomtest = false; // made toggleable due to loud complaints
server bool flak_dmsshock = false; // allow enhanced shock rifle on deathmatch (otherwise they are replaced with udamage)
server noarchive bool flak_instagib = false; // instagib mode (only for dm) - this cvar has to be set from the command line

View file

@ -32,6 +32,7 @@ OptionMenu "UTOptionMenu"
StaticText " "
StaticText "Item Options", "Gold"
Option "Jump Boots Act Like Radsuit", "flak_radboots", "YesNo"
Option "Allow Enh. Shock Rifle in DM", "flak_dmsshock", "YesNo"
StaticText " "
StaticText "Translocator (Potentially Game-Breaking)", "Gold"
Option "Prevent Boss Telefrag", "flak_nobosstelefrag", "YesNo"

View file

@ -47,7 +47,7 @@ Model "SuperShockRifleWave"
Path "models"
Model 0 "shockrwm_d.3d"
Skin 0 "sshocktt1.png"
Scale 0.6 0.5 1.5
Scale 0.6 0.5 0.5
PitchOffset 90
FrameIndex SWAV A 0 0

View file

@ -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++ )

View file

@ -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
{

View file

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

View file

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

View file

@ -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();

View file

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

View file

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

View file

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

View file

@ -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,24 +1132,24 @@ 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 ( 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
{
Tag "Enhanced Shock Core";

View file

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

View file

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