mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Properly spawn effects for the other objects
This commit is contained in:
parent
6ca979d53e
commit
afc2a0dcdc
4 changed files with 167 additions and 102 deletions
146
src/k_kart.c
146
src/k_kart.c
|
|
@ -3341,6 +3341,152 @@ boolean K_WaterSkip(mobj_t *mobj)
|
|||
}
|
||||
}
|
||||
|
||||
void K_SpawnWaterRunParticles(mobj_t *mobj)
|
||||
{
|
||||
fixed_t runSpeed = 14 * mobj->scale;
|
||||
fixed_t curSpeed = INT32_MAX;
|
||||
fixed_t topSpeed = INT32_MAX;
|
||||
fixed_t trailScale = FRACUNIT;
|
||||
|
||||
if (mobj->momz != 0)
|
||||
{
|
||||
// Only while touching ground.
|
||||
return;
|
||||
}
|
||||
|
||||
if (mobj->watertop == INT32_MAX || mobj->waterbottom == INT32_MIN)
|
||||
{
|
||||
// Invalid water plane.
|
||||
return;
|
||||
}
|
||||
|
||||
if (mobj->player != NULL)
|
||||
{
|
||||
if (mobj->player->spectator)
|
||||
{
|
||||
// Not as spectator.
|
||||
return;
|
||||
}
|
||||
|
||||
if (mobj->player->carry == CR_SLIDING)
|
||||
{
|
||||
// Not in water slides.
|
||||
return;
|
||||
}
|
||||
|
||||
topSpeed = K_GetKartSpeed(mobj->player, false, false);
|
||||
runSpeed = FixedMul(runSpeed, mobj->movefactor);
|
||||
}
|
||||
else
|
||||
{
|
||||
topSpeed = FixedMul(mobj->scale, K_GetKartSpeedFromStat(5));
|
||||
}
|
||||
|
||||
curSpeed = P_AproxDistance(mobj->momx, mobj->momy);
|
||||
|
||||
if (curSpeed <= runSpeed)
|
||||
{
|
||||
// Not fast enough.
|
||||
return;
|
||||
}
|
||||
|
||||
// Near the water plane.
|
||||
if ((!(mobj->eflags & MFE_VERTICALFLIP) && mobj->z + mobj->height >= mobj->watertop && mobj->z <= mobj->watertop)
|
||||
|| (mobj->eflags & MFE_VERTICALFLIP && mobj->z + mobj->height >= mobj->waterbottom && mobj->z <= mobj->waterbottom))
|
||||
{
|
||||
if (topSpeed > runSpeed)
|
||||
{
|
||||
trailScale = FixedMul(FixedDiv(curSpeed - runSpeed, topSpeed - runSpeed), mapobjectscale);
|
||||
}
|
||||
else
|
||||
{
|
||||
trailScale = mapobjectscale; // Scaling is based off difference between runspeed and top speed
|
||||
}
|
||||
|
||||
if (trailScale > 0)
|
||||
{
|
||||
const angle_t forwardangle = K_MomentumAngle(mobj);
|
||||
const fixed_t playerVisualRadius = mobj->radius + (8 * mobj->scale);
|
||||
const size_t numFrames = S_WATERTRAIL8 - S_WATERTRAIL1;
|
||||
const statenum_t curOverlayFrame = S_WATERTRAIL1 + (leveltime % numFrames);
|
||||
const statenum_t curUnderlayFrame = S_WATERTRAILUNDERLAY1 + (leveltime % numFrames);
|
||||
fixed_t x1, x2, y1, y2;
|
||||
mobj_t *water;
|
||||
|
||||
x1 = mobj->x + mobj->momx + P_ReturnThrustX(mobj, forwardangle + ANGLE_90, playerVisualRadius);
|
||||
y1 = mobj->y + mobj->momy + P_ReturnThrustY(mobj, forwardangle + ANGLE_90, playerVisualRadius);
|
||||
x1 = x1 + P_ReturnThrustX(mobj, forwardangle, playerVisualRadius);
|
||||
y1 = y1 + P_ReturnThrustY(mobj, forwardangle, playerVisualRadius);
|
||||
|
||||
x2 = mobj->x + mobj->momx + P_ReturnThrustX(mobj, forwardangle - ANGLE_90, playerVisualRadius);
|
||||
y2 = mobj->y + mobj->momy + P_ReturnThrustY(mobj, forwardangle - ANGLE_90, playerVisualRadius);
|
||||
x2 = x2 + P_ReturnThrustX(mobj, forwardangle, playerVisualRadius);
|
||||
y2 = y2 + P_ReturnThrustY(mobj, forwardangle, playerVisualRadius);
|
||||
|
||||
// Left
|
||||
// underlay
|
||||
water = P_SpawnMobj(x1, y1,
|
||||
((mobj->eflags & MFE_VERTICALFLIP) ? mobj->waterbottom - FixedMul(mobjinfo[MT_WATERTRAILUNDERLAY].height, mobj->scale) : mobj->watertop), MT_WATERTRAILUNDERLAY);
|
||||
P_InitAngle(water, forwardangle - ANGLE_180 - ANGLE_22h);
|
||||
water->destscale = trailScale;
|
||||
water->momx = mobj->momx;
|
||||
water->momy = mobj->momy;
|
||||
water->momz = mobj->momz;
|
||||
P_SetScale(water, trailScale);
|
||||
P_SetMobjState(water, curUnderlayFrame);
|
||||
|
||||
// overlay
|
||||
water = P_SpawnMobj(x1, y1,
|
||||
((mobj->eflags & MFE_VERTICALFLIP) ? mobj->waterbottom - FixedMul(mobjinfo[MT_WATERTRAIL].height, mobj->scale) : mobj->watertop), MT_WATERTRAIL);
|
||||
P_InitAngle(water, forwardangle - ANGLE_180 - ANGLE_22h);
|
||||
water->destscale = trailScale;
|
||||
water->momx = mobj->momx;
|
||||
water->momy = mobj->momy;
|
||||
water->momz = mobj->momz;
|
||||
P_SetScale(water, trailScale);
|
||||
P_SetMobjState(water, curOverlayFrame);
|
||||
|
||||
// Right
|
||||
// Underlay
|
||||
water = P_SpawnMobj(x2, y2,
|
||||
((mobj->eflags & MFE_VERTICALFLIP) ? mobj->waterbottom - FixedMul(mobjinfo[MT_WATERTRAILUNDERLAY].height, mobj->scale) : mobj->watertop), MT_WATERTRAILUNDERLAY);
|
||||
P_InitAngle(water, forwardangle - ANGLE_180 + ANGLE_22h);
|
||||
water->destscale = trailScale;
|
||||
water->momx = mobj->momx;
|
||||
water->momy = mobj->momy;
|
||||
water->momz = mobj->momz;
|
||||
P_SetScale(water, trailScale);
|
||||
P_SetMobjState(water, curUnderlayFrame);
|
||||
|
||||
// Overlay
|
||||
water = P_SpawnMobj(x2, y2,
|
||||
((mobj->eflags & MFE_VERTICALFLIP) ? mobj->waterbottom - FixedMul(mobjinfo[MT_WATERTRAIL].height, mobj->scale) : mobj->watertop), MT_WATERTRAIL);
|
||||
P_InitAngle(water, forwardangle - ANGLE_180 + ANGLE_22h);
|
||||
water->destscale = trailScale;
|
||||
water->momx = mobj->momx;
|
||||
water->momy = mobj->momy;
|
||||
water->momz = mobj->momz;
|
||||
P_SetScale(water, trailScale);
|
||||
P_SetMobjState(water, curOverlayFrame);
|
||||
|
||||
if (!S_SoundPlaying(mobj, sfx_s3kdbs))
|
||||
{
|
||||
const INT32 volume = (min(trailScale, FRACUNIT) * 255) / FRACUNIT;
|
||||
S_StartSoundAtVolume(mobj, sfx_s3kdbs, volume);
|
||||
}
|
||||
}
|
||||
|
||||
// Little water sound while touching water - just a nicety.
|
||||
if ((mobj->eflags & MFE_TOUCHWATER) && !(mobj->eflags & MFE_UNDERWATER))
|
||||
{
|
||||
if (P_RandomChance(PR_BUBBLE, FRACUNIT/2) && leveltime % TICRATE == 0)
|
||||
{
|
||||
S_StartSound(mobj, sfx_floush);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static fixed_t K_FlameShieldDashVar(INT32 val)
|
||||
{
|
||||
// 1 second = 75% + 50% top speed
|
||||
|
|
|
|||
|
|
@ -145,6 +145,7 @@ boolean K_TripwirePass(player_t *player);
|
|||
boolean K_MovingHorizontally(mobj_t *mobj);
|
||||
boolean K_WaterRun(mobj_t *mobj);
|
||||
boolean K_WaterSkip(mobj_t *mobj);
|
||||
void K_SpawnWaterRunParticles(mobj_t *mobj);
|
||||
void K_ApplyTripWire(player_t *player, tripwirestate_t state);
|
||||
INT16 K_GetSpindashChargeTime(player_t *player);
|
||||
fixed_t K_GetSpindashChargeSpeed(player_t *player);
|
||||
|
|
|
|||
28
src/p_mobj.c
28
src/p_mobj.c
|
|
@ -3284,10 +3284,23 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
}
|
||||
}
|
||||
|
||||
// Spectators and dead players don't get to do any of the things after this.
|
||||
if (p && (p->spectator || p->playerstate != PST_LIVE))
|
||||
if (P_IsObjectOnGround(mobj) == true)
|
||||
{
|
||||
return;
|
||||
mobj->waterskip = 0;
|
||||
}
|
||||
|
||||
if (p != NULL)
|
||||
{
|
||||
// Spectators and dead players don't get to do any of the things after this.
|
||||
if (p->spectator || p->playerstate != PST_LIVE)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (mobj->flags & MF_APPLYTERRAIN)
|
||||
{
|
||||
K_SpawnWaterRunParticles(mobj);
|
||||
}
|
||||
|
||||
// The rest of this code only executes on a water state change.
|
||||
|
|
@ -3296,11 +3309,6 @@ void P_MobjCheckWater(mobj_t *mobj)
|
|||
return;
|
||||
}
|
||||
|
||||
if (P_IsObjectOnGround(mobj) == true)
|
||||
{
|
||||
mobj->waterskip = 0;
|
||||
}
|
||||
|
||||
if (p != NULL
|
||||
&& p->curshield != KSHIELD_BUBBLE
|
||||
&& mobj->waterskip == 0
|
||||
|
|
@ -6795,11 +6803,13 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
case MT_ORBINAUT:
|
||||
{
|
||||
Obj_OrbinautThink(mobj);
|
||||
P_MobjCheckWater(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_JAWZ:
|
||||
{
|
||||
Obj_JawzThink(mobj);
|
||||
P_MobjCheckWater(mobj);
|
||||
break;
|
||||
}
|
||||
case MT_EGGMANITEM:
|
||||
|
|
@ -6863,6 +6873,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
|
|||
|
||||
if (mobj->threshold > 0)
|
||||
mobj->threshold--;
|
||||
|
||||
P_MobjCheckWater(mobj);
|
||||
}
|
||||
break;
|
||||
case MT_SINK:
|
||||
|
|
|
|||
94
src/p_user.c
94
src/p_user.c
|
|
@ -2292,100 +2292,6 @@ void P_MovePlayer(player_t *player)
|
|||
//GAMEPLAY STUFF//
|
||||
//////////////////
|
||||
|
||||
if (((!(player->mo->eflags & MFE_VERTICALFLIP) && player->mo->z + player->mo->height >= player->mo->watertop && player->mo->z <= player->mo->watertop)
|
||||
|| (player->mo->eflags & MFE_VERTICALFLIP && player->mo->z + player->mo->height >= player->mo->waterbottom && player->mo->z <= player->mo->waterbottom))
|
||||
&& (player->speed > runspd)
|
||||
&& player->mo->momz == 0 && player->carry != CR_SLIDING && !player->spectator)
|
||||
{
|
||||
fixed_t playerTopSpeed = K_GetKartSpeed(player, false, false);
|
||||
fixed_t trailScale = FixedMul(FixedDiv(player->speed - runspd, playerTopSpeed - runspd), mapobjectscale);
|
||||
|
||||
if (playerTopSpeed > runspd)
|
||||
trailScale = FixedMul(FixedDiv(player->speed - runspd, playerTopSpeed - runspd), mapobjectscale);
|
||||
else
|
||||
trailScale = mapobjectscale; // Scaling is based off difference between runspeed and top speed
|
||||
|
||||
if (trailScale > 0)
|
||||
{
|
||||
const angle_t forwardangle = K_MomentumAngle(player->mo);
|
||||
const fixed_t playerVisualRadius = player->mo->radius + (8 * player->mo->scale);
|
||||
const size_t numFrames = S_WATERTRAIL8 - S_WATERTRAIL1;
|
||||
const statenum_t curOverlayFrame = S_WATERTRAIL1 + (leveltime % numFrames);
|
||||
const statenum_t curUnderlayFrame = S_WATERTRAILUNDERLAY1 + (leveltime % numFrames);
|
||||
fixed_t x1, x2, y1, y2;
|
||||
mobj_t *water;
|
||||
|
||||
x1 = player->mo->x + player->mo->momx + P_ReturnThrustX(player->mo, forwardangle + ANGLE_90, playerVisualRadius);
|
||||
y1 = player->mo->y + player->mo->momy + P_ReturnThrustY(player->mo, forwardangle + ANGLE_90, playerVisualRadius);
|
||||
x1 = x1 + P_ReturnThrustX(player->mo, forwardangle, playerVisualRadius);
|
||||
y1 = y1 + P_ReturnThrustY(player->mo, forwardangle, playerVisualRadius);
|
||||
|
||||
x2 = player->mo->x + player->mo->momx + P_ReturnThrustX(player->mo, forwardangle - ANGLE_90, playerVisualRadius);
|
||||
y2 = player->mo->y + player->mo->momy + P_ReturnThrustY(player->mo, forwardangle - ANGLE_90, playerVisualRadius);
|
||||
x2 = x2 + P_ReturnThrustX(player->mo, forwardangle, playerVisualRadius);
|
||||
y2 = y2 + P_ReturnThrustY(player->mo, forwardangle, playerVisualRadius);
|
||||
|
||||
// Left
|
||||
// underlay
|
||||
water = P_SpawnMobj(x1, y1,
|
||||
((player->mo->eflags & MFE_VERTICALFLIP) ? player->mo->waterbottom - FixedMul(mobjinfo[MT_WATERTRAILUNDERLAY].height, player->mo->scale) : player->mo->watertop), MT_WATERTRAILUNDERLAY);
|
||||
P_InitAngle(water, forwardangle - ANGLE_180 - ANGLE_22h);
|
||||
water->destscale = trailScale;
|
||||
water->momx = player->mo->momx;
|
||||
water->momy = player->mo->momy;
|
||||
water->momz = player->mo->momz;
|
||||
P_SetScale(water, trailScale);
|
||||
P_SetMobjState(water, curUnderlayFrame);
|
||||
|
||||
// overlay
|
||||
water = P_SpawnMobj(x1, y1,
|
||||
((player->mo->eflags & MFE_VERTICALFLIP) ? player->mo->waterbottom - FixedMul(mobjinfo[MT_WATERTRAIL].height, player->mo->scale) : player->mo->watertop), MT_WATERTRAIL);
|
||||
P_InitAngle(water, forwardangle - ANGLE_180 - ANGLE_22h);
|
||||
water->destscale = trailScale;
|
||||
water->momx = player->mo->momx;
|
||||
water->momy = player->mo->momy;
|
||||
water->momz = player->mo->momz;
|
||||
P_SetScale(water, trailScale);
|
||||
P_SetMobjState(water, curOverlayFrame);
|
||||
|
||||
// Right
|
||||
// Underlay
|
||||
water = P_SpawnMobj(x2, y2,
|
||||
((player->mo->eflags & MFE_VERTICALFLIP) ? player->mo->waterbottom - FixedMul(mobjinfo[MT_WATERTRAILUNDERLAY].height, player->mo->scale) : player->mo->watertop), MT_WATERTRAILUNDERLAY);
|
||||
P_InitAngle(water, forwardangle - ANGLE_180 + ANGLE_22h);
|
||||
water->destscale = trailScale;
|
||||
water->momx = player->mo->momx;
|
||||
water->momy = player->mo->momy;
|
||||
water->momz = player->mo->momz;
|
||||
P_SetScale(water, trailScale);
|
||||
P_SetMobjState(water, curUnderlayFrame);
|
||||
|
||||
// Overlay
|
||||
water = P_SpawnMobj(x2, y2,
|
||||
((player->mo->eflags & MFE_VERTICALFLIP) ? player->mo->waterbottom - FixedMul(mobjinfo[MT_WATERTRAIL].height, player->mo->scale) : player->mo->watertop), MT_WATERTRAIL);
|
||||
P_InitAngle(water, forwardangle - ANGLE_180 + ANGLE_22h);
|
||||
water->destscale = trailScale;
|
||||
water->momx = player->mo->momx;
|
||||
water->momy = player->mo->momy;
|
||||
water->momz = player->mo->momz;
|
||||
P_SetScale(water, trailScale);
|
||||
P_SetMobjState(water, curOverlayFrame);
|
||||
|
||||
if (!S_SoundPlaying(player->mo, sfx_s3kdbs))
|
||||
{
|
||||
const INT32 volume = (min(trailScale, FRACUNIT) * 255) / FRACUNIT;
|
||||
S_StartSoundAtVolume(player->mo, sfx_s3kdbs, volume);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Little water sound while touching water - just a nicety.
|
||||
if ((player->mo->eflags & MFE_TOUCHWATER) && !(player->mo->eflags & MFE_UNDERWATER) && !player->spectator)
|
||||
{
|
||||
if (P_RandomChance(PR_BUBBLE, FRACUNIT/2) && leveltime % TICRATE == 0)
|
||||
S_StartSound(player->mo, sfx_floush);
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//SPINNING AND SPINDASHING//
|
||||
////////////////////////////
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue