diff --git a/language.version b/language.version index 56e442131..801c23391 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r353 \cu(Sat 20 Aug 19:59:18 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r353 \cu(2022-08-20 19:59:18)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r354 \cu(Sun 21 Aug 12:44:40 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r354 \cu(2022-08-21 12:44:40)\c-"; diff --git a/sprites/DVSPA0.png b/sprites/DVSPA0.png index 4e83a0f24..45f4f53ac 100644 Binary files a/sprites/DVSPA0.png and b/sprites/DVSPA0.png differ diff --git a/sprites/XRG8A0.png b/sprites/XRG8A0.png new file mode 100644 index 000000000..40b6edc15 Binary files /dev/null and b/sprites/XRG8A0.png differ diff --git a/sprites/XRG8B0.png b/sprites/XRG8B0.png new file mode 100644 index 000000000..54549429f Binary files /dev/null and b/sprites/XRG8B0.png differ diff --git a/sprites/XRG8C0.png b/sprites/XRG8C0.png new file mode 100644 index 000000000..51e31cb6d Binary files /dev/null and b/sprites/XRG8C0.png differ diff --git a/sprites/XRG8D0.png b/sprites/XRG8D0.png new file mode 100644 index 000000000..cd75f3b5d Binary files /dev/null and b/sprites/XRG8D0.png differ diff --git a/sprites/XRG8E0.png b/sprites/XRG8E0.png new file mode 100644 index 000000000..26c25cbd3 Binary files /dev/null and b/sprites/XRG8E0.png differ diff --git a/sprites/XRG8F0.png b/sprites/XRG8F0.png new file mode 100644 index 000000000..2eb0f9a3f Binary files /dev/null and b/sprites/XRG8F0.png differ diff --git a/sprites/XRG8G0.png b/sprites/XRG8G0.png new file mode 100644 index 000000000..3ee4cb013 Binary files /dev/null and b/sprites/XRG8G0.png differ diff --git a/sprites/XRG8H0.png b/sprites/XRG8H0.png new file mode 100644 index 000000000..91a35eefd Binary files /dev/null and b/sprites/XRG8H0.png differ diff --git a/sprites/XRG8I0.png b/sprites/XRG8I0.png new file mode 100644 index 000000000..3aba6ccd3 Binary files /dev/null and b/sprites/XRG8I0.png differ diff --git a/sprites/XRG8J0.png b/sprites/XRG8J0.png new file mode 100644 index 000000000..00e3765ec Binary files /dev/null and b/sprites/XRG8J0.png differ diff --git a/sprites/XRG8K0.png b/sprites/XRG8K0.png new file mode 100644 index 000000000..37a66d46f Binary files /dev/null and b/sprites/XRG8K0.png differ diff --git a/sprites/XRG8L0.png b/sprites/XRG8L0.png new file mode 100644 index 000000000..59e82745a Binary files /dev/null and b/sprites/XRG8L0.png differ diff --git a/sprites/XRG8M0.png b/sprites/XRG8M0.png new file mode 100644 index 000000000..d828fd11c Binary files /dev/null and b/sprites/XRG8M0.png differ diff --git a/sprites/XRG8N0.png b/sprites/XRG8N0.png new file mode 100644 index 000000000..e485beac3 Binary files /dev/null and b/sprites/XRG8N0.png differ diff --git a/sprites/XRG8O0.png b/sprites/XRG8O0.png new file mode 100644 index 000000000..9301402ef Binary files /dev/null and b/sprites/XRG8O0.png differ diff --git a/sprites/XRG8P0.png b/sprites/XRG8P0.png new file mode 100644 index 000000000..d55e6f6ac Binary files /dev/null and b/sprites/XRG8P0.png differ diff --git a/sprites/XRG8Q0.png b/sprites/XRG8Q0.png new file mode 100644 index 000000000..46face02f Binary files /dev/null and b/sprites/XRG8Q0.png differ diff --git a/sprites/XRG8R0.png b/sprites/XRG8R0.png new file mode 100644 index 000000000..c6f7af84b Binary files /dev/null and b/sprites/XRG8R0.png differ diff --git a/sprites/XRG8S0.png b/sprites/XRG8S0.png new file mode 100644 index 000000000..815f7e380 Binary files /dev/null and b/sprites/XRG8S0.png differ diff --git a/sprites/XRG8T0.png b/sprites/XRG8T0.png new file mode 100644 index 000000000..8b1d59fe2 Binary files /dev/null and b/sprites/XRG8T0.png differ diff --git a/sprites/XRG8U0.png b/sprites/XRG8U0.png new file mode 100644 index 000000000..4d58bfdc3 Binary files /dev/null and b/sprites/XRG8U0.png differ diff --git a/sprites/XRG8V0.png b/sprites/XRG8V0.png new file mode 100644 index 000000000..e87845c21 Binary files /dev/null and b/sprites/XRG8V0.png differ diff --git a/sprites/XRG8W0.png b/sprites/XRG8W0.png new file mode 100644 index 000000000..6ff239f1a Binary files /dev/null and b/sprites/XRG8W0.png differ diff --git a/sprites/XRG8X0.png b/sprites/XRG8X0.png new file mode 100644 index 000000000..cf2c11481 Binary files /dev/null and b/sprites/XRG8X0.png differ diff --git a/zscript/dlc1/swwm_notashotgun.zsc b/zscript/dlc1/swwm_notashotgun.zsc index cc811ebc0..683be2a5e 100644 --- a/zscript/dlc1/swwm_notashotgun.zsc +++ b/zscript/dlc1/swwm_notashotgun.zsc @@ -115,7 +115,7 @@ Class Quadravol : SWWMWeapon Actor p; switch ( idx ) { - case 0: + default: A_QuakeEx(3,3,3,15,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.4); A_BumpFOV(.98); A_SWWMFlash(); @@ -131,30 +131,35 @@ Class Quadravol : SWWMWeapon { p.tracer = self; p.master = fool; - p.special1 = bMelee?100:50; - p.special2 = bMelee?120000:40000; + p.special1 += bMelee?100:50; + p.special2 += bMelee?120000:40000; p.bAMBUSH = bMelee; p.ExplodeMissile(null,null); - self.DamageMobj(invoker,self,bAMBUSH?20:40,'Fire',DMG_EXPLOSION); - } - for ( int i=0; i<4; i++ ) - { - let s = Spawn("SWWMSmoke",origin); - s.special1 = 1; - s.scale *= 1.3; - s.alpha *= .2; - s.vel += vel*.5+x*FRandom[Quadravol](5.,15.)+y*FRandom[Quadravol](-.5,.5)+z*FRandom[Quadravol](-.5,.5); - } - for ( int i=0; i<10; i++ ) - { - let s = Spawn("SWWMSpark",origin); - s.scale *= .3; - s.alpha *= .4; - s.vel += vel*.5+x*FRandom[Quadravol](4.,8.)+y*FRandom[Quadravol](-1.,1.)+z*FRandom[Quadravol](-1.,1.); + self.DamageMobj(invoker,self,bMelee?20:40,'Fire',DMG_EXPLOSION); } break; case 1: - A_Log("\cg// TODO - Fire Level 2\c-"); + A_QuakeEx(4,4,4,18,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.5); + A_BumpFOV(.97); + A_SWWMFlash(); + SWWMHandler.DoFlash(self,Color(64,255,192,64),7); + A_AlertMonsters(swwm_uncapalert?0:3000); + SWWMUtility.DoKnockback(self,-x,2500.); + p = Spawn("QuadProj2",origin); + p.target = self; + p.angle = atan2(x2.y,x2.x); + p.pitch = asin(-x2.z); + p.vel = x2*p.speed; + if ( pointblank || bMelee ) + { + p.tracer = self; + p.master = fool; + p.special1 = bMelee?150:80; + p.special2 = bMelee?150000:60000; + p.bAMBUSH = bMelee; + p.ExplodeMissile(null,null); + self.DamageMobj(invoker,self,bMelee?20:40,'Fire',DMG_EXPLOSION); + } break; case 2: A_Log("\cg// TODO - Fire Level 3\c-"); @@ -167,6 +172,23 @@ Class Quadravol : SWWMWeapon else A_Log("\cg// TODO - Fire Level 5\c-"); break; } + for ( int i=0; i<(4+idx); i++ ) + { + let s = Spawn("SWWMSmoke",origin); + s.special1 = 1; + s.scale *= 1.3; + s.alpha *= .2; + s.vel += vel*.5+x*FRandom[Quadravol](5.,15.)+y*FRandom[Quadravol](-.5,.5)+z*FRandom[Quadravol](-.5,.5); + s.vel *= 1.+.1*idx; + } + for ( int i=0; i<(10+2*idx); i++ ) + { + let s = Spawn("SWWMSpark",origin); + s.scale *= .3; + s.alpha *= .4; + s.vel += vel*.5+x*FRandom[Quadravol](4.,8.)+y*FRandom[Quadravol](-1.,1.)+z*FRandom[Quadravol](-1.,1.); + s.vel *= 1.+.1*idx; + } invoker.chargelevel = 0; invoker.charged = true; // eat it up if ( bMelee ) return ResolveState(null); @@ -248,7 +270,7 @@ Class Quadravol : SWWMWeapon action void A_FireBayonet() { A_StartSound("quadshot/bayonetfire",CHAN_WEAPON,CHANF_OVERLAP); - A_Melee(50,"spreadgun/slug",1.5,.8,-.5,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse); + A_Melee(60,"spreadgun/slug",1.5,.6,-.2,MELEE_Rip|MELEE_FleshSound|MELEE_NoRage|MELEE_NoUse,null); Vector3 dir = SWWMUtility.Vec3FromAngles(angle,pitch); vel += dir*4.; A_QuakeEx(4,4,4,8,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.75); @@ -465,14 +487,18 @@ Class Quadravol : SWWMWeapon XZW2 A 2 { A_StartSound("demolitionist/handsup",CHAN_WEAPON,CHANF_OVERLAP); - A_PlayerMelee(); return A_JumpIf(invoker.onehand,"User11H"); } - XZW7 BCDEF 2; - XZW7 G 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + XZW7 BCD 2; + XZW7 E 2 + { + A_PlayerMelee(); + A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + } + XZW7 FG 2; XZW7 H 2 A_Parry(6); XZW7 I 1; - XZW7 J 1 A_JumpIf(A_Melee(10,"demolitionist/whitm",1.5,.8,.2),"Bayonet"); + XZW7 J 1 A_JumpIf(A_Melee(20,"demolitionist/whitm",1.2,.6,.2),"Bayonet"); XZW7 KLM 1; XZW7 NOPQRST 2; XZW7 UVWX 3; @@ -602,11 +628,16 @@ Class Quadravol : SWWMWeapon User11H: XZW9 G 2; XZWC Z 2; - XZWD ABCD 2; - XZWD E 2 A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + XZWD AB 2; + XZWD C 2 + { + A_PlayerMelee(); + A_StartSound("demolitionist/wswing",CHAN_WEAPON,CHANF_OVERLAP); + } + XZWD DE 2; XZWD F 2 A_Parry(6); XZWD G 1; - XZWD H 1 A_JumpIf(A_Melee(10,"demolitionist/whitm",1.5,.8,.2),"Bayonet1H"); + XZWD H 1 A_JumpIf(A_Melee(20,"demolitionist/whitm",1.2,.6,.2),"Bayonet1H"); XZWD IJK 1; XZWD LMNOPQR 2; XZWD STUV 3; diff --git a/zscript/dlc1/swwm_notashotgun_fx.zsc b/zscript/dlc1/swwm_notashotgun_fx.zsc index b705bcd1c..3a1d97d35 100644 --- a/zscript/dlc1/swwm_notashotgun_fx.zsc +++ b/zscript/dlc1/swwm_notashotgun_fx.zsc @@ -22,6 +22,15 @@ Class QuadExplLight : PaletteLight ReactionTime 20; } } +Class QuadExplLight2 : PaletteLight +{ + Default + { + Tag "QuadExpl"; + Args 0,0,0,250; + ReactionTime 25; + } +} Class QuadFlare : Actor { @@ -198,6 +207,39 @@ Class QuadEmber : Actor } } +Class QuadExplRing : Actor +{ + Default + { + RenderStyle "Add"; + Scale 1.2; + Radius .1; + Height 0; + +NOGRAVITY; + +NOBLOCKMAP; + +FORCEXYBILLBOARD; + +NOTELEPORT; + +NOINTERACTION; + } + override void Tick() + { + if ( isFrozen() ) return; + if ( !CheckNoDelay() || (tics == -1) ) return; + if ( tics > 0 ) tics--; + while ( !tics ) + { + if ( !SetState(CurState.NextState) ) + return; + } + } + States + { + Spawn: + XRG8 ACEGIKMOQSUW 1 Bright A_SetScale(scale.x*1.05); + Stop; + } +} + Class QuadProj : Actor { double drift, accelrate, maxspeed; @@ -252,7 +294,7 @@ Class QuadProj : Actor { A_StopSound(CHAN_BODY); Scale *= 2.; - A_SprayDecal("ShockMarkBig",50); + A_SprayDecal("ShockMark",50); Vector3 x = SWWMUtility.Vec3FromAngles(angle,pitch); if ( master && ((master.pos.z <= master.floorz) || !master.TestMobjZ()) ) { @@ -261,14 +303,16 @@ Class QuadProj : Actor SWWMUtility.DoKnockback(master,x+(0,0,hdiff*.5),200000+special2); } if ( tracer ) SWWMUtility.DoKnockback(tracer,-x+(0,0,.1),bAMBUSH?150000:500000); + A_QuakeEx(3,3,3,20,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:200,rollintensity:.6); SWWMUtility.DoExplosion(self,0,80000+special2,240,80,DE_BLAST|DE_EXTRAZTHRUST); SWWMUtility.DoExplosion(self,100+special1,0,240,0,DE_QUADRAVOL|DE_NOSPLASH,ignoreme:tracer); if ( SWWMUtility.DoExplosion(self,150+special1,0,200,80,DE_HOWL|DE_NOSPLASH,ignoreme:tracer) && bAMBUSH && target ) SWWMUtility.AchievementProgressInc("roast",1,target.player); - A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.8); - A_StartSound("quadshot/hit",CHAN_VOICE,attenuation:.6); + A_StartSound("quadshot/hit",CHAN_WEAPON,attenuation:.6); + A_StartSound("quadshot/hit",CHAN_VOICE,attenuation:.4); A_AlertMonsters(swwm_uncapalert?0:1500); Spawn("QuadExplLight",pos); + Spawn("QuadExplRing",pos); int numpt = Random[Quadravol](12,18); for ( int i=0; i 0 ) tics--; + while ( !tics ) + { + if ( !SetState(CurState.NextState) ) + return; + } + } + States + { + Spawn: + XEX0 ACEGIKMOQS 1 Bright A_SetScale(scale.x*1.03); + Stop; + } +} + +Class QuadExplRing2 : QuadExplRing +{ + Default + { + Scale 1.6; + } + + States + { + Spawn: + XRG8 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.03); + Stop; + } +} + +Class QuadProj2 : QuadProj +{ + Default + { + Scale .85; + Radius 8; + Height 8; + Speed 40; + QuadProj.Drift .25; + QuadProj.AccelRate 20; + QuadProj.MaxSpeed 80; + } + override void A_QuadTrail() + { + let s = Spawn("QuadTrail",pos); + s.scale *= .8; + s.vel = vel*.3; + s = Spawn("SWWMHalfSmoke",pos); + s.vel = (FRandom[Quadravol](-.4,.4),FRandom[Quadravol](-.4,.4),FRandom[Quadravol](-.4,.4)); + s.vel += vel*.4; + s.alpha *= .6; + int numpt = Random[Quadravol](5,25); + for ( int i=0; i impactclass ) { Vector3 x, y, z, dir; [x, y, z] = swwm_CoordUtil.GetAxes(pitch,angle,roll); @@ -446,9 +446,9 @@ extend Class SWWMWeapon mt.hits[i].a.TraceBleed(newdmg,invoker); mt.hits[i].a.SpawnBlood(mt.hits[i].pos,atan2(mt.hits[i].dir.y,mt.hits[i].dir.x)+180,newdmg); } - else + else if ( impactclass ) { - let p = Spawn(raging?"BigPunchImpact":"PunchImpact",mt.hits[i].pos); + let p = Spawn(raging?(Class)("BigPunchImpact"):impactclass,mt.hits[i].pos); p.angle = atan2(mt.hits[i].dir.y,mt.hits[i].dir.x); } if ( (flags&MELEE_HammerHit) && (mt.hits[i].a.Health <= mt.hits[i].a.GetGibHealth()) ) @@ -498,7 +498,7 @@ extend Class SWWMWeapon A_BumpFOV(.96); return true; } - action bool A_Melee( int dmg = 40, String hitsound = "", double rangemul = 1., double spreadmul = 1., double kickmul = 1., int flags = 0 ) + action bool A_Melee( int dmg = 40, String hitsound = "", double rangemul = 1., double spreadmul = 1., double kickmul = 1., int flags = 0, Class impactclass = "PunchImpact" ) { let raging = RagekitPower(FindInventory("RagekitPower")); if ( flags&MELEE_NoRage ) raging = null; @@ -535,7 +535,7 @@ extend Class SWWMWeapon // check for shootables SWWMBulletTrail.DoTrail(self,origin,dir,DEFMELEERANGE*rangemul,0); } - bool res = TryMelee((raging?.3:.2)*spreadmul,dmg,hitsound,rangemul,kickmul,flags); + bool res = TryMelee((raging?.3:.2)*spreadmul,dmg,hitsound,rangemul,kickmul,flags,impactclass); if ( res && !(flags&MELEE_Rip) ) return res; // check for walls instead FTranslatedLineTarget t; @@ -560,10 +560,13 @@ extend Class SWWMWeapon if ( !d.LineSide ) HitNormal *= -1; if ( !(flags&MELEE_NoUse) ) d.HitLine.RemoteActivate(self,d.LineSide,SPAC_Impact,d.HitLocation+HitNormal*4); } - let p = Spawn(raging?"BigPunchImpact":"PunchImpact",d.HitLocation+HitNormal*4); - p.angle = atan2(HitNormal.y,HitNormal.x); - p.pitch = asin(-HitNormal.z); - if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40); + if ( impactclass ) + { + let p = Spawn(raging?(Class)("BigPunchImpact"):impactclass,d.HitLocation+HitNormal*4); + p.angle = atan2(HitNormal.y,HitNormal.x); + p.pitch = asin(-HitNormal.z); + if ( d.HitType == TRACE_HitFloor ) p.CheckSplash(40); + } if ( raging ) { let ps = Spawn("BigPunchSplash",d.HitLocation+HitNormal*4);