From cc6d52013d06bc26ae3e866f206b0cac3b0168d5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 2 Jan 2022 10:17:44 +0100 Subject: [PATCH] - made Duke actor flags type safe and added a few new definitions that are not active yet. --- source/games/duke/src/constants.h | 16 ++++++++++++++++ source/games/duke/src/flags_d.cpp | 22 ++++++++++++++++++++++ source/games/duke/src/flags_r.cpp | 28 ++++++++++++++++++++++++++++ source/games/duke/src/inlines.h | 17 +++++++++++++++-- source/games/duke/src/types.h | 3 ++- 5 files changed, 83 insertions(+), 3 deletions(-) diff --git a/source/games/duke/src/constants.h b/source/games/duke/src/constants.h index adfca7e47..d18eabcef 100644 --- a/source/games/duke/src/constants.h +++ b/source/games/duke/src/constants.h @@ -312,8 +312,24 @@ enum sflags_t SFLAG_KILLCOUNT = 0x10000000, SFLAG_NOCANSEECHECK = 0x20000000, SFLAG_HITRADIUSCHECK = 0x40000000, + SFLAG_MOVEFTA_CHECKSEE = 0x80000000, }; +using EDukeFlags1 = TFlags; +DEFINE_TFLAGS_OPERATORS(EDukeFlags1) + +enum sflags2_t +{ + SFLAG2_NOVEFTA_MAKESTANDABLE = 0x00000001, + SFLAG2_TRIGGER_IFHITSECTOR = 0x00000002, + SFLAG2_MOVEFTA_WAKEUPCHECK = 0x00000004, + SFLAG2_MOVEFTA_CHECKSEEWITHPAL8 = 0x00000008, // let's hope this can be done better later. For now this was what blocked merging the Duke and RR variants of movefta + +}; + +using EDukeFlags2 = TFlags; +DEFINE_TFLAGS_OPERATORS(EDukeFlags2) + enum { TFLAG_WALLSWITCH = 1 diff --git a/source/games/duke/src/flags_d.cpp b/source/games/duke/src/flags_d.cpp index cb12fa4b5..d183673d6 100644 --- a/source/games/duke/src/flags_d.cpp +++ b/source/games/duke/src/flags_d.cpp @@ -243,6 +243,28 @@ void initactorflags_d() STRIPEBALL }); + setflag(SFLAG2_TRIGGER_IFHITSECTOR, { EXPLOSION2 }); + + setflag(SFLAG2_NOVEFTA_MAKESTANDABLE, { + RUBBERCAN, + EXPLODINGBARREL, + WOODENHORSE, + HORSEONSIDE, + CANWITHSOMETHING, + CANWITHSOMETHING2, + CANWITHSOMETHING3, + CANWITHSOMETHING4, + FIREBARREL, + FIREVASE, + NUKEBARREL, + NUKEBARRELDENTED, + NUKEBARRELLEAKED, + TRIPBOMB + }); + + // 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; + gs.actorinfo[ORGANTIC].aimoffset = 32 << 8; gs.actorinfo[ROTATEGUN].aimoffset = 32 << 8; diff --git a/source/games/duke/src/flags_r.cpp b/source/games/duke/src/flags_r.cpp index ae70c79ba..5a3ac51b0 100644 --- a/source/games/duke/src/flags_r.cpp +++ b/source/games/duke/src/flags_r.cpp @@ -205,6 +205,34 @@ void initactorflags_r() STRIPEBALL }); + setflag(SFLAG_MOVEFTA_CHECKSEE, { VIXEN }); + if (isRRRA()) + { + setflag(SFLAG_MOVEFTA_CHECKSEE, { COOT, COOTSTAYPUT, BIKER, BIKERB, BIKERBV2, CHEER, CHEERB, + CHEERSTAYPUT, MINIONBOAT, HULKBOAT, CHEERBOAT, RABBIT, COOTPLAY, BILLYPLAY, MAKEOUT, MAMA }); + } + + setflag(SFLAG2_TRIGGER_IFHITSECTOR, { EXPLOSION2, EXPLOSION3 }); + + setflag(SFLAG2_NOVEFTA_MAKESTANDABLE, { + RUBBERCAN, + EXPLODINGBARREL, + WOODENHORSE, + HORSEONSIDE, + CANWITHSOMETHING, + FIREBARREL, + FIREVASE, + NUKEBARREL, + NUKEBARRELDENTED, + NUKEBARRELLEAKED + }); + + setflag(SFLAG2_MOVEFTA_WAKEUPCHECK, { HEN, COW, PIG, DOGRUN }); + if (isRRRA()) + { + setflag(SFLAG2_MOVEFTA_WAKEUPCHECK, { RABBIT }); + setflag(SFLAG2_MOVEFTA_CHECKSEEWITHPAL8, { MINION }); + } gs.actorinfo[RPG2].flags |= SFLAG_FORCEAUTOAIM; diff --git a/source/games/duke/src/inlines.h b/source/games/duke/src/inlines.h index 3087581ac..0432944c9 100644 --- a/source/games/duke/src/inlines.h +++ b/source/games/duke/src/inlines.h @@ -27,17 +27,22 @@ inline int bossguypic(int const tileNum) return ((gs.actorinfo[tileNum].flags & (SFLAG_BOSS)) != 0); } -inline int actorflag(DDukeActor * actor, int mask) +inline int actorflag(DDukeActor * actor, EDukeFlags1 mask) { return (((gs.actorinfo[actor->spr.picnum].flags) & mask) != 0); } +inline int actorflag(DDukeActor* actor, EDukeFlags2 mask) +{ + return (((gs.actorinfo[actor->spr.picnum].flags2) & mask) != 0); +} + inline int actorfella(DDukeActor* actor) { return actorflag(actor, SFLAG_KILLCOUNT); } -inline void setflag(int flag, const std::initializer_list& types) +inline void setflag(EDukeFlags1 flag, const std::initializer_list& types) { for (auto val : types) { @@ -45,6 +50,14 @@ inline void setflag(int flag, const std::initializer_list& types) } } +inline void setflag(EDukeFlags2 flag, const std::initializer_list& types) +{ + for (auto val : types) + { + gs.actorinfo[val].flags2 |= flag; + } +} + inline bool inventory(DDukeActor* S) { return !!(gs.actorinfo[S->spr.picnum].flags & SFLAG_INVENTORY); diff --git a/source/games/duke/src/types.h b/source/games/duke/src/types.h index bea2c8523..5d0f2051f 100644 --- a/source/games/duke/src/types.h +++ b/source/games/duke/src/types.h @@ -120,7 +120,8 @@ struct animwalltype struct ActorInfo { uint32_t scriptaddress; - uint32_t flags; + EDukeFlags1 flags; + EDukeFlags2 flags2; int aimoffset; int falladjustz; int gutsoffset;