diff --git a/src/d_main.cpp b/src/d_main.cpp index 030564637..f5208bae5 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -93,7 +93,7 @@ #define ASSET_HASH_TEXTURES_KART 0xb4211b2f32b6a291 #define ASSET_HASH_CHARS_KART 0x1e68a3e01aa5c68b #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_BONUSCHARS_KART 0x60e6f13d822a7461 #ifdef USE_PATCH_FILE diff --git a/src/d_player.h b/src/d_player.h index fce7c6db8..1263cf1ba 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -688,9 +688,8 @@ struct player_t UINT8 ringvolume; // When consuming lots of rings, lower the sound a little. 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 airdropbuffer; // Time during which heavy air drop will instantly trigger upon going airborne. p_airdropflags_t airdropflags; // Airdrop-exclusive bitflags. mobj_t *shieldtracer; // Blankart: Shield mobj diff --git a/src/k_kart.c b/src/k_kart.c index 7f8ab99f0..9e2848f02 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5003,6 +5003,7 @@ void K_DoSneaker(player_t *player, INT32 type) void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) { fixed_t objscale = mo->scale; + boolean airdropbounce = false; 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. // Alt. Shrink *especially* needs this change! objscale = max(mo->scale, mapobjectscale); + + // sproing! + airdropbounce = mo->player->airdropflags & PAF_AIRDROP_HEAVY; } 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) thrust = FixedMul(thrust, 9*FRACUNIT/8); } + if (airdropbounce) + thrust *= 2; } else { @@ -5067,7 +5073,7 @@ void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound) mo->momz = (117 * mo->momz) / 200; 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) @@ -6998,32 +7004,18 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) const INT32 heavydrophi = TICRATE/3; const INT32 airbrakedelay = TICRATE/3; - if (player->airdropbuffer > 0) - { - player->airdropbuffer--; - } - if ((cmd->buttons & BT_BRAKE)) { - if (!(player->airdropflags & PAF_AIRDROPINPUT)) - { - player->airdropflags |= PAF_WANTSAIRDROP|PAF_AIRDROPINPUT; - if (P_IsObjectOnGround(player->mo)) - player->airdropbuffer = 2; - } + // don't buffer heavy airdrops on the ground to prevent silly mistakes + if ((!P_IsObjectOnGround(player->mo) && !(player->airdropflags & PAF_AIRDROPINPUT)) + || (airdropactive != AIRDROP_HEAVY && !(airdropactive == AIRDROP_FUSION && !(cmd->buttons & BT_ACCELERATE)))) + player->airdropflags |= PAF_WANTSAIRDROP; + + player->airdropflags |= PAF_AIRDROPINPUT; } else { - player->airdropflags &= ~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; + player->airdropflags &= ~(PAF_WANTSAIRDROP|PAF_AIRDROPINPUT); } if (!(player->airdropflags & PAF_AIRDROP_HEAVY)) @@ -7038,21 +7030,11 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) 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->rings > 0 && player->airdroptime > TICRATE/4) - { - 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); - } + P_PlayerRingBurst(player, CLAMP(player->rings, 0, 3)); // POOMP! 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) || P_PlayerInPain(player) || player->loop.radius - || (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT) + || player->carry == CR_ZOOMTUBE || player->respawn ) { @@ -7075,7 +7057,10 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) 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; } @@ -7083,7 +7068,6 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) { player->airdropflags |= PAF_AIRDROP_HEAVY; player->airdroptime = 0; - player->airdropbuffer = 0; // TODO: heavy air drop should allow keeping current boost stack 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->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 { - if (airdropactive == AIRDROP_LIGHT || airdropactive == AIRDROP_FUSION) - { - player->airdropflags &= ~PAF_AIRDROP_LIGHT; - if (!(player->airdropflags & PAF_AIRDROP_HEAVY)) - player->airdroptime = 0; - } + player->airdropflags &= ~PAF_AIRDROP_LIGHT; + if (!(player->airdropflags & PAF_AIRDROP_HEAVY)) + player->airdroptime = 0; } // heavy air drop always overrides light air drop if (player->airdropflags & PAF_AIRDROP_HEAVY) { - K_SpawnFallLines(player, false); - if (player->airdroptime <= heavydrophi) - { - player->mo->momz -= FixedMul(5*gravity, mapobjectscale)*P_MobjFlip(player->mo); - K_SpawnAirdropTrail(player); - } - else - { - player->mo->momz -= FixedMul(2*gravity, mapobjectscale)*P_MobjFlip(player->mo); - } + const boolean high = player->airdroptime <= heavydrophi/* && player->airdropflags & PAF_AIRDROPINPUT*/; + 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((high ? 4 : 2)*gravity, mapobjectscale)*P_MobjFlip(player->mo); + K_SpawnFallLines(player, high); if (player->karthud[khud_heavydropcam] < TICRATE) player->karthud[khud_heavydropcam]++; + K_SpawnAirdropTrail(player); player->airdroptime++; } 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); - K_SpawnAirdropTrail(player); - } + player->mo->momz -= FixedMul(gravity, mapobjectscale)*P_MobjFlip(player->mo); + K_SpawnFallLines(player, false); + if (leveltime & 1) + K_SpawnAirdropTrail(player); player->airdroptime++; } diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 29ae5fdb5..893e3b594 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -392,9 +392,7 @@ static int lib_lenLocalplayers(lua_State *L) X(ringtransparency) \ X(airdroppredelay) \ X(airdroptime) \ - X(airdropbuffer) \ X(airdropflags) \ - X(ringdrop) \ X(shieldtracer) \ X(bubblecool) \ X(bubbleblowup) \ @@ -838,15 +836,9 @@ static int player_get(lua_State *L) case player_airdroptime: lua_pushinteger(L, plr->airdroptime); break; - case player_airdropbuffer: - lua_pushinteger(L, plr->airdropbuffer); - break; case player_airdropflags: lua_pushinteger(L, plr->airdropflags); break; - /*case player_ringdrop: - lua_pushinteger(L, plr->ringdrop); - break;*/ case player_shieldtracer: LUA_PushUserdata(L, plr->shieldtracer, META_MOBJ); break; @@ -1628,15 +1620,9 @@ static int player_set(lua_State *L) case player_airdroptime: plr->airdroptime = luaL_checkinteger(L, 3); break; - case player_airdropbuffer: - plr->airdropbuffer = luaL_checkinteger(L, 3); - break; case player_airdropflags: plr->airdropflags = luaL_checkinteger(L, 3); break; - /*case player_ringdrop: - plr->ringdrop = luaL_checkinteger(L, 3); - break;*/ case player_shieldtracer: return NOSET; case player_bubblecool: diff --git a/src/p_enemy.c b/src/p_enemy.c index 477cd0b00..b6fb520ad 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3229,28 +3229,12 @@ void A_AttractChase(void *thing) if (actor->extravalue1 >= 21) { - - /*if (actor->extravalue3 && !P_IsObjectOnGround(actor->target)) - { - 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); - } + // 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); - 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) { S_StartSoundAtVolume(actor->target, sfx_ringlw, 255 - actor->target->player->rings*10); diff --git a/src/p_saveg.c b/src/p_saveg.c index 828502779..cf66ead84 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -714,7 +714,6 @@ static void P_NetSyncPlayers(savebuffer_t *save) SYNC(players[i].airdroppredelay); SYNC(players[i].airdroptime); - SYNC(players[i].airdropbuffer); SYNC(players[i].airdropflags); RSYNC(players[i].shieldtracer);