diff --git a/gldefs.ammo b/gldefs.ammo index f6f2e72e5..fa1f731d5 100644 --- a/gldefs.ammo +++ b/gldefs.ammo @@ -18,10 +18,6 @@ HardwareShader Texture "models/Shell_Gold_Used.png" Define "ENVFACT" = ".6" Define "RIMFACT" = ".9" } -Brightmap Texture "models/QuadCell.png" -{ - map "models/QuadCell_bright.png" -} Brightmap Texture "models/SparksterAmmo.png" { map "models/SparksterAmmo_bright.png" @@ -175,26 +171,6 @@ Object GoldShell Frame "XZW1" { light "GOLDSHELLLIGHT" } } -PointLight QUADAMMOLIGHT -{ - Color 1.0 0.8 0.4 - Size 20 - Offset 0 16 0 - Attenuate 1 -} -Object QuadravolAmmo -{ - Frame "XZW1" { light "QUADAMMOLIGHT" } -} -Object QuadravolAmmo2 -{ - Frame "XZW1" { light "QUADAMMOLIGHT" } -} -Object QuadravolAmmo3 -{ - Frame "XZW1" { light "QUADAMMOLIGHT" } -} - PointLight SPARKUNITLIGHT { Color 0.25 0.15 0.3 diff --git a/gldefs.dlcammo b/gldefs.dlcammo new file mode 100644 index 000000000..5142b714d --- /dev/null +++ b/gldefs.dlcammo @@ -0,0 +1,52 @@ +Brightmap Texture "models/QuadCell.png" +{ + map "models/QuadCell_bright.png" +} + +PointLight QUADAMMOLIGHT +{ + Color 1.0 0.8 0.4 + Size 20 + Offset 0 16 0 + Attenuate 1 +} +Object QuadravolAmmo +{ + Frame "XZW1" { light "QUADAMMOLIGHT" } +} +Object QuadravolAmmo2 +{ + Frame "XZW1" { light "QUADAMMOLIGHT" } +} +Object QuadravolAmmo3 +{ + Frame "XZW1" { light "QUADAMMOLIGHT" } +} + +PointLight MISTERAMMOLIGHT +{ + Color 0.5 0.2 0.4 + Size 20 + Offset 0 12 0 + Attenuate 1 +} +Object MisterAmmo +{ + Frame "XZW1" { light "MISTERAMMOLIGHT" } +} + +PointLight MISTERGAMMOLIGHT +{ + Color 0.0 0.5 0.2 + Size 15 + Offset 0 16 0 + Attenuate 1 +} +Object MisterGAmmo +{ + Frame "XZW1" { light "MISTERGAMMOLIGHT" } +} +Object MisterGAmmo2 +{ + Frame "XZW1" { light "MISTERGAMMOLIGHT" } +} diff --git a/gldefs.mortalrifle b/gldefs.mortalrifle index f12b2bd5b..0a47c1fdf 100644 --- a/gldefs.mortalrifle +++ b/gldefs.mortalrifle @@ -111,3 +111,51 @@ HardwareShader Texture "models/MortalLED2.png" Texture "scrtex" "MORTLED2" Define "ALPHA_KEY" = "vec3(0.)" // key out pure black } + +PointLight MISTERRIFLELIGHT +{ + Color 0.5 0.2 0.4 + Size 20 + Offset 0 10 0 + Attenuate 1 +} +Object MisterRifle +{ + Frame "XZW1" { light "MISTERRIFLELIGHT" } +} + +PointLight MISTERMAGLIGHT +{ + Color 0.5 0.2 0.4 + Size 20 + Offset 0 4 0 + Attenuate 1 +} +Object MisterMag +{ + Frame "XZW1" { light "MISTERMAGLIGHT" } +} + +PointLight MISTERGRENADELIGHT +{ + Color 0.0 1.0 0.4 + Size 80 + Offset 0 3 0 + Attenuate 1 +} +Object MisterGrenade +{ + Frame "XZW1" { light "MISTERGRENADELIGHT" } +} +PointLight MISTERSUBGRENADELIGHT +{ + Color 0.0 0.75 0.3 + Size 40 + Offset 0 2 0 + Attenuate 1 +} +Object MisterSubGrenade +{ + Frame "XZW1" { light "MISTERSUBGRENADELIGHT" } +} + diff --git a/language.version b/language.version index f5e4d61ee..4f4ad7779 100644 --- a/language.version +++ b/language.version @@ -1,3 +1,3 @@ [default] -SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r451 \cu(Wed 14 Sep 00:48:31 CEST 2022)\c-"; -SWWM_SHORTVER="\cw1.3pre r451 \cu(2022-09-14 00:48:31)\c-"; +SWWM_MODVER="\cyDEMOLITIONIST \cw1.3pre r452 \cu(Wed 14 Sep 19:25:48 CEST 2022)\c-"; +SWWM_SHORTVER="\cw1.3pre r452 \cu(2022-09-14 19:25:48)\c-"; diff --git a/modeldef.dlcammo b/modeldef.dlcammo index 290c48c06..444b6276e 100644 --- a/modeldef.dlcammo +++ b/modeldef.dlcammo @@ -367,7 +367,7 @@ Model "MisterGAmmo" Model 0 "MortalGrenadeAmmo1_d.3d" Skin 0 "MortalGrenade.png" - Scale 0.06 0.06 0.06 + Scale 0.03 0.03 0.03 ZOffset 16 AngleOffset -90 RollOffset 30 @@ -381,7 +381,7 @@ Model "MisterGAmmo2" Model 0 "MortalGrenadeAmmo2_d.3d" Skin 0 "MortalGrenade.png" - Scale 0.06 0.06 0.06 + Scale 0.03 0.03 0.03 ZOffset 16 ROTATING diff --git a/modeldef.mortalrifle b/modeldef.mortalrifle index 26405b681..7680ef7a4 100644 --- a/modeldef.mortalrifle +++ b/modeldef.mortalrifle @@ -55,6 +55,31 @@ Model "MisterMag" FrameIndex XZW1 C 0 0 } +Model "MisterGrenade" +{ + Path "models" + + Model 0 "MortalGrenade_d.3d" + Skin 0 "MortalGrenade.png" + Scale 0.09 0.09 0.09 + AngleOffset 90 + ZOffset 3.3 + + FrameIndex XZW1 A 0 0 +} +Model "MisterSubGrenade" +{ + Path "models" + + Model 0 "MortalGrenade_d.3d" + Skin 0 "MortalGrenade.png" + Scale 0.03 0.03 0.03 + AngleOffset 90 + ZOffset 1.1 + + FrameIndex XZW1 A 0 0 +} + Model "MisterRifle" { Path "models" diff --git a/sndinfo.dlcweapons b/sndinfo.dlcweapons index 2525a7757..34636e3b3 100644 --- a/sndinfo.dlcweapons +++ b/sndinfo.dlcweapons @@ -129,6 +129,13 @@ mister/fireover sounds/dlc1/mister/mr_fire_over.ogg mister/chargeover sounds/dlc1/mister/mr_charge_over.ogg mister/magout sounds/dlc1/mister/mr_magout.ogg mister/magin sounds/dlc1/mister/mr_magin.ogg +$alias mister/mag1 explodium/mag1 +$alias mister/mag2 explodium/mag2 +$alias mister/mag3 explodium/mag3 +$pitchset mister/mag1 0.8 +$pitchset mister/mag2 0.8 +$pitchset mister/mag3 0.8 +$random mister/mag { mister/mag1 mister/mag2 mister/mag3 } mister/grenade sounds/dlc1/mister/mr_grenade.ogg mister/grenadeopen sounds/dlc1/mister/mr_grenadeopen.ogg mister/grenadeget sounds/dlc1/mister/mr_grenadeget.ogg @@ -175,5 +182,13 @@ mister/gcasing2 sounds/dlc1/mister/mr_gcasing2.ogg mister/gcasing3 sounds/dlc1/mister/mr_gcasing3.ogg mister/gcasing4 sounds/dlc1/mister/mr_gcasing4.ogg $random mister/gcasing { mister/gcasing1 mister/gcasing2 mister/gcasing3 mister/gcasing4 } +mister/gbounce1 sounds/dlc1/mister/mr_gbounce11.ogg +mister/gbounce2 sounds/dlc1/mister/mr_gbounce12.ogg +mister/gbounce3 sounds/dlc1/mister/mr_gbounce13.ogg +$random mister/gbounce { mister/gbounce1 mister/gbounce2 mister/gbounce3 } +mister/gbouncesub1 sounds/dlc1/mister/mr_gbounce21.ogg +mister/gbouncesub2 sounds/dlc1/mister/mr_gbounce22.ogg +mister/gbouncesub3 sounds/dlc1/mister/mr_gbounce23.ogg +$random mister/gbouncesub { mister/gbouncesub1 mister/gbouncesub2 mister/gbouncesub3 } // TODO rafan-kos diff --git a/sounds/dlc1/mister/mr_gbounce11.ogg b/sounds/dlc1/mister/mr_gbounce11.ogg new file mode 100644 index 000000000..e25dafdc8 Binary files /dev/null and b/sounds/dlc1/mister/mr_gbounce11.ogg differ diff --git a/sounds/dlc1/mister/mr_gbounce12.ogg b/sounds/dlc1/mister/mr_gbounce12.ogg new file mode 100644 index 000000000..a75552a7c Binary files /dev/null and b/sounds/dlc1/mister/mr_gbounce12.ogg differ diff --git a/sounds/dlc1/mister/mr_gbounce13.ogg b/sounds/dlc1/mister/mr_gbounce13.ogg new file mode 100644 index 000000000..8604f458c Binary files /dev/null and b/sounds/dlc1/mister/mr_gbounce13.ogg differ diff --git a/sounds/dlc1/mister/mr_gbounce21.ogg b/sounds/dlc1/mister/mr_gbounce21.ogg new file mode 100644 index 000000000..6a06c926d Binary files /dev/null and b/sounds/dlc1/mister/mr_gbounce21.ogg differ diff --git a/sounds/dlc1/mister/mr_gbounce22.ogg b/sounds/dlc1/mister/mr_gbounce22.ogg new file mode 100644 index 000000000..cb9d1ddc1 Binary files /dev/null and b/sounds/dlc1/mister/mr_gbounce22.ogg differ diff --git a/sounds/dlc1/mister/mr_gbounce23.ogg b/sounds/dlc1/mister/mr_gbounce23.ogg new file mode 100644 index 000000000..b552324ef Binary files /dev/null and b/sounds/dlc1/mister/mr_gbounce23.ogg differ diff --git a/zmapinfo.txt b/zmapinfo.txt index c7ef3e833..bf76769d2 100644 --- a/zmapinfo.txt +++ b/zmapinfo.txt @@ -87,6 +87,7 @@ GameInfo "FrispyCornGesture", "SayaBeanGesture", "MothPlushyGesture", + "SayasMugGesture", "DemoPlushGesture", "KirinCummiesGesture", "MilkBreadsGesture", @@ -135,7 +136,8 @@ GameInfo "graphics/M_DEMOCHAN_THUMBUP.png", "graphics/M_DEMOCHAN_HAMMER.png", "graphics/M_DEMOCHAN_SHEEN.png", - "graphics/M_DEMOCHAN_QUADRAVOL.png" + "graphics/M_DEMOCHAN_QUADRAVOL.png", + "graphics/M_DEMOCHAN_MISTER.png" } ClearSkills diff --git a/zscript/dlc1/swwm_ammoitems_dlc.zsc b/zscript/dlc1/swwm_ammoitems_dlc.zsc index 2291452ec..a6897e55f 100644 --- a/zscript/dlc1/swwm_ammoitems_dlc.zsc +++ b/zscript/dlc1/swwm_ammoitems_dlc.zsc @@ -379,8 +379,8 @@ Class MisterGAmmo : SWWMAmmo +FLOATBOB; FloatBobStrength 0.25; Accuracy 90; - Radius 4; - Height 21; + Radius 2; + Height 20; } States { @@ -394,7 +394,7 @@ Class MisterGAmmo2 : MisterGAmmo Default { Inventory.Amount 2; - Radius 5; + Radius 3; } } diff --git a/zscript/dlc1/swwm_mister.zsc b/zscript/dlc1/swwm_mister.zsc index 8c067276b..49eec4be9 100644 --- a/zscript/dlc1/swwm_mister.zsc +++ b/zscript/dlc1/swwm_mister.zsc @@ -473,6 +473,7 @@ Class MisterRifle : SWWMWeapon b.angle = atan2(d.HitDir.y,d.HitDir.x)+180; b.pitch = asin(d.HitDir.z); b.target = self; + MisterBulletImpact(b).A_BulletExplode(); } else if ( d.HitType != TRACE_HitNone ) { @@ -500,6 +501,7 @@ Class MisterRifle : SWWMWeapon b.angle = atan2(hitnormal.y,hitnormal.x); b.pitch = asin(-hitnormal.z); b.target = self; + MisterBulletImpact(b).A_BulletExplode(); if ( swwm_omnibust ) BusterWall.BustLinetrace(d,444,self,d.HitDir,d.HitLocation.z); } return ResolveState(null); @@ -557,6 +559,21 @@ Class MisterRifle : SWWMWeapon A_QuakeEx(4,4,4,5,0,10,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,rollIntensity:.6); A_BumpFOV(.96); A_AlertMonsters(swwm_uncapalert?0:5000); + for ( int i=0; i<9; i++ ) + { + let s = Spawn("SWWMSmoke",origin); + s.scale *= .4; + s.alpha *= .1; + s.vel += vel*.5+x*FRandom[Mister](1.,4.); + s.SetShade(Color(0,3,4)*Random[ExploS](48,63)); + } + Vector3 dir; + dir = swwm_CoordUtil.GetAxes(BulletSlope(),angle,roll); + let p = Spawn("MisterGrenade",origin); + p.target = self; + p.angle = atan2(dir.y,dir.x); + p.pitch = asin(-dir.z); + p.vel = dir*p.speed; } action void A_GrenadeOpen() diff --git a/zscript/dlc1/swwm_mister_fx.zsc b/zscript/dlc1/swwm_mister_fx.zsc index c987a6963..6c5160c85 100644 --- a/zscript/dlc1/swwm_mister_fx.zsc +++ b/zscript/dlc1/swwm_mister_fx.zsc @@ -56,7 +56,7 @@ Class MisterMag : SWWMCasing Mass 10; BounceFactor 0.4; WallBounceFactor 0.4; - BounceSound "explodium/mag"; + BounceSound "mister/mag"; } override void PostBeginPlay() { @@ -77,6 +77,39 @@ Class MisterMag : SWWMCasing } } +Class MisterRing : Actor +{ + Default + { + RenderStyle "Add"; + Scale 1.5; + 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: + XRG9 ABCDEFGHIJKLMNOPQRSTUVWX 1 Bright A_SetScale(scale.x*1.08); + Stop; + } +} + Class MisterExLight : PaletteLight { Default @@ -86,6 +119,14 @@ Class MisterExLight : PaletteLight Args 0,0,0,200; } } +Class MisterExLightBig : MisterExLight +{ + Default + { + ReactionTime 45; + Args 0,0,0,500; + } +} Class MisterBulletImpactPop : Actor { @@ -151,7 +192,7 @@ Class MisterFuzzy : Actor } override void PostBeginPlay() { - special1 = Random[ExploS](4,8); + special1 += Random[ExploS](4,8); vel = SWWMUtility.Vec3FromAngles(angle,pitch)*FRandom[ExploS](8,24); } override void Tick() @@ -346,9 +387,8 @@ Class MisterBulletImpact : Actor +FOILINVUL; +NOINTERACTION; } - override void PostBeginPlay() + void A_BulletExplode() { - Super.PostBeginPlay(); A_AlertMonsters(swwm_uncapalert?0:4000); SWWMUtility.DoExplosion(self,444,80000,150,150,DE_EXTRAZTHRUST); A_QuakeEx(6,6,6,10,0,400,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.6); @@ -389,10 +429,27 @@ Class MisterBulletImpact : Actor let s = Spawn("MisterFuzzy",pos); s.angle = FRandom[ExploS](0,360); s.pitch = FRandom[ExploS](-90,90); + s.target = target; } Spawn("MisterExLight",pos); Spawn("MisterBulletImpactPop",pos); } + void A_BulletSubExplode() + { + if ( special1 && (special1 <= 10) ) + { + SWWMUtility.DoExplosion(self,44,20000+special1*1000,50+special1*15,50+special1*15,DE_EXTRAZTHRUST); + int numpt = Random[ExploS](0,special1); + for ( int i=0; i 1 ) + { + ExplodeMissile(); + return; + } + ReactionTime--; + if ( ReactionTime <= 0 ) + { + ExplodeMissile(); + return; + } + // proximity check + if ( bNoProx ) return; + // "safe delay" for main grenade + if ( !bAMBUSH && (ReactionTime > default.ReactionTime-30) ) return; + let bt = BlockThingsIterator.Create(self,100); + while ( bt.Next() ) + { + let t = bt.Thing; + if ( !t || !t.bSHOOTABLE || (!t.bISMONSTER && !(t is 'BossBrain') && !t.player) || (t.Health <= 0) || (target && t.IsFriend(target)) || !SWWMUtility.SphereIntersect(t,level.Vec3Offset(pos,vel),bAMBUSH?80:100) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; + special1++; + tracer = t; + break; + } + } + + // quicksort (seeking candidates) + private int partition_candidates( Array a, int l, int h ) + { + Actor pv = a[h]; + int i = (l-1); + for ( int j=l; j<=(h-1); j++ ) + { + if ( Distance3DSquared(pv) > Distance3DSquared(a[j]) ) + { + i++; + Actor tmp = a[j]; + a[j] = a[i]; + a[i] = tmp; + } + } + Actor tmp = a[h]; + a[h] = a[i+1]; + a[i+1] = tmp; + return i+1; + } + private void qsort_candidates( Array a, int l, int h ) + { + if ( l >= h ) return; + int p = partition_candidates(a,l,h); + qsort_candidates(a,l,p-1); + qsort_candidates(a,p+1,h); + } + + virtual void A_GrenadeExplode() + { + ReactionTime = 0; + bForceXYBillboard = true; + bRollSprite = false; + A_SetRenderStyle(1.0,STYLE_Add); + A_SprayDecal("BigRocketBlast",50); + A_SetScale(4.); + A_NoGravity(); + Scale *= FRandom[ExploS](0.8,1.1); + Scale.x *= RandomPick[ExploS](-1,1); + Scale.y *= RandomPick[ExploS](-1,1); + SWWMUtility.DoExplosion(self,444,120000,250,250,DE_EXTRAZTHRUST); + A_QuakeEx(8,8,8,20,0,900,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:300,rollintensity:1.5); + A_StartSound("mister/hitgrenade",CHAN_VOICE,attenuation:.3); + A_StartSound("mister/hitgrenade",CHAN_WEAPON,attenuation:.2); + SetOrigin(Vec3Offset(0,0,Height/2),false); + int numpt = Random[ExploS](30,50); + for ( int i=0; i candidates; + let bt = BlockThingsIterator.Create(self,10000); + while ( bt.Next() ) + { + let t = bt.Thing; + if ( !t || (t == tracer) || !t.bSHOOTABLE || (!t.bISMONSTER && !(t is 'BossBrain')) || (t.Health <= 0) || (target && t.IsFriend(target)) || !CheckSight(t,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) continue; + candidates.Push(t); + } + // sort by distance + if ( candidates.Size() > 1 ) + qsort_candidates(candidates,0,candidates.Size()-1); + // distribute among spawned sub-grenades + int k = 0; + for ( int i=-45; i<=45; i+=45 ) for ( int j=0; j<360; j+=60 ) + { + double ang = j; + double pt = i; + Vector3 dir = SWWMUtility.Vec3FromAngles(ang,pt); + let p = MisterSubGrenade(Spawn("MisterSubGrenade",pos)); + p.angle = ang; + p.pitch = pt; + p.vel = dir*p.speed; + p.target = target; + p.ReactionTime += Random[Mister](-10,10); + if ( candidates.Size() > 0 ) + { + p.seektarget = candidates[k]; + k = (k+1)%candidates.Size(); + } + } + Spawn("MisterExLightBig",pos); + Spawn("MisterRing",pos); + } + + virtual void A_GrenadeSubExplode() + { + if ( special2 && (special2 <= 20) ) + { + if ( special2 <= 10 ) SWWMUtility.DoExplosion(self,44,25000+special2*500,100+special2*20,100+special2*20,DE_EXTRAZTHRUST); + int numpt = Random[ExploS](special2/2,special2); + for ( int i=0; i0)); + if ( !seektarget || (seektarget.Health < 0) ) return; + // check proximity to seek target + if ( SWWMUtility.SphereIntersect(seektarget,level.Vec3Offset(pos,vel),80) ) + { + special1++; + tracer = seektarget; + return; + } + if ( !CheckSight(seektarget,SF_IGNOREVISIBILITY|SF_IGNOREWATERBOUNDARY) ) return; + // sustain reaction time as long as seek target is visible + ReactionTime++; + // "subtly" steer towards seek target + Vector3 dirto = level.Vec3Diff(pos,seektarget.Vec3Offset(0,0,seektarget.Height/2)); + double distto = dirto.length(); + if ( distto <= 0. ) return; + dirto /= distto; + double spd = vel.length(); + if ( spd <= 0. ) return; + vel /= spd; + vel = (vel*.7+dirto*.3)*spd; + // extra oomph + if ( spd < speed ) vel += dirto*max(2,speed-spd); + } + override void A_GrenadeExplode() + { + ReactionTime = 0; + bForceXYBillboard = true; + bRollSprite = false; + A_SetRenderStyle(1.0,STYLE_Add); + A_SprayDecal("RocketBlast",50); + A_SetScale(2.); + A_NoGravity(); + Scale *= FRandom[ExploS](0.8,1.1); + Scale.x *= RandomPick[ExploS](-1,1); + Scale.y *= RandomPick[ExploS](-1,1); + SWWMUtility.DoExplosion(self,444,120000,150,150,DE_EXTRAZTHRUST); + A_QuakeEx(5,5,5,10,0,500,"",QF_RELATIVE|QF_SCALEDOWN|QF_3D,falloff:150,rollintensity:.8); + A_StartSound("mister/hitgrenadesub",CHAN_VOICE,attenuation:.5); + A_StartSound("mister/hitgrenadesub",CHAN_WEAPON,attenuation:.4); + SetOrigin(Vec3Offset(0,0,Height/2),false); + int numpt = Random[ExploS](15,25); + for ( int i=0; i