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