From 67d4f961543e83e08a9405f921f5adafb3586dbf Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 1 May 2022 15:20:58 -0700 Subject: [PATCH 01/25] Give 1.5x speed to karma bombs --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 7c8628176..c2ced6b11 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3159,6 +3159,9 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower, boolean dorubberb const boolean mobjValid = (player->mo != NULL && P_MobjWasRemoved(player->mo) == false); fixed_t finalspeed = K_GetKartSpeedFromStat(player->kartspeed); + if (gametyperules & GTR_BUMPERS && player->bumpers <= 0) + finalspeed = 3 * finalspeed / 2; + if (player->spheres > 0) { fixed_t sphereAdd = (FRACUNIT/80); // 50% at max From 74841257ad7504c58328ce723813bc678902380e Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 1 May 2022 15:32:54 -0700 Subject: [PATCH 02/25] Add K_DoInvincibility --- src/k_kart.c | 43 ++++++++++++++++++++++++------------------- src/k_kart.h | 1 + 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index c2ced6b11..b6dc1fc18 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5741,6 +5741,29 @@ static void K_ThrowLandMine(player_t *player) throwmo->movecount = 0; // above player } +void K_DoInvincibility(player_t *player) +{ + if (!player->invincibilitytimer) + { + mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INVULNFLASH); + P_SetTarget(&overlay->target, player->mo); + overlay->destscale = player->mo->scale; + P_SetScale(overlay, player->mo->scale); + } + player->invincibilitytimer += itemtime+(2*TICRATE); // 10 seconds + + if (P_IsLocalPlayer(player) == true) + { + S_ChangeMusicSpecial("kinvnc"); + } + else //used to be "if (P_IsDisplayPlayer(player) == false)" + { + S_StartSound(player->mo, (cv_kartinvinsfx.value ? sfx_alarmi : sfx_kinvnc)); + } + + P_RestoreMusic(player); +} + void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source) { mobj_t *cachenext; @@ -9662,25 +9685,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) case KITEM_INVINCIBILITY: if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) // Doesn't hold your item slot hostage normally, so you're free to waste it if you have multiple { - if (!player->invincibilitytimer) - { - mobj_t *overlay = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_INVULNFLASH); - P_SetTarget(&overlay->target, player->mo); - overlay->destscale = player->mo->scale; - P_SetScale(overlay, player->mo->scale); - } - player->invincibilitytimer += itemtime+(2*TICRATE); // 10 seconds - - if (P_IsLocalPlayer(player) == true) - { - S_ChangeMusicSpecial("kinvnc"); - } - else //used to be "if (P_IsDisplayPlayer(player) == false)" - { - S_StartSound(player->mo, (cv_kartinvinsfx.value ? sfx_alarmi : sfx_kinvnc)); - } - - P_RestoreMusic(player); + K_DoInvincibility(player); K_PlayPowerGloatSound(player->mo); player->itemamount--; } diff --git a/src/k_kart.h b/src/k_kart.h index aaaf7f26f..bf53d7295 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -92,6 +92,7 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, void K_PuntMine(mobj_t *mine, mobj_t *punter); void K_DoSneaker(player_t *player, INT32 type); void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound); +void K_DoInvincibility(player_t *player); void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source); void K_UpdateHnextList(player_t *player, boolean clean); void K_DropHnextList(player_t *player, boolean keepshields); From 39dd77af5e3dca6d402673166d2eb0eb71ae63f6 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 1 May 2022 15:33:43 -0700 Subject: [PATCH 03/25] Give invincibility when coming back from karma bomb --- src/k_kart.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index b6dc1fc18..8d5905866 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3807,6 +3807,8 @@ void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers) if (player->bumpers > 0 && prevBumpers == 0) { + K_DoInvincibility(player); + if (netgame) { CONS_Printf(M_GetText("%s is back in the game!\n"), player_names[player-players]); From 0c1afe29cb8cf225bef7e9c737bc1323aa9c710a Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 1 May 2022 15:37:22 -0700 Subject: [PATCH 04/25] Max flame shield meter in Battle --- src/k_kart.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8d5905866..80d65ad3b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8985,9 +8985,10 @@ static INT32 K_FlameShieldMax(player_t *player) disttofinish = players[i].distancetofinish; } - if (numplayers <= 1) + if (numplayers <= 1 || gametype == GT_BATTLE) { return 16; // max when alone, for testing + // and when in battle, for chaos } else if (player->position == 1) { From fc970336f7fa71b71df099e2960abd4122dd3945 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 1 May 2022 15:42:08 -0700 Subject: [PATCH 05/25] Readjust Battle item odds --- src/k_kart.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 80d65ad3b..52779a1d3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -387,32 +387,32 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] = //P-Odds 0 1 /*Sneaker*/ { 2, 1 }, // Sneaker /*Rocket Sneaker*/ { 0, 0 }, // Rocket Sneaker - /*Invincibility*/ { 2, 1 }, // Invincibility - /*Banana*/ { 1, 0 }, // Banana + /*Invincibility*/ { 4, 1 }, // Invincibility + /*Banana*/ { 0, 0 }, // Banana /*Eggman Monitor*/ { 1, 0 }, // Eggman Monitor /*Orbinaut*/ { 8, 0 }, // Orbinaut /*Jawz*/ { 8, 1 }, // Jawz /*Mine*/ { 6, 1 }, // Mine - /*Land Mine*/ { 0, 0 }, // Land Mine + /*Land Mine*/ { 2, 0 }, // Land Mine /*Ballhog*/ { 2, 1 }, // Ballhog /*Self-Propelled Bomb*/ { 0, 0 }, // Self-Propelled Bomb /*Grow*/ { 2, 1 }, // Grow /*Shrink*/ { 0, 0 }, // Shrink /*Lightning Shield*/ { 4, 0 }, // Lightning Shield /*Bubble Shield*/ { 1, 0 }, // Bubble Shield - /*Flame Shield*/ { 0, 0 }, // Flame Shield + /*Flame Shield*/ { 1, 0 }, // Flame Shield /*Hyudoro*/ { 2, 0 }, // Hyudoro - /*Pogo Spring*/ { 2, 0 }, // Pogo Spring + /*Pogo Spring*/ { 0, 0 }, // Pogo Spring /*Super Ring*/ { 0, 0 }, // Super Ring /*Kitchen Sink*/ { 0, 0 }, // Kitchen Sink - /*Drop Target*/ { 0, 0 }, // Drop Target + /*Drop Target*/ { 2, 0 }, // Drop Target /*Sneaker x2*/ { 0, 0 }, // Sneaker x2 - /*Sneaker x3*/ { 1, 1 }, // Sneaker x3 - /*Banana x3*/ { 1, 0 }, // Banana x3 + /*Sneaker x3*/ { 0, 1 }, // Sneaker x3 + /*Banana x3*/ { 0, 0 }, // Banana x3 /*Banana x10*/ { 1, 1 }, // Banana x10 /*Orbinaut x3*/ { 2, 0 }, // Orbinaut x3 /*Orbinaut x4*/ { 1, 1 }, // Orbinaut x4 - /*Jawz x2*/ { 2, 1 } // Jawz x2 + /*Jawz x2*/ { 5, 1 } // Jawz x2 }; #define DISTVAR (2048) // Magic number distance for use with item roulette tiers From e360270b13ca3139e741c2679c56e7d902a76710 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 1 May 2022 16:11:40 -0700 Subject: [PATCH 06/25] Add MT_POGOSPRING, orange spring --- src/deh_tables.c | 7 +++++++ src/info.c | 33 +++++++++++++++++++++++++++++++++ src/info.h | 7 +++++++ src/p_mobj.c | 4 ++++ 4 files changed, 51 insertions(+) diff --git a/src/deh_tables.c b/src/deh_tables.c index 9a733141f..cc4369665 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -2541,6 +2541,12 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_GREYSPRING3", "S_GREYSPRING4", + // Orange Spring (Pogo) + "S_POGOSPRING1", + "S_POGOSPRING2", + "S_POGOSPRING3", + "S_POGOSPRING4", + // Yellow Diagonal Spring "S_YDIAG1", "S_YDIAG2", @@ -4631,6 +4637,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_REDSPRING", "MT_BLUESPRING", "MT_GREYSPRING", + "MT_POGOSPRING", "MT_YELLOWDIAG", // Yellow Diagonal Spring "MT_REDDIAG", // Red Diagonal Spring "MT_BLUEDIAG", // Blue Diagonal Spring diff --git a/src/info.c b/src/info.c index 78181c2e7..2ab293c11 100644 --- a/src/info.c +++ b/src/info.c @@ -3072,6 +3072,12 @@ state_t states[NUMSTATES] = {SPR_SPVG, 0, 1, {NULL}, 0, 0, S_GREYSPRING4}, // S_GREYSPRING3 {SPR_SPVG, 2, 4, {NULL}, 0, 0, S_GREYSPRING1}, // S_GREYSPRING4 + // Orange Spring (Pogo) + {SPR_SPVB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_POGOSPRING1 + {SPR_SPVB, 1, 1, {A_Pain}, 0, 0, S_POGOSPRING3}, // S_POGOSPRING2 + {SPR_SPVB, 0, 1, {NULL}, 0, 0, S_POGOSPRING4}, // S_POGOSPRING3 + {SPR_SPVB, 2, 4, {NULL}, 0, 0, S_POGOSPRING1}, // S_POGOSPRING4 + // Yellow Diagonal Spring {SPR_SPDY, 0, -1, {NULL}, 0, 0, S_NULL}, // S_YDIAG1 {SPR_SPDY, 1, 1, {A_Pain}, 0, 0, S_YDIAG3}, // S_YDIAG2 @@ -8236,6 +8242,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_GREYSPRING2 // raisestate }, + { // MT_POGOSPRING + -1, // doomednum + S_POGOSPRING1, // spawnstate + 1000, // spawnhealth + S_POGOSPRING2, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + SKINCOLOR_SUNSLAM, // painchance + sfx_s3kb1, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 48*FRACUNIT, // radius + 32*FRACUNIT, // height + 0, // display offset + 32*FRACUNIT, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPRING|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + S_POGOSPRING2 // raisestate + }, + { // MT_YELLOWDIAG 554, // doomednum S_YDIAG1, // spawnstate diff --git a/src/info.h b/src/info.h index 54aa9eaec..232bfbc77 100644 --- a/src/info.h +++ b/src/info.h @@ -3529,6 +3529,12 @@ typedef enum state S_GREYSPRING3, S_GREYSPRING4, + // Orange Spring (Pogo) + S_POGOSPRING1, + S_POGOSPRING2, + S_POGOSPRING3, + S_POGOSPRING4, + // Yellow Diagonal Spring S_YDIAG1, S_YDIAG2, @@ -5656,6 +5662,7 @@ typedef enum mobj_type MT_REDSPRING, MT_BLUESPRING, MT_GREYSPRING, + MT_POGOSPRING, MT_YELLOWDIAG, // Yellow Diagonal Spring MT_REDDIAG, // Red Diagonal Spring MT_BLUEDIAG, // Blue Diagonal Spring diff --git a/src/p_mobj.c b/src/p_mobj.c index 49d5d16b6..2e3643512 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10013,6 +10013,10 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) mobj->color = BALLOONCOLORS[P_RandomKey(sizeof(BALLOONCOLORS))]; } break; + case MT_POGOSPRING: + mobj->color = SKINCOLOR_SUNSLAM; + mobj->colorized = true; + break; case MT_KART_LEFTOVER: mobj->color = SKINCOLOR_RED; break; From fda4679aa89027190da684bcc5601392ea49d7e5 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 1 May 2022 17:10:44 -0700 Subject: [PATCH 07/25] Add sfx_eggspr --- src/sounds.c | 1 + src/sounds.h | 1 + 2 files changed, 2 insertions(+) diff --git a/src/sounds.c b/src/sounds.c index 761fa109c..7cbc0e8c0 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -1102,6 +1102,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"kstart", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Sonic Adventure shwing! {"typri1", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SA2 boss typewriting 1 {"typri2", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // SA2 final boss-type typewriting + {"eggspr", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Sonic Unleashed Trap Spring // SRB2Kart - Drop target sounds {"kdtrg1", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, // Low energy, SF_X8AWAYSOUND diff --git a/src/sounds.h b/src/sounds.h index 336cd8b74..6d1c51f57 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -1166,6 +1166,7 @@ typedef enum sfx_kstart, sfx_typri1, sfx_typri2, + sfx_eggspr, // SRB2Kart - Drop target sounds sfx_kdtrg1, From 4fb0dfa9c055f1b8b5294ca48d17563cc002ccd0 Mon Sep 17 00:00:00 2001 From: James R Date: Sun, 1 May 2022 17:24:56 -0700 Subject: [PATCH 08/25] New pogospring behavior Spawns a spring under you. First bounce gives you trick air time, subsequent bounces give you tumble. --- src/deh_tables.c | 1 + src/info.c | 7 ++++--- src/info.h | 1 + src/k_kart.c | 7 +++---- src/p_map.c | 32 ++++++++++++++++++++++++++++++-- 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index cc4369665..2796b23dc 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -2544,6 +2544,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi // Orange Spring (Pogo) "S_POGOSPRING1", "S_POGOSPRING2", + "S_POGOSPRING2B", "S_POGOSPRING3", "S_POGOSPRING4", diff --git a/src/info.c b/src/info.c index 2ab293c11..378a7ddd8 100644 --- a/src/info.c +++ b/src/info.c @@ -3075,6 +3075,7 @@ state_t states[NUMSTATES] = // Orange Spring (Pogo) {SPR_SPVB, 0, -1, {NULL}, 0, 0, S_NULL}, // S_POGOSPRING1 {SPR_SPVB, 1, 1, {A_Pain}, 0, 0, S_POGOSPRING3}, // S_POGOSPRING2 + {SPR_SPVB, 1, 1, {A_PlaySeeSound}, 0, 0, S_POGOSPRING3}, // S_POGOSPRING2B {SPR_SPVB, 0, 1, {NULL}, 0, 0, S_POGOSPRING4}, // S_POGOSPRING3 {SPR_SPVB, 2, 4, {NULL}, 0, 0, S_POGOSPRING1}, // S_POGOSPRING4 @@ -8246,9 +8247,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = -1, // doomednum S_POGOSPRING1, // spawnstate 1000, // spawnhealth - S_POGOSPRING2, // seestate - sfx_None, // seesound - 8, // reactiontime + S_POGOSPRING2B, // seestate + sfx_eggspr, // seesound + 0, // reactiontime sfx_None, // attacksound S_NULL, // painstate SKINCOLOR_SUNSLAM, // painchance diff --git a/src/info.h b/src/info.h index 232bfbc77..a0447fd03 100644 --- a/src/info.h +++ b/src/info.h @@ -3532,6 +3532,7 @@ typedef enum state // Orange Spring (Pogo) S_POGOSPRING1, S_POGOSPRING2, + S_POGOSPRING2B, S_POGOSPRING3, S_POGOSPRING4, diff --git a/src/k_kart.c b/src/k_kart.c index 52779a1d3..1f52f3f6d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -402,7 +402,7 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] = /*Bubble Shield*/ { 1, 0 }, // Bubble Shield /*Flame Shield*/ { 1, 0 }, // Flame Shield /*Hyudoro*/ { 2, 0 }, // Hyudoro - /*Pogo Spring*/ { 0, 0 }, // Pogo Spring + /*Pogo Spring*/ { 1, 0 }, // Pogo Spring /*Super Ring*/ { 0, 0 }, // Super Ring /*Kitchen Sink*/ { 0, 0 }, // Kitchen Sink /*Drop Target*/ { 2, 0 }, // Drop Target @@ -10124,9 +10124,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (ATTACK_IS_DOWN && !HOLDING_ITEM && onground && NO_HYUDORO && player->trickpanel == 0) { K_PlayBoostTaunt(player->mo); - K_DoPogoSpring(player->mo, 32<trickpanel = 1; - player->pflags |= PF_TRICKDELAY; + //K_DoPogoSpring(player->mo, 32<mo, 0, 0, 0, MT_POGOSPRING); player->itemamount--; } break; diff --git a/src/p_map.c b/src/p_map.c index 473ded5fe..beb2b23d3 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -301,6 +301,7 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) UINT16 starcolor = (spring->info->painchance % numskincolors); fixed_t savemomx = 0; fixed_t savemomy = 0; + statenum_t raisestate = spring->info->raisestate; // Object was already sprung this tic if (object->eflags & MFE_SPRUNG) @@ -412,8 +413,6 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) // Re-solidify spring->flags |= (spring->info->flags & (MF_SPRING|MF_SPECIAL)); - P_SetMobjState(spring, spring->info->raisestate); - if (object->player) { if (spring->flags & MF_ENEMY) // Spring shells @@ -444,8 +443,37 @@ boolean P_DoSpring(mobj_t *spring, mobj_t *object) { object->player->tiregrease = greasetics; } + + if (spring->type == MT_POGOSPRING) + { + if (spring->reactiontime == 0) + { + object->player->tricktime = 0; // Reset post-hitlag timer + // Setup the boost for potential upwards trick, at worse, make it your regular max speed. (boost = curr speed*1.25) + object->player->trickboostpower = max(FixedDiv(object->player->speed, K_GetKartSpeed(object->player, false, false)) - FRACUNIT, 0)*125/100; + //CONS_Printf("Got boost: %d%\n", mo->player->trickboostpower*100 / FRACUNIT); + object->player->trickpanel = 1; + object->player->pflags |= PF_TRICKDELAY; + } + else + { + raisestate = spring->info->seestate; + + object->player->tumbleBounces = 1; + object->player->pflags &= ~PF_TUMBLESOUND; + object->player->tumbleHeight = 50; + P_SetPlayerMobjState(object->player->mo, S_KART_SPINOUT); + + // FIXME: try to compensate tumbling gravity + object->momz = 3 * object->momz / 2; + } + + spring->reactiontime++; + } } + P_SetMobjState(spring, raisestate); + return true; } From eac2aea0825f4aafb4a9b41c44db2275e14bdc91 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 3 May 2022 21:34:33 -0700 Subject: [PATCH 09/25] Add 2 seconds instead of 5 upon Invincibility hit, in Battle --- src/p_inter.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 4689847be..83a6eb83c 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1833,7 +1833,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da boolean force = false; INT32 laglength = 6; - INT32 kinvextend = 0; if (objectplacing) return false; @@ -2006,9 +2005,14 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da // Extend the invincibility if the hit was a direct hit. if (inflictor == source && source->player->invincibilitytimer) { - kinvextend = (source->player->invincibilitytimer)+5*TICRATE; - //CONS_Printf("extend k_invincibilitytimer for %s - old value %d new value %d\n", player_names[source->player - players], source->player->invincibilitytimer/TICRATE, kinvextend/TICRATE); - source->player->invincibilitytimer = kinvextend; + tic_t kinvextend; + + if (gametype == GT_BATTLE) + kinvextend = 2*TICRATE; + else + kinvextend = 5*TICRATE; + + source->player->invincibilitytimer += kinvextend; } K_PlayHitEmSound(source, target); From 6402ced5dca3d939eeb2edfdf9a538184c417de1 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 14:34:45 -0700 Subject: [PATCH 10/25] Get 8 seconds of invincibility instead of 10 from karma comeback --- src/k_kart.c | 9 +++++---- src/k_kart.h | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 1f52f3f6d..d4d6dd099 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3807,7 +3807,7 @@ void K_HandleBumperChanges(player_t *player, UINT8 prevBumpers) if (player->bumpers > 0 && prevBumpers == 0) { - K_DoInvincibility(player); + K_DoInvincibility(player, 8 * TICRATE); if (netgame) { @@ -5743,7 +5743,7 @@ static void K_ThrowLandMine(player_t *player) throwmo->movecount = 0; // above player } -void K_DoInvincibility(player_t *player) +void K_DoInvincibility(player_t *player, tic_t time) { if (!player->invincibilitytimer) { @@ -5752,7 +5752,8 @@ void K_DoInvincibility(player_t *player) overlay->destscale = player->mo->scale; P_SetScale(overlay, player->mo->scale); } - player->invincibilitytimer += itemtime+(2*TICRATE); // 10 seconds + + player->invincibilitytimer += time; if (P_IsLocalPlayer(player) == true) { @@ -9688,7 +9689,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) case KITEM_INVINCIBILITY: if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO) // Doesn't hold your item slot hostage normally, so you're free to waste it if you have multiple { - K_DoInvincibility(player); + K_DoInvincibility(player, 10 * TICRATE); K_PlayPowerGloatSound(player->mo); player->itemamount--; } diff --git a/src/k_kart.h b/src/k_kart.h index bf53d7295..767f7e3ca 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -92,7 +92,7 @@ mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t mapthing, void K_PuntMine(mobj_t *mine, mobj_t *punter); void K_DoSneaker(player_t *player, INT32 type); void K_DoPogoSpring(mobj_t *mo, fixed_t vertispeed, UINT8 sound); -void K_DoInvincibility(player_t *player); +void K_DoInvincibility(player_t *player, tic_t time); void K_KillBananaChain(mobj_t *banana, mobj_t *inflictor, mobj_t *source); void K_UpdateHnextList(player_t *player, boolean clean); void K_DropHnextList(player_t *player, boolean keepshields); From 8d708c9ea89f19fcacf96abbcc8a9d43960b67d6 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 14:52:50 -0700 Subject: [PATCH 11/25] Increase pogo spring item odds in Battle --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index d4d6dd099..cf2da42d4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -402,7 +402,7 @@ static INT32 K_KartItemOddsBattle[NUMKARTRESULTS][2] = /*Bubble Shield*/ { 1, 0 }, // Bubble Shield /*Flame Shield*/ { 1, 0 }, // Flame Shield /*Hyudoro*/ { 2, 0 }, // Hyudoro - /*Pogo Spring*/ { 1, 0 }, // Pogo Spring + /*Pogo Spring*/ { 3, 0 }, // Pogo Spring /*Super Ring*/ { 0, 0 }, // Super Ring /*Kitchen Sink*/ { 0, 0 }, // Kitchen Sink /*Drop Target*/ { 2, 0 }, // Drop Target From 0441990abdfb190eff078fbcb8cf36259c8f9c8a Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 14:56:17 -0700 Subject: [PATCH 12/25] x1.5 size pogospring --- src/p_mobj.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_mobj.c b/src/p_mobj.c index 2e3643512..05c6e0bd0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10014,6 +10014,7 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) } break; case MT_POGOSPRING: + P_SetScale(mobj, (mobj->destscale = 3 * mobj->destscale / 2)); mobj->color = SKINCOLOR_SUNSLAM; mobj->colorized = true; break; From c911ae51dda1a7b147e8bc4f823ad023ec3dc397 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 14:57:49 -0700 Subject: [PATCH 13/25] Remove acceleration buff from blue spheres --- src/k_kart.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index cf2da42d4..52e8199e3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3208,12 +3208,6 @@ fixed_t K_GetKartAccel(player_t *player) k_accel += 17 * (9 - player->kartspeed); // 121 - 257 - if (player->spheres > 0) - { - fixed_t sphereAdd = (FRACUNIT/10); // 500% at max - k_accel = FixedMul(k_accel, FRACUNIT + (sphereAdd * player->spheres)); - } - return FixedMul(k_accel, (FRACUNIT + player->accelboost) / 4); } From f2978c1bff1f525280b4811b9312cd7ff50bd0dd Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 15:08:19 -0700 Subject: [PATCH 14/25] Do not set scale twice in P_SpawnMobjFromMobj --- src/p_mobj.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 05c6e0bd0..85680ac47 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -13607,9 +13607,6 @@ mobj_t *P_SpawnMobjFromMobj(mobj_t *mobj, fixed_t xofs, fixed_t yofs, fixed_t zo newmobj->old_z2 = mobj->old_z2 + zofs; } - newmobj->destscale = mobj->destscale; - P_SetScale(newmobj, mobj->scale); - newmobj->old_x2 = mobj->old_x2 + xofs; newmobj->old_y2 = mobj->old_y2 + yofs; newmobj->old_x = mobj->old_x + xofs; From 2c1d8e86c876a5eb3a453f3fa27ad18e081c77b8 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 15:10:33 -0700 Subject: [PATCH 15/25] Add a shadow to pogospring --- src/p_mobj.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_mobj.c b/src/p_mobj.c index 85680ac47..5c78d9301 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9763,6 +9763,7 @@ static void P_DefaultMobjShadowScale(mobj_t *thing) case MT_BLUESPHERE: case MT_EMERALD: case MT_ITEMCAPSULE: + case MT_POGOSPRING: thing->shadowscale = FRACUNIT/2; break; case MT_DRIFTCLIP: From efaff6eb6feda03ce9d328b6631299783acf922b Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 15:23:24 -0700 Subject: [PATCH 16/25] Double top speed buff from blue spheres --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 52e8199e3..912cf2791 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3164,7 +3164,7 @@ fixed_t K_GetKartSpeed(player_t *player, boolean doboostpower, boolean dorubberb if (player->spheres > 0) { - fixed_t sphereAdd = (FRACUNIT/80); // 50% at max + fixed_t sphereAdd = (FRACUNIT/40); // 100% at max finalspeed = FixedMul(finalspeed, FRACUNIT + (sphereAdd * player->spheres)); } From c61afb540570b1c51d8c3098d1b809aa3cdde2e4 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 15:41:47 -0700 Subject: [PATCH 17/25] 4x tether leniency in Battle --- src/k_kart.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 912cf2791..c757a6f64 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1775,17 +1775,19 @@ static void K_UpdateDraft(player_t *player) draftdistance = FixedMul(draftdistance, K_GetKartGameSpeedScalar(gamespeed)); } + // On the contrary, the leniency period biases toward high weight. + // (See also: the leniency variable in K_SpawnDraftDust) + leniency = (3*TICRATE)/4 + ((player->kartweight-1) * (TICRATE/4)); + minDist = 640 * player->mo->scale; + if (gametype == GT_BATTLE) { // TODO: gametyperules minDist /= 4; + leniency *= 4; } - // On the contrary, the leniency period biases toward high weight. - // (See also: the leniency variable in K_SpawnDraftDust) - leniency = (3*TICRATE)/4 + ((player->kartweight-1) * (TICRATE/4)); - // Not enough speed to draft. if (player->speed >= 20*player->mo->scale) { From a4f14d301ed92ea57380f59d387172c11549868e Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 15:44:27 -0700 Subject: [PATCH 18/25] Finish c61afb540 --- src/k_kart.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index c757a6f64..37fb575a1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4726,6 +4726,9 @@ void K_SpawnDraftDust(mobj_t *mo) { UINT8 leniency = (3*TICRATE)/4 + ((mo->player->kartweight-1) * (TICRATE/4)); + if (gametype == GT_BATTLE) + leniency *= 4; + ang = mo->player->drawangle; if (mo->player->drift != 0) From 2d00384a4c34acd2a830c34f2cf92beefd2ddc66 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 17:25:40 -0700 Subject: [PATCH 19/25] 2x acceleration in karma bomb --- src/k_kart.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 37fb575a1..874156045 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3210,6 +3210,10 @@ fixed_t K_GetKartAccel(player_t *player) k_accel += 17 * (9 - player->kartspeed); // 121 - 257 + // karma bomb gets 2x acceleration + if (gametype == GT_BATTLE && player->bumpers <= 0) + k_accel *= 2; + return FixedMul(k_accel, (FRACUNIT + player->accelboost) / 4); } From 3a23c48be8ac9ae60ff6ede7d0f662421a006250 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 17:35:54 -0700 Subject: [PATCH 20/25] Build tether twice as fast in Battle --- src/k_kart.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 874156045..f04a65c4d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1867,6 +1867,13 @@ static void K_UpdateDraft(player_t *player) // Double speed for the rival! player->draftpower += add; } + + if (gametype == GT_BATTLE) + { + // TODO: gametyperules + // Double speed in Battle + player->draftpower += add; + } } if (player->draftpower > FRACUNIT) From e5a63b91ac506d753a6421a4f2e974891b324a98 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 17:46:58 -0700 Subject: [PATCH 21/25] 2x max tether distance --- src/k_kart.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/k_kart.c b/src/k_kart.c index f04a65c4d..a0072e5e5 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1785,6 +1785,7 @@ static void K_UpdateDraft(player_t *player) { // TODO: gametyperules minDist /= 4; + draftdistance *= 2; leniency *= 4; } From 9169538dd481d921a6e192f0d58621c382441a8a Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 19:12:15 -0700 Subject: [PATCH 22/25] Buff spindash in Battle 4x spindash boost 2x spindash initial thrust --- src/k_kart.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index a0072e5e5..ae4f18106 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2977,7 +2977,10 @@ fixed_t K_GetSpindashChargeSpeed(player_t *player) // more speed for higher weight & speed // Tails = +6.25%, Fang = +20.31%, Mighty = +20.31%, Metal = +25% // (can be higher than this value when overcharged) - return (player->kartspeed + player->kartweight) * (FRACUNIT/32); + const fixed_t val = (player->kartspeed + player->kartweight) * (FRACUNIT/32); + + // TODO: gametyperules + return (gametype == GT_BATTLE) ? (4 * val) : val; } @@ -9239,8 +9242,14 @@ static void K_KartSpindash(player_t *player) // if spindash was charged enough, give a small thrust. if (player->spindash >= SPINDASHTHRUSTTIME) { + fixed_t thrust = FixedMul(player->mo->scale, player->spindash*FRACUNIT/5); + + // TODO: gametyperules + if (gametype == GT_BATTLE) + thrust *= 2; + // Give a bit of a boost depending on charge. - P_InstaThrust(player->mo, player->mo->angle, FixedMul(player->mo->scale, player->spindash*FRACUNIT/5)); + P_InstaThrust(player->mo, player->mo->angle, thrust); } if (!player->tiregrease) From b9409ff052ec56a9503991e60f417e54a891b243 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 19:53:05 -0700 Subject: [PATCH 23/25] Flame shield clashes with invincibility and bigger players --- src/k_collide.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/k_collide.c b/src/k_collide.c index 306c01dd8..7b0854a01 100644 --- a/src/k_collide.c +++ b/src/k_collide.c @@ -856,6 +856,9 @@ boolean K_SMKIceBlockCollide(mobj_t *t1, mobj_t *t2) boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) { + const boolean flameT1 = (t1->player->flamedash > 0 && t1->player->itemtype == KITEM_FLAMESHIELD); + const boolean flameT2 = (t2->player->flamedash > 0 && t2->player->itemtype == KITEM_FLAMESHIELD); + boolean t1Condition = false; boolean t2Condition = false; boolean stungT1 = false; @@ -864,7 +867,12 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) t1Condition = (t1->scale > t2->scale + (mapobjectscale/8)) || (t1->player->invincibilitytimer > 0); t2Condition = (t2->scale > t1->scale + (mapobjectscale/8)) || (t2->player->invincibilitytimer > 0); - if (t1Condition == true && t2Condition == false) + if ((t1Condition == true || flameT1 == true) && (t2Condition == true || flameT2 == true)) + { + K_DoPowerClash(t1->player, t2->player); + return false; + } + else if (t1Condition == true && t2Condition == false) { P_DamageMobj(t2, t1, t1, 1, DMG_TUMBLE); return true; @@ -873,14 +881,11 @@ boolean K_PvPTouchDamage(mobj_t *t1, mobj_t *t2) { P_DamageMobj(t1, t2, t2, 1, DMG_TUMBLE); return true; - } else if (t1Condition == true && t2Condition == true) { - K_DoPowerClash(t1->player, t2->player); - return false; } // Flame Shield dash damage - t1Condition = (t1->player->flamedash > 0 && t1->player->itemtype == KITEM_FLAMESHIELD); - t2Condition = (t2->player->flamedash > 0 && t2->player->itemtype == KITEM_FLAMESHIELD); + t1Condition = flameT1; + t2Condition = flameT2; if (t1Condition == true && t2Condition == false) { From 1ccf04b4f27e71904b42b12c8f7f7fd7dc6d27b1 Mon Sep 17 00:00:00 2001 From: James R Date: Mon, 1 Aug 2022 19:53:30 -0700 Subject: [PATCH 24/25] Battle: flame shield builds meter fast and drains meter slow --- src/k_kart.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ae4f18106..b5e934ae0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10081,14 +10081,17 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if ((cmd->buttons & BT_ATTACK) && (player->pflags & PF_HOLDREADY)) { + // TODO: gametyperules + const INT32 incr = gametype == GT_BATTLE ? 4 : 2; + if (player->flamedash == 0) { S_StartSound(player->mo, sfx_s3k43); K_PlayBoostTaunt(player->mo); } - player->flamedash += 2; - player->flamemeter += 2; + player->flamedash += incr; + player->flamemeter += incr; if (!onground) { @@ -10115,8 +10118,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { player->pflags |= PF_HOLDREADY; - if (player->flamemeter > 0) - player->flamemeter--; + // TODO: gametyperules + if (gametype != GT_BATTLE || leveltime % 6 == 0) + { + if (player->flamemeter > 0) + player->flamemeter--; + } if (player->flamelength > destlen) { From d2c14331b2027d2aa3a060c4ab040a484c656cf7 Mon Sep 17 00:00:00 2001 From: James R Date: Wed, 3 Aug 2022 11:17:45 -0700 Subject: [PATCH 25/25] Reduce grow item time to 8 seconds in Battle --- src/k_kart.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index b5e934ae0..043507b92 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9957,7 +9957,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->mo->destscale = FixedMul(player->mo->destscale, SHRINK_SCALE); } - player->growshrinktimer = itemtime+(4*TICRATE); // 12 seconds + // TODO: gametyperules + player->growshrinktimer = (gametype == GT_BATTLE ? 8 : 12) * TICRATE; if (player->invincibilitytimer > 0) {