From 1b64b207bb2002a5384fb66a61e2c2080c348bb9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 29 Dec 2022 19:17:49 +0100 Subject: [PATCH] - consolidated movesprite_ex functions. --- source/games/duke/src/actors.cpp | 85 ++++++++++++++++++++++++++++++ source/games/duke/src/actors_d.cpp | 84 ----------------------------- source/games/duke/src/actors_r.cpp | 66 ----------------------- source/games/duke/src/dukeactor.h | 12 ----- source/games/duke/src/funct.h | 1 + 5 files changed, 86 insertions(+), 162 deletions(-) diff --git a/source/games/duke/src/actors.cpp b/source/games/duke/src/actors.cpp index 97f526574..d247b6c6a 100644 --- a/source/games/duke/src/actors.cpp +++ b/source/games/duke/src/actors.cpp @@ -978,6 +978,91 @@ void hitradius(DDukeActor* actor, int r, int hp1, int hp2, int hp3, int hp4 } } +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + + +int movesprite_ex(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result) +{ + int bg = badguy(actor); + + if (actor->spr.statnum == STAT_MISC || (bg && actor->spr.scale.X < 0.0625)) + { + actor->spr.pos += change; + if (bg) + SetActor(actor, actor->spr.pos); + return result.setNone(); + } + + auto dasectp = actor->sector(); + + auto ppos = actor->spr.pos; + + auto tex = TexMan.GetGameTexture(actor->spr.spritetexture()); + ppos.Z -= tex->GetDisplayHeight() * actor->spr.scale.Y * 0.5; + + if (bg) + { + if (actor->spr.scale.X > 0.9375) + clipmove(ppos, &dasectp, change * 0.5, 64., 4., 4., cliptype, result); + else + { + // todo: move this mess to the actor definitions once we have them all available. + double clipdist = actor->FloatVar(NAME_moveclipdist); + if (clipdist == 0) + { + if ((actor->flags1 & SFLAG_BADGUY) && !isRR()) + clipdist = actor->clipdist; + else + clipdist = 12; + } + + clipmove(ppos, &dasectp, change * 0.5, clipdist, 4., 4., cliptype, result); + } + + // conditional code from hell... + if (dasectp == nullptr || (dasectp != nullptr && + ((actor->actorstayput != nullptr && actor->actorstayput != dasectp) || + ((actor->flags3 & SFLAG3_ST3CONFINED) && actor->spr.pal == 0 && dasectp->lotag != ST_3_BOSS2) || + ((actor->flags3 & SFLAG3_DONTENTERWATER) && dasectp->lotag == ST_1_ABOVE_WATER) || + ((actor->flags3 & SFLAG3_DONTENTERWATERONGROUND) && actor->vel.Z == 0 && dasectp->lotag == ST_1_ABOVE_WATER)) + ) + ) + { + if (dasectp && dasectp->lotag == ST_1_ABOVE_WATER && (actor->flags3 & SFLAG3_RANDOMANGLEONWATER)) + actor->spr.Angles.Yaw = randomAngle(); + else if ((actor->counter & 3) == 1 && !(actor->flags3 & SFLAG3_NORANDOMANGLEWHENBLOCKED)) + actor->spr.Angles.Yaw = randomAngle(); + SetActor(actor, actor->spr.pos); + if (dasectp == nullptr) dasectp = §or[0]; + return result.setSector(dasectp); + } + if ((result.type == kHitWall || result.type == kHitSprite) && (actor->cgg == 0)) actor->spr.Angles.Yaw += DAngle90 + DAngle45; + } + else + { + if (actor->spr.statnum == STAT_PROJECTILE) + clipmove(ppos, &dasectp, change * 0.5, 0.5, 4., 4., cliptype, result); + else + clipmove(ppos, &dasectp, change * 0.5, actor->clipdist, 4., 4., cliptype, result); + } + actor->spr.pos.XY() = ppos.XY(); + + if (dasectp != nullptr && dasectp != actor->sector()) + ChangeActorSect(actor, dasectp); + + double daz = actor->spr.pos.Z + change.Z * 0.5; + if (daz > actor->ceilingz && daz <= actor->floorz) + actor->spr.pos.Z = daz; + else if (result.type == kHitNone) + return result.setSector(dasectp); + + return result.type; +} + //--------------------------------------------------------------------------- // // Rotating sector diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp index ce389bd4f..e1485c8a8 100644 --- a/source/games/duke/src/actors_d.cpp +++ b/source/games/duke/src/actors_d.cpp @@ -141,90 +141,6 @@ int ifsquished(DDukeActor* actor, int p) return false; } -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - - -int movesprite_ex_d(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision &result) -{ - int bg = badguy(actor); - - if (actor->spr.statnum == STAT_MISC || (bg && actor->spr.scale.X < 0.0625)) - { - actor->spr.pos += change; - if (bg) - SetActor(actor, actor->spr.pos); - return result.setNone(); - } - - auto dasectp = actor->sector(); - - auto ppos = actor->spr.pos; - - auto tex = TexMan.GetGameTexture(actor->spr.spritetexture()); - ppos.Z -= tex->GetDisplayHeight() * actor->spr.scale.Y * 0.5; - - if (bg) - { - if (actor->spr.scale.X > 0.9375 ) - clipmove(ppos, &dasectp, change * 0.5, 64., 4., 4., cliptype, result); - else - { - // todo: move this mess to the actor definitions once we have them all available. - double clipdist = actor->FloatVar(NAME_moveclipdist); - if (clipdist == 0) - { - if ((actor->flags1 & SFLAG_BADGUY) && !isRR()) - clipdist = actor->clipdist; - else - clipdist = 12; - } - - clipmove(ppos, &dasectp, change * 0.5, clipdist, 4., 4., cliptype, result); - } - - // conditional code from hell... - if (dasectp == nullptr || (dasectp != nullptr && - ((actor->actorstayput != nullptr && actor->actorstayput != dasectp) || - ((actor->flags3 & SFLAG3_ST3CONFINED) && actor->spr.pal == 0 && dasectp->lotag != ST_3_BOSS2) || - ((actor->flags3 & SFLAG3_DONTENTERWATER) && dasectp->lotag == ST_1_ABOVE_WATER) || - ((actor->flags3 & SFLAG3_DONTENTERWATERONGROUND) && actor->vel.Z == 0 && dasectp->lotag == ST_1_ABOVE_WATER)) - ) - ) - { - if (dasectp && dasectp->lotag == ST_1_ABOVE_WATER && (actor->flags3 & SFLAG3_RANDOMANGLEONWATER)) - actor->spr.Angles.Yaw = randomAngle(); - else if ((actor->counter&3) == 1 && !(actor->flags3 & SFLAG3_NORANDOMANGLEWHENBLOCKED)) - actor->spr.Angles.Yaw = randomAngle(); - SetActor(actor,actor->spr.pos); - if (dasectp == nullptr) dasectp = §or[0]; - return result.setSector(dasectp); - } - if ((result.type == kHitWall || result.type == kHitSprite) && (actor->cgg == 0)) actor->spr.Angles.Yaw += DAngle90 + DAngle45; - } - else - { - if (actor->spr.statnum == STAT_PROJECTILE) - clipmove(ppos, &dasectp, change * 0.5, 0.5, 4., 4., cliptype, result); - else - clipmove(ppos, &dasectp, change * 0.5, actor->clipdist, 4., 4., cliptype, result); - } - actor->spr.pos.XY() = ppos.XY(); - - if (dasectp != nullptr && dasectp != actor->sector()) - ChangeActorSect(actor, dasectp); - - double daz = actor->spr.pos.Z + change.Z * 0.5; - if (daz > actor->ceilingz && daz <= actor->floorz) - actor->spr.pos.Z = daz; - else if (result.type == kHitNone) - return result.setSector(dasectp); - - return result.type; -} //--------------------------------------------------------------------------- // // diff --git a/source/games/duke/src/actors_r.cpp b/source/games/duke/src/actors_r.cpp index a6dbd630d..9720006ce 100644 --- a/source/games/duke/src/actors_r.cpp +++ b/source/games/duke/src/actors_r.cpp @@ -140,72 +140,6 @@ void addweapon_r(player_struct* p, int weapon, bool wswitch) } } -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - -int movesprite_ex_r(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision &result) -{ - int bg = badguy(actor); - - if (actor->spr.statnum == 5 || (bg && actor->spr.scale.X < 0.0625)) - { - actor->spr.pos += change; - if (bg) - SetActor(actor, actor->spr.pos); - return result.setNone(); - } - - auto dasectp = actor->sector(); - - auto ppos = actor->spr.pos; - auto tex = TexMan.GetGameTexture(actor->spr.spritetexture()); - ppos.Z -= tex->GetDisplayHeight() * actor->spr.scale.Y * 0.5; - - if (bg) - { - if (actor->spr.scale.X > 0.9375 ) - clipmove(ppos, &dasectp, change * 0.5, 64., 4., 4., cliptype, result); - else - { - clipmove(ppos, &dasectp, change * 0.5, 12., 4., 4., cliptype, result); - } - - if (dasectp == nullptr || (dasectp != nullptr && actor->actorstayput != nullptr && actor->actorstayput != dasectp)) - { - if (dasectp && dasectp->lotag == ST_1_ABOVE_WATER) - actor->spr.Angles.Yaw = randomAngle(); - else if ((actor->counter & 3) == 1) - actor->spr.Angles.Yaw = randomAngle(); - SetActor(actor, actor->spr.pos); - if (dasectp == nullptr) dasectp = §or[0]; - return result.setSector(dasectp); - } - if ((result.type == kHitWall || result.type == kHitSprite) && (actor->cgg == 0)) actor->spr.Angles.Yaw += DAngle45 + DAngle90; - } - else - { - if (actor->spr.statnum == STAT_PROJECTILE) - clipmove(ppos, &dasectp, change * 0.5, 0.5, 4., 4., cliptype, result); - else - clipmove(ppos, &dasectp, change * 0.5, actor->clipdist, 4., 4., cliptype, result); - } - actor->spr.pos.XY() = ppos.XY(); - - if (dasectp) - if ((dasectp != actor->sector())) - ChangeActorSect(actor, dasectp); - double daz = actor->spr.pos.Z + change.Z * 0.5; - if (daz > actor->ceilingz && daz <= actor->floorz) - actor->spr.pos.Z = daz; - else if (result.type == kHitNone) - return result.setSector(dasectp); - - return result.type; -} - //--------------------------------------------------------------------------- // // diff --git a/source/games/duke/src/dukeactor.h b/source/games/duke/src/dukeactor.h index d6a916512..d8228c304 100644 --- a/source/games/duke/src/dukeactor.h +++ b/source/games/duke/src/dukeactor.h @@ -33,16 +33,4 @@ inline int bossguy(const DDukeActor* pSprite) return !!(pSprite->flags1 & SFLAG_BOSS); } -// old interface versions of already changed functions - -int movesprite_ex_d(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result); -int movesprite_ex_r(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result); - -inline int movesprite_ex(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result) -{ - auto f = isRR() ? movesprite_ex_r : movesprite_ex_d; - return f(actor, change, cliptype, result); -} - - END_DUKE_NS diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h index fe9668e4a..0c7679e9d 100644 --- a/source/games/duke/src/funct.h +++ b/source/games/duke/src/funct.h @@ -41,6 +41,7 @@ void clearcameras(player_struct* p); void RANDOMSCRAP(DDukeActor* i); void detonate(DDukeActor* i, PClassActor* explosion); void hitradius(DDukeActor* i, int r, int hp1, int hp2, int hp3, int hp4); +int movesprite_ex(DDukeActor* actor, const DVector3& change, unsigned int cliptype, Collision& result); void lotsofstuff(DDukeActor* s, int n, PClassActor* spawntype); void watersplash2(DDukeActor* i); bool money(DDukeActor* i, int BLOODPOOL);