From 3f35ffd7c6d9a61d24d2d2fc78f099da74c73373 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 22 Nov 2018 23:38:54 -0500 Subject: [PATCH 01/22] Franticized items for 2nd place VS SPB'd 1st --- src/dehacked.c | 3 +++ src/doomstat.h | 1 + src/g_game.c | 1 + src/k_kart.c | 19 ++++++++++++------- src/p_mobj.c | 4 ++++ src/p_saveg.c | 2 ++ src/p_setup.c | 1 + src/p_user.c | 3 +++ 8 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index cfa08b45..27d531cc 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9770,6 +9770,9 @@ static inline int lib_getenum(lua_State *L) } else if (fastcmp(word,"thwompsactive")) { lua_pushboolean(L, thwompsactive); return 1; + } else if (fastcmp(word,"spbexists")) { + lua_pushboolean(L, spbexists); + return 1; } return 0; diff --git a/src/doomstat.h b/src/doomstat.h index 34456b32..aa2ebe31 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -461,6 +461,7 @@ extern tic_t indirectitemcooldown; extern tic_t mapreset; extern UINT8 nospectategrief; extern boolean thwompsactive; +extern boolean spbexists; extern boolean legitimateexit; extern boolean comebackshowninfo; diff --git a/src/g_game.c b/src/g_game.c index e9309b80..cba9d26c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -267,6 +267,7 @@ tic_t indirectitemcooldown; // Cooldown before any more Shrink, SPB, or any othe tic_t mapreset; // Map reset delay when enough players have joined an empty game UINT8 nospectategrief; // How many players need to be in-game to eliminate last; for preventing spectate griefing boolean thwompsactive; // Thwomps activate on lap 2 +boolean spbexists; // SPB exists, give 2nd place better items // Client-sided, unsynched variables (NEVER use in anything that needs to be synced with other players) boolean legitimateexit; // Did this client actually finish the match? diff --git a/src/k_kart.c b/src/k_kart.c index 8bd08e26..94fa3f32 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -574,8 +574,10 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem) player->kartstuff[k_itemtype] = KITEM_JAWZ; player->kartstuff[k_itemamount] = 2; break; - case KITEM_SPB: // Indirect items - case KITEM_SHRINK: + case KITEM_SPB: + spbexists = true; + /* FALLTHRU */ + case KITEM_SHRINK: // Indirect items indirectitemcooldown = 30*TICRATE; /* FALLTHRU */ default: @@ -599,7 +601,7 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem) \return void */ -static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) +static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean insecondplace) { const INT32 distvar = (64*14); INT32 newodds; @@ -648,13 +650,16 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) // POWERITEMODDS handles all of the "frantic item" related functionality, for all of our powerful items. // First, it multiplies it by 2 if franticitems is true; easy-peasy. - // Then, it multiplies it further if there's less than 5 players in game. + // Next, it multiplies it again if it's in SPB mode and 2nd needs to apply pressure to 1st. + // Then, it multiplies it further if there's less than 8 players in game. // This is done to make low player count races more fair & interesting. (1v1s are basically the same as franticitems false in a normal race) // Lastly, it *divides* it by your mashed value, which was determined in K_KartItemRoulette, to punish those who are impatient. // The last two are very fractional and complicated, very sorry! #define POWERITEMODDS(odds) \ if (franticitems) \ odds *= 2; \ + if (spbexists && insecondplace) \ + odds *= 2; \ if (pingame < 8 && !G_BattleGametype()) \ odds = FixedMul(odds*FRACUNIT, FRACUNIT+min((8-pingame)*(FRACUNIT/25), FRACUNIT))/FRACUNIT; \ if (mashed > 0) \ @@ -782,7 +787,7 @@ static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT3 for (j = 0; j < NUMKARTRESULTS; j++) { - if (K_KartGetItemOdds(i, j, mashed) > 0) + if (K_KartGetItemOdds(i, j, mashed, (player->kartstuff[k_position] == 2)) > 0) { available = true; break; @@ -974,7 +979,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) useodds = K_FindUseodds(player, mashed, pingame, bestbumper); #define SETITEMRESULT(itemnum) \ - for (chance = 0; chance < K_KartGetItemOdds(useodds, itemnum, mashed); chance++) \ + for (chance = 0; chance < K_KartGetItemOdds(useodds, itemnum, mashed, (player->kartstuff[k_position] == 2)); chance++) \ spawnchance[numchoices++] = itemnum for (i = 1; i < NUMKARTRESULTS; i++) @@ -7811,7 +7816,7 @@ static void K_drawDistributionDebugger(void) for (i = 1; i < NUMKARTRESULTS; i++) { - const INT32 itemodds = K_KartGetItemOdds(useodds, i, 0); + const INT32 itemodds = K_KartGetItemOdds(useodds, i, 0, (stplyr->kartstuff[k_position] == 2)); if (itemodds <= 0) continue; diff --git a/src/p_mobj.c b/src/p_mobj.c index 2cb12791..ba0a0c11 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8155,6 +8155,7 @@ void P_MobjThinker(mobj_t *mobj) break; case MT_SPB: indirectitemcooldown = 30*TICRATE; + spbexists = true; /* FALLTHRU */ case MT_BALLHOG: P_SpawnGhostMobj(mobj)->fuse = 3; @@ -10378,6 +10379,9 @@ void P_RemoveMobj(mobj_t *mobj) if (mobj->type == MT_SHADOW) P_RemoveShadow(mobj); + if (mobj->type == MT_SPB) + spbexists = false; + mobj->health = 0; // Just because // unlink from sector and block lists diff --git a/src/p_saveg.c b/src/p_saveg.c index 1b4314b8..44731000 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3287,6 +3287,7 @@ static void P_NetArchiveMisc(void) WRITEUINT32(save_p, mapreset); WRITEUINT8(save_p, nospectategrief); WRITEUINT8(save_p, thwompsactive); + WRITEUINT8(save_p, spbexists); // Is it paused? if (paused) @@ -3393,6 +3394,7 @@ static inline boolean P_NetUnArchiveMisc(void) mapreset = READUINT32(save_p); nospectategrief = READUINT8(save_p); thwompsactive = (boolean)READUINT8(save_p); + spbexists = (boolean)READUINT8(save_p); // Is it paused? if (READUINT8(save_p) == 0x2f) diff --git a/src/p_setup.c b/src/p_setup.c index 68cdc797..fa8e263c 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3046,6 +3046,7 @@ boolean P_SetupLevel(boolean skipprecip) mapreset = 0; nospectategrief = 0; thwompsactive = false; + spbexists = false; // clear special respawning que iquehead = iquetail = 0; diff --git a/src/p_user.c b/src/p_user.c index b2849c85..d17a7c80 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7758,7 +7758,10 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius) } if (mo->type == MT_SPB) // If you destroy a SPB, you don't get the luxury of a cooldown. + { + spbexists = false; indirectitemcooldown = 0; + } if (mo == inflictor) // Don't nuke yourself, dummy! continue; From e265d910d3cd523028a58980955c74ac3ab49621 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 23 Nov 2018 19:15:14 -0500 Subject: [PATCH 02/22] Item roulette fun-times - Colorize items, Combi-Catcher style, while the roulette is still going. Nice Chaotix reference, and tells you when the game's just lagged. - Items blink when you first get them! They blink white when you wait out the whole roulette, red when you mash, or rainbow for enhanced items! Blinking prevents items from being stolen too, so items can't be literally stolen before you even have a chance to see what it was. - New item roulette sound for mashing - Fix TC_ limits in Lua --- src/d_player.h | 4 + src/dehacked.c | 3 + src/k_kart.c | 222 +++++++++++++++++++++++++++++++++++++---------- src/lua_hudlib.c | 4 +- src/r_draw.c | 2 + src/r_draw.h | 1 + src/sounds.c | 1 + src/sounds.h | 1 + 8 files changed, 191 insertions(+), 47 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index a5907646..c8743717 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -348,6 +348,10 @@ typedef enum k_wanted, // Timer for determining WANTED status, lowers when hitting people, prevents the game turning into Camp Lazlo k_yougotem, // "You Got Em" gfx when hitting someone as a karma player via a method that gets you back in the game instantly + // v1.0.2 vars + k_itemblink, // Item flashing after roulette, prevents Hyudoro stealing AND serves as a mashing indicator + k_itemblinkmode, // Type of flashing: 0 = white (normal), 1 = red (mashing), 2 = rainbow (enhanced items) + NUMKARTSTUFF } kartstufftype_t; //} diff --git a/src/dehacked.c b/src/dehacked.c index 27d531cc..c1195849 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8270,6 +8270,9 @@ static const char *const KARTSTUFF_LIST[] = { "COMEBACKMODE", "WANTED", "YOUGOTEM", + + "ITEMBLINK", + "ITEMBLINKMODE" }; static const char *const HUDITEMS_LIST[] = { diff --git a/src/k_kart.c b/src/k_kart.c index 94fa3f32..e4c0f39e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -326,12 +326,20 @@ void K_GenerateKartColormap(UINT8 *dest_colormap, INT32 skinnum, UINT8 color) INT32 starttranscolor; // Handle a couple of simple special cases - if (skinnum == TC_BOSS || skinnum == TC_ALLWHITE || skinnum == TC_METALSONIC || color == SKINCOLOR_NONE) + if (skinnum == TC_BOSS + || skinnum == TC_ALLWHITE + || skinnum == TC_METALSONIC + || skinnum == TC_BLINK + || color == SKINCOLOR_NONE) { for (i = 0; i < NUM_PALETTE_ENTRIES; i++) { - if (skinnum == TC_ALLWHITE) dest_colormap[i] = 0; - else dest_colormap[i] = (UINT8)i; + if (skinnum == TC_ALLWHITE) + dest_colormap[i] = 0; + else if (skinnum == TC_BLINK) + dest_colormap[i] = colortranslations[color][7]; + else + dest_colormap[i] = (UINT8)i; } // White! @@ -953,6 +961,8 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_roulettetype] == 2) // Fake items { player->kartstuff[k_eggmanexplode] = 4*TICRATE; + //player->kartstuff[k_itemblink] = TICRATE; + //player->kartstuff[k_itemblinkmode] = 1; player->kartstuff[k_itemroulette] = 0; player->kartstuff[k_roulettetype] = 0; if (P_IsLocalPlayer(player)) @@ -964,6 +974,8 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) { K_KartGetItemResult(player, cv_kartdebugitem.value); player->kartstuff[k_itemamount] = cv_kartdebugamount.value; + player->kartstuff[k_itemblink] = TICRATE; + player->kartstuff[k_itemblinkmode] = 2; player->kartstuff[k_itemroulette] = 0; player->kartstuff[k_roulettetype] = 0; if (P_IsLocalPlayer(player)) @@ -996,11 +1008,13 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) player->kartstuff[k_itemamount] = 1; } + player->kartstuff[k_itemblink] = TICRATE; + player->kartstuff[k_itemblinkmode] = ((player->kartstuff[k_roulettetype] == 1) ? 2 : (mashed ? 1 : 0)); player->kartstuff[k_itemroulette] = 0; // Since we're done, clear the roulette number player->kartstuff[k_roulettetype] = 0; // This too if (P_IsLocalPlayer(player)) - S_StartSound(NULL, sfx_itrolf); + S_StartSound(NULL, (mashed ? sfx_itrolm : sfx_itrolf)); } //} @@ -3038,7 +3052,8 @@ static void K_DoHyudoroSteal(player_t *player) // Has an item && (players[i].kartstuff[k_itemtype] && players[i].kartstuff[k_itemamount] - && !players[i].kartstuff[k_itemheld])) + && !players[i].kartstuff[k_itemheld] + && !players[i].kartstuff[k_itemblink])) { playerswappable[numplayers] = i; numplayers++; @@ -4244,6 +4259,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_yougotem]) player->kartstuff[k_yougotem]--; + if (player->kartstuff[k_itemblink] && player->kartstuff[k_itemblink]-- <= 0) + { + player->kartstuff[k_itemblinkmode] = 0; + player->kartstuff[k_itemblink] = 0; + } + if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer])) { if (player->exiting) @@ -6239,29 +6260,84 @@ static void K_drawKartItem(void) INT32 splitflags = K_calcSplitFlags(V_SNAPTOTOP|V_SNAPTOLEFT); const INT32 numberdisplaymin = ((!offset && stplyr->kartstuff[k_itemtype] == KITEM_ORBINAUT) ? 5 : 2); INT32 itembar = 0; + UINT8 localcolor = SKINCOLOR_NONE; + SINT8 colormode = TC_RAINBOW; + UINT8 *colmap = NULL; if (stplyr->kartstuff[k_itemroulette]) { - switch((stplyr->kartstuff[k_itemroulette] % (13*3)) / 3) + if (stplyr->skincolor) + localcolor = stplyr->skincolor; + + switch((stplyr->kartstuff[k_itemroulette] % (14*3)) / 3) { // Each case is handled in threes, to give three frames of in-game time to see the item on the roulette - case 0: localpatch = kp_sneaker[offset]; break; // Sneaker - case 1: localpatch = kp_banana[offset]; break; // Banana - case 2: localpatch = kp_orbinaut[3+offset]; break; // Orbinaut - case 3: localpatch = kp_mine[offset]; break; // Mine - case 4: localpatch = kp_grow[offset]; break; // Grow - case 5: localpatch = kp_hyudoro[offset]; break; // Hyudoro - case 6: localpatch = kp_rocketsneaker[offset]; break; // Rocket Sneaker - case 7: localpatch = kp_jawz[offset]; break; // Jawz - case 8: localpatch = kp_selfpropelledbomb[offset]; break; // Self-Propelled Bomb - case 9: localpatch = kp_shrink[offset]; break; // Shrink - case 10: localpatch = localinv; break; // Invincibility - case 11: localpatch = kp_eggman[offset]; break; // Eggman Monitor - case 12: localpatch = kp_ballhog[offset]; break; // Ballhog - case 13: localpatch = kp_thundershield[offset]; break; // Thunder Shield - //case 14: localpatch = kp_pogospring[offset]; break; // Pogo Spring - //case 15: localpatch = kp_kitchensink[offset]; break; // Kitchen Sink - default: break; + case 0: // Sneaker + localpatch = kp_sneaker[offset]; + //localcolor = SKINCOLOR_RASPBERRY; + break; + case 1: // Banana + localpatch = kp_banana[offset]; + //localcolor = SKINCOLOR_YELLOW; + break; + case 2: // Orbinaut + localpatch = kp_orbinaut[3+offset]; + //localcolor = SKINCOLOR_STEEL; + break; + case 3: // Mine + localpatch = kp_mine[offset]; + //localcolor = SKINCOLOR_JET; + break; + case 4: // Grow + localpatch = kp_grow[offset]; + //localcolor = SKINCOLOR_TEAL; + break; + case 5: // Hyudoro + localpatch = kp_hyudoro[offset]; + //localcolor = SKINCOLOR_STEEL; + break; + case 6: // Rocket Sneaker + localpatch = kp_rocketsneaker[offset]; + //localcolor = SKINCOLOR_TANGERINE; + break; + case 7: // Jawz + localpatch = kp_jawz[offset]; + //localcolor = SKINCOLOR_JAWZ; + break; + case 8: // Self-Propelled Bomb + localpatch = kp_selfpropelledbomb[offset]; + //localcolor = SKINCOLOR_JET; + break; + case 9: // Shrink + localpatch = kp_shrink[offset]; + //localcolor = SKINCOLOR_ORANGE; + break; + case 10: // Invincibility + localpatch = localinv; + //localcolor = SKINCOLOR_GREY; + break; + case 11: // Eggman Monitor + localpatch = kp_eggman[offset]; + //localcolor = SKINCOLOR_ROSE; + break; + case 12: // Ballhog + localpatch = kp_ballhog[offset]; + //localcolor = SKINCOLOR_LILAC; + break; + case 13: // Thunder Shield + localpatch = kp_thundershield[offset]; + //localcolor = SKINCOLOR_CYAN; + break; + /*case 14: // Pogo Spring + localpatch = kp_pogospring[offset]; + localcolor = SKINCOLOR_TANGERINE; + break; + case 15: // Kitchen Sink + localpatch = kp_kitchensink[offset]; + localcolor = SKINCOLOR_STEEL; + break;*/ + default: + break; } } else @@ -6317,41 +6393,97 @@ static void K_drawKartItem(void) switch(stplyr->kartstuff[k_itemtype]) { - case KITEM_SNEAKER: localpatch = kp_sneaker[offset]; break; - case KITEM_ROCKETSNEAKER: localpatch = kp_rocketsneaker[offset]; break; - case KITEM_INVINCIBILITY: localpatch = localinv; localbg = kp_itembg[offset+1]; break; - case KITEM_BANANA: localpatch = kp_banana[offset]; break; - case KITEM_EGGMAN: localpatch = kp_eggman[offset]; break; - case KITEM_ORBINAUT: - localpatch = kp_orbinaut[(offset ? 4 - : min(stplyr->kartstuff[k_itemamount]-1, 3))]; + case KITEM_SNEAKER: + localpatch = kp_sneaker[offset]; break; - case KITEM_JAWZ: localpatch = kp_jawz[offset]; break; - case KITEM_MINE: localpatch = kp_mine[offset]; break; - case KITEM_BALLHOG: localpatch = kp_ballhog[offset]; break; - case KITEM_SPB: localpatch = kp_selfpropelledbomb[offset]; localbg = kp_itembg[offset+1]; break; - case KITEM_GROW: localpatch = kp_grow[offset]; break; - case KITEM_SHRINK: localpatch = kp_shrink[offset]; break; - case KITEM_THUNDERSHIELD: localpatch = kp_thundershield[offset]; localbg = kp_itembg[offset+1]; break; - case KITEM_HYUDORO: localpatch = kp_hyudoro[offset]; break; - case KITEM_POGOSPRING: localpatch = kp_pogospring[offset]; break; - case KITEM_KITCHENSINK: localpatch = kp_kitchensink[offset]; break; - case KITEM_SAD: localpatch = kp_sadface[offset]; break; - default: return; + case KITEM_ROCKETSNEAKER: + localpatch = kp_rocketsneaker[offset]; + break; + case KITEM_INVINCIBILITY: + localpatch = localinv; + localbg = kp_itembg[offset+1]; + break; + case KITEM_BANANA: + localpatch = kp_banana[offset]; + break; + case KITEM_EGGMAN: + localpatch = kp_eggman[offset]; + break; + case KITEM_ORBINAUT: + localpatch = kp_orbinaut[(offset ? 4 : min(stplyr->kartstuff[k_itemamount]-1, 3))]; + break; + case KITEM_JAWZ: + localpatch = kp_jawz[offset]; + break; + case KITEM_MINE: + localpatch = kp_mine[offset]; + break; + case KITEM_BALLHOG: + localpatch = kp_ballhog[offset]; + break; + case KITEM_SPB: + localpatch = kp_selfpropelledbomb[offset]; + localbg = kp_itembg[offset+1]; + break; + case KITEM_GROW: + localpatch = kp_grow[offset]; + break; + case KITEM_SHRINK: + localpatch = kp_shrink[offset]; + break; + case KITEM_THUNDERSHIELD: + localpatch = kp_thundershield[offset]; + localbg = kp_itembg[offset+1]; + break; + case KITEM_HYUDORO: + localpatch = kp_hyudoro[offset]; + break; + case KITEM_POGOSPRING: + localpatch = kp_pogospring[offset]; + break; + case KITEM_KITCHENSINK: + localpatch = kp_kitchensink[offset]; + break; + case KITEM_SAD: + localpatch = kp_sadface[offset]; + break; + default: + return; } if (stplyr->kartstuff[k_itemheld] && !(leveltime & 1)) localpatch = kp_nodraw; } + + if (stplyr->kartstuff[k_itemblink] && (leveltime & 1)) + { + colormode = TC_BLINK; + + switch (stplyr->kartstuff[k_itemblinkmode]) + { + case 2: + localcolor = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + break; + case 1: + localcolor = SKINCOLOR_RED; + break; + default: + localcolor = SKINCOLOR_WHITE; + break; + } + } } + if (localcolor != SKINCOLOR_NONE) + colmap = R_GetTranslationColormap(colormode, localcolor, 0); + V_DrawScaledPatch(ITEM_X, ITEM_Y, V_HUDTRANS|splitflags, localbg); // Then, the numbers: if (stplyr->kartstuff[k_itemamount] >= numberdisplaymin && !stplyr->kartstuff[k_itemroulette]) { V_DrawScaledPatch(ITEM_X, ITEM_Y, V_HUDTRANS|splitflags, kp_itemmulsticker[offset]); - V_DrawScaledPatch(ITEM_X, ITEM_Y, V_HUDTRANS|splitflags, localpatch); + V_DrawFixedPatch(ITEM_X<kartstuff[k_itemamount])); else @@ -6361,7 +6493,7 @@ static void K_drawKartItem(void) } } else - V_DrawScaledPatch(ITEM_X, ITEM_Y, V_HUDTRANS|splitflags, localpatch); + V_DrawFixedPatch(ITEM_X<= MAXSKINS) - return luaL_error(L, "skin number %d is out of range (%d - %d)", skinnum, TC_ALLWHITE, MAXSKINS-1); + if (skinnum < TC_BLINK || skinnum >= MAXSKINS) + return luaL_error(L, "skin number %d is out of range (%d - %d)", skinnum, TC_BLINK, MAXSKINS-1); } else // skin name { diff --git a/src/r_draw.c b/src/r_draw.c index 60927434..560f3063 100644 --- a/src/r_draw.c +++ b/src/r_draw.c @@ -136,6 +136,7 @@ UINT32 nflatxshift, nflatyshift, nflatshiftup, nflatmask; #define METALSONIC_TT_CACHE_INDEX (MAXSKINS + 2) #define ALLWHITE_TT_CACHE_INDEX (MAXSKINS + 3) #define RAINBOW_TT_CACHE_INDEX (MAXSKINS + 4) +#define BLINK_TT_CACHE_INDEX (MAXSKINS + 5) #define SKIN_RAMP_LENGTH 16 #define DEFAULT_STARTTRANSCOLOR 160 #define NUM_PALETTE_ENTRIES 256 @@ -530,6 +531,7 @@ UINT8* R_GetTranslationColormap(INT32 skinnum, skincolors_t color, UINT8 flags) else if (skinnum == TC_METALSONIC) skintableindex = METALSONIC_TT_CACHE_INDEX; else if (skinnum == TC_ALLWHITE) skintableindex = ALLWHITE_TT_CACHE_INDEX; else if (skinnum == TC_RAINBOW) skintableindex = RAINBOW_TT_CACHE_INDEX; + else if (skinnum == TC_BLINK) skintableindex = BLINK_TT_CACHE_INDEX; else skintableindex = skinnum; if (flags & GTC_CACHE) diff --git a/src/r_draw.h b/src/r_draw.h index 0ff19bc7..c43d1579 100644 --- a/src/r_draw.h +++ b/src/r_draw.h @@ -108,6 +108,7 @@ extern lumpnum_t viewborderlump[8]; #define TC_METALSONIC -3 // For Metal Sonic battle #define TC_ALLWHITE -4 // For Cy-Brak-demon #define TC_RAINBOW -5 // For invincibility power +#define TC_BLINK -6 // For item blinking // Initialize color translation tables, for player rendering etc. void R_InitTranslationTables(void); diff --git a/src/sounds.c b/src/sounds.c index 5531e7a3..900c88f9 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -792,6 +792,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"itrol7", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"itrol8", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"itrolf", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Roulette end + {"itrolm", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Roulette end (mashed) {"itrole", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Roulette end (Eggman) {"vroom", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart Krew opening vroom {"chaooo", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Chao audience cheer diff --git a/src/sounds.h b/src/sounds.h index e93a17a4..1e287a6b 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -867,6 +867,7 @@ typedef enum sfx_itrol7, sfx_itrol8, sfx_itrolf, + sfx_itrolm, sfx_itrole, sfx_vroom, sfx_chaooo, From 4fdaf448f2641e59cad78de5b55bb17e34806731 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 24 Nov 2018 02:56:39 -0500 Subject: [PATCH 03/22] Change how SPB rush works Instead of enabling Frantic for the person in 2nd, it doubles the gap between them. Now it's 2nd's job to catch up and ruin 1st's day. --- src/k_kart.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e4c0f39e..f22f8aba 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -609,7 +609,7 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem) \return void */ -static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean insecondplace) +static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) { const INT32 distvar = (64*14); INT32 newodds; @@ -666,8 +666,6 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean in #define POWERITEMODDS(odds) \ if (franticitems) \ odds *= 2; \ - if (spbexists && insecondplace) \ - odds *= 2; \ if (pingame < 8 && !G_BattleGametype()) \ odds = FixedMul(odds*FRACUNIT, FRACUNIT+min((8-pingame)*(FRACUNIT/25), FRACUNIT))/FRACUNIT; \ if (mashed > 0) \ @@ -773,7 +771,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed, boolean in //{ SRB2kart Roulette Code - Distance Based, no waypoints -static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT32 bestbumper) +static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT32 bestbumper, boolean spbrush) { const INT32 distvar = (64*14); INT32 i; @@ -795,7 +793,7 @@ static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT3 for (j = 0; j < NUMKARTRESULTS; j++) { - if (K_KartGetItemOdds(i, j, mashed, (player->kartstuff[k_position] == 2)) > 0) + if (K_KartGetItemOdds(i, j, mashed) > 0) { available = true; break; @@ -853,9 +851,11 @@ static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT3 if (oddsvalid[8]) SETUPDISTTABLE(8,1); if (franticitems) // Frantic items make the distances between everyone artifically higher, for crazier items - pdis = (15*pdis/14); - if (pingame < 8 && !G_BattleGametype()) - pdis = ((28+(8-pingame))*pdis/28); + pdis = (15*pdis)/14; + if (spbrush) // SPB Rush Mode: It's 2nd place's job to catch-up items and make 1st place's job hell + pdis *= 2; + if (pingame < 8) + pdis = ((28+(8-pingame))*pdis)/28; if (pingame == 1 && oddsvalid[0]) // Record Attack, or just alone useodds = 0; @@ -988,10 +988,10 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) spawnchance[i] = 0; // Split into another function for a debug function below - useodds = K_FindUseodds(player, mashed, pingame, bestbumper); + useodds = K_FindUseodds(player, mashed, pingame, bestbumper, (player->kartstuff[k_position] == 2 && spbexists)); #define SETITEMRESULT(itemnum) \ - for (chance = 0; chance < K_KartGetItemOdds(useodds, itemnum, mashed, (player->kartstuff[k_position] == 2)); chance++) \ + for (chance = 0; chance < K_KartGetItemOdds(useodds, itemnum, mashed); chance++) \ spawnchance[numchoices++] = itemnum for (i = 1; i < NUMKARTRESULTS; i++) @@ -7944,11 +7944,11 @@ static void K_drawDistributionDebugger(void) bestbumper = players[i].kartstuff[k_bumper]; } - useodds = K_FindUseodds(stplyr, 0, pingame, bestbumper); + useodds = K_FindUseodds(stplyr, 0, pingame, bestbumper, (player->kartstuff[k_position] == 2 && spbexists)); for (i = 1; i < NUMKARTRESULTS; i++) { - const INT32 itemodds = K_KartGetItemOdds(useodds, i, 0, (stplyr->kartstuff[k_position] == 2)); + const INT32 itemodds = K_KartGetItemOdds(useodds, i, 0); if (itemodds <= 0) continue; From d3a737f8c19a27fae066e72a57983a20d9341a63 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 24 Nov 2018 03:42:25 -0500 Subject: [PATCH 04/22] More SPB tweaks - SPB can switch off if its target if that person lost the lead for 7 seconds - Make sure lastlook gets reset when going back to SEEKING --- src/p_enemy.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/p_enemy.c b/src/p_enemy.c index a78957b0..b81f1ea9 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8369,11 +8369,19 @@ void A_SPBChase(mobj_t *actor) if (actor->tracer->player) // 7/8ths max speed for Knuckles, 3/4ths max speed for min accel, exactly max speed for max accel { actor->lastlook = actor->tracer->player-players; // Save the player num for death scumming... + if (!P_IsObjectOnGround(actor->tracer) /*&& !actor->tracer->player->kartstuff[k_pogospring]*/) defspeed = (7*actor->tracer->player->speed)/8; // In the air you have no control; basically don't hit unless you make a near complete stop else defspeed = ((33 - actor->tracer->player->kartspeed) * K_GetKartSpeed(actor->tracer->player, false)) / 32; + defspeed -= (9*R_PointToDist2(0, 0, actor->tracer->player->cmomx, actor->tracer->player->cmomy))/8; // Be fairer on conveyors + + // Switch targets if you're no longer 1st for long enough + if (actor->tracer->player->kartstuff[k_position] == 1) + actor->extravalue2 = 7*TICRATE; + else if (actor->extravalue2-- <= 0) + actor->extravalue1 = 0; // back to SEEKING } // Play the intimidating gurgle @@ -8464,6 +8472,7 @@ void A_SPBChase(mobj_t *actor) { P_SetTarget(&actor->tracer, players[actor->lastlook].mo); actor->extravalue1 = 1; // TARGETING + actor->extravalue2 = 7*TICRATE; } else actor->extravalue1 = 0; // SEEKING @@ -8472,6 +8481,8 @@ void A_SPBChase(mobj_t *actor) } else // MODE: SEEKING { + actor->lastlook = -1; // Just make sure this is reset + // Find the player with the best rank for (i = 0; i < MAXPLAYERS; i++) { @@ -8560,6 +8571,7 @@ void A_SPBChase(mobj_t *actor) { S_StartSound(actor, actor->info->attacksound); // Siren sound; might not need this anymore, but I'm keeping it for now just for debugging. actor->extravalue1 = 1; // TARGET ACQUIRED + actor->extravalue2 = 7*TICRATE; } } From 31aa96ecdc219f7885e7b4b8b502d3ccb0d58bf2 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 24 Nov 2018 17:27:48 -0500 Subject: [PATCH 05/22] Wrong var here --- 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 f22f8aba..3b6b6850 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7944,7 +7944,7 @@ static void K_drawDistributionDebugger(void) bestbumper = players[i].kartstuff[k_bumper]; } - useodds = K_FindUseodds(stplyr, 0, pingame, bestbumper, (player->kartstuff[k_position] == 2 && spbexists)); + useodds = K_FindUseodds(stplyr, 0, pingame, bestbumper, (stplyr->kartstuff[k_position] == 2 && spbexists)); for (i = 1; i < NUMKARTRESULTS; i++) { From 14d178ed4b21093263608072e56fbb299bd96e7f Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 24 Nov 2018 17:28:53 -0500 Subject: [PATCH 06/22] Infinite wall bump fix(?) Couldn't replicate it at all after this change, but I also have trouble replicating it before it :v --- src/p_map.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index ba6e6454..66928bf6 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3844,7 +3844,7 @@ void P_BouncePlayerMove(mobj_t *mo) if (!mo->player) return; - if ((mo->eflags & MFE_JUSTBOUNCEDWALL) || (mo->player->spectator)) + if (mo->player->spectator) { P_SlideMove(mo, true); return; @@ -3898,8 +3898,16 @@ void P_BouncePlayerMove(mobj_t *mo) if (bestslidefrac <= 0) return; - tmxmove = FixedMul(mmomx, (FRACUNIT - (FRACUNIT>>2) - (FRACUNIT>>3))); - tmymove = FixedMul(mmomy, (FRACUNIT - (FRACUNIT>>2) - (FRACUNIT>>3))); + if (mo->eflags & MFE_JUSTBOUNCEDWALL) // Stronger push-out + { + tmxmove = mmomx; + tmymove = mmomy; + } + else + { + tmxmove = FixedMul(mmomx, (FRACUNIT - (FRACUNIT>>2) - (FRACUNIT>>3))); + tmymove = FixedMul(mmomy, (FRACUNIT - (FRACUNIT>>2) - (FRACUNIT>>3))); + } { mobj_t *fx = P_SpawnMobj(mo->x, mo->y, mo->z, MT_BUMP); @@ -3936,18 +3944,18 @@ void P_BounceMove(mobj_t *mo) INT32 hitcount; fixed_t mmomx = 0, mmomy = 0; - if (mo->eflags & MFE_JUSTBOUNCEDWALL) - { - P_SlideMove(mo, true); - return; - } - if (mo->player) { P_BouncePlayerMove(mo); return; } + if (mo->eflags & MFE_JUSTBOUNCEDWALL) + { + P_SlideMove(mo, true); + return; + } + slidemo = mo; hitcount = 0; From f47c78832a4cb755f188dc397daff461fcb6fce8 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 24 Nov 2018 18:00:27 -0500 Subject: [PATCH 07/22] colorize arrow roulette --- src/p_mobj.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/p_mobj.c b/src/p_mobj.c index ba0a0c11..f6ef4ba5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6832,6 +6832,18 @@ void P_MobjThinker(mobj_t *mobj) P_SetScale(mobj->tracer, (mobj->tracer->destscale = mobj->scale)); } + // Do this in an easy way + if (mobj->target->player->kartstuff[k_itemroulette]) + { + mobj->tracer->color = mobj->target->player->skincolor; + mobj->tracer->colorized = true; + } + else + { + mobj->tracer->color = SKINCOLOR_NONE; + mobj->tracer->colorized = false; + } + if (!(mobj->flags2 & MF2_DONTDRAW)) { const INT32 numberdisplaymin = ((mobj->target->player->kartstuff[k_itemtype] == KITEM_ORBINAUT) ? 5 : 2); From fccdfc1bfd777a80bdeba9fa7b17487cf4cc588e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 24 Nov 2018 19:49:18 -0500 Subject: [PATCH 08/22] Weaken slightly --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8fad8a6f..03030f23 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -853,13 +853,13 @@ static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT3 if (franticitems) // Frantic items make the distances between everyone artifically higher, for crazier items pdis = (15*pdis)/14; if (spbrush) // SPB Rush Mode: It's 2nd place's job to catch-up items and make 1st place's job hell - pdis *= 2; + pdis = (3*pdis)/2; if (pingame < 8) pdis = ((28+(8-pingame))*pdis)/28; if (pingame == 1 && oddsvalid[0]) // Record Attack, or just alone useodds = 0; - else if (pdis <= 0) // (64*14) * 0 = 0 + else if (pdis <= 0) // (64*14) * 0 = 0 useodds = disttable[0]; else if (pdis > distvar * ((12 * distlen) / 14)) // (64*14) * 12 = 10752 useodds = disttable[distlen-1]; From d46739948031db8f01cf203adb80121b4764f800 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 24 Nov 2018 20:41:17 -0500 Subject: [PATCH 09/22] Keep track of the place SPB is following This makes it so that if the SPB'd person is passed, then the person who's getting SPB'd won't get the increased item odds for the weird feedback loop. --- src/dehacked.c | 4 ++-- src/doomstat.h | 2 +- src/g_game.c | 2 +- src/k_kart.c | 6 ++---- src/p_enemy.c | 6 ++++++ src/p_mobj.c | 3 +-- src/p_saveg.c | 4 ++-- src/p_setup.c | 2 +- src/p_user.c | 2 +- 9 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index c1195849..95cd30a2 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9773,8 +9773,8 @@ static inline int lib_getenum(lua_State *L) } else if (fastcmp(word,"thwompsactive")) { lua_pushboolean(L, thwompsactive); return 1; - } else if (fastcmp(word,"spbexists")) { - lua_pushboolean(L, spbexists); + } else if (fastcmp(word,"spbplace")) { + lua_pushinteger(L, spbplace); return 1; } diff --git a/src/doomstat.h b/src/doomstat.h index aa2ebe31..a002bb34 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -461,7 +461,7 @@ extern tic_t indirectitemcooldown; extern tic_t mapreset; extern UINT8 nospectategrief; extern boolean thwompsactive; -extern boolean spbexists; +extern SINT8 spbplace; extern boolean legitimateexit; extern boolean comebackshowninfo; diff --git a/src/g_game.c b/src/g_game.c index cba9d26c..d44ad266 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -267,7 +267,7 @@ tic_t indirectitemcooldown; // Cooldown before any more Shrink, SPB, or any othe tic_t mapreset; // Map reset delay when enough players have joined an empty game UINT8 nospectategrief; // How many players need to be in-game to eliminate last; for preventing spectate griefing boolean thwompsactive; // Thwomps activate on lap 2 -boolean spbexists; // SPB exists, give 2nd place better items +SINT8 spbplace; // SPB exists, give the person behind better items // Client-sided, unsynched variables (NEVER use in anything that needs to be synced with other players) boolean legitimateexit; // Did this client actually finish the match? diff --git a/src/k_kart.c b/src/k_kart.c index 03030f23..8b2e62bd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -583,8 +583,6 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem) player->kartstuff[k_itemamount] = 2; break; case KITEM_SPB: - spbexists = true; - /* FALLTHRU */ case KITEM_SHRINK: // Indirect items indirectitemcooldown = 30*TICRATE; /* FALLTHRU */ @@ -988,7 +986,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) spawnchance[i] = 0; // Split into another function for a debug function below - useodds = K_FindUseodds(player, mashed, pingame, bestbumper, (player->kartstuff[k_position] == 2 && spbexists)); + useodds = K_FindUseodds(player, mashed, pingame, bestbumper, (spbplace != -1 && player->kartstuff[k_position] == spbplace+1)); #define SETITEMRESULT(itemnum) \ for (chance = 0; chance < K_KartGetItemOdds(useodds, itemnum, mashed); chance++) \ @@ -7944,7 +7942,7 @@ static void K_drawDistributionDebugger(void) bestbumper = players[i].kartstuff[k_bumper]; } - useodds = K_FindUseodds(stplyr, 0, pingame, bestbumper, (stplyr->kartstuff[k_position] == 2 && spbexists)); + useodds = K_FindUseodds(stplyr, 0, pingame, bestbumper, (spbplace != -1 && stplyr->kartstuff[k_position] == spbplace+1)); for (i = 1; i < NUMKARTRESULTS; i++) { diff --git a/src/p_enemy.c b/src/p_enemy.c index b81f1ea9..d8735d9b 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8354,6 +8354,7 @@ void A_SPBChase(mobj_t *actor) if (actor->threshold) // Just fired, go straight. { actor->lastlook = -1; + spbplace = -1; P_InstaThrust(actor, actor->angle, wspeed); return; } @@ -8382,6 +8383,8 @@ void A_SPBChase(mobj_t *actor) actor->extravalue2 = 7*TICRATE; else if (actor->extravalue2-- <= 0) actor->extravalue1 = 0; // back to SEEKING + + spbplace = actor->tracer->player->kartstuff[k_position]; } // Play the intimidating gurgle @@ -8466,6 +8469,8 @@ void A_SPBChase(mobj_t *actor) else if (actor->extravalue1 == 2) // MODE: WAIT... { actor->momx = actor->momy = actor->momz = 0; // Stoooop + spbplace = -1; + if (actor->extravalue2-- <= 0) { if (actor->lastlook != -1 && playeringame[actor->lastlook] && players[actor->lastlook].mo) @@ -8482,6 +8487,7 @@ void A_SPBChase(mobj_t *actor) else // MODE: SEEKING { actor->lastlook = -1; // Just make sure this is reset + spbplace = -1; // Find the player with the best rank for (i = 0; i < MAXPLAYERS; i++) diff --git a/src/p_mobj.c b/src/p_mobj.c index f6ef4ba5..7c6987a7 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8167,7 +8167,6 @@ void P_MobjThinker(mobj_t *mobj) break; case MT_SPB: indirectitemcooldown = 30*TICRATE; - spbexists = true; /* FALLTHRU */ case MT_BALLHOG: P_SpawnGhostMobj(mobj)->fuse = 3; @@ -10392,7 +10391,7 @@ void P_RemoveMobj(mobj_t *mobj) P_RemoveShadow(mobj); if (mobj->type == MT_SPB) - spbexists = false; + spbplace = -1; mobj->health = 0; // Just because diff --git a/src/p_saveg.c b/src/p_saveg.c index 44731000..e702d460 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3287,7 +3287,7 @@ static void P_NetArchiveMisc(void) WRITEUINT32(save_p, mapreset); WRITEUINT8(save_p, nospectategrief); WRITEUINT8(save_p, thwompsactive); - WRITEUINT8(save_p, spbexists); + WRITESINT8(save_p, spbplace); // Is it paused? if (paused) @@ -3394,7 +3394,7 @@ static inline boolean P_NetUnArchiveMisc(void) mapreset = READUINT32(save_p); nospectategrief = READUINT8(save_p); thwompsactive = (boolean)READUINT8(save_p); - spbexists = (boolean)READUINT8(save_p); + spbplace = READSINT8(save_p); // Is it paused? if (READUINT8(save_p) == 0x2f) diff --git a/src/p_setup.c b/src/p_setup.c index fa8e263c..bd3856d6 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3046,7 +3046,7 @@ boolean P_SetupLevel(boolean skipprecip) mapreset = 0; nospectategrief = 0; thwompsactive = false; - spbexists = false; + spbplace = -1; // clear special respawning que iquehead = iquetail = 0; diff --git a/src/p_user.c b/src/p_user.c index d17a7c80..7b4ef789 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7759,7 +7759,7 @@ void P_NukeEnemies(mobj_t *inflictor, mobj_t *source, fixed_t radius) if (mo->type == MT_SPB) // If you destroy a SPB, you don't get the luxury of a cooldown. { - spbexists = false; + spbplace = -1; indirectitemcooldown = 0; } From 7dcc55951bc1ff5bcad43679e03e62d881dae855 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 24 Nov 2018 20:48:21 -0500 Subject: [PATCH 10/22] Make absolute sure spbplace is set in the right places --- src/p_enemy.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index d8735d9b..6e8668b8 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8469,7 +8469,11 @@ void A_SPBChase(mobj_t *actor) else if (actor->extravalue1 == 2) // MODE: WAIT... { actor->momx = actor->momy = actor->momz = 0; // Stoooop - spbplace = -1; + + if (actor->lastlook == -1) + spbplace = -1; + else + spbplace = players[actor->lastlook].kartstuff[k_position]; if (actor->extravalue2-- <= 0) { @@ -8487,7 +8491,6 @@ void A_SPBChase(mobj_t *actor) else // MODE: SEEKING { actor->lastlook = -1; // Just make sure this is reset - spbplace = -1; // Find the player with the best rank for (i = 0; i < MAXPLAYERS; i++) @@ -8511,6 +8514,8 @@ void A_SPBChase(mobj_t *actor) } } + spbplace = bestrank; // While seeking, it's trying to go for first place. + // No one there? if (player == NULL || !player->mo) { From 7608055679514c62ecc4f2ff4994adbd0da95494 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 24 Nov 2018 20:59:22 -0500 Subject: [PATCH 11/22] More in-depth countdown calculation Hooooopefully this makes sure time over doesn't happen prematurely at random --- src/p_inter.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index baae2701..f75bd4d0 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -2003,19 +2003,6 @@ boolean P_CheckRacers(void) countdown = countdown2 = 0; return true; } - else if (!countdown) // Check to see if the winners have finished, to set countdown. - { - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator) - continue; - if (players[i].exiting || K_IsPlayerLosing(&players[i])) // Only start countdown when all winners are declared - continue; - break; - } - if (i == MAXPLAYERS) - countdown = (((netgame || multiplayer) ? cv_countdowntime.value : 30)*TICRATE) + 1; // 30 seconds to finish, get going! - } if (cv_karteliminatelast.value) { @@ -2046,6 +2033,28 @@ boolean P_CheckRacers(void) } } + if (!countdown) // Check to see if the winners have finished, to set countdown. + { + UINT8 numingame = 0, numexiting = 0; + UINT8 winningpos = 1; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator) + continue; + numingame++; + if (players[i].exiting) + numexiting++; + } + + winningpos = max(1, numingame/2); + if (numingame % 2) // any remainder? + winningpos++; + + if (numexiting >= winningpos) + countdown = (((netgame || multiplayer) ? cv_countdowntime.value : 30)*TICRATE) + 1; // 30 seconds to finish, get going! + } + return false; } From c67e7f1709464d8de1e658601a094077e2c96817 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 25 Nov 2018 02:24:33 -0500 Subject: [PATCH 12/22] Game saves when you use the cheat Because of other G_SaveGameData instances added in the last patch, this cheat can get saved anyway. Since this is just supposed to be convenience for server hosts, we might as well make it work like other console Kart racers and just make it save anyway! --- src/m_cheat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_cheat.c b/src/m_cheat.c index e57a85ae..3992147c 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -97,7 +97,7 @@ static UINT8 cheatf_warp(void) if (success) { - G_SetGameModified(false); + G_SaveGameData(true); //G_SetGameModified(false); S_StartSound(0, sfx_kc42); } From 01f5787e51d5ba4c83332278cb9dbd0c5df7b194 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 25 Nov 2018 02:30:08 -0500 Subject: [PATCH 13/22] Unlock all secrets for dedicated If wanted we can just add dedicated checks to Encore & Hard Mode, but I figured this would be quicker and more future-proof. --- src/m_cond.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/m_cond.c b/src/m_cond.c index 5a9d4f2a..9c56124e 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -535,6 +535,12 @@ UINT8 M_AnySecretUnlocked(void) UINT8 M_SecretUnlocked(INT32 type) { INT32 i; + +#if 1 + if (dedicated) + return true; +#endif + for (i = 0; i < MAXUNLOCKABLES; ++i) { if (unlockables[i].type == type && unlockables[i].unlocked) From e35e00f94ed7b08fdff05dac367475cb00333845 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 25 Nov 2018 05:43:17 -0500 Subject: [PATCH 14/22] Mess with display offset for some Battle objects --- src/info.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/info.c b/src/info.c index fa241ad7..7f29b157 100644 --- a/src/info.c +++ b/src/info.c @@ -17282,7 +17282,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 8, // speed 36*FRACUNIT, // radius 37*FRACUNIT, // height - 0, // display offset + -2, // display offset 16, // mass 0, // damage sfx_None, // activesound @@ -17309,7 +17309,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 8, // speed 36*FRACUNIT, // radius 37*FRACUNIT, // height - 0, // display offset + -2, // display offset 16, // mass 0, // damage sfx_None, // activesound @@ -17363,7 +17363,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 0, // speed 8*FRACUNIT, // radius 16*FRACUNIT, // height - 0, // display offset + -1, // display offset 0, // mass 0, // damage sfx_None, // activesound From 0f1206af6f30437200bc08c90edaf83e61b0c958 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 25 Nov 2018 20:14:01 -0500 Subject: [PATCH 15/22] Shrink no longer causes old-style wipeout, getting squished reduces the timer on it. Maybe this might help some of the desyncing, too! Mainly done for gameplay reasons, though :p --- src/k_kart.c | 46 ++++++++++++++-------------------------------- src/p_mobj.c | 2 +- 2 files changed, 15 insertions(+), 33 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8b2e62bd..c7e9375c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -584,7 +584,7 @@ static void K_KartGetItemResult(player_t *player, SINT8 getitem) break; case KITEM_SPB: case KITEM_SHRINK: // Indirect items - indirectitemcooldown = 30*TICRATE; + indirectitemcooldown = 20*TICRATE; /* FALLTHRU */ default: if (getitem <= 0 || getitem >= NUMKARTRESULTS) // Sad (Fallback) @@ -2027,6 +2027,14 @@ void K_SquishPlayer(player_t *player, mobj_t *source) player->kartstuff[k_squishedtimer] = TICRATE; + // Reduce Shrink timer + if (player->kartstuff[k_growshrinktimer] < 0) + { + player->kartstuff[k_growshrinktimer] += TICRATE; + if (player->kartstuff[k_growshrinktimer] > -2) + player->kartstuff[k_growshrinktimer] = -2; + } + player->powers[pw_flashing] = K_GetKartFlashing(player); player->mo->flags |= MF_NOCLIP; @@ -3182,44 +3190,17 @@ static void K_DoShrink(player_t *user) continue; if (players[i].kartstuff[k_position] < user->kartstuff[k_position]) { - //P_FlashPal(&players[i], PAL_NUKE, 10); - - if (!players[i].kartstuff[k_invincibilitytimer] // Don't hit while invulnerable! + // Don't hit while invulnerable! + if (!players[i].kartstuff[k_invincibilitytimer] && players[i].kartstuff[k_growshrinktimer] <= 0 && !players[i].kartstuff[k_hyudorotimer]) { // Start shrinking! + K_DropItems(&players[i]); players[i].mo->scalespeed = mapheaderinfo[gamemap-1]->mobj_scale/TICRATE; players[i].mo->destscale = 6*(mapheaderinfo[gamemap-1]->mobj_scale)/8; if (cv_kartdebugshrink.value && !modeattacking && !players[i].bot) players[i].mo->destscale = 6*players[i].mo->destscale/8; - - if (!players[i].powers[pw_flashing] && !players[i].kartstuff[k_squishedtimer] && !players[i].kartstuff[k_spinouttimer]) - P_PlayerRingBurst(&players[i], 5); - - // Wipeout - K_DropItems(&players[i]); - K_SpinPlayer(&players[i], user->mo, 1, false); - - // P_RingDamage - P_DoPlayerPain(&players[i], user->mo, user->mo); - P_ForceFeed(&players[i], 40, 10, TICRATE, 40 + min((players[i].mo->health-1), 100)*2); - P_PlayRinglossSound(players[i].mo); // Ringledingle! - - players[i].mo->momx = players[i].mo->momy = 0; - if (P_IsLocalPlayer(&players[i])) - { - quake.intensity = 32*FRACUNIT; - quake.time = 5; - } - - players[i].kartstuff[k_sneakertimer] = 0; - players[i].kartstuff[k_driftboost] = 0; - - players[i].kartstuff[k_drift] = 0; - players[i].kartstuff[k_driftcharge] = 0; - players[i].kartstuff[k_pogospring] = 0; - players[i].kartstuff[k_growshrinktimer] -= (200+(40*(MAXPLAYERS-players[i].kartstuff[k_position]))); } @@ -3227,6 +3208,7 @@ static void K_DoShrink(player_t *user) if (players[i].kartstuff[k_growshrinktimer] > 0) players[i].kartstuff[k_growshrinktimer] = 2; + //P_FlashPal(&players[i], PAL_NUKE, 10); S_StartSound(players[i].mo, sfx_kc59); } } @@ -5278,7 +5260,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_itemtype] == KITEM_SPB || player->kartstuff[k_itemtype] == KITEM_SHRINK || player->kartstuff[k_growshrinktimer] < 0) - indirectitemcooldown = 30*TICRATE; + indirectitemcooldown = 20*TICRATE; if (player->kartstuff[k_hyudorotimer] > 0) { diff --git a/src/p_mobj.c b/src/p_mobj.c index 7c6987a7..61781aee 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8166,7 +8166,7 @@ void P_MobjThinker(mobj_t *mobj) mobj->threshold--; break; case MT_SPB: - indirectitemcooldown = 30*TICRATE; + indirectitemcooldown = 20*TICRATE; /* FALLTHRU */ case MT_BALLHOG: P_SpawnGhostMobj(mobj)->fuse = 3; From e82c7cb230d240b881033b8c6158885d23eb6aae Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 25 Nov 2018 20:23:09 -0500 Subject: [PATCH 16/22] Make the WAIT phase work better with SPB rush --- src/p_enemy.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index 6e8668b8..e77e8282 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8470,22 +8470,22 @@ void A_SPBChase(mobj_t *actor) { actor->momx = actor->momy = actor->momz = 0; // Stoooop - if (actor->lastlook == -1) - spbplace = -1; - else - spbplace = players[actor->lastlook].kartstuff[k_position]; - - if (actor->extravalue2-- <= 0) + if (actor->lastlook != -1 && playeringame[actor->lastlook] && players[actor->lastlook].mo) { - if (actor->lastlook != -1 && playeringame[actor->lastlook] && players[actor->lastlook].mo) + spbplace = players[actor->lastlook].kartstuff[k_position]; + if (actor->extravalue2-- <= 0) { P_SetTarget(&actor->tracer, players[actor->lastlook].mo); actor->extravalue1 = 1; // TARGETING actor->extravalue2 = 7*TICRATE; + actor->extravalue2 = 0; } - else - actor->extravalue1 = 0; // SEEKING + } + else + { + actor->extravalue1 = 0; // SEEKING actor->extravalue2 = 0; + spbplace = -1; } } else // MODE: SEEKING From b68a58d5b27d943d579007212e2f8a44f6cd6a02 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 25 Nov 2018 20:24:47 -0500 Subject: [PATCH 17/22] Make sure spbplace is set better during SEEKING --- src/p_enemy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index e77e8282..dd68a02c 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8514,8 +8514,6 @@ void A_SPBChase(mobj_t *actor) } } - spbplace = bestrank; // While seeking, it's trying to go for first place. - // No one there? if (player == NULL || !player->mo) { @@ -8531,11 +8529,13 @@ void A_SPBChase(mobj_t *actor) #else actor->momx = actor->momy = actor->momz = 0; #endif + spbplace = -1; return; } // Found someone, now get close enough to initiate the slaughter... P_SetTarget(&actor->tracer, player->mo); + spbplace = bestrank; dist = P_AproxDistance(P_AproxDistance(actor->x-actor->tracer->x, actor->y-actor->tracer->y), actor->z-actor->tracer->z); From b5bf8e09c3d66101a8374ea8246e9fdb703d7e41 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 26 Nov 2018 02:17:14 -0500 Subject: [PATCH 18/22] Karma fireworks Additionally: - FZ boom no longer has that weird smoke bit before it spawns the smoke column - Item blinking color is brighter --- src/dehacked.c | 8 ++ src/info.c | 193 +++++++++++++++++++++++++++++-------------------- src/info.h | 10 +++ src/k_kart.c | 2 +- src/p_inter.c | 11 ++- src/p_mobj.c | 39 ++++++---- 6 files changed, 165 insertions(+), 98 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 95cd30a2..4380772a 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7092,6 +7092,12 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_LIZARDMAN", "S_LIONMAN", + "S_KARMAFIREWORK1", + "S_KARMAFIREWORK2", + "S_KARMAFIREWORK3", + "S_KARMAFIREWORK4", + "S_KARMAFIREWORKTRAIL", + #ifdef SEENAMES "S_NAMECHECK", #endif @@ -7877,6 +7883,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_LIZARDMAN", "MT_LIONMAN", + "MT_KARMAFIREWORK", + #ifdef SEENAMES "MT_NAMECHECK", #endif diff --git a/src/info.c b/src/info.c index 7f29b157..c26b83bc 100644 --- a/src/info.c +++ b/src/info.c @@ -68,8 +68,8 @@ char sprnames[NUMSPRITES + 1][5] = "FROG","CBRA","HOLE","BBRA","EGFG","SMKP","MTYM","THWP","SNOB","ICEB", "CNDL","DOCH","DUCK","GTRE","CHES","CHIM","DRGN","LZMN","PGSS","ZTCH", "MKMA","MKMP","RTCH","BOWL","BOWH","BRRL","BRRR","HRSE","TOAH","BFRT", - "OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF","WBLZ","WBLN","XMS4", - "XMS5","VIEW" + "OFRT","RFRT","PFRT","ASPK","HBST","HBSO","HBSF","WBLZ","WBLN","FWRK", + "XMS4","XMS5","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -3293,100 +3293,106 @@ state_t states[NUMSTATES] = {SPR_ICEB, 3, 10, {NULL}, 0, 0, S_NULL}, // S_SMK_ICEBLOCK_DEBRIS2 // Ezo's maps - {SPR_CNDL, FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE2}, // S_BLUEFIRE1 - {SPR_CNDL, 1|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE3}, // S_BLUEFIRE2 - {SPR_CNDL, 2|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE4}, // S_BLUEFIRE3 - {SPR_CNDL, 3|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE1}, // S_BLUEFIRE4 + {SPR_CNDL, FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE2}, // S_BLUEFIRE1 + {SPR_CNDL, 1|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE3}, // S_BLUEFIRE2 + {SPR_CNDL, 2|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE4}, // S_BLUEFIRE3 + {SPR_CNDL, 3|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_BLUEFIRE1}, // S_BLUEFIRE4 - {SPR_CNDL, 4|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE2}, // S_GREENFIRE1 - {SPR_CNDL, 5|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE3}, // S_GREENFIRE2 - {SPR_CNDL, 6|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE4}, // S_GREENFIRE3 - {SPR_CNDL, 7|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE1}, // S_GREENFIRE4 + {SPR_CNDL, 4|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE2}, // S_GREENFIRE1 + {SPR_CNDL, 5|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE3}, // S_GREENFIRE2 + {SPR_CNDL, 6|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE4}, // S_GREENFIRE3 + {SPR_CNDL, 7|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_GREENFIRE1}, // S_GREENFIRE4 - {SPR_CHES, 0, -1, {NULL}, 0, 0, S_NULL}, // S_REGALCHEST - {SPR_CHIM, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_CHIMERASTATUE - {SPR_DRGN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_DRAGONSTATUE - {SPR_LZMN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LIZARDMANSTATUE - {SPR_PGSS, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_PEGASUSSTATUE + {SPR_CHES, 0, -1, {NULL}, 0, 0, S_NULL}, // S_REGALCHEST + {SPR_CHIM, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_CHIMERASTATUE + {SPR_DRGN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_DRAGONSTATUE + {SPR_LZMN, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_LIZARDMANSTATUE + {SPR_PGSS, FF_FULLBRIGHT, -1, {NULL}, 0, 0, S_NULL}, // S_PEGASUSSTATUE - {SPR_ZTCH, FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE2}, // S_ZELDAFIRE1 - {SPR_ZTCH, 1|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE3}, // S_ZELDAFIRE2 - {SPR_ZTCH, 2|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE4}, // S_ZELDAFIRE3 - {SPR_ZTCH, 3|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE1}, // S_ZELDAFIRE4 + {SPR_ZTCH, FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE2}, // S_ZELDAFIRE1 + {SPR_ZTCH, 1|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE3}, // S_ZELDAFIRE2 + {SPR_ZTCH, 2|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE4}, // S_ZELDAFIRE3 + {SPR_ZTCH, 3|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_ZELDAFIRE1}, // S_ZELDAFIRE4 - {SPR_DOCH, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GANBARETHING - {SPR_DUCK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GANBAREDUCK - {SPR_GTRE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GANBARETREE + {SPR_DOCH, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GANBARETHING + {SPR_DUCK, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GANBAREDUCK + {SPR_GTRE, 0, -1, {NULL}, 0, 0, S_NULL}, // S_GANBARETREE - {SPR_MKMA, 1, 2, {A_Look}, (256<<16)|1, 0, S_MONOIDLE}, // S_MONOIDLE - {SPR_MKMA, 0, 3, {A_Chase}, 3, 0, S_MONOCHASE2}, // S_MONOCHASE1 - {SPR_MKMA, 1, 3, {A_Chase}, 3, 0, S_MONOCHASE3}, // S_MONOCHASE2 - {SPR_MKMA, 2, 3, {A_Chase}, 3, 0, S_MONOCHASE4}, // S_MONOCHASE3 - {SPR_MKMA, 3, 3, {A_Chase}, 3, 0, S_MONOCHASE1}, // S_MONOCHASE4 - {SPR_MKMP, 0, 24, {A_Pain}, 3, 0, S_MONOIDLE}, // S_MONOPAIN + {SPR_MKMA, 1, 2, {A_Look}, (256<<16)|1, 0, S_MONOIDLE}, // S_MONOIDLE + {SPR_MKMA, 0, 3, {A_Chase}, 3, 0, S_MONOCHASE2}, // S_MONOCHASE1 + {SPR_MKMA, 1, 3, {A_Chase}, 3, 0, S_MONOCHASE3}, // S_MONOCHASE2 + {SPR_MKMA, 2, 3, {A_Chase}, 3, 0, S_MONOCHASE4}, // S_MONOCHASE3 + {SPR_MKMA, 3, 3, {A_Chase}, 3, 0, S_MONOCHASE1}, // S_MONOCHASE4 + {SPR_MKMP, 0, 24, {A_Pain}, 3, 0, S_MONOIDLE}, // S_MONOPAIN - {SPR_RTCH, FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE2}, // S_REDZELDAFIRE1 - {SPR_RTCH, 1|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE3}, // S_REDZELDAFIRE2 - {SPR_RTCH, 2|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE4}, // S_REDZELDAFIRE3 - {SPR_RTCH, 3|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE1}, // S_REDZELDAFIRE4 + {SPR_RTCH, FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE2}, // S_REDZELDAFIRE1 + {SPR_RTCH, 1|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE3}, // S_REDZELDAFIRE2 + {SPR_RTCH, 2|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE4}, // S_REDZELDAFIRE3 + {SPR_RTCH, 3|FF_FULLBRIGHT|FF_TRANS50, 3, {NULL}, 0, 0, S_REDZELDAFIRE1}, // S_REDZELDAFIRE4 - {SPR_BOWL, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BOWLINGPIN - {SPR_BOWH, 0, 4, {A_BunnyHop}, 5, 20, S_BOWLINGHIT2}, // S_BOWLINGHIT1 - {SPR_BOWH, 1, 2, {NULL}, 0, 0, S_BOWLINGHIT3}, // S_BOWLINGHIT2 - {SPR_BOWH, 2, 2, {NULL}, 0, 0, S_BOWLINGHIT4}, // S_BOWLINGHIT3 - {SPR_BOWH, 3, 2, {NULL}, 0, 0, S_NULL}, // S_BOWLINGHIT4 + {SPR_BOWL, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BOWLINGPIN + {SPR_BOWH, 0, 4, {A_BunnyHop}, 5, 20, S_BOWLINGHIT2}, // S_BOWLINGHIT1 + {SPR_BOWH, 1, 2, {NULL}, 0, 0, S_BOWLINGHIT3}, // S_BOWLINGHIT2 + {SPR_BOWH, 2, 2, {NULL}, 0, 0, S_BOWLINGHIT4}, // S_BOWLINGHIT3 + {SPR_BOWH, 3, 2, {NULL}, 0, 0, S_NULL}, // S_BOWLINGHIT4 - {SPR_TOAD, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ARIDTOAD - {SPR_TOAH, 0, 4, {A_BunnyHop}, 10, 60, S_TOADHIT2}, // S_TOADHIT1 - {SPR_TOAH, 1, 3, {NULL}, 0, 0, S_TOADHIT3}, // S_TOADHIT2 - {SPR_TOAH, 2, 3, {NULL}, 0, 0, S_TOADHIT4}, // S_TOADHIT3 - {SPR_TOAH, 3, 3, {NULL}, 0, 0, S_EBARREL18}, // S_TOADHIT4 + {SPR_TOAD, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ARIDTOAD + {SPR_TOAH, 0, 4, {A_BunnyHop}, 10, 60, S_TOADHIT2}, // S_TOADHIT1 + {SPR_TOAH, 1, 3, {NULL}, 0, 0, S_TOADHIT3}, // S_TOADHIT2 + {SPR_TOAH, 2, 3, {NULL}, 0, 0, S_TOADHIT4}, // S_TOADHIT3 + {SPR_TOAH, 3, 3, {NULL}, 0, 0, S_EBARREL18}, // S_TOADHIT4 - {SPR_BRRL, 0, 1, {A_Look}, (96<<16)|1, 0, S_EBARRELIDLE}, // S_EBARRELIDLE - {SPR_BRRR, 0, 4, {NULL}, 0, 0, S_EBARREL2}, // S_EBARREL1 - {SPR_BRRR, 1, 4, {NULL}, 0, 0, S_EBARREL3}, // S_EBARREL2 - {SPR_BRRR, 2, 4, {NULL}, 0, 0, S_EBARREL4}, // S_EBARREL3 - {SPR_BRRR, 3, 4, {NULL}, 0, 0, S_EBARREL5}, // S_EBARREL4 - {SPR_BRRR, 4, 4, {NULL}, 0, 0, S_EBARREL6}, // S_EBARREL5 - {SPR_BRRR, 5, 4, {NULL}, 0, 0, S_EBARREL7}, // S_EBARREL6 - {SPR_BRRR, 6, 4, {NULL}, 0, 0, S_EBARREL8}, // S_EBARREL7 - {SPR_BRRR, 7, 4, {NULL}, 0, 0, S_EBARREL9}, // S_EBARREL8 - {SPR_BRRR, 8, 4, {NULL}, 0, 0, S_EBARREL10}, // S_EBARREL9 - {SPR_BRRR, 9, 4, {NULL}, 0, 0, S_EBARREL11}, // S_EBARREL10 - {SPR_BRRR, 10, 4, {NULL}, 0, 0, S_EBARREL12}, // S_EBARREL11 - {SPR_BRRR, 11, 4, {NULL}, 0, 0, S_EBARREL13}, // S_EBARREL12 - {SPR_BRRR, 12, 4, {NULL}, 0, 0, S_EBARREL14}, // S_EBARREL13 - {SPR_BRRR, 13, 4, {NULL}, 0, 0, S_EBARREL15}, // S_EBARREL14 - {SPR_BRRR, 14, 4, {NULL}, 0, 0, S_EBARREL16}, // S_EBARREL15 - {SPR_BRRR, 15, 4, {NULL}, 0, 0, S_EBARREL17}, // S_EBARREL16 - {SPR_BRRR, 16, 4, {NULL}, 0, 0, S_EBARREL18}, // S_EBARREL17 - {SPR_BRRR, 16, 0, {A_MineExplode}, MT_MINEEXPLOSION, 0, S_NULL}, // S_EBARREL18 + {SPR_BRRL, 0, 1, {A_Look}, (96<<16)|1, 0, S_EBARRELIDLE}, // S_EBARRELIDLE + {SPR_BRRR, 0, 4, {NULL}, 0, 0, S_EBARREL2}, // S_EBARREL1 + {SPR_BRRR, 1, 4, {NULL}, 0, 0, S_EBARREL3}, // S_EBARREL2 + {SPR_BRRR, 2, 4, {NULL}, 0, 0, S_EBARREL4}, // S_EBARREL3 + {SPR_BRRR, 3, 4, {NULL}, 0, 0, S_EBARREL5}, // S_EBARREL4 + {SPR_BRRR, 4, 4, {NULL}, 0, 0, S_EBARREL6}, // S_EBARREL5 + {SPR_BRRR, 5, 4, {NULL}, 0, 0, S_EBARREL7}, // S_EBARREL6 + {SPR_BRRR, 6, 4, {NULL}, 0, 0, S_EBARREL8}, // S_EBARREL7 + {SPR_BRRR, 7, 4, {NULL}, 0, 0, S_EBARREL9}, // S_EBARREL8 + {SPR_BRRR, 8, 4, {NULL}, 0, 0, S_EBARREL10}, // S_EBARREL9 + {SPR_BRRR, 9, 4, {NULL}, 0, 0, S_EBARREL11}, // S_EBARREL10 + {SPR_BRRR, 10, 4, {NULL}, 0, 0, S_EBARREL12}, // S_EBARREL11 + {SPR_BRRR, 11, 4, {NULL}, 0, 0, S_EBARREL13}, // S_EBARREL12 + {SPR_BRRR, 12, 4, {NULL}, 0, 0, S_EBARREL14}, // S_EBARREL13 + {SPR_BRRR, 13, 4, {NULL}, 0, 0, S_EBARREL15}, // S_EBARREL14 + {SPR_BRRR, 14, 4, {NULL}, 0, 0, S_EBARREL16}, // S_EBARREL15 + {SPR_BRRR, 15, 4, {NULL}, 0, 0, S_EBARREL17}, // S_EBARREL16 + {SPR_BRRR, 16, 4, {NULL}, 0, 0, S_EBARREL18}, // S_EBARREL17 + {SPR_BRRR, 16, 0, {A_MineExplode}, MT_MINEEXPLOSION, 0, S_NULL}, // S_EBARREL18 - {SPR_HRSE, 0, 230, {A_PlaySeeSound}, 0, 0, S_MERRYHORSE}, // S_MERRYHORSE + {SPR_HRSE, 0, 230, {A_PlaySeeSound}, 0, 0, S_MERRYHORSE}, // S_MERRYHORSE - {SPR_BFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BLUEFRUIT - {SPR_OFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ORANGEFRUIT - {SPR_RFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_REDFRUIT - {SPR_PFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PINKFRUIT + {SPR_BFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_BLUEFRUIT + {SPR_OFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_ORANGEFRUIT + {SPR_RFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_REDFRUIT + {SPR_PFRT, 0, -1, {NULL}, 0, 0, S_NULL}, // S_PINKFRUIT - {SPR_ASPK, 0, 50, {A_PlayAttackSound}, 0, 0, S_ADVENTURESPIKEA2}, // S_ADVENTURESPIKEA1 - {SPR_ASPK, 0, 50, {A_BunnyHop}, 20, 0, S_ADVENTURESPIKEA1}, // S_ADVENTURESPIKEA2 - {SPR_ASPK, 0, 50, {A_PlayAttackSound}, 0, 0, S_ADVENTURESPIKEB2}, // S_ADVENTURESPIKEB1 - {SPR_ASPK, 0, 35, {A_BunnyHop}, 15, 0, S_ADVENTURESPIKEB1}, // S_ADVENTURESPIKEB2 - {SPR_ASPK, 0, 50, {A_PlayAttackSound}, 0, 0, S_ADVENTURESPIKEC2}, // S_ADVENTURESPIKEC1 - {SPR_ASPK, 0, 65, {A_BunnyHop}, 25, 0, S_ADVENTURESPIKEC1}, // S_ADVENTURESPIKEC1 + {SPR_ASPK, 0, 50, {A_PlayAttackSound}, 0, 0, S_ADVENTURESPIKEA2}, // S_ADVENTURESPIKEA1 + {SPR_ASPK, 0, 50, {A_BunnyHop}, 20, 0, S_ADVENTURESPIKEA1}, // S_ADVENTURESPIKEA2 + {SPR_ASPK, 0, 50, {A_PlayAttackSound}, 0, 0, S_ADVENTURESPIKEB2}, // S_ADVENTURESPIKEB1 + {SPR_ASPK, 0, 35, {A_BunnyHop}, 15, 0, S_ADVENTURESPIKEB1}, // S_ADVENTURESPIKEB2 + {SPR_ASPK, 0, 50, {A_PlayAttackSound}, 0, 0, S_ADVENTURESPIKEC2}, // S_ADVENTURESPIKEC1 + {SPR_ASPK, 0, 65, {A_BunnyHop}, 25, 0, S_ADVENTURESPIKEC1}, // S_ADVENTURESPIKEC1 - {SPR_HBST, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTPROMPT2}, // S_BOOSTPROMPT1 - {SPR_HBST, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTPROMPT1}, // S_BOOSTPROMPT2 + {SPR_HBST, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTPROMPT2}, // S_BOOSTPROMPT1 + {SPR_HBST, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTPROMPT1}, // S_BOOSTPROMPT2 - {SPR_HBSF, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTOFF2}, // S_BOOSTOFF1 - {SPR_HBSF, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTOFF1}, // S_BOOSTOFF2 + {SPR_HBSF, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTOFF2}, // S_BOOSTOFF1 + {SPR_HBSF, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTOFF1}, // S_BOOSTOFF2 - {SPR_HBSO, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTON2}, // S_BOOSTON1 - {SPR_HBSO, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTON1}, // S_BOOSTON2 + {SPR_HBSO, FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTON2}, // S_BOOSTON1 + {SPR_HBSO, 1|FF_FULLBRIGHT, 5, {NULL}, 0, 0, S_BOOSTON1}, // S_BOOSTON2 - {SPR_WBLZ, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIZARDMAN - {SPR_WBLN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIONMAN + {SPR_WBLZ, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIZARDMAN + {SPR_WBLN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIONMAN + + {SPR_FWRK, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARMAFIREWORK2}, // S_KARMAFIREWORK1 + {SPR_FWRK, 1|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARMAFIREWORK3}, // S_KARMAFIREWORK2 + {SPR_FWRK, 2|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARMAFIREWORK4}, // S_KARMAFIREWORK3 + {SPR_FWRK, 3|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARMAFIREWORK1}, // S_KARMAFIREWORK4 + {SPR_FWRK, 4|FF_FULLBRIGHT, TICRATE, {NULL}, 0, 0, S_NULL}, // S_KARMAFIREWORKTRAIL #ifdef SEENAMES {SPR_NULL, 0, 1, {NULL}, 0, 0, S_NULL}, // S_NAMECHECK @@ -20019,6 +20025,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_KARMAFIREWORK + -1, // doomednum + S_KARMAFIREWORK1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 8<target->player->kartstuff[k_comebackmode] == 1 && P_CanPickupItem(player, 1)) { - mobj_t *poof = P_SpawnMobj(tmthing->x, tmthing->y, tmthing->z, MT_EXPLODE); + mobj_t *poof = P_SpawnMobj(special->x, special->y, special->z, MT_EXPLODE); S_StartSound(poof, special->info->seesound); + // Karma fireworks + for (i = 0; i < 5; i++) + { + mobj_t *firework = P_SpawnMobj(special->x, special->y, special->z, MT_KARMAFIREWORK); + P_Thrust(firework, FixedAngle((72*i)<scale); + P_SetObjectMomZ(firework, P_RandomRange(1,8)*special->scale, false); + firework->color = special->target->color; + } + special->target->player->kartstuff[k_comebackmode] = 0; special->target->player->kartstuff[k_comebackpoints]++; diff --git a/src/p_mobj.c b/src/p_mobj.c index 61781aee..96eb3b52 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1413,6 +1413,9 @@ fixed_t P_GetMobjGravity(mobj_t *mo) case MT_SIGN: gravityadd /= 8; break; + case MT_KARMAFIREWORK: + gravityadd /= 3; + break; default: break; } @@ -2523,7 +2526,7 @@ static boolean P_ZMovement(mobj_t *mo) if (P_MobjFlip(mo)*mom.z < 0) { // If going slower than a fracunit, just stop. - if (abs(mom.z) < FixedMul(FRACUNIT, mo->scale)) + if (abs(mom.z) < mo->scale) { mom.x = mom.y = mom.z = 0; @@ -8611,7 +8614,9 @@ void P_MobjThinker(mobj_t *mobj) if (!S_SoundPlaying(mobj, mobj->info->attacksound)) S_StartSound(mobj, mobj->info->attacksound); - if (mobj->extravalue2 > 70) // fire + smoke pillar + if (mobj->extravalue2 <= 8) // Short delay + mobj->extravalue2++; // flametimer + else // fire + smoke pillar { UINT8 i; mobj_t *fire = P_SpawnMobj(mobj->x + (P_RandomRange(-32, 32)*mobj->scale), mobj->y + (P_RandomRange(-32, 32)*mobj->scale), mobj->z, MT_THOK); @@ -8635,20 +8640,6 @@ void P_MobjThinker(mobj_t *mobj) smoke->scalespeed = mobj->scale/24; } } - else - { - mobj->extravalue2++; // flametimer - - if (mobj->extravalue2 > 8) - { - mobj_t *smoke = P_SpawnMobj(mobj->x + (P_RandomRange(-31, 31)*mobj->scale), mobj->y + (P_RandomRange(-31, 31)*mobj->scale), - mobj->z + (P_RandomRange(0, 48)*mobj->scale), MT_THOK); - - P_SetMobjState(smoke, S_FZEROSMOKE1); - smoke->tics += P_RandomRange(-3, 4); - smoke->scale = mobj->scale*2; - } - } break; case MT_EZZPROPELLER: if (mobj->hnext) @@ -9093,6 +9084,22 @@ void P_MobjThinker(mobj_t *mobj) } } break; + case MT_KARMAFIREWORK: + if (mobj->momz == 0) + { + P_RemoveMobj(mobj); + return; + } + else + { + mobj_t *trail = P_SpawnMobj(mobj->x, mobj->y, mobj->z, MT_THOK); + P_SetMobjState(trail, S_KARMAFIREWORKTRAIL); + P_SetScale(trail, mobj->scale); + trail->destscale = 1; + trail->scalespeed = mobj->scale/12; + trail->color = mobj->color; + } + break; //} case MT_TURRET: P_MobjCheckWater(mobj); From 62b975440716504633c0cfb2a078e49231d1aede Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 26 Nov 2018 03:19:31 -0500 Subject: [PATCH 19/22] This sound doesn't exist yet, but I'm defining it anyway --- src/k_kart.c | 2 +- src/sounds.c | 1 + src/sounds.h | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9451a792..0f41f9ce 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1012,7 +1012,7 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) player->kartstuff[k_roulettetype] = 0; // This too if (P_IsLocalPlayer(player)) - S_StartSound(NULL, (mashed ? sfx_itrolm : sfx_itrolf)); + S_StartSound(NULL, ((player->kartstuff[k_roulettetype] == 1) ? sfx_itrolk : (mashed ? sfx_itrolm : sfx_itrolf))); } //} diff --git a/src/sounds.c b/src/sounds.c index 900c88f9..b6bf7f55 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -793,6 +793,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"itrol8", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"itrolf", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Roulette end {"itrolm", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Roulette end (mashed) + {"itrolk", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Roulette end (karma enhanced) {"itrole", true, 96, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Roulette end (Eggman) {"vroom", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart Krew opening vroom {"chaooo", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Chao audience cheer diff --git a/src/sounds.h b/src/sounds.h index 1e287a6b..5ca6be1c 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -868,6 +868,7 @@ typedef enum sfx_itrol8, sfx_itrolf, sfx_itrolm, + sfx_itrolk, sfx_itrole, sfx_vroom, sfx_chaooo, From 4ad32b23d962cd78d35acd0a3446a344e9c6256b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 26 Nov 2018 07:18:21 -0500 Subject: [PATCH 20/22] Find bestrank for 7 sec limit enforcement --- src/p_enemy.c | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/p_enemy.c b/src/p_enemy.c index dd68a02c..2e806bc0 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8359,6 +8359,28 @@ void A_SPBChase(mobj_t *actor) return; } + // Find the player with the best rank + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator || players[i].exiting) + continue; // not in-game + + if (!players[i].mo) + continue; // no mobj + + if (players[i].mo->health <= 0) + continue; // dead + + /*if (players[i].kartstuff[k_respawn]) + continue;*/ // respawning + + if (players[i].kartstuff[k_position] < bestrank) + { + bestrank = players[i].kartstuff[k_position]; + player = &players[i]; + } + } + if (actor->extravalue1 == 1) // MODE: TARGETING { if (actor->tracer && actor->tracer->health) @@ -8379,7 +8401,7 @@ void A_SPBChase(mobj_t *actor) defspeed -= (9*R_PointToDist2(0, 0, actor->tracer->player->cmomx, actor->tracer->player->cmomy))/8; // Be fairer on conveyors // Switch targets if you're no longer 1st for long enough - if (actor->tracer->player->kartstuff[k_position] == 1) + if (actor->tracer->player->kartstuff[k_position] <= bestrank) actor->extravalue2 = 7*TICRATE; else if (actor->extravalue2-- <= 0) actor->extravalue1 = 0; // back to SEEKING @@ -8492,28 +8514,6 @@ void A_SPBChase(mobj_t *actor) { actor->lastlook = -1; // Just make sure this is reset - // Find the player with the best rank - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator || players[i].exiting) - continue; // not in-game - - if (!players[i].mo) - continue; // no mobj - - if (players[i].mo->health <= 0) - continue; // dead - - /*if (players[i].kartstuff[k_respawn]) - continue;*/ // respawning - - if (players[i].kartstuff[k_position] < bestrank) - { - bestrank = players[i].kartstuff[k_position]; - player = &players[i]; - } - } - // No one there? if (player == NULL || !player->mo) { From 1c907667fc9c99302d12e888852be64fa10bcbc4 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 26 Nov 2018 07:43:05 -0500 Subject: [PATCH 21/22] Slow down animation --- src/info.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/info.c b/src/info.c index c26b83bc..faa4b188 100644 --- a/src/info.c +++ b/src/info.c @@ -3388,10 +3388,10 @@ state_t states[NUMSTATES] = {SPR_WBLZ, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIZARDMAN {SPR_WBLN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_LIONMAN - {SPR_FWRK, FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARMAFIREWORK2}, // S_KARMAFIREWORK1 - {SPR_FWRK, 1|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARMAFIREWORK3}, // S_KARMAFIREWORK2 - {SPR_FWRK, 2|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARMAFIREWORK4}, // S_KARMAFIREWORK3 - {SPR_FWRK, 3|FF_FULLBRIGHT, 1, {NULL}, 0, 0, S_KARMAFIREWORK1}, // S_KARMAFIREWORK4 + {SPR_FWRK, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KARMAFIREWORK2}, // S_KARMAFIREWORK1 + {SPR_FWRK, 1|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KARMAFIREWORK3}, // S_KARMAFIREWORK2 + {SPR_FWRK, 2|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KARMAFIREWORK4}, // S_KARMAFIREWORK3 + {SPR_FWRK, 3|FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_KARMAFIREWORK1}, // S_KARMAFIREWORK4 {SPR_FWRK, 4|FF_FULLBRIGHT, TICRATE, {NULL}, 0, 0, S_NULL}, // S_KARMAFIREWORKTRAIL #ifdef SEENAMES From 92225748e51523d6c80f7a80f1e61113cd3545ab Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 26 Nov 2018 23:34:43 -0500 Subject: [PATCH 22/22] Fix order so the new sound can actually play --- src/k_kart.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index a8fbeea5..b7a17cee 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1006,13 +1006,14 @@ static void K_KartItemRoulette(player_t *player, ticcmd_t *cmd) player->kartstuff[k_itemamount] = 1; } - player->kartstuff[k_itemblink] = TICRATE; - player->kartstuff[k_itemblinkmode] = ((player->kartstuff[k_roulettetype] == 1) ? 2 : (mashed ? 1 : 0)); - player->kartstuff[k_itemroulette] = 0; // Since we're done, clear the roulette number - player->kartstuff[k_roulettetype] = 0; // This too - if (P_IsLocalPlayer(player)) S_StartSound(NULL, ((player->kartstuff[k_roulettetype] == 1) ? sfx_itrolk : (mashed ? sfx_itrolm : sfx_itrolf))); + + player->kartstuff[k_itemblink] = TICRATE; + player->kartstuff[k_itemblinkmode] = ((player->kartstuff[k_roulettetype] == 1) ? 2 : (mashed ? 1 : 0)); + + player->kartstuff[k_itemroulette] = 0; // Since we're done, clear the roulette number + player->kartstuff[k_roulettetype] = 0; // This too } //}