From bfcceccc98c1b13b754cd6e32769ca9651fb662f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 1 Jan 2023 16:08:12 +0100 Subject: [PATCH] - consolidated checkhitdefault functions. --- source/games/duke/src/actors_d.cpp | 10 +-- source/games/duke/src/actors_r.cpp | 37 +++++---- source/games/duke/src/dispatch.cpp | 4 - source/games/duke/src/duke3d.h | 1 - source/games/duke/src/sectors.cpp | 119 ++++++++++++++++++++++++++++ source/games/duke/src/sectors_d.cpp | 117 --------------------------- source/games/duke/src/sectors_r.cpp | 86 -------------------- source/games/duke/src/vmexports.cpp | 9 +-- 8 files changed, 144 insertions(+), 239 deletions(-) diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp index 1a4200238..21d69bca8 100644 --- a/source/games/duke/src/actors_d.cpp +++ b/source/games/duke/src/actors_d.cpp @@ -324,16 +324,16 @@ void movetransports_d(void) if (act->spr.pal == 0) { - auto k = spawn(Owner, DukeTransporterBeamClass); - if (k) S_PlayActorSound(TELEPORTER, k); + auto beam = spawn(Owner, DukeTransporterBeamClass); + if (beam) S_PlayActorSound(TELEPORTER, beam); } break; } } - else if (!(sectlotag == 1 && ps[p].on_ground == 1)) break; + else if (!(sectlotag == ST_1_ABOVE_WATER && ps[p].on_ground == 1)) break; - if (onfloorz == 0 && abs(act->spr.pos.Z - ps[p].GetActor()->getOffsetZ()) < 24) + if (onfloorz == 0 && fabs(act->spr.pos.Z - ps[p].GetActor()->getOffsetZ()) < 24) if ((ps[p].jetpack_on == 0) || (ps[p].jetpack_on && (PlayerInput(p, SB_JUMP) || ps[p].sync.uvel > 0)) || (ps[p].jetpack_on && (PlayerInput(p, SB_CROUCH) || ps[p].sync.uvel < 0))) { @@ -426,7 +426,7 @@ void movetransports_d(void) if ((krand() & 255) < 32) spawn(act2, DukeWaterSplashClass); - if (sectlotag == 1) + if (sectlotag == ST_1_ABOVE_WATER) for (int l = 0; l < 9; l++) { auto q = spawn(ps[p].GetActor(), DukeWaterBubbleClass); diff --git a/source/games/duke/src/actors_r.cpp b/source/games/duke/src/actors_r.cpp index 4f3e68184..d1374bc41 100644 --- a/source/games/duke/src/actors_r.cpp +++ b/source/games/duke/src/actors_r.cpp @@ -236,37 +236,34 @@ int ifhitbyweapon_r(DDukeActor *actor) void movetransports_r(void) { uint8_t warpdir = 0; - int k, p, sectlotag; - int onfloorz; //Transporters DukeStatIterator iti(STAT_TRANSPORT); while (auto act = iti.Next()) { - auto sectp = act->sector(); - sectlotag = sectp->lotag; - auto Owner = act->GetOwner(); if (Owner == act || Owner == nullptr) { continue; } - onfloorz = act->temp_data[4]; + auto sectp = act->sector(); + int sectlotag = sectp->lotag; + int onfloorz = act->temp_data[4]; if (act->counter > 0) act->counter--; DukeSectIterator itj(act->sector()); - while (auto act2 = itj.Next()) + while (auto act2 = itj.Next()) { switch (act2->spr.statnum) { - case STAT_PLAYER: // Player + case STAT_PLAYER: if (act2->GetOwner()) { - p = act2->PlayerIndex(); + int p = act2->PlayerIndex(); ps[p].on_warping_sector = 1; @@ -277,12 +274,12 @@ void movetransports_r(void) spawn(act, DukeTransporterBeamClass); S_PlayActorSound(TELEPORTER, act); - for (k = connecthead; k >= 0; k = connectpoint2[k]) - if (ps[k].cursector == Owner->sector()) - { - ps[k].frag_ps = p; - ps[k].GetActor()->spr.extra = 0; - } + for (int k = connecthead; k >= 0; k = connectpoint2[k]) + if (ps[k].cursector == Owner->sector()) + { + ps[k].frag_ps = p; + ps[k].GetActor()->spr.extra = 0; + } ps[p].GetActor()->PrevAngles.Yaw = ps[p].GetActor()->spr.Angles.Yaw = Owner->spr.Angles.Yaw; @@ -326,7 +323,7 @@ void movetransports_r(void) break; } - k = 0; + int k = 0; if (ud.mapflags & MFLAG_ALLSECTORTYPES) { @@ -370,7 +367,7 @@ void movetransports_r(void) { FX_StopAllSounds(); } - S_PlayActorSound(DUKE_GASP, ps[p].GetActor()); + S_PlayActorSound(DUKE_GASP, act2); ps[p].GetActor()->spr.pos.Z = Owner->sector()->floorz - 7 + gs.playerheight; ps[p].GetActor()->backupz(); @@ -381,14 +378,14 @@ void movetransports_r(void) ps[p].GetActor()->spr.pos.XY() += Owner->spr.pos.XY() - act->spr.pos.XY(); ps[p].GetActor()->backupvec2(); - if (Owner->GetOwner() != Owner) + if (!Owner || Owner->GetOwner() != Owner) ps[p].transporter_hold = -2; ps[p].setCursector(Owner->sector()); ChangeActorSect(act2, Owner->sector()); if ((krand() & 255) < 32) - spawn(ps[p].GetActor(), DukeWaterSplashClass); + spawn(act2, DukeWaterSplashClass); } else if (k == 2) { @@ -405,6 +402,8 @@ void movetransports_r(void) break; case STAT_ACTOR: + if ((act2->flags3 & SFLAG3_DONTDIVEALIVE) && act2->spr.extra > 0) continue; + [[fallthrough]]; case STAT_PROJECTILE: case STAT_MISC: case STAT_DUMMYPLAYER: diff --git a/source/games/duke/src/dispatch.cpp b/source/games/duke/src/dispatch.cpp index dd8766588..b6a66f9c1 100644 --- a/source/games/duke/src/dispatch.cpp +++ b/source/games/duke/src/dispatch.cpp @@ -39,8 +39,6 @@ bool checkaccessswitch_d(int snum, int pal, DDukeActor *act, walltype* w); bool checkaccessswitch_r(int snum, int pal, DDukeActor* act, walltype* w); void activatebysector_d(sectortype* sect, DDukeActor* j); void activatebysector_r(sectortype* sect, DDukeActor* j); -void checkhitdefault_d(DDukeActor* i, DDukeActor* sn); -void checkhitdefault_r(DDukeActor* i, DDukeActor* sn); void checksectors_d(int snum); void checksectors_r(int snum); @@ -81,7 +79,6 @@ void SetDispatcher() initactorflags_d, checkaccessswitch_d, activatebysector_d, - checkhitdefault_d, checksectors_d, addweapon_d, @@ -105,7 +102,6 @@ void SetDispatcher() initactorflags_r, checkaccessswitch_r, activatebysector_r, - checkhitdefault_r, checksectors_r, addweapon_r, diff --git a/source/games/duke/src/duke3d.h b/source/games/duke/src/duke3d.h index e397912ad..67c02ddcd 100644 --- a/source/games/duke/src/duke3d.h +++ b/source/games/duke/src/duke3d.h @@ -77,7 +77,6 @@ struct Dispatcher void (*initactorflags)(); bool (*checkaccessswitch)(int snum, int switchpal, DDukeActor* act, walltype* w); void (*activatebysector)(sectortype* sect, DDukeActor* j); - void (*checkhitdefault)(DDukeActor* i, DDukeActor* sn); void (*checksectors)(int low); void (*addweapon)(player_struct *p, int weapon, bool wswitch); diff --git a/source/games/duke/src/sectors.cpp b/source/games/duke/src/sectors.cpp index c6365df54..e83ae581c 100644 --- a/source/games/duke/src/sectors.cpp +++ b/source/games/duke/src/sectors.cpp @@ -1376,6 +1376,125 @@ bool checkhitceiling(sectortype* sectp) return false; } +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +void checkhitdefault(DDukeActor* targ, DDukeActor* proj) +{ + if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == STAT_DEFAULT) + return; + + if (((proj->flags3 & SFLAG3_CANHURTSHOOTER) || proj->GetOwner() != targ) && targ->spr.statnum != STAT_PROJECTILE) + { + if (badguy(targ)) + { + if (targ->spr.scale.X < targ->FloatVar(NAME_minhitscale)) + return; + + if (proj->flags4 & SFLAG4_DOUBLEHITDAMAGE) proj->spr.extra <<= 1; + + if (!(targ->flags3 & SFLAG3_NOHITJIBS) && !(proj->flags3 & SFLAG3_NOHITJIBS)) + { + auto spawned = spawn(proj, DukeJibs6Class); + if (spawned) + { + if (proj->spr.pal == 6) + spawned->spr.pal = 6; + spawned->spr.pos.Z += 4; + spawned->vel.X = 1; + spawned->spr.scale = DVector2(0.375, 0.375); + spawned->spr.Angles.Yaw = DAngle22_5 / 4 - randomAngle(22.5 / 2); + } + } + + auto Owner = proj->GetOwner(); + + if (Owner && Owner->isPlayer() && !(targ->flags3 & SFLAG3_NOSHOTGUNBLOOD)) + if (ps[Owner->PlayerIndex()].curr_weapon == SHOTGUN_WEAPON) + { + shoot(targ, DukeBloodSplat3Class); + shoot(targ, DukeBloodSplat1Class); + shoot(targ, DukeBloodSplat2Class); + shoot(targ, DukeBloodSplat4Class); + } + + if (!(targ->flags2 & SFLAG2_NODAMAGEPUSH)) + { + if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_MASK) == 0) + targ->spr.Angles.Yaw = proj->spr.Angles.Yaw + DAngle180; + + targ->vel.X = -proj->spr.extra * 0.25; + auto sp = targ->sector(); + pushmove(targ->spr.pos, &sp, 8, 4, 4, CLIPMASK0); + if (sp != targ->sector() && sp != nullptr) + ChangeActorSect(targ, sp); + } + + if (targ->spr.statnum == STAT_ZOMBIEACTOR) + { + ChangeActorStat(targ, STAT_ACTOR); + targ->timetosleep = SLEEPTIME; + } + if (!shrinkersizecheck(proj->GetClass(), targ)) return; + } + + if (targ->spr.statnum != STAT_ZOMBIEACTOR) + { + if ((proj->flags2 & SFLAG2_FREEZEDAMAGE) && ((targ->isPlayer() && targ->spr.pal == 1) || (gs.freezerhurtowner == 0 && proj->GetOwner() == targ))) + return; + + auto hitpic = static_cast(proj->GetClass()); + auto Owner = proj->GetOwner(); + if (Owner && Owner->isPlayer()) + { + if (targ->isPlayer() && ud.coop != 0 && ud.ffire == 0) + return; + + auto tOwner = targ->GetOwner(); + if (hitpic == DukeFireballClass && tOwner && tOwner->GetClass() != DukeFireballClass) // hack alert! Even with damage types this special check needs to stay. + hitpic = DukeFlamethrowerFlameClass; + } + + targ->attackertype = hitpic; + targ->hitextra += proj->spr.extra; + if (!(targ->flags4 & SFLAG4_NODAMAGETURN)) + targ->hitang = proj->spr.Angles.Yaw; + targ->SetHitOwner(Owner); + } + + if (targ->spr.statnum == STAT_PLAYER) + { + auto p = targ->PlayerIndex(); + if (ps[p].newOwner != nullptr) + { + ps[p].newOwner = nullptr; + ps[p].GetActor()->restoreloc(); + + updatesector(ps[p].GetActor()->getPosWithOffsetZ(), &ps[p].cursector); + + DukeStatIterator it(STAT_ACTOR); + while (auto itActor = it.Next()) + { + if (itActor->flags2 & SFLAG2_CAMERA) itActor->spr.yint = 0; + } + } + + if (!shrinkersizecheck(proj->GetClass(), targ)) + return; + + auto hitowner = targ->GetHitOwner(); + if (!hitowner || !hitowner->isPlayer()) + if (ud.player_skill >= 3) + proj->spr.extra += (proj->spr.extra >> 1); + } + + } +} + + //--------------------------------------------------------------------------- // // diff --git a/source/games/duke/src/sectors_d.cpp b/source/games/duke/src/sectors_d.cpp index 8f532a22a..f581ea3f2 100644 --- a/source/games/duke/src/sectors_d.cpp +++ b/source/games/duke/src/sectors_d.cpp @@ -152,123 +152,6 @@ void checkplayerhurt_d(player_struct* p, const Collision& coll) } } -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - -void checkhitdefault_d(DDukeActor* targ, DDukeActor* proj) -{ - if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == STAT_DEFAULT) - return; - - if (((proj->flags3 & SFLAG3_CANHURTSHOOTER) || proj->GetOwner() != targ) && targ->spr.statnum != STAT_PROJECTILE) - { - if (badguy(targ)) - { - if (targ->spr.scale.X < targ->FloatVar(NAME_minhitscale)) - return; - - if (proj->flags4 & SFLAG4_DOUBLEHITDAMAGE) proj->spr.extra <<= 1; - - if (!(targ->flags3 & SFLAG3_NOHITJIBS) && !(proj->flags3 & SFLAG3_NOHITJIBS)) - { - auto spawned = spawn(proj, DukeJibs6Class); - if (spawned) - { - if (proj->spr.pal == 6) - spawned->spr.pal = 6; - spawned->spr.pos.Z += 4; - spawned->vel.X = 1; - spawned->spr.scale = DVector2(0.375, 0.375); - spawned->spr.Angles.Yaw = DAngle22_5 / 4 - randomAngle(22.5 / 2); - } - } - - auto Owner = proj->GetOwner(); - - if (Owner && Owner->isPlayer() && !(targ->flags3 & SFLAG3_NOSHOTGUNBLOOD)) - if (ps[Owner->PlayerIndex()].curr_weapon == SHOTGUN_WEAPON) - { - shoot(targ, DukeBloodSplat3Class); - shoot(targ, DukeBloodSplat1Class); - shoot(targ, DukeBloodSplat2Class); - shoot(targ, DukeBloodSplat4Class); - } - - if (!(targ->flags2 & SFLAG2_NODAMAGEPUSH)) // RR does not have this. - { - if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_MASK) == 0) - targ->spr.Angles.Yaw = proj->spr.Angles.Yaw + DAngle180; - - targ->vel.X = -proj->spr.extra * 0.25; - auto sp = targ->sector(); - pushmove(targ->spr.pos, &sp, 8, 4, 4, CLIPMASK0); - if (sp != targ->sector() && sp != nullptr) - ChangeActorSect(targ, sp); - } - - if (targ->spr.statnum == STAT_ZOMBIEACTOR) - { - ChangeActorStat(targ, STAT_ACTOR); - targ->timetosleep = SLEEPTIME; - } - if (!shrinkersizecheck(proj->GetClass(), targ)) return; - } - - if (targ->spr.statnum != STAT_ZOMBIEACTOR) - { - if ((proj->flags2 & SFLAG2_FREEZEDAMAGE) && ((targ->isPlayer() && targ->spr.pal == 1) || (gs.freezerhurtowner == 0 && proj->GetOwner() == targ))) - return; - - auto hitpic = static_cast(proj->GetClass()); - auto Owner = proj->GetOwner(); - if (Owner && Owner->isPlayer()) - { - if (targ->isPlayer() && ud.coop != 0 && ud.ffire == 0) - return; - - auto tOwner = targ->GetOwner(); - if (hitpic == DukeFireballClass && tOwner && tOwner->GetClass() != DukeFireballClass) // hack alert! Even with damage types this special check needs to stay. - hitpic = DukeFlamethrowerFlameClass; - } - - targ->attackertype = hitpic; - targ->hitextra += proj->spr.extra; - targ->hitang = proj->spr.Angles.Yaw; - targ->SetHitOwner(Owner); - } - - if (targ->spr.statnum == STAT_PLAYER) - { - auto p = targ->PlayerIndex(); - if (ps[p].newOwner != nullptr) - { - ps[p].newOwner = nullptr; - ps[p].GetActor()->restoreloc(); - - updatesector(ps[p].GetActor()->getPosWithOffsetZ(), &ps[p].cursector); - - DukeStatIterator it(STAT_ACTOR); - while (auto itActor = it.Next()) - { - if (itActor->flags2 & SFLAG2_CAMERA) itActor->spr.yint = 0; - } - } - - if (!shrinkersizecheck(proj->GetClass(), targ)) - return; - - auto hitowner = targ->GetHitOwner(); - if (!hitowner || !hitowner->isPlayer()) - if (ud.player_skill >= 3) - proj->spr.extra += (proj->spr.extra >> 1); - } - - } -} - //--------------------------------------------------------------------------- // // taken out of checksectors to eliminate some gotos. diff --git a/source/games/duke/src/sectors_r.cpp b/source/games/duke/src/sectors_r.cpp index 9e77ae98f..f98bda806 100644 --- a/source/games/duke/src/sectors_r.cpp +++ b/source/games/duke/src/sectors_r.cpp @@ -158,92 +158,6 @@ void checkplayerhurt_r(player_struct* p, const Collision &coll) // //--------------------------------------------------------------------------- -void checkhitdefault_r(DDukeActor* targ, DDukeActor* proj) -{ - if ((targ->spr.cstat & CSTAT_SPRITE_ALIGNMENT_WALL) && targ->spr.hitag == 0 && targ->spr.lotag == 0 && targ->spr.statnum == 0) - return; - - if (((proj->flags3 & SFLAG3_CANHURTSHOOTER) || proj->GetOwner() != targ) && targ->spr.statnum != STAT_PROJECTILE) - { - if (badguy(targ) == 1) - { - if (proj->flags4 & SFLAG4_DOUBLEHITDAMAGE) proj->spr.extra <<= 1; - - if (!(targ->flags3 & SFLAG3_NOHITJIBS) && !(proj->flags3 & SFLAG3_NOHITJIBS)) - { - auto spawned = spawn(proj, DukeJibs6Class); - if (spawned) - { - if (proj->spr.pal == 6) - spawned->spr.pal = 6; - spawned->spr.pos.Z += 4; - spawned->vel.X = 1; - spawned->spr.scale = DVector2(0.375, 0.375); - spawned->spr.Angles.Yaw = DAngle22_5 / 4 - randomAngle(22.5 / 2); - } - } - - auto Owner = proj->GetOwner(); - - if (Owner && Owner->isPlayer() && !(targ->flags3 & SFLAG3_NOSHOTGUNBLOOD)) - if (ps[Owner->PlayerIndex()].curr_weapon == SHOTGUN_WEAPON) - { - shoot(targ, DukeBloodSplat3Class); - shoot(targ, DukeBloodSplat1Class); - shoot(targ, DukeBloodSplat2Class); - shoot(targ, DukeBloodSplat4Class); - } - - if (targ->spr.statnum == STAT_ZOMBIEACTOR) - { - ChangeActorStat(targ, STAT_ACTOR); - targ->timetosleep = SLEEPTIME; - } - } - - if (targ->spr.statnum != STAT_ZOMBIEACTOR) - { - if ((proj->flags2 & SFLAG2_FREEZEDAMAGE) && ((targ->isPlayer() && targ->spr.pal == 1) || (gs.freezerhurtowner == 0 && proj->GetOwner() == targ))) - return; - - targ->attackertype = static_cast(proj->GetClass()); - targ->hitextra += proj->spr.extra; - if (!(targ->flags4 & SFLAG4_NODAMAGETURN)) - targ->hitang = proj->spr.Angles.Yaw; - targ->SetHitOwner(proj->GetOwner()); - } - - if (targ->spr.statnum == STAT_PLAYER) - { - auto p = targ->PlayerIndex(); - if (ps[p].newOwner != nullptr) - { - ps[p].newOwner = nullptr; - ps[p].GetActor()->restoreloc(); - - updatesector(ps[p].GetActor()->getPosWithOffsetZ(), &ps[p].cursector); - - DukeStatIterator it(STAT_EFFECTOR); - while (auto act = it.Next()) - { - if ((act->flags2 & SFLAG2_CAMERA)) act->spr.yint = 0; - } - } - auto Owner = targ->GetHitOwner(); - if (!Owner || !Owner->isPlayer()) - if (ud.player_skill >= 3) - proj->spr.extra += (proj->spr.extra >> 1); - } - - } -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - void checksectors_r(int snum) { player_struct* p; diff --git a/source/games/duke/src/vmexports.cpp b/source/games/duke/src/vmexports.cpp index 360e13959..ab021d4d9 100644 --- a/source/games/duke/src/vmexports.cpp +++ b/source/games/duke/src/vmexports.cpp @@ -575,16 +575,11 @@ DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, detonate, DukeActor_detonate) return 0; } -void DukeActor_checkhitdefault(DDukeActor* origin, DDukeActor* proj) -{ - fi.checkhitdefault(origin, proj); -} - -DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, checkhitdefault, DukeActor_checkhitdefault) +DEFINE_ACTION_FUNCTION_NATIVE(DDukeActor, checkhitdefault, checkhitdefault) { PARAM_SELF_PROLOGUE(DDukeActor); PARAM_OBJECT(proj, DDukeActor); - DukeActor_checkhitdefault(self, proj); + checkhitdefault(self, proj); return 0; }