From e7369a2796836c0e936ad254bb8be8f4c9986c9f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 18 Nov 2021 00:16:53 +0100 Subject: [PATCH] - use pointers for checkhitswitch and took separated clearcameras to a new functions to make this free of gotos. --- source/games/duke/src/dispatch.cpp | 4 +- source/games/duke/src/duke3d.h | 2 +- source/games/duke/src/player_d.cpp | 12 ++-- source/games/duke/src/player_r.cpp | 12 ++-- source/games/duke/src/sectors_d.cpp | 89 ++++++++++++++++------------- source/games/duke/src/sectors_r.cpp | 18 +++--- 6 files changed, 72 insertions(+), 65 deletions(-) diff --git a/source/games/duke/src/dispatch.cpp b/source/games/duke/src/dispatch.cpp index 4d43925fa..2fc645ed9 100644 --- a/source/games/duke/src/dispatch.cpp +++ b/source/games/duke/src/dispatch.cpp @@ -43,8 +43,8 @@ void operaterespawns_d(int low); void operaterespawns_r(int low); void operateforcefields_r(DDukeActor* act, int low); void operateforcefields_d(DDukeActor* act, int low); -bool checkhitswitch_d(int snum, int w, DDukeActor *act); -bool checkhitswitch_r(int snum, int w, DDukeActor* act); +bool checkhitswitch_d(int snum, walltype* w, DDukeActor *act); +bool checkhitswitch_r(int snum, walltype* w, DDukeActor* act); void activatebysector_d(int sect, DDukeActor* j); void activatebysector_r(int sect, DDukeActor* j); void checkhitwall_d(DDukeActor* spr, walltype* dawall, int x, int y, int z, int atwith); diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index 4932f9437..7d7d1f8ea 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -82,7 +82,7 @@ struct Dispatcher void (*animatewalls)(); void (*operaterespawns)(int low); void (*operateforcefields)(DDukeActor* act, int low); - bool (*checkhitswitch)(int snum, int w, DDukeActor* act); + bool (*checkhitswitch)(int snum, walltype* w, DDukeActor* act); void (*activatebysector)(int sect, DDukeActor* j); void (*checkhitwall)(DDukeActor* spr, walltype* dawall, int x, int y, int z, int atwith); bool (*checkhitceiling)(int sn); diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index fa8e400cb..91ac6f699 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -278,7 +278,7 @@ static void shootknee(DDukeActor* actor, int p, int sx, int sy, int sz, int sa) if (hitsprt && hitsprt->s->picnum != ACCESSSWITCH && hitsprt->s->picnum != ACCESSSWITCH2) { fi.checkhitsprite(hitsprt, knee); - if (p >= 0) fi.checkhitswitch(p, -1, hitsprt); + if (p >= 0) fi.checkhitswitch(p, nullptr, hitsprt); } else if (hitwallp) @@ -292,7 +292,7 @@ static void shootknee(DDukeActor* actor, int p, int sx, int sy, int sz, int sa) if (wal->picnum != ACCESSSWITCH && wal->picnum != ACCESSSWITCH2) { fi.checkhitwall(knee, wal, hitx, hity, hitz, KNEE); - if (p >= 0) fi.checkhitswitch(p, wallnum(wal), nullptr); + if (p >= 0) fi.checkhitswitch(p, wal, nullptr); } } } @@ -465,7 +465,7 @@ static void shootweapon(DDukeActor *actor, int p, int sx, int sy, int sz, int sa hitact->s->picnum == HANDSWITCH || hitact->s->picnum == HANDSWITCH + 1)) { - fi.checkhitswitch(p, -1, hitact); + fi.checkhitswitch(p, nullptr, hitact); return; } } @@ -486,7 +486,7 @@ static void shootweapon(DDukeActor *actor, int p, int sx, int sy, int sz, int sa wal->picnum == HANDSWITCH || wal->picnum == HANDSWITCH + 1)) { - fi.checkhitswitch(p, wallnum(wal), nullptr); + fi.checkhitswitch(p, wal, nullptr); return; } @@ -1547,7 +1547,7 @@ int doincrements_d(struct player_struct* p) { if (p->access_spritenum != nullptr) { - fi.checkhitswitch(snum, -1, p->access_spritenum); + fi.checkhitswitch(snum, nullptr, p->access_spritenum); switch (p->access_spritenum->s->pal) { case 0:p->got_access &= (0xffff - 0x1); break; @@ -1558,7 +1558,7 @@ int doincrements_d(struct player_struct* p) } else { - fi.checkhitswitch(snum, p->access_wallnum, nullptr); + fi.checkhitswitch(snum, &wall[p->access_wallnum], nullptr); switch (wall[p->access_wallnum].pal) { case 0:p->got_access &= (0xffff - 0x1); break; diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index 514059ca1..203f7ba0e 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -170,7 +170,7 @@ static void shootmelee(DDukeActor *actor, int p, int sx, int sy, int sz, int sa, if (hitsprt && hitsprt->s->picnum != ACCESSSWITCH && hitsprt->s->picnum != ACCESSSWITCH2) { fi.checkhitsprite(hitsprt, wpn); - if (p >= 0) fi.checkhitswitch(p, -1, hitsprt); + if (p >= 0) fi.checkhitswitch(p, nullptr, hitsprt); } else if (wal) { @@ -182,7 +182,7 @@ static void shootmelee(DDukeActor *actor, int p, int sx, int sy, int sz, int sa, if (wal->picnum != ACCESSSWITCH && wal->picnum != ACCESSSWITCH2) { fi.checkhitwall(wpn, wal, hitx, hity, hitz, atwith); - if (p >= 0) fi.checkhitswitch(p, wallnum(wal), nullptr); + if (p >= 0) fi.checkhitswitch(p, wal, nullptr); } } } @@ -359,7 +359,7 @@ static void shootweapon(DDukeActor* actor, int p, int sx, int sy, int sz, int sa hitsprt->s->picnum == HANDSWITCH || hitsprt->s->picnum == HANDSWITCH + 1)) { - fi.checkhitswitch(p, -1, hitsprt); + fi.checkhitswitch(p, nullptr, hitsprt); return; } } @@ -382,7 +382,7 @@ static void shootweapon(DDukeActor* actor, int p, int sx, int sy, int sz, int sa wal->picnum == HANDSWITCH || wal->picnum == HANDSWITCH + 1)) { - fi.checkhitswitch(p, wallnum(wal), nullptr); + fi.checkhitswitch(p, wal, nullptr); return; } @@ -1395,7 +1395,7 @@ int doincrements_r(struct player_struct* p) { if (p->access_spritenum != nullptr) { - fi.checkhitswitch(snum, -1, p->access_spritenum); + fi.checkhitswitch(snum, nullptr, p->access_spritenum); switch (p->access_spritenum->s->pal) { case 0:p->keys[1] = 1; break; @@ -1406,7 +1406,7 @@ int doincrements_r(struct player_struct* p) } else { - fi.checkhitswitch(snum, p->access_wallnum, nullptr); + fi.checkhitswitch(snum, &wall[p->access_wallnum], nullptr); switch (wall[p->access_wallnum].pal) { case 0:p->keys[1] = 1; break; diff --git a/source/games/duke/src/sectors_d.cpp b/source/games/duke/src/sectors_d.cpp index 068bcd437..11121fc3c 100644 --- a/source/games/duke/src/sectors_d.cpp +++ b/source/games/duke/src/sectors_d.cpp @@ -222,14 +222,13 @@ void operateforcefields_d(DDukeActor* act, int low) // //--------------------------------------------------------------------------- -bool checkhitswitch_d(int snum, int ww, DDukeActor *act) +bool checkhitswitch_d(int snum, walltype* wwal, DDukeActor *act) { uint8_t switchpal; int lotag, hitag, picnum, correctdips, numdips; int sx, sy; - walltype* wwal = nullptr; - if (ww < 0 && act == nullptr) return 0; + if (wwal == nullptr && act == nullptr) return 0; correctdips = 1; numdips = 0; @@ -245,7 +244,6 @@ bool checkhitswitch_d(int snum, int ww, DDukeActor *act) } else { - wwal = &wall[ww]; lotag = wwal->lotag; if (lotag == 0) return 0; hitag = wwal->hitag; @@ -308,7 +306,7 @@ bool checkhitswitch_d(int snum, int ww, DDukeActor *act) if (ps[snum].access_incs == 1) { if (!act) - ps[snum].access_wallnum = ww; + ps[snum].access_wallnum = wallnum(wwal); else ps[snum].access_spritenum = act; } @@ -1486,6 +1484,33 @@ void checkhitsprite_d(DDukeActor* targ, DDukeActor* proj) } } +//--------------------------------------------------------------------------- +// +// taken out of checksectors to eliminate some gotos. +// +//--------------------------------------------------------------------------- + +void clearcameras(int i, player_struct* p) +{ + if (i < 0) + { + p->pos.x = p->oposx; + p->pos.y = p->oposy; + p->pos.z = p->oposz; + p->newOwner = nullptr; + + updatesector(p->pos.x, p->pos.y, &p->cursectnum); + + DukeStatIterator it(STAT_ACTOR); + while (auto act = it.Next()) + { + if (act->s->picnum == CAMERA1) act->s->yvel = 0; + } + } + else if (p->newOwner != nullptr) + p->newOwner = nullptr; +} + //--------------------------------------------------------------------------- // // @@ -1498,9 +1523,9 @@ void checksectors_d(int snum) struct player_struct* p; int j; walltype* hitscanwall; - int neartagsector, neartagwall; - DDukeActor* neartagsprite; - int neartaghitdist; + int neartagsector = -1, neartagwall = -1; + DDukeActor* neartagsprite = nullptr; + int neartaghitdist = 0; p = &ps[snum]; auto pact = p->GetActor(); @@ -1545,8 +1570,8 @@ void checksectors_d(int snum) { if (abs(PlayerInputSideVel(snum)) > 768 || abs(PlayerInputForwardVel(snum)) > 768) { - i = -1; - goto CLEARCAMERAS; + clearcameras(-1, p); + return; } } @@ -1560,8 +1585,7 @@ void checksectors_d(int snum) { if (p->newOwner != nullptr) { - i = -1; - goto CLEARCAMERAS; + clearcameras(-1, p); } return; } @@ -1623,6 +1647,7 @@ void checksectors_d(int snum) neartagsector = -1; } } + auto ntwall = neartagwall < 0? nullptr : &wall[neartagwall]; if (p->newOwner == nullptr && neartagsprite == nullptr && neartagsector == -1 && neartagwall == -1) if (isanunderoperator(p->GetActor()->getSector()->lotag)) @@ -1643,7 +1668,7 @@ void checksectors_d(int snum) if (neartagsprite != nullptr) { - if (fi.checkhitswitch(snum, -1, neartagsprite)) return; + if (fi.checkhitswitch(snum, nullptr, neartagsprite)) return; switch (neartagsprite->s->picnum) { @@ -1735,32 +1760,17 @@ void checksectors_d(int snum) i = -1; } - CLEARCAMERAS: - - if (i < 0) - { - p->pos.x = p->oposx; - p->pos.y = p->oposy; - p->pos.z = p->oposz; - p->newOwner = nullptr; - - updatesector(p->pos.x, p->pos.y, &p->cursectnum); - - DukeStatIterator it(STAT_ACTOR); - while (auto act = it.Next()) - { - if (act->s->picnum == CAMERA1) act->s->yvel = 0; + clearcameras(i, p); + return; } } - else if (p->newOwner != nullptr) - p->newOwner = nullptr; - - return; - } - } if (!PlayerInput(snum, SB_OPEN)) return; - else if (p->newOwner != nullptr) { i = -1; goto CLEARCAMERAS; } + else if (p->newOwner != nullptr) + { + clearcameras(-1, p); + return; + } if (neartagwall == -1 && neartagsector == -1 && neartagsprite == nullptr) if (abs(hits(p->GetActor())) < 512) @@ -1773,17 +1783,16 @@ void checksectors_d(int snum) if (neartagwall >= 0) { - auto ntwall = &wall[neartagwall]; if (ntwall->lotag > 0 && fi.isadoorwall(ntwall->picnum)) { if (hitscanwall == ntwall || hitscanwall == nullptr) - fi.checkhitswitch(snum, neartagwall, nullptr); + fi.checkhitswitch(snum, ntwall, nullptr); return; } else if (p->newOwner != nullptr) { - i = -1; - goto CLEARCAMERAS; + clearcameras(-1, p); + return; } } @@ -1808,7 +1817,7 @@ void checksectors_d(int snum) } operatesectors(p->GetActor()->s->sectnum, p->GetActor()); } - else fi.checkhitswitch(snum, neartagwall, nullptr); + else fi.checkhitswitch(snum, ntwall, nullptr); } } } diff --git a/source/games/duke/src/sectors_r.cpp b/source/games/duke/src/sectors_r.cpp index 6d7fc919b..2230db421 100644 --- a/source/games/duke/src/sectors_r.cpp +++ b/source/games/duke/src/sectors_r.cpp @@ -344,14 +344,13 @@ void operateforcefields_r(DDukeActor* act, int low) // //--------------------------------------------------------------------------- -bool checkhitswitch_r(int snum, int ww, DDukeActor* act) +bool checkhitswitch_r(int snum, walltype* wwal, DDukeActor* act) { uint8_t switchpal; int lotag, hitag, picnum, correctdips, numdips; int sx, sy; - walltype* wwal = nullptr; - if (ww < 0 && act == nullptr) return 0; + if (wwal == nullptr && act == nullptr) return 0; correctdips = 1; numdips = 0; @@ -367,7 +366,6 @@ bool checkhitswitch_r(int snum, int ww, DDukeActor* act) } else { - wwal = &wall[ww]; lotag = wwal->lotag; if (lotag == 0) return 0; hitag = wwal->hitag; @@ -426,7 +424,7 @@ bool checkhitswitch_r(int snum, int ww, DDukeActor* act) if (ps[snum].access_incs == 1) { if (!act) - ps[snum].access_wallnum = ww; + ps[snum].access_wallnum = wallnum(wwal); else ps[snum].access_spritenum = act; } @@ -816,7 +814,7 @@ bool checkhitswitch_r(int snum, int ww, DDukeActor* act) switches[j]->s->picnum = MULTISWITCH2 + 3; else switches[j]->s->picnum = MULTISWITCH + 3; - checkhitswitch_r(snum, -1, switches[j]); + checkhitswitch_r(snum, nullptr, switches[j]); } } return 1; @@ -2601,6 +2599,7 @@ void checksectors_r(int snum) neartagsector = -1; } } + auto ntwall = neartagwall < 0? nullptr : &wall[neartagwall]; if (p->newOwner == nullptr && neartagsprite == nullptr && neartagsector == -1 && neartagwall == -1) if (isanunderoperator(p->GetActor()->getSector()->lotag)) @@ -2620,7 +2619,7 @@ void checksectors_r(int snum) if (neartagsprite != nullptr) { - if (fi.checkhitswitch(snum, -1,neartagsprite)) return; + if (fi.checkhitswitch(snum, nullptr, neartagsprite)) return; switch (neartagsprite->s->picnum) { @@ -2735,11 +2734,10 @@ void checksectors_r(int snum) if (neartagwall >= 0) { - auto ntwall = &wall[neartagwall]; if (ntwall->lotag > 0 && fi.isadoorwall(ntwall->picnum)) { if (hitscanwall == ntwall || hitscanwall == nullptr) - fi.checkhitswitch(snum, neartagwall, nullptr); + fi.checkhitswitch(snum, ntwall, nullptr); return; } } @@ -2784,7 +2782,7 @@ void checksectors_r(int snum) FTA(41, p); } } - else fi.checkhitswitch(snum, neartagwall, nullptr); + else fi.checkhitswitch(snum, ntwall, nullptr); } } }