diff --git a/language.version b/language.version index ccd16199e..be6234ec9 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r783 \cu(Fri 22 Jan 20:18:02 CET 2021)"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r784 \cu(Sat 23 Jan 12:45:15 CET 2021)"; diff --git a/sndinfo.txt b/sndinfo.txt index ec62a0f53..791c2477f 100644 --- a/sndinfo.txt +++ b/sndinfo.txt @@ -587,6 +587,10 @@ spreadgun/slugf1 sounds/spreadgun/spread_slugf1.ogg spreadgun/slugf2 sounds/spreadgun/spread_slugf2.ogg $random spreadgun/slugf { spreadgun/slugf1 spreadgun/slugf2 } spreadgun/corrode sounds/spreadgun/spread_poison.ogg +spreadgun/corrodepuff1 sounds/spreadgun/spread_poisonpuff1.ogg +spreadgun/corrodepuff2 sounds/spreadgun/spread_poisonpuff2.ogg +$random spreadgun/corrodepuff { spreadgun/corrodepuff1 spreadgun/corrodepuff2 } +$limit spreadgun/corrodepuff 32 spreadgun/ball1 sounds/spreadgun/spread_ball1.ogg spreadgun/ball2 sounds/spreadgun/spread_ball2.ogg spreadgun/ball3 sounds/spreadgun/spread_ball3.ogg diff --git a/sounds/spreadgun/spread_poison.ogg b/sounds/spreadgun/spread_poison.ogg index 15a9c4a65..fc21026b4 100644 Binary files a/sounds/spreadgun/spread_poison.ogg and b/sounds/spreadgun/spread_poison.ogg differ diff --git a/sounds/spreadgun/spread_poisonpuff1.ogg b/sounds/spreadgun/spread_poisonpuff1.ogg new file mode 100644 index 000000000..08cadb551 Binary files /dev/null and b/sounds/spreadgun/spread_poisonpuff1.ogg differ diff --git a/sounds/spreadgun/spread_poisonpuff2.ogg b/sounds/spreadgun/spread_poisonpuff2.ogg new file mode 100644 index 000000000..9e153660f Binary files /dev/null and b/sounds/spreadgun/spread_poisonpuff2.ogg differ diff --git a/zscript/swwm_shot.zsc b/zscript/swwm_shot.zsc index 272e90b99..789a9855f 100644 --- a/zscript/swwm_shot.zsc +++ b/zscript/swwm_shot.zsc @@ -854,7 +854,7 @@ Class CorrodeSmoke : SWWMHalfSmoke Class CorrodeDebuff : Inventory { - int cnt, cnt2; + int cnt, cnt2, cnt3; Actor instigator; bool wasalive; @@ -866,7 +866,6 @@ Class CorrodeDebuff : Inventory Inventory.InterHubAmount 0; +INVENTORY.UNDROPPABLE; +INVENTORY.UNTOSSABLE; - +NOEXTREMEDEATH; } override int DoSpecialDamage( Actor target, int Damage, Name DamageType ) { @@ -878,12 +877,25 @@ Class CorrodeDebuff : Inventory c = CorrodeDebuff(Spawn("CorrodeDebuff",target.pos)); c.AttachToOwner(target); c.cnt = 5; // slight delay - c.A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT); + c.Amount = min(Damage*8,int(Amount*.6)); // prevent "escalating" spread + c.A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT,min(c.Amount/100.,1.)); } - if ( c.Amount < int(Amount*.6) ) c.Amount = clamp(c.Amount+Damage*8,0,int(Amount*.6)); // prevent "escalating" spread + else if ( c.Amount < int(Amount*.6) ) c.Amount = min(c.Amount+Damage*8,int(Amount*.6)); // prevent "escalating" spread c.instigator = instigator; return 0; // no direct damage } + override void AttachToOwner( Actor other ) + { + Super.AttachToOwner(other); + cnt3 = Random[Corrode](0,19); // randomize puff sound offset + } + override void OwnerDied() + { + Super.OwnerDied(); + // forcibly update + wasalive = true; + cnt = -1; + } override void DoEffect() { Super.DoEffect(); @@ -902,38 +914,42 @@ Class CorrodeDebuff : Inventory cnt--; if ( cnt < 0 ) { - cnt = clamp((100-Amount)/10,5,15); if ( !Random[Corrode](0,3) ) Owner.Howl(); double maxrad = max(Owner.radius,Owner.height); + int defh = Owner.GetSpawnHealth(); Owner.DamageMobj(self,instigator?instigator:Actor(self),clamp(Amount/8,1,50),'Corroded',DMG_THRUSTLESS); - bool justdied = (wasalive && (!Owner || Owner.Health <= 0)); + bool justdied = (wasalive && (!Owner || (Owner.Health <= 0))); if ( justdied ) { - maxrad += 50; - Amount = max(100,Amount); + maxrad += 60; + Amount = min(Amount+int(defh**.5),MaxAmount); A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT); } - if ( !wasalive ) maxrad += 20; + if ( !wasalive ) maxrad += 25; SWWMUtility.DoExplosion(self,clamp(Amount/8,1,50),0,maxrad*1.2,maxrad*.9,DE_NOBLEED|DE_NOSPLASH|DE_HOWL,'Corroded',Owner); int smokefact = int(clamp(maxrad/32.,1,8)); - int numpt = Random[Corrode](-1,1*smokefact); - if ( justdied ) numpt = Random[Corrode](4,6)*smokefact; + int numpt = Random[Corrode](0,2*smokefact); + if ( justdied ) numpt = Random[Corrode](8,12)*smokefact; for ( int i=0; i 0); + cnt3++; + if ( !(cnt3%20) ) A_StartSound("spreadgun/corrodepuff",CHAN_BODY,CHANF_OVERLAP,min(Amount/200.,1.),2.,FRandom[Corrode](.8,1.2)-min(Amount/200.,.4)); cnt2++; - if ( cnt2 < 4 ) return; - cnt2 = 0; + if ( cnt2 < 3 ) return; + cnt2 = (!Owner||(Owner.Health<=Owner.GetGibHealth()))?-2:0; // slower decay when gibbed Amount -= 1; if ( Amount > 100 ) Amount -= max(0,Amount/50-1); if ( !Owner ) return; @@ -1002,9 +1018,9 @@ Class CorrosiveSplash : Actor c = CorrodeDebuff(Spawn("CorrodeDebuff",target.pos)); c.AttachToOwner(target); c.cnt = 5; // slight delay - c.A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT); } - c.Amount = clamp(c.Amount+Damage,100,c.MaxAmount); + c.Amount = min(c.Amount+Damage,c.MaxAmount); + c.A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT,min(c.Amount/100.,1.)); c.instigator = self.target; return 0; // no direct damage } @@ -1106,10 +1122,10 @@ Class CorrosiveFlechette : Actor c = CorrodeDebuff(Spawn("CorrodeDebuff",a.pos)); c.AttachToOwner(a); } - c.Amount = clamp(c.Amount+25,100,c.MaxAmount); + c.Amount = min(c.Amount+25,c.MaxAmount); c.cnt = 0; c.instigator = target; - c.A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT); + c.A_StartSound("spreadgun/corrode",CHAN_VOICE,CHANF_DEFAULT,min(c.Amount/100.,1.)); } int dmg = 3; int amt = 3;