From 101a560d4eeb4198e4c187a511464fad31d53913 Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Wed, 25 Oct 2017 01:58:25 +0100 Subject: [PATCH 1/5] Adjust Trailing items to behave nicer Added extra boolean for P_SlideMove forceslide, since kart's walls are almost all bouncy slidemove will almost always bounce things instead, even if we don't want it to. --- src/lua_baselib.c | 3 ++- src/p_local.h | 2 +- src/p_map.c | 5 +++-- src/p_mobj.c | 21 ++++++++++----------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/lua_baselib.c b/src/lua_baselib.c index e8e8fd02..aa2ebf65 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -1009,10 +1009,11 @@ static int lib_pTeleportMove(lua_State *L) static int lib_pSlideMove(lua_State *L) { mobj_t *mo = *((mobj_t **)luaL_checkudata(L, 1, META_MOBJ)); + boolean forceslide = luaL_checkboolean(L, 2); NOHUD if (!mo) return LUA_ErrInvalid(L, "mobj_t"); - P_SlideMove(mo); + P_SlideMove(mo, forceslide); return 0; } diff --git a/src/p_local.h b/src/p_local.h index c86256ae..7533429a 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -326,7 +326,7 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam); boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff); boolean P_Move(mobj_t *actor, fixed_t speed); boolean P_TeleportMove(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z); -void P_SlideMove(mobj_t *mo); +void P_SlideMove(mobj_t *mo, boolean forceslide); void P_BounceMove(mobj_t *mo); boolean P_CheckSight(mobj_t *t1, mobj_t *t2); void P_CheckHoopPosition(mobj_t *hoopthing, fixed_t x, fixed_t y, fixed_t z, fixed_t radius); diff --git a/src/p_map.c b/src/p_map.c index bf7ad90d..547444ec 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3521,8 +3521,9 @@ stairstep: // and slide along it // // This is a kludgy mess. +// Kart 2017-10-25: add forceslide to hav the option to force something to slide instead of bounce // -void P_SlideMove(mobj_t *mo) +void P_SlideMove(mobj_t *mo, boolean forceslide) { fixed_t leadx, leady, trailx, traily, newx, newy; INT16 hitcount = 0; @@ -3600,7 +3601,7 @@ retry: PT_ADDLINES, PTR_SlideTraverse); // Some walls are bouncy even if you're not - if (bestslideline && !(bestslideline->flags & ML_BOUNCY)) // SRB2kart - All walls are bouncy unless specified otherwise + if (!forceslide && bestslideline && !(bestslideline->flags & ML_BOUNCY)) // SRB2kart - All walls are bouncy unless specified otherwise { P_BounceMove(mo); return; diff --git a/src/p_mobj.c b/src/p_mobj.c index 5e2c25f3..ccce7bf9 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1809,7 +1809,7 @@ void P_XYMovement(mobj_t *mo) } else if (player || mo->flags & (MF_SLIDEME|MF_PUSHABLE)) { // try to slide along it - P_SlideMove(mo); + P_SlideMove(mo, false); xmove = ymove = 0; } else if (mo->type == MT_SPINFIRE) @@ -1990,7 +1990,7 @@ static void P_RingXYMovement(mobj_t *mo) I_Assert(!P_MobjWasRemoved(mo)); if (!P_SceneryTryMove(mo, mo->x + mo->momx, mo->y + mo->momy)) - P_SlideMove(mo); + P_SlideMove(mo, false); } static void P_SceneryXYMovement(mobj_t *mo) @@ -2004,7 +2004,7 @@ static void P_SceneryXYMovement(mobj_t *mo) oldy = mo->y; if (!P_SceneryTryMove(mo, mo->x + mo->momx, mo->y + mo->momy)) - P_SlideMove(mo); + P_SlideMove(mo, false); if ((!(mo->eflags & MFE_VERTICALFLIP) && mo->z > mo->floorz) || (mo->eflags & MFE_VERTICALFLIP && mo->z+mo->height < mo->ceilingz)) return; // no friction when airborne @@ -6622,14 +6622,13 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player) mobj->scale = mobj->target->scale; - P_UnsetThingPosition(mobj); - { - const angle_t fa = mobj->angle>>ANGLETOFINESHIFT; - mobj->x = mobj->target->x + FixedMul(FINECOSINE(fa),radius); - mobj->y = mobj->target->y + FixedMul(FINESINE(fa), radius); - mobj->z = mobj->target->z + HEIGHT; - P_SetThingPosition(mobj); - } + P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); + mobj->momx = FixedMul(FINECOSINE(mobj->angle>>ANGLETOFINESHIFT),radius); + mobj->momy = FixedMul(FINESINE(mobj->angle>>ANGLETOFINESHIFT), radius); + if (!P_TryMove(mobj, mobj->target->x + mobj->momx, mobj->target->y + mobj->momy, false)) + P_SlideMove(mobj, true); + mobj->z = mobj->floorz; + mobj->momx = mobj->momy = 0; // Was this so hard? if ((mobj->type == MT_GREENSHIELD && !(mobj->target->player->kartstuff[k_greenshell] & 1)) From b9f6a91c37cb119535cf527caad79d5ec160da8f Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Wed, 25 Oct 2017 03:37:13 +0100 Subject: [PATCH 2/5] Improve functionality of held items Can check for falloff from ledges place along the z properly --- src/p_mobj.c | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index ccce7bf9..d36713e8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6587,7 +6587,7 @@ void P_MobjThinker(mobj_t *mobj) { INT32 zfixds = 56; INT32 DIST = FixedMul(zfixds, mobj->target->scale); - INT32 HEIGHT; + fixed_t z; const fixed_t radius = DIST*FRACUNIT; // mobj's distance from its Target, or Radius. if (mobj->type == MT_BANANASHIELD || mobj->type == MT_TRIPLEBANANASHIELD1 || mobj->type == MT_TRIPLEBANANASHIELD2 || mobj->type == MT_TRIPLEBANANASHIELD3) @@ -6610,24 +6610,48 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player && mobj->target->eflags & MFE_VERTICALFLIP) { mobj->eflags |= MFE_VERTICALFLIP; - HEIGHT = mobj->target->height / 2; } else { mobj->eflags &= ~MFE_VERTICALFLIP; - HEIGHT = mobj->target->height / 5; } // Shrink your items if the player shrunk too. if (mobj->target->player) mobj->scale = mobj->target->scale; - P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); + if (P_MobjFlip(mobj) > 0) + { + z = mobj->target->z; + } + else + { + z = mobj->target->z + mobj->target->height - mobj->height; + } + + P_TeleportMove(mobj, mobj->target->x, mobj->target->y, z); mobj->momx = FixedMul(FINECOSINE(mobj->angle>>ANGLETOFINESHIFT),radius); mobj->momy = FixedMul(FINESINE(mobj->angle>>ANGLETOFINESHIFT), radius); - if (!P_TryMove(mobj, mobj->target->x + mobj->momx, mobj->target->y + mobj->momy, false)) + if (!P_TryMove(mobj, mobj->target->x + mobj->momx, mobj->target->y + mobj->momy, true)) P_SlideMove(mobj, true); - mobj->z = mobj->floorz; + if (P_IsObjectOnGround(mobj->target)) + { + if (P_MobjFlip(mobj) > 0) + { + if (mobj->floorz > mobj->target->z - mobj->height) + { + z = mobj->floorz; + } + } + else + { + if (mobj->ceilingz < mobj->target->z + mobj->target->height + mobj->height) + { + z = mobj->ceilingz - mobj->height; + } + } + } + mobj->z = z; mobj->momx = mobj->momy = 0; // Was this so hard? From a00123e6637a1603ce7a7747fd8cfe35b460413b Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Wed, 25 Oct 2017 14:56:06 +0100 Subject: [PATCH 3/5] Item Throw distance/height experimentation --- src/k_kart.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4f294b8a..be4049c7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1920,13 +1920,13 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map switch (cv_kartcc.value) { case 50: - PROJSPEED = 85*FRACUNIT; // Avg Speed is 34 + PROJSPEED = 40*FRACUNIT; // Avg Speed is 34 break; case 150: - PROJSPEED = 120*FRACUNIT; // Avg Speed is 48 + PROJSPEED = 60*FRACUNIT; // Avg Speed is 48 break; default: - PROJSPEED = 102*FRACUNIT+FRACUNIT/2; // Avg Speed is 41 + PROJSPEED = 50*FRACUNIT; // Avg Speed is 41 break; } @@ -2029,7 +2029,7 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map if (dir == 1 || dir == 2) { // Shoot forward - mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + 80*FRACUNIT, mapthing); + mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, mapthing); mo->threshold = 10; @@ -2043,22 +2043,19 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map INT32 HEIGHT; if (dir == 2) - HEIGHT = 16*FRACUNIT + player->mo->momz; + HEIGHT = 30*FRACUNIT + player->mo->momz; else - HEIGHT = 8*FRACUNIT + player->mo->momz; + HEIGHT = 20*FRACUNIT + player->mo->momz; - if (HEIGHT > 64*FRACUNIT) - HEIGHT = 64*FRACUNIT; - - mo->momx = FixedMul(FINECOSINE(fa), PROJSPEED); - mo->momy = FixedMul(FINESINE(fa), PROJSPEED); + mo->momx = player->mo->momx + FixedMul(FINECOSINE(fa), PROJSPEED); + mo->momy = player->mo->momy + FixedMul(FINESINE(fa), PROJSPEED); mo->momz = HEIGHT; if (player->mo->eflags & MFE_VERTICALFLIP) mo->eflags |= MFE_VERTICALFLIP; } - mobj_t *throwmo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + 80*FRACUNIT, MT_FIREDITEM); + mobj_t *throwmo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_FIREDITEM); P_SetTarget(&throwmo->target, player->mo); throwmo->movecount = 0; // above player } From 48e0d64525d2642fd664478aa79c15f3a88fbd7a Mon Sep 17 00:00:00 2001 From: Sryder13 Date: Sat, 28 Oct 2017 02:44:25 +0100 Subject: [PATCH 4/5] More changes to thrown items, higher gravity and fly faster --- src/k_kart.c | 10 +++++----- src/p_mobj.c | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9bb5b392..9f2a422a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1927,13 +1927,13 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map switch (cv_kartcc.value) { case 50: - PROJSPEED = 40*FRACUNIT; // Avg Speed is 34 + PROJSPEED = 68*FRACUNIT; // Avg Speed is 34 break; case 150: - PROJSPEED = 60*FRACUNIT; // Avg Speed is 48 + PROJSPEED = 96*FRACUNIT; // Avg Speed is 48 break; default: - PROJSPEED = 50*FRACUNIT; // Avg Speed is 41 + PROJSPEED = 82*FRACUNIT; // Avg Speed is 41 break; } @@ -2050,9 +2050,9 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map INT32 HEIGHT; if (dir == 2) - HEIGHT = 30*FRACUNIT + player->mo->momz; + HEIGHT = 40*FRACUNIT + player->mo->momz; else - HEIGHT = 20*FRACUNIT + player->mo->momz; + HEIGHT = 30*FRACUNIT + player->mo->momz; mo->momx = player->mo->momx + FixedMul(FINECOSINE(fa), PROJSPEED); mo->momy = player->mo->momy + FixedMul(FINESINE(fa), PROJSPEED); diff --git a/src/p_mobj.c b/src/p_mobj.c index d36713e8..e00f0b23 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1378,6 +1378,10 @@ fixed_t P_GetMobjGravity(mobj_t *mo) break; case MT_WATERDROP: gravityadd >>= 1; + case MT_BANANAITEM: + case MT_FAKEITEM: + case MT_BOMBITEM: + gravityadd = FixedMul(gravityadd, 5*FRACUNIT/2); default: break; } From b4a1ad4ef22f2a972c133cadfd4afe7e61df9489 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 31 Oct 2017 16:13:25 -0400 Subject: [PATCH 5/5] Just bumped timer --- src/d_player.h | 1 + src/k_kart.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 12061c36..c4390f9e 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -275,6 +275,7 @@ typedef enum k_startimer, // Invincibility timer k_spinouttimer, // Wipe-out from a banana peel or oil slick (was "pw_bananacam") k_laserwisptimer, // The duration and relative angle of the laser + k_justbumped, // Prevent players from endlessly bumping into each other // Each item needs its own power slot, for the HUD and held use k_magnet, // 0x1 = Magnet in inventory diff --git a/src/k_kart.c b/src/k_kart.c index 9f2a422a..fc605368 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1140,7 +1140,8 @@ void K_KartBouncer(void) && !players[i].kartstuff[k_squishedtimer] && !players[i].kartstuff[k_bootaketimer] && !players[i].kartstuff[k_spinouttimer] - && !players[i].kartstuff[k_startimer]) + && !players[i].kartstuff[k_startimer] + && !players[i].kartstuff[k_justbumped]) { for (j = i+1; j < MAXPLAYERS; j++) if (playeringame[j] && players[j].mo && !P_MobjWasRemoved(players[j].mo) @@ -1148,7 +1149,8 @@ void K_KartBouncer(void) && !players[j].kartstuff[k_growshrinktimer] && !players[j].kartstuff[k_bootaketimer] && !players[j].kartstuff[k_spinouttimer] - && !players[j].kartstuff[k_startimer]) + && !players[j].kartstuff[k_startimer] + && !players[j].kartstuff[k_justbumped]) { if (players[j].mo == players[i].mo) break; @@ -1163,7 +1165,9 @@ void K_KartBouncer(void) else K_SwapMomentum(players[i].mo, players[j].mo, false); players[i].collide[j] = true; + players[i].kartstuff[k_justbumped] = 6; // let the animation finish before letting you bump again :V players[j].collide[i] = true; + players[j].kartstuff[k_justbumped] = 6; } } else @@ -1387,6 +1391,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_sounds]) player->kartstuff[k_sounds]--; + if (player->kartstuff[k_justbumped]) + player->kartstuff[k_justbumped]--; + // ??? /* if (player->kartstuff[k_jmp] > 1 && onground)