diff --git a/language.version b/language.version index 861b218ff..506d50a4f 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r352 \cu(Fri 12 Mar 21:36:08 CET 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r352 \cu(2021-03-12 21:36:08)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r353 \cu(Fri 12 Mar 21:54:57 CET 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r353 \cu(2021-03-12 21:54:57)\c-"; diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index afd4cc6bb..edfe1c2b6 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -1144,7 +1144,7 @@ Class Demolitionist : PlayerPawn else if ( pos.z <= florz ) tempme.Results.Tier = TIER_LOWER; } - if ( BusterWall.Bust(tempme.Results,dmg,self,dir,pos.z+Height/2) ) + if ( BusterWall.Bust(tempme.Results,dmg,self,dir,pos.z+Height) ) { // busted through if ( raging ) diff --git a/zscript/swwm_thinkers.zsc b/zscript/swwm_thinkers.zsc index f0e02d661..e12004757 100644 --- a/zscript/swwm_thinkers.zsc +++ b/zscript/swwm_thinkers.zsc @@ -152,6 +152,7 @@ Class SWWMDamageAccumulator : Thinker } // prevents floors/ceilings from ever moving again, as they're "broken crushers" +// optional "instant" parameter is used by wall busting, no crusher malfunction animation will play Class SWWMCrusherBroken : Thinker { Sector fsec, csec; @@ -159,7 +160,7 @@ Class SWWMCrusherBroken : Thinker int fphase, cphase; int ftics, ctics; - static void Create( Sector f, Sector c, double diffh ) + static void Create( Sector f, Sector c, double diffh, bool instant = false ) { if ( !f && !c ) return; let ti = ThinkerIterator.Create("SWWMCrusherBroken",STAT_USER); @@ -167,7 +168,15 @@ Class SWWMCrusherBroken : Thinker while ( cb = SWWMCrusherBroken(ti.Next()) ) { if ( (cb.fsec == f) && (cb.csec == c) ) + { + if ( instant ) + { + // force it to be instant + if ( f ) cb.fphase = 3; + if ( c ) cb.cphase = 3; + } return; // we already have this + } if ( cb.fsec && (cb.fsec == f) ) { cb.Destroy(); // we override this one @@ -186,6 +195,11 @@ Class SWWMCrusherBroken : Thinker cb.diffh = diffh; if ( f && f.floordata ) f.floordata.Destroy(); if ( c && c.ceilingdata ) c.ceilingdata.Destroy(); + if ( instant ) + { + if ( f ) cb.fphase = 3; + if ( c ) cb.cphase = 3; + } } override void Tick() diff --git a/zscript/weapons/swwm_cbt_fx.zsc b/zscript/weapons/swwm_cbt_fx.zsc index b0ae3cd70..d23ecd8b5 100644 --- a/zscript/weapons/swwm_cbt_fx.zsc +++ b/zscript/weapons/swwm_cbt_fx.zsc @@ -379,17 +379,8 @@ Class BusterWall : Thinker if ( l.Activation&(SPAC_Use|SPAC_Impact) ) l.Activation &= ~(SPAC_Use|SPAC_Impact); } - // stop all movers - let ti2 = ThinkerIterator.Create("SectorEffect",STAT_SECTOREFFECT); - SectorEffect se; - while ( se = SectorEffect(ti2.Next()) ) - { - if ( se.GetSector() != hs ) continue; - se.Destroy(); - } - bust.step = (clamp((b.x-a.x)/4.,2.,32.),clamp((b.y-a.y)/4.,2.,32.),clamp(partheight/4.,2.,32.)); - // stop all sound sequences - for ( int i=1; i<=4; i++ ) hs.StopSoundSequence(i); + // stop movement permanently + SWWMCrusherBroken.Create(hp?null:hs,hp?hs:null,0.,true); // quakin' let q = Actor.Spawn("BustedQuake",(hs.centerspot.x,hs.centerspot.y,thisheight)); q.special1 = clamp(int(girthitude**.15),1,9); @@ -407,6 +398,7 @@ Class BusterWall : Thinker bust.boundsmin = (a.x,a.y,bust.cutheight)+(1,1,1); bust.boundsmax = (b.x,b.y,thisheight)-(1,1,1); } + bust.step = (clamp((b.x-a.x)/4.,2.,32.),clamp((b.y-a.y)/4.,2.,32.),clamp(partheight/4.,2.,32.)); bust.SpawnDebris(true); hs.SetTexture(hp,rubble); hs.SetXScale(hp,1.);