diff --git a/language.version b/language.version index d3613d57b..0975b0cde 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r340 \cu(Thu 18 Aug 08:53:39 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r340 \cu(2022-08-18 08:53:39)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r341 \cu(Thu 18 Aug 16:18:22 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r341 \cu(2022-08-18 16:18:22)\c-"; diff --git a/zscript/dlc1/swwm_hammertime_fx.zsc b/zscript/dlc1/swwm_hammertime_fx.zsc index ba62132c7..38e48f65b 100644 --- a/zscript/dlc1/swwm_hammertime_fx.zsc +++ b/zscript/dlc1/swwm_hammertime_fx.zsc @@ -24,7 +24,7 @@ Class HammerShockwave : Actor { Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,3); let s = Spawn("SWWMSmoke",Vec3Angle(4,i,8)); - s.vel = pvel+(cos(i),sin(i),0)*7.; + s.vel = pvel+SWWMUtility.AngleToVector3(i,7.); s.SetShade(Color(1,1,1)*Random[ExploS](64,224)); s.special1 = Random[ExploS](1,4); s.scale *= 1.5; @@ -35,7 +35,7 @@ Class HammerShockwave : Actor let r = Spawn("HammerRadiusShockwave",Vec3Angle(5,i)); r.target = target; r.angle = i; - r.vel.xy = (cos(i),sin(i))*(r.speed+special1*.1); + r.vel.xy = AngleToVector(i,r.speed+special1*.1); r.alpha *= .3+special1*.0005; } int numpt = Random[ExploS](10,20); diff --git a/zscript/dlc1/swwm_heavymahsheengun.zsc b/zscript/dlc1/swwm_heavymahsheengun.zsc index 8e31e660c..52844688d 100644 --- a/zscript/dlc1/swwm_heavymahsheengun.zsc +++ b/zscript/dlc1/swwm_heavymahsheengun.zsc @@ -122,7 +122,7 @@ Class HeavyMahSheenGun : SWWMWeapon Vector3 x2, y2, z2; [x2, y2, z2] = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); double a = FRandom[Sheen](0,360), s = FRandom[Sheen](.002,.02)*spreadfct; - Vector3 dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); + Vector3 dir = SWWMUtility.ConeSpread(x2,y2,z2,a,s); if ( !invoker.st ) invoker.st = new("SpreadSlugTracer"); let st = invoker.st; // thanks zscript st.ignoreme = self; diff --git a/zscript/dlc1/swwm_heavymahsheengun_fx.zsc b/zscript/dlc1/swwm_heavymahsheengun_fx.zsc index c93cc6e10..d9a9d181b 100644 --- a/zscript/dlc1/swwm_heavymahsheengun_fx.zsc +++ b/zscript/dlc1/swwm_heavymahsheengun_fx.zsc @@ -62,7 +62,7 @@ Class SheenTrail : Actor if ( isFrozen() ) return; if ( CurState == SpawnState ) { - Vector3 dir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch); Vector3 newpos = level.Vec3Offset(oldpos,dir*min(speed,specialf1)); special1++; for ( int i=0; i<4; i++ ) diff --git a/zscript/dlc1/swwm_notashotgun_fx.zsc b/zscript/dlc1/swwm_notashotgun_fx.zsc index ec6cd4f6c..2fd0d64b8 100644 --- a/zscript/dlc1/swwm_notashotgun_fx.zsc +++ b/zscript/dlc1/swwm_notashotgun_fx.zsc @@ -96,12 +96,12 @@ Class OnFire : Thinker { let c = victim.Spawn("OnFireTrail",pos); c.scale *= max(.3,mult*.5); - c.vel = victim.vel*.5+(cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*FRandom[FlameT](.5,2.)*c.scale.x; + c.vel = victim.vel*.5+SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[FlameT](.5,2.)*c.scale.x; } let s = victim.Spawn("SWWMHalfSmoke",pos); s.scale *= max(1.,1.6*mult); s.alpha *= min(amount+30,100)*.02; - s.vel = victim.vel*.5+(cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*FRandom[FlameT](.2,.6)*s.scale.x; + s.vel = victim.vel*.5+SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[FlameT](.2,.6)*s.scale.x; } // spread to nearby actors let bt = BlockThingsIterator.Create(victim); diff --git a/zscript/handler/swwm_handler_cheats.zsc b/zscript/handler/swwm_handler_cheats.zsc index 05b1a0f46..fa631347d 100644 --- a/zscript/handler/swwm_handler_cheats.zsc +++ b/zscript/handler/swwm_handler_cheats.zsc @@ -204,7 +204,7 @@ extend Class SWWMHandler let mo = players[e.Args[0]].mo; Actor f = Actor(ThinkerIterator.Create("SWWMFlag").Next()); if ( !f ) f = mo.Spawn("SWWMFlag"); - Vector2 spos = mo.Vec2Offset(cos(mo.angle)*40.,sin(mo.angle)*40.); + Vector2 spos = mo.Vec2Angle(40.,mo.angle); Sector sat = level.PointInSector(spos); double sz = sat.NextLowestFloorAt(spos.x,spos.y,mo.player.viewz-32.); f.SetOrigin((spos.x,spos.y,sz),false); @@ -305,7 +305,8 @@ extend Class SWWMHandler let mo = players[e.Args[0]].mo; Actor f = Actor(ThinkerIterator.Create("FroggyChair").Next()); if ( !f ) f = mo.Spawn("FroggyChair"); - f.SetOrigin(mo.Vec2OffsetZ(cos(mo.angle)*40.,sin(mo.angle)*40.,mo.player.viewz-32.),false); + Vector2 ofs = Actor.AngleToVector(mo.angle,40.); + f.SetOrigin(mo.Vec2OffsetZ(ofs.x,ofs.y,mo.player.viewz-32.),false); f.A_SetAngle(f.AngleTo(mo)); f.Spawn("SWWMItemFog",f.pos); f.A_StartSound("bestsound",CHAN_ITEMEXTRA); diff --git a/zscript/handler/swwm_handler_damage.zsc b/zscript/handler/swwm_handler_damage.zsc index 186047a38..1d739fb7d 100644 --- a/zscript/handler/swwm_handler_damage.zsc +++ b/zscript/handler/swwm_handler_damage.zsc @@ -227,7 +227,7 @@ extend Class SWWMHandler let a = Actor.Spawn("HealthOrb",e.Thing.Vec3Offset(0,0,e.Thing.Height/2)); a.vel.z = FRandom[Junk](4,16); double ang = FRandom[Junk](0,360); - a.vel.xy = (cos(ang),sin(ang))*FRandom[Junk](4,8); + a.vel.xy = Actor.AngleToVector(ang,FRandom[Junk](4,8)); } } if ( src.CountInv("ArmorNugget") < 100 ) @@ -242,7 +242,7 @@ extend Class SWWMHandler let a = Actor.Spawn("ArmorOrb",e.Thing.Vec3Offset(0,0,e.Thing.Height/2)); a.vel.z = FRandom[Junk](4,16); double ang = FRandom[Junk](0,360); - a.vel.xy = (cos(ang),sin(ang))*FRandom[Junk](4,8); + a.vel.xy = Actor.AngleToVector(ang,FRandom[Junk](4,8)); } } bool needsammo = false; @@ -264,7 +264,7 @@ extend Class SWWMHandler let a = Actor.Spawn("AmmoOrb",e.Thing.Vec3Offset(0,0,e.Thing.Height/2)); a.vel.z = FRandom[Junk](4,16); double ang = FRandom[Junk](0,360); - a.vel.xy = (cos(ang),sin(ang))*FRandom[Junk](4,8); + a.vel.xy = Actor.AngleToVector(ang,FRandom[Junk](4,8)); } } } diff --git a/zscript/handler/swwm_handler_debugrender.zsc b/zscript/handler/swwm_handler_debugrender.zsc index 007e8e975..987c88d19 100644 --- a/zscript/handler/swwm_handler_debugrender.zsc +++ b/zscript/handler/swwm_handler_debugrender.zsc @@ -33,7 +33,7 @@ extend Class SWWMHandler Vector3 ndc[64]; for ( int i=0; i<64; i++ ) { - Vector3 wpos = e.viewpos+level.Vec3Diff(e.viewpos,level.Vec3Offset(pos,y*cos(i*5.625)*radius+z*sin(i*5.625)*radius)); + Vector3 wpos = e.viewpos+level.Vec3Diff(e.viewpos,level.Vec3Offset(pos,SWWMUtility.CircleOffset(y,z,i*5.625,radius))); ndc[i] = SWWMUtility.ProjectPoint(projdata,wpos); } for ( int i=0; i<64; i++ ) diff --git a/zscript/handler/swwm_handler_iwantdie.zsc b/zscript/handler/swwm_handler_iwantdie.zsc index c82185c2a..ffb799e15 100644 --- a/zscript/handler/swwm_handler_iwantdie.zsc +++ b/zscript/handler/swwm_handler_iwantdie.zsc @@ -34,7 +34,7 @@ extend Class SWWMHandler { double a = FRandom[ExtraMissiles](0,360); double s = FRandom[ExtraMissiles](0,.1); - Vector3 dir = (x+y*cos(a)*s+z*sin(a)*s).unit(); + Vector3 dir = SWWMUtility.ConeSpread(x,y,z,a,s); let p = Actor.Spawn(e.Thing.GetClass(),e.Thing.pos); p.GiveInventory("DontDuplicate",1); p.target = e.Thing.target; diff --git a/zscript/handler/swwm_handler_worldthings.zsc b/zscript/handler/swwm_handler_worldthings.zsc index 5d58cf05b..245b07917 100644 --- a/zscript/handler/swwm_handler_worldthings.zsc +++ b/zscript/handler/swwm_handler_worldthings.zsc @@ -95,7 +95,7 @@ extend Class SWWMHandler { let g = Actor.Spawn("GoldShell",e.Thing.Vec3Offset(0,0,e.Thing.Height/2)); double ang = FRandom[SpareShells](0,360); - g.vel.xy = (cos(ang),sin(ang))*FRandom[SpareShells](.4,.8); + g.vel.xy = Actor.AngleToVector(ang,FRandom[SpareShells](.4,.8)); g.vel.z = FRandom[SpareShells](2.,4.); } } diff --git a/zscript/handler/swwm_handler_worldtick.zsc b/zscript/handler/swwm_handler_worldtick.zsc index e991bdf05..fb53ec224 100644 --- a/zscript/handler/swwm_handler_worldtick.zsc +++ b/zscript/handler/swwm_handler_worldtick.zsc @@ -315,7 +315,7 @@ extend Class SWWMHandler continue; if ( !a.player && !a.bSOLID && !a.bSHOOTABLE && !a.bISMONSTER && !a.bFRIENDLY && !(a is 'Inventory') && !(a is 'Chancebox') ) continue; - if ( !level.allmap && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !(a.IsFriend(players[consoleplayer].mo) && !(a.player && (a.player.mo != a))) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) + if ( !level.allmap && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !(a.IsFriend(players[consoleplayer].mo) && !(a.player && (a.player.mo != a))) && !a.CheckSight(players[consoleplayer].Camera,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; if ( a.bKILLED || (a.Health <= 0) || a.bUnmorphed ) continue; @@ -333,7 +333,7 @@ extend Class SWWMHandler Vector2 rv = a.pos.xy-players[consoleplayer].Camera.pos.xy; if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > viewdist ) continue; - if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) + if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !a.CheckSight(players[consoleplayer].Camera,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; SWWMSimpleTracker.Track(self,a); } @@ -345,7 +345,7 @@ extend Class SWWMHandler double rad = a.speed*cos(a.pitch); if ( max(abs(rv.x)-rad,abs(rv.y)-rad) > viewdist ) continue; - if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) + if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !a.CheckSight(players[consoleplayer].Camera,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; SWWMSimpleTracker.Track(self,a); } @@ -373,7 +373,7 @@ extend Class SWWMHandler continue; if ( !a.player && !a.bSOLID && !a.bSHOOTABLE && !a.bISMONSTER && !a.bFRIENDLY && !(a is 'Inventory') && !(a is 'Chancebox') ) continue; - if ( !level.allmap && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !a.IsFriend(players[consoleplayer].mo) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) + if ( !level.allmap && !(deathmatch && (a is 'Inventory') && !a.bDROPPED) && !a.IsFriend(players[consoleplayer].mo) && !a.CheckSight(players[consoleplayer].Camera,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; if ( a.bKILLED || (a.Health <= 0) || a.bUnmorphed ) continue; @@ -391,7 +391,7 @@ extend Class SWWMHandler Vector2 rv = a.pos.xy-relpos; if ( max(abs(rv.x)-a.radius,abs(rv.y)-a.radius) > viewdist ) continue; - if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) + if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !a.CheckSight(players[consoleplayer].Camera,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; SWWMSimpleTracker.Track(self,a); } @@ -403,7 +403,7 @@ extend Class SWWMHandler double rad = a.speed*cos(a.pitch); if ( max(abs(rv.x)-rad,abs(rv.y)-rad) > viewdist ) continue; - if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !players[consoleplayer].Camera.CheckSight(a,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) + if ( !level.allmap && !(a.target && a.target.IsFriend(players[consoleplayer].mo)) && !a.CheckSight(players[consoleplayer].Camera,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; SWWMSimpleTracker.Track(self,a); } diff --git a/zscript/hud/swwm_hud.zsc b/zscript/hud/swwm_hud.zsc index 7a0ba569f..2bb5fa690 100644 --- a/zscript/hud/swwm_hud.zsc +++ b/zscript/hud/swwm_hud.zsc @@ -1150,7 +1150,7 @@ Class SWWMStatusBar : BaseStatusBar } if ( !hnd ) hnd = SWWMHandler(EventHandler.Find("SWWMHandler")); let cam = players[consoleplayer].camera; - Vector3 viewvec = (cos(viewrot.x)*cos(viewrot.y),sin(viewrot.x)*cos(viewrot.y),sin(-viewrot.y)); + Vector3 viewvec = SWWMUtility.Vec3FromAngles(viewrot.x,viewrot.y); int sz; if ( level.allmap && swwm_pois ) { diff --git a/zscript/items/swwm_baseammo.zsc b/zscript/items/swwm_baseammo.zsc index 8efbda5c7..fc30e8868 100644 --- a/zscript/items/swwm_baseammo.zsc +++ b/zscript/items/swwm_baseammo.zsc @@ -185,7 +185,7 @@ Class SWWMAmmo : Ammo double ang = FRandom[Junk](0,360); last = DoDrop(ammotypes[i]); last.SetOrigin(item.pos,false); - last.vel.xy = (cos(ang),sin(ang))*FRandom[Junk](2,5); + last.vel.xy = AngleToVector(ang,FRandom[Junk](2,5)); excess -= def.Amount; break; } @@ -444,7 +444,7 @@ Class MagAmmo : Inventory abstract double ang = FRandom[Junk](0,360); last = DoDrop(ParentAmmo); last.SetOrigin(item.pos,false); - last.vel.xy = (cos(ang),sin(ang))*FRandom[Junk](2,5); + last.vel.xy = AngleToVector(ang,FRandom[Junk](2,5)); excess -= ClipSize; continue; } @@ -457,7 +457,7 @@ Class MagAmmo : Inventory abstract double ang = FRandom[Junk](0,360); last = DoDrop(ammotypes[i]); last.SetOrigin(item.pos,false); - last.vel.xy = (cos(ang),sin(ang))*FRandom[Junk](2,5); + last.vel.xy = AngleToVector(ang,FRandom[Junk](2,5)); excess -= def.Amount; break; } diff --git a/zscript/items/swwm_funstuff.zsc b/zscript/items/swwm_funstuff.zsc index bcb588c46..ff1eec1c5 100644 --- a/zscript/items/swwm_funstuff.zsc +++ b/zscript/items/swwm_funstuff.zsc @@ -67,7 +67,8 @@ Class FroggyChair : Actor if ( !master || (master.Health <= 0) ) EndCarry(); else { - Vector3 tomove = master.Vec2OffsetZ(cos(master.angle)*40.,sin(master.angle)*40.,master.player.viewz-32.); + Vector2 tofs = AngleToVector(master.angle,40.); + Vector3 tomove = master.Vec2OffsetZ(tofs.x,tofs.y,master.player.viewz-32.); Vector3 dirto = level.Vec3Diff(pos,tomove); double intp = clamp(dirto.length()*.01,.3,.7); SetOrigin(level.Vec3Offset(pos,dirto*intp),true); @@ -141,7 +142,7 @@ Class FroggyChair : Actor { double ang = FRandom[DoBlast](0,360); double pt = FRandom[DoBlast](-90,90); - dirto = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dirto = SWWMUtility.Vec3FromAngles(ang,pt); } else dirto /= lento; vel = (dirto+(0,0,.1))*vsize*.3; @@ -203,7 +204,8 @@ Class SWWMFlag : Actor void UpdateCarry() { prev = pos; - Vector3 tomove = master.Vec2OffsetZ(cos(master.angle)*40.,sin(master.angle)*40.,master.player.viewz-32.); + Vector2 tofs = AngleToVector(master.angle,40.); + Vector3 tomove = master.Vec2OffsetZ(tofs.x,tofs.y,master.player.viewz-32.); Vector3 dirto = level.Vec3Diff(pos,tomove); double intp = clamp(dirto.length()*.01,.3,.7); SetOrigin(level.Vec3Offset(pos,dirto*intp),true); @@ -571,7 +573,7 @@ Class SuperFancySparkle : Actor specialf2 = FRandom[ExploS](.004,.012); double ang = FRandom[ExploS](0,360); double pt = FRandom[ExploS](-90,30); - vel = (cos(ang)*cos(pt),sin(ang)*cos(pt),sin(-pt))*FRandom[ExploS](2.,16.); + vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](2.,16.); frame = Random[ExploS](0,7); special1 = RandomPick[ExploS](-1,1)*Random[ExploS](1,6); roll = FRandom[ExploS](0,360); @@ -626,7 +628,7 @@ Class SuperPartyLight : PaletteLight ReactionTime = Random[ExploS](30,50); double ang = FRandom[ExploS](0,360); double pt = FRandom[ExploS](-90,30); - vel = (cos(ang)*cos(pt),sin(ang)*cos(pt),sin(-pt))*FRandom[ExploS](2,10); + vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](2,10); Super.PostBeginPlay(); } override void Tick() @@ -684,7 +686,7 @@ Class PartyTime : Actor ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,30); let c = Spawn("FancyConfetti",Vec3Offset(0,0,specialf1)); - c.vel = (cos(pt)*cos(ang),cos(pt)*sin(ang),-sin(pt))*FRandom[ExploS](2,8); + c.vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](2,8); if ( bAMBUSH ) c.vel *= 2; } if ( !bAMBUSH ) return; @@ -786,7 +788,8 @@ Class CBoxLight : SpotLightAttenuated Vector2 ofs = ((special1<2)?8:-8,(special1%2)?12:-12)*target.scale.x; double ang = (special1<2)?0:180; angle = target.angle+ang; - SetOrigin(target.Vec3Offset(ofs.x*cos(target.angle)-ofs.y*sin(target.angle),ofs.y*cos(target.angle)+ofs.x*sin(target.angle),10*target.scale.y),true); + ofs = RotateVector(ofs,target.angle); + SetOrigin(target.Vec3Offset(ofs.x,ofs.y,10*target.scale.y),true); } } @@ -826,7 +829,7 @@ Class Chancebox : Actor for ( double k=0.; k<360.; k+=(360./rings) ) { // check spot - Vector3 testpos = (origin.x+j*cos(k),origin.y+j*sin(k),0); + Vector3 testpos = (origin.x,origin.y,0)+SWWMUtility.AngleToVector3(k,j); testpos.z = s.floorplane.ZAtPoint(testpos.xy); if ( (level.PointInSector(testpos.xy) != s) || !level.IsPointInLevel(testpos) ) continue; double ceil = s.ceilingplane.ZAtPoint(testpos.xy); @@ -978,7 +981,7 @@ Class Chancebox : Actor let a = Spawn((i==0)?"CandyGun":"CandyGunBullets",pos); a.bDROPPED = (i!=0); a.vel.z = FRandom[Chancebox](2,4); - if ( i > 0 ) a.vel.xy = (cos(i*60),sin(i*60))*FRandom[Chancebox](1,2); + if ( i > 0 ) a.vel.xy = AngleToVector(i*60,FRandom[Chancebox](1,2)); } } else if ( !Random[Chancebox](0,2) && SWWMUtility.ItemExists("SilverBullet") ) @@ -988,14 +991,14 @@ Class Chancebox : Actor let a = Spawn("SilverBullets2",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*120),sin(i*120))*FRandom[Chancebox](1,2); + a.vel.xy = AngleToVector(i*120,FRandom[Chancebox](1,2)); } for ( int i=0; i<6; i++ ) { let a = Spawn("SilverBullets",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*60),sin(i*60))*FRandom[Chancebox](3,4); + a.vel.xy = AngleToVector(i*60,FRandom[Chancebox](3,4)); } } else if ( Random[Chancebox](0,1) && SWWMUtility.ItemExists("Hellblazer") ) @@ -1008,21 +1011,21 @@ Class Chancebox : Actor a = Spawn("HellblazerRavagers",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*120),sin(i*120))*FRandom[Chancebox](1,2); + a.vel.xy = AngleToVector(i*120,FRandom[Chancebox](1,2)); } for ( int i=0; i<5; i++ ) { a = Spawn("HellblazerCrackshots",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*72),sin(i*72))*FRandom[Chancebox](3,4); + a.vel.xy = AngleToVector(i*72,FRandom[Chancebox](3,4)); } for ( int i=0; i<8; i++ ) { a = Spawn("HellblazerMissiles",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*45),sin(i*45))*FRandom[Chancebox](5,6); + a.vel.xy = AngleToVector(i*45,FRandom[Chancebox](5,6)); } } else if ( Random[Chancebox](0,1) && SWWMUtility.ItemExists("HeavyMahSheenGun") ) @@ -1035,7 +1038,7 @@ Class Chancebox : Actor a = Spawn("SheenSmallAmmo",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*72),sin(i*72))*FRandom[Chancebox](3,4); + a.vel.xy = AngleToVector(i*72,FRandom[Chancebox](3,4)); } } else if ( Random[Chancebox](0,1) && SWWMUtility.ItemExists("Spreadgun") ) @@ -1048,14 +1051,14 @@ Class Chancebox : Actor a = Spawn((i%2)?"PurpleShell":"BlueShell",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*45),sin(i*45))*FRandom[Chancebox](2,3); + a.vel.xy = AngleToVector(i*45,FRandom[Chancebox](2,3)); } for ( int i=0; i<12; i++ ) { a = Spawn((i%2)?"RedShell":"GreenShell",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*30),sin(i*30))*FRandom[Chancebox](4,5); + a.vel.xy = AngleToVector(i*30,FRandom[Chancebox](4,5)); } } else if ( Random[Chancebox](0,1) && SWWMUtility.ItemExists("Wallbuster") ) @@ -1065,14 +1068,14 @@ Class Chancebox : Actor let a = Spawn((i%2)?"PurpleShell":"BlueShell",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*30),sin(i*30))*FRandom[Chancebox](2,3); + a.vel.xy = AngleToVector(i*30,FRandom[Chancebox](2,3)); } for ( int i=0; i<20; i++ ) { let a = Spawn((i%2)?"RedShell":"GreenShell",pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,4); - a.vel.xy = (cos(i*18),sin(i*18))*FRandom[Chancebox](4,5); + a.vel.xy = AngleToVector(i*18,FRandom[Chancebox](4,5)); } } else if ( Random[Chancebox](0,1) ) @@ -1083,7 +1086,7 @@ Class Chancebox : Actor let a = Spawn(which,pos); a.bDROPPED = true; a.vel.z = FRandom[Chancebox](2,8); - a.vel.xy = (cos(i*18),sin(i*18))*FRandom[Chancebox](1,8); + a.vel.xy = AngleToVector(i*18,FRandom[Chancebox](1,8)); } } else @@ -1093,7 +1096,7 @@ Class Chancebox : Actor let a = Spawn((i==0)?"RefresherItem":(i%3)?"HealthNuggetItem":"ArmorNuggetItem",pos); a.bDROPPED = (i!=0); a.vel.z = FRandom[Chancebox](2,4); - if ( i > 0 ) a.vel.xy = (cos(i*24),sin(i*24))*FRandom[Chancebox](1,2); + if ( i > 0 ) a.vel.xy = AngleToVector(i*24,FRandom[Chancebox](1,2)); } } } @@ -1126,7 +1129,7 @@ Class Chancebox : Actor ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,30); let c = Spawn("FancyConfetti",Vec3Offset(0,0,16*scale.y)); - c.vel = (cos(pt)*cos(ang),cos(pt)*sin(ang),-sin(pt))*FRandom[ExploS](2,8); + c.vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](2,8); } } override bool Used( Actor user ) @@ -1362,7 +1365,7 @@ Class ChanceboxSide : Actor override void PostBeginPlay() { Super.PostBeginPlay(); - vel = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch))*20; + vel = SWWMUtility.Vec3FromAngles(angle,pitch)*20; A_SetSize(default.radius*scale.x,default.height*scale.y); } States diff --git a/zscript/items/swwm_powerups.zsc b/zscript/items/swwm_powerups.zsc index a970d172d..aed38f603 100644 --- a/zscript/items/swwm_powerups.zsc +++ b/zscript/items/swwm_powerups.zsc @@ -1391,7 +1391,7 @@ Class LampMoth : Actor double ang = FRandom[Moth](0,360); double pt = FRandom[Moth](-30,30); double dist = FRandom[Moth](20,40); - ofs = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*dist; + ofs = SWWMUtility.Vec3FromAngles(ang,pt)*dist; } Vector3 newpos = level.Vec3Offset(pos,ofs); if ( level.IsPointInLevel(newpos) ) trail = newpos; @@ -1453,7 +1453,7 @@ Class LampMoth : Actor double ang = FRandom[Moth](0,360); double pt = FRandom[Moth](-30,30); double dist = FRandom[Moth](20,30); - ofs = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*dist; + ofs = SWWMUtility.Vec3FromAngles(ang,pt)*dist; } Vector3 newpos = level.Vec3Offset(lamp.Vec3Offset(0,0,lamp.height/2),ofs); if ( level.IsPointInLevel(newpos) ) trail = newpos; @@ -1652,7 +1652,7 @@ Class CompanionLamp : Actor double ang = FRandom[Moth](0,360); double pt = FRandom[Moth](-30,30); double dist = FRandom[Moth](10,30); - Vector3 ofs = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*dist; + Vector3 ofs = SWWMUtility.Vec3FromAngles(ang,pt)*dist; Vector3 spawnpos = level.Vec3Offset(Vec3Offset(0,0,height/2),ofs); if ( !level.IsPointInLevel(spawnpos) ) return; // higher chance of white moths if carrying the Mashiro plush @@ -1699,7 +1699,7 @@ Class CompanionLamp : Actor for ( int j=1; j>=-1; j-=2 ) { double ang = (parent.angle-180)+i*j; - Vector3 testpos = level.Vec3Offset(parent.pos,(cos(ang)*32,sin(ang)*32,parent.height-8+1.5*sin(level.maptime*3.))); + Vector3 testpos = level.Vec3Offset(parent.pos,SWWMUtility.RotateVector3((32,0,parent.height-8+1.5*sin(level.maptime*3.)),ang)); if ( !level.IsPointInLevel(testpos) ) continue; Vector3 oldpos = pos; Vector3 oldprev = prev; @@ -1926,7 +1926,7 @@ Class SWWMLamp : Inventory Super.DoEffect(); if ( !thelamp && bActivated ) { - thelamp = Spawn("CompanionLamp",Owner.Vec3Offset(cos(Owner.angle)*20,sin(Owner.angle)*20,24)); + thelamp = Spawn("CompanionLamp",level.Vec3Offset(Owner.pos,SWWMUtility.RotateVector3((20,0,24),Owner.angle))); CompanionLamp(thelamp).parent = Owner; thelamp.master = self; let f = Spawn("SWWMItemFog",thelamp.pos); @@ -2358,7 +2358,7 @@ Class MykradvoTendril : Actor } } double a = FRandom[Mykradvo](0,360), s = FRandom[Mykradvo](0.,bSTANDSTILL?3.:bMISSILEMORE?.75:1.5); - Vector3 dir = (x+cos(a)*y*s+sin(a)*z*s).unit(); + 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); @@ -2386,7 +2386,7 @@ Class MykradvoTendril : Actor { let r = Spawn("MykradvoSmallTendril",invoker.nextpos); double a = FRandom[Mykradvo](0,360), s = FRandom[Mykradvo](0.,1.); - Vector3 sdir = (x+y*cos(a)*s+z*sin(a)*s).unit(); + Vector3 sdir = SWWMUtility.ConeSpread(x,y,z,a,s); r.angle = atan2(sdir.y,sdir.x); r.pitch = asin(-sdir.z); r.target = target; @@ -2406,7 +2406,7 @@ Class MykradvoTendril : Actor for ( int i=0; i 2. ) a.vel = a.vel.unit()*2.; a.vel += dir*FRandom[Gibs](.2,.8); @@ -669,7 +670,7 @@ Class mkGibber : Actor { ang = FRandom[Gibs](0,360); pt = FRandom[Gibs](-90,90); - dir = (cos(pt)*cos(ang),cos(pt)*sin(ang),sin(-pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); a.vel += dir*FRandom[Gibs](4.,8.); a.vel.z += 16.; } @@ -680,7 +681,7 @@ Class mkGibber : Actor [dummy, a] = A_SpawnItemEx("mkBloodDrop",FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](-.8,.8)*radius,FRandom[Gibs](0.,.9)*height,flags:SXF_ABSOLUTEANGLE|SXF_USEBLOODCOLOR); ang = FRandom[Gibs](0,360); pt = FRandom[Gibs](-90,90); - dir = (cos(pt)*cos(ang),cos(pt)*sin(ang),sin(-pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); a.vel = dir*FRandom[Gibs](8.,24.); a.vel += vel*.1; a.scale *= 2.+FRandom[Gibs](.3,1.6); diff --git a/zscript/swwm_common_fx.zsc b/zscript/swwm_common_fx.zsc index 396fc4db5..26220f0d2 100644 --- a/zscript/swwm_common_fx.zsc +++ b/zscript/swwm_common_fx.zsc @@ -97,7 +97,7 @@ Class SWWMSmoke : Actor alpha = min(1.,alpha*FRandom[Puff](.5,1.5)); ang = FRandom[Puff](0,360); pt = FRandom[Puff](-90,90); - vel += (cos(pt)*cos(ang),cos(pt)*sin(ang),-sin(pt))*FRandom[Puff](.2,.8)*speed; + vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[Puff](.2,.8)*speed; roll = Frandom[Puff](0,360); scale.x *= RandomPick[Puff](-1,1); scale.y *= RandomPick[Puff](-1,1); @@ -214,7 +214,7 @@ Class SWWMHalfSmoke : Actor alpha *= FRandom[Puff](0.5,1.5); ang = FRandom[Puff](0,360); pt = FRandom[Puff](-90,90); - vel += (cos(pt)*cos(ang),cos(pt)*sin(ang),-sin(pt))*FRandom[Puff](0.2,0.8)*speed; + vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[Puff](0.2,0.8)*speed; roll = Frandom[Puff](0,360); scale.x *= RandomPick[Puff](-1,1); scale.y *= RandomPick[Puff](-1,1); @@ -260,7 +260,7 @@ Class SWWMSmallSmoke : SWWMHalfSmoke alpha *= FRandom[Puff](0.5,1.5); ang = FRandom[Puff](0,360); pt = FRandom[Puff](-90,90); - vel += (cos(pt)*cos(ang),cos(pt)*sin(ang),-sin(pt))*FRandom[Puff](0.04,0.16); + vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[Puff](0.04,0.16); roll = Frandom[Puff](0,360); scale.x *= RandomPick[Puff](-1,1); scale.y *= RandomPick[Puff](-1,1); @@ -297,7 +297,7 @@ Class SWWMBubble : Actor scale *= FRandom[Puff](0.5,1.5); ang = FRandom[Puff](0,360); pt = FRandom[Puff](-90,90); - vel += (cos(pt)*cos(ang),cos(pt)*sin(ang),-sin(pt))*FRandom[Puff](0.2,0.8); + vel += SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[Puff](0.2,0.8); if ( waterlevel <= 0 ) Destroy(); SetState(ResolveState("Spawn")+Random[Puff](0,19)); } @@ -1012,7 +1012,7 @@ Class SWWMTeleportFog : Actor double pt = FRandom[ExploS](-90,90); double dist = (FRandom[ExploS](5,10)+60*(1.-alpha)); if ( LineTrace(ang,dist,pt,TRF_THRUACTORS|TRF_THRUHITSCAN) ) continue; - Vector3 ofs = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*dist; + Vector3 ofs = SWWMUtility.Vec3FromAngles(ang,pt)*dist; Vector3 spos = level.Vec3Offset(pos,ofs); let s = Spawn("SWWMTeleportSparkle",spos); s.scale *= FRandom[ExploS](.8,1.2); @@ -1470,7 +1470,7 @@ Class SWWMWaterSplash : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-60); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](2.,12.); dir *= str*.25; dir.z += 1.; @@ -1488,7 +1488,7 @@ Class SWWMWaterSplash2 : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-30); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](1.,6.); dir *= str*.25; dir.z += .35; @@ -1506,7 +1506,7 @@ Class SWWMBloodSplash : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-60); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](2.,12.); dir *= str*.25; dir.z += 1.; @@ -1524,7 +1524,7 @@ Class SWWMBloodSplash2 : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-30); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](1.,6.); dir *= str*.25; dir.z += .35; @@ -1542,7 +1542,7 @@ Class SWWMSludgeSplash : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-60); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](2.,8.); dir *= str*.25; dir.z += .4; @@ -1560,7 +1560,7 @@ Class SWWMSludgeSplash2 : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-30); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](1.,4.); dir *= str*.25; dir.z += .15; @@ -1578,7 +1578,7 @@ Class SWWMMudSplash : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-60); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](2.,8.); dir *= str*.25; dir.z += .4; @@ -1596,7 +1596,7 @@ Class SWWMMudSplash2 : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-30); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](1.,4.); dir *= str*.25; dir.z += .15; @@ -1614,7 +1614,7 @@ Class SWWMSlimeSplash : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-60); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](2.,8.); dir *= str*.25; dir.z += .4; @@ -1632,7 +1632,7 @@ Class SWWMSlimeSplash2 : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-30); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](1.,4.); dir *= str*.25; dir.z += .15; @@ -1650,7 +1650,7 @@ Class SWWMLavaSplash : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-60); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](2.,12.); dir *= str*.35; dir.z += .6; @@ -1669,7 +1669,7 @@ Class SWWMLavaSplash2 : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-30); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](1.,6.); dir *= str*.35; dir.z += .2; @@ -1688,7 +1688,7 @@ Class SWWMSizzleSmoke : SWWMBaseSplash { ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-30); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](.5,2.); let s = Spawn("SWWMSmallSmoke",pos); s.vel = dir*str+(0,0,.4); @@ -1707,7 +1707,7 @@ Class SWWMSizzleSmoke2 : SWWMBaseSplash Vector3 dir; ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,-30); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = SWWMUtility.Vec3FromAngles(ang,pt); str = FRandom[ExploS](.25,1.); let s = Spawn("SWWMSmallSmoke",pos); s.vel = dir*str+(0,0,.15); diff --git a/zscript/swwm_gesture.zsc b/zscript/swwm_gesture.zsc index 9b1215bed..1ee139734 100644 --- a/zscript/swwm_gesture.zsc +++ b/zscript/swwm_gesture.zsc @@ -199,7 +199,7 @@ Class SWWMGesture : SWWMWeapon let pt = invoker.pats; if ( !pt ) return; int numpt = Random[ExploS](6,9); - Vector3 dir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch); Vector3 patpos = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz-4),dir*30.); for ( int i=0; i hits; @@ -359,7 +359,7 @@ Class SWWMGesture : SWWMWeapon { for ( int j=0; j<360; j+=(360/rings) ) { - dir = (x2+y2*cos(j)*i+z2*sin(j)*i).unit(); + dir = SWWMUtility.ConeSpread(x2,y2,z2,j,i); LineTrace(atan2(dir.y,dir.x),8000.,asin(-dir.z),TRF_ABSPOSITION,origin.z,origin.x,origin.y,d); if ( d.HitType != TRACE_HitActor ) continue; bool addme = true; diff --git a/zscript/swwm_gesture_fx.zsc b/zscript/swwm_gesture_fx.zsc index 4007732d7..27225e91d 100644 --- a/zscript/swwm_gesture_fx.zsc +++ b/zscript/swwm_gesture_fx.zsc @@ -48,7 +48,7 @@ Class LoveHeartSparkle : Actor Scale *= FRandom[ExploS](.75,1.5); specialf1 = FRandom[ExploS](.95,.98); specialf2 = FRandom[ExploS](.01,.03); - vel = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),sin(-pitch))*FRandom[ExploS](2,8); + vel = SWWMUtility.Vec3FromAngles(angle,pitch)*FRandom[ExploS](2,8); } override void Tick() { @@ -454,7 +454,7 @@ Class LoveHeart : Actor int dmg = GetMissileDamage(0,0); let raging = RagekitPower(self.target.FindInventory("RagekitPower")); if ( raging ) dmg *= 8; - if ( BusterWall.ProjectileBust(self,dmg,(cos(angle)*cos(pitch),sin(angle)*cos(pitch),sin(-pitch))) ) + if ( BusterWall.ProjectileBust(self,dmg,SWWMUtility.Vec3FromAngles(angle,pitch)) ) raging.DoHitFX(); } A_SetRenderStyle(1.,STYLE_Add); diff --git a/zscript/swwm_monsters.zsc b/zscript/swwm_monsters.zsc index 308a6f819..9a3389cb0 100644 --- a/zscript/swwm_monsters.zsc +++ b/zscript/swwm_monsters.zsc @@ -181,7 +181,7 @@ Class SWWMBossBrainExplArm : Actor double ang, pt; ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,90); - vel = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*FRandom[ExploS](8.,20.); + vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](8.,20.); } States { diff --git a/zscript/swwm_player.zsc b/zscript/swwm_player.zsc index 4a484cd1e..1f556f705 100644 --- a/zscript/swwm_player.zsc +++ b/zscript/swwm_player.zsc @@ -850,7 +850,7 @@ Class Demolitionist : PlayerPawn { for ( int j=0; j<360; j+=(360/rings) ) { - dir = (x+y*cos(j)*i+z*sin(j)*i).unit(); + dir = SWWMUtility.ConeSpread(x,y,z,j,i); itrace.Trace(origin,os,dir,UseRange,0); if ( itrace.Results.HitType != TRACE_HitActor ) continue; if ( ignoreme.Find(itrace.Results.HitActor) < ignoreme.Size() ) continue; @@ -1029,7 +1029,7 @@ Class Demolitionist : PlayerPawn double spd = vel.length(); if ( InStateSequence(CurState,FindState("Dash")) && (spd > 10.) ) { - Vector3 facedir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),sin(-pitch)); + Vector3 facedir = SWWMUtility.Vec3FromAngles(angle,pitch); if ( spd > 0. ) { double rel = max(0,vel.unit() dot facedir); @@ -1072,7 +1072,7 @@ Class Demolitionist : PlayerPawn diffpitch = abs(diffpitch)**.7*sgn; } Vector3 flagvel = SWWMUtility.LerpVector3(oldlagvel,lagvel,ticfrac); - double diffx = flagvel dot (cos(flagangle+90),sin(flagangle+90),0); + double diffx = flagvel dot SWWMUtility.AngleToVector3(flagangle+90); double diffy = flagvel dot (0,0,1); if ( abs(diffx) > 1. ) { @@ -1171,7 +1171,7 @@ Class Demolitionist : PlayerPawn double ang = FRandom[ClientSparkles](0,360); double pt = FRandom[ClientSparkles](0,360); double dst = FRandom[ClientSparkles](.5,1.25)*max(t.radius,t.height-16); - Vector3 dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + Vector3 dir = SWWMUtility.Vec3FromAngles(ang,pt); Vector3 ppos = bpos+dir*dst; t.A_SpawnParticle(pcol,SPF_FULLBRIGHT,30,2.,0,ppos.x,ppos.y,ppos.z,dir.x*.2,dir.y*.2,dir.z*.2,0,0,.05,alph,-1,-2./30.); } @@ -1514,7 +1514,7 @@ Class Demolitionist : PlayerPawn Vector3 dir = vel; double spd = dir.length(); dir = dir/spd; - Vector3 viewdir = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + Vector3 viewdir = SWWMUtility.Vec3FromAngles(angle,pitch); // look for things we could potentially bump into bool bumped = false; let bi = BlockThingsIterator.Create(self,500); @@ -1718,8 +1718,9 @@ Class Demolitionist : PlayerPawn { buttslam = true; // leave buttmark - A_SprayDecal("ButtMark",172,(cos(angle+90)*2,sin(angle+90)*2,Height*.54),dir); - A_SprayDecal("ButtMark",172,(cos(angle-90)*2,sin(angle-90)*2,Height*.54),dir); + Vector3 vdir = (2,0,Height*.54); + A_SprayDecal("ButtMark",172,SWWMUtility.RotateVector3(vdir,angle+90),dir); + A_SprayDecal("ButtMark",172,SWWMUtility.RotateVector3(vdir,angle-90),dir); } if ( raging || swwm_omnibust ) { @@ -2256,7 +2257,7 @@ Class Demolitionist : PlayerPawn { if ( InStateSequence(CurState,FindState("Dash")) ) return; // do not if ( !(player.cmd.buttons&BT_JUMP) || (gamestate != GS_LEVEL) ) return; - Vector2 walldir = (cos(angle),sin(angle)); + Vector2 walldir = AngleToVector(angle); bool walljump = false, wallclimb = false; double climbvelz = 0.; FLineTraceData d; @@ -2274,7 +2275,7 @@ Class Demolitionist : PlayerPawn if ( walljump ) { jumpactor = d.HitActor; - walldir = (walldir*.7+(cos(ang+180),sin(ang+180))*.3); + walldir = (walldir*.7+AngleToVector(ang+180)*.3); break; } } @@ -2300,7 +2301,7 @@ Class Demolitionist : PlayerPawn { wallclimb = false; walljump = true; - walldir = -(walldir*.7+(cos(ang),sin(ang))*.3); + walldir = -(walldir*.7+AngleToVector(ang)*.3); break; } Sector s = d.HitLine.sidedef[!d.LineSide].sector; @@ -2312,7 +2313,7 @@ Class Demolitionist : PlayerPawn { wallclimb = false; walljump = true; - walldir = -(walldir*.7+(cos(ang),sin(ang))*.3); + walldir = -(walldir*.7+AngleToVector(ang)*.3); break; } climbvelz = 1.5*sqrt(max(1.,backfloorz-pos.z)); @@ -2324,13 +2325,13 @@ Class Demolitionist : PlayerPawn wallclimb = false; walljump = true; jumpactor = d.HitActor; - walldir = -(walldir*.7+(cos(ang),sin(ang))*.3); + walldir = -(walldir*.7+AngleToVector(ang)*.3); break; } climbvelz = 1.5*sqrt(max(1.,(d.HitActor.pos.z+d.HitActor.Height)-pos.z)); } jumpactor = d.HitActor; - walldir = (walldir*.7+(cos(ang),sin(ang))*.3); + walldir = (walldir*.7+AngleToVector(ang)*.3); break; } } diff --git a/zscript/swwm_player_fx.zsc b/zscript/swwm_player_fx.zsc index e528e7633..3210f831c 100644 --- a/zscript/swwm_player_fx.zsc +++ b/zscript/swwm_player_fx.zsc @@ -515,7 +515,7 @@ Class DemolitionistShockwave : Actor { Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,3); let s = Spawn("SWWMSmoke",Vec3Angle(4,i,8)); - s.vel = pvel+(cos(i),sin(i),0)*7.; + s.vel = pvel+SWWMUtility.AngleToVector3(i,7.); s.SetShade(Color(1,1,1)*Random[ExploS](64,224)); s.special1 = Random[ExploS](1,4); s.scale *= 1.5; @@ -527,7 +527,7 @@ Class DemolitionistShockwave : Actor let r = Spawn("DemolitionistRadiusShockwave",Vec3Angle(5,i)); r.target = target; r.angle = i; - r.vel.xy = (cos(i),sin(i))*(r.speed+min(special1*.15,30)); + r.vel.xy = AngleToVector(i,r.speed+min(special1*.15,30)); r.alpha *= .1+min(special1*.03,.9); } int numpt = Random[ExploS](10,20); diff --git a/zscript/utility/swwm_utility.zsc b/zscript/utility/swwm_utility.zsc index 313adc4d5..3fb9897b0 100644 --- a/zscript/utility/swwm_utility.zsc +++ b/zscript/utility/swwm_utility.zsc @@ -223,6 +223,30 @@ Class SWWMUtility y = (y-100)*CleanYFac_1+(Screen.GetHeight()*.5); } + // Vector/Axis utility functions + static clearscope Vector3 Vec3FromAngles( double angle, double pitch ) + { + return (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + } + static clearscope Vector3 CircleOffset( Vector3 y, Vector3 z, double angle, double radius ) + { + return y*cos(angle)*radius+z*sin(angle)*radius; + } + static clearscope Vector3 ConeSpread( Vector3 x, Vector3 y, Vector3 z, double angle, double spread ) + { + return (x+y*cos(angle)*spread+z*sin(angle)*spread).unit(); + } + static clearscope Vector3 RotateVector3( Vector3 v, double angle ) + { + Vector2 v2d = Actor.RotateVector(v.xy,angle); + return (v2d.x,v2d.y,v.z); + } + static clearscope Vector3 AngleToVector3( double angle, double length = 1. ) + { + Vector2 v2d = Actor.AngleToVector(angle,length); + return (v2d.x,v2d.y,0); + } + // thanks zscript static clearscope double fract( double a ) { @@ -1217,7 +1241,7 @@ Class SWWMUtility { double ang = FRandom[DoBlast](0,360); double pt = FRandom[DoBlast](-90,90); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = Vec3FromAngles(ang,pt); } dir /= dist; dist = clamp(dist-FullDamageRadius,0,min(dist,ExplosionRadius)); @@ -1302,7 +1326,7 @@ Class SWWMUtility { double ang = FRandom[DoBlast](0,360); double pt = FRandom[DoBlast](-90,90); - dir = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt)); + dir = Vec3FromAngles(ang,pt); } dir /= dist; dist = clamp(dist-FullDamageRadius,0,min(dist,ExplosionRadius)); diff --git a/zscript/weapons/swwm_baseweapon_fx.zsc b/zscript/weapons/swwm_baseweapon_fx.zsc index 45b223272..ea7f5e92b 100644 --- a/zscript/weapons/swwm_baseweapon_fx.zsc +++ b/zscript/weapons/swwm_baseweapon_fx.zsc @@ -111,7 +111,7 @@ Class SWWMBulletImpact : Actor Super.PostBeginPlay(); A_SprayDecal("Pock",-20); int numpt = int(Random[Junk](5,10)*scale.x*4); - Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); for ( int i=0; i pop = "CandyPop", Class smk = "SWWMHalfSmoke" ) { @@ -371,7 +371,7 @@ Class CandyMagArm : Actor double ang, pt; ang = FRandom[ExploS](0,360); pt = FRandom[ExploS](-90,90); - vel = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*FRandom[ExploS](12.,30.); + vel = SWWMUtility.Vec3FromAngles(ang,pt)*FRandom[ExploS](12.,30.); } States { diff --git a/zscript/weapons/swwm_thiccboolet_fx.zsc b/zscript/weapons/swwm_thiccboolet_fx.zsc index 8811b3e85..6891045f9 100644 --- a/zscript/weapons/swwm_thiccboolet_fx.zsc +++ b/zscript/weapons/swwm_thiccboolet_fx.zsc @@ -130,7 +130,7 @@ Class SilverImpact : Actor A_SprayDecal("BigPock",-64); A_SprayDecal("HugeWallCrack",-64); int numpt = Random[Silverbullet](15,25); - Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); + Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); for ( int i=0; i