start re-implementing airthrust from #158
This commit is contained in:
parent
3780d75767
commit
6a6ed9d8b3
11 changed files with 134 additions and 10 deletions
|
|
@ -163,6 +163,7 @@ static void KartSlipdash_OnChange(void);
|
|||
static void KartSlopeBoost_OnChange(void);
|
||||
static void KartDrafting_OnChange(void);
|
||||
static void KartAirDrop_OnChange(void);
|
||||
static void KartAirThrust_OnChange(void);
|
||||
static void KartItemLitter_OnChange(void);
|
||||
static void KartItemPush_OnChange(void);
|
||||
static void KartAntiBump_OnChange(void);
|
||||
|
|
@ -553,6 +554,9 @@ consvar_t cv_kartdrafting_basedistance = CVAR_INIT ("kartdrafting_basedistance",
|
|||
|
||||
consvar_t cv_kartairdrop = CVAR_INIT ("kartairdrop", "No", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_YesNo, KartAirDrop_OnChange);
|
||||
|
||||
consvar_t cv_kartairthrust = CVAR_INIT ("kartairthrust", "Off", CV_NETVAR|CV_CALL|CV_NOINIT|CV_GUARD, CV_OnOff, KartAirThrust_OnChange);
|
||||
consvar_t cv_kartairthrust_reductionrate = CVAR_INIT ("kartairthrust_reductionrate", "0.5", CV_NETVAR|CV_FLOAT, CV_Unsigned, NULL);
|
||||
|
||||
consvar_t cv_kartitemlitter = CVAR_INIT ("kartitemlitter", "On", CV_NETVAR|CV_CALL|CV_NOINIT, CV_OnOff, KartItemLitter_OnChange);
|
||||
consvar_t cv_kartitempush = CVAR_INIT ("kartitempush", "Off", CV_NETVAR|CV_CALL|CV_NOINIT, CV_OnOff, KartItemPush_OnChange);
|
||||
|
||||
|
|
@ -7661,11 +7665,44 @@ static void KartAirDrop_OnChange(void)
|
|||
if (leveltime < starttime)
|
||||
{
|
||||
airdropactive = false;
|
||||
CONS_Printf(M_GetText("Drafting has been turned \"Off\".\n"));
|
||||
CONS_Printf(M_GetText("Air Drop has been turned \"Off\".\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
CONS_Printf(M_GetText("Drafting will be turned \"Off\" next round.\n"));
|
||||
CONS_Printf(M_GetText("Air Drop will be turned \"Off\" next round.\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void KartAirThrust_OnChange(void)
|
||||
{
|
||||
if (K_CanChangeRules(false) == false)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!K_AirThrustActive() && cv_kartairthrust.value)
|
||||
{
|
||||
if (leveltime < starttime)
|
||||
{
|
||||
airthrustactive = true;
|
||||
CONS_Printf(M_GetText("Air Thrust has been turned \"On\".\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
CONS_Printf(M_GetText("Air Thrust will be turned \"On\" Next Round.\n"));
|
||||
}
|
||||
}
|
||||
else if (K_AirThrustActive() && !cv_kartairthrust.value)
|
||||
{
|
||||
if (leveltime < starttime)
|
||||
{
|
||||
airthrustactive = false;
|
||||
CONS_Printf(M_GetText("Air Thrust has been turned \"Off\".\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
CONS_Printf(M_GetText("Air Thrust will be turned \"Off\" next round.\n"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -194,6 +194,9 @@ extern consvar_t cv_kartairsquish;
|
|||
|
||||
extern consvar_t cv_kartairdrop;
|
||||
|
||||
extern consvar_t cv_kartairthrust;
|
||||
extern consvar_t cv_kartairthrust_reductionrate;
|
||||
|
||||
extern consvar_t cv_kartitemlitter, cv_kartitempush;
|
||||
|
||||
extern consvar_t cv_kartantibump;
|
||||
|
|
|
|||
|
|
@ -562,9 +562,10 @@ struct player_t
|
|||
SINT8 driftlock; // Prevents you from using drift angle for x tics. Used for zipper fix.
|
||||
fixed_t driftcharge; // Charge your drift so you can release a burst of speed
|
||||
UINT8 driftboost; // (0 to 125) - Boost you get from drifting
|
||||
tic_t driftsparkGrowTimer;
|
||||
tic_t driftelapsed; // Elapsed time spent during a drift.
|
||||
SINT8 driftlevel; // just for controller rumble for now
|
||||
fixed_t airdriftspeed; // target velocity to reduce player velocity to while air trusting
|
||||
tic_t driftsparkGrowTimer; // CLIENT ONLY -
|
||||
tic_t driftelapsed; // CLIENT ONLY - Elapsed time spent during a drift.
|
||||
SINT8 driftlevel; // CLIENT ONLY - handles controller rumble and air thrust power, cleared at the start of every tick.
|
||||
|
||||
fixed_t spinoutrot; // When a player spins out, this value increments modulus 360.
|
||||
|
||||
|
|
|
|||
|
|
@ -2346,10 +2346,12 @@ static void K_DrawServerMods(INT32 x, INT32 y)
|
|||
{"Slope Boost", 0, NULL, K_PurpleDriftActive() > 0, true},
|
||||
{"Drafting", 0, NULL, K_DraftingActive() > 0, true},
|
||||
{"Air Drop", 0, NULL, K_AirDropActive() > 0, true},
|
||||
{"Air Thrust", 0, NULL, K_AirThrustActive() > 0, true},
|
||||
{"Bump Spark", 0, &cv_kartbumpspark, -1, true},
|
||||
{"Bump Drift", 0, NULL, K_GetBumpSpark() > 0, true},
|
||||
{"Bump Spark", 0, NULL, K_GetBumpSpark() > BUMPSPARK_NOCHARGE, true},
|
||||
{"Bump Spring", 0, &cv_kartbumpspring, -1, true},
|
||||
//TODO: separate drawer that enumerates item changes?
|
||||
{"Alt. Invin.", 0, NULL, K_IsKartItemAlternate(KITEM_INVINCIBILITY), true}
|
||||
};
|
||||
|
||||
|
|
|
|||
63
src/k_kart.c
63
src/k_kart.c
|
|
@ -383,6 +383,9 @@ void K_RegisterKartStuff(void)
|
|||
|
||||
CV_RegisterVar(&cv_kartslipdash);
|
||||
|
||||
CV_RegisterVar(&cv_kartairthrust);
|
||||
CV_RegisterVar(&cv_kartairthrust_reductionrate);
|
||||
|
||||
CV_RegisterVar(&cv_kartslopeboost);
|
||||
|
||||
CV_RegisterVar(&cv_kartaltshrinktime);
|
||||
|
|
@ -8888,13 +8891,12 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
// Drift Release (Moved here so you can't "chain" drifts)
|
||||
if (player->drift != -5 && player->drift != 5)
|
||||
{
|
||||
if (driftstage && onground)
|
||||
if (driftstage && (onground || K_IsAirThrustActive()))
|
||||
{
|
||||
UINT8 boost = 0;
|
||||
|
||||
if (!cv_kartdriftsounds.value || driftstage < 3)
|
||||
S_StartSound(player->mo, sfx_s23c);
|
||||
|
||||
|
||||
switch (driftstage)
|
||||
{
|
||||
case 1:
|
||||
|
|
@ -8903,7 +8905,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
case 2:
|
||||
boost = 50;
|
||||
if (cv_kartdriftsounds.value)
|
||||
S_StartSound(player->mo, sfx_kc5b);
|
||||
S_StartSound(player->mo, sfx_kc5b);
|
||||
break;
|
||||
case 3:
|
||||
boost = 80;
|
||||
|
|
@ -8923,6 +8925,29 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
}
|
||||
break;
|
||||
}
|
||||
if (K_IsAirThrustActive() && !onground) // Air Thrust is enabled
|
||||
{
|
||||
// before thrust, set player's target speed to their speed before the air thrust
|
||||
// after the air thrust player's momentum will be reduced back to this value
|
||||
fixed_t airthrust = 0;
|
||||
|
||||
player->airdriftspeed = max(K_GetKartSpeed(player), player->speed);
|
||||
|
||||
if (driftstage == 1)
|
||||
airthrust = FRACUNIT / 6; // ~15% boost
|
||||
else if (driftstage == 2)
|
||||
airthrust = FRACUNIT / 3; // ~33% boost
|
||||
else if (driftstage == 3)
|
||||
airthrust = FRACUNIT / 2; // 50% boost
|
||||
else if (driftstage == 4)
|
||||
airthrust = 3 * FRACUNIT / 4; // 75% boost
|
||||
|
||||
// Give the player a forward boost
|
||||
P_Thrust(player->mo, K_MomentumAngle(player->mo), FixedMul(player->speed, airthrust));
|
||||
|
||||
// Slash the player's vertical momentum. Gets stronger with higher drift charge, but is significantly weaker in water
|
||||
player->mo->momz = FixedMul(player->mo->momz, FRACUNIT - FixedMul(airthrust, abs(P_GetMobjGravity(player->mo))));
|
||||
}
|
||||
|
||||
if (player->driftboost < boost)
|
||||
player->driftboost = boost;
|
||||
|
|
@ -8940,7 +8965,7 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
player->karthud[khud_afterimagetime] = 10;
|
||||
}
|
||||
|
||||
if (onground)
|
||||
if (onground || K_IsAirThrustActive())
|
||||
player->driftcharge = 0;
|
||||
}
|
||||
|
||||
|
|
@ -9099,6 +9124,23 @@ static void K_KartDrift(player_t *player, boolean onground)
|
|||
player->pflags &= ~PF_BRAKEDRIFT;
|
||||
}
|
||||
|
||||
static void K_HandleAirDriftDrag(player_t *player)
|
||||
{
|
||||
fixed_t difference;
|
||||
if (player->mo && player->airdriftspeed > 0)
|
||||
{
|
||||
if (player->speed > player->airdriftspeed)
|
||||
{
|
||||
difference = player->speed - player->airdriftspeed;
|
||||
P_Thrust(player->mo, K_MomentumAngle(player->mo), -min(difference, cv_kartairthrust_reductionrate.value));
|
||||
}
|
||||
else // we're done doing drag (TODO: also stop applying drag after being bumped or hit or sprung etc.)
|
||||
{
|
||||
player->airdriftspeed = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void K_KartSlipdash(player_t *player, boolean onground)
|
||||
{
|
||||
boolean snaked = player->slipdashdir && player->aizdriftstrat && player->slipdashdir != player->aizdriftstrat;
|
||||
|
|
@ -10722,6 +10764,17 @@ boolean K_AirDropActive(void)
|
|||
return false;
|
||||
}
|
||||
|
||||
boolean K_AirThrustActive(void)
|
||||
{
|
||||
if (airthrustactive)
|
||||
{
|
||||
// Air Thrust is enabled!
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean K_ItemLitterActive(void)
|
||||
{
|
||||
if (itemlittering)
|
||||
|
|
|
|||
|
|
@ -281,6 +281,7 @@ enum player_e
|
|||
player_drift,
|
||||
player_driftcharge,
|
||||
player_driftboost,
|
||||
player_airdriftspeed,
|
||||
player_boostcharge,
|
||||
player_slopeboost,
|
||||
player_prevslopeboost,
|
||||
|
|
@ -497,6 +498,7 @@ static const char *const player_opt[] = {
|
|||
"drift",
|
||||
"driftcharge",
|
||||
"driftboost",
|
||||
"airdriftspeed",
|
||||
"boostcharge",
|
||||
"slopeboost",
|
||||
"prevslopeboost",
|
||||
|
|
@ -839,6 +841,9 @@ static int player_get(lua_State *L)
|
|||
case player_driftboost:
|
||||
lua_pushinteger(L, plr->driftboost);
|
||||
break;
|
||||
case player_airdriftspeed:
|
||||
lua_pushinteger(L, plr->airdriftspeed);
|
||||
break;
|
||||
case player_boostcharge:
|
||||
lua_pushinteger(L, plr->boostcharge);
|
||||
break;
|
||||
|
|
@ -1589,6 +1594,9 @@ static int player_set(lua_State *L)
|
|||
case player_driftboost:
|
||||
plr->driftboost = luaL_checkinteger(L, 3);
|
||||
break;
|
||||
case player_airdriftspeed:
|
||||
plr->airdriftspeed = luaL_checkinteger(L, 3);
|
||||
break;
|
||||
case player_boostcharge:
|
||||
plr->boostcharge = luaL_checkinteger(L, 3);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -2321,6 +2321,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da
|
|||
}
|
||||
|
||||
player->driftboost = 0;
|
||||
player->airdriftspeed = 0;
|
||||
player->ringboost = 0;
|
||||
player->glanceDir = 0;
|
||||
player->pflags &= ~PF_GAINAX;
|
||||
|
|
|
|||
12
src/p_map.c
12
src/p_map.c
|
|
@ -286,6 +286,9 @@ P_DoSpringEx
|
|||
finalSpeed = pSpeed;
|
||||
|
||||
P_InstaThrust(object, finalAngle, FixedMul(finalSpeed,FixedSqrt(FixedMul(hscale, scaleVal))));
|
||||
|
||||
// clear air thrust target speed too
|
||||
object->player->airdriftspeed = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -399,6 +402,9 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// clear air thrust target speed too
|
||||
object->player->airdriftspeed = 0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -467,6 +473,12 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object)
|
|||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (object->player)
|
||||
{
|
||||
// clear air thrust target speed too
|
||||
object->player->airdriftspeed = 0;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
|
|
|
|||
|
|
@ -611,6 +611,7 @@ extern boolean purpledriftactive;
|
|||
extern boolean slopeboostactive;
|
||||
extern boolean draftingactive;
|
||||
extern boolean airdropactive;
|
||||
extern boolean airthrustactive;
|
||||
extern boolean itemlittering;
|
||||
extern boolean itempushing;
|
||||
extern UINT8 bumpsparkactive;
|
||||
|
|
|
|||
|
|
@ -590,6 +590,7 @@ static void P_NetSyncPlayers(savebuffer_t *save)
|
|||
SYNC(players[i].driftlock);
|
||||
SYNC(players[i].driftcharge);
|
||||
SYNC(players[i].driftboost);
|
||||
SYNC(players[i].airdriftspeed);
|
||||
|
||||
SYNC(players[i].aizdriftstrat);
|
||||
SYNC(players[i].aizdrifttilt);
|
||||
|
|
|
|||
|
|
@ -161,6 +161,7 @@ boolean purpledriftactive;
|
|||
boolean slopeboostactive;
|
||||
boolean draftingactive;
|
||||
boolean airdropactive;
|
||||
boolean airthrustactive;
|
||||
boolean itemlittering;
|
||||
boolean itempushing;
|
||||
UINT8 bumpsparkactive;
|
||||
|
|
@ -8169,6 +8170,7 @@ static void P_InitLevelSettings(boolean reloadinggamestate)
|
|||
slopeboostactive = false;
|
||||
draftingactive = false;
|
||||
airdropactive = false;
|
||||
airthrustactive = false;
|
||||
itemlittering = false;
|
||||
itempushing = false;
|
||||
bumpsparkactive = 0;
|
||||
|
|
@ -8198,6 +8200,9 @@ static void P_InitLevelSettings(boolean reloadinggamestate)
|
|||
if (cv_kartairdrop.value)
|
||||
airdropactive = true;
|
||||
|
||||
if (cv_kartairthrust.value)
|
||||
airthrustactive = true;
|
||||
|
||||
if (cv_kartitemlitter.value)
|
||||
itemlittering = true;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue