diff --git a/language.version b/language.version index 3b6f4f610..b1eb6dcb6 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r447 \cu(Tue 13 Sep 21:25:06 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r447 \cu(2022-09-13 21:25:06)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r448 \cu(Tue 13 Sep 23:46:49 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r448 \cu(2022-09-13 23:46:49)\c-"; diff --git a/zscript/dlc1/swwm_mister.zsc b/zscript/dlc1/swwm_mister.zsc index e98717bc4..7a5fa8104 100644 --- a/zscript/dlc1/swwm_mister.zsc +++ b/zscript/dlc1/swwm_mister.zsc @@ -463,9 +463,9 @@ Class MisterRifle : SWWMWeapon SWWMBulletTrail.DoTrail(self,origin,dir,10000,2); if ( d.HitType == TRACE_HitActor ) { - int dmg = 48; + int dmg = 44; // might as well apply explosion on top - if ( dmg >= d.HitActor.Health ) dmg += 200; + if ( dmg >= d.HitActor.Health ) dmg += 400; SWWMUtility.DoKnockback(d.HitActor,d.HitDir,20000); let p = SWWMPuff.Setup(d.HitLocation,d.HitDir,invoker,self,d.HitActor); dmg = d.HitActor.DamageMobj(p,self,dmg,'Mortal',DMG_THRUSTLESS|DMG_FOILINVUL|DMG_INFLICTOR_IS_PUFF); diff --git a/zscript/dlc1/swwm_mister_fx.zsc b/zscript/dlc1/swwm_mister_fx.zsc index cfabd46ad..1d3c9c9ab 100644 --- a/zscript/dlc1/swwm_mister_fx.zsc +++ b/zscript/dlc1/swwm_mister_fx.zsc @@ -132,6 +132,201 @@ Class MisterBulletImpactPop : Actor } } +Class MisterFuzzy : Actor +{ + Default + { + Obituary "$O_MORTALRIFLE"; + DamageType "Mortal"; + RenderStyle "Add"; + Radius .1; + Height 0; + +NODAMAGETHRUST; + +FORCERADIUSDMG; + +FOILINVUL; + +NOGRAVITY; + +NOBLOCKMAP; + +DONTSPLASH; + +NOINTERACTION; + } + override void PostBeginPlay() + { + special1 = Random[ExploS](4,8); + vel = SWWMUtility.Vec3FromAngles(angle,pitch)*FRandom[ExploS](8,24); + } + override void Tick() + { + if ( isFrozen() ) return; + SWWMUtility.DoExplosion(self,4,8000,40,20,DE_EXTRAZTHRUST); + special1--; + if ( special1 <= 0 ) + { + Destroy(); + return; + } + Vector3 dir = vel; + double magvel = dir.length(); + magvel *= 1.2; + if ( magvel > 0. ) + { + dir /= magvel; + dir += .5*SWWMUtility.Vec3FromAngles(FRandom[ExploS](0,360),FRandom[ExploS](-90,90)); + dir = dir.unit(); + vel = dir*magvel; + } + FLineTraceData d; + Vector3 newpos = pos; + newpos.z = clamp(newpos.z,floorz,ceilingz); + int nstep = 0; + double dist = magvel; + while ( dist > 0 ) + { + // safeguard, too many bounces + if ( nstep > MAXBOUNCEPERTIC ) + { + Destroy(); + return; + } + Vector3 oldpos = newpos; + double ang = atan2(dir.y,dir.x); + double pt = asin(-dir.z); + LineTrace(ang,dist,pt,TRF_THRUACTORS|TRF_THRUHITSCAN|TRF_ABSPOSITION,newpos.z,newpos.x,newpos.y,d); + Vector3 hitnormal = -d.HitDir; + if ( d.HitType == TRACE_HitFloor ) + { + if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.top.Normal; + else hitnormal = d.HitSector.floorplane.Normal; + } + else if ( d.HitType == TRACE_HitCeiling ) + { + if ( d.Hit3DFloor ) hitnormal = -d.Hit3DFloor.bottom.Normal; + else hitnormal = d.HitSector.ceilingplane.Normal; + } + else if ( d.HitType == TRACE_HitWall ) + { + hitnormal = (-d.HitLine.delta.y,d.HitLine.delta.x,0).unit(); + if ( !d.LineSide ) hitnormal *= -1; + } + if ( d.HitType != TRACE_HitNone ) + { + dist -= d.Distance; + // should only happen if we bounced + dir = d.HitDir-(FRandom[Puff](1.5,2.)*hitnormal*(d.HitDir dot hitnormal)); + vel = dir*magvel; + newpos = d.HitLocation+dir; + } + else + { + dist = 0.; + newpos = level.Vec3Offset(newpos,dir*magvel); + } + Vector3 traildir = level.Vec3Diff(oldpos,newpos); + double len = traildir.length(); + if ( len > 0. ) + { + traildir /= len; + for ( double i=0.; i 0 ) tics--; + while ( !tics ) + { + if ( !SetState(CurState.NextState) ) + return; + } + } + States + { + Spawn: + TNT1 A 1 NoDelay + { + A_SetTics(Random[ExploS](1,5)); + Scale *= FRandom[ExploS](.5,1.5); + Scale.x *= RandomPick[ExploS](-1,1); + Scale.y *= RandomPick[ExploS](-1,1); + roll = FRandom[ExploS](0,360); + } + BLPF C 2 Bright { SWWMUtility.DoExplosion(self,44,5000,20,10,DE_EXTRAZTHRUST); } + TNT1 A 1 + { + let p = Spawn("MisterFuzzyTrail",pos); + p.alpha *= 1.5; + p.scale *= .5; + } + Stop; + } +} + Class MisterBulletImpact : Actor { Default @@ -155,7 +350,7 @@ Class MisterBulletImpact : Actor { Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:4000); - SWWMUtility.DoExplosion(self,200,20000,100,40,DE_EXTRAZTHRUST); + SWWMUtility.DoExplosion(self,400,40000,140,40,DE_EXTRAZTHRUST); A_QuakeEx(6,6,6,10,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.6); A_StartSound("mister/hitsemi",CHAN_VOICE,attenuation:.3); A_StartSound("mister/hitsemi",CHAN_WEAPON,attenuation:.2); @@ -188,6 +383,13 @@ Class MisterBulletImpact : Actor let s = Spawn("SWWMChip",pos); s.vel = pvel; } + numpt = Random[ExploS](10,12); + for ( int i=0; i