Alright, take it or leave it

This commit is contained in:
GenericHeroGuy 2026-02-08 01:05:54 +01:00
parent 38f9419fc2
commit d738ad5957
6 changed files with 40 additions and 97 deletions

View file

@ -93,7 +93,7 @@
#define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291
#define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b
#define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9 #define ASSET_HASH_MAPS_KART 0x38558ed00da41ce9
#define ASSET_HASH_MAIN_PK3 0x0000000000000000 #define ASSET_HASH_MAIN_PK3 0xc3e04c64e2048a84
#define ASSET_HASH_MAPPATCH_PK3 0xbbc2c6a7a685da3a #define ASSET_HASH_MAPPATCH_PK3 0xbbc2c6a7a685da3a
#define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461 #define ASSET_HASH_BONUSCHARS_KART 0x60e6f13d822a7461
#ifdef USE_PATCH_FILE #ifdef USE_PATCH_FILE

View file

@ -688,9 +688,8 @@ struct player_t
UINT8 ringvolume; // When consuming lots of rings, lower the sound a little. UINT8 ringvolume; // When consuming lots of rings, lower the sound a little.
UINT8 ringtransparency; // When consuming lots of rings, fade out the rings again. UINT8 ringtransparency; // When consuming lots of rings, fade out the rings again.
INT32 airdroppredelay; // In light airdrop, handles the delay before it can be activated once going airborne. INT32 airdroppredelay; // Handles the delay before airdrop can be activated once going airborne.
INT32 airdroptime; // Tracks how long the player has been in airdrop. INT32 airdroptime; // Tracks how long the player has been in airdrop.
INT32 airdropbuffer; // Time during which heavy air drop will instantly trigger upon going airborne.
p_airdropflags_t airdropflags; // Airdrop-exclusive bitflags. p_airdropflags_t airdropflags; // Airdrop-exclusive bitflags.
mobj_t *shieldtracer; // Blankart: Shield mobj mobj_t *shieldtracer; // Blankart: Shield mobj

View file

