From 10c625b42ebdf2736a27d54d89bbe05bae0f8f2a Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 18 Mar 2020 02:38:02 -0400 Subject: [PATCH] Start on flame shield rework --- src/d_player.h | 1 + src/dehacked.c | 1 + src/k_kart.c | 94 ++++++++++++++++++++++++++++++-------------------- 3 files changed, 58 insertions(+), 38 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 63e6dd397..8414cd81d 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -319,6 +319,7 @@ typedef enum k_bubblecool, // Bubble Shield use cooldown k_bubbleblowup, // Bubble Shield usage blowup k_flamedash, // Flame Shield dash power + k_flamemeter, // Flame Shield dash meter left k_eggmanheld, // Eggman monitor held, separate from k_itemheld so it doesn't stop you from getting items k_eggmanexplode, // Fake item recieved, explode in a few seconds k_eggmanblame, // Fake item recieved, who set this fake diff --git a/src/dehacked.c b/src/dehacked.c index fdf2ddd3a..39744f7a0 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8529,6 +8529,7 @@ static const char *const KARTSTUFF_LIST[] = { "BUBBLECOOL", "BUBBLEBLOWUP", "FLAMEDASH", + "FLAMEMETER", "EGGMANHELD", "EGGMANEXPLODE", "EGGMANBLAME", diff --git a/src/k_kart.c b/src/k_kart.c index 0574a15ce..adbdf6836 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2283,10 +2283,7 @@ static void K_GetKartBoostPower(player_t *player) ADDBOOST((3*FRACUNIT)/8, 3*FRACUNIT); // + 37.5% top speed, + 300% acceleration if (player->kartstuff[k_flamedash]) // Flame Shield dash - { - fixed_t dashval = ((player->kartstuff[k_flamedash]<kartstuff[k_startboost]) // Startup Boost ADDBOOST(FRACUNIT/4, 6*FRACUNIT); // + 25% top speed, + 600% acceleration @@ -2298,7 +2295,7 @@ static void K_GetKartBoostPower(player_t *player) ADDBOOST(FRACUNIT/5, 4*FRACUNIT); // + 20% top speed, + 400% acceleration if (player->kartstuff[k_eggmanexplode]) // Ready-to-explode - ADDBOOST(FRACUNIT/5, 2*FRACUNIT); // + 20% top speed, + 200% acceleration + ADDBOOST(FRACUNIT/5, FRACUNIT); // + 20% top speed, + 100% acceleration if (player->kartstuff[k_draftpower] > 0) // Drafting { @@ -5620,6 +5617,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_levelbooster]) player->kartstuff[k_levelbooster]--; + if (player->kartstuff[k_flamedash]) + player->kartstuff[k_flamedash]--; + if (EITHERSNEAKER(player) && player->kartstuff[k_wipeoutslow] > 0 && player->kartstuff[k_wipeoutslow] < wipeoutslowtime+1) player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1; @@ -5764,12 +5764,10 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->kartstuff[k_bubblecool] = 0; } - if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD - || player->exiting || player->kartstuff[k_spinouttimer] || player->kartstuff[k_squishedtimer]) + if (player->kartstuff[k_itemtype] != KITEM_FLAMESHIELD || player->exiting) { if (player->kartstuff[k_flamedash]) K_FlameShieldPop(player->mo); - player->kartstuff[k_flamedash] = 0; } if (player->kartstuff[k_comebacktimer]) @@ -5922,14 +5920,6 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) if (player->spectator) return turnvalue; - if (player->kartstuff[k_flamedash]) // Reduce turning - { - fixed_t dashval = ((player->kartstuff[k_flamedash]< FRACUNIT) - return 0; // NO MORE TURNING! - turnvalue = FixedMul(turnvalue, FRACUNIT-dashval); - } - if (player->kartstuff[k_drift] != 0 && P_IsObjectOnGround(player->mo)) { // If we're drifting we have a completely different turning value @@ -6776,35 +6766,36 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (!HOLDING_ITEM && NO_HYUDORO) { + INT32 flamemax = 16 * (TICRATE/4); + if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_holdready]) { + if (player->kartstuff[k_flamemeter] > flamemax) + player->kartstuff[k_flamemeter] = flamemax; + if (player->kartstuff[k_flamedash] == 0) K_PlayBoostTaunt(player->mo); - player->kartstuff[k_flamedash]++; + player->kartstuff[k_flamedash] += 2; - if (player->kartstuff[k_flamedash] > 10*TICRATE) + if (player->kartstuff[k_flamemeter] <= 0) { K_FlameShieldPop(player->mo); - player->kartstuff[k_flamedash] = 0; - player->kartstuff[k_holdready] = 0; - player->kartstuff[k_itemamount]--; - } - } - else - { - if (player->kartstuff[k_flamedash] > (TICRATE*2)) - { - K_FlameShieldPop(player->mo); - player->kartstuff[k_flamedash] = 0; + player->kartstuff[k_flamemeter] = flamemax; player->kartstuff[k_holdready] = 0; player->kartstuff[k_itemamount]--; } else - { - player->kartstuff[k_flamedash] = 0; - player->kartstuff[k_holdready] = 1; - } + player->kartstuff[k_flamemeter] -= 2; + } + else + { + player->kartstuff[k_holdready] = 1; + + if (player->kartstuff[k_flamemeter] > flamemax || player->kartstuff[k_flamemeter] == 0) + player->kartstuff[k_flamemeter] = flamemax; + else if (player->kartstuff[k_flamemeter] < flamemax) + player->kartstuff[k_flamemeter]++; } } break; @@ -7466,6 +7457,9 @@ static patch_t *kp_check[6]; static patch_t *kp_eggnum[4]; +static patch_t *kp_flameshieldmeter[104]; +static patch_t *kp_flameshieldmeter_bg; + static patch_t *kp_fpview[3]; static patch_t *kp_inputwheel[5]; @@ -7674,6 +7668,17 @@ void K_LoadKartHUDGraphics(void) kp_kitchensink[0] = W_CachePatchName("K_ITSINK", PU_HUDGFX); kp_sadface[0] = W_CachePatchName("K_ITSAD", PU_HUDGFX); + kp_flameshieldmeter_bg = W_CachePatchName("FSMBG001", PU_HUDGFX); + + sprintf(buffer, "FSMFGxxx"); + for (i = 0; i < 104; i++) + { + buffer[5] = '0'+((i+1)/100); + buffer[6] = '0'+(((i+1)/10)%10); + buffer[7] = '0'+((i+1)%10); + kp_flameshieldmeter[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } + // Splitscreen kp_itembg[2] = W_CachePatchName("K_ISBG", PU_HUDGFX); kp_itembg[3] = W_CachePatchName("K_ISBGD", PU_HUDGFX); @@ -8230,15 +8235,11 @@ static void K_drawKartItem(void) localbg = kp_itembg[offset+1]; break; case KITEM_BUBBLESHIELD: - localpatch = kp_bubbleshield[offset]; localbg = kp_itembg[offset+1]; break; case KITEM_FLAMESHIELD: - if (stplyr->kartstuff[k_flamedash] > (TICRATE*2) && (leveltime & 1)) - localpatch = kp_nodraw; - else - localpatch = kp_flameshield[offset]; + localpatch = kp_flameshield[offset]; localbg = kp_itembg[offset+1]; break; case KITEM_HYUDORO: @@ -8355,6 +8356,23 @@ static void K_drawKartItem(void) // Quick Eggman numbers if (stplyr->kartstuff[k_eggmanexplode] > 1 /*&& stplyr->kartstuff[k_eggmanexplode] <= 3*TICRATE*/) V_DrawScaledPatch(fx+17, fy+13-offset, V_HUDTRANS|fflags, kp_eggnum[min(3, G_TicsToSeconds(stplyr->kartstuff[k_eggmanexplode]))]); + + if (stplyr->kartstuff[k_itemtype] == KITEM_FLAMESHIELD) + { + INT32 flamemax = 16 * (TICRATE/4); + INT32 numframes = 104; + INT32 f = (stplyr->kartstuff[k_flamemeter] * numframes) / flamemax; + + if (f < 1) + f = 1; + if (f > numframes) + f = numframes; + + V_DrawScaledPatch(fx-6, fy-4, V_HUDTRANS|fflags, kp_flameshieldmeter_bg); + + if (stplyr->kartstuff[k_flamemeter] < flamemax) + V_DrawScaledPatch(fx-6, fy-4, V_HUDTRANS|fflags, kp_flameshieldmeter[f-1]); + } } void K_drawKartTimestamp(tic_t drawtime, INT32 TX, INT32 TY, INT16 emblemmap, UINT8 mode)