Merge remote-tracking branch 'origin/next' into subvsdub

This commit is contained in:
yamamama 2025-11-29 11:07:05 -05:00
commit 14753a4534
21 changed files with 318 additions and 30 deletions

View file

@ -94,7 +94,7 @@
#define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291
#define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b
#define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9
#define ASSET_HASH_MAIN_PK3 0x92477cf651c45063
#define ASSET_HASH_MAIN_PK3 0x22734e65763c2939
#define ASSET_HASH_MAPPATCH_PK3 0x0afd8afc6fc50175
#define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461
#ifdef USE_PATCH_FILE
@ -1661,6 +1661,8 @@ void D_SRB2Main(void)
M_InitPlayerSetupColors();
K_ReloadHUDColorCvar();
// Do it before P_InitMapData because PNG patch
// conversion sometimes needs the palette
V_ReloadPalette();

View file

@ -168,6 +168,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);
@ -567,6 +568,13 @@ 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_CHEAT|CV_GUARD, CV_Unsigned, NULL);
consvar_t cv_kartairthrust_power1 = CVAR_INIT ("kartairthrust_power1", "0.2", CV_NETVAR|CV_FLOAT|CV_CHEAT|CV_GUARD, CV_Unsigned, NULL);
consvar_t cv_kartairthrust_power2 = CVAR_INIT ("kartairthrust_power2", "0.35", CV_NETVAR|CV_FLOAT|CV_CHEAT|CV_GUARD, CV_Unsigned, NULL);
consvar_t cv_kartairthrust_power3 = CVAR_INIT ("kartairthrust_power3", "0.5", CV_NETVAR|CV_FLOAT|CV_CHEAT|CV_GUARD, CV_Unsigned, NULL);
consvar_t cv_kartairthrust_power4 = CVAR_INIT ("kartairthrust_power4", "0.75", CV_NETVAR|CV_FLOAT|CV_CHEAT|CV_GUARD, 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);
@ -8099,11 +8107,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"));
}
}
}

View file

@ -195,6 +195,13 @@ 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_kartairthrust_power1;
extern consvar_t cv_kartairthrust_power2;
extern consvar_t cv_kartairthrust_power3;
extern consvar_t cv_kartairthrust_power4;
extern consvar_t cv_kartitemlitter, cv_kartitempush;
extern consvar_t cv_kartantibump;

View file

@ -563,9 +563,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.

View file

@ -1565,6 +1565,12 @@ struct int_const_s const INT_CONST[] = {
{"KSHIELD_FLAME",KSHIELD_FLAME},
{"NUMKARTSHIELDS",NUMKARTSHIELDS},
// kartitemequip_e
{"KITEMEQUIP_NONE",KITEMEQUIP_NONE},
{"KITEMEQUIP_ORBIT",KITEMEQUIP_ORBIT},
{"KITEMEQUIP_TRAIL",KITEMEQUIP_TRAIL},
{"KITEMEQUIP_ROCKETS",KITEMEQUIP_ROCKETS},
// kartroulettetype_e
{"KROULETTETYPE_NORMAL",KROULETTETYPE_NORMAL},
{"KROULETTETYPE_KARMA",KROULETTETYPE_KARMA},

View file

@ -1402,7 +1402,7 @@ static void K_drawKartItem(void)
V_DrawString(fx+24, fy+31, V_ALLOWLOWERCASE|V_HUDTRANS|fflags, va("x%d", stplyr->itemamount));
else
{
V_DrawScaledPatch(fy+28, fy+41, V_HUDTRANS|fflags, kp_itemx);
V_DrawScaledPatch(fx+28, fy+41, V_HUDTRANS|fflags, kp_itemx);
V_DrawKartString(fx+38, fy+36, V_HUDTRANS|fflags, va("%d", stplyr->itemamount));
}
}
@ -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}
};
@ -2643,7 +2645,8 @@ static void K_drawKartStatsnLives(void)
// Lives
if (LUA_HudEnabled(hud_lives) && uselives)
{
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, K_GetHudColor(), GTC_CACHE);
// We specify stplyr->skincolor since we want it to match the player and not the hud color.
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->skincolor, GTC_CACHE);
patch_t *mmappatch = faceprefix[stplyr->skin][FACE_MINIMAP];
V_DrawMappedPatch(fx+21+mmappatch->leftoffset, fy-13+mmappatch->topoffset, V_HUDTRANS|splitflags, mmappatch, colormap);
@ -2672,7 +2675,8 @@ static void K_drawKartStatsnLives(void)
}
}
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, K_GetHudColor(), GTC_CACHE);
// We specify stplyr->skincolor since we want it to match the player and not the hud color.
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->skincolor, GTC_CACHE);
patch_t *facerank = faceprefix[stplyr->skin][FACE_RANK];
V_DrawMappedPatch(fx+59+offsetx+facerank->leftoffset, fy-16+offsety+facerank->topoffset, V_HUDTRANS|splitflags, facerank, colormap);
if (stplyr->lives >= 0 && uselives)

