diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp index 9710b126d..8e153bb55 100644 --- a/source/games/duke/src/actors.cpp +++ b/source/games/duke/src/actors.cpp @@ -681,28 +681,6 @@ void rpgexplode(DDukeActor *actor, int hit, const DVector3 &pos, int EXPLOSION2, // //--------------------------------------------------------------------------- -bool respawnmarker(DDukeActor *actor, int yellow, int green) -{ - actor->temp_data[0]++; - if (actor->temp_data[0] > gs.respawnitemtime) - { - actor->Destroy(); - return false; - } - if (actor->temp_data[0] >= (gs.respawnitemtime >> 1) && actor->temp_data[0] < ((gs.respawnitemtime >> 1) + (gs.respawnitemtime >> 2))) - actor->spr.picnum = yellow; - else if (actor->temp_data[0] > ((gs.respawnitemtime >> 1) + (gs.respawnitemtime >> 2))) - actor->spr.picnum = green; - makeitfall(actor); - return true; -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - bool rat(DDukeActor* actor, bool makesound) { makeitfall(actor); diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp index 02e77edc8..af8bb1273 100644 --- a/source/games/duke/src/actors_d.cpp +++ b/source/games/duke/src/actors_d.cpp @@ -2153,7 +2153,7 @@ DETONATEB: else { actor->temp_data[2] = gs.respawnitemtime; - spawn(actor, RESPAWNMARKERRED); + spawn(actor, PClass::FindActor("DukeRespawnMarker")); actor->spr.cstat = CSTAT_SPRITE_INVISIBLE; actor->spr.scale.Y = (0.140625); return; @@ -2196,7 +2196,7 @@ DETONATEB: else { actor->temp_data[2] = gs.respawnitemtime; - spawn(actor, RESPAWNMARKERRED); + spawn(actor, PClass::FindActor("DukeRespawnMarker")); actor->spr.cstat = CSTAT_SPRITE_INVISIBLE; } } @@ -2284,12 +2284,6 @@ void moveactors_d(void) } continue; - case RESPAWNMARKERRED: - case RESPAWNMARKERYELLOW: - case RESPAWNMARKERGREEN: - if (!respawnmarker(act, RESPAWNMARKERYELLOW, RESPAWNMARKERGREEN)) continue; - break; - case HELECOPT: case DUKECAR: diff --git a/source/games/duke/src/actors_r.cpp b/source/games/duke/src/actors_r.cpp index a668467e1..50d0221ec 100644 --- a/source/games/duke/src/actors_r.cpp +++ b/source/games/duke/src/actors_r.cpp @@ -1904,7 +1904,7 @@ DETONATEB: else { actor->temp_data[2] = gs.respawnitemtime; - spawn(actor, RESPAWNMARKERRED); + spawn(actor, PClass::FindActor("RedneckRespawnMarker")); actor->spr.cstat = CSTAT_SPRITE_INVISIBLE; } } @@ -2037,11 +2037,6 @@ void moveactors_r(void) } else switch(act->spr.picnum) { - case RESPAWNMARKERRED: - case RESPAWNMARKERYELLOW: - case RESPAWNMARKERGREEN: - if (!respawnmarker(act, RESPAWNMARKERYELLOW, RESPAWNMARKERGREEN)) continue; - break; case RAT: if (!rat(act, !isRRRA())) continue; break; diff --git a/source/games/duke/src/animatesprites_d.cpp b/source/games/duke/src/animatesprites_d.cpp index d392ce4fb..8e798577d 100644 --- a/source/games/duke/src/animatesprites_d.cpp +++ b/source/games/duke/src/animatesprites_d.cpp @@ -73,12 +73,6 @@ void animatesprites_d(tspriteArray& tsprites, const DVector2& viewVec, DAngle vi case FOOTPRINTS4: if (t->shade == 127) continue; break; - case RESPAWNMARKERRED: - case RESPAWNMARKERYELLOW: - case RESPAWNMARKERGREEN: - if (ud.marker == 0) - t->scale = DVector2(0, 0); - continue; case CHAIR3: if (hw_models && modelManager.CheckModel(t->picnum, t->pal)) { diff --git a/source/games/duke/src/animatesprites_r.cpp b/source/games/duke/src/animatesprites_r.cpp index 707c0adf6..402131ca8 100644 --- a/source/games/duke/src/animatesprites_r.cpp +++ b/source/games/duke/src/animatesprites_r.cpp @@ -176,19 +176,6 @@ void animatesprites_r(tspriteArray& tsprites, const DVector2& viewVec, DAngle vi switch (h->spr.picnum) { - case RESPAWNMARKERRED: - case RESPAWNMARKERYELLOW: - case RESPAWNMARKERGREEN: - t->picnum = 861 + ((PlayClock >> 4) & 13); - if (h->spr.picnum == RESPAWNMARKERRED) - t->pal = 0; - else if (h->spr.picnum == RESPAWNMARKERYELLOW) - t->pal = 1; - else - t->pal = 2; - if (ud.marker == 0) - t->scale = DVector2(0, 0); - break; case DUKELYINGDEAD: h->spr.scale = DVector2(0.375, 0.265625); if (h->spr.extra > 0) diff --git a/source/games/duke/src/namelist_r.h b/source/games/duke/src/namelist_r.h index d3eddc4c1..a51619e92 100644 --- a/source/games/duke/src/namelist_r.h +++ b/source/games/duke/src/namelist_r.h @@ -221,7 +221,20 @@ x(BIGAPPOS, 714) x(MINIFONT, 718) x(W_NUMBERS, 810) x(BLANK, 820) +x(RESPAWNMARKER1, 861) +x(RESPAWNMARKER2, 862) +x(RESPAWNMARKER3, 863) +x(RESPAWNMARKER4, 864) +x(RESPAWNMARKER5, 865) x(RESPAWNMARKERRED, 866) +x(RESPAWNMARKER7, 867) +x(RESPAWNMARKER8, 868) +x(RESPAWNMARKER9, 869) +x(RESPAWNMARKER10, 870) +x(RESPAWNMARKER11, 871) +x(RESPAWNMARKER12, 872) +x(RESPAWNMARKER13, 873) +x(RESPAWNMARKER14, 874) x(RESPAWNMARKERYELLOW, 876) x(RESPAWNMARKERGREEN, 886) x(SPINNINGNUKEICON0, 896) diff --git a/source/games/duke/src/spawn_d.cpp b/source/games/duke/src/spawn_d.cpp index a78a7f583..f10da68f8 100644 --- a/source/games/duke/src/spawn_d.cpp +++ b/source/games/duke/src/spawn_d.cpp @@ -434,19 +434,9 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray* act->vel.X = 292 / 16.; act->vel.Z = 360 / 256.; [[fallthrough]]; - case RESPAWNMARKERRED: case BLIMP: - - if (act->spr.picnum == RESPAWNMARKERRED) - { - act->spr.scale = DVector2(0.375, 0.375); - if (actj) act->spr.pos.Z = actj->floorz; // -(1<<4); - } - else - { - act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL; - act->clipdist = 32; - } + act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL; + act->clipdist = 32; [[fallthrough]]; case MIKE: if (act->spr.picnum == MIKE) diff --git a/source/games/duke/src/spawn_r.cpp b/source/games/duke/src/spawn_r.cpp index 26d26541c..ca385d9fa 100644 --- a/source/games/duke/src/spawn_r.cpp +++ b/source/games/duke/src/spawn_r.cpp @@ -343,18 +343,8 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray* act->spr.extra = 1; act->vel.X = 292 / 16.; act->vel.Z = 360 / 256.; - [[fallthrough]]; - case RESPAWNMARKERRED: - if (act->spr.picnum == RESPAWNMARKERRED) - { - act->spr.scale = DVector2(0.125, 0.125); - if (actj) act->spr.pos.Z = actj->floorz; - } - else - { - act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL; - act->clipdist = 32; - } + act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL; + act->clipdist = 32; [[fallthrough]]; case MIKE: if (act->spr.picnum == MIKE) diff --git a/wadsrc/static/filter/dukelike/engine/engine.def b/wadsrc/static/filter/dukelike/engine/engine.def index 82c0792b5..4e2abba80 100644 --- a/wadsrc/static/filter/dukelike/engine/engine.def +++ b/wadsrc/static/filter/dukelike/engine/engine.def @@ -42,6 +42,7 @@ spawnclasses 623 = DukeCamera 624 = DukeCamera 625 = DukeCamera + 3190 = DukeRespawnmarker 1272 = DukeTrash 634 = DukeBolt1 diff --git a/wadsrc/static/filter/redneck/engine/engine.def b/wadsrc/static/filter/redneck/engine/engine.def index defb713e2..2041c6f03 100644 --- a/wadsrc/static/filter/redneck/engine/engine.def +++ b/wadsrc/static/filter/redneck/engine/engine.def @@ -48,6 +48,7 @@ spawnclasses 1414 = DukeTongue 1439 = DukeInnerJaw 1440 = DukeInnerJaw1 + 866 = RedneckRespawnMarker 285 = RedneckChickenSpawner1 286 = RedneckChickenSpawner2 diff --git a/wadsrc/static/zscript.txt b/wadsrc/static/zscript.txt index a0a419822..f4168dda2 100644 --- a/wadsrc/static/zscript.txt +++ b/wadsrc/static/zscript.txt @@ -56,6 +56,7 @@ version "4.10" #include "zscript/games/duke/actors/touchplate.zs" #include "zscript/games/duke/actors/soundcontroller.zs" #include "zscript/games/duke/actors/respawncontroller.zs" +#include "zscript/games/duke/actors/respawnmarker.zs" #include "zscript/games/duke/actors/jibs.zs" #include "zscript/games/duke/actors/crane.zs" diff --git a/wadsrc/static/zscript/games/duke/actors/respawnmarker.zs b/wadsrc/static/zscript/games/duke/actors/respawnmarker.zs new file mode 100644 index 000000000..fa9d804bc --- /dev/null +++ b/wadsrc/static/zscript/games/duke/actors/respawnmarker.zs @@ -0,0 +1,60 @@ + + +class DukeRespawnMarker : DukeActor +{ + default + { + spriteset "RESPAWNMARKERRED", "RESPAWNMARKERYELLOW", "RESPAWNMARKERGREEN"; + scalex 0.375; + scaley 0.375; + } + + override void Initialize() + { + if (ownerActor != self) self.pos.Z = ownerActor.floorZ; + } + + override void Tick() + { + self.temp_data[0]++; + if (self.temp_data[0] > gs.respawnitemtime) + { + self.Destroy(); + return; + } + if (self.temp_data[0] >= (gs.respawnitemtime >> 1) && self.temp_data[0] < ((gs.respawnitemtime >> 1) + (gs.respawnitemtime >> 2))) + self.setSpritesetImage(1); + else if (self.temp_data[0] > ((gs.respawnitemtime >> 1) + (gs.respawnitemtime >> 2))) + self.setSpritesetImage(2); + self.makeitfall(); + } + + override bool Animate(tspritetype t) + { + if (ud.marker == 0) + t.scale = (0, 0); + return true; + } +} + +class RedneckRespawnMarker : DukeRespawnMarker +{ + default + { + spriteset "RESPAWNMARKER1", "RESPAWNMARKER2", "RESPAWNMARKER3", "RESPAWNMARKER4", "RESPAWNMARKER5", "RESPAWNMARKERRED", "RESPAWNMARKER7", + "RESPAWNMARKER8", "RESPAWNMARKER9", "RESPAWNMARKER10", "RESPAWNMARKER11", "RESPAWNMARKER12", "RESPAWNMARKER13", "RESPAWNMARKER14"; + scalex 0.125; + scaley 0.125; + } + + override bool Animate(tspritetype t) + { + t.setSpritePic(self, ((PlayClock >> 4) % 14)); + t.pal = self.spriteSetIndex; + if (ud.marker == 0) + t.scale = (0, 0); + + return true; + } + +} \ No newline at end of file