diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index 96b0e8036..1a7c23b86 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -315,80 +315,6 @@ static void shootrpg(DDukeActor* actor, int p, DVector3 pos, DAngle ang, int atw // //--------------------------------------------------------------------------- -static void shootwhip(DDukeActor* actor, int p, DVector3 pos, DAngle ang, int atwith) -{ - auto sect = actor->sector(); - double vel = 0, zvel; - int scount; - - if (actor->spr.extra >= 0) actor->spr.shade = -96; - - scount = 1; - if (atwith == RTILE_OWHIP) - { - vel = 300/16.; - pos.Z -= 15; - scount = 1; - } - else if (atwith == RTILE_UWHIP) - { - vel = 300/16; - pos.Z += 4; - scount = 1; - } - - if (p >= 0) - { - auto aimed = aim(actor, AUTO_AIM_ANGLE); - - if (aimed) - { - auto tex = TexMan.GetGameTexture(aimed->spr.spritetexture()); - double dal = ((aimed->spr.scale.X * tex->GetDisplayHeight()) * 0.5) - 12; - double dist = (ps[p].GetActor()->spr.pos.XY() - aimed->spr.pos.XY()).Length(); - zvel = ((aimed->spr.pos.Z - pos.Z - dal) * vel) / dist; - ang = (aimed->spr.pos.XY() - pos.XY()).Angle(); - } - else - setFreeAimVelocity(vel, zvel, ps[p].Angles.getPitchWithView(), 49.); - } - else - { - double x; - int j = findplayer(actor, &x); - if (actor->spr.picnum == RTILE_VIXEN) - ang -= randomAngle(22.5 / 8); - else - ang += DAngle22_5/8 - randomAngle(22.5 / 4); - - double dist = (ps[j].GetActor()->spr.pos.XY() - actor->spr.pos.XY()).Length(); - zvel = ((ps[j].GetActor()->getPrevOffsetZ() - pos.Z + 3) * vel) / dist; - } - - double oldzvel = zvel; - double scale = p >= 0? 0.109375 : 0.125; - - while (scount > 0) - { - auto spawned = CreateActor(sect, pos, atwith, -127, DVector2(scale,scale), ang, vel, zvel, actor, 4); - if (!spawned) return; - spawned->spr.extra += (krand() & 7); - spawned->spr.cstat = CSTAT_SPRITE_YCENTER; - spawned->clipdist = 1; - - ang = actor->spr.Angles.Yaw + DAngle22_5/4 - randomAngle(DAngle22_5/2); - zvel = oldzvel + 2 - krandf(4); - - scount--; - } -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - void shoot_r(DDukeActor* actor, int atwith, PClass* cls) { int p; @@ -426,11 +352,6 @@ void shoot_r(DDukeActor* actor, int atwith, PClass* cls) switch (atwith) { - case RTILE_OWHIP: - case RTILE_UWHIP: - shootwhip(actor, p, spos, sang, atwith); - return; - case RTILE_FIRELASER: case RTILE_SHITBALL: case RTILE_VIXENSHOT: diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index be88b62b5..85fc3f179 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -164,6 +164,7 @@ version "4.10" #include "zscript/games/duke/actors/dukeweapons/grower.zs" #include "zscript/games/duke/actors/dukeweapons/tripbomb.zs" +#include "zscript/games/duke/actors/redneckenemies/vixen.zs" #include "zscript/games/duke/world/dukebreak.zs" #include "zscript/games/duke/world/redneckbreak.zs" diff --git a/wadsrc/static/zscript/games/duke/actors/projectiles.zs b/wadsrc/static/zscript/games/duke/actors/projectiles.zs index 8508136c2..de5ada2d5 100644 --- a/wadsrc/static/zscript/games/duke/actors/projectiles.zs +++ b/wadsrc/static/zscript/games/duke/actors/projectiles.zs @@ -737,24 +737,6 @@ class DukeFireball : DukeProjectile // WorldTour only // //--------------------------------------------------------------------------- -class RedneckUWhip : DukeProjectile -{ - default - { - pic "UWHIP"; - +FULLBRIGHT; - +INFLAME; - } -} - -class RedneckOWhip : RedneckUWhip -{ - default - { - pic "OWHIP"; - } -} - class RedneckVixenShot : RedneckUWhip // COOLEXPLOSION1 { default diff --git a/wadsrc/static/zscript/games/duke/actors/redneckenemies.zs b/wadsrc/static/zscript/games/duke/actors/redneckenemies.zs index 8c5fde1c1..d45ba7967 100644 --- a/wadsrc/static/zscript/games/duke/actors/redneckenemies.zs +++ b/wadsrc/static/zscript/games/duke/actors/redneckenemies.zs @@ -442,31 +442,6 @@ class RedneckMosquito : DukeActor } } -class RedneckVixen : DukeActor -{ - default - { - pic "VIXEN"; - +INTERNAL_BADGUY; - +KILLCOUNT; - +LOOKALLAROUND; - } - - override void Initialize() - { - if (self.pal == 34) - { - self.scale = (0.34375, 0.328125); - } - else - { - self.scale = (0.34375, 0.3125); - } - self.setClipDistFromTile(); - } - -} - // only new thing in Route 66. class RedneckGator : DukeActor { diff --git a/wadsrc/static/zscript/games/duke/actors/redneckenemies/vixen.zs b/wadsrc/static/zscript/games/duke/actors/redneckenemies/vixen.zs new file mode 100644 index 000000000..dfe85e4ab --- /dev/null +++ b/wadsrc/static/zscript/games/duke/actors/redneckenemies/vixen.zs @@ -0,0 +1,114 @@ +class RedneckVixen : DukeActor +{ + default + { + pic "VIXEN"; + +INTERNAL_BADGUY; + +KILLCOUNT; + +LOOKALLAROUND; + } + +class RedneckVixen : DukeActor +{ + default + { + pic "VIXEN"; + +INTERNAL_BADGUY; + +KILLCOUNT; + +LOOKALLAROUND; + } + + override void Initialize() + { + if (self.pal == 34) + { + self.scale = (0.34375, 0.328125); + } + else + { + self.scale = (0.3125, 0.3125); + } + self.setClipDistFromTile(); + } + +} + + +class RedneckUWhip : DukeProjectile +{ + default + { + pic "UWHIP"; + +FULLBRIGHT; + +INFLAME; + } + + void shootwhip(DukeActor actor, DukePlayer p, Vector3 pos, double ang) const + { + let sect = actor.sector; + double zvel; + double vel = 300 / 16; + + if (actor.extra >= 0) actor.shade = -96; + + if (p != null) + { + let aimed = actor.aim(self); + + if (aimed) + { + double dal = ((aimed.scale.X * aimed.spriteHeight()) * 0.5); + double dist = (p.actor.pos.XY - aimed.pos.XY).Length(); + zvel = ((aimed.pos.Z - pos.Z - dal) * vel) / dist; + ang = (aimed.pos.XY - pos.XY).Angle(); + } + else + [vel, zvel] = Raze.setFreeAimVelocity(vel, zvel, p.getPitchWithView(), 49.); + } + else + { + let j = actor.findplayer(); + if (actor is 'RedneckVixen') + ang -= frandom(0, 22.5 / 8); + else + ang += frandom(-22.5 / 8, 22.5 / 8); + + double dist = (j.actor.pos.XY - actor.pos.XY).Length(); + zvel = ((j.actor.opos.Z + j.actor.oviewzoffset - pos.Z + 3) * vel) / dist; + } + + double oldzvel = zvel; + double scale = p? 0.109375 : 0.125; + + let spawned = dlevel.SpawnActor(sect, pos, self.GetClass(), -127, (scale,scale), ang, vel, zvel, actor, STAT_PROJECTILE); + if (!spawned) return; + spawned.extra += random(0, 7); + spawned.cstat = CSTAT_SPRITE_YCENTER; + spawned.clipdist = 1; + + ang = actor.Angle + frandom(-22.5 / 4, 22.5 / 4); + zvel = oldzvel + frandom(-2, 2); + } + + override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang) + { + pos.Z += 4; + shootwhip(actor, p, pos, ang); + return true; + } +} + +class RedneckOWhip : RedneckUWhip +{ + default + { + pic "OWHIP"; + } + + override bool ShootThis(DukeActor actor, DukePlayer p, Vector3 pos, double ang) + { + pos.Z -= 15; + shootwhip(actor, p, pos, ang); + return true; + } +}