diff --git a/gldefs/pp.txt b/gldefs/pp.txt index 3c6f8678c..3399dfbe6 100644 --- a/gldefs/pp.txt +++ b/gldefs/pp.txt @@ -44,6 +44,7 @@ HardwareShader PostProcess beforebloom Shader "shaders/pp/WindBlur.fp" 330 Uniform float Speed Uniform float Fade + Uniform vec2 WindDir } HardwareShader PostProcess beforebloom { diff --git a/language.version b/language.version index 3561a74dd..5ea6b0b14 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1111 \cu(Wed 13 Mar 20:54:20 CET 2024)\c-"; -SWWM_SHORTVER="\cw1.3pre r1111 \cu(2024-03-13 20:54:20)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r1112 \cu(Sun 17 Mar 20:58:31 CET 2024)\c-"; +SWWM_SHORTVER="\cw1.3pre r1112 \cu(2024-03-17 20:58:31)\c-"; diff --git a/shaders/pp/WindBlur.fp b/shaders/pp/WindBlur.fp index 0e9fa08f5..2bd9eddbf 100644 --- a/shaders/pp/WindBlur.fp +++ b/shaders/pp/WindBlur.fp @@ -12,7 +12,7 @@ void main() res += w*texture(InputTexture,s); sum += w; w *= .95; - s.x -= d; + s -= d*WindDir; } res /= sum; FragColor = mix(texture(InputTexture,TexCoord),vec4(res.rgb,1.),Fade*.75); diff --git a/zscript/dlc1/swwm_hammertime.zsc b/zscript/dlc1/swwm_hammertime.zsc index 259b7ec6d..3b47c4b13 100644 --- a/zscript/dlc1/swwm_hammertime.zsc +++ b/zscript/dlc1/swwm_hammertime.zsc @@ -6,6 +6,7 @@ Class ItamexHammer : SWWMWeapon double charge; int hitcnt, spintime; transient ui SmoothDynamicValueInterpolator ChargeInter; + bool bSpinning, bFalling; override void HudTick() { @@ -43,6 +44,22 @@ Class ItamexHammer : SWWMWeapon 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() { @@ -50,9 +67,9 @@ Class ItamexHammer : SWWMWeapon if ( !Owner && !Owner.player && (Owner.player.ReadyWeapon != self) ) return; let psp = Owner.player.FindPSprite(PSP_WEAPON); if ( !psp ) return; - if ( Owner.IsActorPlayingSound(CHAN_WEAPONEXTRA,"itamex/spin") ) - psp.x += charge*.05; + if ( bSpinning ) psp.x += charge*.05; psp.x *= .8; + psp.y = (psp.y-32.)*.8+32.; } action void A_ChargeUp() @@ -60,6 +77,7 @@ Class ItamexHammer : SWWMWeapon 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); @@ -105,6 +123,7 @@ Class ItamexHammer : SWWMWeapon if ( invoker.charge <= 30. ) { A_StartSound("itamex/swing",CHAN_WEAPON,CHANF_OVERLAP); + invoker.bSpinning = false; return ResolveState("ZoomEnd"); } return ResolveState(null); @@ -156,6 +175,10 @@ Class ItamexHammer : SWWMWeapon 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); @@ -234,9 +257,16 @@ Class ItamexHammer : SWWMWeapon XZW2 PQRST 3; Goto Ready; Ready: + XZW2 A 0 + { + } XZW2 A 1 { - A_WeaponOffset(0,32,WOF_INTERPOLATE); // ensure we're back to normal offsets just in case + // 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; @@ -283,9 +313,18 @@ Class ItamexHammer : SWWMWeapon 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; @@ -293,6 +332,16 @@ Class ItamexHammer : SWWMWeapon 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); diff --git a/zscript/handler/swwm_handler_shaders.zsc b/zscript/handler/swwm_handler_shaders.zsc index 141e66c7e..4edeb0fc8 100644 --- a/zscript/handler/swwm_handler_shaders.zsc +++ b/zscript/handler/swwm_handler_shaders.zsc @@ -134,11 +134,24 @@ extend Class SWWMHandler noiz = min(lastdmg*.03*max(0,(lastdmgtimer-(gametic+e.Fractic))/35.),3.5); PPShader.SetUniform1f("Glitch","str2",noiz); } - if ( (demo.player.ReadyWeapon is 'ItamexHammer') && demo.IsActorPlayingSound(CHAN_WEAPONEXTRA,"itamex/spin") ) + if ( demo.player.ReadyWeapon is 'ItamexHammer' ) { - PPShader.SetEnabled("WindBlur",true); - PPShader.SetUniform1f("WindBlur","Speed",ItamexHammer(demo.player.ReadyWeapon).charge/100.); - PPShader.SetUniform1f("WindBlur","Fade",(ItamexHammer(demo.player.ReadyWeapon).charge/100.)**.5); + let ham = ItamexHammer(demo.player.ReadyWeapon); + PPShader.SetEnabled("WindBlur",ham.bFalling||ham.bSpinning); + if ( ham.bFalling ) + { + double hamfact = clamp(-demo.vel.z/25.,0.,1.); + PPShader.SetUniform1f("WindBlur","Speed",hamfact); + PPShader.SetUniform1f("WindBlur","Fade",hamfact**.5); + PPShader.SetUniform2f("WindBlur","WindDir",(0.,1.)); + } + else if ( ham.bSpinning ) + { + double hamfact = clamp(ham.charge/100.,0.,1.); + PPShader.SetUniform1f("WindBlur","Speed",hamfact); + PPShader.SetUniform1f("WindBlur","Fade",hamfact**.5); + PPShader.SetUniform2f("WindBlur","WindDir",(1.,0.)); + } } else PPShader.SetEnabled("WindBlur",false); if ( !demo.InStateSequence(demo.CurState,demo.FindState("Dash")) )