From fe4d9ce8895da6242d02b148778c76efc84d82a5 Mon Sep 17 00:00:00 2001 From: Latapostrophe Date: Wed, 6 Jan 2021 21:20:28 +0100 Subject: [PATCH] New trick panel shit (but only the gameplay part) --- src/d_clisrv.c | 20 +++++--- src/d_clisrv.h | 5 +- src/d_player.h | 14 ++++-- src/k_kart.c | 116 ++++++++++++++++++++++++++++++++------------ src/lua_playerlib.c | 12 +++++ src/p_inter.c | 2 +- src/p_map.c | 4 +- src/p_mobj.c | 6 +-- src/p_saveg.c | 14 ++++-- src/p_spec.c | 2 +- 10 files changed, 142 insertions(+), 53 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 610152d90..3c4c087df 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -617,7 +617,10 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i) rsp->airtime = (tic_t)LONG(players[i].airtime); rsp->trickpanel = (UINT8)players[i].trickpanel; - rsp->trickdelay = (tic_t)LONG(players[i].trickdelay); + rsp->trickdelay = (boolean)players[i].trickdelay; + rsp->trickmomx = (fixed_t)LONG(players[i].trickmomx); + rsp->trickmomy = (fixed_t)LONG(players[i].trickmomy); + rsp->trickmomz = (fixed_t)LONG(players[i].trickmomz); rsp->bumpers = players[i].bumpers; rsp->karmadelay = SHORT(players[i].karmadelay); @@ -767,7 +770,10 @@ static void resynch_read_player(resynch_pak *rsp) players[i].airtime = (tic_t)LONG(rsp->airtime); players[i].trickpanel = (UINT8)rsp->trickpanel; - players[i].trickdelay = (tic_t)LONG(rsp->trickdelay); + players[i].trickdelay = (boolean)rsp->trickdelay; + players[i].trickmomx = (fixed_t)LONG(rsp->trickmomx); + players[i].trickmomy = (fixed_t)LONG(rsp->trickmomy); + players[i].trickmomz = (fixed_t)LONG(rsp->trickmomz); players[i].bumpers = rsp->bumpers; players[i].karmadelay = SHORT(rsp->karmadelay); @@ -1260,7 +1266,7 @@ static inline void CL_DrawConnectionStatus(void) cltext = M_GetText("Server full, waiting for a slot..."); else cltext = M_GetText("Requesting to join..."); - + break; #ifdef HAVE_CURL case CL_PREPAREHTTPFILES: @@ -2129,7 +2135,7 @@ void CL_UpdateServerList (void) static void M_ConfirmConnect(event_t *ev) { -#ifndef NONET +#ifndef NONET if (ev->type == ev_keydown) { if (ev->data1 == ' ' || ev->data1 == 'y' || ev->data1 == KEY_ENTER || ev->data1 == gamecontrol[0][gc_accelerate][0] || ev->data1 == gamecontrol[0][gc_accelerate][1]) @@ -2152,7 +2158,7 @@ static void M_ConfirmConnect(event_t *ev) } else cl_mode = CL_LOADFILES; - + M_ClearMenus(true); } else if (ev->data1 == 'n' || ev->data1 == KEY_ESCAPE|| ev->data1 == gamecontrol[0][gc_brake][0] || ev->data1 == gamecontrol[0][gc_brake][1]) @@ -2400,7 +2406,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic { boolean waitmore; INT32 i; - + #ifdef NONET (void)tmpsave; #endif @@ -2437,7 +2443,7 @@ static boolean CL_ServerConnectionTicker(const char *tmpsave, tic_t *oldtic, tic { curl_transfers++; } - + cl_mode = CL_DOWNLOADHTTPFILES; } break; diff --git a/src/d_clisrv.h b/src/d_clisrv.h index 365059c3d..ae9e59e7a 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -282,7 +282,10 @@ typedef struct INT32 kartstuff[NUMKARTSTUFF]; tic_t airtime; UINT8 trickpanel; - tic_t trickdelay; + boolean trickdelay; + fixed_t trickmomx; + fixed_t trickmomy; + fixed_t trickmomz; UINT8 bumpers; INT16 karmadelay; diff --git a/src/d_player.h b/src/d_player.h index 07eecc54d..89679e9f1 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -449,6 +449,10 @@ typedef enum // QUICKLY GET RING TOTAL, INCLUDING RINGS CURRENTLY IN THE PICKUP ANIMATION #define RINGTOTAL(p) (p->rings + p->kartstuff[k_pickuprings]) +// CONSTANTS FOR TRICK PANELS +#define TRICKMOMZRAMP (30) +#define TRICKLAG (9) + //} // player_t struct for all respawn variables @@ -523,9 +527,13 @@ typedef struct player_s UINT32 distancetofinish; waypoint_t *nextwaypoint; respawnvars_t respawn; // Respawn info - tic_t airtime; // Keep track of how long you've been in the air - UINT8 trickpanel; // Trick panel state - tic_t trickdelay; + tic_t airtime; // Keep track of how long you've been in the air + + UINT8 trickpanel; // Trick panel state + boolean trickdelay; // Prevent tricks until control stick is neutral + fixed_t trickmomx; + fixed_t trickmomy; + fixed_t trickmomz; // Instead of stupid auxiliary variables let's... just make some ourselves. UINT8 bumpers; INT16 karmadelay; diff --git a/src/k_kart.c b/src/k_kart.c index a94dce177..6a05c50d5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2052,7 +2052,7 @@ INT16 K_GetSpindashChargeTime(player_t *player) { // more charge time for higher speed // Tails = 2s, Mighty = 3s, Fang = 4s, Metal = 4s - return (player->kartspeed + 4) * (TICRATE/3); + return (player->kartspeed + 4) * (TICRATE/3); } fixed_t K_GetSpindashChargeSpeed(player_t *player) @@ -4209,6 +4209,8 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) { thrust = FixedMul(thrust, 9*FRACUNIT/8); } + + mo->player->trickmomx = mo->player->trickmomy = mo->player->trickmomz = 0; // Reset post-hitlag momentums. } mo->momz = FixedMul(thrust, vscale); @@ -7830,7 +7832,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_PlayBoostTaunt(player->mo); K_DoPogoSpring(player->mo, 32<trickpanel = 1; - player->trickdelay = TICRATE/2; + player->trickdelay = 1; player->kartstuff[k_itemamount]--; } break; @@ -7944,49 +7946,101 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->mo->drawflags &= ~(MFD_TRANSMASK|MFD_BRIGHTMASK); } - if (player->trickpanel == 1 && player->trickdelay <= 0) + if (player->trickpanel == 1) { const angle_t lr = ANGLE_45; - fixed_t speed = P_AproxDistance(player->mo->momx, player->mo->momy); + fixed_t momz = FixedDiv(player->mo->momz, mapobjectscale); // bring momz back to scale... + fixed_t speedmult = max(0, FRACUNIT - abs(momz)/TRICKMOMZRAMP); // TRICKMOMZRAMP momz is minimum speed (Should be 20) + fixed_t basespeed = P_AproxDistance(player->mo->momx, player->mo->momy); // at WORSE, keep your normal speed when tricking. + fixed_t speed = FixedMul(speedmult, P_AproxDistance(player->mo->momx, player->mo->momy)); - if (cmd->turning > 0) + // debug shit + //CONS_Printf("%d\n", player->mo->momz / mapobjectscale); + + if (player->trickdelay <= 0) { - P_InstaThrust(player->mo, player->mo->angle + lr, speed*2); - player->trickpanel = 2; - } - else if (cmd->turning < 0) - { - P_InstaThrust(player->mo, player->mo->angle - lr, speed*2); - player->trickpanel = 3; - } - else if (player->kartstuff[k_throwdir] == 1) - { - if (player->mo->momz * P_MobjFlip(player->mo) > 0) + + if (cmd->turning > 0) { + P_InstaThrust(player->mo, player->mo->angle + lr, max(basespeed, speed*2)); + + player->trickmomx = player->mo->momx; + player->trickmomy = player->mo->momy; + player->trickmomz = player->mo->momz; + P_InstaThrust(player->mo, 0, 0); // Sike, you have no speed :) player->mo->momz = 0; + + player->trickpanel = 2; + player->mo->hitlag = TRICKLAG; } - - P_InstaThrust(player->mo, player->mo->angle, speed*3); - player->trickpanel = 2; - } - else if (player->kartstuff[k_throwdir] == -1) - { - boolean relative = true; - - player->mo->momx /= 3; - player->mo->momy /= 3; - - if (player->mo->momz * P_MobjFlip(player->mo) <= 0) + else if (cmd->turning < 0) { - relative = false; + P_InstaThrust(player->mo, player->mo->angle - lr, max(basespeed, speed*2)); + + player->trickmomx = player->mo->momx; + player->trickmomy = player->mo->momy; + player->trickmomz = player->mo->momz; + P_InstaThrust(player->mo, 0, 0); // Sike, you have no speed :) + player->mo->momz = 0; + + player->trickpanel = 3; + player->mo->hitlag = TRICKLAG; } + else if (player->kartstuff[k_throwdir] == 1) + { + if (player->mo->momz * P_MobjFlip(player->mo) > 0) + { + player->mo->momz = 0; + } - P_SetObjectMomZ(player->mo, 48*FRACUNIT, relative); + P_InstaThrust(player->mo, player->mo->angle, max(basespeed, speed*3)); - player->trickpanel = 3; + player->trickmomx = player->mo->momx; + player->trickmomy = player->mo->momy; + player->trickmomz = player->mo->momz; + P_InstaThrust(player->mo, 0, 0); // Sike, you have no speed :) + player->mo->momz = 0; + + player->trickpanel = 2; + player->mo->hitlag = TRICKLAG; + } + else if (player->kartstuff[k_throwdir] == -1) + { + boolean relative = true; + + player->mo->momx /= 3; + player->mo->momy /= 3; + + if (player->mo->momz * P_MobjFlip(player->mo) <= 0) + { + relative = false; + } + + P_SetObjectMomZ(player->mo, 48*FRACUNIT, relative); + + player->trickmomx = player->mo->momx; + player->trickmomy = player->mo->momy; + player->trickmomz = player->mo->momz; + P_InstaThrust(player->mo, 0, 0); // Sike, you have no speed :) + player->mo->momz = 0; + + player->trickpanel = 3; + player->mo->hitlag = TRICKLAG; + } } } + // After hitlag, we will get here and will be able to apply the desired momentums! + else if (player->trickmomx || player->trickmomy || player->trickmomz) + { + player->mo->momx = player->trickmomx; + player->mo->momy = player->trickmomy; + player->mo->momz = player->trickmomz; + player->trickmomx = player->trickmomy = player->trickmomz = 0; + + } + + // Wait until we let go off the control stick to remove the delay if (player->trickdelay > 0) { player->trickdelay--; diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index f28987700..daf1666c8 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -218,6 +218,12 @@ static int player_get(lua_State *L) lua_pushinteger(L, plr->trickpanel); else if (fastcmp(field,"trickdelay")) lua_pushinteger(L, plr->trickdelay); + else if (fastcmp(field,"trickmomx")) + lua_pushfixed(L, plr->trickmomx); + else if (fastcmp(field,"trickmomy")) + lua_pushfixed(L, plr->trickmomy); + else if (fastcmp(field,"trickmomz")) + lua_pushfixed(L, plr->trickmomz); else if (fastcmp(field,"pflags")) lua_pushinteger(L, plr->pflags); else if (fastcmp(field,"panim")) @@ -511,6 +517,12 @@ static int player_set(lua_State *L) plr->trickpanel = luaL_checkinteger(L, 3); else if (fastcmp(field,"trickdelay")) plr->trickdelay = (tic_t)luaL_checkinteger(L, 3); + else if (fastcmp(field,"trickmomx")) + plr->trickmomx = (fixed_t)luaL_checkfixed(L, 3); + else if (fastcmp(field,"trickmomy")) + plr->trickmomy = (fixed_t)luaL_checkfixed(L, 3); + else if (fastcmp(field,"trickmomz")) + plr->trickmomz = (fixed_t)luaL_checkfixed(L, 3); else if (fastcmp(field,"kartspeed")) plr->kartspeed = (UINT8)luaL_checkinteger(L, 3); else if (fastcmp(field,"kartweight")) diff --git a/src/p_inter.c b/src/p_inter.c index 7aa25c25d..4a798d4d0 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -30,7 +30,7 @@ #include "f_finale.h" // SRB2kart -#include "k_kart.h" +#include "k_kart.h" #include "k_battle.h" #include "k_pwrlv.h" #include "k_grandprix.h" diff --git a/src/p_map.c b/src/p_map.c index 2309ac260..31df0e09b 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -449,7 +449,7 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object) if (object->player) { object->player->trickpanel = 1; - object->player->trickdelay = TICRATE/2; + object->player->trickdelay = 1; } K_DoPogoSpring(object, 32<color = K_RainbowColor( (SKINCOLOR_PURPLE - SKINCOLOR_PINK) // Smoothly transition into the other state + ((mobj->fuse - 32) * 2) // Make the color flashing slow down while it runs out - ); + ); switch (mobj->extravalue1) { @@ -10243,7 +10243,7 @@ void P_SpawnPlayer(INT32 playernum) /* if (bonusgame || specialstage) { - // Bots should avoid + // Bots should avoid p->spectator = true; } */ @@ -10357,7 +10357,7 @@ void P_SpawnPlayer(INT32 playernum) if ((leveltime < starttime) || (pcount <= 1)) // Start of the map? { // Reset those bumpers! - p->bumpers = K_StartingBumperCount(); + p->bumpers = K_StartingBumperCount(); } if (p->bumpers) diff --git a/src/p_saveg.c b/src/p_saveg.c index e32b69735..4e6e31d88 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -235,7 +235,7 @@ static void P_NetArchivePlayers(void) if (flags & FOLLOWITEM) WRITEUINT32(save_p, players[i].followmobj->mobjnum); - + WRITEUINT32(save_p, (UINT32)players[i].followitem); WRITEUINT32(save_p, players[i].charflags); @@ -257,7 +257,10 @@ static void P_NetArchivePlayers(void) WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].nextwaypoint)); WRITEUINT32(save_p, players[i].airtime); WRITEUINT8(save_p, players[i].trickpanel); - WRITEUINT32(save_p, players[i].trickdelay); + WRITEUINT8(save_p, players[i].trickdelay); + WRITEUINT32(save_p, players[i].trickmomx); + WRITEUINT32(save_p, players[i].trickmomy); + WRITEUINT32(save_p, players[i].trickmomz); WRITEUINT8(save_p, players[i].bumpers); WRITEINT16(save_p, players[i].karmadelay); @@ -426,7 +429,7 @@ static void P_NetUnArchivePlayers(void) if (flags & FOLLOWITEM) players[i].followmobj = (mobj_t *)(size_t)READUINT32(save_p); - + players[i].followitem = (mobjtype_t)READUINT32(save_p); //SetPlayerSkinByNum(i, players[i].skin); @@ -449,7 +452,10 @@ static void P_NetUnArchivePlayers(void) players[i].nextwaypoint = (waypoint_t *)(size_t)READUINT32(save_p); players[i].airtime = READUINT32(save_p); players[i].trickpanel = READUINT8(save_p); - players[i].trickdelay = READUINT32(save_p); + players[i].trickdelay = READUINT8(save_p); + players[i].trickmomx = READUINT32(save_p); + players[i].trickmomy = READUINT32(save_p); + players[i].trickmomz = READUINT32(save_p); players[i].bumpers = READUINT8(save_p); players[i].karmadelay = READINT16(save_p); diff --git a/src/p_spec.c b/src/p_spec.c index ce7ffd841..62dffaf67 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4618,7 +4618,7 @@ DoneSection2: } player->trickpanel = 1; - player->trickdelay = TICRATE/2; + player->trickdelay = 1; K_DoPogoSpring(player->mo, upwards, 1); // Reduce speed