From 5358b3d98c5fb81056e2fcf601e02800b693b635 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Nov 2022 14:29:34 +0100 Subject: [PATCH] - added a new sprite flag for those types which can trigger respawn actions. --- source/games/duke/src/actors.cpp | 18 ++++++++++++++++++ source/games/duke/src/actors_d.cpp | 25 ------------------------- source/games/duke/src/actors_r.cpp | 15 --------------- source/games/duke/src/constants.h | 1 + source/games/duke/src/dispatch.cpp | 4 ---- source/games/duke/src/duke3d.h | 1 - source/games/duke/src/flags_d.cpp | 18 ++++++++++++++++++ source/games/duke/src/flags_r.cpp | 7 +++++++ source/games/duke/src/funct.h | 2 +- source/games/duke/src/gameexec.cpp | 2 +- source/games/duke/src/player.cpp | 4 ++-- source/games/duke/src/player_d.cpp | 2 +- source/games/duke/src/player_r.cpp | 2 +- source/games/duke/src/sectors_d.cpp | 18 +----------------- source/games/duke/src/sectors_r.cpp | 8 +++----- source/games/duke/src/spawn_d.cpp | 10 +++++++--- source/games/duke/src/spawn_r.cpp | 8 ++++++-- 17 files changed, 67 insertions(+), 78 deletions(-) diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp index 4a1a5298d..7cd856b79 100644 --- a/source/games/duke/src/actors.cpp +++ b/source/games/duke/src/actors.cpp @@ -51,6 +51,24 @@ BEGIN_DUKE_NS double adjustfall(DDukeActor* actor, double c); +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +void respawnhitag(DDukeActor* actor) +{ + if (actorflag(actor, SFLAG2_TRIGGERRESPAWN)) + { + if (actor->spr.yint) operaterespawns(actor->spr.yint); + } + else + { + if (actor->spr.hitag >= 0) operaterespawns(actor->spr.hitag); + } +} + //--------------------------------------------------------------------------- // // this was once a macro diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp index 087b9dbd6..20f08c879 100644 --- a/source/games/duke/src/actors_d.cpp +++ b/source/games/duke/src/actors_d.cpp @@ -2641,31 +2641,6 @@ bool spawnweapondebris_d(int picnum) return picnum == BLIMP; } -void respawnhitag_d(DDukeActor* actor) -{ - switch (actor->spr.picnum) - { - case FEM1: - case FEM2: - case FEM3: - case FEM4: - case FEM5: - case FEM6: - case FEM7: - case FEM8: - case FEM9: - case FEM10: - case PODFEM1: - case NAKED1: - case STATUE: - if (actor->spr.yint) operaterespawns(actor->spr.yint); - break; - default: - if (actor->spr.hitag >= 0) operaterespawns(actor->spr.hitag); - break; - } -} - //--------------------------------------------------------------------------- // // diff --git a/source/games/duke/src/actors_r.cpp b/source/games/duke/src/actors_r.cpp index 4ec88a360..0823b7385 100644 --- a/source/games/duke/src/actors_r.cpp +++ b/source/games/duke/src/actors_r.cpp @@ -2663,21 +2663,6 @@ bool spawnweapondebris_r(int picnum) return true; } -void respawnhitag_r(DDukeActor *actor) -{ - switch (actor->spr.picnum) - { - case FEM10: - case NAKED1: - case STATUE: - if (actor->spr.yint) operaterespawns(actor->spr.yint); - break; - default: - if (actor->spr.hitag >= 0) operaterespawns(actor->spr.hitag); - break; - } -} - //--------------------------------------------------------------------------- // // diff --git a/source/games/duke/src/constants.h b/source/games/duke/src/constants.h index 9f37f97c2..e7d5b0466 100644 --- a/source/games/duke/src/constants.h +++ b/source/games/duke/src/constants.h @@ -381,6 +381,7 @@ enum sflags2_t SFLAG2_MIRRORREFLECT = 0x08000000, SFLAG2_ALTPROJECTILESPRITE = 0x10000000, // yet another shooter flag. :( SFLAG2_UNDERWATERSLOWDOWN = 0x20000000, + SFLAG2_TRIGGERRESPAWN = 0x40000000, }; diff --git a/source/games/duke/src/dispatch.cpp b/source/games/duke/src/dispatch.cpp index 304d1a532..5a6497f11 100644 --- a/source/games/duke/src/dispatch.cpp +++ b/source/games/duke/src/dispatch.cpp @@ -68,8 +68,6 @@ void fall_d(DDukeActor* i, int g_p); void fall_r(DDukeActor* i, int g_p); bool spawnweapondebris_d(int picnum); bool spawnweapondebris_r(int picnum); -void respawnhitag_d(DDukeActor* g_sp); -void respawnhitag_r(DDukeActor* g_sp); void move_d(DDukeActor* i, int g_p, int g_x); void move_r(DDukeActor* i, int g_p, int g_x); void incur_damage_d(player_struct* p); @@ -124,7 +122,6 @@ void SetDispatcher() ifhitbyweapon_d, fall_d, spawnweapondebris_d, - respawnhitag_d, move_d, incur_damage_d, @@ -163,7 +160,6 @@ void SetDispatcher() ifhitbyweapon_r, fall_r, spawnweapondebris_r, - respawnhitag_r, move_r, incur_damage_r, diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index 6f03e893a..d01ccdba0 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -94,7 +94,6 @@ struct Dispatcher int (*ifhitbyweapon)(DDukeActor* sectnum); void (*fall)(DDukeActor* actor, int g_p); bool (*spawnweapondebris)(int picnum); - void (*respawnhitag)(DDukeActor* g_sp); void (*move)(DDukeActor* i, int g_p, int g_x); // player diff --git a/source/games/duke/src/flags_d.cpp b/source/games/duke/src/flags_d.cpp index 16423baa2..6d8c12a53 100644 --- a/source/games/duke/src/flags_d.cpp +++ b/source/games/duke/src/flags_d.cpp @@ -197,6 +197,24 @@ void initactorflags_d() TRIPBOMB }); + setflag(SFLAG2_TRIGGERRESPAWN, { + FEM1, + FEM2, + FEM3, + FEM4, + FEM5, + FEM6, + FEM7, + FEM8, + FEM9, + FEM10, + PODFEM1, + NAKED1, + STATUE, + TOUGHGAL + }); + + // The feature guarded by this flag does not exist in Duke, it always acts as if the flag was set. for (auto& ainf : gs.actorinfo) ainf.flags |= SFLAG_MOVEFTA_CHECKSEE; diff --git a/source/games/duke/src/flags_r.cpp b/source/games/duke/src/flags_r.cpp index e58377530..8f14b935f 100644 --- a/source/games/duke/src/flags_r.cpp +++ b/source/games/duke/src/flags_r.cpp @@ -183,6 +183,13 @@ void initactorflags_r() setflag(SFLAG2_FREEZEDAMAGE | SFLAG2_REFLECTIVE, { FREEZEBLAST }); setflag(SFLAG2_FLOATING, { DRONE }); + setflag(SFLAG2_TRIGGERRESPAWN, { + FEM10, + PODFEM1, + NAKED1, + STATUE, + TOUGHGAL + }); // Animals were not supposed to have this, but due to a coding bug the logic was unconditional for everything in the game. for (auto& ainf : gs.actorinfo) diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h index 00b5953ee..31a862dfb 100644 --- a/source/games/duke/src/funct.h +++ b/source/games/duke/src/funct.h @@ -93,7 +93,7 @@ int wakeup(DDukeActor* sn, int pn); int timedexit(int snum); -void dokneeattack(int snum, const std::initializer_list& respawnlist); +void dokneeattack(int snum); int endoflevel(int snum); void playerisdead(int snum, int psectlotag, double fz, double cz); void footprints(int snum); diff --git a/source/games/duke/src/gameexec.cpp b/source/games/duke/src/gameexec.cpp index bbb3f4651..db94c149a 100644 --- a/source/games/duke/src/gameexec.cpp +++ b/source/games/duke/src/gameexec.cpp @@ -2829,7 +2829,7 @@ int ParseState::parse(void) break; case concmd_respawnhitag: insptr++; - fi.respawnhitag(g_ac); + respawnhitag(g_ac); break; case concmd_ifspritepal: insptr++; diff --git a/source/games/duke/src/player.cpp b/source/games/duke/src/player.cpp index 9c6bcd3a8..4d2dd066b 100644 --- a/source/games/duke/src/player.cpp +++ b/source/games/duke/src/player.cpp @@ -372,7 +372,7 @@ DDukeActor* aim(DDukeActor* actor, int abase) // //--------------------------------------------------------------------------- -void dokneeattack(int snum, const std::initializer_list & respawnlist) +void dokneeattack(int snum) { auto p = &ps[snum]; @@ -393,7 +393,7 @@ void dokneeattack(int snum, const std::initializer_list & respawnlist) spawnguts(p->actorsqu, PClass::FindActor("DukeJibs6"), 7); spawn(p->actorsqu, TILE_BLOODPOOL); S_PlayActorSound(SQUISHED, p->actorsqu); - if (isIn(p->actorsqu->spr.picnum, respawnlist)) + if (actorflag(p->actorsqu, SFLAG2_TRIGGERRESPAWN)) { if (p->actorsqu->spr.yint) operaterespawns(p->actorsqu->spr.yint); diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index f0671a06b..03f57aedc 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -3143,7 +3143,7 @@ HORIZONLY: } } - dokneeattack(snum, { FEM1, FEM2, FEM3, FEM4, FEM5, FEM6, FEM7, FEM8, FEM9, FEM10, PODFEM1, NAKED1, STATUE }); + dokneeattack(snum); if (fi.doincrements(p)) return; diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index bfd1518b7..0a46afdc9 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -3865,7 +3865,7 @@ HORIZONLY: return; } } - dokneeattack(snum, { FEM10, NAKED1, STATUE }); + dokneeattack(snum); if (fi.doincrements(p)) return; diff --git a/source/games/duke/src/sectors_d.cpp b/source/games/duke/src/sectors_d.cpp index f024a4f72..88d0eed36 100644 --- a/source/games/duke/src/sectors_d.cpp +++ b/source/games/duke/src/sectors_d.cpp @@ -1344,24 +1344,8 @@ void checksectors_d(int snum) neartag(p->GetActor()->getPosWithOffsetZ().plusZ(16), p->GetActor()->sector(), p->GetActor()->PrevAngles.Yaw, near, 80., NT_Lotag | NT_Hitag); if (near.actor() != nullptr) { - switch (near.actor()->spr.picnum) - { - case FEM1: - case FEM2: - case FEM3: - case FEM4: - case FEM5: - case FEM6: - case FEM7: - case FEM8: - case FEM9: - case FEM10: - case PODFEM1: - case NAKED1: - case STATUE: - case TOUGHGAL: + if (actorflag(near.actor(), SFLAG2_TRIGGERRESPAWN)) return; - } } near.clearObj(); diff --git a/source/games/duke/src/sectors_r.cpp b/source/games/duke/src/sectors_r.cpp index 7f4d53fec..7c5435b3e 100644 --- a/source/games/duke/src/sectors_r.cpp +++ b/source/games/duke/src/sectors_r.cpp @@ -1722,13 +1722,11 @@ void checksectors_r(int snum) neartag(p->GetActor()->getPosWithOffsetZ().plusZ(16), p->GetActor()->sector(), p->GetActor()->PrevAngles.Yaw, near, 80., NT_Lotag | NT_Hitag); if (near.actor() != nullptr) { + if (actorflag(near.actor(), SFLAG2_TRIGGERRESPAWN)) + return; + switch (near.actor()->spr.picnum) { - case FEM10: - case NAKED1: - case STATUE: - case TOUGHGAL: - return; case COW: near.actor()->spriteextra = 1; return; diff --git a/source/games/duke/src/spawn_d.cpp b/source/games/duke/src/spawn_d.cpp index 60db3c9d7..1c7bbb2a5 100644 --- a/source/games/duke/src/spawn_d.cpp +++ b/source/games/duke/src/spawn_d.cpp @@ -43,6 +43,12 @@ BEGIN_DUKE_NS DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray* actors) { + if (actorflag(act, SFLAG2_TRIGGERRESPAWN)) + { + act->spr.yint = act->spr.hitag; + act->spr.hitag = -1; + } + if (act->GetClass() != RUNTIME_CLASS(DDukeActor)) { CallInitialize(act); @@ -50,6 +56,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray* } auto sectp = act->sector(); + if (isWorldTour()) { switch (act->spr.picnum) @@ -331,10 +338,7 @@ DDukeActor* spawninit_d(DDukeActor* actj, DDukeActor* act, TArray* case FEM10: case PODFEM1: case NAKED1: - case STATUE: case TOUGHGAL: - act->spr.yint = act->spr.hitag; - act->spr.hitag = -1; if (act->spr.picnum == PODFEM1) act->spr.extra <<= 1; [[fallthrough]]; diff --git a/source/games/duke/src/spawn_r.cpp b/source/games/duke/src/spawn_r.cpp index d2dd81be8..7836f2da8 100644 --- a/source/games/duke/src/spawn_r.cpp +++ b/source/games/duke/src/spawn_r.cpp @@ -37,6 +37,12 @@ BEGIN_DUKE_NS DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray* actors) { + if (actorflag(act, SFLAG2_TRIGGERRESPAWN)) + { + act->spr.yint = act->spr.hitag; + act->spr.hitag = -1; + } + if (act->GetClass() != RUNTIME_CLASS(DDukeActor)) { CallInitialize(act); @@ -233,8 +239,6 @@ DDukeActor* spawninit_r(DDukeActor* actj, DDukeActor* act, TArray* case NAKED1: case STATUE: case TOUGHGAL: - act->spr.yint = act->spr.hitag; - act->spr.hitag = -1; act->spr.cstat |= CSTAT_SPRITE_BLOCK_ALL; act->clipdist = 8; ChangeActorStat(act, STAT_ZOMBIEACTOR);