View file

@ -2431,3 +2431,27 @@ void K_AltShrinkPityIncrease(player_t *player)
player->growshrinktimer = ((INT16)shrinktime) * -1;
}
// this shit is so ass 🥲
kartitemequip_e K_GetItemEquipStyle(mobjtype_t mobjtype)
{
//TODO: lua hook to use any of these for a given mobj
// if we could use tables or dicts I'd use those insteasd
switch (mobjtype)
{
case MT_ORBINAUT_SHIELD:
case MT_JAWZ_SHIELD:
return KITEMEQUIP_ORBIT;
case MT_BANANA_SHIELD:
case MT_SSMINE_SHIELD:
case MT_EGGMANITEM_SHIELD:
case MT_SINK_SHIELD:
return KITEMEQUIP_TRAIL;
case MT_ROCKETSNEAKER:
return KITEMEQUIP_ROCKETS;
default:
{
return LUA_HookGetItemEquipStyle(mobjtype);
}
}
}

View file

@ -43,6 +43,14 @@ typedef enum
#define MAXKARTRESULTS 255
typedef enum
{
KITEMEQUIP_NONE,
KITEMEQUIP_ORBIT, // orbiters (orbi, jawz)
KITEMEQUIP_TRAIL, // dragged items (bananas, mines, sinks)
KITEMEQUIP_ROCKETS, // direct player position with offset (rockets)
} kartitemequip_e;
typedef enum
{
KITEMBLINK_NORMAL,
@ -211,6 +219,8 @@ void K_AltShrinkPityIncrease(player_t *player);
void K_PlayerItemThink(player_t *player, boolean onground);
kartitemequip_e K_GetItemEquipStyle(mobjtype_t mobjtype);
#ifdef __cplusplus
} // extern "C"
#endif

View file

