From 2c6cf8a8048d8318e718e26e86042dd8b8032fe8 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Tue, 10 Aug 2021 22:23:08 +0200 Subject: [PATCH] Allow Ynykron alt+primary combo (even though it makes no sense). --- language.version | 4 +- .../weapons/swwm_deathlydeathcannon_fx.zsc | 56 ++++++++++++++++++- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/language.version b/language.version index 4685ddb29..986f51e68 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r590 \cu(Tue 10 Aug 14:27:52 CEST 2021)\c-"; -SWWM_SHORTVER="\cw0.9.11b-pre r590 \cu(2021-08-10 14:27:52)\c-"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.11b-pre r591 \cu(Tue 10 Aug 22:23:08 CEST 2021)\c-"; +SWWM_SHORTVER="\cw0.9.11b-pre r591 \cu(2021-08-10 22:23:08)\c-"; diff --git a/zscript/weapons/swwm_deathlydeathcannon_fx.zsc b/zscript/weapons/swwm_deathlydeathcannon_fx.zsc index 43201dd50..28d5821c1 100644 --- a/zscript/weapons/swwm_deathlydeathcannon_fx.zsc +++ b/zscript/weapons/swwm_deathlydeathcannon_fx.zsc @@ -588,7 +588,7 @@ Class YnykronTracer : LineTracer if ( Results.HitType == TRACE_HitActor ) { if ( Results.HitActor == ignore ) return TRACE_Skip; - if ( Results.HitActor.bSHOOTABLE ) + if ( Results.HitActor.bSHOOTABLE || (Results.HitActor is 'YnykronSingularityHitbox') ) { let ent = new("HitListEntry"); ent.hitactor = Results.HitActor; @@ -684,6 +684,23 @@ Class YnykronBeam : Actor { if ( YnykronShot(master) && (YnykronShot(master).hitlist.Find(t.HitList[i].hitactor) < YnykronShot(master).hitlist.Size()) ) continue; + if ( t.hitlist[i].hitactor is 'YnykronSingularityHitbox' ) + { + // detonate it instantly + let s = YnykronSingularity(t.hitlist[i].hitactor.target); + s.specialf2 = s.critmass; + let b = Spawn("YnykronImpact",t.hitlist[i].hitlocation); + b.target = target; + b.master = master; + b.angle = atan2(t.HitList[i].x.y,t.HitList[i].x.x); + b.pitch = asin(-t.HitList[i].x.z); + if ( YnykronShot(master) ) + { + YnykronShot(master).hitlist.Push(t.hitlist[i].hitactor); + YnykronShot(master).blastcount++; + } + continue; + } int trad = int(max(t.hitlist[i].hitactor.radius,t.hitlist[i].hitactor.height)); if ( t.hitlist[i].hitactor && YnykronShot(master) ) { @@ -1186,7 +1203,7 @@ Class YnykronAltTracer : LineTracer if ( Results.HitType == TRACE_HitActor ) { if ( Results.HitActor == ignore ) return TRACE_Skip; - if ( Results.HitActor.bSHOOTABLE ) return TRACE_Stop; + if ( Results.HitActor.bSHOOTABLE || (Results.HitActor is 'YnykronSingularityHitbox') ) return TRACE_Stop; return TRACE_Skip; } else if ( (Results.HitType == TRACE_HitWall) && (Results.Tier == TIER_Middle) ) @@ -2230,6 +2247,34 @@ Class YnykronSingularityExplosion : Actor } } +Class YnykronSingularityHitbox : Actor +{ + Default + { + Radius .1; + Height 0.; + +NOGRAVITY; + +NOCLIP; + +DONTSPLASH; + +NOTELEPORT; + +NOINTERACTION; + } + override void Tick() + { + if ( !target || !target.InStateSequence(target.CurState,target.FindState("Spawn")) ) + { + Destroy(); + return; + } + A_SetSize(32.*target.scale.x,64.*target.scale.y); + SetOrigin(target.Vec3Offset(0,0,-height*.5),true); + } + override bool CanCollideWith( Actor other, bool passive ) + { + return false; + } +} + Class YnykronSingularity : Actor { const MAXBEAMS = 10; @@ -2261,6 +2306,8 @@ Class YnykronSingularity : Actor specialf2 = scale.x*scale.x*MION_CONST; critmass = GOAL_MASS; litetimer = level.maptime+Random[Ynykron](180,240); + let h = Spawn("YnykronSingularityHitbox",pos); + h.target = self; } // lightweight tick, we don't need anything else other than states @@ -2394,10 +2441,12 @@ Class YnykronSingularity : Actor if ( !a ) continue; if ( a.bDORMANT || (a.Health <= 0) || (a == self) || !SWWMUtility.SphereIntersect(a,pos,20000.*scale.x) || !CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; - if ( (a is 'Inventory') && !a.bSPECIAL ) // must be a pickup + if ( (a is 'Inventory') && !a.bDROPPED ) // must be a dropped pickup continue; if ( a.player && (a.player.cheats&CF_NOCLIP2) ) // for safety continue; + if ( (a is 'YnykronSingularity') && a.bNOBLOCKMAP ) // dead singularity, ignore + continue; double capmass = a.mass; // succ if ( SWWMUtility.SphereIntersect(a,pos,32.*scale.x) ) @@ -2531,6 +2580,7 @@ Class YnykronSingularity : Actor } void A_SingularityBlast() { + A_ChangeLinkFlags(true); // unlink from blockmap A_AlertMonsters(); SWWMUtility.DoExplosion(self,int.max,500000,800,400); A_QuakeEx(8,8,8,100,0,65536,"",QF_RELATIVE|QF_SCALEDOWN,falloff:65536,rollIntensity:1.6);