diff --git a/README.md b/README.md index 293c6d73c..5dcc48667 100644 --- a/README.md +++ b/README.md @@ -332,7 +332,7 @@ Can eat up a total of 250 damage points before breaking. ### Grilled Cheese Sandwich ~ Replaces Megasphere, Morph Ovum, Platinum Helm ![](docimg/sandwich.png) -The ultimate meal. Grants a full 1000 health and magically gives you a full stack of **Armor Nuggets**, a **Blast Suit** and a **War Armor**. In addition it prevents you from dying at all when it activates automatically (this wondrous artifact can even save you from the destruction of the **Ynykron Artifact**). Keep in mind that this overhealing above 500 points fades away much quicker than the **Refresher**'s. +The ultimate meal. Grants a full 1000 health and magically gives you a full stack of **Armor Nuggets**, a **Blast Suit** and a **War Armor**. In addition it prevents you from dying at all when it activates automatically (this wondrous artifact can even save you from the destruction of the **Ynykron Artifact**). Keep in mind that this overhealing above 500 points fades away much quicker than the **Refresher**'s, and you can't use another sandwich again until the overheal fades. ### Ghost Artifact ~ Replaces Blur Sphere, Shadowsphere, Amulet of Warding ![](docimg/ghost.png) diff --git a/language.version b/language.version index 3dfc404d8..1f540048b 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r692 \cu(Sat 19 Dec 18:55:07 CET 2020)"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r693 \cu(Mon 21 Dec 01:18:16 CET 2020)"; diff --git a/sndinfo.txt b/sndinfo.txt index 96e9e4110..5701ab97d 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -526,21 +526,25 @@ spreadgun/deselect sounds/spreadgun/spread_deselect.ogg spreadgun/redfire1 sounds/spreadgun/spread_redfire1.ogg spreadgun/redfire2 sounds/spreadgun/spread_redfire2.ogg $random spreadgun/redfire { spreadgun/redfire1 spreadgun/redfire2 } +$limit spreadgun/redfire 16 spreadgun/greenfire1 sounds/spreadgun/spread_greenfire1.ogg spreadgun/greenfire2 sounds/spreadgun/spread_greenfire2.ogg $random spreadgun/greenfire { spreadgun/greenfire1 spreadgun/greenfire2 } +$limit spreadgun/greenfire 16 spreadgun/whitefire1 sounds/spreadgun/spread_whitefire1.ogg spreadgun/whitefire2 sounds/spreadgun/spread_whitefire2.ogg $random spreadgun/whitefire { spreadgun/whitefire1 spreadgun/whitefire2 } spreadgun/bluefire1 sounds/spreadgun/spread_bluefire1.ogg spreadgun/bluefire2 sounds/spreadgun/spread_bluefire2.ogg $random spreadgun/bluefire { spreadgun/bluefire1 spreadgun/bluefire2 } +$limit spreadgun/bluefire 16 spreadgun/blackfire1 sounds/spreadgun/spread_blackfire1.ogg spreadgun/blackfire2 sounds/spreadgun/spread_blackfire2.ogg $random spreadgun/blackfire { spreadgun/blackfire1 spreadgun/blackfire2 } spreadgun/purplefire1 sounds/spreadgun/spread_purplefire1.ogg spreadgun/purplefire2 sounds/spreadgun/spread_purplefire2.ogg $random spreadgun/purplefire { spreadgun/purplefire1 spreadgun/purplefire2 } +$limit spreadgun/purplefire 16 spreadgun/goldfire1 sounds/spreadgun/spread_goldfire1.ogg spreadgun/goldfire2 sounds/spreadgun/spread_goldfire2.ogg $random spreadgun/goldfire { spreadgun/goldfire1 spreadgun/goldfire2 } diff --git a/sprites/HEXPA0.png b/sprites/HEXPA0.png index ac12d32e7..bc2cb148f 100644 Binary files a/sprites/HEXPA0.png and b/sprites/HEXPA0.png differ diff --git a/sprites/HEXPB0.png b/sprites/HEXPB0.png index d0fc67b21..2fcf2037a 100644 Binary files a/sprites/HEXPB0.png and b/sprites/HEXPB0.png differ diff --git a/sprites/HEXPC0.png b/sprites/HEXPC0.png index 303d1672d..306787892 100644 Binary files a/sprites/HEXPC0.png and b/sprites/HEXPC0.png differ diff --git a/sprites/HEXPD0.png b/sprites/HEXPD0.png index 15a56a157..bfc4e7ee7 100644 Binary files a/sprites/HEXPD0.png and b/sprites/HEXPD0.png differ diff --git a/sprites/HEXPE0.png b/sprites/HEXPE0.png index 5b636cfae..b96a1cd5e 100644 Binary files a/sprites/HEXPE0.png and b/sprites/HEXPE0.png differ diff --git a/sprites/HEXPF0.png b/sprites/HEXPF0.png index a9bd34344..f22b27523 100644 Binary files a/sprites/HEXPF0.png and b/sprites/HEXPF0.png differ diff --git a/sprites/HEXPG0.png b/sprites/HEXPG0.png index 3896178be..4da028ba4 100644 Binary files a/sprites/HEXPG0.png and b/sprites/HEXPG0.png differ diff --git a/sprites/HEXPH0.png b/sprites/HEXPH0.png index 8d5ec00aa..6d42d1de6 100644 Binary files a/sprites/HEXPH0.png and b/sprites/HEXPH0.png differ diff --git a/sprites/HEXPI0.png b/sprites/HEXPI0.png index 7d55b4a4a..8d7412e6d 100644 Binary files a/sprites/HEXPI0.png and b/sprites/HEXPI0.png differ diff --git a/sprites/HEXPJ0.png b/sprites/HEXPJ0.png index d3485d9c2..733583a77 100644 Binary files a/sprites/HEXPJ0.png and b/sprites/HEXPJ0.png differ diff --git a/sprites/HEXPK0.png b/sprites/HEXPK0.png index 53e01affa..79029957d 100644 Binary files a/sprites/HEXPK0.png and b/sprites/HEXPK0.png differ diff --git a/sprites/HEXPL0.png b/sprites/HEXPL0.png index 34146fb36..72a701dda 100644 Binary files a/sprites/HEXPL0.png and b/sprites/HEXPL0.png differ diff --git a/sprites/HEXPM0.png b/sprites/HEXPM0.png index c68f3a238..3b700fa89 100644 Binary files a/sprites/HEXPM0.png and b/sprites/HEXPM0.png differ diff --git a/sprites/HEXPN0.png b/sprites/HEXPN0.png index 5f209c0bc..621ffeec4 100644 Binary files a/sprites/HEXPN0.png and b/sprites/HEXPN0.png differ diff --git a/sprites/HEXPO0.png b/sprites/HEXPO0.png index bd50f90b9..20e74bc74 100644 Binary files a/sprites/HEXPO0.png and b/sprites/HEXPO0.png differ diff --git a/sprites/HEXPP0.png b/sprites/HEXPP0.png index ce5bfdb14..4c2494475 100644 Binary files a/sprites/HEXPP0.png and b/sprites/HEXPP0.png differ diff --git a/sprites/HEXPQ0.png b/sprites/HEXPQ0.png index e085bc602..fa5acbcea 100644 Binary files a/sprites/HEXPQ0.png and b/sprites/HEXPQ0.png differ diff --git a/sprites/HEXPR0.png b/sprites/HEXPR0.png index 807a4be46..f9aadd612 100644 Binary files a/sprites/HEXPR0.png and b/sprites/HEXPR0.png differ diff --git a/zscript/dlc1/swwm_dlcammo.zsc b/zscript/dlc1/swwm_dlcammo.zsc index 83b64226c..077611738 100644 --- a/zscript/dlc1/swwm_dlcammo.zsc +++ b/zscript/dlc1/swwm_dlcammo.zsc @@ -13,10 +13,10 @@ Class SMW05Ammo : Ammo Stamina 300; Inventory.Icon "graphics/HUD/Icons/A_SMW05Ammo.png"; Inventory.Amount 1; - Inventory.MaxAmount 90; - Ammo.BackpackAmount 6; - Ammo.BackpackMaxAmount 250; - Ammo.DropAmount 6; + Inventory.MaxAmount 60; + Ammo.BackpackAmount 3; + Ammo.BackpackMaxAmount 150; + Ammo.DropAmount 3; +FLOATBOB; FloatBobStrength 0.25; } @@ -70,8 +70,8 @@ Class SheenAmmo : Ammo Inventory.Amount 1; Inventory.MaxAmount 300; Ammo.BackpackAmount 50; - Ammo.BackpackMaxAmount 1500; - Ammo.DropAmount 50; + Ammo.BackpackMaxAmount 1200; + Ammo.DropAmount 20; +FLOATBOB; FloatBobStrength 0.25; } @@ -83,6 +83,14 @@ Class SheenAmmo : Ammo } } +Class SheenTinyAmmo : SheenAmmo +{ + Default + { + Inventory.Amount 10; + } +} + Class SheenSmallAmmo : SheenAmmo { Default @@ -112,9 +120,9 @@ Class QuadravolAmmo : Ammo Stamina 10000; Inventory.Icon "graphics/HUD/Icons/A_QuadAmmo.png"; Inventory.Amount 1; - Inventory.MaxAmount 8; + Inventory.MaxAmount 4; Ammo.BackpackAmount 1; - Ammo.BackpackMaxAmount 24; + Ammo.BackpackMaxAmount 16; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -133,7 +141,7 @@ Class QuadravolAmmoBundleSpawn : Actor { if ( bCOUNTSECRET ) level.total_secrets--; int bnd = Random[Bundle](2,3); - for ( int i=0; i<3; i++ ) + for ( int i=0; i 0 ) CreateTossable(excess); + } + } + default { +INVENTORY.IGNORESKILL; @@ -225,6 +236,12 @@ Class MagAmmo : Inventory abstract override void DoEffect() { Super.DoEffect(); + // drop excess ammo + if ( !sv_infiniteammo && !Owner.FindInventory('PowerInfiniteAmmo') ) + { + int excess = Amount-MaxAmount; + if ( excess > 0 ) CreateTossable(excess); + } if ( !pamo ) { pamo = Ammo(Owner.FindInventory(ParentAmmo)); @@ -344,10 +361,10 @@ Class RedShell : Ammo Stamina 500; Inventory.Icon "graphics/HUD/Icons/A_ShellsNormal.png"; Inventory.Amount 1; - Inventory.MaxAmount 40; - Ammo.BackpackAmount 3; - Ammo.BackpackMaxAmount 200; - Ammo.DropAmount 3; + Inventory.MaxAmount 30; + Ammo.BackpackAmount 2; + Ammo.BackpackMaxAmount 100; + Ammo.DropAmount 2; +FLOATBOB; FloatBobStrength 0.25; Radius 4; @@ -419,9 +436,9 @@ Class GreenShell : Ammo Stamina 800; Inventory.Icon "graphics/HUD/Icons/A_ShellsSlug.png"; Inventory.Amount 1; - Inventory.MaxAmount 30; + Inventory.MaxAmount 25; Ammo.BackpackAmount 2; - Ammo.BackpackMaxAmount 150; + Ammo.BackpackMaxAmount 80; Ammo.DropAmount 2; +FLOATBOB; FloatBobStrength 0.25; @@ -485,9 +502,9 @@ Class WhiteShell : Ammo Stamina 1000; Inventory.Icon "graphics/HUD/Icons/A_ShellsDragon.png"; Inventory.Amount 1; - Inventory.MaxAmount 24; + Inventory.MaxAmount 10; Ammo.BackpackAmount 1; - Ammo.BackpackMaxAmount 80; + Ammo.BackpackMaxAmount 30; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -542,9 +559,9 @@ Class BlueShell : Ammo Stamina 2500; Inventory.Icon "graphics/HUD/Icons/A_ShellsKinylum.png"; Inventory.Amount 1; - Inventory.MaxAmount 28; - Ammo.BackpackAmount 2; - Ammo.BackpackMaxAmount 100; + Inventory.MaxAmount 15; + Ammo.BackpackAmount 1; + Ammo.BackpackMaxAmount 40; Ammo.DropAmount 2; +FLOATBOB; FloatBobStrength 0.25; @@ -599,9 +616,9 @@ Class BlackShell : Ammo Stamina 4000; Inventory.Icon "graphics/HUD/Icons/A_ShellsFuck.png"; Inventory.Amount 1; - Inventory.MaxAmount 8; + Inventory.MaxAmount 10; Ammo.BackpackAmount 0; - Ammo.BackpackMaxAmount 32; + Ammo.BackpackMaxAmount 20; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -647,10 +664,10 @@ Class PurpleShell : Ammo Stamina 1500; Inventory.Icon "graphics/HUD/Icons/A_ShellsBall.png"; Inventory.Amount 1; - Inventory.MaxAmount 32; - Ammo.BackpackAmount 2; - Ammo.BackpackMaxAmount 120; - Ammo.DropAmount 2; + Inventory.MaxAmount 20; + Ammo.BackpackAmount 1; + Ammo.BackpackMaxAmount 60; + Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; Radius 4; @@ -736,7 +753,7 @@ Class GoldShell : Ammo Stamina 0; Inventory.Icon "graphics/HUD/Icons/A_ShellsGold.png"; Inventory.Amount 1; - Inventory.MaxAmount 3; + Inventory.MaxAmount 7; Ammo.BackpackAmount 0; Ammo.BackpackMaxAmount 7; Ammo.DropAmount 1; @@ -771,10 +788,10 @@ Class EvisceratorShell : Ammo Stamina 3000; Inventory.Icon "graphics/HUD/Icons/A_Eviscerator.png"; Inventory.Amount 1; - Inventory.MaxAmount 36; + Inventory.MaxAmount 20; Ammo.BackpackAmount 2; - Ammo.BackpackMaxAmount 148; - Ammo.DropAmount 2; + Ammo.BackpackMaxAmount 90; + Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; Radius 8; @@ -843,9 +860,9 @@ Class HellblazerMissiles : Ammo Stamina 8000; Inventory.Icon "graphics/HUD/Icons/A_HellblazerMissile.png"; Inventory.Amount 1; - Inventory.MaxAmount 30; - Ammo.BackpackAmount 2; - Ammo.BackpackMaxAmount 94; + Inventory.MaxAmount 20; + Ammo.BackpackAmount 1; + Ammo.BackpackMaxAmount 60; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -911,7 +928,7 @@ Class HellblazerCrackshots : Ammo Inventory.Amount 1; Inventory.MaxAmount 15; Ammo.BackpackAmount 1; - Ammo.BackpackMaxAmount 71; + Ammo.BackpackMaxAmount 36; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -954,9 +971,9 @@ Class HellblazerRavagers : Ammo Stamina 25000; Inventory.Icon "graphics/HUD/Icons/A_HellblazerRavager.png"; Inventory.Amount 1; - Inventory.MaxAmount 12; + Inventory.MaxAmount 9; Ammo.BackpackAmount 0; - Ammo.BackpackMaxAmount 60; + Ammo.BackpackMaxAmount 24; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -1001,7 +1018,7 @@ Class HellblazerWarheads : Ammo Inventory.Amount 1; Inventory.MaxAmount 4; Ammo.BackpackAmount 0; - Ammo.BackpackMaxAmount 12; + Ammo.BackpackMaxAmount 10; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -1048,9 +1065,9 @@ Class SparkUnit : Ammo Stamina 50000; Inventory.Icon "graphics/HUD/Icons/A_Sparkster.png"; Inventory.Amount 1; - Inventory.MaxAmount 6; + Inventory.MaxAmount 5; Ammo.BackpackAmount 1; - Ammo.BackpackMaxAmount 30; + Ammo.BackpackMaxAmount 15; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -1084,7 +1101,7 @@ Class SilverBulletAmmo : Ammo Inventory.Amount 1; Inventory.MaxAmount 3; Ammo.BackpackAmount 0; - Ammo.BackpackMaxAmount 11; + Ammo.BackpackMaxAmount 8; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -1114,7 +1131,7 @@ Class SilverBulletAmmo2 : Ammo Inventory.Amount 1; Inventory.MaxAmount 2; Ammo.BackpackAmount 0; - Ammo.BackpackMaxAmount 10; + Ammo.BackpackMaxAmount 4; Ammo.DropAmount 1; +FLOATBOB; FloatBobStrength 0.25; @@ -1182,7 +1199,7 @@ Class SilverBulletsBundleSpawn : Actor { if ( bCOUNTSECRET ) level.total_secrets--; int bnd = Random[Bundle](2,3); - for ( int i=0; i<3; i++ ) + for ( int i=0; i 0 ) ReactionTime -= 2; - A_CountDown(); let p = Spawn("RavagerPuff",pos); p.alpha *= .6+.4*(ReactionTime/20.); p.scale *= 3.5-2.5*(ReactionTime/20.); @@ -1112,7 +1111,7 @@ Class HellblazerRavagerArm : Actor l.target = p; } if ( !(ReactionTime%1) ) - SWWMUtility.DoExplosion(self,4+reactiontime*2,1000+200*reactiontime,250-6*reactiontime); + SWWMUtility.DoExplosion(self,1+reactiontime/2,1000+200*reactiontime,250-6*reactiontime); double spd = vel.length(); vel = (vel*.4+(FRandom[ExploS](-.2,.2),FRandom[ExploS](-.2,.2),FRandom[ExploS](-.2,.2))).unit()*spd; Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5); @@ -1120,7 +1119,7 @@ Class HellblazerRavagerArm : Actor { let s = Spawn("SWWMHalfSmoke",pos); s.vel = pvel+vel*.2; - s.SetShade(Color(4,2,2)*Random[ExploS](48,63)); + s.SetShade(Color(4,2,1)*Random[ExploS](48,63)); s.special1 = Random[ExploS](2,4); s.scale *= 3.2; s.alpha *= .1+.2*(ReactionTime/20.); @@ -1133,6 +1132,7 @@ Class HellblazerRavagerArm : Actor s2.vel = pvel; } } + A_CountDown(); } Wait; Bounce: @@ -1186,7 +1186,7 @@ Class HellblazerWarheadArm : Actor +NODAMAGETHRUST; +FORCERADIUSDMG; -NOGRAVITY; - Gravity 0.25; + Gravity 0.35; BounceFactor 1.0; Radius 4; Height 4; @@ -1205,16 +1205,16 @@ Class HellblazerWarheadArm : Actor Spawn: TNT1 A 1 { - A_CountDown(); Spawn("HellblazerWarheadTrail",pos); - SWWMUtility.DoExplosion(self,30+reactiontime*5,3000+500*reactiontime,120+3*reactiontime); + SWWMUtility.DoExplosion(self,20+reactiontime*4,3000+500*reactiontime,120+3*reactiontime); Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5); let s = Spawn("SWWMHalfSmoke",pos); s.vel = pvel+vel*.2; - s.SetShade(Color(4,3,2)*Random[ExploS](48,63)); + s.SetShade(Color(4,2,1)*Random[ExploS](48,63)); s.special1 = Random[ExploS](1,3); s.scale *= 6.; s.alpha *= 0.1+.4*(ReactionTime/15.); + A_CountDown(); } Wait; } @@ -1242,7 +1242,7 @@ Class HellblazerXSub : GhostArtifactX void UpdateMe() { static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; - int curtype = 0; + int curtype = -1; for ( int i=0; i<4; i++ ) { if ( weap.loadammo != types[i] ) continue; @@ -1281,6 +1281,12 @@ Class HellblazerXSub : GhostArtifactX if ( (ridx > 1) || weap.magstate[ridx] ) SetState(SpawnState); else SetState(SpawnState+sofs[3]+idx); break; + default: + // uninitialized pickup (3 blazers) + idx = ridx; + if ( idx > 2 ) SetState(SpawnState); + else SetState(SpawnState+sofs[0]+idx); + break; } } States @@ -1509,7 +1515,15 @@ Class Hellblazer : SWWMWeapon override void AttachToOwner( Actor other ) { Super.AttachToOwner(other); - if ( !loadammo ) loadammo = "HellblazerMissiles"; + if ( !loadammo ) + { + // 3 hellblazer missiles loaded + loadammo = "HellblazerMissiles"; + clipcount = 3; + magpos = 0; + for ( int i=0; i<6; i++ ) + magstate[i] = (i>2); + } nextammo = loadammo; } @@ -1679,7 +1693,7 @@ Class Hellblazer : SWWMWeapon Weapon.UpSound "hellblazer/select"; Stamina 90000; Weapon.AmmoType1 "HellblazerMissiles"; - Weapon.AmmoGive1 6; + Weapon.AmmoGive1 3; //SWWMWeapon.SwapWeapon "Quadravol"; SWWMWeapon.DropAmmoType "RocketAmmo"; Hellblazer.ClipCount 6; diff --git a/zscript/swwm_blod.zsc b/zscript/swwm_blod.zsc index 0784f555e..035c06f8f 100644 --- a/zscript/swwm_blod.zsc +++ b/zscript/swwm_blod.zsc @@ -191,7 +191,7 @@ Class mkBloodDrop : Actor double ang = atan2(dir.y,dir.x); double pt = asin(-dir.z); LineTrace(ang,spd,pt,TRF_THRUACTORS|TRF_THRUHITSCAN,data:d); - if ( d.HitType == TRACE_HitFloor ) + if ( (d.HitType == TRACE_HitFloor) || (pos.z <= floorz) ) { if ( d.HitTexture == skyflatnum ) { @@ -220,6 +220,8 @@ Class mkBloodDrop : Actor } else { + // hacky workaround + if ( !d.HitSector ) d.HitSector = floorsector; tracksector = d.HitSector; trackplane = 0; } diff --git a/zscript/swwm_cbt.zsc b/zscript/swwm_cbt.zsc index fd7e7e61d..2d22cf52c 100644 --- a/zscript/swwm_cbt.zsc +++ b/zscript/swwm_cbt.zsc @@ -1179,6 +1179,7 @@ Class Wallbuster : SWWMWeapon p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); p.special1 = max(0,(bc-5)/4); + if ( t.Results.HitType == TRACE_HitFloor ) p.CheckSplash(40); } } override Vector3 GetTraceOffset() @@ -1251,7 +1252,7 @@ Class Wallbuster : SWWMWeapon break; } double rfact = invoker.cbtmuffler.GetBool()?.85:.6; - A_StartSound(sounds[which],CHAN_WEAPON,CHANF_OVERLAP,1./(howmany**rfact),.6-howmany*.004,1.-howmany*.012); + A_StartSound(sounds[which],CHAN_WEAPON,CHANF_OVERLAP,1./(howmany**rfact),.6-howmany*.004,1.-howmany*.015); if ( which == 0 ) redflashstr = max(120,redflashstr+10); else if ( which == 1 ) redflashstr = max(90,redflashstr+8); else if ( which == 2 ) blueflashstr = max(160,blueflashstr+10); @@ -1324,7 +1325,7 @@ Class Wallbuster : SWWMWeapon // slug if ( !sst ) sst = new("SpreadSlugTracer"); sst.ignoreme = self; - sst.penetration = 275.; + sst.penetration = 150.; a = FRandom[Wallbuster](0,360); s = FRandom[Wallbuster](0,.002); dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); @@ -1438,9 +1439,9 @@ Class Wallbuster : SWWMWeapon // buckshot if ( !st ) st = new("SpreadgunTracer"); st.ignoreme = self; - // attempt to uniformize expected damage - int expecteddmg = 200; - int numshot = 31-howmany; + // attempt to uniformize expected damage while reducing traces (mainly for performance) + int expecteddmg = 120; + int numshot = max(21-howmany,5); int individualdmg = int(ceil(expecteddmg/double(numshot))); for ( int j=0; j 20 ) - { + if ( (loadtics == 25) && !sv_infiniteammo && !Owner.FindInventory('PowerInfiniteAmmo',true) ) + Ammo1.Amount = max(0,Ammo1.Amount-1); + if ( loadtics == 30 ) pendingload = false; - if ( !sv_infiniteammo && !Owner.FindInventory('PowerInfiniteAmmo',true) ) - Ammo1.Amount = max(0,Ammo1.Amount-1); - } + } + + action void A_StartLoad( int delay = 0 ) + { + invoker.pendingload = true; + invoker.loadtics = -delay; } override Vector3 GetTraceOffset() @@ -695,7 +697,7 @@ Class Eviscerator : SWWMWeapon SWWMUtility.DoKnockback(self,-x,25000.); [x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x+4*y-5*z); - for ( int i=0; i<40; i++ ) + for ( int i=0; i<30; i++ ) { a = FRandom[Eviscerator](0,360); s = FRandom[Eviscerator](0,invoker.extended?.06:.3); @@ -705,6 +707,7 @@ Class Eviscerator : SWWMWeapon p.angle = atan2(dir.y,dir.x); p.pitch = asin(-dir.z); p.vel = dir*p.speed*FRandom[Eviscerator](.9,1.1); + if ( invoker.extended ) p.vel *= 1.25; } for ( int i=0; i<4; i++ ) { @@ -902,7 +905,7 @@ Class Eviscerator : SWWMWeapon XZW4 C 1 { A_StartSound("eviscerator/ejectend",CHAN_WEAPON,CHANF_OVERLAP); - invoker.pendingload = true; + A_StartLoad(); } XZW4 DEF 1; XZW4 GHI 2; @@ -917,7 +920,7 @@ Class Eviscerator : SWWMWeapon XZW7 B 1 { A_StartSound("eviscerator/ejectend",CHAN_WEAPON,CHANF_OVERLAP); - invoker.pendingload = true; + A_StartLoad(); } XZW7 CDE 1; XZW7 FGH 2; @@ -942,7 +945,7 @@ Class Eviscerator : SWWMWeapon XZW2 STUVW 1; XZW2 XYZ 2; XZW3 ABCD 2; - XZW2 A 1 { invoker.pendingload = true; } + XZW2 A 1 A_StartLoad(5); Goto Ready; AltFireExt: XZW4 Z 2; @@ -950,7 +953,7 @@ Class Eviscerator : SWWMWeapon XZW5 WXY 2; XZW5 Z 2; XZW6 ABC 2; - XZW4 Z 1 { invoker.pendingload = true; } + XZW4 Z 1 A_StartLoad(5); Goto ReadyExt; Zoom: XZW2 A 2 diff --git a/zscript/swwm_handler.zsc b/zscript/swwm_handler.zsc index 559c74e42..c86346b0e 100644 --- a/zscript/swwm_handler.zsc +++ b/zscript/swwm_handler.zsc @@ -2228,7 +2228,7 @@ Class SWWMHandler : EventHandler else if ( e.Replacee is 'MWeaponPiece1' ) e.Replacement = 'Ynykron'; else if ( (e.Replacee == 'Clip') || (e.Replacee == 'GoldWandAmmo') || (e.Replacee == 'GoldWandHefty') ) { - switch( Random[Replacements](0,14) ) + switch( Random[Replacements](0,12) ) { case 0: case 1: @@ -2240,10 +2240,6 @@ Class SWWMHandler : EventHandler case 6: e.Replacement = greenpool[Random[Replacements](0,1)]; break; - case 7: - case 8: - e.Replacement = purplepool[0]; - break; default: e.Replacement = 'SWWMNothing'; break; @@ -2288,7 +2284,7 @@ Class SWWMHandler : EventHandler case 0: case 1: case 2: - e.Replacement = redpool[Random[Replacements](1,3)]; + e.Replacement = redpool[Random[Replacements](1,2)]; break; case 3: case 4: @@ -2314,9 +2310,9 @@ Class SWWMHandler : EventHandler break; } } - else if ( e.Replacee == 'ClipBox' ) e.Replacement = Random[Replacements](0,3)?'EvisceratorShell':Random[Replacements](0,4)?'EvisceratorTrioSpawn':'EvisceratorSixPack'; + else if ( e.Replacee == 'ClipBox' ) e.Replacement = Random[Replacements](0,4)?'EvisceratorShell':Random[Replacements](0,6)?'EvisceratorTrioSpawn':'EvisceratorSixPack'; else if ( e.Replacee == 'BlasterAmmo' ) e.Replacement = 'EvisceratorShell'; - else if ( e.Replacee == 'BlasterHefty' ) e.Replacement = Random[Replacements](0,4)?'EvisceratorTrioSpawn':'EvisceratorSixPack'; + else if ( e.Replacee == 'BlasterHefty' ) e.Replacement = Random[Replacements](0,6)?'EvisceratorTrioSpawn':'EvisceratorSixPack'; else if ( (e.Replacee == 'RocketAmmo') || (e.Replacee == 'PhoenixRodAmmo') || (e.Replacee == 'MaceAmmo') ) e.Replacement = Random[Replacements](0,2)?'HellblazerMissiles':'HellblazerCrackshots'; else if ( (e.Replacee == 'RocketBox') || (e.Replacee == 'PhoenixRodHefty') || (e.Replacee == 'MaceHefty') ) { @@ -2327,15 +2323,15 @@ Class SWWMHandler : EventHandler case 2: case 3: case 4: - if ( Random[Replacements](0,3) ) e.Replacement = 'HellblazerMissiles'; - else if ( Random[Replacements](0,2) ) e.Replacement = 'HellblazerMissileTrioSpawn'; + if ( Random[Replacements](0,5) ) e.Replacement = 'HellblazerMissiles'; + else if ( Random[Replacements](0,4) ) e.Replacement = 'HellblazerMissileTrioSpawn'; else e.Replacement = 'HellblazerMissileMag'; break; case 5: case 6: case 7: case 8: - if ( Random[Replacements](0,4) ) e.Replacement = 'HellblazerCrackshots'; + if ( Random[Replacements](0,6) ) e.Replacement = 'HellblazerCrackshots'; else e.Replacement = 'HellblazerCrackshotMag'; break; case 9: diff --git a/zscript/swwm_health.zsc b/zscript/swwm_health.zsc index 152d7ef9a..5e1738174 100644 --- a/zscript/swwm_health.zsc +++ b/zscript/swwm_health.zsc @@ -162,8 +162,10 @@ Class RefresherItem : SWWMHealth SWWMLoreLibrary.Add(other.player,"Refresher"); return Super.CreateCopy(other); } - override void AutoUseExtra() + override void AutoUseExtra( bool recursive ) { + // regen effect doesn't stack if we autoactivated recursively + if ( recursive ) return; let p = Powerup(Owner.FindInventory("RefresherRegen")); if ( p ) p.EffectTics += p.default.EffectTics; else Owner.GiveInventory("RefresherRegen",1); diff --git a/zscript/swwm_inventory.zsc b/zscript/swwm_inventory.zsc index 66e497738..edb8d8c1a 100644 --- a/zscript/swwm_inventory.zsc +++ b/zscript/swwm_inventory.zsc @@ -332,11 +332,11 @@ Class SWWMHealth : Inventory abstract SWWMHandler.HealthFlash(Owner.PlayerNumber()); Owner.GiveInventory(giveme,GetDefaultByType(giveme).Amount); SWWMScoreObj.Spawn(GetDefaultByType(giveme).Amount,Owner.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Owner.Height/2),Font.CR_BLUE); - AutoUseExtra(); + AutoUseExtra(false); return true; } - virtual void AutoUseExtra() + virtual void AutoUseExtra( bool recursive ) { } @@ -374,6 +374,7 @@ Class SWWMHealth : Inventory abstract if ( ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA); int tgive = 0; bool acc = CVar.GetCVar('swwm_accdamage',players[consoleplayer]).GetBool(); + bool morethanonce = false; while ( (Amount > 0) && (newdamage > 0) ) { if ( acc ) tgive += GetDefaultByType(giveme).Amount; @@ -381,7 +382,8 @@ Class SWWMHealth : Inventory abstract newdamage = newdamage-GetDefaultByType(giveme).Amount; if ( newdamage < 0 ) Owner.GiveBody(-newdamage,GetDefaultByType(giveme).MaxAmount); newdamage = max(0,newdamage); - AutoUseExtra(); + AutoUseExtra(morethanonce); + morethanonce = true; Amount--; } if ( acc ) SWWMScoreObj.Spawn(tgive,Owner.Vec3Offset(FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8),FRandom[ScoreBits](-8,8)+Owner.Height/2),Font.CR_BLUE); @@ -585,7 +587,6 @@ Class PunchImpact : Actor Height 0; +NOGRAVITY; +NOCLIP; - +DONTSPLASH; +NOTELEPORT; +NOINTERACTION; } @@ -656,7 +657,6 @@ Class BigPunchImpact : Actor Height 0; +NOGRAVITY; +NOCLIP; - +DONTSPLASH; +NOTELEPORT; +NOINTERACTION; } @@ -1450,6 +1450,7 @@ Class SWWMWeapon : Weapon abstract let p = Spawn(raging?"BigPunchImpact":"PunchImpact",d.HitLocation+HitNormal*4); p.angle = atan2(HitNormal.y,HitNormal.x); p.pitch = asin(-HitNormal.z); + if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40); if ( raging ) { let ps = Spawn("BigPunchSplash",d.HitLocation+HitNormal*4); diff --git a/zscript/swwm_jackhammer.zsc b/zscript/swwm_jackhammer.zsc index 071fc250f..1888b955d 100644 --- a/zscript/swwm_jackhammer.zsc +++ b/zscript/swwm_jackhammer.zsc @@ -9,7 +9,6 @@ Class PusherImpact : Actor Height 0; +NOGRAVITY; +NOCLIP; - +DONTSPLASH; +NOTELEPORT; +NOINTERACTION; } @@ -54,7 +53,6 @@ Class BigPusherImpact : Actor Height 0; +NOGRAVITY; +NOCLIP; - +DONTSPLASH; +NOTELEPORT; +NOINTERACTION; } @@ -104,7 +102,7 @@ Class PusherProjectile : Actor Speed 50; Radius 10; Height 10; - DamageFunction int(6*vel.length()); + DamageFunction clamp(int(3*vel.length()),0,150); DamageType 'Tenderize'; BounceType "Hexen"; BounceFactor 1.0; @@ -415,7 +413,7 @@ Class PusherWeapon : SWWMWeapon action void A_PusherDrill() { - invoker.chargelevel = clamp(invoker.chargelevel+FRandom[Pusher](-.1,.2),.3,1.); + invoker.chargelevel = clamp(invoker.chargelevel+FRandom[Pusher](-.04,.08),.3,1.); A_QuakeEx(1,1,1,3,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.5); A_WeaponOffset(FRandom[Pusher](-1,1)*2,32+FRandom[Pusher](-1,1)*2); A_ZoomFactor(1.01,ZOOM_INSTANT); @@ -430,7 +428,7 @@ Class PusherWeapon : SWWMWeapon { A_QuakeEx(2,2,2,7,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.8); A_AlertMonsters(swwm_uncapalert?0:1200); - int dmg = int(5+invoker.chargelevel*3); + int dmg = int(3+invoker.chargelevel*3); if ( d.HitType == TRACE_HitActor ) { double diff = deltaangle(self.angle,AngleTo(d.HitActor)); @@ -476,9 +474,12 @@ Class PusherWeapon : SWWMWeapon let p = Spawn("PusherImpact",d.HitLocation+HitNormal*4); p.angle = atan2(HitNormal.y,HitNormal.x); p.pitch = asin(-HitNormal.z); + if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40); + if ( waterlevel > 2 ) SWWMUtility.DoKnockback(self,-x,30000); } if ( swwm_omnibust ) BusterWall.BustLinetrace(d,dmg,self,d.HitDir,d.HitLocation.z); } + else if ( waterlevel > 2 ) SWWMUtility.DoKnockback(self,-x,18000); if ( swwm_extraalert || !(invoker.hitcnt%20) ) A_AlertMonsters(swwm_uncapalert?0:500); invoker.hitcnt++; } @@ -507,7 +508,7 @@ Class PusherWeapon : SWWMWeapon { A_QuakeEx(8,8,8,12,0,1,"",QF_RELATIVE|QF_SCALEDOWN,rollIntensity:.8); A_AlertMonsters(swwm_uncapalert?0:1600); - int dmg = int(300*invoker.chargelevel); + int dmg = int(150*invoker.chargelevel); if ( d.HitType == TRACE_HitActor ) { double diff = deltaangle(self.angle,AngleTo(d.HitActor)); @@ -550,6 +551,7 @@ Class PusherWeapon : SWWMWeapon let p = Spawn("BigPusherImpact",d.HitLocation+HitNormal*4); p.angle = atan2(HitNormal.y,HitNormal.x); p.pitch = asin(-HitNormal.z); + if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40); } if ( swwm_omnibust ) BusterWall.BustLinetrace(d,dmg,self,d.HitDir,d.HitLocation.z); } @@ -580,7 +582,7 @@ Class PusherWeapon : SWWMWeapon action void A_ChargeUp() { - invoker.chargelevel = min(1.,invoker.chargelevel+.035); + invoker.chargelevel = min(1.,invoker.chargelevel+.025); if ( invoker.chargelevel >= .5 ) invoker.vibe = min(1.,invoker.vibe+.02); A_WeaponOffset(FRandom[Pusher](-1,1)*(invoker.chargelevel-invoker.vibe),32+FRandom[Pusher](-1,1)*(invoker.chargelevel-invoker.vibe)); if ( !(player.cmd.buttons&BT_ALTATTACK) && (invoker.chargelevel > .3) ) diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 2d54c37ec..78dd8fda3 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -2990,6 +2990,7 @@ Class LoveHeart : Actor } A_SetRenderStyle(1.,STYLE_Add); //A_RemoveLight('LOVELIGHT'); + CheckSplash(40); A_QuakeEx(2,2,2,8,0,300,"",QF_RELATIVE|QF_SCALEDOWN); A_StartSound("bestsound",CHAN_VOICE); Spawn("LoveHeartBurstLight",pos); diff --git a/zscript/swwm_powerup.zsc b/zscript/swwm_powerup.zsc index 3bfa86f3c..f7cd54b1d 100644 --- a/zscript/swwm_powerup.zsc +++ b/zscript/swwm_powerup.zsc @@ -69,7 +69,7 @@ Class GrilledCheeseSandwich : Inventory override bool Use( bool pickup ) { if ( pickup && !deathmatch ) return false; - if ( Owner.Health >= 1000 ) return false; + if ( Owner.Health > 500 ) return false; if ( pickup && ((Owner.player == players[consoleplayer]) || bBigPowerup) ) Owner.A_StartSound(UseSound,CHAN_ITEMEXTRA); DoTheThing(); return true; diff --git a/zscript/swwm_shot.zsc b/zscript/swwm_shot.zsc index bcf3f654c..7bdf7be54 100644 --- a/zscript/swwm_shot.zsc +++ b/zscript/swwm_shot.zsc @@ -149,7 +149,6 @@ Class SpreadImpact : Actor Height 0; +NOGRAVITY; +NOCLIP; - +DONTSPLASH; +NOTELEPORT; +NOINTERACTION; } @@ -196,7 +195,6 @@ Class SlugImpact : Actor Height 0; +NOGRAVITY; +NOCLIP; - +DONTSPLASH; +NOTELEPORT; +NOINTERACTION; } @@ -377,12 +375,11 @@ Class DragonBreathArm : Actor TNT1 A 1 { if ( waterlevel > 0 ) ReactionTime -= 2; - A_CountDown(); let p = Spawn("DragonBreathPuff",pos); p.alpha *= .6+.4*(ReactionTime/20.); p.scale *= 3.5-2.5*(ReactionTime/20.); if ( !(ReactionTime%2) ) - SWWMUtility.DoExplosion(self,1+(reactiontime*2),1000+200*reactiontime,150-6*reactiontime,flags:DE_HOWL,ignoreme:bHITOWNER?null:target); + SWWMUtility.DoExplosion(self,1+(reactiontime/2),1000+200*reactiontime,150-6*reactiontime,flags:DE_HOWL,ignoreme:bHITOWNER?null:target); double spd = vel.length(); vel = (vel*.4+(FRandom[ExploS](-.2,.2),FRandom[ExploS](-.2,.2),FRandom[ExploS](-.2,.2))).unit()*spd; Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5); @@ -403,6 +400,7 @@ Class DragonBreathArm : Actor s2.vel = pvel; } } + A_CountDown(); } Wait; Bounce: @@ -498,7 +496,7 @@ Class SaltImpact : Actor { Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:6000); - SWWMUtility.DoExplosion(self,25+special2*5,15000,100,40); + SWWMUtility.DoExplosion(self,12+special2*4,15000,100,40); A_QuakeEx(3,3,3,10,0,250,"",QF_RELATIVE|QF_SCALEDOWN,falloff:150,rollintensity:0.2); A_StartSound("spreadgun/salt",CHAN_VOICE,attenuation:.35); A_SprayDecal("ShockMarkSmall",-172); @@ -620,7 +618,7 @@ Class SaltBeam : Actor if ( t.Results.HitType == TRACE_HitActor ) { SWWMUtility.DoKnockback(t.Results.HitActor,x,25000); - t.Results.HitActor.DamageMobj(self,target,60+Accuracy*5,'Salt',DMG_THRUSTLESS); + t.Results.HitActor.DamageMobj(self,target,20+Accuracy*4,'Salt',DMG_THRUSTLESS); if ( t.Results.HitActor && t.Results.HitActor.bIsMonster && !Random[Spreadgun](0,3) ) t.Results.HitActor.Howl(); } @@ -691,7 +689,7 @@ Class SaltBeam : Actor if ( isFrozen() ) return; A_FadeOut(.04); if ( Random[Spreadgun](-2,args[2]/10) == 0 ) - SWWMUtility.DoExplosion(self,5+Accuracy,5000,32,flags:DE_HOWL,ignoreme:target); + SWWMUtility.DoExplosion(self,4+Accuracy,5000,32,flags:DE_HOWL,ignoreme:target); if ( ((special2%4) || args[2]) && !special1 ) SpreadOut(); args[2]++; if ( !CheckNoDelay() || (tics == -1) ) return; @@ -875,7 +873,7 @@ Class OnFire : Actor { int flg = DMG_THRUSTLESS; if ( victim is 'Centaur' ) flg |= DMG_FOILINVUL; // you're on fire, that shield is worthless - victim.DamageMobj(self,instigator,clamp(int(amount*.1),1,30),'Fire',flg); // need to use this actor as inflictor to have a proper obituary + victim.DamageMobj(self,instigator,clamp(int(amount*.06),1,20),'Fire',flg); // need to use this actor as inflictor to have a proper obituary if ( victim.bISMONSTER && !Random[FlameT](0,3) ) victim.Howl(); } @@ -1343,7 +1341,7 @@ Class TheBall : Actor double girth = (victim.radius+victim.height)/2.*max(50,victim.mass)*(victim.health/double(victim.GetSpawnHealth())); // how hard this damn thing is going to slam double slamforce = vel.length()*350.+heat*120; - int dmg = int(vel.length()*4.2+heat*80); + int dmg = int(vel.length()*4.+heat*40); bool is_schutt = victim.bSHOOTABLE; // critical hit! bool crit = false; @@ -1592,7 +1590,7 @@ Class GoldenImpact : Actor { Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:40000); - SWWMUtility.DoExplosion(self,7777,40000,600,500,DE_EXTRAZTHRUST); + SWWMUtility.DoExplosion(self,777,40000,600,500,DE_EXTRAZTHRUST); A_QuakeEx(9,9,9,40,0,5000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:500,rollintensity:1.5); A_StartSound("spreadgun/goldexpl",CHAN_VOICE,attenuation:.3); A_StartSound("spreadgun/goldexpl",CHAN_WEAPON,attenuation:.15); @@ -1730,7 +1728,7 @@ Class GoldenSubImpact : Actor override void PostBeginPlay() { Super.PostBeginPlay(); - SWWMUtility.DoExplosion(self,777,30000,400,300,DE_EXTRAZTHRUST); + SWWMUtility.DoExplosion(self,77,30000,400,300,DE_EXTRAZTHRUST); A_QuakeEx(7,7,7,20,0,2000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200,rollintensity:.8); A_SprayDecal("BigRocketBlast",-172); Scale *= FRandom[ExploS](0.8,1.1); @@ -1866,7 +1864,7 @@ Class GoldenSubSubImpact : Actor override void PostBeginPlay() { Super.PostBeginPlay(); - SWWMUtility.DoExplosion(self,77,20000,200,100,DE_EXTRAZTHRUST); + SWWMUtility.DoExplosion(self,7,20000,200,100,DE_EXTRAZTHRUST); A_QuakeEx(4,4,4,15,0,1000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:100,rollintensity:.4); A_SprayDecal("RocketBlast",-172); Scale *= FRandom[ExploS](0.8,1.1); @@ -2140,6 +2138,7 @@ Class Spreadgun : SWWMWeapon let p = Spawn(impact,t.Results.HitPos+hitnormal*4); p.angle = atan2(hitnormal.y,hitnormal.x); p.pitch = asin(-hitnormal.z); + if ( t.Results.HitType == TRACE_HitFloor ) p.CheckSplash(40); if ( t.Results.HitLine ) t.Results.HitLine.RemoteActivate(self,t.Results.Side,SPAC_Impact,t.Results.HitPos); } } @@ -2182,7 +2181,7 @@ Class Spreadgun : SWWMWeapon case 1: sst = new("SpreadSlugTracer"); sst.ignoreme = self; - sst.penetration = 250.; + sst.penetration = 120.; a = FRandom[Spreadgun](0,360); s = FRandom[Spreadgun](0,.01); dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); @@ -2429,7 +2428,7 @@ Class Spreadgun : SWWMWeapon default: st = new("SpreadgunTracer"); st.ignoreme = self; - for ( int j=0; j<30; j++ ) + for ( int j=0; j<20; j++ ) { a = FRandom[Spreadgun](0,360); s = FRandom[Spreadgun](0,.22); @@ -2438,7 +2437,7 @@ Class Spreadgun : SWWMWeapon st.shootthroughlist.Clear(); st.waterhitlist.Clear(); st.Trace(origin,level.PointInSector(origin.xy),dir,8000.,TRACE_HitSky); - ProcessTraceHit(st,origin,dir,6,7000,bc:5); + ProcessTraceHit(st,origin,dir,5,7000,bc:5); } for ( int i=0; i<9; i++ ) { diff --git a/zscript/swwm_sparkyboi.zsc b/zscript/swwm_sparkyboi.zsc index 329ca7a66..4b052e918 100644 --- a/zscript/swwm_sparkyboi.zsc +++ b/zscript/swwm_sparkyboi.zsc @@ -1205,7 +1205,7 @@ Class BiosparkBeam : Actor if ( frame ) c.SetStateLabel("TrailSpawn"); c.roll = Random[Sparkster](0,7)*45; Vector3 tdir = level.Vec3Diff(pos,invoker.nextpos); - int numpt = Random[Sparkster](-1,6); + int numpt = Random[Sparkster](-1,4); for ( int i=0; i= d.HitActor.Health ) dmg += 25; SWWMUtility.DoKnockback(d.HitActor,d.HitDir,48000); dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Explodium',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x)); if ( d.HitActor.bNOBLOOD || d.HitActor.bDORMANT || d.HitActor.bINVULNERABLE ) @@ -815,7 +818,9 @@ Class DualExplodiumGun : SWWMWeapon SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { - int dmg = 25; + int dmg = 10; + // might as well apply explosion on top + if ( dmg >= d.HitActor.Health ) dmg += 25; SWWMUtility.DoKnockback(d.HitActor,d.HitDir,48000); dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Explodium',DMG_USEANGLE|DMG_THRUSTLESS,atan2(d.HitDir.y,d.HitDir.x)); if ( d.HitActor.bNOBLOOD || d.HitActor.bDORMANT || d.HitActor.bINVULNERABLE ) diff --git a/zscript/swwm_tastytreat.zsc b/zscript/swwm_tastytreat.zsc index f60322c18..f05abf948 100644 --- a/zscript/swwm_tastytreat.zsc +++ b/zscript/swwm_tastytreat.zsc @@ -375,7 +375,7 @@ Class CandyMagArm : Actor { A_CountDown(); Spawn("CandyMagTrail",pos); - SWWMUtility.DoExplosion(self,100+reactiontime*8,3000+800*reactiontime,80+6*reactiontime); + SWWMUtility.DoExplosion(self,50+reactiontime*4,3000+800*reactiontime,80+6*reactiontime); double spd = vel.length(); vel = (vel*.1+(FRandom[ExploS](-.7,.7),FRandom[ExploS](-.7,.7),FRandom[ExploS](-.7,.7))).unit()*spd; Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5); @@ -463,7 +463,7 @@ Class CandyMagArmBig : CandyMagArm { ReactionTime--; Spawn("CandyMagTrailBig",pos); - SWWMUtility.DoExplosion(self,200+reactiontime*20,3000+900*reactiontime,200+16*reactiontime); + SWWMUtility.DoExplosion(self,100+reactiontime*10,3000+900*reactiontime,200+16*reactiontime); double spd = vel.length(); vel = (vel*.1+(FRandom[ExploS](-.5,.5),FRandom[ExploS](-.5,.5),FRandom[ExploS](-.5,.5))).unit()*spd; Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5); @@ -542,7 +542,7 @@ Class CandyGunProj : Actor A_SetRenderStyle(1.,STYLE_Add); Scale *= 7.+.2*special1; A_AlertMonsters(swwm_uncapalert?0:40000); - SWWMUtility.DoExplosion(self,5000+900*special1,80000+15000*special1,500+30*special1,300,DE_EXTRAZTHRUST); + SWWMUtility.DoExplosion(self,3000+600*special1,80000+15000*special1,500+30*special1,300,DE_EXTRAZTHRUST); A_QuakeEx(9,9,9,70,0,1500+100*special1,"",QF_RELATIVE|QF_SCALEDOWN,falloff:1200,rollintensity:2.); A_StartSound("candygun/gunhit",CHAN_VOICE,attenuation:.24); A_StartSound("candygun/gunhit",CHAN_WEAPON,attenuation:.12); @@ -658,7 +658,7 @@ Class CandyMagProj : Actor A_SetRenderStyle(1.,STYLE_Add); Scale *= 3.+.2*special1; A_AlertMonsters(swwm_uncapalert?0:20000); - SWWMUtility.DoExplosion(self,1000+900*special1,60000+15000*special1,200+20*special1,100,DE_EXTRAZTHRUST); + SWWMUtility.DoExplosion(self,800+600*special1,60000+15000*special1,200+20*special1,100,DE_EXTRAZTHRUST); A_QuakeEx(9,9,9,30,0,500+80*special1,"",QF_RELATIVE|QF_SCALEDOWN,falloff:500,rollintensity:2.); A_StartSound("candygun/maghit",CHAN_VOICE,attenuation:.24); A_StartSound("candygun/maghit",CHAN_WEAPON,attenuation:.12); @@ -753,7 +753,7 @@ Class CandyBulletImpact : Actor { Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:9000); - SWWMUtility.DoExplosion(self,1200,48000,250,80,DE_EXTRAZTHRUST); + SWWMUtility.DoExplosion(self,600,48000,250,80,DE_EXTRAZTHRUST); A_QuakeEx(6,6,6,15,0,300,"",QF_RELATIVE|QF_SCALEDOWN,falloff:200,rollintensity:0.2); A_StartSound("candygun/hit",CHAN_VOICE,attenuation:.25); A_StartSound("candygun/hit",CHAN_WEAPON,attenuation:.5); @@ -986,7 +986,9 @@ Class CandyGun : SWWMWeapon SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { - int dmg = 500; + int dmg = 300; + // might as well apply explosion on top + if ( dmg >= d.HitActor.Health ) dmg += 600; SWWMUtility.DoKnockback(d.HitActor,d.HitDir,72000); dmg = d.HitActor.DamageMobj(invoker,self,dmg,'Explodium',DMG_USEANGLE|DMG_THRUSTLESS|DMG_FOILINVUL,atan2(d.HitDir.y,d.HitDir.x)); if ( d.HitActor.bNOBLOOD || d.HitActor.bDORMANT ) diff --git a/zscript/swwm_thiccboolet.zsc b/zscript/swwm_thiccboolet.zsc index b23314bb3..4bd048464 100644 --- a/zscript/swwm_thiccboolet.zsc +++ b/zscript/swwm_thiccboolet.zsc @@ -433,7 +433,7 @@ Class FatChodeImpact : Actor override void PostBeginPlay() { Super.PostBeginPlay(); - SWWMUtility.DoExplosion(self,1500,40000,250,120,DE_THRUWALLS|DE_EXTRAZTHRUST); + SWWMUtility.DoExplosion(self,600,40000,250,120,DE_THRUWALLS|DE_EXTRAZTHRUST); A_AlertMonsters(swwm_uncapalert?0:8000); A_QuakeEx(7,7,7,50,0,2000,"",QF_RELATIVE|QF_SCALEDOWN,falloff:800,rollIntensity:1.); A_StartSound("silverbullet/chode",CHAN_VOICE,CHANF_DEFAULT,1.,.35); @@ -588,8 +588,8 @@ Class FatChodeExplosionArm : Actor Spawn: TNT1 A 1 { - A_CountDown(); - SWWMUtility.DoExplosion(self,20+reactiontime,8000+1500*reactiontime,80+5*reactiontime,50,DE_THRUWALLS); + if ( !(ReactionTime%2) ) + SWWMUtility.DoExplosion(self,10+reactiontime,8000+1500*reactiontime,80+5*reactiontime,50,DE_THRUWALLS); if ( level.IsPointInLevel(pos) ) { A_SprayDecal("HugeRocketBlast",-32); @@ -602,6 +602,7 @@ Class FatChodeExplosionArm : Actor s.scale *= 2.4; s.alpha *= .1+.4*(ReactionTime/15.); } + A_CountDown(); } Wait; } @@ -895,7 +896,10 @@ Class SilverBullet : SWWMWeapon } if ( t.Results.HitType == TRACE_HitActor ) { - int dmg = t.Results.HitActor.DamageMobj(invoker,self,invoker.proneme?1000:500,'shot',DMG_FOILINVUL|DMG_USEANGLE|DMG_THRUSTLESS,atan2(t.Results.HitVector.y,t.Results.HitVector.x)); + int dmg = invoker.proneme?800:600; + // might as well apply explosion on top + if ( dmg >= t.Results.HitActor.Health ) dmg += 600; + dmg = t.Results.HitActor.DamageMobj(invoker,self,dmg,'shot',DMG_FOILINVUL|DMG_USEANGLE|DMG_THRUSTLESS,atan2(t.Results.HitVector.y,t.Results.HitVector.x)); SWWMUtility.DoKnockback(t.Results.HitActor,t.Results.HitVector+(0,0,.025),dmg*20.*FRandom[SilverBullet](.8,1.2)); if ( t.Results.HitActor && !t.Results.HitActor.bNOBLOOD && !t.Results.HitActor.bDORMANT ) { @@ -912,7 +916,7 @@ Class SilverBullet : SWWMWeapon p.target = self; FatChodeImpact(p).realangle = atan2(t.Results.HitVector.y,t.Results.HitVector.x); FatChodeImpact(p).realpitch = asin(-t.Results.HitVector.z); - BusterWall.Bust(t.Results,invoker.proneme?2500:2000,self,t.Results.HitVector,t.Results.HitPos.z); + BusterWall.Bust(t.Results,invoker.proneme?1400:1200,self,t.Results.HitVector,t.Results.HitPos.z); } for ( int i=0; i