@ -383,6 +383,13 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_kartslipdash);
CV_RegisterVar(&cv_kartairthrust);
CV_RegisterVar(&cv_kartairthrust_reductionrate);
CV_RegisterVar(&cv_kartairthrust_power1);
CV_RegisterVar(&cv_kartairthrust_power2);
CV_RegisterVar(&cv_kartairthrust_power3);
CV_RegisterVar(&cv_kartairthrust_power4);
CV_RegisterVar(&cv_kartslopeboost);
CV_RegisterVar(&cv_kartaltshrinktime);
@ -2859,7 +2866,7 @@ fixed_t K_GetKartSpeed(const player_t *player, boolean doboostpower, boolean dor
boolean karmabomb = ((gametyperules & GTR_BUMPERS) && player->bumper <= 0);
fixed_t finalspeed;
if (doboostpower && !player->pogospring && !P_IsObjectOnGround(player->mo))
if (doboostpower && !player->pogospring && !P_IsObjectOnGround(player->mo) && (player->airdriftspeed == 0))
return (75*mapobjectscale); // air speed cap
finalspeed = K_GetKartSpeedFromStat(player->kartspeed, karmabomb);
@ -5571,9 +5578,11 @@ void K_CalculateBananaSlope(mobj_t *mobj, fixed_t x, fixed_t y, fixed_t z, fixed
}
// Move the hnext chain!
//TODO: generalize further?
static void K_MoveHeldObjects(player_t *player)
{
TryMoveResult_t result = {0};
kartitemequip_e equipstyle = KITEMEQUIP_NONE;
if (!player->mo)
return;
@ -5607,10 +5616,11 @@ static void K_MoveHeldObjects(player_t *player)
return;
}
switch (player->mo->hnext->type)
equipstyle = K_GetItemEquipStyle(player->mo->hnext->type);
switch (equipstyle)
{
case MT_ORBINAUT_SHIELD: // Kart orbit items
case MT_JAWZ_SHIELD:
case KITEMEQUIP_ORBIT: // Kart orbit items
{
mobj_t *cur = player->mo->hnext;
fixed_t speed = ((8 - min(4, player->itemamount)) * cur->info->speed) / 7;
@ -5686,10 +5696,7 @@ static void K_MoveHeldObjects(player_t *player)
}
}
break;
case MT_BANANA_SHIELD: // Kart trailing items
case MT_SSMINE_SHIELD:
case MT_EGGMANITEM_SHIELD:
case MT_SINK_SHIELD:
case KITEMEQUIP_TRAIL: // Kart trailing items
{
mobj_t *cur = player->mo->hnext;
mobj_t *curnext;
@ -5798,7 +5805,7 @@ static void K_MoveHeldObjects(player_t *player)
}
}
break;
case MT_ROCKETSNEAKER: // Special rocket sneaker stuff
case KITEMEQUIP_ROCKETS: //TODO: generalize with customizable offsets (Special rocket sneaker stuff)
{
mobj_t *cur = player->mo->hnext;
INT32 num = 0;
@ -8884,6 +8891,42 @@ static boolean K_AltInvinSliptideCondition(player_t *player)
return (K_InvincibilityGradient(player->invincibilitytimer) > (FRACUNIT/2));
}
// Sliptide conditions for Alt. Shrink
static boolean K_AltShrinkSliptideCondition(player_t *player)
{
if (!(K_IsAltShrunk(player)))
{
// Not Alt. Shrunk!
return false;
}
const fixed_t speedPercent = FixedDiv(player->speed, K_GetKartSpeed(player, false, false));
// Allow sliptides if you're moving above 125% speed.
return (speedPercent > (5 * FRACUNIT / 4));
}
static void K_HandleAirDriftDrag(player_t *player, boolean onground)
{
if (onground && player->airdriftspeed > 0)
{
player->airdriftspeed = 0;
}
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_KartDrift(player_t *player, boolean onground)
{
fixed_t minspeed = (10 * player->mo->scale);
@ -8898,19 +8941,24 @@ static void K_KartDrift(player_t *player, boolean onground)
if (player->pogospring == 2 && player->mo->scale > mapobjectscale)
minspeed = FixedMul(10<<FRACBITS, mapobjectscale);
// air thrust drag
if (K_AirThrustActive())
{
K_HandleAirDriftDrag(player, onground);
}
// Drifting is actually straffing + automatic turning.
// Holding the Jump button will enable drifting.
// Drift Release (Moved here so you can't "chain" drifts)
if (player->drift != -5 && player->drift != 5)
{
if (driftstage && onground)
if (driftstage && (onground || K_AirThrustActive()))
{
UINT8 boost = 0;
if (!cv_kartdriftsounds.value || driftstage < 3)
S_StartSound(player->mo, sfx_s23c);
switch (driftstage)
{
case 1:
@ -8919,7 +8967,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;
@ -8939,6 +8987,39 @@ static void K_KartDrift(player_t *player, boolean onground)
}
break;
}
if (K_AirThrustActive() && !onground) // Air Thrust is enabled
{
fixed_t airthrust = 0;
switch (driftstage)
{
case 1:
airthrust = cv_kartairthrust_power1.value;
break;
case 2:
airthrust = cv_kartairthrust_power2.value;
break;
case 3:
airthrust = cv_kartairthrust_power3.value;
break;
case 4:
airthrust = cv_kartairthrust_power4.value;
break;
}
if (driftstage > 0)
{
// 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
player->airdriftspeed = max(K_GetKartSpeed(player, false, false), player->speed);
// 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/2, abs(P_GetMobjGravity(player->mo))));
}
}
if (player->driftboost < boost)
player->driftboost = boost;
@ -8956,7 +9037,7 @@ static void K_KartDrift(player_t *player, boolean onground)
player->karthud[khud_afterimagetime] = 10;
}
if (onground)
if (onground || K_AirThrustActive())
player->driftcharge = 0;
}
@ -9062,7 +9143,7 @@ static void K_KartDrift(player_t *player, boolean onground)
player->pflags &= ~(PF_BRAKEDRIFT|PF_GETSPARKS);
}
if ( (!(player->sneakertimer || player->flamestore || player->bubbleboost || K_AltInvinSliptideCondition(player)))
if ( (!(player->sneakertimer || player->flamestore || player->bubbleboost || K_AltInvinSliptideCondition(player) || K_AltShrinkSliptideCondition(player)))
|| (!player->cmd.turning)
|| (!player->aizdriftstrat)
|| (player->cmd.turning > 0) != (player->aizdriftstrat > 0))
@ -10738,6 +10819,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)

