Add distance based on air time

Using the respawn command gives you barely any distance, while flying off huge  MGZ pits gives you a bunch.
This commit is contained in:
Sally Coolatta 2020-05-29 10:37:34 -04:00
parent d062a35a3a
commit 0879459142
7 changed files with 30 additions and 23 deletions

View file

@ -574,6 +574,7 @@ static inline void resynch_write_player(resynch_pak *rsp, const size_t i)
rsp->kartstuff[j] = LONG(players[i].kartstuff[j]); // SRB2kart
rsp->frameangle = (angle_t)LONG(players[i].frameangle); // SRB2kart
rsp->airtime = (tic_t)LONG(players[i].airtime);
// Score is resynched in the rspfirm resync packet
rsp->health = 0; // resynched with mo health
@ -693,6 +694,7 @@ static void resynch_read_player(resynch_pak *rsp)
players[i].kartstuff[j] = LONG(rsp->kartstuff[j]); // SRB2kart
players[i].frameangle = (angle_t)LONG(rsp->frameangle); // SRB2kart
players[i].airtime = (tic_t)LONG(rsp->airtime);
// Score is resynched in the rspfirm resync packet
players[i].health = rsp->health;

View file

@ -215,6 +215,7 @@ typedef struct
INT32 kartstuff[NUMKARTSTUFF]; // SRB2kart
angle_t frameangle; // SRB2kart
tic_t airtime;
// Score is resynched in the confirm resync packet
INT32 health;

View file

@ -477,7 +477,8 @@ typedef struct player_s
INT16 rturn_max[MAXPREDICTTICS]; // Ditto but for full-right
UINT32 distancetofinish;
waypoint_t *nextwaypoint;
respawnvars_t respawnvars; // SRB2Kart: respawn info
respawnvars_t respawnvars; // Respawn info
tic_t airtime; // Keep track of how long you've been in the air
// Bit flags.
// See pflags_t, above.

View file

@ -110,8 +110,9 @@ void K_DoIngameRespawn(player_t *player)
// Set up respawn position if invalid
if (player->respawnvars.wp != NULL)
{
const UINT32 dist = RESPAWN_DIST + (player->airtime * 32);
player->respawnvars.distanceleft = (dist * mapobjectscale) / FRACUNIT;
K_RespawnAtWaypoint(player, player->respawnvars.wp);
player->respawnvars.distanceleft = (RESPAWN_DIST * mapobjectscale) / FRACUNIT;
}
else
{

View file

@ -216,6 +216,8 @@ static int player_get(lua_State *L)
LUA_PushUserdata(L, plr->kartstuff, META_KARTSTUFF);
else if (fastcmp(field,"frameangle"))
lua_pushangle(L, plr->frameangle);
else if (fastcmp(field,"airtime"))
lua_pushinteger(L, plr->airtime);
else if (fastcmp(field,"pflags"))
lua_pushinteger(L, plr->pflags);
else if (fastcmp(field,"panim"))
@ -473,6 +475,8 @@ static int player_set(lua_State *L)
return NOSET;
else if (fastcmp(field,"frameangle"))
plr->frameangle = luaL_checkangle(L, 3);
else if (fastcmp(field,"airtime"))
plr->airtime = (tic_t)luaL_checkinteger(L, 3);
else if (fastcmp(field,"kartspeed"))
plr->kartspeed = (UINT8)luaL_checkinteger(L, 3);
else if (fastcmp(field,"kartweight"))

View file

@ -278,6 +278,7 @@ static void P_NetArchivePlayers(void)
WRITEUINT32(save_p, players[i].distancetofinish);
WRITEUINT32(save_p, K_GetWaypointHeapIndex(players[i].nextwaypoint));
WRITEUINT32(save_p, players[i].airtime);
}
}
@ -443,6 +444,7 @@ static void P_NetUnArchivePlayers(void)
players[i].distancetofinish = READUINT32(save_p);
players[i].nextwaypoint = (waypoint_t *)(size_t)READUINT32(save_p);
players[i].airtime = READUINT32(save_p);
}
}

View file

@ -8361,16 +8361,6 @@ void P_PlayerThink(player_t *player)
player->awayviewtics = 0; // reset to zero
}
/*
if (player->pflags & PF_GLIDING)
{
if (player->panim != PA_ABILITY)
P_SetPlayerMobjState(player->mo, S_PLAY_ABL1);
}
else if ((player->pflags & PF_JUMPED) && !player->powers[pw_super] && player->panim != PA_ROLL && player->charability2 == CA2_SPINDASH)
P_SetPlayerMobjState(player->mo, S_PLAY_ATK1);
*/
if (player->flashcount)
player->flashcount--;
@ -8383,21 +8373,33 @@ void P_PlayerThink(player_t *player)
// The timer might've reached zero, but we'll run the remote view camera anyway by setting it to -1.
}
// Track airtime
if (P_IsObjectOnGround(player->mo))
{
player->airtime = 0;
}
else
{
player->airtime++;
}
cmd = &player->cmd;
// SRB2kart
// Save the dir the player is holding
// to allow items to be thrown forward or backward.
if (cmd->buttons & BT_FORWARD)
{
player->kartstuff[k_throwdir] = 1;
}
else if (cmd->buttons & BT_BACKWARD)
{
player->kartstuff[k_throwdir] = -1;
}
else
{
player->kartstuff[k_throwdir] = 0;
// Add some extra randomization.
if (cmd->forwardmove)
P_RandomFixed();
}
#ifdef PARANOIA
if (player->playerstate == PST_REBORN)
@ -8531,15 +8533,9 @@ void P_PlayerThink(player_t *player)
// SRB2kart 010217
if (leveltime < starttime)
player->powers[pw_nocontrol] = 2;
/*
if ((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE)
{
cmd->buttons &= BT_BRAKE; // Remove all buttons except BT_BRAKE
cmd->forwardmove = 0;
cmd->sidemove = 0;
player->powers[pw_nocontrol] = 2;
}
*/
// Synchronizes the "real" amount of time spent in the level.
if (!player->exiting)