diff --git a/language.version b/language.version index 8cadf78da..af428b418 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1184 \cu(jue 20 feb 2025 15:27:52 CET)\c-"; -SWWM_SHORTVER="\cw1.3pre r1184 \cu(2025-02-20 15:27:52)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1185 \cu(jue 20 feb 2025 16:01:59 CET)\c-"; +SWWM_SHORTVER="\cw1.3pre r1185 \cu(2025-02-20 16:01:59)\c-"; diff --git a/zscript.txt b/zscript.txt index 10da21ce8..10610a881 100644 --- a/zscript.txt +++ b/zscript.txt @@ -1,4 +1,4 @@ -version "4.12" +version "4.14" /* DEMOLITIONIST Main Codebase diff --git a/zscript/items/swwm_powerups_vip.zsc b/zscript/items/swwm_powerups_vip.zsc index 7f97b78fc..67eed769d 100644 --- a/zscript/items/swwm_powerups_vip.zsc +++ b/zscript/items/swwm_powerups_vip.zsc @@ -33,9 +33,16 @@ Class MykradvoTendril : SWWMNonInteractiveActor { Vector3 nextpos, nextdir; + bool bDoSplit; + + virtual bool IsBig() + { + return true; + } + void A_Trace() { - tics = bMISSILEMORE?2:1; + tics = IsBig()?2:1; let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); if ( !bSTANDSTILL ) { @@ -51,7 +58,7 @@ Class MykradvoTendril : SWWMNonInteractiveActor foreach ( hit:t.hitlist ) { if ( hit.hitactor.IsFriend(target) ) continue; - if ( (hit.hitactor == tracer) && bMISSILEMORE ) bMISSILEEVENMORE = true; // we split + if ( (hit.hitactor == tracer) && IsBig() ) bDoSplit = true; // we split int dmg = (hit.hitactor.bBOSS||hit.hitactor.FindInventory("BossMarker"))?(GetMissileDamage(0,0)*4):max(hit.hitactor.Health,GetMissileDamage(0,0)); SWWMUtility.DoKnockback(hit.hitactor,-hit.x+(0,0,.5),((hit.hitactor.Health-dmg)<=0)?60000:8000); let p = SWWMPuff.Setup(hit.hitlocation,hit.x,self,target,hit.hitactor); @@ -61,7 +68,7 @@ Class MykradvoTendril : SWWMNonInteractiveActor } } nextpos = level.Vec3Offset(pos,x*speed); - if ( !bSTANDSTILL && (!tracer || !tracer.bSHOOTABLE || (tracer.Health <= 0) || ((tracer.bBOSS || tracer.FindInventory("BossMarker")) && !bMISSILEMORE)) ) + if ( !bSTANDSTILL && (!tracer || !tracer.bSHOOTABLE || (tracer.Health <= 0) || ((tracer.bBOSS || tracer.FindInventory("BossMarker")) && !IsBig())) ) { ReactionTime--; if ( ReactionTime <= 0 ) @@ -70,11 +77,11 @@ Class MykradvoTendril : SWWMNonInteractiveActor return; } } - double a = FRandom[Mykradvo](0,360), s = FRandom[Mykradvo](0.,bSTANDSTILL?3.:bMISSILEMORE?.75:1.5); + double a = FRandom[Mykradvo](0,360), s = FRandom[Mykradvo](0.,bSTANDSTILL?3.:IsBig()?.75:1.5); Vector3 dir = SWWMUtility.ConeSpread(x,y,z,a,s); if ( tracer ) { - Vector3 destofs = bMISSILEMORE?tracer.Vec3Offset(0,0,tracer.Height/2.):tracer.Vec3Offset(FRandom[Mykradvo](-1.2,1.2)*tracer.Radius,FRandom[Mykradvo](-1.2,1.2)*tracer.Radius,FRandom[Mykradvo](-.1,1.1)*tracer.height); + Vector3 destofs = IsBig()?tracer.Vec3Offset(0,0,tracer.Height/2.):tracer.Vec3Offset(FRandom[Mykradvo](-1.2,1.2)*tracer.Radius,FRandom[Mykradvo](-1.2,1.2)*tracer.Radius,FRandom[Mykradvo](-.1,1.1)*tracer.height); Vector3 dirto = level.Vec3Diff(nextpos,destofs); double dist = dirto.length(); if ( dist > 1 ) @@ -83,13 +90,13 @@ Class MykradvoTendril : SWWMNonInteractiveActor dir = (dir+dirto*(clamp(1.-(dist/4000.),.25,1.)**1.5)).unit(); } // early split - if ( dist < speed ) bMISSILEEVENMORE = true; + if ( dist < speed ) bDoSplit = true; } nextdir = dir; } void A_Spread() { - if ( bMISSILEMORE && bMISSILEEVENMORE ) + if ( IsBig() && bDoSplit ) { // spread into sub-tendrils let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); @@ -112,7 +119,7 @@ Class MykradvoTendril : SWWMNonInteractiveActor { if ( !bSTANDSTILL ) { - int numpt = bMISSILEMORE?9:3; + int numpt = IsBig()?9:3; let [x, y, z] = SWWMUtility.GetAxes(angle,pitch,roll); for ( int i=0; i 0 ) tics--; while ( !tics ) @@ -170,7 +177,6 @@ Class MykradvoTendril : SWWMNonInteractiveActor Speed 64; +INTERPOLATEANGLES; +FOILINVUL; - +MISSILEMORE; } States { @@ -226,12 +232,15 @@ Class MykradvoTendril : SWWMNonInteractiveActor // sub seekers Class MykradvoSmallTendril : MykradvoTendril { + override bool IsBig() + { + return false; + } Default { Speed 16; DamageFunction 10; ReactionTime 20; - -MISSILEMORE; } States { diff --git a/zscript/swwm_monsters.zsc b/zscript/swwm_monsters.zsc index b7993cd4b..780461f53 100644 --- a/zscript/swwm_monsters.zsc +++ b/zscript/swwm_monsters.zsc @@ -436,8 +436,8 @@ Class SWWMHans : Actor Speed 12; Monster; MinMissileChance 160; + MissileChanceMult .5; +BOSS; - +MISSILEMORE; +FLOORCLIP; +NORADIUSDMG; +DONTMORPH; diff --git a/zscript/weapons/swwm_sparkyboi.zsc b/zscript/weapons/swwm_sparkyboi.zsc index 7c10b61f8..a4e31d346 100644 --- a/zscript/weapons/swwm_sparkyboi.zsc +++ b/zscript/weapons/swwm_sparkyboi.zsc @@ -64,7 +64,7 @@ Class Sparkster : SWWMWeapon p.angle = atan2(dir.y,dir.x); p.pitch = asin(-dir.z); p.vel = dir*p.speed; - if ( invoker.doublestacc ) p.bMISSILEMORE = true; + if ( invoker.doublestacc ) p.MissileChanceMult = .5; break; case 1: // beam @@ -84,7 +84,7 @@ Class Sparkster : SWWMWeapon p.angle = atan2(dir.y,dir.x); p.pitch = asin(-dir.z); p.frame = 0; - if ( invoker.doublestacc ) p.bMISSILEMORE = true; + if ( invoker.doublestacc ) p.MissileChanceMult = .5; break; case 2: // big spark @@ -107,7 +107,7 @@ Class Sparkster : SWWMWeapon p.special1 = scnt; if ( invoker.doublestacc ) { - p.bMISSILEMORE = true; + p.MissileChanceMult = .5; p.ReactionTime -= 10; } break; diff --git a/zscript/weapons/swwm_sparkyboi_fx.zsc b/zscript/weapons/swwm_sparkyboi_fx.zsc index bb81067c1..866cd990b 100644 --- a/zscript/weapons/swwm_sparkyboi_fx.zsc +++ b/zscript/weapons/swwm_sparkyboi_fx.zsc @@ -254,7 +254,7 @@ Class BigBiospark : Actor if ( dist > 4. ) SWWMUtility.DoKnockback(t,-dirto,clamp(120.-dist,0.,120.)*100); } Health -= 3; - if ( bMISSILEMORE ) Health--; + if ( MissileChanceMult <= .5 ) Health--; if ( Health <= 0 ) ExplodeMissile(); } @@ -429,7 +429,7 @@ Class BiosparkBall : Actor A_StartSound("biospark/spark",CHAN_VOICE,CHANF_LOOP); let h = Spawn("BiosparkHitbox",pos); h.target = self; - if ( bMISSILEMORE ) A_SparkTick(); // potential for arcs to hit shooter if overloaded + if ( MissileChanceMult <= .5 ) A_SparkTick(); // potential for arcs to hit shooter if overloaded } void A_SparkTick() { @@ -470,7 +470,7 @@ Class BiosparkBall : Actor magvel *= 1.03; if ( magvel > 50. ) magvel = 50.; Vector3 dir = vel.unit(); - if ( bMISSILEMORE ) + if ( MissileChanceMult <= .5 ) dir = (dir+SWWMUtility.Vec3FromAngles(FRandom[Sparkster](0,360),FRandom[Sparkster](-90,90))*FRandom[Sparkster](.006,.012)).unit(); // check targets at an interval, to save on performance if ( !(special2%5) ) @@ -905,8 +905,7 @@ Class BiosparkComboImpact : SWWMNonInteractiveActor s.target = target; s.angle = ang; s.pitch = pt; - s.bMISSILEMORE = true; - s.bMISSILEEVENMORE = true; + s.MissileChanceMult = .125; } } Spawn("BiosparkExplLight2",pos); @@ -1089,9 +1088,9 @@ Class BiosparkBeam : SWWMNonInteractiveActor dir = (dir+mul*dirto*(clamp(1.-(dist/500.),0.,1.)**4.)).unit(); } } - if ( bMISSILEEVENMORE ) + if ( MissileChanceMult <= .125 ) dir = (dir+SWWMUtility.Vec3FromAngles(FRandom[Sparkster](0,360),FRandom[Sparkster](-90,90))*FRandom[Sparkster](.8,.16)).unit(); - else if ( bMISSILEMORE ) + else if ( MissileChanceMult <= .5 ) dir = (dir+SWWMUtility.Vec3FromAngles(FRandom[Sparkster](0,360),FRandom[Sparkster](-90,90))*FRandom[Sparkster](.02,.04)).unit(); nextdir = dir; } @@ -1107,7 +1106,7 @@ Class BiosparkBeam : SWWMNonInteractiveActor int numpt = Random[Sparkster](-1,3); for ( int i=0; i