diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h index 80f3d6f52..d98e7f0df 100644 --- a/source/games/duke/src/funct.h +++ b/source/games/duke/src/funct.h @@ -239,6 +239,7 @@ void donewgame(MapRecord* map, int sk); int playercolor2lookup(int color); void PlayerColorChanged(void); bool movementBlocked(player_struct *p); +void underwater(int snum, ESyncBits actions, double floorz, double ceilingz); void loadcons(); void DrawStatusBar(); void thunder(void); diff --git a/source/games/duke/src/player.cpp b/source/games/duke/src/player.cpp index e0a75e5bc..46f46c8ce 100644 --- a/source/games/duke/src/player.cpp +++ b/source/games/duke/src/player.cpp @@ -1560,4 +1560,85 @@ void playerkick(player_struct* p, DDukeActor* g_ac) p->quick_kick = 14; } +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + +void underwater(int snum, ESyncBits actions, double floorz, double ceilingz) +{ + const auto p = &ps[snum]; + const auto pact = p->GetActor(); + + p->jumping_counter = 0; + p->pycount += 32; + p->pycount &= 2047; + p->pyoff = BobVal(p->pycount); + + if (!S_CheckActorSoundPlaying(pact, DUKE_UNDERWATER)) + S_PlayActorSound(DUKE_UNDERWATER, pact); + + if ((actions & SB_JUMP) && !p->OnMotorcycle) + { + if (p->vel.Z > 0) p->vel.Z = 0; + p->vel.Z -= (348 / 256.); + if (p->vel.Z < -6) p->vel.Z = -6; + } + else if ((actions & SB_CROUCH) || p->OnMotorcycle) + { + if (p->vel.Z < 0) p->vel.Z = 0; + p->vel.Z += (348 / 256.); + if (p->vel.Z > 6) p->vel.Z = 6; + } + else + { + if (p->vel.Z < 0) + { + p->vel.Z += 1; + if (p->vel.Z > 0) + p->vel.Z = 0; + } + if (p->vel.Z > 0) + { + p->vel.Z -= 1; + if (p->vel.Z < 0) + p->vel.Z = 0; + } + } + + if (p->vel.Z > 8) + p->vel.Z *= 0.5; + + pact->spr.pos.Z += p->vel.Z; + + if (pact->getOffsetZ() > floorz - 15) + pact->spr.pos.Z += ((floorz - 15) - pact->getOffsetZ()) * 0.5; + + if (pact->getOffsetZ() < ceilingz + 4) + { + pact->spr.pos.Z = ceilingz + 4 + gs.playerheight; + p->vel.Z = 0; + } + + if (p->scuba_on && (krand() & 255) < 8) + { + if (const auto j = spawn(pact, DukeWaterBubbleClass)) + { + if (isRR()) + { + j->spr.pos += (pact->spr.Angles.Yaw.ToVector() + DVector2(12 - (global_random & 8), 12 - (global_random & 8))) * 16; + j->spr.cstat = CSTAT_SPRITE_TRANS_FLIP | CSTAT_SPRITE_TRANSLUCENT; + } + else + { + j->spr.pos += (pact->spr.Angles.Yaw.ToVector() + DVector2(4 - (global_random & 8), 4 - (global_random & 8))) * 16; + } + + j->spr.scale = DVector2(0.046875, 0.03125); + j->spr.pos.Z = pact->getOffsetZ() + 8; + } + } +} + END_DUKE_NS diff --git a/source/games/duke/src/player_d.cpp b/source/games/duke/src/player_d.cpp index 2530eb7f6..25a827416 100644 --- a/source/games/duke/src/player_d.cpp +++ b/source/games/duke/src/player_d.cpp @@ -827,79 +827,6 @@ static void movement(int snum, ESyncBits actions, sectortype* psect, double floo // //--------------------------------------------------------------------------- -static void underwater(int snum, ESyncBits actions, double floorz, double ceilingz) -{ - const auto p = &ps[snum]; - const auto pact = p->GetActor(); - - p->jumping_counter = 0; - p->pycount += 32; - p->pycount &= 2047; - p->pyoff = BobVal(p->pycount); - - if (!S_CheckActorSoundPlaying(pact, DUKE_UNDERWATER)) - S_PlayActorSound(DUKE_UNDERWATER, pact); - - if (actions & SB_JUMP) - { - if (p->vel.Z > 0) p->vel.Z = 0; - p->vel.Z -= (348 / 256.); - if (p->vel.Z < -6) p->vel.Z = -6; - } - else if (actions & SB_CROUCH) - { - if (p->vel.Z < 0) p->vel.Z = 0; - p->vel.Z += (348 / 256.); - if (p->vel.Z > 6) p->vel.Z = 6; - } - else - { - // normal view - if (p->vel.Z < 0) - { - p->vel.Z += 1; - if (p->vel.Z > 0) - p->vel.Z = 0; - } - if (p->vel.Z > 0) - { - p->vel.Z -= 1; - if (p->vel.Z < 0) - p->vel.Z = 0; - } - } - - if (p->vel.Z > 8) - p->vel.Z *= 0.5; - - pact->spr.pos.Z += p->vel.Z; - - if (pact->getOffsetZ() > floorz - 15) - pact->spr.pos.Z += ((floorz - 15) - pact->getOffsetZ()) * 0.5; - - if (pact->getOffsetZ() < ceilingz + 4) - { - pact->spr.pos.Z = ceilingz + 4 + gs.playerheight; - p->vel.Z = 0; - } - - if (p->scuba_on && (krand() & 255) < 8) - { - if (const auto j = spawn(pact, DukeWaterBubbleClass)) - { - j->spr.pos += (pact->spr.Angles.Yaw.ToVector() + DVector2(4 - (global_random & 8), 4 - (global_random & 8))) * 16; - j->spr.scale = DVector2(0.046875, 0.03125); - j->spr.pos.Z = pact->getOffsetZ() + 8; - } - } -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - int operateTripbomb(int snum) { auto p = &ps[snum]; diff --git a/source/games/duke/src/player_r.cpp b/source/games/duke/src/player_r.cpp index c1e542935..20c3283fd 100644 --- a/source/games/duke/src/player_r.cpp +++ b/source/games/duke/src/player_r.cpp @@ -1327,79 +1327,6 @@ static void movement(int snum, ESyncBits actions, sectortype* psect, double floo // //--------------------------------------------------------------------------- -static void underwater(int snum, ESyncBits actions, double floorz, double ceilingz) -{ - const auto p = &ps[snum]; - const auto pact = p->GetActor(); - - p->jumping_counter = 0; - p->pycount += 32; - p->pycount &= 2047; - p->pyoff = BobVal(p->pycount); - - if (!S_CheckActorSoundPlaying(pact, DUKE_UNDERWATER)) - S_PlayActorSound(DUKE_UNDERWATER, pact); - - if ((actions & SB_JUMP) && !p->OnMotorcycle) - { - if (p->vel.Z > 0) p->vel.Z = 0; - p->vel.Z -= (348 / 256.); - if (p->vel.Z < -6) p->vel.Z = -6; - } - else if ((actions & SB_CROUCH) || p->OnMotorcycle) - { - if (p->vel.Z < 0) p->vel.Z = 0; - p->vel.Z += (348 / 256.); - if (p->vel.Z > 6) p->vel.Z = 6; - } - else - { - if (p->vel.Z < 0) - { - p->vel.Z += 1; - if (p->vel.Z > 0) - p->vel.Z = 0; - } - if (p->vel.Z > 0) - { - p->vel.Z -= 1; - if (p->vel.Z < 0) - p->vel.Z = 0; - } - } - - if (p->vel.Z > 8) - p->vel.Z *= 0.5; - - pact->spr.pos.Z += p->vel.Z; - - if (pact->getOffsetZ() > floorz - 15) - pact->spr.pos.Z += ((floorz - 15) - pact->getOffsetZ()) * 0.5; - - if (pact->getOffsetZ() < ceilingz + 4) - { - pact->spr.pos.Z = ceilingz + 4 + gs.playerheight; - p->vel.Z = 0; - } - - if (p->scuba_on && (krand() & 255) < 8) - { - if (const auto j = spawn(pact, DukeWaterBubbleClass)) - { - j->spr.pos += (pact->spr.Angles.Yaw.ToVector() + DVector2(12 - (global_random & 8), 12 - (global_random & 8))) * 16; - j->spr.scale = DVector2(0.046875, 0.03125); - j->spr.pos.Z = pact->getOffsetZ() + 8; - j->spr.cstat = CSTAT_SPRITE_TRANS_FLIP | CSTAT_SPRITE_TRANSLUCENT; - } - } -} - -//--------------------------------------------------------------------------- -// -// -// -//--------------------------------------------------------------------------- - void onMotorcycleMove(int snum, walltype* wal) { auto p = &ps[snum];