View file

@ -352,6 +352,7 @@ boolean K_SlipdashActive(void);
boolean K_SlopeBoostActive(void);
boolean K_DraftingActive(void);
boolean K_AirDropActive(void);
boolean K_AirThrustActive(void);
boolean K_ItemLitterActive(void);
boolean K_ItemPushingActive(void);
INT32 K_GetBumpSpark(void);

View file

@ -3925,6 +3925,25 @@ static int lib_kDriftDustHandling(lua_State *L)
return 0;
}
static int lib_kThrowKartItem(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
boolean missile = luaL_checkboolean(L, 2);
mobjtype_t thingtype = luaL_checkinteger(L, 3);
INT32 defaultdir = luaL_optinteger(L, 4, 0);
INT32 altthrow = luaL_optinteger(L, 5, 0);
NOHUD
if (!player)
return LUA_ErrInvalid(L, "player_t");
mobj_t *mo = K_ThrowKartItem(player, missile, thingtype, defaultdir, altthrow);
if (mo)
LUA_PushUserdata(L, mo, META_MOBJ);
else
lua_pushnil(L);
return 1;
}
static int lib_kDoSneaker(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -4007,6 +4026,17 @@ static int lib_kKartUpdatePosition(lua_State *L)
return 0;
}
static int lib_kUpdateHnextList(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
boolean clean = lua_optboolean(L, 2);
NOHUD
if (!player)
return LUA_ErrInvalid(L, "player_t");
K_UpdateHnextList(player, clean);
return 0;
}
static int lib_kDropItems(lua_State *L)
{
player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER));
@ -5481,6 +5511,7 @@ static luaL_Reg lib[] = {
{"K_SpawnSparkleTrail",lib_kSpawnSparkleTrail},
{"K_SpawnWipeoutTrail",lib_kSpawnWipeoutTrail},
{"K_DriftDustHandling",lib_kDriftDustHandling},
{"K_ThrowKartItem",lib_kThrowKartItem},
{"K_DoSneaker",lib_kDoSneaker},
{"K_DoPogoSpring",lib_kDoPogoSpring},
{"K_KillBananaChain",lib_kKillBananaChain},
@ -5488,6 +5519,7 @@ static luaL_Reg lib[] = {
{"K_FindJawzTarget",lib_kFindJawzTarget},
{"K_GetKartDriftSparkValue",lib_kGetKartDriftSparkValue},
{"K_KartUpdatePosition",lib_kKartUpdatePosition},
{"K_UpdateHnextList",lib_kUpdateHnextList},
{"K_DropItems",lib_kDropItems},
{"K_StripItems",lib_kStripItems},
{"K_StripOther",lib_kStripOther},

View file

@ -92,6 +92,7 @@ automatically.
X (KartStripItems),/*SRB2KART*/\
X (KartStripOther),/*SRB2KART*/\
X (CanPickupItem),/*SRB2KART*/\
X (GetItemEquipStyle),/*SRB2KART*/\
#define STRING_HOOK_LIST(X) \
X (SpecialExecute),\
@ -185,6 +186,7 @@ boolean LUA_HookKartSneaker(player_t *player, int type); // SRB2Kart: Hook for K
boolean LUA_HookKartStripItems(player_t *player, UINT8 item); // SRB2Kart: Hook for K_StripItems.
boolean LUA_HookKartStripOther(player_t *player); // SRB2Kart: Hook for K_StripOther.
boolean LUA_HookCanPickupItem(player_t *player, UINT8 weapon, boolean *force); // SRB2Kart: Hook for P_CanPickupItem.
int LUA_HookGetItemEquipStyle(mobjtype_t mobjtype); // SRB2Kart: Hook for K_GetItemEquipStyle.
#ifdef __cplusplus
} // extern "C"

View file

@ -1418,3 +1418,31 @@ boolean LUA_HookCanPickupItem(player_t *player, UINT8 weapon, boolean *force)
*force = state.force;
return state.override;
}
static void res_itemequipstyle(Hook_State *hook)
{
if (!lua_isnil(gL, -1))
{
UINT32 ret = lua_tonumber(gL, -1);
hook->status = ret;
}
else
{
hook->status = 0;
}
}
int LUA_HookGetItemEquipStyle(mobjtype_t type)
{
Hook_State hook;
if (prepare_hook(&hook, 0, HOOK(GetItemEquipStyle)))
{
lua_pushinteger(gL, type);
call_hooks(&hook, 1, res_itemequipstyle);
}
return hook.status;
}

