From cbb498378e9c3c31f59ef6fb1e80c38746b8f8b1 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sun, 7 Apr 2019 21:37:24 +0200 Subject: [PATCH] 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. --- cvarinfo.txt | 2 ++ menudef.txt | 1 + modeldef.shock | 2 +- zscript/biorifle.zsc | 2 +- zscript/chainsaw.zsc | 7 ++++--- zscript/eightball.zsc | 4 ++-- zscript/enforcer.zsc | 2 +- zscript/flakcannon.zsc | 4 ++-- zscript/impacthammer.zsc | 8 ++++---- zscript/pulsegun.zsc | 10 +++++----- zscript/ripper.zsc | 4 ++-- zscript/shockrifle.zsc | 41 +++++++++++++++++++++------------------- zscript/sniperrifle.zsc | 4 ++-- zscript/utcommon.zsc | 27 ++++++++++++++++++++++++-- 14 files changed, 74 insertions(+), 44 deletions(-) diff --git a/cvarinfo.txt b/cvarinfo.txt index e769b3d..a7d3331 100644 --- a/cvarinfo.txt +++ b/cvarinfo.txt @@ -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 \ No newline at end of file diff --git a/menudef.txt b/menudef.txt index 9bec560..f2cff1d 100644 --- a/menudef.txt +++ b/menudef.txt @@ -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" diff --git a/modeldef.shock b/modeldef.shock index 56c84fd..9c0f3d4 100644 --- a/modeldef.shock +++ b/modeldef.shock @@ -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 diff --git a/zscript/biorifle.zsc b/zscript/biorifle.zsc index a8e6e6b..93acc48 100644 --- a/zscript/biorifle.zsc +++ b/zscript/biorifle.zsc @@ -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= (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 { diff --git a/zscript/eightball.zsc b/zscript/eightball.zsc index b2d4782..4407860 100644 --- a/zscript/eightball.zsc +++ b/zscript/eightball.zsc @@ -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; } } diff --git a/zscript/enforcer.zsc b/zscript/enforcer.zsc index b825b25..78b4143 100644 --- a/zscript/enforcer.zsc +++ b/zscript/enforcer.zsc @@ -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; diff --git a/zscript/flakcannon.zsc b/zscript/flakcannon.zsc index b17292d..d7a4ed7 100644 --- a/zscript/flakcannon.zsc +++ b/zscript/flakcannon.zsc @@ -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(); diff --git a/zscript/impacthammer.zsc b/zscript/impacthammer.zsc index 81461dd..4703d5d 100644 --- a/zscript/impacthammer.zsc +++ b/zscript/impacthammer.zsc @@ -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); diff --git a/zscript/pulsegun.zsc b/zscript/pulsegun.zsc index 1af81a2..f84d0c1 100644 --- a/zscript/pulsegun.zsc +++ b/zscript/pulsegun.zsc @@ -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; } diff --git a/zscript/ripper.zsc b/zscript/ripper.zsc index 1ff11a5..be1ad70 100644 --- a/zscript/ripper.zsc +++ b/zscript/ripper.zsc @@ -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)); diff --git a/zscript/shockrifle.zsc b/zscript/shockrifle.zsc index e931e46..221735d 100644 --- a/zscript/shockrifle.zsc +++ b/zscript/shockrifle.zsc @@ -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 { diff --git a/zscript/sniperrifle.zsc b/zscript/sniperrifle.zsc index 77c1e5c..774adc2 100644 --- a/zscript/sniperrifle.zsc +++ b/zscript/sniperrifle.zsc @@ -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 diff --git a/zscript/utcommon.zsc b/zscript/utcommon.zsc index c5432ac..da276b9 100644 --- a/zscript/utcommon.zsc +++ b/zscript/utcommon.zsc @@ -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); }