diff --git a/source/games/duke/src/constants.h b/source/games/duke/src/constants.h index d3ca23b53..5e5ec76ba 100644 --- a/source/games/duke/src/constants.h +++ b/source/games/duke/src/constants.h @@ -378,6 +378,9 @@ enum TFLAG_ELECTRIC = 1 << 2, TFLAG_CLEARINVENTORY = 1 << 3, // really dumb Duke stuff... TFLAG_SLIME = 1 << 4, + TFLAG_DOORWALL = 1 << 5, + TFLAG_BLOCKDOOR = 1 << 6, + }; enum diff --git a/source/games/duke/src/dispatch.cpp b/source/games/duke/src/dispatch.cpp index 12a1095e5..5fb323c7a 100644 --- a/source/games/duke/src/dispatch.cpp +++ b/source/games/duke/src/dispatch.cpp @@ -35,8 +35,6 @@ BEGIN_DUKE_NS void initactorflags_d(); void initactorflags_r(); -bool isadoorwall_d(int dapic); -bool isadoorwall_r(int dapic); void animatewalls_d(void); void animatewalls_r(void); void operateforcefields_r(DDukeActor* act, int low); @@ -113,7 +111,6 @@ void SetDispatcher() think_d, movetransports_d, initactorflags_d, - isadoorwall_d, animatewalls_d, operateforcefields_d, checkhitswitch_d, @@ -156,7 +153,6 @@ void SetDispatcher() think_r, movetransports_r, initactorflags_r, - isadoorwall_r, animatewalls_r, operateforcefields_r, checkhitswitch_r, diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index 0156aaf15..c4df5e6e2 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -75,7 +75,6 @@ struct Dispatcher void (*think)(); void (*movetransports)(); void (*initactorflags)(); - bool (*isadoorwall)(int dapic); void (*animatewalls)(); void (*operateforcefields)(DDukeActor* act, int low); bool (*checkhitswitch)(int snum, walltype* w, DDukeActor* act); diff --git a/source/games/duke/src/game.cpp b/source/games/duke/src/game.cpp index b9ce09d8a..17923015c 100644 --- a/source/games/duke/src/game.cpp +++ b/source/games/duke/src/game.cpp @@ -291,7 +291,7 @@ static void initTiles() } #define x(a, b) registerName(#a, b); -#define y(a, b) // Do not create names for RRTILExxxx. +#define y(a, b) registerName(#a, b); static void SetTileNames() { auto registerName = [](const char* name, int index) diff --git a/source/games/duke/src/inlines.h b/source/games/duke/src/inlines.h index f7d2eb4a7..d8f75e665 100644 --- a/source/games/duke/src/inlines.h +++ b/source/games/duke/src/inlines.h @@ -100,23 +100,30 @@ inline bool inventory(DDukeActor* S) return actorflag(S, SFLAG_INVENTORY); } -inline int& tileflags(int tilenum) +inline int& tileflags(unsigned int tilenum) { + static int sink = 0; + if (tilenum >= MAXTILES) return sink; return TileFiles.tiledata[tilenum].tileflags; } -inline void settileflag(int flag, const std::initializer_list& types) -{ - for (auto val : types) - { - tileflags(val) |= flag; - } -} inline bool wallswitchcheck(DDukeActor* s) { return !!(tileflags(s->spr.picnum) & TFLAG_WALLSWITCH); } +inline bool isadoorwall(int dapic) +{ + return tileflags(dapic) & TFLAG_DOORWALL; +} + +inline bool isablockdoor(int dapic) +{ + return tileflags(dapic) & TFLAG_BLOCKDOOR; +} + + + inline int checkcursectnums(sectortype* se) { int i; diff --git a/source/games/duke/src/namelist_r.h b/source/games/duke/src/namelist_r.h index 859a731e9..39ef83df4 100644 --- a/source/games/duke/src/namelist_r.h +++ b/source/games/duke/src/namelist_r.h @@ -987,12 +987,15 @@ y(RRTILE3500, 3500) x(SLINGBLADE, 3510) y(RRTILE3584, 3584) y(RRTILE3586, 3586) -y(LADDER, 3587) +x(LADDER, 3587) y(RRTILE3600, 3600) y(RRTILE3631, 3631) y(RRTILE3635, 3635) y(RRTILE3637, 3637) y(RRTILE3643, 3643) +y(RRTILE3644, 3644) +y(RRTILE3645, 3645) +y(RRTILE3646, 3646) y(RRTILE3647, 3647) y(RRTILE3652, 3652) y(RRTILE3653, 3653) diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index 14a8732ea..4a29965a4 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -465,7 +465,9 @@ static void shootweapon(DDukeActor *actor, int p, DVector3 pos, DAngle ang, int { spawn(spark, SMALLSMOKE); - if (fi.isadoorwall(hit.hitWall->picnum) == 1) + if (isadoorwall(hit.hitWall->picnum) == 1) + goto SKIPBULLETHOLE; + if (isablockdoor(hit.hitWall->picnum) == 1) goto SKIPBULLETHOLE; if (p >= 0 && ( hit.hitWall->picnum == DIPSWITCH || diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index 203cbbf01..af6fe8d6f 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -360,7 +360,7 @@ static void shootweapon(DDukeActor* actor, int p, DVector3 pos, DAngle ang, int { spawn(spark, SMALLSMOKE); - if (fi.isadoorwall(hit.hitWall->picnum) == 1) + if (isadoorwall(hit.hitWall->picnum) == 1) goto SKIPBULLETHOLE; if (isablockdoor(hit.hitWall->picnum) == 1) goto SKIPBULLETHOLE; diff --git a/source/games/duke/src/sectors_d.cpp b/source/games/duke/src/sectors_d.cpp index 7c29c334f..e1c30f07f 100644 --- a/source/games/duke/src/sectors_d.cpp +++ b/source/games/duke/src/sectors_d.cpp @@ -49,43 +49,6 @@ BEGIN_DUKE_NS // //--------------------------------------------------------------------------- -bool isadoorwall_d(int dapic) -{ - switch(dapic) - { - case DOORTILE1: - case DOORTILE2: - case DOORTILE3: - case DOORTILE4: - case DOORTILE5: - case DOORTILE6: - case DOORTILE7: - case DOORTILE8: - case DOORTILE9: - case DOORTILE10: - case DOORTILE11: - case DOORTILE12: - case DOORTILE14: - case DOORTILE15: - case DOORTILE16: - case DOORTILE17: - case DOORTILE18: - case DOORTILE19: - case DOORTILE20: - case DOORTILE21: - case DOORTILE22: - case DOORTILE23: - return 1; - } - return 0; -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - void animatewalls_d(void) { int t; @@ -320,7 +283,7 @@ bool checkhitswitch_d(int snum, walltype* wwal, DDukeActor *act) if (check_activator_motion(lotag)) return 0; break; default: - if (fi.isadoorwall(picnum) == 0) return 0; + if (isadoorwall(picnum) == 0) return 0; break; } @@ -456,7 +419,7 @@ bool checkhitswitch_d(int snum, walltype* wwal, DDukeActor *act) switch (picnum) { default: - if (fi.isadoorwall(picnum) == 0) break; + if (isadoorwall(picnum) == 0) break; [[fallthrough]]; case DIPSWITCH: case DIPSWITCHON: @@ -558,7 +521,7 @@ bool checkhitswitch_d(int snum, walltype* wwal, DDukeActor *act) picnum == ALIENSWITCH || picnum == ALIENSWITCHON || picnum == TECHSWITCH || picnum == TECHSWITCHON) return 1; - if (hitag == 0 && fi.isadoorwall(picnum) == 0) + if (hitag == 0 && isadoorwall(picnum) == 0) { if (act) S_PlaySound3D(SWITCH_ON, act, v); @@ -1649,7 +1612,7 @@ void checksectors_d(int snum) if (near.hitWall) { - if (near.hitWall->lotag > 0 && fi.isadoorwall(near.hitWall->picnum)) + if (near.hitWall->lotag > 0 && isadoorwall(near.hitWall->picnum)) { if (hitscanwall == near.hitWall || hitscanwall == nullptr) fi.checkhitswitch(snum, near.hitWall, nullptr); diff --git a/source/games/duke/src/sectors_r.cpp b/source/games/duke/src/sectors_r.cpp index 0ccaacca8..353858aca 100644 --- a/source/games/duke/src/sectors_r.cpp +++ b/source/games/duke/src/sectors_r.cpp @@ -43,159 +43,6 @@ BEGIN_DUKE_NS // //--------------------------------------------------------------------------- -bool isadoorwall_r(int dapic) -{ - switch(dapic) - { - case DOORTILE1: - case DOORTILE2: - case DOORTILE3: - case DOORTILE4: - case DOORTILE5: - case DOORTILE6: - case DOORTILE7: - case DOORTILE8: - case DOORTILE9: - case DOORTILE10: - case DOORTILE11: - case DOORTILE12: - case DOORTILE14: - case DOORTILE15: - case DOORTILE16: - case DOORTILE17: - case DOORTILE18: - case DOORTILE19: - case DOORTILE20: - case DOORTILE21: - case DOORTILE22: - case RRTILE1856: - case RRTILE1877: - return 1; - } - return 0; -} - -bool isablockdoor(int dapic) -{ - switch (dapic) - { - case RRTILE1792: - case RRTILE1801: - case RRTILE1805: - case RRTILE1807: - case RRTILE1808: - case RRTILE1812: - case RRTILE1821: - case RRTILE1826: - case RRTILE1850: - case RRTILE1851: - case RRTILE1856: - case RRTILE1877: - case RRTILE1938: - case RRTILE1942: - case RRTILE1944: - case RRTILE1945: - case RRTILE1951: - case RRTILE1961: - case RRTILE1964: - case RRTILE1985: - case RRTILE1995: - case RRTILE2022: - case RRTILE2052: - case RRTILE2053: - case RRTILE2060: - case RRTILE2074: - case RRTILE2132: - case RRTILE2136: - case RRTILE2139: - case RRTILE2150: - case RRTILE2178: - case RRTILE2186: - case RRTILE2319: - case RRTILE2321: - case RRTILE2326: - case RRTILE2329: - case RRTILE2578: - case RRTILE2581: - case RRTILE2610: - case RRTILE2613: - case RRTILE2621: - case RRTILE2622: - case RRTILE2676: - case RRTILE2732: - case RRTILE2831: - case RRTILE2832: - case RRTILE2842: - case RRTILE2940: - case RRTILE2970: - case RRTILE3083: - case RRTILE3100: - case RRTILE3155: - case RRTILE3195: - case RRTILE3232: - case RRTILE3600: - case RRTILE3631: - case RRTILE3635: - case RRTILE3637: - case RRTILE3643+2: - case RRTILE3643+3: - case RRTILE3647: - case RRTILE3652: - case RRTILE3653: - case RRTILE3671: - case RRTILE3673: - case RRTILE3684: - case RRTILE3708: - case RRTILE3714: - case RRTILE3716: - case RRTILE3723: - case RRTILE3725: - case RRTILE3737: - case RRTILE3754: - case RRTILE3762: - case RRTILE3763: - case RRTILE3764: - case RRTILE3765: - case RRTILE3767: - case RRTILE3793: - case RRTILE3814: - case RRTILE3815: - case RRTILE3819: - case RRTILE3827: - case RRTILE3837: - return true; - - case RRTILE1996: - case RRTILE2382: - case RRTILE2961: - case RRTILE3804: - case RRTILE7430: - case RRTILE7467: - case RRTILE7469: - case RRTILE7470: - case RRTILE7475: - case RRTILE7566: - case RRTILE7576: - case RRTILE7716: - case RRTILE8063: - case RRTILE8067: - case RRTILE8076: - case RRTILE8106: - case RRTILE8379: - case RRTILE8380: - case RRTILE8565: - case RRTILE8605: - return isRRRA(); - } - return false; -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - void animatewalls_r(void) { int t; @@ -448,7 +295,7 @@ bool checkhitswitch_r(int snum, walltype* wwal, DDukeActor* act) if (check_activator_motion(lotag)) return 0; break; default: - if (fi.isadoorwall(picnum) == 0) return 0; + if (isadoorwall(picnum) == 0) return 0; break; } @@ -642,7 +489,7 @@ bool checkhitswitch_r(int snum, walltype* wwal, DDukeActor* act) switch (picnum) { default: - if (fi.isadoorwall(picnum) == 0) break; + if (isadoorwall(picnum) == 0) break; [[fallthrough]]; case DIPSWITCH: case DIPSWITCHON: @@ -834,7 +681,7 @@ bool checkhitswitch_r(int snum, walltype* wwal, DDukeActor* act) picnum == ALIENSWITCH || picnum == ALIENSWITCHON || picnum == TECHSWITCH || picnum == TECHSWITCHON) return 1; - if (hitag == 0 && fi.isadoorwall(picnum) == 0) + if (hitag == 0 && isadoorwall(picnum) == 0) { if (act) S_PlaySound3D(SWITCH_ON, act, v); @@ -2540,7 +2387,7 @@ void checksectors_r(int snum) if (near.hitWall) { - if (near.hitWall->lotag > 0 && fi.isadoorwall(near.hitWall->picnum)) + if (near.hitWall->lotag > 0 && isadoorwall(near.hitWall->picnum)) { if (hitscanwall == near.hitWall || hitscanwall == nullptr) fi.checkhitswitch(snum, near.hitWall, nullptr); diff --git a/wadsrc/static/filter/dukeengine/engine/defines.def b/wadsrc/static/filter/dukeengine/engine/defines.def index 3607f31ce..d1317ed78 100644 --- a/wadsrc/static/filter/dukeengine/engine/defines.def +++ b/wadsrc/static/filter/dukeengine/engine/defines.def @@ -6,3 +6,5 @@ define TFLAG_ADULT 2 define TFLAG_ELECTRIC 4 define TFLAG_CLEARINVENTORY 8 define TFLAG_SLIME 16 +define TFLAG_DOORWALL 32 +define TFLAG_BLOCKDOOR 64 diff --git a/wadsrc/static/filter/dukelike/engine/engine.def b/wadsrc/static/filter/dukelike/engine/engine.def index 3f523dc1d..3cd6aabb1 100644 --- a/wadsrc/static/filter/dukelike/engine/engine.def +++ b/wadsrc/static/filter/dukelike/engine/engine.def @@ -162,3 +162,28 @@ tileflag TFLAG_ADULT { tileflag TFLAG_ELECTRIC { HURTRAIL } tileflag TFLAG_CLEARINVENTORY { HURTRAIL FLOORSLIME FLOORPLASMA } tileflag TFLAG_SLIME { FLOORSLIME FLOORSLIME1 FLOORSLIME2 } + +tileflag TFLAG_DOORWALL { + DOORTILE1 + DOORTILE2 + DOORTILE3 + DOORTILE4 + DOORTILE5 + DOORTILE6 + DOORTILE7 + DOORTILE8 + DOORTILE9 + DOORTILE10 + DOORTILE11 + DOORTILE12 + DOORTILE14 + DOORTILE15 + DOORTILE16 + DOORTILE17 + DOORTILE18 + DOORTILE19 + DOORTILE20 + DOORTILE21 + DOORTILE22 + DOORTILE23 + } diff --git a/wadsrc/static/filter/redneck.ridesagain/engine/engine.def b/wadsrc/static/filter/redneck.ridesagain/engine/engine.def index 0709099b1..bc5fde485 100644 --- a/wadsrc/static/filter/redneck.ridesagain/engine/engine.def +++ b/wadsrc/static/filter/redneck.ridesagain/engine/engine.def @@ -20,3 +20,25 @@ tileflag TFLAG_WALLSWITCH { IRONWHEELSWITCH IRONWHEELSWITCHON } +tileflag TFLAG_BLOCKDOOR { + RRTILE1996 + RRTILE2382 + RRTILE2961 + RRTILE3804 + RRTILE7430 + RRTILE7467 + RRTILE7469 + RRTILE7470 + RRTILE7475 + RRTILE7566 + RRTILE7576 + RRTILE7716 + RRTILE8063 + RRTILE8067 + RRTILE8076 + RRTILE8106 + RRTILE8379 + RRTILE8380 + RRTILE8565 + RRTILE8605 + } \ No newline at end of file diff --git a/wadsrc/static/filter/redneck/engine/engine.def b/wadsrc/static/filter/redneck/engine/engine.def index 802ed84d4..0e544119d 100644 --- a/wadsrc/static/filter/redneck/engine/engine.def +++ b/wadsrc/static/filter/redneck/engine/engine.def @@ -120,3 +120,115 @@ tileflag TFLAG_ELECTRIC { HURTRAIL } tileflag TFLAG_CLEARINVENTORY { HURTRAIL FLOORSLIME FLOORPLASMA } tileflag TFLAG_SLIME { FLOORSLIME FLOORSLIME1 FLOORSLIME2 } +tileflag TFLAG_DOORWALL { + DOORTILE1 + DOORTILE2 + DOORTILE3 + DOORTILE4 + DOORTILE5 + DOORTILE6 + DOORTILE7 + DOORTILE8 + DOORTILE9 + DOORTILE10 + DOORTILE11 + DOORTILE12 + DOORTILE14 + DOORTILE15 + DOORTILE16 + DOORTILE17 + DOORTILE18 + DOORTILE19 + DOORTILE20 + DOORTILE21 + DOORTILE22 + RRTILE1856 + RRTILE1877 + } + +tileflag TFLAG_BLOCKDOOR { + RRTILE1792 + RRTILE1801 + RRTILE1805 + RRTILE1807 + RRTILE1808 + RRTILE1812 + RRTILE1821 + RRTILE1826 + RRTILE1850 + RRTILE1851 + RRTILE1856 + RRTILE1877 + RRTILE1938 + RRTILE1942 + RRTILE1944 + RRTILE1945 + RRTILE1951 + RRTILE1961 + RRTILE1964 + RRTILE1985 + RRTILE1995 + RRTILE2022 + RRTILE2052 + RRTILE2053 + RRTILE2060 + RRTILE2074 + RRTILE2132 + RRTILE2136 + RRTILE2139 + RRTILE2150 + RRTILE2178 + RRTILE2186 + RRTILE2319 + RRTILE2321 + RRTILE2326 + RRTILE2329 + RRTILE2578 + RRTILE2581 + RRTILE2610 + RRTILE2613 + RRTILE2621 + RRTILE2622 + RRTILE2676 + RRTILE2732 + RRTILE2831 + RRTILE2832 + RRTILE2842 + RRTILE2940 + RRTILE2970 + RRTILE3083 + RRTILE3100 + RRTILE3155 + RRTILE3195 + RRTILE3232 + RRTILE3600 + RRTILE3631 + RRTILE3635 + RRTILE3637 + RRTILE3645 + RRTILE3646 + RRTILE3647 + RRTILE3652 + RRTILE3653 + RRTILE3671 + RRTILE3673 + RRTILE3684 + RRTILE3708 + RRTILE3714 + RRTILE3716 + RRTILE3723 + RRTILE3725 + RRTILE3737 + RRTILE3754 + RRTILE3762 + RRTILE3763 + RRTILE3764 + RRTILE3765 + RRTILE3767 + RRTILE3793 + RRTILE3814 + RRTILE3815 + RRTILE3819 + RRTILE3827 + RRTILE3837 + } \ No newline at end of file