// Itamex Reinforced Combat Hammer (from UnSX 5) // Slot 1, spawns shared with Deep Impact Class ItamexHammer : SWWMWeapon { double charge; int hitcnt, spintime; transient ui SmoothDynamicValueInterpolator ChargeInter; bool bSpinning, bFalling; override void HudTick() { Super.HudTick(); if ( !ChargeInter ) ChargeInter = SmoothDynamicValueInterpolator.Create(charge,.5); ChargeInter.Update(charge); } action State A_HammerHit( bool nojump = false ) { Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); SWWMUtility.DoKnockback(self,x,120000.); if ( A_Melee(100,"itamex/hit",1.6,1.1,1.,MELEE_Rip|MELEE_FleshSound|MELEE_HammerHit) ) { A_BumpFOV(.9); A_QuakeEx(5.,5.,5.,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.35); A_AlertMonsters(swwm_uncapalert?0:800); return nojump?ResolveState(null):ResolveState('FireHit'); } A_BumpFOV(.95); A_QuakeEx(.5,.5,.5,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); return ResolveState(null); } action void A_HammerAltHit() { Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); SWWMUtility.DoKnockback(self,x,3000.*invoker.charge); if ( A_Melee(int(100+invoker.charge*2.),"itamex/hit",2.,1.1,1.2,MELEE_Rip|MELEE_FleshSound|MELEE_HammerHit|MELEE_Vertical|MELEE_ExtraWide|MELEE_ForceBust) ) { A_BumpFOV(.9); A_QuakeEx(5.,5.,5.,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.35); A_AlertMonsters(swwm_uncapalert?0:800); return; } A_BumpFOV(.95); A_QuakeEx(.5,.5,.5,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); } action void A_HammerAltFallHit() { Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); if ( vel.z > -25 ) vel.z = max(-25.,vel.z-4.); if ( invoker.hitcnt > 0 ) invoker.hitcnt--; else if ( A_Melee(int(100+invoker.charge*2.),"itamex/hit",2.,1.1,1.2,MELEE_Rip|MELEE_FleshSound|MELEE_HammerHit|MELEE_Vertical|MELEE_ExtraWide|MELEE_ForceBust) ) { A_BumpFOV(.9); A_QuakeEx(5.,5.,5.,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.35); A_AlertMonsters(swwm_uncapalert?0:800); A_WeaponOffset(0,-64,WOF_ADD|WOF_INTERPOLATE); SWWMUtility.DoKnockback(self,-(x.x,x.y,x.z*.1),1500.*invoker.charge); invoker.hitcnt = 3; return; } } override void DoEffect() { Super.DoEffect(); if ( !Owner && !Owner.player && (Owner.player.ReadyWeapon != self) ) return; let psp = Owner.player.FindPSprite(PSP_WEAPON); if ( !psp ) return; if ( bSpinning ) psp.x += charge*.05; psp.x *= .8; psp.y = (psp.y-32.)*.8+32.; } action void A_ChargeUp() { A_SetAngle(angle+invoker.charge*.2,SPF_INTERPOLATE); A_SetPitch(pitch*.9,SPF_INTERPOLATE); invoker.charge = min(100.,invoker.charge+20.); invoker.bSpinning = true; if ( !IsActorPlayingSound(CHAN_WEAPONEXTRA,"itamex/spin") ) A_StartSound("itamex/spin",CHAN_WEAPONEXTRA,CHANF_LOOP,.2); A_SoundVolume(CHAN_WEAPONEXTRA,(invoker.charge/100.)**.5); A_BumpFOV(1.+invoker.charge*.001); Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); SWWMUtility.DoKnockback(self,x,500.*invoker.charge); invoker.hitcnt = 0; invoker.spintime = 0; } action void A_SpinReact() { if ( Random[Demolitionist](0,1) ) return; if ( SWWMHandler.AddOneliner("spinning",2,5) ) Demolitionist(self).facegrin = true; } action State A_SpinMove() { A_SetAngle(angle+invoker.charge*.4,SPF_INTERPOLATE); A_SetPitch(pitch*.9,SPF_INTERPOLATE); invoker.charge = max(30.,invoker.charge-2.); if ( (player.cmd.buttons&BT_ZOOM) && !(player.oldbuttons&BT_ZOOM) ) invoker.charge = min(100.,invoker.charge+20.); A_SoundVolume(CHAN_WEAPONEXTRA,(invoker.charge/100.)**.5); A_BumpFOV(1.+invoker.charge*.001); Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); SWWMUtility.DoKnockback(self,(x.x,x.y,x.z*.1),1500.*invoker.charge); if ( vel.z < 0 ) vel.z *= 1.-invoker.charge*.008; A_QuakeEx(.5,.5,.5,15,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); A_PlayerFire(); invoker.spintime++; if ( invoker.hitcnt > 0 ) invoker.hitcnt--; else if ( A_Melee(int(100+invoker.charge*1.5),"itamex/hit",2.4,2.,1.1,MELEE_Rip|MELEE_FleshSound|MELEE_ExtraWide|MELEE_HammerHit) ) { A_BumpFOV(.9); A_QuakeEx(5.,5.,5.,20,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.35); A_AlertMonsters(swwm_uncapalert?0:800); A_WeaponOffset(32,0,WOF_ADD|WOF_INTERPOLATE); SWWMUtility.DoKnockback(self,-(x.x,x.y,x.z*.1),4500.*invoker.charge); invoker.hitcnt = 3; } if ( invoker.charge <= 30. ) { A_StartSound("itamex/swing",CHAN_WEAPON,CHANF_OVERLAP); invoker.bSpinning = false; return ResolveState('ZoomEnd'); } return ResolveState(null); } action void A_ChargeDown() { A_SetAngle(angle+invoker.charge*.6,SPF_INTERPOLATE); A_SetPitch(pitch*.9,SPF_INTERPOLATE); A_SoundVolume(CHAN_WEAPONEXTRA,(invoker.charge/100.)**.5); invoker.charge = max(0.,invoker.charge-6.); A_WeaponOffset(-16,0,WOF_ADD|WOF_INTERPOLATE); A_BumpFOV(1.+invoker.charge*.001); Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); SWWMUtility.DoKnockback(self,x,4000.*invoker.charge); if ( invoker.charge <= 0 ) A_StopSound(CHAN_WEAPONEXTRA); } action void A_AltCharge() { A_CanBob(); invoker.charge = min(100.,invoker.charge+SWWMUtility.Lerp(4.,.5,(invoker.charge/100.)**.25)); double vibe = (invoker.charge/100.)**2.; A_WeaponOffset(FRandom[Hammer](-.5,.5)*vibe,32+FRandom[Hammer](-.5,.5)*vibe,WOF_INTERPOLATE); } action State A_AltHold() { A_CanBob(); invoker.charge = min(100.,invoker.charge+SWWMUtility.Lerp(4.,.5,(invoker.charge/100.)**.25)); double vibe = (invoker.charge/100.)**2.; A_WeaponOffset(FRandom[Hammer](-.5,.5)*vibe,32+FRandom[Hammer](-.5,.5)*vibe,WOF_INTERPOLATE); if ( !(player.cmd.buttons&BT_ALTATTACK) ) { A_WeaponOffset(0,32,WOF_INTERPOLATE); return ResolveState('AltRelease'); } return ResolveState(null); } action void A_AltRelease() { Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); SWWMUtility.DoKnockback(self,x-(0,0,3.),120000.); A_BumpFOV(.9); A_StartSound("itamex/drop",CHAN_WEAPONEXTRA2); A_StartSound("itamex/drop",CHAN_WEAPONEXTRA3); } action void A_AltHit() { // stop extended fall invoker.bFalling = false; A_StopSound(CHAN_WEAPONEXTRA); A_WeaponOffset(0,32,WOF_INTERPOLATE); if ( (pos.z <= floorz+16) && (pitch > -15) ) { A_StopSound(CHAN_WEAPONEXTRA2); A_StopSound(CHAN_WEAPONEXTRA3); A_StartSound("itamex/slam",CHAN_WEAPON,CHANF_OVERLAP); A_StartSound("itamex/slam",CHAN_WEAPON,CHANF_OVERLAP); vel.z += invoker.charge*.03; A_BumpFOV(.85); A_QuakeEx(8.,8.,8.,10,0,1,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:1.); A_AlertMonsters(swwm_uncapalert?0:2500); let s = Spawn('HammerShockwave',(pos.x,pos.y,floorz)); s.target = self; s.special1 = int(invoker.charge*3); } invoker.charge = 0.; } override void OwnerDied() { Super.OwnerDied(); A_StopSound(CHAN_WEAPONEXTRA); charge = 0.; } override void Travelled() { Super.Travelled(); A_StopSound(CHAN_WEAPONEXTRA); charge = 0.; } override void MarkPrecacheSounds() { Super.MarkPrecacheSounds(); MarkSound("itamex/select"); MarkSound("itamex/deselect"); MarkSound("itamex/meleestart"); MarkSound("itamex/meleeend"); MarkSound("itamex/swing1"); MarkSound("itamex/swing2"); MarkSound("itamex/swing3"); MarkSound("itamex/hit1"); MarkSound("itamex/hit2"); MarkSound("itamex/hit3"); MarkSound("itamex/hitf1"); MarkSound("itamex/hitf2"); MarkSound("itamex/hitf3"); MarkSound("itamex/drop"); MarkSound("itamex/slam"); MarkSound("itamex/spin"); } Default { Tag "$T_HAMMER"; Inventory.Icon "graphics/HUD/Icons/W_ItamexHammer.png"; Inventory.PickupMessage "$I_HAMMER"; Obituary "$O_HAMMER"; SWWMWeapon.Tooltip "$TT_HAMMER"; SWWMWeapon.GetLine "getitamexhammer"; Weapon.SlotNumber 1; Weapon.SlotPriority 2.; Weapon.SelectionOrder 1200; Weapon.UpSound "itamex/select"; Stamina 9000; +WEAPON.MELEEWEAPON; } States { Spawn: XZW1 A -1; Stop; Select: XZW2 I 3 A_FullRaise(); XZW2 JK 3 A_BumpView(-.1,tics:3); XZW2 LMNO 2 A_BumpView(.2,tics:2); XZW2 PQRST 3; Goto Ready; Ready: XZW2 A 0 { } XZW2 A 1 { // ensure we're back to normal just in case A_StopSound(CHAN_WEAPONEXTRA); invoker.bSpinning = false; invoker.bFalling = false; A_WeaponOffset(0,32,WOF_INTERPOLATE); A_WeaponReady(WRF_ALLOWRELOAD|WRF_ALLOWZOOM|WRF_ALLOWUSER1); } Wait; Fire: XZW2 A 2 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); XZW2 UVWXYZ 1 A_BumpAngle(-1); XZW3 A 1 { A_StartSound("itamex/swing",CHAN_WEAPON,CHANF_OVERLAP); A_PlayerMelee(); } XZW3 BCDE 1 A_BumpAngle(4); XZW3 F 1 A_HammerHit(); XZW3 GHIJK 2; XZW3 L 2 A_StartSound("itamex/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW3 MNOPQR 2; Goto Ready; FireHit: XZW3 F 2; XZW3 STUVW 2; XZW3 XYZ 1; XZW4 A 2; XZW4 B 2 A_StartSound("itamex/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.42); XZW4 C 2; Goto Ready; AltFire: XZW2 A 2 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); XZW4 DEFG 2 { A_BumpView(.4,tics:2); A_AltCharge(); } XZW4 HIJKLMN 1 { A_BumpView(-.2); A_AltCharge(); } XZW4 OPQRSTU 1 A_AltCharge(); XZW4 V 1 A_AltHold(); Wait; AltRelease: XZW4 V 1 A_AltRelease(); XZW4 WXYZ 1 A_BumpView(2.); XZW5 A 1 A_BumpView(3.); XZW5 B 1 { if ( !player.onground && (pos.z > floorz+32) && (vel.z < 0) ) { invoker.hitcnt = 0; invoker.bFalling = true; A_StartSound("itamex/spin",CHAN_WEAPONEXTRA,CHANF_LOOP); return ResolveState('AltFall'); } A_BumpView(3.); A_HammerAltHit(); return ResolveState(null); } AltReleaseStop: XZW5 CD 1 A_BumpView(4.); XZW5 E 1 A_AltHit(); XZW5 FGHIJKLMN 2; XZW5 O 2 A_StartSound("itamex/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW5 PQRS 2; XZW5 TUVW 3; Goto Ready; AltFall: XZW5 B 1 { A_BumpView(3.); A_HammerAltFallHit(); return A_JumpIf(player.onground,1); } Wait; XZW5 B 1; Goto AltReleaseStop; Zoom: XZW2 A 2 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); XZW5 XYZ 2 A_BumpAngle(-2,tics:2); XZW6 ABCDEF 1 A_ChargeUp(); XZW6 G 0 A_SpinReact(); XZW6 G 1 A_SpinMove(); Wait; ZoomEnd: XZW6 GHIJ 1 { A_ChargeDown(); A_BumpAngle(10); } XZW6 K 1 { A_ChargeDown(); A_HammerHit(true); } XZW6 LM 1 A_ChargeDown(); XZW6 N 2 A_StartSound("itamex/meleeend",CHAN_WEAPON,CHANF_OVERLAP); XZW6 OPQRST 2; XZW6 UVW 3; Goto Ready; Reload: XZW2 A 2 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); XZW6 XYZ 2 A_BumpView(-.1,tics:2); XZW7 ABCDEF 2; XZW7 G 1 { A_PlayerCheckGun(); A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); A_StartSound("itamex/meleeend",CHAN_WEAPONEXTRA,pitch:.7,starttime:.2); } XZW7 HIJ 1 A_BumpView(-.05); XZW7 K 1 { A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); A_StartSound("itamex/meleeend",CHAN_WEAPONEXTRA,pitch:.8,starttime:.2); } XZW7 LMNO 1 A_BumpView(-.05); XZW7 P 1 { A_QuakeEx(.3,.3,.3,6,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.1); A_StartSound("itamex/meleeend",CHAN_WEAPONEXTRA,pitch:.9,starttime:.2); } XZW7 QRST 1 A_BumpView(-.05); XZW7 U 1 A_StopSound(CHAN_WEAPONEXTRA); XZW7 VWXYZ 1 A_BumpView(.05); XZW8 A 0 A_StartSound("itamex/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.42); XZW8 BCDE 3 A_BumpView(-.1,tics:3); XZW8 FGHI 2 A_BumpView(.05,tics:2); Goto Ready; User1: XZW2 A 1; XZW8 J 1 A_StartSound("itamex/meleestart",CHAN_WEAPON,CHANF_OVERLAP); XZW8 KLM 1; XZW8 N 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); XZW8 OPQ 2 A_BumpView(.5,tics:2); XZW8 R 1 { A_BumpFOV(.97); A_QuakeEx(1.,1.,1.,8,0,15,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); A_Parry(9); A_PlayerMelee(true); } XZW8 S 1 A_BumpView(-6); XZW8 T 3 A_Melee(50,"demolitionist/whitm",1.2,1.4); XZW8 UVWXYZ 2; XZW9 ABC 2; XZW9 D 1 A_StartSound("itamex/meleeend",CHAN_WEAPON,CHANF_OVERLAP,starttime:.42); XZW9 EFGH 1; XZW9 IJKL 2; Goto Ready; Deselect: XZW2 A 3 A_StartSound("itamex/deselect",CHAN_WEAPON,CHANF_OVERLAP); XZW2 BCD 3 A_BumpView(.1,tics:3); XZW2 EFGHI 2 A_BumpView(.2,tics:2); XZW2 J -1 A_FullLower(); Stop; } }