From 26d951108770c8e0f7cbce9e23484dd4969443c2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Nov 2022 20:00:21 +0100 Subject: [PATCH] - scriptified the octabrain projectile. --- source/games/duke/src/actors_d.cpp | 26 ------ source/games/duke/src/animatesprites_d.cpp | 4 - source/games/duke/src/spawn_d.cpp | 1 - .../static/filter/dukelike/engine/engine.def | 1 + .../zscript/games/duke/actors/projectiles.zs | 80 +++++++++++++++++++ 5 files changed, 81 insertions(+), 31 deletions(-) diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp index e7ce0e543..41b4a1b21 100644 --- a/source/games/duke/src/actors_d.cpp +++ b/source/games/duke/src/actors_d.cpp @@ -892,10 +892,6 @@ static bool weaponhitsector(DDukeActor* proj, const DVector3& oldpos, bool fireb static void weaponcommon_d(DDukeActor* proj) { - if (proj->spr.picnum == COOLEXPLOSION1) - if (!S_CheckActorSoundPlaying(proj, WIERDSHOT_FLY)) - S_PlayActorSound(WIERDSHOT_FLY, proj); - double vel = proj->vel.X; double velz = proj->vel.Z; @@ -940,16 +936,6 @@ static void weaponcommon_d(DDukeActor* proj) if (coll.type != 0) { - if (proj->spr.picnum == COOLEXPLOSION1) - { - if (coll.type == kHitSprite && !coll.actor()->isPlayer()) - { - return; - } - proj->vel.X = 0; - proj->vel.Z = 0; - } - bool fireball = (isWorldTour() && proj->spr.picnum == FIREBALL && (!proj->GetOwner() || proj->GetOwner()->spr.picnum != FIREBALL)); if (coll.type == kHitSprite) @@ -1000,15 +986,6 @@ static void weaponcommon_d(DDukeActor* proj) return; } } - if (proj->spr.picnum == COOLEXPLOSION1) - { - proj->spr.shade++; - if (proj->spr.shade >= 40) - { - proj->Destroy(); - return; - } - } } //--------------------------------------------------------------------------- // @@ -1038,9 +1015,6 @@ void moveweapons_d(void) case FIREBALL: // Twentieth Anniversary World Tour if (act->spr.picnum == FIREBALL && !isWorldTour()) break; - [[fallthrough]]; - case SPIT: - case COOLEXPLOSION1: weaponcommon_d(act); break; diff --git a/source/games/duke/src/animatesprites_d.cpp b/source/games/duke/src/animatesprites_d.cpp index d5b1c7879..2be7651d9 100644 --- a/source/games/duke/src/animatesprites_d.cpp +++ b/source/games/duke/src/animatesprites_d.cpp @@ -519,10 +519,6 @@ void animatesprites_d(tspriteArray& tsprites, const DVector2& viewVec, DAngle vi t->pos.Z = t->sectp->floorz; t->shade = -127; break; - case COOLEXPLOSION1: - t->shade = -127; - t->picnum += (h->spr.shade >> 1); - break; case PLAYERONWATER: if (hw_models && modelManager.CheckModel(h->spr.picnum, h->spr.pal)) { diff --git a/source/games/duke/src/spawn_d.cpp b/source/games/duke/src/spawn_d.cpp index 5c7dd5e62..f958426e2 100644 --- a/source/games/duke/src/spawn_d.cpp +++ b/source/games/duke/src/spawn_d.cpp @@ -442,7 +442,6 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray* case BURNING2: case SMALLSMOKE: case SHRINKEREXPLOSION: - case COOLEXPLOSION1: if (actj) { diff --git a/wadsrc/static/filter/dukelike/engine/engine.def b/wadsrc/static/filter/dukelike/engine/engine.def index 47b821914..fe2f5764f 100644 --- a/wadsrc/static/filter/dukelike/engine/engine.def +++ b/wadsrc/static/filter/dukelike/engine/engine.def @@ -60,6 +60,7 @@ spawnclasses 2605 = DukeRPG 1641 = DukeFreezeBlast 1636 = DukeSpit + 1360 = DukeCoolExplosion1 1272 = DukeTrash 634 = DukeBolt1 diff --git a/wadsrc/static/zscript/games/duke/actors/projectiles.zs b/wadsrc/static/zscript/games/duke/actors/projectiles.zs index 700c96f77..6aa743a14 100644 --- a/wadsrc/static/zscript/games/duke/actors/projectiles.zs +++ b/wadsrc/static/zscript/games/duke/actors/projectiles.zs @@ -503,3 +503,83 @@ class DukeSpit : DukeProjectile } } +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +class DukeCoolExplosion1 : DukeProjectile // octabrain shot. +{ + default + { + spriteset "COOLEXPLOSION1", "COOLEXPLOSION2", "COOLEXPLOSION3", "COOLEXPLOSION4", "COOLEXPLOSION5", + "COOLEXPLOSION6", "COOLEXPLOSION7", "COOLEXPLOSION8", "COOLEXPLOSION9", "COOLEXPLOSION10", + "COOLEXPLOSION11", "COOLEXPLOSION12", "COOLEXPLOSION13", "COOLEXPLOSION14", "COOLEXPLOSION15", + "COOLEXPLOSION16", "COOLEXPLOSION17", "COOLEXPLOSION18", "COOLEXPLOSION19", "COOLEXPLOSION20"; + } + + override void Initialize() + { + self.angle = self.ownerActor.angle; + self.shade = -64; + self.cstat = CSTAT_SPRITE_YCENTER | self.randomXFlip(); + + double c, f; + [c, f] = self.sector.getSlopes(self.pos.XY); + if (self.pos.Z > f - 12) + self.pos.Z = f - 12; + } + + override bool premoveeffect() + { + if (!self.CheckSoundPlaying("WIERDSHOT_FLY")) + self.PlayActorSound("WIERDSHOT_FLY"); + return false; + } + + override bool weaponhitsprite_pre(DukeActor targ) + { + if (!targ.isPlayer()) + { + return true; + } + self.vel.X = self.vel.Z = 0; + return super.weaponhitsprite_pre(targ); + } + + override bool weaponhitwall(walltype wal) + { + self.vel.X = self.vel.Z = 0; + return super.weaponhitwall(wal); + } + + override bool weaponhitsector() + { + self.vel.X = self.vel.Z = 0; + return super.weaponhitsector(); + } + + override void posthiteffect(CollisionData coll) + { + // don't destroy. + } + + override void Tick() + { + Super.Tick(); + if (++self.shade >= 40) + { + self.Destroy(); + } + } + + override bool animate(tspritetype tspr) + { + tspr.setSpritePic(self, clamp((self.shade >> 1), 0, 19)); + tspr.shade = -127; + return true; + } + +} +