From a8a74556a8d4f3e04087a4042f0f14244ba1582b Mon Sep 17 00:00:00 2001 From: Marisa Kirisame Date: Sun, 20 Sep 2020 14:53:46 +0200 Subject: [PATCH] 0.9.3b release: - Add models for debris, akin to DT chunks. - Eviscerator chunks have a glow sprite like in DT. - Fix potential palette light crash under very special circumstances. - Double range of Ynykron altfire explosion. - Reduce Ynykron vortex lifetime (grows quicker), and reduce mass gain from kills by 40% (allows it to suck in a couple more enemies in hordes). - Adjust v-field compression formula for Ynykron vortex. - Reduce max blockmap iterator range of Ynykron vortex, should perform slightly better (maybe) on large maps. - Fix Ynykron altfire beam clipping through the world due to incorrect offsets. - Adjust Golden shell explosion propagation math. - Omnisight doesn't increase the item detection range (clutters screen too much). - The people have spoken, build only PK3 for releases from now on. --- language.version | 2 +- modeldef.eviscerator | 30 ++++++++ modeldef.hellblazer | 2 +- modeldef.misc | 29 +++++++ models/Chunky.png | Bin 0 -> 973 bytes models/Chunky_a.3d | Bin 0 -> 196 bytes models/Chunky_d.3d | Bin 0 -> 176 bytes sprites/ETRLA0.png | Bin 0 -> 2740 bytes zscript/swwm_common.zsc | 23 +++--- zscript/swwm_danmaku.zsc | 67 +++++++++++++--- zscript/swwm_deathlydeathcannon.zsc | 114 +++++++++++++++++++++++++--- zscript/swwm_player.zsc | 4 +- zscript/swwm_shot.zsc | 4 +- 13 files changed, 239 insertions(+), 36 deletions(-) create mode 100644 models/Chunky.png create mode 100644 models/Chunky_a.3d create mode 100644 models/Chunky_d.3d create mode 100644 sprites/ETRLA0.png diff --git a/language.version b/language.version index 8371ec493..7c5e3b47a 100644 --- a/language.version +++ b/language.version @@ -1,2 +1,2 @@ [default] -SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.2b r551 \cu(Sat 19 Sep 17:45:52 CEST 2020)"; +SWWM_MODVER="\chSWWM \czGZ\c- \cw0.9.3b r553 \cu(Sun 20 Sep 15:05:43 CEST 2020)"; diff --git a/modeldef.eviscerator b/modeldef.eviscerator index 2d61b494d..fecf13de2 100644 --- a/modeldef.eviscerator +++ b/modeldef.eviscerator @@ -16,6 +16,36 @@ Model "EvisceratorCasing" FrameIndex XZW1 C 0 0 } +Model "EvisceratorChunk" +{ + Path "models" + + Model 0 "Chunky_d.3d" + Skin 0 "Chunky.png" + Scale 0.02 0.02 0.02 + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 0 + FrameIndex XZW1 B 0 1 + FrameIndex XZW1 C 0 2 + FrameIndex XZW1 D 0 3 + FrameIndex XZW1 E 0 4 + FrameIndex XZW1 F 0 5 + FrameIndex XZW1 G 0 6 + FrameIndex XZW1 H 0 7 + ZOffset 0.2 + FrameIndex XZW2 A 0 0 + FrameIndex XZW2 B 0 1 + FrameIndex XZW2 C 0 2 + FrameIndex XZW2 D 0 3 + FrameIndex XZW2 E 0 4 + FrameIndex XZW2 F 0 5 + FrameIndex XZW2 G 0 6 + FrameIndex XZW2 H 0 7 +} + + Model "EvisceratorProj" { Path "models" diff --git a/modeldef.hellblazer b/modeldef.hellblazer index f6f8597fd..ad9cb00c1 100644 --- a/modeldef.hellblazer +++ b/modeldef.hellblazer @@ -50,7 +50,7 @@ Model "HellblazerClusterMini" Model 0 "HellblazerProj_d.3d" Skin 0 "HellblazerMissile_Cluster.png" - Scale 0.02 0.02 0.02 + Scale 0.05 0.05 0.05 USEACTORPITCH USEACTORROLL diff --git a/modeldef.misc b/modeldef.misc index dee2dde70..6aadafa9d 100644 --- a/modeldef.misc +++ b/modeldef.misc @@ -28,6 +28,35 @@ Model "FancyConfetti" FrameIndex XZW1 J 0 0 } +Model "SWWMChip" +{ + Path "models" + + Model 0 "Chunky_d.3d" + Skin 0 "Chunky.png" + Scale 0.02 0.02 0.02 + USEACTORPITCH + USEACTORROLL + + FrameIndex XZW1 A 0 0 + FrameIndex XZW1 B 0 1 + FrameIndex XZW1 C 0 2 + FrameIndex XZW1 D 0 3 + FrameIndex XZW1 E 0 4 + FrameIndex XZW1 F 0 5 + FrameIndex XZW1 G 0 6 + FrameIndex XZW1 H 0 7 + ZOffset 0.2 + FrameIndex XZW2 A 0 0 + FrameIndex XZW2 B 0 1 + FrameIndex XZW2 C 0 2 + FrameIndex XZW2 D 0 3 + FrameIndex XZW2 E 0 4 + FrameIndex XZW2 F 0 5 + FrameIndex XZW2 G 0 6 + FrameIndex XZW2 H 0 7 +} + Model "ReflectedBullet" { Path "models" diff --git a/models/Chunky.png b/models/Chunky.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5ffb7cce8aa931e9610b9c51a02eceddee8bd7 GIT binary patch literal 973 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o7G?$ph6wkZw+svn1_3@Ht_%zey1KeXMn>l5 z<~BAqPEJl99v=Sw{-L3vF)=a8$;nw+S%rm#m6es9ot?90&2m2b=@|n9bA+dhV~EG` z)KJHw$8J0<$M(1}xb5p+Qse*REPIgWQ`X8DyUC}R%_4vAGfaQ7*_I)ux`%D2n{wRE ztG*_?9REBPN$9d=EMfliL-gPOKXxlO9{rvDM~0Q>!mq2Z?;@s zkjJntS<)d`Kvy#kBdJDD9rBpMV{!hp$@A>=K(ChFHwjUzK0w?4i)l4dX z^|h^W4sTJyF;GjhWrb+&f!DHeckJUvV(@*1`L}DzjS8 zUuW=anGt*~Ny_J_vRh}dMK^~ump$Xd9o;Nm0xMP}a%nUzp1fJ>rD~32o9S88SY{JZ zjkQzK6NS%rOv?Yv5dB)wF1wFuaf^@fwYEkLcSh$ua}RA1&r&$#a%STTjg3nm2yrfa zvFneeyR@VeOJhb2r$yxY=6{&vrKk`}rCQAbF> z%*97??434@!q5C(HtdytllWnw|BQZyz@?|=WOI3&U$r*cGsE!o-~1#)ze10W6;Czi z&55#eSzX7wL9^q3?!pURd0QQJ+3|lcTKKzt&i*wS|NJw*3iqDoTDIP8$(oB>I(yuF zn|QuYN-7TWsFVo~YH_leQ<1laLyPD2I?lhQ$ET_4&b#ct#>y{|zv!V5*J{sQ7b4<( z&%9Pjc%zrFv2bHDFk2>#Way>zo!HMI z`EL3%&0aUb?g=*Y_N<=c;%_K5)j?s|aizclw{NrMwb%aUJ87|o)9}NF?!#Z+Dl%9{ j#I4ml^SJiIe})?$MSdN*8d}Q0z`)??>gTe~DWM4fIM}uv literal 0 HcmV?d00001 diff --git a/models/Chunky_a.3d b/models/Chunky_a.3d new file mode 100644 index 0000000000000000000000000000000000000000..2778d8af28fe838ee6af88b0d2d739474092b8b5 GIT binary patch literal 196 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 Pfq}u()z4*}Q$iB}Fx2w@ literal 0 HcmV?d00001 diff --git a/zscript/swwm_common.zsc b/zscript/swwm_common.zsc index d6f17a926..d74eecc1d 100644 --- a/zscript/swwm_common.zsc +++ b/zscript/swwm_common.zsc @@ -39,7 +39,7 @@ Class PaletteLight : DynamicLight } private void UpdateLight() { - int index = 255-((255*ReactionTime)/abs(default.ReactionTime)); + int index = clamp(255-((255*ReactionTime)/abs(default.ReactionTime)),0,255); args[LIGHT_RED] = pal[index].r; args[LIGHT_GREEN] = pal[index].g; args[LIGHT_BLUE] = pal[index].b; @@ -622,7 +622,7 @@ Class SWWMChip : Actor { SWWMChip prevchip, nextchip; bool killme; - double rollvel; + double anglevel, pitchvel, rollvel; bool dead; Sector tracksector; int trackplane; @@ -645,8 +645,10 @@ Class SWWMChip : Actor } override void PostBeginPlay() { + anglevel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + pitchvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); rollvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); - frame = Random[Junk](0,5); + frame = Random[Junk](0,7); scale *= Frandom[Junk](0.8,1.2); SWWMHandler.QueueChip(self); } @@ -768,6 +770,8 @@ Class SWWMChip : Actor trackplane = 0; } vel = (0,0,0); + pitch = 0; + roll = 0; dead = true; SetStateLabel("Death"); return; @@ -790,22 +794,23 @@ Class SWWMChip : Actor States { Spawn: - JUNK # 1 + XZW1 # 1 { + angle += anglevel; + pitch += pitchvel; roll += rollvel; } Loop; Bounce: - JUNK # 0 + XZW1 # 0 { + anglevel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); + pitchvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); rollvel = FRandom[Junk](10,30)*RandomPick[Junk](-1,1); } Goto Spawn; Death: - JUNK # -1; - Stop; - Dummy: - JUNK ABCDEF -1; + XZW2 # -1; Stop; } } diff --git a/zscript/swwm_danmaku.zsc b/zscript/swwm_danmaku.zsc index cbe406b65..f30b7266a 100644 --- a/zscript/swwm_danmaku.zsc +++ b/zscript/swwm_danmaku.zsc @@ -1,12 +1,11 @@ // Mr. BIG SHOT Industries "Eviscerator" High Load Flak Cannon (from SWWM series) // Slot 5, replaces Chaingun, Dragon Claw, Hammer of Retribution -Class EvisceratorChunkLight : DynamicLight +Class EvisceratorChunkLight : PointLightAttenuated { Default { - DynamicLight.Type "Point"; - Args 255,224,128,8; + Args 255,224,128,16; } override void Tick() { @@ -18,7 +17,7 @@ Class EvisceratorChunkLight : DynamicLight } SetOrigin(target.pos,true); if ( isFrozen() ) return; - double intst = clamp((7-EvisceratorChunk(target).lifetime*10)/7.,0,1); + double intst = clamp((.7-EvisceratorChunk(target).lifetime)/.7,0.,1.); args[LIGHT_RED] = int(255*intst); args[LIGHT_GREEN] = int(224*intst); args[LIGHT_BLUE] = int(128*intst); @@ -70,10 +69,45 @@ Class ChunkImpact : Actor } } +Class EvisceratorChunkGlow : Actor +{ + Default + { + RenderStyle "Add"; + Radius .1; + Height 0.; + Scale .25; + +FORCEXYBILLBOARD; + +NOGRAVITY; + +NOBLOCKMAP; + +NOINTERACTION; + +DONTSPLASH; + +NOTELEPORT; + } + override void Tick() + { + if ( isFrozen() ) return; + if ( !EvisceratorChunk(target) ) + { + Destroy(); + return; + } + SetOrigin(target.pos,true); + alpha = clamp((.7-EvisceratorChunk(target).lifetime)/.7,0.,1.); + if ( alpha <= 0. ) Destroy(); + } + States + { + Spawn: + ETRL A -1 Bright; + Stop; + } +} + Class EvisceratorChunk : Actor { Actor lasthit; - double rollvel; + double anglevel, pitchvel, rollvel; double lifetime, lifespeed; Vector3 oldvel; bool justdied; @@ -108,11 +142,15 @@ Class EvisceratorChunk : Actor Super.PostBeginPlay(); let l = Spawn("EvisceratorChunkLight",pos); l.target = self; + let t = Spawn("EvisceratorChunkGlow",pos); + t.target = self; lifetime = 0; lifespeed = FRandom[Eviscerator](0.01,0.02); + anglevel = FRandom[Eviscerator](50,100)*RandomPick[Eviscerator](-1,1); + pitchvel = FRandom[Eviscerator](50,100)*RandomPick[Eviscerator](-1,1); rollvel = FRandom[Eviscerator](50,100)*RandomPick[Eviscerator](-1,1); scale *= Frandom[Eviscerator](0.8,1.2); - frame = Random[Eviscerator](0,5); + frame = Random[Eviscerator](0,7); } override void Tick() @@ -131,6 +169,7 @@ Class EvisceratorChunk : Actor // I guess I can blame graf, randi, or whoever else if ( isFrozen() || justdied ) return; lifetime += lifespeed; + if ( waterlevel > 0 ) lifetime = max(.7,lifetime); A_SetTranslation(tls[clamp(int(lifetime*10),0,7)]); if ( !Random[Eviscerator](0,3) && (lifetime < .7) ) { @@ -140,7 +179,11 @@ Class EvisceratorChunk : Actor s.alpha *= scale.x*max(0,.7-lifetime)*1.5; } if ( !InStateSequence(CurState,FindState("Death")) ) + { + angle += anglevel; + pitch += pitchvel; roll += rollvel; + } } void A_HandleBounce() @@ -200,6 +243,8 @@ Class EvisceratorChunk : Actor } A_Gravity(); gravity = .35; + anglevel = FRandom[Eviscerator](50,100)*RandomPick[Eviscerator](-1,1)*(vel.length()/speed); + pitchvel = FRandom[Eviscerator](50,100)*RandomPick[Eviscerator](-1,1)*(vel.length()/speed); rollvel = FRandom[Eviscerator](50,100)*RandomPick[Eviscerator](-1,1)*(vel.length()/speed); A_StartSound("eviscerator/hit",CHAN_WEAPON,CHANF_OVERLAP,.4); if ( swwm_extraalert ) A_AlertMonsters(300); @@ -270,18 +315,20 @@ Class EvisceratorChunk : Actor States { Spawn: - JUNK # -1; + XZW1 # -1; Stop; Bounce: - JUNK # 0 A_HandleBounce(); + XZW1 # 0 A_HandleBounce(); Goto Spawn; Death: - JUNK # 0 + XZW2 # 0 { + pitch = 0; + roll = 0; bMOVEWITHSECTOR = true; A_SetTics(Random[Eviscerator](30,50)); } - JUNK # 1 A_FadeOut(); + XZW2 # 1 A_FadeOut(); Wait; XDeath: TNT1 A 35 { invoker.justdied = true; } diff --git a/zscript/swwm_deathlydeathcannon.zsc b/zscript/swwm_deathlydeathcannon.zsc index 5ffcc6891..982bcb2bd 100644 --- a/zscript/swwm_deathlydeathcannon.zsc +++ b/zscript/swwm_deathlydeathcannon.zsc @@ -1214,7 +1214,7 @@ Class GatherDust : Actor if ( distto < (32.*target.scale.x) ) { // sucked in - target.specialf2 += FRandom[ExploS](.1,.4); + target.specialf2 += FRandom[ExploS](.2,2.); Destroy(); return; } @@ -1959,6 +1959,92 @@ Class YnykronVoidSparkle : Actor Stop; } } +Class YnykronSingularityExplosionArm : Actor +{ + Default + { + PROJECTILE; + +THRUACTORS; + +BOUNCEONWALLS; + +BOUNCEONFLOORS; + +BOUNCEONCEILINGS; + +NODAMAGETHRUST; + +FORCERADIUSDMG; + -NOGRAVITY; + Gravity 0.35; + BounceFactor 1.0; + Radius 4; + Height 4; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + reactiontime = Random[ExploS](10,20); + double ang, pt; + ang = FRandom[ExploS](0,360); + pt = FRandom[ExploS](-90,90); + vel = (cos(ang)*cos(pt),sin(ang)*cos(pt),-sin(pt))*FRandom[ExploS](20.,40.); + } + States + { + Spawn: + TNT1 A 1 + { + A_CountDown(); + if ( !(reactiontime%2) ) + { + Spawn("YnykronSingularityExplosionTrail",pos); + Vector3 pvel = (FRandom[ExploS](-1,1),FRandom[ExploS](-1,1),FRandom[ExploS](-1,1)).unit()*FRandom[ExploS](1,5); + let s = Spawn("SWWMHalfSmoke",pos); + s.SetShade(Color(1,1,1)*Random[ExploS](128,160)+Color(28,0,31)); + s.A_SetRenderStyle(s.alpha*(.1+.4*(ReactionTime/15.)),STYLE_AddShaded); + s.vel = pvel+vel*.2; + s.special1 = Random[ExploS](1,3); + s.scale *= 2.4; + } + } + Wait; + } +} + +Class YnykronSingularityExplosionTrail : Actor +{ + Default + { + RenderStyle "Add"; + +NOBLOCKMAP; + +NOGRAVITY; + +FORCEXYBILLBOARD; + +NOTELEPORT; + +NOINTERACTION; + Scale 3.; + Alpha .2; + } + override void PostBeginPlay() + { + Super.PostBeginPlay(); + Scale *= FRandom[ExploS](0.8,1.1); + Scale.x *= RandomPick[ExploS](-1,1); + Scale.y *= RandomPick[ExploS](-1,1); + } + override void Tick() + { + if ( isFrozen() ) return; + if ( !CheckNoDelay() || (tics == -1) ) return; + if ( tics > 0 ) tics--; + while ( !tics ) + { + if ( !SetState(CurState.NextState) ) + return; + } + } + States + { + Spawn: + XEX4 ABCDEFGHIJKLMNOPQRSTUVWXYZ[\ 1 Bright; + Stop; + } +} Class YnykronSingularityExplosion : Actor { @@ -2010,6 +2096,12 @@ Class YnykronSingularityExplosion : Actor s.angle = ang; s.pitch = pt; } + numpt = Random[ExploS](-1,3); + for ( int i=0; i 0 ) { - Vector3 bounced = d.HitDir-(2*hitnormal*(d.HitDir dot HitNormal)); + Vector3 bounced = d.HitDir-(1.2*hitnormal*(d.HitDir dot HitNormal)); ang = atan2(bounced.y,bounced.x); pt = asin(-bounced.z); origin = d.HitLocation+hitnormal; @@ -2447,7 +2539,7 @@ Class YnykronAltBeam : Actor let b = Spawn("InvisibleSplasher",t.WaterHitList[i].hitpos); b.A_CheckTerrain(); } - for ( int i=0; i 0 ) { - Vector3 bounced = d.HitDir-(2*hitnormal*(d.HitDir dot HitNormal)); + Vector3 bounced = d.HitDir-(1.2*hitnormal*(d.HitDir dot HitNormal)); ang = atan2(bounced.y,bounced.x); pt = asin(-bounced.z); origin = d.HitLocation+hitnormal; @@ -1832,7 +1832,7 @@ Class GoldenSubImpact : Actor totaldist -= d.Distance; if ( totaldist > 0 ) { - Vector3 bounced = d.HitDir-(2*hitnormal*(d.HitDir dot HitNormal)); + Vector3 bounced = d.HitDir-(1.2*hitnormal*(d.HitDir dot HitNormal)); ang = atan2(bounced.y,bounced.x); pt = asin(-bounced.z); origin = d.HitLocation+hitnormal;