diff --git a/FuturePlans.md b/FuturePlans.md index fc47f3f30..0ab12f589 100644 --- a/FuturePlans.md +++ b/FuturePlans.md @@ -14,7 +14,7 @@ More weapons, because we need 'em. In addition, all the "easy to implement" mini - [4] Puntzer Gamma *(Ultra Suite 2)* - You Gained Brouzouf *(Unload an entire mag in fuller auto with the Puntzer Gamma without missing a single shot)* - [5] Sheen HMG *(SWWM Platinum Ep2)* - - Dakka *(Fire the Sheen HMG at 700 RPM for one minute straight)* + - Dakka *(Fire the Sheen HMG at 700 RPM for 30 seconds straight)* - [6] Quadravol *(UnSX)* - Gravely Roast *(Perform 50 bayonet combos with the Quadravol)* - [7] Sparkster x3 *(UnSX 2)* diff --git a/achievements.lst b/achievements.lst index 02ee63068..340a8940e 100644 --- a/achievements.lst +++ b/achievements.lst @@ -39,7 +39,7 @@ crush,0,no,any cybully,0,no,doom cum,500,yes,any dab,200,yes,any -dakka,60,no,any +dakka,30,yes,any #dbsucc,0,no,any deadeye,7,yes,any deva,10,yes,any diff --git a/language.def_base b/language.def_base index 5ccff18f7..e02e24187 100644 --- a/language.def_base +++ b/language.def_base @@ -1170,7 +1170,7 @@ SWWM_ACHIEVEMENT_CUM_TXT = "Melt a grand total of %d enemies with the Rafan-Kos" SWWM_ACHIEVEMENT_DAB_TAG = "HAHA DAB"; SWWM_ACHIEVEMENT_DAB_TXT = "Gib %d enemies with the Itamex Hammer"; SWWM_ACHIEVEMENT_DAKKA_TAG = "Dakka"; -SWWM_ACHIEVEMENT_DAKKA_TXT = "Keep firing the Sheen HMG at 700RPM for one minute straight"; +SWWM_ACHIEVEMENT_DAKKA_TXT = "Fire the Sheen HMG at 700RPM for %d seconds straight"; SWWM_ACHIEVEMENT_DEADEYE_TAG = "Deadeye"; SWWM_ACHIEVEMENT_DEADEYE_TXT = "Land %d consecutive Explodium Gun shots without missing"; SWWM_ACHIEVEMENT_DEVA_TAG = "Deva Station"; diff --git a/language.es_base b/language.es_base index 88b45da41..66af7cdc5 100644 --- a/language.es_base +++ b/language.es_base @@ -1022,7 +1022,7 @@ SWWM_ACHIEVEMENT_CYBULLY_TXT = "Mata a un Ciberdemonio con su propio cohete"; SWWM_ACHIEVEMENT_CUM_TAG = "Soltando Todo el Chorro"; SWWM_ACHIEVEMENT_CUM_TXT = "Melt a grand total of %d enemies with the Rafan-Kos"; SWWM_ACHIEVEMENT_DAB_TXT = "Revienta %d enemigos con el Mazo Itamex"; -SWWM_ACHIEVEMENT_DAKKA_TXT = "Mantén el disparo de la Ametralladora Sheen a 700RPM durante un minuto entero"; +SWWM_ACHIEVEMENT_DAKKA_TXT = "Dispara la Ametralladora Sheen a 700RPM durante %d segundos consecutivos"; SWWM_ACHIEVEMENT_DEADEYE_TAG = "En el Blanco"; SWWM_ACHIEVEMENT_DEADEYE_TXT = "Realiza %d disparos consecutivos con la Pistola de Explodium sin fallar"; SWWM_ACHIEVEMENT_DEVA_TXT = "Usa %d Marcas de Devastación"; diff --git a/language.version b/language.version index 8aa1736e9..7e5b89acc 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r194 \cu(Thu 21 Jul 22:01:41 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r194 \cu(2022-07-21 22:01:41)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r195 \cu(Fri 22 Jul 01:34:12 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r195 \cu(2022-07-22 01:34:12)\c-"; diff --git a/modeldef.sheenhmg b/modeldef.sheenhmg index ffe731e60..c5d867e2c 100644 --- a/modeldef.sheenhmg +++ b/modeldef.sheenhmg @@ -54,22 +54,139 @@ Model "HeavyMahSheenGun" FrameIndex XZW2 W 1 22 FrameIndex XZW2 X 1 23 // StartFire + FrameIndex XZW2 Z 1 25 // Tween from Still // SlowFireOne + FrameIndex XZW3 A 1 26 + FrameIndex XZW3 B 1 27 + FrameIndex XZW3 C 1 28 + FrameIndex XZW3 D 1 29 + FrameIndex XZW3 E 1 30 + FrameIndex XZW3 F 1 31 + FrameIndex XZW3 G 1 32 // Snap to StartFire // SlowFireTwo + FrameIndex XZW3 H 1 34 + FrameIndex XZW3 I 1 35 + FrameIndex XZW3 J 1 36 + FrameIndex XZW3 K 1 37 + FrameIndex XZW3 L 1 38 + FrameIndex XZW3 M 1 39 + FrameIndex XZW3 N 1 40 // Snap to StartFire // SlowFireThree + FrameIndex XZW3 O 1 42 + FrameIndex XZW3 P 1 43 + FrameIndex XZW3 Q 1 44 + FrameIndex XZW3 R 1 45 + FrameIndex XZW3 S 1 46 + FrameIndex XZW3 T 1 47 + FrameIndex XZW3 U 1 48 // Snap to StartFire // FastFireOne + FrameIndex XZW3 V 1 50 + FrameIndex XZW3 W 1 51 + FrameIndex XZW3 X 1 52 // Snap to StartFire // FastFireTwo + FrameIndex XZW3 Y 1 54 + FrameIndex XZW3 Z 1 55 + FrameIndex XZW4 A 1 56 // Snap to StartFire // FastFireThree + FrameIndex XZW4 B 1 58 + FrameIndex XZW4 C 1 59 + FrameIndex XZW4 D 1 60 // VERYFASTFIRE + FrameIndex XZW4 E 1 62 // 45 + FrameIndex XZW4 F 1 63 // 90 + FrameIndex XZW4 G 1 64 // 135 + FrameIndex XZW4 H 1 65 // 180 + FrameIndex XZW4 I 1 66 // 225 + FrameIndex XZW4 J 1 67 // 270 + FrameIndex XZW4 K 1 68 // 315 + FrameIndex XZW4 L 1 69 // 360 Snap back to previous frame // EndFireFAST7 + FrameIndex XZW4 M 1 70 // 315+ + FrameIndex XZW4 N 1 71 + FrameIndex XZW4 O 1 72 // Tween to Still // EndFireFAST6 + FrameIndex XZW4 P 1 74 // 270 + FrameIndex XZW4 Q 1 75 + FrameIndex XZW4 R 1 76 // Tween to Still // EndFireFAST5 + FrameIndex XZW4 S 1 78 // 225 + FrameIndex XZW4 T 1 79 + FrameIndex XZW4 U 1 80 // Tween to Still // EndFireFAST4 + FrameIndex XZW4 V 1 82 // 180 + FrameIndex XZW4 W 1 83 + FrameIndex XZW4 X 1 84 // Tween to Still // EndFireFAST3 + FrameIndex XZW4 Y 1 86 // 135 + FrameIndex XZW4 Z 1 87 + FrameIndex XZW5 A 1 88 // Tween to Still // EndFireFAST2 + FrameIndex XZW5 B 1 90 // 90 + FrameIndex XZW5 C 1 91 + FrameIndex XZW5 D 1 92 // Tween to Still // EndFireFAST1 + FrameIndex XZW5 E 1 94 // 45 + FrameIndex XZW5 F 1 95 + FrameIndex XZW5 G 1 96 // Tween to Still // SpeedUp + FrameIndex XZW5 H 1 98 // CrankIn + FrameIndex XZW5 I 1 99 + FrameIndex XZW5 J 1 100 + FrameIndex XZW5 K 1 101 // SpeedUp + FrameIndex XZW5 L 1 102 // CrankOut + FrameIndex XZW5 M 1 103 // Tween to Still // SlowDown + FrameIndex XZW5 N 1 105 // CrankIn + FrameIndex XZW5 O 1 106 + FrameIndex XZW5 P 1 107 + FrameIndex XZW5 Q 1 108 // SlowDown + FrameIndex XZW5 R 1 109 // CrankOut + FrameIndex XZW5 S 1 110 // Tween to Still // Idle + FrameIndex XZW5 T 1 112 // StartSnd + FrameIndex XZW5 U 1 113 + FrameIndex XZW5 V 1 114 + FrameIndex XZW5 W 1 115 + FrameIndex XZW5 X 1 116 + FrameIndex XZW5 Y 1 117 + FrameIndex XZW5 Z 1 118 + FrameIndex XZW6 A 1 119 + FrameIndex XZW6 B 1 120 // EndSnd + FrameIndex XZW6 C 1 121 + FrameIndex XZW6 D 1 122 + FrameIndex XZW6 E 1 123 + FrameIndex XZW6 F 1 124 + FrameIndex XZW6 G 1 125 + FrameIndex XZW6 H 1 126 + FrameIndex XZW6 I 1 127 + FrameIndex XZW6 J 1 128 + FrameIndex XZW6 K 1 129 + FrameIndex XZW6 L 1 130 // Melee + FrameIndex XZW6 M 1 132 // StartSnd + FrameIndex XZW6 N 1 133 + FrameIndex XZW6 O 1 134 + FrameIndex XZW6 P 1 135 + FrameIndex XZW6 Q 1 136 + FrameIndex XZW6 R 1 137 + FrameIndex XZW6 S 1 138 // Swing + FrameIndex XZW6 T 1 139 + FrameIndex XZW6 U 1 140 // Parry (6) + FrameIndex XZW6 V 1 141 + FrameIndex XZW6 W 1 142 // Melee + FrameIndex XZW6 X 1 143 + FrameIndex XZW6 Y 1 144 + FrameIndex XZW6 Z 1 145 + FrameIndex XZW7 A 1 146 + FrameIndex XZW7 B 1 147 + FrameIndex XZW7 C 1 148 // EndSnd + FrameIndex XZW7 D 1 149 + FrameIndex XZW7 E 1 150 + FrameIndex XZW7 F 1 151 + FrameIndex XZW7 G 1 152 + FrameIndex XZW7 H 1 153 + FrameIndex XZW7 I 1 154 + FrameIndex XZW7 J 1 155 + FrameIndex XZW7 K 1 156 + FrameIndex XZW7 L 1 157 } diff --git a/zscript/dlc1/swwm_dlcweapons_hud.zsc b/zscript/dlc1/swwm_dlcweapons_hud.zsc index e3417f6de..0f2028938 100644 --- a/zscript/dlc1/swwm_dlcweapons_hud.zsc +++ b/zscript/dlc1/swwm_dlcweapons_hud.zsc @@ -20,15 +20,38 @@ extend Class HeavyMahSheenGun else if ( firespeed == 1 ) for ( int i=0; i<3; i++ ) Screen.DrawTexture(SpeedTex,false,bx-21,(by-14)+i*4,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); else if ( firespeed == 2 ) for ( int i=0; i<5; i++ ) Screen.DrawTexture(SpeedTex,false,bx-21,(by-14)+i*2,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); // TODO heat bar - if ( fired ) + Screen.DrawText(NewConsoleFont,Font.CR_RED,64,64,String.Format("heat: %g\nshake: %g\nspread: %g\ntimer: %d",barrelheat,vibrate,aimerror,firetimer?((gametic-firetimer)/GameTicRate):0)); + bool isfired = !!fired; + double firefact = 0.; + if ( firespeed == 0 ) { - Screen.DrawTexture(BulletTex[1],false,bx-15,(by-10)-4*TicFrac,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); - if ( Ammo1.Amount <= 0 ) return; - Screen.DrawTexture(BulletTex[0],false,bx-15,(by-14)-4*TicFrac,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); + isfired = isfired&&((fired+7)>=gametic); + firefact = clamp((gametic+TicFrac)-fired,0.,7.)/7.; } - else for ( int i=0; i<2; i++ ) + else if ( firespeed == 1 ) { - if ( Ammo1.Amount <= i ) break; + isfired = isfired&&((fired+3)>=gametic); + firefact = clamp((gametic+TicFrac)-fired,0.,3.)/3.; + } + else if ( firespeed == 2 ) + { + isfired = isfired&&((fired+1)>=gametic); + firefact = TicFrac; + } + bool infammo = (sv_infiniteammo||Owner.FindInventory('PowerInfiniteAmmo',true)); + if ( isfired ) + { + Screen.DrawTexture(BulletTex[1],false,bx-15,(by-10)-4*firefact,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_Alpha,1.-firefact); + for ( int i=0; i<2; i++ ) + { + if ( !infammo && (Ammo1.Amount <= i) ) break; + Screen.DrawTexture(BulletTex[0],false,bx-15,(by-6)-4*firefact+i*4,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true,DTA_ClipBottom,int((by-2)*hs),DTA_Alpha,(i==0)?1.:firefact); + } + return; + } + for ( int i=0; i<2; i++ ) + { + if ( !infammo && (Ammo1.Amount <= i) ) break; Screen.DrawTexture(BulletTex[0],false,bx-15,(by-10)+i*4,DTA_VirtualWidthF,ss.x,DTA_VirtualHeightF,ss.y,DTA_KeepRatio,true); } } diff --git a/zscript/dlc1/swwm_heavymahsheengun.zsc b/zscript/dlc1/swwm_heavymahsheengun.zsc index b7c34ed71..2f8632dd7 100644 --- a/zscript/dlc1/swwm_heavymahsheengun.zsc +++ b/zscript/dlc1/swwm_heavymahsheengun.zsc @@ -3,10 +3,90 @@ Class HeavyMahSheenGun : SWWMWeapon { - bool fired; + int fired; int firespeed; - double barrelheat; - bool incooldown; + double barrelheat, aimerror, vibrate; + bool incooldown, stopfire, firstshot; + int firetimer; + + action void A_SheenFire() + { + invoker.stopfire = ((invoker.Ammo1.Amount<=1)||!(player.cmd.buttons&BT_ATTACK)||(player.Health<=0)); + invoker.barrelheat = invoker.barrelheat*(1.025-invoker.firespeed*.008)+3.-(invoker.firespeed**.8)*1.35; + invoker.aimerror = min(1.,invoker.aimerror*1.01+.01+invoker.firespeed*.01); + if ( invoker.firespeed == 1 ) + { + A_StartSound("sheen/700rpm",CHAN_WEAPONEXTRA,CHANF_LOOPING,attenuation:.5); + invoker.vibrate = .25; + A_Overlay(-9999,"EjectRound3"); + SWWMUtility.AchievementProgress("dakka",(gametic-invoker.firetimer)/GameTicRate,player); + } + else if ( invoker.firespeed == 2 ) + { + A_StartSound("sheen/2100rpm",CHAN_WEAPONEXTRA,CHANF_LOOPING,attenuation:.4); + invoker.vibrate = min(1.,invoker.vibrate*1.05+.05); + A_Overlay(-9999,"EjectRound1"); + } + else if ( invoker.firespeed == 0 ) + { + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6); + A_Overlay(-9999,"EjectRound7"); + } + if ( invoker.barrelheat > 100. ) invoker.stopfire = invoker.incooldown = true; + invoker.firstshot = true; + if ( !sv_infiniteammo && !FindInventory('PowerInfiniteAmmo',true) ) + invoker.Ammo1.Amount--; + invoker.fired = gametic; + // TODO the actual firing itself + } + action void A_CheckContinueFire() + { + if ( invoker.incooldown || (invoker.Ammo1.Amount <= 0) || (player.Health <= 0) ) return; + invoker.stopfire = !(player.cmd.buttons&BT_ATTACK); + } + override void OwnerDied() + { + if ( Owner.IsActorPlayingSound(CHAN_WEAPONEXTRA) ) + { + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + } + Super.OwnerDied(); + aimerror = 0.; + vibrate = 0.; + } + override void Travelled() + { + Super.Travelled(); + aimerror = 0.; + vibrate = 0.; + } + override void DoEffect() + { + Super.DoEffect(); + barrelheat = max(0.,barrelheat*.99-.15); + if ( barrelheat <= 0. ) incooldown = false; + if ( !Owner || !Owner.player || (Owner.player.ReadyWeapon != self) ) + { + aimerror = 0.; + vibrate = 0.; + return; + } + let pspm = Owner.player.FindPSprite(PSP_WEAPON); + if ( pspm ) + { + pspm.x = FRandom[Shivers](-1.,1.)*vibrate*4.; + pspm.y = 32+FRandom[Shivers](-1.,1.)*vibrate*4.; + } + aimerror *= .95; + } + override bool CheckAmmo( int firemode, bool autoswitch, bool requireammo, int ammocount ) + { + if ( sv_infiniteammo || Owner.FindInventory('PowerInfiniteAmmo',true) ) return true; + if ( (fireMode == PrimaryFire) || (fireMode == AltFire) ) + return (Ammo1.Amount > 0); + return Super.CheckAmmo(firemode,autoswitch,requireammo,ammocount); + } Default { @@ -54,10 +134,271 @@ Class HeavyMahSheenGun : SWWMWeapon XZW2 WX 3; Goto Ready; Ready: - XZW2 A 1 A_WeaponReady(); + XZW2 A 1 + { + invoker.firetimer = gametic; + invoker.aimerror = 0.; + invoker.vibrate = 0.; + int flg = WRF_ALLOWRELOAD|WRF_ALLOWUSER1; + if ( invoker.firespeed > 0 ) flg |= WRF_ALLOWZOOM; + if ( invoker.firespeed >= 2 ) flg |= WRF_NOSECONDARY; + if ( (invoker.Ammo1.Amount <= 0) || invoker.incooldown ) flg |= WRF_NOPRIMARY; + A_WeaponReady(flg); + if ( player.cmd.buttons&BT_ATTACK ) + invoker.CheckAmmo(EitherFire,true); + } Wait; Fire: XZW2 A 1; + XZW2 Z 1 + { + invoker.firstshot = false; + if ( (invoker.firespeed == 0) || (invoker.Ammo1.Amount <= 1) && !(player.cmd.buttons&BT_ATTACK) ) + return A_Jump(256,"SlowFire1","SlowFire2","SlowFire3"); + if ( invoker.firespeed == 1 ) + return A_Jump(256,"FastFire1","FastFire2","FastFire3"); + if ( invoker.firespeed == 2 ) + return ResolveState("VeryFastFire"); + return ResolveState(null); + } + Goto Ready; + SlowFire1: + XZW2 Z 1 A_SheenFire(); + XZW3 ABCDEF 1; + XZW3 G 0; + XZW2 Z 0 + { + if ( !invoker.incooldown && (invoker.Ammo1.Amount > 0) && (player.cmd.buttons&BT_ATTACK) ) + return A_Jump(256,"SlowFire2","SlowFire3"); + return ResolveState(null); + } + Goto StopFire; + SlowFire2: + XZW2 Z 1 A_SheenFire(); + XZW3 HIJKLM 1; + XZW3 N 0; + XZW2 Z 0 + { + if ( !invoker.incooldown &&(invoker.Ammo1.Amount > 0) && (player.cmd.buttons&BT_ATTACK) ) + return A_Jump(256,"SlowFire1","SlowFire3"); + return ResolveState(null); + } + Goto StopFire; + SlowFire3: + XZW2 Z 1 A_SheenFire(); + XZW3 OPQRST 1; + XZW3 U 0 + { + if ( !invoker.incooldown &&(invoker.Ammo1.Amount > 0) && (player.cmd.buttons&BT_ATTACK) ) + return A_Jump(256,"SlowFire1","SlowFire2"); + return ResolveState(null); + } + Goto StopFire; + FastFire1: + XZW2 Z 1 A_SheenFire(); + XZW3 VW 1 A_CheckContinueFire(); + XZW3 X 0 + { + A_CheckContinueFire(); + if ( !invoker.stopfire ) return A_Jump(256,"FastFire2","FastFire3"); + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState(null); + } + Goto StopFire; + FastFire2: + XZW2 Z 1 A_SheenFire(); + XZW3 YZ 1 A_CheckContinueFire(); + XZW4 A 0 + { + A_CheckContinueFire(); + if ( !invoker.stopfire ) return A_Jump(256,"FastFire1","FastFire3"); + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState(null); + } + Goto StopFire; + FastFire3: + XZW2 Z 1 A_SheenFire(); + XZW4 BC 1 A_CheckContinueFire(); + XZW4 D 0 + { + A_CheckContinueFire(); + if ( !invoker.stopfire ) return A_Jump(256,"FastFire1","FastFire2"); + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState(null); + } + Goto StopFire; + VeryFastFire: + XZW2 Z 1 A_SheenFire(); + XZW4 E 1 + { + A_CheckContinueFire(); + if ( invoker.stopfire ) + { + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState("EndFireFast1"); + } + A_SheenFire(); + return ResolveState(null); + } + XZW4 F 1 + { + A_CheckContinueFire(); + if ( invoker.stopfire ) + { + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState("EndFireFast2"); + } + A_SheenFire(); + return ResolveState(null); + } + XZW4 G 1 + { + A_CheckContinueFire(); + if ( invoker.stopfire ) + { + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState("EndFireFast3"); + } + A_SheenFire(); + return ResolveState(null); + } + XZW4 H 1 + { + A_CheckContinueFire(); + if ( invoker.stopfire ) + { + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState("EndFireFast4"); + } + A_SheenFire(); + return ResolveState(null); + } + XZW4 I 1 + { + A_CheckContinueFire(); + if ( invoker.stopfire ) + { + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState("EndFireFast5"); + } + A_SheenFire(); + return ResolveState(null); + } + XZW4 J 1 + { + A_CheckContinueFire(); + if ( invoker.stopfire ) + { + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState("EndFireFast6"); + } + A_SheenFire(); + return ResolveState(null); + } + VeryFastFireHold: + XZW4 K 1 + { + A_CheckContinueFire(); + if ( invoker.stopfire ) + { + A_StopSound(CHAN_WEAPONEXTRA); + A_StartSound("sheen/fire",CHAN_WEAPON,CHANF_OVERLAP,attenuation:.6,starttime:.2); + return ResolveState("EndFireFast7"); + } + A_SheenFire(); + return ResolveState(null); + } + XZW4 L 0; + Goto VeryFastFireHold; + EndFireFast7: + XZW4 MNO 1 { invoker.vibrate *= .25; } + Goto Ready; + EndFireFast6: + XZW4 PQR 1 { invoker.vibrate *= .25; } + Goto Ready; + EndFireFast5: + XZW4 STU 1 { invoker.vibrate *= .25; } + Goto Ready; + EndFireFast4: + XZW4 VWX 1 { invoker.vibrate *= .25; } + Goto Ready; + EndFireFast3: + XZW4 YZ 1 { invoker.vibrate *= .25; } + XZW5 A 1 { invoker.vibrate *= .25; } + Goto Ready; + EndFireFast2: + XZW5 BCD 1 { invoker.vibrate *= .25; } + Goto Ready; + EndFireFast1: + XZW5 EFG 1 { invoker.vibrate *= .25; } + Goto Ready; + StopFire: + XZW2 Z 1 A_StopSound(CHAN_WEAPONEXTRA); // just in case + Goto Ready; + EjectRound7: + TNT1 A 7; + Goto EjectRound; + EjectRound3: + TNT1 A 3; + Goto EjectRound; + EjectRound1: + TNT1 A 7; + Goto EjectRound; + EjectRound: + TNT1 A 1; // TODO + Stop; + AltFire: + XZW2 A 3 A_StartSound("sheen/crankin",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 IJ 2; + XZW5 K 3 { invoker.firespeed = min(2,invoker.firespeed+1); } + XZW5 L 4 A_StartSound("sheen/crankout",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 M 5; + Goto Ready; + Zoom: + XZW2 A 3 A_StartSound("sheen/crankin",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 NO 2; + XZW5 P 3 { invoker.firespeed = max(0,invoker.firespeed-1); } + XZW5 Q 4 A_StartSound("sheen/crankout",CHAN_WEAPON,CHANF_OVERLAP); + XZW5 R 5; + Goto Ready; + Reload: + XZW2 A 3 + { + A_StartSound("sheen/deselect",CHAN_WEAPON,CHANF_OVERLAP); + A_PlayerCheckGun(); + } + XZW5 TUVW 3; + XZW5 XYZ 4; + XZW6 A 4; + XZW6 B 3 A_StartSound("sheen/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZW6 CDE 3; + XZW6 FGHIJKL 2; + Goto Ready; + User1: + XZW2 A 3 A_StartSound("sheen/meleestart",CHAN_WEAPON,CHANF_OVERLAP); + XZW6 MNOPQR 3; + XZW6 S 3 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + XZW6 T 3; + XZW6 U 2 + { + A_Parry(9); + A_PlayerMelee(); + } + XZW6 V 2; + XZW6 W 2 A_Melee(70,"demolitionist/whitl",1.25,1.3,1.2); + XZW6 XYZ 3; + XZW7 AB 4; + XZW7 C 4 A_StartSound("sheen/meleeend",CHAN_WEAPON,CHANF_OVERLAP); + XZW7 DEFGHIJKL 2; Goto Ready; Deselect: XZW2 A 2 A_StartSound("sheen/deselect",CHAN_WEAPON,CHANF_OVERLAP);