From da5a92852f9b8cbf423b8aa970e9fa86afa4e399 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 7 Jan 2022 16:36:02 +0100 Subject: [PATCH] - cleanup of Duke's actor flags. --- source/games/duke/src/actors.cpp | 18 +- source/games/duke/src/animatesprites_r.cpp | 2 +- source/games/duke/src/constants.h | 51 +++--- source/games/duke/src/flags_d.cpp | 185 +++++++++++---------- source/games/duke/src/flags_r.cpp | 153 ++++++++--------- source/games/duke/src/spawn.cpp | 19 ++- source/games/duke/src/types.h | 3 +- 7 files changed, 225 insertions(+), 206 deletions(-) diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp index 6deebc06928..809b06e1bb7 100644 --- a/source/games/duke/src/actors.cpp +++ b/source/games/duke/src/actors.cpp @@ -2892,7 +2892,9 @@ void handle_se14(DDukeActor* actor, bool checkstat, int RPG, int JIBS6) DukeSectIterator it(actor->sector()); while (auto a2 = it.Next()) { - if (a2->spr.statnum != 10 && a2->sector()->lotag != 2 && a2->spr.picnum != SECTOREFFECTOR && a2->spr.picnum != LOCATORS) + if (a2->spr.statnum != STAT_PLAYER && a2->sector()->lotag != 2 && + (a2->spr.picnum != SECTOREFFECTOR || a2->spr.lotag == SE_49_POINT_LIGHT || a2->spr.lotag == SE_50_SPOT_LIGHT) && + a2->spr.picnum != LOCATORS) { rotatepoint(actor->spr.pos.vec2, a2->spr.pos.vec2, q, &a2->spr.pos.vec2); @@ -4035,7 +4037,7 @@ DDukeActor* ifhitsectors(sectortype* sect) DukeStatIterator it(STAT_MISC); while (auto a1 = it.Next()) { - if (actorflag(a1, SFLAG2_TRIGGER_IFHITSECTOR) && sect == a1->sector()) + if (actorflag(a1, SFLAG_TRIGGER_IFHITSECTOR) && sect == a1->sector()) return a1; } return nullptr; @@ -4836,16 +4838,14 @@ void getglobalz(DDukeActor* actor) { if( actor->spr.statnum != STAT_PROJECTILE) { - actor->aflags |= SFLAG_NOFLOORSHADOW; - //actor->dispicnum = -4; // No shadows on actors + actor->dispicnum = -4; // No shadows on actors actor->spr.xvel = -256; ssp(actor, CLIPMASK0); } } else if(lz.actor()->isPlayer() && badguy(actor) ) { - actor->aflags |= SFLAG_NOFLOORSHADOW; - //actor->dispicnum = -4; // No shadows on actors + actor->dispicnum = -4; // No shadows on actors actor->spr.xvel = -256; ssp(actor, CLIPMASK0); } @@ -5276,7 +5276,7 @@ void movefta(void) // SFLAG_MOVEFTA_CHECKSEE is set for all actors in Duke. if (act->spr.pal == 33 || actorflag(act, SFLAG_MOVEFTA_CHECKSEE) || - (actorflag(act, SFLAG2_MOVEFTA_CHECKSEEWITHPAL8) && act->spr.pal == 8) || + (actorflag(act, SFLAG_MOVEFTA_CHECKSEEWITHPAL8) && act->spr.pal == 8) || (bcos(act->spr.ang) * (px - sx) + bsin(act->spr.ang) * (py - sy) >= 0)) { int r1 = krand(); @@ -5294,7 +5294,7 @@ void movefta(void) if (canseeme) { - if (actorflag(act, SFLAG2_MOVEFTA_MAKESTANDABLE)) + if (actorflag(act, SFLAG_MOVEFTA_MAKESTANDABLE)) { if (act->sector()->ceilingstat & CSTAT_SECTOR_SKY) act->spr.shade = act->sector()->ceilingshade; @@ -5320,7 +5320,7 @@ void movefta(void) else act->spr.shade = act->sector()->floorshade; // wakeup is an RR feature, this flag will later allow it to use in Duke, too. - if (actorflag(act, SFLAG2_MOVEFTA_WAKEUPCHECK)) + if (actorflag(act, SFLAG_MOVEFTA_WAKEUPCHECK)) { if (wakeup(act, p)) { diff --git a/source/games/duke/src/animatesprites_r.cpp b/source/games/duke/src/animatesprites_r.cpp index 4395af1efa8..83a45bd615b 100644 --- a/source/games/duke/src/animatesprites_r.cpp +++ b/source/games/duke/src/animatesprites_r.cpp @@ -719,7 +719,7 @@ void animatesprites_r(tspritetype* tsprite, int& spritesortcnt, int x, int y, in if (!isRRRA() && h->spr.picnum == SBMOVE) t->shade = -127; - if (h->spr.statnum == 13 || badguy(h) || (h->spr.picnum == APLAYER && h->GetOwner())) + if (h->spr.statnum == STAT_DUMMYPLAYER || badguy(h) || (h->spr.picnum == APLAYER && h->GetOwner())) if ((h->spr.cstat & CSTAT_SPRITE_ALIGNMENT_MASK) == 0 && t->statnum != 99) if (h->spr.picnum != EXPLOSION2 && h->spr.picnum != DOMELITE && h->spr.picnum != TORNADO && h->spr.picnum != EXPLOSION3 && (h->spr.picnum != SBMOVE || isRRRA())) { diff --git a/source/games/duke/src/constants.h b/source/games/duke/src/constants.h index 0e1745bcd69..cc8bf1c646f 100644 --- a/source/games/duke/src/constants.h +++ b/source/games/duke/src/constants.h @@ -291,28 +291,32 @@ enum amoveflags_t antifaceplayerslow = 32768 }; +enum aflags_t +{ + AFLAG_USEACTIVATOR = 0x00000001, +}; + enum sflags_t { - SFLAG_SHADOW = 0x00000001, - SFLAG_NVG = 0x00000002, - SFLAG_INVENTORY = 0x00000004, - SFLAG_ADULT = 0x00000008, - SFLAG_SHRINKAUTOAIM = 0x00000010, - SFLAG_BADGUY = 0x00000020, - SFLAG_NOPAL = 0x00000040, - SFLAG_FORCEAUTOAIM = 0x00000080, - SFLAG_BOSS = 0x00000100, - SFLAG_USEACTIVATOR = 0x00000200, - SFLAG_NOFLOORSHADOW = 0x00001000, // for temp. internal use, per-tile flag not checked - SFLAG_BADGUYSTAYPUT = 0x00008000, - SFLAG_GREENSLIMEFOOD = 0x00800000, - SFLAG_NODAMAGEPUSH = 0x00100000, - SFLAG_NOWATERDIP = 0x00200000, - SFLAG_INTERNAL_BADGUY = 0x08000000, // a separate flag is needed for the internal ones because SFLAG_BADGUY has additional semantics. - SFLAG_KILLCOUNT = 0x10000000, - SFLAG_NOCANSEECHECK = 0x20000000, - SFLAG_HITRADIUSCHECK = 0x40000000, - SFLAG_MOVEFTA_CHECKSEE = 0x80000000, + SFLAG_INVENTORY = 0x00000001, + SFLAG_SHRINKAUTOAIM = 0x00000002, + SFLAG_BADGUY = 0x00000004, + SFLAG_FORCEAUTOAIM = 0x00000008, + SFLAG_BOSS = 0x00000010, + SFLAG_BADGUYSTAYPUT = 0x00000020, + SFLAG_GREENSLIMEFOOD = 0x00800040, + SFLAG_NODAMAGEPUSH = 0x00000080, + SFLAG_NOWATERDIP = 0x00000100, + SFLAG_INTERNAL_BADGUY = 0x00000200, // a separate flag is needed for the internal ones because SFLAG_BADGUY has additional semantics. + SFLAG_KILLCOUNT = 0x00000400, + SFLAG_NOCANSEECHECK = 0x00000800, + SFLAG_HITRADIUSCHECK = 0x00001000, + SFLAG_MOVEFTA_CHECKSEE = 0x00002000, + SFLAG_MOVEFTA_MAKESTANDABLE = 0x00004000, + SFLAG_TRIGGER_IFHITSECTOR = 0x00008000, + SFLAG_MOVEFTA_WAKEUPCHECK = 0x00010000, + SFLAG_MOVEFTA_CHECKSEEWITHPAL8 = 0x00020000, // let's hope this can be done better later. For now this was what blocked merging the Duke and RR variants of movefta + }; using EDukeFlags1 = TFlags; @@ -320,10 +324,6 @@ DEFINE_TFLAGS_OPERATORS(EDukeFlags1) enum sflags2_t { - SFLAG2_MOVEFTA_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 }; @@ -332,7 +332,8 @@ DEFINE_TFLAGS_OPERATORS(EDukeFlags2) enum { - TFLAG_WALLSWITCH = 1 + TFLAG_WALLSWITCH = 1, + TFLAG_ADULT = 2, }; enum diff --git a/source/games/duke/src/flags_d.cpp b/source/games/duke/src/flags_d.cpp index 9ccffb58dcd..4238d8ba811 100644 --- a/source/games/duke/src/flags_d.cpp +++ b/source/games/duke/src/flags_d.cpp @@ -40,118 +40,49 @@ BEGIN_DUKE_NS void initactorflags_d() { - gs.actorinfo[COMMANDER].gutsoffset = -(24 << 8); - - for (auto &fa : gs.actorinfo) - { - fa.falladjustz = 24 << 8; - } - gs.actorinfo[OCTABRAIN].falladjustz = gs.actorinfo[COMMANDER].falladjustz = gs.actorinfo[DRONE].falladjustz = 0; - - setflag(SFLAG_INTERNAL_BADGUY, { - SHARK, - RECON, - DRONE, - LIZTROOPONTOILET, - LIZTROOPJUSTSIT, - LIZTROOPSTAYPUT, - LIZTROOPSHOOT, - LIZTROOPJETPACK, - LIZTROOPDUCKING, - LIZTROOPRUNNING, - LIZTROOP, - OCTABRAIN, - COMMANDER, - COMMANDERSTAYPUT, - PIGCOP, - EGG, - PIGCOPSTAYPUT, - PIGCOPDIVE, - LIZMAN, - LIZMANSPITTING, - LIZMANFEEDING, - LIZMANJUMP, - ORGANTIC, - BOSS1, - BOSS2, - BOSS3, - BOSS4, - GREENSLIME, - GREENSLIME+1, - GREENSLIME+2, - GREENSLIME+3, - GREENSLIME+4, - GREENSLIME+5, - GREENSLIME+6, - GREENSLIME+7, - RAT, - ROTATEGUN }); - - // Some flags taken from RedNukem's init code. This is a good start as any to reduce the insane dependency on tile numbers for making decisions in the play code. A lot more will be added here later. - setflag(SFLAG_NODAMAGEPUSH, { TANK, BOSS1, BOSS2, BOSS3, BOSS4, RECON, ROTATEGUN }); - setflag(SFLAG_BOSS, { BOSS1, BOSS2, BOSS3, BOSS4, BOSS4STAYPUT, BOSS1STAYPUT }); - if (isWorldTour()) setflag(SFLAG_BOSS, { BOSS2STAYPUT, BOSS3STAYPUT, BOSS5, BOSS5STAYPUT }); - setflag(SFLAG_NOWATERDIP, { OCTABRAIN, COMMANDER, DRONE }); - setflag(SFLAG_GREENSLIMEFOOD, { LIZTROOP, LIZMAN, PIGCOP, NEWBEAST }); - - if (isWorldTour()) - { - setflag(SFLAG_INTERNAL_BADGUY, { FIREFLY }); - setflag(SFLAG_INTERNAL_BADGUY|SFLAG_NODAMAGEPUSH|SFLAG_BOSS, { BOSS5 }); - } - settileflag(TFLAG_WALLSWITCH, { HANDPRINTSWITCH, - HANDPRINTSWITCH+1, + HANDPRINTSWITCH + 1, ALIENSWITCH, - ALIENSWITCH+1, + ALIENSWITCH + 1, MULTISWITCH, - MULTISWITCH+1, - MULTISWITCH+2, - MULTISWITCH+3, + MULTISWITCH + 1, + MULTISWITCH + 2, + MULTISWITCH + 3, ACCESSSWITCH, ACCESSSWITCH2, PULLSWITCH, - PULLSWITCH+1, + PULLSWITCH + 1, HANDSWITCH, - HANDSWITCH+1, + HANDSWITCH + 1, SLOTDOOR, - SLOTDOOR+1, + SLOTDOOR + 1, LIGHTSWITCH, - LIGHTSWITCH+1, + LIGHTSWITCH + 1, SPACELIGHTSWITCH, - SPACELIGHTSWITCH+1, + SPACELIGHTSWITCH + 1, SPACEDOORSWITCH, - SPACEDOORSWITCH+1, + SPACEDOORSWITCH + 1, FRANKENSTINESWITCH, - FRANKENSTINESWITCH+1, + FRANKENSTINESWITCH + 1, LIGHTSWITCH2, - LIGHTSWITCH2+1, + LIGHTSWITCH2 + 1, POWERSWITCH1, - POWERSWITCH1+1, + POWERSWITCH1 + 1, LOCKSWITCH1, - LOCKSWITCH1+1, + LOCKSWITCH1 + 1, POWERSWITCH2, - POWERSWITCH2+1, + POWERSWITCH2 + 1, DIPSWITCH, - DIPSWITCH+1, + DIPSWITCH + 1, DIPSWITCH2, - DIPSWITCH2+1, + DIPSWITCH2 + 1, TECHSWITCH, - TECHSWITCH+1, + TECHSWITCH + 1, DIPSWITCH3, - DIPSWITCH3+1}); + DIPSWITCH3 + 1 }); - setflag(SFLAG_INVENTORY, { - FIRSTAID, - STEROIDS, - HEATSENSOR, - BOOTS, - JETPACK, - HOLODUKE, - AIRTANK }); - - setflag(SFLAG_ADULT, { + settileflag(TFLAG_ADULT, { FEM1, FEM2, FEM3, @@ -213,6 +144,76 @@ void initactorflags_d() 4498, 4957 }); + + gs.actorinfo[COMMANDER].gutsoffset = -(24 << 8); + + for (auto &fa : gs.actorinfo) + { + fa.falladjustz = 24 << 8; + } + gs.actorinfo[OCTABRAIN].falladjustz = gs.actorinfo[COMMANDER].falladjustz = gs.actorinfo[DRONE].falladjustz = 0; + + setflag(SFLAG_INTERNAL_BADGUY, { + SHARK, + RECON, + DRONE, + LIZTROOPONTOILET, + LIZTROOPJUSTSIT, + LIZTROOPSTAYPUT, + LIZTROOPSHOOT, + LIZTROOPJETPACK, + LIZTROOPDUCKING, + LIZTROOPRUNNING, + LIZTROOP, + OCTABRAIN, + COMMANDER, + COMMANDERSTAYPUT, + PIGCOP, + EGG, + PIGCOPSTAYPUT, + PIGCOPDIVE, + LIZMAN, + LIZMANSPITTING, + LIZMANFEEDING, + LIZMANJUMP, + ORGANTIC, + BOSS1, + BOSS2, + BOSS3, + BOSS4, + GREENSLIME, + GREENSLIME+1, + GREENSLIME+2, + GREENSLIME+3, + GREENSLIME+4, + GREENSLIME+5, + GREENSLIME+6, + GREENSLIME+7, + RAT, + ROTATEGUN }); + + // Some flags taken from RedNukem's init code. This is a good start as any to reduce the insane dependency on tile numbers for making decisions in the play code. A lot more will be added here later. + setflag(SFLAG_NODAMAGEPUSH, { TANK, BOSS1, BOSS2, BOSS3, BOSS4, RECON, ROTATEGUN }); + setflag(SFLAG_BOSS, { BOSS1, BOSS2, BOSS3, BOSS4, BOSS4STAYPUT, BOSS1STAYPUT }); + if (isWorldTour()) setflag(SFLAG_BOSS, { BOSS2STAYPUT, BOSS3STAYPUT, BOSS5, BOSS5STAYPUT }); + setflag(SFLAG_NOWATERDIP, { OCTABRAIN, COMMANDER, DRONE }); + setflag(SFLAG_GREENSLIMEFOOD, { LIZTROOP, LIZMAN, PIGCOP, NEWBEAST }); + + if (isWorldTour()) + { + setflag(SFLAG_INTERNAL_BADGUY, { FIREFLY }); + setflag(SFLAG_INTERNAL_BADGUY|SFLAG_NODAMAGEPUSH|SFLAG_BOSS, { BOSS5 }); + } + + setflag(SFLAG_INVENTORY, { + FIRSTAID, + STEROIDS, + HEATSENSOR, + BOOTS, + JETPACK, + HOLODUKE, + AIRTANK }); + setflag(SFLAG_SHRINKAUTOAIM, { GREENSLIME, GREENSLIME + 1, @@ -243,9 +244,9 @@ void initactorflags_d() STRIPEBALL }); - setflag(SFLAG2_TRIGGER_IFHITSECTOR, { EXPLOSION2 }); + setflag(SFLAG_TRIGGER_IFHITSECTOR, { EXPLOSION2 }); - setflag(SFLAG2_MOVEFTA_MAKESTANDABLE, { + setflag(SFLAG_MOVEFTA_MAKESTANDABLE, { RUBBERCAN, EXPLODINGBARREL, WOODENHORSE, diff --git a/source/games/duke/src/flags_r.cpp b/source/games/duke/src/flags_r.cpp index 86ce322e0c8..721c442bd22 100644 --- a/source/games/duke/src/flags_r.cpp +++ b/source/games/duke/src/flags_r.cpp @@ -34,6 +34,79 @@ BEGIN_DUKE_NS void initactorflags_r() { + settileflag(TFLAG_WALLSWITCH, { + HANDPRINTSWITCH, + HANDPRINTSWITCH + 1, + ALIENSWITCH, + ALIENSWITCH + 1, + MULTISWITCH, + MULTISWITCH + 1, + MULTISWITCH + 2, + MULTISWITCH + 3, + ACCESSSWITCH, + ACCESSSWITCH2, + PULLSWITCH, + PULLSWITCH + 1, + HANDSWITCH, + HANDSWITCH + 1, + SLOTDOOR, + SLOTDOOR + 1, + LIGHTSWITCH, + LIGHTSWITCH + 1, + SPACELIGHTSWITCH, + SPACELIGHTSWITCH + 1, + SPACEDOORSWITCH, + SPACEDOORSWITCH + 1, + FRANKENSTINESWITCH, + FRANKENSTINESWITCH + 1, + LIGHTSWITCH2, + LIGHTSWITCH2 + 1, + POWERSWITCH1, + POWERSWITCH1 + 1, + LOCKSWITCH1, + LOCKSWITCH1 + 1, + POWERSWITCH2, + POWERSWITCH2 + 1, + DIPSWITCH, + DIPSWITCH + 1, + DIPSWITCH2, + DIPSWITCH2 + 1, + TECHSWITCH, + TECHSWITCH + 1, + DIPSWITCH3, + DIPSWITCH3 + 1, + NUKEBUTTON, + NUKEBUTTON + 1 }); + if (isRRRA()) settileflag(TFLAG_WALLSWITCH, { + MULTISWITCH2, + MULTISWITCH2 + 1, + MULTISWITCH2 + 2, + MULTISWITCH2 + 3, + RRTILE8464, + RRTILE8464 + 1 }); + + settileflag(TFLAG_ADULT, { + FEM10, + NAKED1, + FEMMAG1, + FEMMAG2, + STATUE, + STATUEFLASH, + OOZ, + WALLBLOOD1, + WALLBLOOD2, + WALLBLOOD3, + WALLBLOOD4, + WALLBLOOD5, + SUSHIPLATE1, + SUSHIPLATE2, + SUSHIPLATE3, + SUSHIPLATE4, + DOLPHIN1, + DOLPHIN2, + TOUGHGAL }); + + for (auto &fa : gs.actorinfo) { fa.falladjustz = 24 << 8; @@ -117,57 +190,6 @@ void initactorflags_r() setflag(SFLAG_NODAMAGEPUSH, { HULK, SBMOVE }); } - settileflag(TFLAG_WALLSWITCH, { - HANDPRINTSWITCH, - HANDPRINTSWITCH+1, - ALIENSWITCH, - ALIENSWITCH+1, - MULTISWITCH, - MULTISWITCH+1, - MULTISWITCH+2, - MULTISWITCH+3, - ACCESSSWITCH, - ACCESSSWITCH2, - PULLSWITCH, - PULLSWITCH+1, - HANDSWITCH, - HANDSWITCH+1, - SLOTDOOR, - SLOTDOOR+1, - LIGHTSWITCH, - LIGHTSWITCH+1, - SPACELIGHTSWITCH, - SPACELIGHTSWITCH+1, - SPACEDOORSWITCH, - SPACEDOORSWITCH+1, - FRANKENSTINESWITCH, - FRANKENSTINESWITCH+1, - LIGHTSWITCH2, - LIGHTSWITCH2+1, - POWERSWITCH1, - POWERSWITCH1+1, - LOCKSWITCH1, - LOCKSWITCH1+1, - POWERSWITCH2, - POWERSWITCH2+1, - DIPSWITCH, - DIPSWITCH+1, - DIPSWITCH2, - DIPSWITCH2+1, - TECHSWITCH, - TECHSWITCH+1, - DIPSWITCH3, - DIPSWITCH3+1, - NUKEBUTTON, - NUKEBUTTON+1}); - if (isRRRA()) settileflag(TFLAG_WALLSWITCH, { - MULTISWITCH2, - MULTISWITCH2+1, - MULTISWITCH2+2, - MULTISWITCH2+3, - RRTILE8464, - RRTILE8464+1}); - setflag(SFLAG_INVENTORY, { FIRSTAID, STEROIDS, @@ -177,27 +199,6 @@ void initactorflags_r() HOLODUKE, AIRTANK }); - setflag(SFLAG_ADULT, { - FEM10, - NAKED1, - FEMMAG1, - FEMMAG2, - STATUE, - STATUEFLASH, - OOZ, - WALLBLOOD1, - WALLBLOOD2, - WALLBLOOD3, - WALLBLOOD4, - WALLBLOOD5, - SUSHIPLATE1, - SUSHIPLATE2, - SUSHIPLATE3, - SUSHIPLATE4, - DOLPHIN1, - DOLPHIN2, - TOUGHGAL }); - setflag(SFLAG_HITRADIUSCHECK, { STATUEFLASH, BOWLINGPIN, @@ -212,9 +213,9 @@ void initactorflags_r() CHEERSTAYPUT, MINIONBOAT, HULKBOAT, CHEERBOAT, RABBIT, COOTPLAY, BILLYPLAY, MAKEOUT, MAMA }); } - setflag(SFLAG2_TRIGGER_IFHITSECTOR, { EXPLOSION2, EXPLOSION3 }); + setflag(SFLAG_TRIGGER_IFHITSECTOR, { EXPLOSION2, EXPLOSION3 }); - setflag(SFLAG2_MOVEFTA_MAKESTANDABLE, { + setflag(SFLAG_MOVEFTA_MAKESTANDABLE, { RUBBERCAN, EXPLODINGBARREL, WOODENHORSE, @@ -230,12 +231,12 @@ void initactorflags_r() // 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) { - ainf.flags2 |= SFLAG2_MOVEFTA_WAKEUPCHECK; + ainf.flags |= SFLAG_MOVEFTA_WAKEUPCHECK; } if (isRRRA()) { - setflag(SFLAG2_MOVEFTA_CHECKSEEWITHPAL8, { MINION }); + setflag(SFLAG_MOVEFTA_CHECKSEEWITHPAL8, { MINION }); } gs.actorinfo[RPG2].flags |= SFLAG_FORCEAUTOAIM; diff --git a/source/games/duke/src/spawn.cpp b/source/games/duke/src/spawn.cpp index 36d98c87eb0..ef145e85d68 100644 --- a/source/games/duke/src/spawn.cpp +++ b/source/games/duke/src/spawn.cpp @@ -913,7 +913,7 @@ void spawneffector(DDukeActor* actor, TArray* actors) case SE_16_REACTOR://That rotating blocker reactor thing case SE_26://ESCELATOR case SE_30_TWO_WAY_TRAIN://No rotational subways - + { if (actor->spr.lotag == 0) { if (sectp->lotag == 30) @@ -926,7 +926,7 @@ void spawneffector(DDukeActor* actor, TArray* actors) bool found = false; - if (actors) for(auto act2 : *actors) + if (actors) for (auto act2 : *actors) { if (act2->spr.statnum < MAXSTATUS) if (act2->spr.picnum == SECTOREFFECTOR && @@ -1017,6 +1017,21 @@ void spawneffector(DDukeActor* actor, TArray* actors) actor->temp_data[5] = actor->sector()->getfloorslope(); actor->sector()->setfloorslope(0); } + break; + } + case SE_49_POINT_LIGHT: + case SE_50_SPOT_LIGHT: + { + DukeSectIterator it(actor->sector()); + while (auto itActor = it.Next()) + { + if (itActor->spr.picnum == ACTIVATOR || itActor->spr.picnum == ACTIVATORLOCKED) + actor->aflags |= AFLAG_USEACTIVATOR; + } + ChangeActorStat(actor, STAT_LIGHT); + break; + } + } switch (actor->spr.lotag) diff --git a/source/games/duke/src/types.h b/source/games/duke/src/types.h index 5d0f2051f3c..c1b8fabf26a 100644 --- a/source/games/duke/src/types.h +++ b/source/games/duke/src/types.h @@ -31,9 +31,10 @@ class DDukeActor : public DCoreActor DECLARE_CLASS(DDukeActor, DCoreActor) HAS_OBJECT_POINTERS public: + TObjPtr ownerActor, hitOwnerActor; + uint8_t cgg; uint8_t spriteextra; // moved here for easier maintenance. This was originally a hacked in field in the sprite structure called 'filler'. - TObjPtr ownerActor, hitOwnerActor; short attackertype, ang, extra, movflag; short tempang, dispicnum; short timetosleep;