diff --git a/src/d_player.h b/src/d_player.h index 4df3dd6d..9aa88e9e 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -294,6 +294,7 @@ typedef enum k_offroad, // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed k_pogospring, // Pogo spring bounce effect k_brakestop, // Wait until you've made a complete stop for a few tics before letting brake go in reverse. + k_waterskip, // Water skipping counter k_itemroulette, // Used for the roulette when deciding what item to give you (was "pw_kartitem") k_roulettetype, // Used for the roulette, for deciding type (currently only used for Battle, to give you better items from Karma items) diff --git a/src/dehacked.c b/src/dehacked.c index 6a1f2661..45425c67 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7604,6 +7604,7 @@ static const char *const KARTSTUFF_LIST[] = { "OFFROAD", "POGOSPRING", "BRAKESTOP", + "WATERSKIP", "ITEMROULETTE", "ROULETTETYPE", diff --git a/src/k_kart.c b/src/k_kart.c index 422d8dd6..7d406109 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2887,6 +2887,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (G_BattleGametype() && player->kartstuff[k_bumper] > 0) player->kartstuff[k_wanted]++; + if (P_IsObjectOnGround(player->mo)) + player->kartstuff[k_waterskip] = 0; + // ??? /* if (player->kartstuff[k_jmp] > 1 && onground) diff --git a/src/p_mobj.c b/src/p_mobj.c index f4632262..e9603c43 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3375,17 +3375,30 @@ void P_MobjCheckWater(mobj_t *mobj) } // skipping stone! - if (p && (p->charability2 == CA2_SPINDASH) && p->speed/2 > abs(mobj->momz) - && ((p->pflags & (PF_SPINNING|PF_JUMPED)) == PF_SPINNING) + if (p && p->kartstuff[k_waterskip] < 2 + && ((p->speed/2 > abs(mobj->momz)) // Going more forward than horizontal, so you can skip across the water. + || (p->speed > K_GetKartSpeed(p,false)/4 && p->kartstuff[k_waterskip])) // Already skipped once, so you can skip once more! && ((!(mobj->eflags & MFE_VERTICALFLIP) && thingtop - mobj->momz > mobj->watertop) || ((mobj->eflags & MFE_VERTICALFLIP) && mobj->z - mobj->momz < mobj->waterbottom))) { + const fixed_t min = 6<momx = mobj->momx/2; + mobj->momy = mobj->momy/2; mobj->momz = -mobj->momz/2; - if (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->momz > FixedMul(6*FRACUNIT, mobj->scale)) - mobj->momz = FixedMul(6*FRACUNIT, mobj->scale); - else if (mobj->eflags & MFE_VERTICALFLIP && mobj->momz < FixedMul(-6*FRACUNIT, mobj->scale)) - mobj->momz = FixedMul(-6*FRACUNIT, mobj->scale); + if (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->momz < FixedMul(min, mobj->scale)) + mobj->momz = FixedMul(min, mobj->scale); + else if (mobj->eflags & MFE_VERTICALFLIP && mobj->momz > FixedMul(-min, mobj->scale)) + mobj->momz = FixedMul(-min, mobj->scale); + + /*if (!(mobj->eflags & MFE_VERTICALFLIP) && mobj->momz > FixedMul(max, mobj->scale)) + mobj->momz = FixedMul(max, mobj->scale); + else if (mobj->eflags & MFE_VERTICALFLIP && mobj->momz < FixedMul(-max, mobj->scale)) + mobj->momz = FixedMul(-max, mobj->scale);*/ + + p->kartstuff[k_waterskip]++; } }