From 9bd7670ce03b2c29c2a2bc415f67e4d3db815ce1 Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sun, 9 May 2021 02:36:46 +0200 Subject: [PATCH] Hellblazer burst fire + lock-on. --- FuturePlans.md | 15 - README.md | 4 +- graphics/HUD/HellblazerCrackshotLock.png | Bin 0 -> 196 bytes graphics/HUD/HellblazerMissileLock.png | Bin 0 -> 188 bytes graphics/HUD/HellblazerRavagerLock.png | Bin 0 -> 188 bytes graphics/HUD/HellblazerWarheadLock.png | Bin 0 -> 188 bytes language.def_lore | 2 +- language.es_lore | 2 +- language.version | 4 +- lore/default/hellblazer.txt | 14 +- lore/es/hellblazer.txt | 12 +- sndinfo.txt | 3 + sounds/hellblazer/blaze_clear.ogg | Bin 0 -> 3492 bytes sounds/hellblazer/blaze_lock.ogg | Bin 0 -> 3239 bytes sounds/hellblazer/blaze_preload.ogg | Bin 0 -> 6969 bytes zscript/weapons/swwm_blazeit.zsc | 471 ++++++++++++++++++++++- zscript/weapons/swwm_blazeit_fx.zsc | 40 +- zscript/weapons/swwm_shot.zsc | 4 +- zscript/weapons/swwm_thiccboolet.zsc | 4 +- 19 files changed, 528 insertions(+), 47 deletions(-) create mode 100644 graphics/HUD/HellblazerCrackshotLock.png create mode 100644 graphics/HUD/HellblazerMissileLock.png create mode 100644 graphics/HUD/HellblazerRavagerLock.png create mode 100644 graphics/HUD/HellblazerWarheadLock.png create mode 100644 sounds/hellblazer/blaze_clear.ogg create mode 100644 sounds/hellblazer/blaze_lock.ogg create mode 100644 sounds/hellblazer/blaze_preload.ogg diff --git a/FuturePlans.md b/FuturePlans.md index 0d09dc167..079dbd9ac 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -62,7 +62,6 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after * **Official Sunder support *(when the WAD is complete)*** * ***(Maybe)* Fake livestream chat overlay, with dynamic reactions to all sorts of stuff** * **Replace all hitscan with *"light projectiles"*** -* **Leaning and a lot of other stuff involving ViewAngles and ViewPos** * **Customized cluster text stuff if that ever gets scriptified** * **Crouch sliding *(+ proper crouch dashing)*** * **More items:** @@ -70,23 +69,10 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after - Angel of Death *(Total Destruction / SWWM Platinum Ep2)* - Black Matter Armor *(SWWM / UnSX 3)* - Satellite *(Total Destruction)* -* **Additional grenades *(replaces clips)*:** - - Cyrus POW Grenades *(UnSX 4)* - - Z-Bomb *(UnSX 3)* - - Dr. Locke's Burrow Bombs *(SWWM Platinum Ep2 / UnSX 5)* - - Vacuum Bomb *(SWWM Platinum)* - - Cryptek Blast Charge *(Ultra Suite)* - - U-Bomb *(UnSX 4)* -* **Additional ammo types:** - - Yellow shell - Dyratin charge *(Plasma slug)* - - Pink shell - Micro-grenade *(What it says on the tin)* - - Blue rocket - Hellblazer Torturer *(Nail bomb)* - - White rocket - Hellblazer Subjugator *(Stun bomb)* * **Expand third person animations** - 4-directional movement variants - Height-dependent headpats (current animation was designed for dogs on same floor) * **Additional gestures + gesture menu** - - Dab (loud and bassy, alerts monsters) - Airhorn (unlimited range A_AlertMonsters, to unbreak vanilla teleport closets) - Clap - The Bird @@ -95,7 +81,6 @@ This is just a bit of *"future planning"* for stuff that I ***might*** add after - Heart - Shrug - Beckon - - Facepalm * **DLC Gameset:** - Tetris - Pong diff --git a/README.md b/README.md index c5a6a4a7c..32e2a823d 100644 --- a/README.md +++ b/README.md @@ -172,9 +172,9 @@ Little bundles of fun (in hot lead form) found either as single units (sometimes Another signature weapon of the **SWWM** series. This time in its third and far more improved revision. -**Primary fire:** Shoot a hot flaming rocket straight ahead. +**Primary fire:** Shoot a hot flaming rocket straight ahead. Hold to load up to 2 additional rockets, then release for burst fire. -**Secondary fire:** Lob the rocket as a grenade that will bounce around. +**Secondary fire:** Lob the rocket as a grenade that will bounce around. Hold to load up to 2 additional grenades, then release for burst fire. **Tertiary fire (Zoom):** Change the ammo type, there are four options (see ammo section below). diff --git a/graphics/HUD/HellblazerCrackshotLock.png b/graphics/HUD/HellblazerCrackshotLock.png new file mode 100644 index 0000000000000000000000000000000000000000..ae1d4354b047985df209915f2cb2512dc51d7808 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd7G?$phPQVgfdu3Nd_r77g7S>gwk(RQjH>aR zCT${iiw=5Rz7qkdVNekdTnbAgI8{>>;6YmLZJe$^nLJTqaBh8@vyS m9^QJGwe$&= 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 L`OEv|K6$JFH_Yx| literal 0 HcmV?d00001 diff --git a/sounds/hellblazer/blaze_lock.ogg b/sounds/hellblazer/blaze_lock.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a45d1dc2d5817f8ae626b6a4b1a3731e20103737 GIT binary patch literal 3239 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 lastammo; int spinskipped; HellblazerXSub pickuprockets[6]; + int preload; // additional loaded missiles (up to 2) + Actor seektarget[3]; + int seekcnt; + int preloadcnt; Property ClipCount : clipcount; - transient ui TextureID WeaponBox, AmmoIcon[4], LoadedIcon[4]; + transient ui TextureID WeaponBox, AmmoIcon[4], LoadedIcon[4], LockIcon[4]; transient ui Font TewiFont; + transient ui SWWMProjectionData projdata; + + override void RenderUnderlay( RenderEvent e ) + { + static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; + if ( !LockIcon[0] ) + { + LockIcon[0] = TexMan.CheckForTexture("graphics/HUD/HellblazerMissileLock.png",TexMan.Type_Any); + LockIcon[1] = TexMan.CheckForTexture("graphics/HUD/HellblazerCrackshotLock.png",TexMan.Type_Any); + LockIcon[2] = TexMan.CheckForTexture("graphics/HUD/HellblazerRavagerLock.png",TexMan.Type_Any); + LockIcon[3] = TexMan.CheckForTexture("graphics/HUD/HellblazerWarheadLock.png",TexMan.Type_Any); + } + int curtype = 0; + for ( int i=0; i<4; i++ ) + { + if ( loadammo != types[i] ) continue; + curtype = i; + break; + } + SWWMUtility.PrepareProjData(projdata,e.ViewPos,e.ViewAngle,e.ViewPitch,e.ViewRoll,players[consoleplayer].fov); + int cliptop = projdata.viewy, clipbottom = projdata.viewy+projdata.viewh, + clipleft = projdata.viewx, clipright = projdata.viewx+projdata.vieww; + Vector2 hs; + if ( swwm_hudscale <= 0 ) hs = StatusBar.GetHUDScale(); + else hs.x = swwm_hudscale; + hs.y = hs.x; + Vector2 ss = (Screen.GetWidth()/hs.x,Screen.GetHeight()/hs.y); + for ( int i=0; i<3; i++ ) + { + if ( !seektarget[i] ) continue; + Vector3 tpos = seektarget[i].prev*(1.-e.FracTic)+seektarget[i].pos*e.FracTic; + Vector3 ndc = SWWMUtility.ProjectPoint(projdata,e.viewpos+level.Vec3Diff(e.viewpos,tpos+(0,0,seektarget[i].Height/2))); + if ( ndc.z > 1. ) continue; + Vector2 vpos = SWWMUtility.NDCToViewport(projdata,ndc); + Screen.DrawTexture(LockIcon[curtype],false,vpos.x/hs.x,vpos.y/hs.y,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_CenterOffset,true,DTA_ClipTop,cliptop,DTA_ClipBottom,clipbottom,DTA_ClipLeft,clipleft,DTA_ClipRight,clipright); + } + } override void DrawWeapon( double TicFrac, double bx, double by, Vector2 hs, Vector2 ss ) { @@ -148,7 +189,7 @@ Class Hellblazer : SWWMWeapon xx = -54; for ( int i=0; i<6; i++ ) { - Screen.DrawTexture(LoadedIcon[0],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); + Screen.DrawTexture(LoadedIcon[0],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); xx += 9; } break; @@ -156,7 +197,7 @@ Class Hellblazer : SWWMWeapon xx = -49; for ( int i=0; i<3; i++ ) { - Screen.DrawTexture(LoadedIcon[1],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); + Screen.DrawTexture(LoadedIcon[1],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); xx += 18; } break; @@ -164,7 +205,7 @@ Class Hellblazer : SWWMWeapon xx = -49; for ( int i=0; i<3; i++ ) { - Screen.DrawTexture(LoadedIcon[2],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); + Screen.DrawTexture(LoadedIcon[2],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); xx += 18; } break; @@ -172,7 +213,7 @@ Class Hellblazer : SWWMWeapon xx = -45; for ( int i=0; i<2; i++ ) { - Screen.DrawTexture(LoadedIcon[3],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,(i==magpos)?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); + Screen.DrawTexture(LoadedIcon[3],false,bx+xx,by+yy,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ColorOverlay,((i<=magpos)&&(i>=(magpos-preload)))?magstate[i]?Color(192,0,0,0):Color(0,0,0,0):magstate[i]?Color(224,0,0,0):Color(96,0,0,0),DTA_Desaturate,magstate[i]?192:0); xx += 27; } break; @@ -213,7 +254,7 @@ Class Hellblazer : SWWMWeapon A_BumpFOV(bAlt?.96:.93); A_PlayerFire(); invoker.clipcount = max(0,invoker.clipcount-1); - invoker.magstate[invoker.magpos] = true; + invoker.magstate[invoker.magpos-invoker.preload] = true; invoker.spinskipped++; Vector3 x, y, z, x2, y2, z2, dir, origin; double a, s; @@ -226,6 +267,9 @@ Class Hellblazer : SWWMWeapon dir = (x2+y2*cos(a)*s+z2*sin(a)*s).unit(); let p = Spawn(projs[type+4*bAlt],origin); p.target = self; + int tidx = max(0,invoker.seekcnt-(invoker.preload+1)); + if ( invoker.seektarget[tidx] ) HellblazerMissile(p).seektarget = invoker.seektarget[tidx]; + if ( invoker.preload <= 0 ) for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; p.angle = atan2(dir.y,dir.x); p.pitch = asin(-dir.z); p.vel = dir*p.speed; @@ -373,7 +417,7 @@ Class Hellblazer : SWWMWeapon action void A_ZoomHold() { - A_WeaponReady(WRF_NOFIRE); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); if ( player.cmd.buttons&BT_ZOOM ) return; player.SetPSPrite(PSP_WEAPON,invoker.FindState("Ready")); } @@ -435,9 +479,14 @@ Class Hellblazer : SWWMWeapon { static const Class types[] = {"HellblazerMissiles","HellblazerCrackshots","HellblazerRavagers","HellblazerWarheads"}; static const int magcap[] = {6,3,3,2}; + for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; for ( int i=0; i<4; i++ ) { if ( invoker.loadammo != types[i] ) continue; + // check preloaded rockets first (note, this theoretically would never go below zero) + invoker.magpos = max(0,invoker.magpos-invoker.preload); + invoker.preload = 0; + // do the spin invoker.magpos = (invoker.magpos+invoker.spinskipped)%magcap[i]; invoker.spinskipped = 0; break; @@ -470,6 +519,70 @@ Class Hellblazer : SWWMWeapon SetState(SpawnState+curtype+1); } + action void A_CheckLockOn() + { + if ( invoker.seekcnt > invoker.preload ) return; + Vector3 x, y, z, x2, y2, z2, dir; + [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + Vector3 origin = level.Vec3Offset(Vec2OffsetZ(0,0,player.viewz),10*x); + // try to catch target in cone of vision + [x2, y2, z2] = swwm_CoordUtil.GetAxes(pitch,angle,roll); + Array hits; + hits.Clear(); + int rings = 1; + FLineTraceData d; + for ( double i=0; i<.1; i+=.02 ) + { + for ( int j=0; j<360; j+=(360/rings) ) + { + dir = (x2+y2*cos(j)*i+z2*sin(j)*i).unit(); + 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; + if ( (d.HitActor == invoker.seektarget[0]) + || (d.HitActor == invoker.seektarget[1]) + || (d.HitActor == invoker.seektarget[2]) ) continue; + if ( !d.HitActor.bISMONSTER && !(d.HitActor is 'BossBrain') && !d.HitActor.player ) + continue; + if ( d.HitActor.IsFriend(self) ) continue; + bool addme = true; + for ( int k=0; k= 10 ) + { + invoker.preloadcnt = 0; + return A_JumpByAmmoType("PreLoad_1","PreLoad_2","PreFire_3","PreFire_4","Ready_G"); + } + return ResolveState(null); + } return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); } + Wait; Fire_1: XZW2 A 1 A_HellblazerFire(0); XZW2 QRSTUVW 2; + XZW2 A 0 + { + // chain-fire + if ( invoker.preload > 0 ) + { + invoker.preload--; + invoker.spinskipped--; + return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + } + return ResolveState(null); + } Goto Cycle_1; Fire_2: XZW6 V 1 A_HellblazerFire(1); XZW7 LMNOPQR 2; + XZW6 V 0 + { + // chain-fire + if ( invoker.preload > 0 ) + { + invoker.preload--; + invoker.spinskipped--; + return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + } + return ResolveState(null); + } Goto Cycle_2; Fire_3: XZWB T 1 A_HellblazerFire(2); @@ -614,23 +767,63 @@ Class Hellblazer : SWWMWeapon XZWM IJKLMNO 2; Goto Ready_G; // state jump to cycling is done elsewhere AltFire: - XZW2 A 0 + #### # 0 + { + invoker.preloadcnt = 0; + invoker.preload = 0; + } + #### # 1 { if ( invoker.clipcount <= 0 ) { if ( CountInv(invoker.nextammo) <= 0 ) A_PickNextAmmo(); return A_JumpByAmmoType("Unload_1","Unload_2","Unload_3","Unload_4","Unload_G"); } + if ( player.cmd.buttons&BT_ALTATTACK ) + { + if ( (player.cmd.buttons&BT_ATTACK) || (invoker.clipcount < 2) ) + return A_JumpByAmmoType("PreAltFire_1","PreAltFire_2","PreAltFire_3","PreAltFire_4","Ready_G"); + invoker.preloadcnt++; + if ( invoker.preloadcnt >= 10 ) + { + invoker.preloadcnt = 0; + return A_JumpByAmmoType("PreAltLoad_1","PreAltLoad_2","PreAltFire_3","PreAltFire_4","Ready_G"); + } + return ResolveState(null); + } return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); } + Wait; AltFire_1: XZW2 A 1 A_HellblazerFire(0,true); XZW2 XYZ 2; XZW3 ABCD 2; + XZW2 A 0 + { + // chain-fire + if ( invoker.preload > 0 ) + { + invoker.preload--; + invoker.spinskipped--; + return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + } + return ResolveState(null); + } Goto Cycle_1; AltFire_2: XZW6 V 1 A_HellblazerFire(1,true); XZW7 STUVWXY 2; + XZW6 V 0 + { + // chain-fire + if ( invoker.preload > 0 ) + { + invoker.preload--; + invoker.spinskipped--; + return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + } + return ResolveState(null); + } Goto Cycle_2; AltFire_3: XZWB T 1 A_HellblazerFire(2,true); @@ -644,6 +837,264 @@ Class Hellblazer : SWWMWeapon XZWL S 1; XZWM PQRSTUV 2; Goto Ready_G; // state jump to cycling is done elsewhere + PreLoad_1: + XZW2 A 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 A 2 + { + invoker.spinskipped--; + invoker.magpos = (invoker.magpos+1)%6; + invoker.preload++; + A_GlassOverlay("Cycle_G1"); + } + XZW3 E 2; + XZW3 FGHI 2; + XZW3 I 0; + XZW3 FE 2; + XZW2 A 1 + { + if ( !(player.cmd.buttons&BT_ATTACK) ) + return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + if ( (player.cmd.buttons&BT_ALTATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) ) + return A_JumpByAmmoType("PreFire_1","PreFire_2","PreFire_3","PreFire_4","Ready_G"); + return ResolveState("PreLoad_1"); + } + Wait; + PreLoad_2: + XZW6 V 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP); + XZW6 V 2 + { + invoker.spinskipped--; + invoker.magpos = (invoker.magpos+1)%3; + invoker.preload++; + A_GlassOverlay("Cycle_G2"); + } + XZW7 Z 2; + XZW8 ABCDEFG 2; + XZW8 G 0; + XZW8 A 2; + XZW7 Z 2; + XZW6 V 1 + { + if ( !(player.cmd.buttons&BT_ATTACK) ) + return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + if ( (player.cmd.buttons&BT_ALTATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) ) + return A_JumpByAmmoType("PreFire_1","PreFire_2","PreFire_3","PreFire_4","Ready_G"); + return ResolveState("PreLoad_2"); + } + Wait; + PreAltLoad_1: + XZW2 A 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP); + XZW2 A 2 + { + invoker.spinskipped--; + invoker.magpos = (invoker.magpos+1)%6; + invoker.preload++; + A_GlassOverlay("Cycle_G1"); + } + XZW3 E 2; + XZW3 FGHI 2; + XZW3 I 0; + XZW3 FE 2; + XZW2 A 1 + { + if ( !(player.cmd.buttons&BT_ALTATTACK) ) + return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + if ( (player.cmd.buttons&BT_ATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) ) + return A_JumpByAmmoType("PreAltFire_1","PreAltFire_2","PreAltFire_3","PreAltFire_4","Ready_G"); + return ResolveState("PreAltLoad_1"); + } + Wait; + PreAltLoad_2: + XZW6 V 10 A_StartSound("hellblazer/preload",CHAN_WEAPON,CHANF_OVERLAP); + XZW6 V 2 + { + invoker.spinskipped--; + invoker.magpos = (invoker.magpos+1)%3; + invoker.preload++; + A_GlassOverlay("Cycle_G2"); + } + XZW7 Z 2; + XZW8 ABCDEFG 2; + XZW8 G 0; + XZW8 A 2; + XZW7 Z 2; + XZW6 V 1 + { + if ( !(player.cmd.buttons&BT_ALTATTACK) ) + return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + if ( (player.cmd.buttons&BT_ATTACK) || (invoker.preload >= min(invoker.clipcount-1,2)) ) + return A_JumpByAmmoType("PreAltFire_1","PreAltFire_2","PreAltFire_3","PreAltFire_4","Ready_G"); + return ResolveState("PreAltLoad_2"); + } + Wait; + PreFire_1: + XZW2 A 0 + { + invoker.seekcnt = 0; + } + XZW2 A 1 + { + if ( !(player.cmd.buttons&BT_ATTACK) ) + return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) + A_CheckLockOn(); + if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) + { + for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; + if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); + invoker.seekcnt = 0; + } + return ResolveState(null); + } + Wait; + PreFire_2: + XZW6 V 0 + { + invoker.seekcnt = 0; + } + XZW6 V 1 + { + if ( !(player.cmd.buttons&BT_ATTACK) ) + return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) + A_CheckLockOn(); + if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) + { + for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; + if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); + invoker.seekcnt = 0; + } + return ResolveState(null); + } + Wait; + PreFire_3: + XZWB T 0 + { + invoker.seekcnt = 0; + } + XZWB T 1 + { + if ( !(player.cmd.buttons&BT_ATTACK) ) + return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) + A_CheckLockOn(); + if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) + { + for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; + if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); + invoker.seekcnt = 0; + } + return ResolveState(null); + } + Wait; + PreFire_4: + XZWG R 0 + { + invoker.seekcnt = 0; + } + XZWG R 1 + { + if ( !(player.cmd.buttons&BT_ATTACK) ) + return A_JumpByAmmoType("Fire_1","Fire_2","Fire_3","Fire_4","Fire_G"); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) + A_CheckLockOn(); + if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) + { + for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; + if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); + invoker.seekcnt = 0; + } + return ResolveState(null); + } + Wait; + PreAltFire_1: + XZW2 A 0 + { + invoker.seekcnt = 0; + } + XZW2 A 1 + { + if ( !(player.cmd.buttons&BT_ALTATTACK) ) + return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) + A_CheckLockOn(); + if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) + { + for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; + if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); + invoker.seekcnt = 0; + } + return ResolveState(null); + } + Wait; + PreAltFire_2: + XZW6 V 0 + { + invoker.seekcnt = 0; + } + XZW6 V 1 + { + if ( !(player.cmd.buttons&BT_ALTATTACK) ) + return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) + A_CheckLockOn(); + if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) + { + for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; + if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); + invoker.seekcnt = 0; + } + return ResolveState(null); + } + Wait; + PreAltFire_3: + XZWB T 0 + { + invoker.seekcnt = 0; + } + XZWB T 1 + { + if ( !(player.cmd.buttons&BT_ALTATTACK) ) + return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) + A_CheckLockOn(); + if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) + { + for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; + if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); + invoker.seekcnt = 0; + } + return ResolveState(null); + } + Wait; + PreAltFire_4: + XZWG R 0 + { + invoker.seekcnt = 0; + } + XZWG R 1 + { + if ( !(player.cmd.buttons&BT_ALTATTACK) ) + return A_JumpByAmmoType("AltFire_1","AltFire_2","AltFire_3","AltFire_4","AltFire_G"); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); + if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) + A_CheckLockOn(); + if ( (player.cmd.buttons&BT_RELOAD) && !(player.oldbuttons&BT_RELOAD) ) + { + for ( int i=0; i<3; i++ ) invoker.seektarget[i] = null; + if ( invoker.seekcnt > 0 ) A_StartSound("hellblazer/clear",CHAN_WEAPON,CHANF_OVERLAP); + invoker.seekcnt = 0; + } + return ResolveState(null); + } + Wait; Cycle_1: XZW2 A 2 { @@ -849,7 +1300,7 @@ Class Hellblazer : SWWMWeapon #### # 1 { A_PickNextAmmo(); - A_WeaponReady(WRF_NOFIRE); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); } #### # 1 A_ZoomHold(); Wait; diff --git a/zscript/weapons/swwm_blazeit_fx.zsc b/zscript/weapons/swwm_blazeit_fx.zsc index 2a12dc361..8f4b3218b 100644 --- a/zscript/weapons/swwm_blazeit_fx.zsc +++ b/zscript/weapons/swwm_blazeit_fx.zsc @@ -236,6 +236,8 @@ Class HellblazerFlare : Actor Class HellblazerMissile : Actor { int deto; + Actor seektarget; + Vector3 InitialDir, Acceleration; Default { @@ -281,12 +283,38 @@ Class HellblazerMissile : Actor let t = Spawn("HellblazerTrail",level.Vec3Offset(pos,-vel.unit()*i+traildir*3)); t.vel = traildir*4.; } + if ( InitialDir.length() < double.epsilon ) InitialDir = vel.unit(); + vel += Acceleration/GameTicRate; + Vector3 dir = vel.unit(); + if ( vel.length() > 50. ) vel = dir*50.; } if ( deto > 1 ) { ExplodeMissile(); return; } + if ( seektarget ) + { + // seek tracer + if ( SWWMUtility.SphereIntersect(seektarget,level.Vec3Offset(pos,vel),bNOGRAVITY?50:90) ) + { + deto++; + tracer = seektarget; + return; + } + if ( bNOGRAVITY ) + { + Vector3 SeekingDir = level.Vec3Diff(pos,seektarget.Vec3Offset(0,0,seektarget.height/2)).unit(); + if ( SeekingDir dot InitialDir > -1 ) + { + double MagnitudeVel = Vel.length(); + SeekingDir = (SeekingDir*.25*MagnitudeVel+Vel).unit(); + Vel = MagnitudeVel*SeekingDir; + Acceleration = 25*SeekingDir; + } + } + return; + } // proximity check let bt = BlockThingsIterator.Create(self,200); while ( bt.Next() ) @@ -781,6 +809,16 @@ Mixin Class HellblazerGrenade rollvel = FRandom[Hellblazer](-16,16); anglevel = FRandom[Hellblazer](-16,16); pitchvel = FRandom[Hellblazer](-16,16); + // steer towards seek target + if ( seektarget ) + { + Vector3 dirto = level.Vec3Diff(pos,seektarget.Vec3Offset(0,0,seektarget.Height/2)); + dirto /= dirto.length(); + dirto.z += .1; + double spd = vel.length(); + vel /= spd; + vel = (vel*.3+dirto*.7)*spd; + } } States { @@ -950,7 +988,7 @@ Class HellblazerClusterMini : HellblazerMissile2 if ( !whomst ) return; Vector3 dirto = level.Vec3Diff(pos,whomst.Vec3Offset(0,0,whomst.Height/2)); dirto /= dirto.length(); - dirto.z += .3; + dirto.z += .1; double spd = vel.length(); vel /= spd; vel = (vel*.3+dirto*.7)*spd; diff --git a/zscript/weapons/swwm_shot.zsc b/zscript/weapons/swwm_shot.zsc index 9e7014377..dc643e957 100644 --- a/zscript/weapons/swwm_shot.zsc +++ b/zscript/weapons/swwm_shot.zsc @@ -761,12 +761,12 @@ Class Spreadgun : SWWMWeapon } if ( invoker.nextammo != types[next] ) A_StartSound("misc/invchange",CHAN_WEAPONEXTRA,CHANF_UI|CHANF_LOCAL); invoker.nextammo = types[next]; - A_WeaponReady(WRF_NOFIRE); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); } action void A_AltHold() { - A_WeaponReady(WRF_NOFIRE); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); // tap fire to unload round if ( invoker.chambered && (player.cmd.buttons&BT_ATTACK) ) { diff --git a/zscript/weapons/swwm_thiccboolet.zsc b/zscript/weapons/swwm_thiccboolet.zsc index 81dda9fd2..dc2b049b4 100644 --- a/zscript/weapons/swwm_thiccboolet.zsc +++ b/zscript/weapons/swwm_thiccboolet.zsc @@ -828,11 +828,11 @@ Class SilverBullet : SWWMWeapon else if ( !invoker.fcbselected && ((invoker.Ammo2.Amount > 0) || (CountInv("SilverBullets2") > 0)) ) invoker.fcbselected = (ifempty&&((invoker.Ammo1.Amount>0)||(CountInv("SilverBullets")>0)))?false:true; if ( oldsel != invoker.fcbselected ) A_StartSound("misc/invchange",CHAN_WEAPONEXTRA,CHANF_UI|CHANF_LOCAL); - A_WeaponReady(WRF_NOFIRE); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); } action void A_AltHold() { - A_WeaponReady(WRF_NOFIRE); + A_WeaponReady(WRF_NOFIRE|WRF_NOSWITCH); // tap fire to unload round if ( player.cmd.buttons&BT_ATTACK ) {