View file

@ -281,6 +281,7 @@ enum player_e
player_drift,
player_driftcharge,
player_driftboost,
player_airdriftspeed,
player_boostcharge,
player_slopeboost,
player_prevslopeboost,
@ -498,6 +499,7 @@ static const char *const player_opt[] = {
"drift",
"driftcharge",
"driftboost",
"airdriftspeed",
"boostcharge",
"slopeboost",
"prevslopeboost",
@ -841,6 +843,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;
@ -1594,6 +1599,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;

View file

@ -5719,7 +5719,7 @@ INT32 MR_StartGrandPrix(INT32 choice)
G_DeferedInitNew(
false,
levelNum + 1,
(UINT8)(cv_chooseskin.value),
cv_chooseskin.value,
(UINT8)(cv_splitplayers.value - 1),
false
);

View file

@ -2313,6 +2313,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;

View file

@ -286,6 +286,12 @@ P_DoSpringEx
finalSpeed = pSpeed;
P_InstaThrust(object, finalAngle, FixedMul(finalSpeed,FixedSqrt(FixedMul(hscale, scaleVal))));
if (object->player->airdriftspeed > 0)
{
// clear air thrust target speed too
object->player->airdriftspeed = 0;
}
}
}
}
@ -399,6 +405,12 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object)
}
}
}
if (object->player->airdriftspeed > 0)
{
// clear air thrust target speed too
object->player->airdriftspeed = 0;
}
}
return true;
}
@ -467,6 +479,12 @@ static void P_DoFanAndGasJet(mobj_t *spring, mobj_t *object)
default:
break;
}
if (object->player && object->player->airdriftspeed > 0)
{
// clear air thrust target speed too
object->player->airdriftspeed = 0;
}
}
//

View file

@ -618,6 +618,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;

View file

@ -591,6 +591,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);

View file

@ -161,6 +161,7 @@ boolean purpledriftactive;
boolean slopeboostactive;
boolean draftingactive;
boolean airdropactive;
boolean airthrustactive;
boolean itemlittering;
boolean itempushing;
UINT8 bumpsparkactive;
@ -7350,10 +7351,14 @@ static void P_ConvertBinaryThingTypes(void)
case 556: //Diagonal red spring
case 557: //Diagonal blue spring
case 558: //Diagonal grey spring
if (mapthings[i].options & MTF_OBJECTSPECIAL)
mapthings[i].args[0] |= TMSPR_NOGRAVITY;
if (mapthings[i].options & MTF_AMBUSH)
mapthings[i].args[0] |= TMSPR_ROTATEEXTRA;
//if (mapthings[i].options & MTF_OBJECTSPECIAL)
//mapthings[i].args[0] |= TMSPR_NOGRAVITY;
// Not all springs had rotate extra in v1
if (!(mapthings[i].type == 557 || mapthings[i].type == 558))
{
if (mapthings[i].options & MTF_AMBUSH)
mapthings[i].args[0] |= TMSPR_ROTATEEXTRA;
}
break;
case 559: //Horizontal yellow spring
case 560: //Horizontal red spring
@ -8169,6 +8174,7 @@ static void P_InitLevelSettings(boolean reloadinggamestate)
slopeboostactive = false;
draftingactive = false;
airdropactive = false;
airthrustactive = false;
itemlittering = false;
itempushing = false;
bumpsparkactive = 0;
@ -8198,6 +8204,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;

View file

@ -2045,7 +2045,7 @@ static void P_3dMovement(player_t *player)
}
// else do nothing
}
else
else if (player->airdriftspeed == 0)
{
tempmomx = FixedMul(FixedDiv(player->mo->momx - player->cmomx, newMagnitude), K_GetKartSpeed(player, true, true)); //topspeed)
tempmomy = FixedMul(FixedDiv(player->mo->momy - player->cmomy, newMagnitude), K_GetKartSpeed(player, true, true)); //topspeed)