- Duke: Consolidate the mostly duplicate underwater() functions.

This commit is contained in:
Mitchell Richters 2023-04-23 19:16:03 +10:00
parent 02325c37bc
commit 87144564fd
4 changed files with 82 additions and 146 deletions

View file

@ -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);

View file

@ -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

View file

@ -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];

View file

@ -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];