@ -5003,6 +5003,7 @@ void K_DoSneaker(player_t *player, INT32 type)
void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
{ {
fixed_t objscale = mo->scale; fixed_t objscale = mo->scale;
boolean airdropbounce = false;
if (mo->player) if (mo->player)
{ {
@ -5011,6 +5012,9 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
// so the game handles springs as such. // so the game handles springs as such.
// Alt. Shrink *especially* needs this change! // Alt. Shrink *especially* needs this change!
objscale = max(mo->scale, mapobjectscale); objscale = max(mo->scale, mapobjectscale);
// sproing!
airdropbounce = mo->player->airdropflags & PAF_AIRDROP_HEAVY;
} }
const fixed_t vscale = mapobjectscale + (objscale - mapobjectscale); const fixed_t vscale = mapobjectscale + (objscale - mapobjectscale);
@ -5048,6 +5052,8 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
else if (mo->player->flamestore) else if (mo->player->flamestore)
thrust = FixedMul(thrust, 9*FRACUNIT/8); thrust = FixedMul(thrust, 9*FRACUNIT/8);
} }
if (airdropbounce)
thrust *= 2;
} }
else else
{ {
@ -5067,7 +5073,7 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound)
mo->momz = (117 * mo->momz) / 200; mo->momz = (117 * mo->momz) / 200;
if (sound) if (sound)
S_StartSound(mo, (sound == 1 ? sfx_kc2f : sfx_kpogos)); S_StartSound(mo, sound == 1 ? (airdropbounce ? sfx_sprong : sfx_kc2f) : sfx_kpogos);
} }
void K_ResetPogoSpring(player_t *player) void K_ResetPogoSpring(player_t *player)
@ -6998,32 +7004,18 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd)
const INT32 heavydrophi = TICRATE/3; const INT32 heavydrophi = TICRATE/3;
const INT32 airbrakedelay = TICRATE/3; const INT32 airbrakedelay = TICRATE/3;
if (player->airdropbuffer > 0)
{
player->airdropbuffer--;
}
if ((cmd->buttons & BT_BRAKE)) if ((cmd->buttons & BT_BRAKE))
{ {
if (!(player->airdropflags & PAF_AIRDROPINPUT)) // don't buffer heavy airdrops on the ground to prevent silly mistakes
{ if ((!P_IsObjectOnGround(player->mo) && !(player->airdropflags & PAF_AIRDROPINPUT))
player->airdropflags |= PAF_WANTSAIRDROP|PAF_AIRDROPINPUT; || (airdropactive != AIRDROP_HEAVY && !(airdropactive == AIRDROP_FUSION && !(cmd->buttons & BT_ACCELERATE))))
if (P_IsObjectOnGround(player->mo)) player->airdropflags |= PAF_WANTSAIRDROP;
player->airdropbuffer = 2;
} player->airdropflags |= PAF_AIRDROPINPUT;
} }
else else
{ {
player->airdropflags &= ~PAF_AIRDROPINPUT; player->airdropflags &= ~(PAF_WANTSAIRDROP|PAF_AIRDROPINPUT);
if (airdropactive == AIRDROP_LIGHT || airdropactive == AIRDROP_FUSION)
{
player->airdropflags &= ~PAF_WANTSAIRDROP;
}
}
if (P_IsObjectOnGround(player->mo) && player->airdropbuffer == 0)
{
player->airdropflags &= ~PAF_WANTSAIRDROP;
} }
if (!(player->airdropflags & PAF_AIRDROP_HEAVY)) if (!(player->airdropflags & PAF_AIRDROP_HEAVY))
@ -7038,21 +7030,11 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd)
player->karthud[khud_postdropcam]--; player->karthud[khud_postdropcam]--;
} }
if (K_AirDropActive() && P_IsObjectOnGround(player->mo)) if (K_AirDropActive() && P_IsObjectOnGround(player->mo) && player->pogospring == 0)
{ {
if ((player->airdropflags & PAF_AIRDROP_HEAVY)) if ((player->airdropflags & PAF_AIRDROP_HEAVY))
{ {
if (player->rings > 0 && player->airdroptime > TICRATE/4) P_PlayerRingBurst(player, CLAMP(player->rings, 0, 3));
{
P_PlayerRingBurst(player, min(2, player->rings));
}
if (player->airdroptime > 1)
{
player->startboost = TICRATE/4 + min(TICRATE, ((FixedDiv(player->airdroptime, TICRATE) * TICRATE) / FRACUNIT));
// Take off!
S_StartSound(player->mo, sfx_shrpgo);
}
// POOMP! // POOMP!
S_StartSound(player->mo, sfx_doord2); S_StartSound(player->mo, sfx_doord2);
@ -7063,7 +7045,7 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd)
if (!K_AirDropActive() || P_IsObjectOnGround(player->mo) if (!K_AirDropActive() || P_IsObjectOnGround(player->mo)
|| P_PlayerInPain(player) || player->loop.radius || P_PlayerInPain(player) || player->loop.radius
|| (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT) || player->carry == CR_ZOOMTUBE
|| player->respawn || player->respawn
) )
{ {
@ -7075,7 +7057,10 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd)
if (player->airdropflags & PAF_WANTSAIRDROP) if (player->airdropflags & PAF_WANTSAIRDROP)
{ {
if ((airdropactive == AIRDROP_LIGHT) || (airdropactive == AIRDROP_FUSION && (cmd->buttons & BT_ACCELERATE))) if (player->airdroppredelay < airbrakedelay)
{
}
else if ((airdropactive == AIRDROP_LIGHT) || (airdropactive == AIRDROP_FUSION && (cmd->buttons & BT_ACCELERATE)))
{ {
player->airdropflags |= PAF_AIRDROP_LIGHT; player->airdropflags |= PAF_AIRDROP_LIGHT;
} }
@ -7083,7 +7068,6 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd)
{ {
player->airdropflags |= PAF_AIRDROP_HEAVY; player->airdropflags |= PAF_AIRDROP_HEAVY;
player->airdroptime = 0; player->airdroptime = 0;
player->airdropbuffer = 0;
// TODO: heavy air drop should allow keeping current boost stack // TODO: heavy air drop should allow keeping current boost stack
S_StartSound(player->mo, sfx_s3k77); S_StartSound(player->mo, sfx_s3k77);
@ -7091,47 +7075,38 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd)
player->mo->momx = FixedMul(player->mo->momx, 90*FRACUNIT/100); player->mo->momx = FixedMul(player->mo->momx, 90*FRACUNIT/100);
player->mo->momy = FixedMul(player->mo->momy, 90*FRACUNIT/100); player->mo->momy = FixedMul(player->mo->momy, 90*FRACUNIT/100);
player->mo->momz -= 12*P_MobjFlip(player->mo)*mapobjectscale; player->mo->momz -= 8*P_MobjFlip(player->mo)*mapobjectscale;
} }
} }
else else
{ {
if (airdropactive == AIRDROP_LIGHT || airdropactive == AIRDROP_FUSION) player->airdropflags &= ~PAF_AIRDROP_LIGHT;
{ if (!(player->airdropflags & PAF_AIRDROP_HEAVY))
player->airdropflags &= ~PAF_AIRDROP_LIGHT; player->airdroptime = 0;
if (!(player->airdropflags & PAF_AIRDROP_HEAVY))
player->airdroptime = 0;
}
} }
// heavy air drop always overrides light air drop // heavy air drop always overrides light air drop
if (player->airdropflags & PAF_AIRDROP_HEAVY) if (player->airdropflags & PAF_AIRDROP_HEAVY)
{ {
K_SpawnFallLines(player, false); const boolean high = player->airdroptime <= heavydrophi/* && player->airdropflags & PAF_AIRDROPINPUT*/;
if (player->airdroptime <= heavydrophi) player->mo->momx = FixedMul(player->mo->momx, (high ? 98 : 99)*FRACUNIT/100);
{ player->mo->momy = FixedMul(player->mo->momy, (high ? 98 : 99)*FRACUNIT/100);
player->mo->momz -= FixedMul(5*gravity, mapobjectscale)*P_MobjFlip(player->mo); player->mo->momz -= FixedMul((high ? 4 : 2)*gravity, mapobjectscale)*P_MobjFlip(player->mo);
K_SpawnAirdropTrail(player); K_SpawnFallLines(player, high);
}
else
{
player->mo->momz -= FixedMul(2*gravity, mapobjectscale)*P_MobjFlip(player->mo);
}
if (player->karthud[khud_heavydropcam] < TICRATE) if (player->karthud[khud_heavydropcam] < TICRATE)
player->karthud[khud_heavydropcam]++; player->karthud[khud_heavydropcam]++;
K_SpawnAirdropTrail(player);
player->airdroptime++; player->airdroptime++;
} }
else if (player->airdropflags & PAF_AIRDROP_LIGHT) else if (player->airdropflags & PAF_AIRDROP_LIGHT)
{ {
if (player->airdroppredelay >= airbrakedelay) player->mo->momz -= FixedMul(gravity, mapobjectscale)*P_MobjFlip(player->mo);
{ K_SpawnFallLines(player, false);
player->mo->momz -= FixedMul(gravity, mapobjectscale)*P_MobjFlip(player->mo);
K_SpawnFallLines(player, false);
K_SpawnAirdropTrail(player);
}
if (leveltime & 1)
K_SpawnAirdropTrail(player);
player->airdroptime++; player->airdroptime++;
} }

View file

@ -392,9 +392,7 @@ static int lib_lenLocalplayers(lua_State *L)
X(ringtransparency) \ X(ringtransparency) \
X(airdroppredelay) \ X(airdroppredelay) \
X(airdroptime) \ X(airdroptime) \
X(airdropbuffer) \
X(airdropflags) \ X(airdropflags) \
X(ringdrop) \
X(shieldtracer) \ X(shieldtracer) \
X(bubblecool) \ X(bubblecool) \
X(bubbleblowup) \ X(bubbleblowup) \
@ -838,15 +836,9 @@ static int player_get(lua_State *L)
case player_airdroptime: case player_airdroptime:
lua_pushinteger(L, plr->airdroptime); lua_pushinteger(L, plr->airdroptime);
break; break;
case player_airdropbuffer:
lua_pushinteger(L, plr->airdropbuffer);
break;
case player_airdropflags: case player_airdropflags:
lua_pushinteger(L, plr->airdropflags); lua_pushinteger(L, plr->airdropflags);
break; break;
/*case player_ringdrop:
lua_pushinteger(L, plr->ringdrop);
break;*/
case player_shieldtracer: case player_shieldtracer:
LUA_PushUserdata(L, plr->shieldtracer, META_MOBJ); LUA_PushUserdata(L, plr->shieldtracer, META_MOBJ);
break; break;
@ -1628,15 +1620,9 @@ static int player_set(lua_State *L)
case player_airdroptime: case player_airdroptime:
plr->airdroptime = luaL_checkinteger(L, 3); plr->airdroptime = luaL_checkinteger(L, 3);
break; break;
case player_airdropbuffer:
plr->airdropbuffer = luaL_checkinteger(L, 3);
break;
case player_airdropflags: case player_airdropflags:
plr->airdropflags = luaL_checkinteger(L, 3); plr->airdropflags = luaL_checkinteger(L, 3);
break; break;
/*case player_ringdrop:
plr->ringdrop = luaL_checkinteger(L, 3);
break;*/
case player_shieldtracer: case player_shieldtracer:
return NOSET; return NOSET;
case player_bubblecool: case player_bubblecool:

View file

@ -3229,28 +3229,12 @@ void A_AttractChase(void *thing)
if (actor->extravalue1 >= 21) if (actor->extravalue1 >= 21)
{ {
// Base add is 4 tics for 9,9, adds 1 tic for each point closer to the 1,1 end
/*if (actor->extravalue3 && !P_IsObjectOnGround(actor->target)) actor->target->player->ringboost += K_GetKartRingPower(actor->target->player, true);
{ actor->target->player->ringtime += K_GetKartRingPower(actor->target->player, true);
actor->target->momz -= (FixedMul(gravity, mapobjectscale))*P_MobjFlip(actor->target);
actor->target->player->ringboost += 7;
actor->target->player->ringtime += 7;
actor->target->player->ringdrop = true;
}
else*/
{
// Base add is 4 tics for 9,9, adds 1 tic for each point closer to the 1,1 end
actor->target->player->ringboost += K_GetKartRingPower(actor->target->player, true);
actor->target->player->ringtime += K_GetKartRingPower(actor->target->player, true);
}
S_StartSoundAtVolume(actor->target, sfx_s1b5, actor->target->player->ringvolume); S_StartSoundAtVolume(actor->target, sfx_s1b5, actor->target->player->ringvolume);
if (actor->extravalue3 && !P_IsObjectOnGround(actor->target))
{
actor->target->momz -= (FixedMul(gravity, mapobjectscale)/2 + FixedMul(gravity, mapobjectscale)/4)*P_MobjFlip(actor->target);
}
if (actor->target->player->rings <= 10) if (actor->target->player->rings <= 10)
{ {
S_StartSoundAtVolume(actor->target, sfx_ringlw, 255 - actor->target->player->rings*10); S_StartSoundAtVolume(actor->target, sfx_ringlw, 255 - actor->target->player->rings*10);

View file

@ -714,7 +714,6 @@ static void P_NetSyncPlayers(savebuffer_t *save)
SYNC(players[i].airdroppredelay); SYNC(players[i].airdroppredelay);
SYNC(players[i].airdroptime); SYNC(players[i].airdroptime);
SYNC(players[i].airdropbuffer);
SYNC(players[i].airdropflags); SYNC(players[i].airdropflags);
RSYNC(players[i].shieldtracer); RSYNC(players[i].shieldtracer);