From 3d09be118abcf57058df4ce70fe52dbd920635de Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 23 Dec 2022 21:18:40 +0100 Subject: [PATCH] - scriptified the freezeblast shooter. --- source/games/duke/src/player_d.cpp | 4 - wadsrc/static/zscript.txt | 1 + .../games/duke/actors/dukeweapons/freezer.zs | 136 ++++++++++++++++++ .../zscript/games/duke/actors/projectiles.zs | 73 ---------- 4 files changed, 137 insertions(+), 77 deletions(-) create mode 100644 wadsrc/static/zscript/games/duke/actors/dukeweapons/freezer.zs diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index 6eb817ebd..eb5b49e4f 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -288,10 +288,6 @@ void shoot_d(DDukeActor* actor, int atwith, PClass *cls) switch (atwith) { - case DTILE_FREEZEBLAST: - spos.Z += 3; - [[fallthrough]]; - case DTILE_RPG: shootrpg(actor, p, spos, sang, atwith); break; diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index 78e6c7c4c..0768935e2 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -164,6 +164,7 @@ version "4.10" #include "zscript/games/duke/actors/dukeweapons/shrinker.zs" #include "zscript/games/duke/actors/dukeweapons/grower.zs" #include "zscript/games/duke/actors/dukeweapons/tripbomb.zs" +#include "zscript/games/duke/actors/dukeweapons/freezer.zs" #include "zscript/games/duke/actors/redneckenemies/vixen.zs" diff --git a/wadsrc/static/zscript/games/duke/actors/dukeweapons/freezer.zs b/wadsrc/static/zscript/games/duke/actors/dukeweapons/freezer.zs new file mode 100644 index 000000000..fbf722f0b --- /dev/null +++ b/wadsrc/static/zscript/games/duke/actors/dukeweapons/freezer.zs @@ -0,0 +1,136 @@ +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +class DukeFreezeBlast : DukeProjectile +{ + default + { + pic "FREEZEBLAST"; + +FULLBRIGHT; + +FREEZEDAMAGE; + +REFLECTIVE; + } + + override bool postmoveeffect(CollisionData coll) + { + return false; + } + + override bool weaponhitsprite_pre(DukeActor targ) + { + if (targ.pal == 1) // is target already frozen? + { + if (targ.badguy() || targ.isPlayer()) + { + let spawned = targ.spawn('DukeTransporterStar'); + if (spawned) + { + spawned.pal = 1; + spawned.scale = (0.5, 0.5); + } + + self.Destroy(); + return true; + } + } + return super.weaponhitsprite_pre(targ); + } + + override void Tick() + { + + if (self.yint < 1 || self.extra < 2 || (self.vel.X == 0 && self.vel.Z == 0)) + { + let star = self.spawn("DukeTransporterStar"); + if (star) + { + star.pal = 1; + star.scale = (0.5, 0.5); + } + self.Destroy(); + } + else + Super.Tick(); + + } + + override bool weaponhitsector() + { + self.bounce(); + self.doMove(CLIPMASK1); + self.extra >>= 1; + if (self.scale.X > 0.125 ) + self.scale.X -= 0.03125; + if (self.scale.Y > 0.125 ) + self.scale.Y -= 0.03125; + self.yint--; + return true; + } + + override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang) const + { + let sect = actor.sector; + double vel, zvel; + int scount; + + pos.Z += 3; + if (actor.extra >= 0 && !self.bDONTLIGHTSHOOTER) actor.shade = -96; + + scount = 1; + vel = 40.25; + + if (p != null) + { + let aimed = actor.aim(self); + + if (aimed) + { + double dal = ((aimed.scale.X * aimed.spriteHeight()) * 0.5) + 8; + double dist = (p.actor.pos.XY - aimed.pos.XY).Length(); + zvel = ((aimed.pos.Z - pos.Z - dal) * vel) / dist; + if (!(aimed.bSPECIALAUTOAIM)) + ang = (aimed.pos.XY - pos.XY).Angle(); + } + else + [vel, zvel] = Raze.setFreeAimVelocity(vel, zvel, p.getPitchWithView(), 40.5); + + } + else + { + let j = actor.findplayer(); + ang = (j.actor.opos.XY - pos.XY).Angle(); + + double dist = (j.actor.pos.XY - actor.pos.XY).Length(); + zvel = ((j.actor.opos.Z + j.actor.viewzoffset - pos.Z) * vel) / dist; + + if (actor.bBADGUY && (actor.hitag & face_player_smart)) + ang = actor.Angle + frandom(-22.5 / 8, 22.5 / 8); + } + + + let offset = (ang + 61.171875).ToVector() * (1024. / 448.); + let spawned = dlevel.SpawnActor(sect, pos.plusZ(-1) + offset, self.GetClass(), 0, (0.109375, 0.109375), ang, vel, zvel, actor, STAT_PROJECTILE); + + if (!spawned) return true; + + if (p != null) + { + let snd = self.spawnsound; + if (snd > 0) spawned.PlayActorSound(snd); + } + + spawned.extra += random(0, 7); + spawned.yint = gs.numfreezebounces; + spawned.vel.Z -= 0.25; + spawned.cstat = CSTAT_SPRITE_YCENTER; + spawned.clipdist = 10; + return true; + } + + +} + + diff --git a/wadsrc/static/zscript/games/duke/actors/projectiles.zs b/wadsrc/static/zscript/games/duke/actors/projectiles.zs index 932c00866..e0919f5bc 100644 --- a/wadsrc/static/zscript/games/duke/actors/projectiles.zs +++ b/wadsrc/static/zscript/games/duke/actors/projectiles.zs @@ -382,79 +382,6 @@ class DukeRPG : DukeProjectile } -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - -class DukeFreezeBlast : DukeProjectile -{ - default - { - pic "FREEZEBLAST"; - +FULLBRIGHT; - +FREEZEDAMAGE; - +REFLECTIVE; - } - - override bool postmoveeffect(CollisionData coll) - { - return false; - } - - override bool weaponhitsprite_pre(DukeActor targ) - { - if (targ.pal == 1) // is target already frozen? - { - if (targ.badguy() || targ.isPlayer()) - { - let spawned = targ.spawn('DukeTransporterStar'); - if (spawned) - { - spawned.pal = 1; - spawned.scale = (0.5, 0.5); - } - - self.Destroy(); - return true; - } - } - return super.weaponhitsprite_pre(targ); - } - - override void Tick() - { - - if (self.yint < 1 || self.extra < 2 || (self.vel.X == 0 && self.vel.Z == 0)) - { - let star = self.spawn("DukeTransporterStar"); - if (star) - { - star.pal = 1; - star.scale = (0.5, 0.5); - } - self.Destroy(); - } - else - Super.Tick(); - - } - - override bool weaponhitsector() - { - self.bounce(); - self.doMove(CLIPMASK1); - self.extra >>= 1; - if (self.scale.X > 0.125 ) - self.scale.X -= 0.03125; - if (self.scale.Y > 0.125 ) - self.scale.Y -= 0.03125; - self.yint--; - return true; - } -} - //--------------------------------------------------------------------------- // //