From 5ebd3119dafb2e879051a4649bda722744e75c2f Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 23 Oct 2018 20:53:05 -0400 Subject: [PATCH 01/49] Divide sound volume by number of local players --- src/s_sound.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/s_sound.c b/src/s_sound.c index d87b6106d..91d857464 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -530,6 +530,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) // Initialize sound parameters pitch = NORM_PITCH; priority = NORM_PRIORITY; + volume /= (splitscreen+1); if (splitscreen && listenmobj2) // Copy the sound for the split player { @@ -1007,7 +1008,7 @@ void S_UpdateSounds(void) if (I_SoundIsPlaying(c->handle)) { // initialize parameters - volume = 255; // 8 bits internal volume precision + volume = 255/(splitscreen+1); // 8 bits internal volume precision pitch = NORM_PITCH; sep = NORM_SEP; @@ -1325,6 +1326,8 @@ INT32 S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32 *v *vol = (15 * ((S_CLIPPING_DIST - approx_dist)>>FRACBITS)) / S_ATTENUATOR; } + *vol /= (splitscreen+1); + return (*vol > 0); } From 95875289b8bd289f2d12ef55cd23682c119dc563 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 25 Oct 2018 22:53:58 -0400 Subject: [PATCH 02/49] - Reduce volume reduction - Don't apply to sounds without an origin mobj --- src/s_sound.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index 91d857464..8f2e4a359 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -530,7 +530,9 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) // Initialize sound parameters pitch = NORM_PITCH; priority = NORM_PRIORITY; - volume /= (splitscreen+1); + + if (origin) + volume = FixedDiv(volume<>FRACBITS; if (splitscreen && listenmobj2) // Copy the sound for the split player { @@ -1008,10 +1010,13 @@ void S_UpdateSounds(void) if (I_SoundIsPlaying(c->handle)) { // initialize parameters - volume = 255/(splitscreen+1); // 8 bits internal volume precision + volume = 255; // 8 bits internal volume precision pitch = NORM_PITCH; sep = NORM_SEP; + if (c->origin) + volume = FixedDiv(volume<>FRACBITS; + // check non-local sounds for distance clipping // or modify their params if (c->origin && ((c->origin != players[consoleplayer].mo) @@ -1326,7 +1331,7 @@ INT32 S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32 *v *vol = (15 * ((S_CLIPPING_DIST - approx_dist)>>FRACBITS)) / S_ATTENUATOR; } - *vol /= (splitscreen+1); + *vol = FixedDiv((*vol)<>FRACBITS; return (*vol > 0); } From bd79aaf8473116808335f0227a1ca42c906b6a29 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 26 Oct 2018 00:51:58 -0400 Subject: [PATCH 03/49] Speed up spinout based on timer left --- src/p_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 0f89f8262..3b7410a52 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6657,7 +6657,7 @@ static void P_MovePlayer(player_t *player) if (player->mo->state != &states[S_KART_SPIN]) P_SetPlayerMobjState(player->mo, S_KART_SPIN); - player->frameangle -= ANGLE_22h; + player->frameangle -= (ANGLE_11hh * min(8, player->kartstuff[k_spinouttimer]/8)); } else if (player->powers[pw_nocontrol] && player->pflags & PF_SKIDDOWN) { From 0492ddc3ad027bab62b9af5561d9d70ca5c9a9fb Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 26 Oct 2018 00:55:20 -0400 Subject: [PATCH 04/49] Adjust spinout times to face your forward about 90% of the time --- src/k_kart.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 76670f178..33c954b2b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1849,7 +1849,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem if (player->kartstuff[k_spinouttype] <= 0) { - player->kartstuff[k_spinouttimer] = 3*TICRATE/2; // Banana Spinout + player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2; // Banana Spinout // At spinout, player speed is increased to 1/4 their regular speed, moving them forward if (player->speed < K_GetKartSpeed(player, true)/4) @@ -1858,7 +1858,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem S_StartSound(player->mo, sfx_slip); } else - player->kartstuff[k_spinouttimer] = TICRATE+20; // Wipeout + player->kartstuff[k_spinouttimer] = TICRATE+27; // Wipeout player->powers[pw_flashing] = K_GetKartFlashing(player); @@ -2032,7 +2032,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b if (inflictor && inflictor->type == MT_SPBEXPLOSION && inflictor->extravalue1) { - player->kartstuff[k_spinouttimer] = (3*player->kartstuff[k_spinouttimer])/2; + player->kartstuff[k_spinouttimer] = ((3*player->kartstuff[k_spinouttimer])/2)+1; player->mo->momz *= 2; } From 2096b56da2aaca1fa5b08a9133ba9c97a59c4418 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 26 Oct 2018 00:56:02 -0400 Subject: [PATCH 05/49] CRITICAL BUGFIX Make sure flashing tics don't go down WHILE you're in a hit animation (wipeout, squished) --- src/k_kart.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 33c954b2b..bb9ac47bb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3956,6 +3956,18 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->kartstuff[k_timeovercam] = 0; + // Make ABSOLUTELY SURE that your flashing tics don't get set WHILE you're still in hit animations. + if (player->kartstuff[k_spinouttimer] != 0 + || player->kartstuff[k_wipeoutslow] != 0 + || player->kartstuff[k_squishedtimer] != 0) + { + player->powers[pw_flashing] = K_GetKartFlashing(player); + } + else if (player->powers[pw_flashing] == K_GetKartFlashing(player)) + { + player->powers[pw_flashing]--; + } + if (player->kartstuff[k_spinouttimer]) { if ((P_IsObjectOnGround(player->mo) || player->kartstuff[k_spinouttype] == 1) @@ -3983,9 +3995,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) } } - if (player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == K_GetKartFlashing(player)) - player->powers[pw_flashing]--; - /*if (player->kartstuff[k_thunderanim]) player->kartstuff[k_thunderanim]--;*/ From 46164a7f46c7d0c10775932d97c9662b46b9ddb6 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 26 Oct 2018 01:07:14 -0400 Subject: [PATCH 06/49] More consistent face-forward Needs it to still land in a close ballpark, so the timer changes are still needed, but this makes it less prone to error --- src/p_user.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 3b7410a52..ac4847e7b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6654,10 +6654,15 @@ static void P_MovePlayer(player_t *player) } else if (player->kartstuff[k_spinouttimer] > 0 || player->pflags & PF_SLIDING) { + INT32 speed = max(1, min(8, player->kartstuff[k_spinouttimer]/8)); + if (player->mo->state != &states[S_KART_SPIN]) P_SetPlayerMobjState(player->mo, S_KART_SPIN); - player->frameangle -= (ANGLE_11hh * min(8, player->kartstuff[k_spinouttimer]/8)); + if (speed == 1 && abs(player->mo->angle - player->frameangle) < ANGLE_22h) + player->frameangle = player->mo->angle; // Face forward at the end of the animation + else + player->frameangle -= (ANGLE_11hh * speed); } else if (player->powers[pw_nocontrol] && player->pflags & PF_SKIDDOWN) { From bb7ef3798c7a965bb3d8a7a0b0d8cc2759c2de1d Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 26 Oct 2018 01:07:54 -0400 Subject: [PATCH 07/49] Combine spinout & wipeout timers Turns out they were only 1 tic apart originally, sooo --- src/k_kart.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index bb9ac47bb..35044002f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1847,19 +1847,15 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem player->kartstuff[k_spinouttype] = type; - if (player->kartstuff[k_spinouttype] <= 0) + if (player->kartstuff[k_spinouttype] <= 0) // type 0 is spinout, type 1 is wipeout { - player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2; // Banana Spinout - // At spinout, player speed is increased to 1/4 their regular speed, moving them forward if (player->speed < K_GetKartSpeed(player, true)/4) P_InstaThrust(player->mo, player->mo->angle, FixedMul(K_GetKartSpeed(player, true)/4, player->mo->scale)); - S_StartSound(player->mo, sfx_slip); } - else - player->kartstuff[k_spinouttimer] = TICRATE+27; // Wipeout + player->kartstuff[k_spinouttimer] = (3*TICRATE/2)+2; player->powers[pw_flashing] = K_GetKartFlashing(player); if (player->mo->state != &states[S_KART_SPIN]) From f35374defc3fc3cdf8ea95045ff242c08cf53345 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 20:39:41 +0100 Subject: [PATCH 08/49] Fade stuff! * Make the white intro fade always drawn, rather than potentially disable-able through tab or HUD disable. * Slightly increase the darkness of the intermission fade, since its current value had a negative effect on SKINCOLOR_SAPPHIRE. --- src/k_kart.c | 9 --------- src/st_stuff.c | 15 ++++++++++++--- src/y_inter.c | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 76670f178..0e405bbc4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7509,15 +7509,6 @@ void K_drawKartHUD(void) || ((splitscreen > 2 && stplyr == &players[fourthdisplayplayer]) && !camera4.chase)) K_drawKartFirstPerson(); - // Draw a white fade on level opening - if (leveltime < 15 && stplyr == &players[displayplayer]) - { - if (leveltime <= 5) - V_DrawFill(0,0,BASEVIDWIDTH,BASEVIDHEIGHT,120); // Pure white on first few frames, to hide SRB2's awful level load artifacts - else - V_DrawFadeScreen(120, 15-leveltime); // Then gradually fade out from there - } - if (splitscreen == 2) // Player 4 in 3P is the minimap :p K_drawKartMinimap(); diff --git a/src/st_stuff.c b/src/st_stuff.c index 5ba000156..b7384f216 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1903,13 +1903,13 @@ static void ST_overlayDrawer(void) if(!P_IsLocalPlayer(stplyr)) { - char name[MAXPLAYERNAME+1]; + /*char name[MAXPLAYERNAME+1]; // shorten the name if its more than twelve characters. - strlcpy(name, player_names[stplyr-players], 13); + strlcpy(name, player_names[stplyr-players], 13);*/ // Show name of player being displayed V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-40, 0, M_GetText("Viewpoint:")); - V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-32, V_ALLOWLOWERCASE, name); + V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-32, V_ALLOWLOWERCASE, player_names[stplyr-players]); } // This is where we draw all the fun cheese if you have the chasecam off! @@ -2065,4 +2065,13 @@ void ST_Drawer(void) if (mapheaderinfo[gamemap-1]->typeoflevel & TOL_TV) // Very specific Midnight Channel stuff. ST_MayonakaStatic(); } + + // Draw a white fade on level opening + if (leveltime < 15) + { + if (leveltime <= 5) + V_DrawFill(0,0,BASEVIDWIDTH,BASEVIDHEIGHT,120); // Pure white on first few frames, to hide SRB2's awful level load artifacts + else + V_DrawFadeScreen(120, 15-leveltime); // Then gradually fade out from there + } } diff --git a/src/y_inter.c b/src/y_inter.c index 9361dbe3c..c779ee3c3 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -348,7 +348,7 @@ void Y_IntermissionDrawer(void) V_DrawPatchFill(bgtile); if (usebuffer) // Fade everything out - V_DrawFadeScreen(0xFF00, 20); + V_DrawFadeScreen(0xFF00, 22); if (!splitscreen) whiteplayer = demoplayback ? displayplayer : consoleplayer; From 88b13212d9d0d7b31fcf423435a2ca0594d0c61d Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 20:43:33 +0100 Subject: [PATCH 09/49] Minor things that annoyed me to NO GOOD END. * Tweak the demo info layout (holding tab while demoplayback) to better match the Viewpoint text in MP. * Make the tab rankings view support widescreen better, including the spectator ticker (but not the player name layout). * Make the tab rankings view always have a darkened background, to get around the fact we can't darken it based on player state for battle. * Remove FREE PLAY from tab rankings. --- src/hu_stuff.c | 72 +++++++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 4210b70ed..d77ae3566 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -109,8 +109,8 @@ static patch_t *crosshair[HU_CROSSHAIRS]; // 3 precached crosshair graphics // protos. // ------- static void HU_DrawRankings(void); -static void HU_DrawCoopOverlay(void); -static void HU_DrawNetplayCoopOverlay(void); +//static void HU_DrawCoopOverlay(void); +//static void HU_DrawNetplayCoopOverlay(void); //====================================================================== // KEYBOARD LAYOUTS FOR ENTERING TEXT @@ -2020,26 +2020,27 @@ UINT32 hu_demolap; static void HU_DrawDemoInfo(void) { - V_DrawString(4, 188-16, V_YELLOWMAP, va(M_GetText("%s's replay"), player_names[0])); + V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-40, 0, M_GetText("Replay:")); + V_DrawCenteredString((BASEVIDWIDTH/2), BASEVIDHEIGHT-32, V_ALLOWLOWERCASE, player_names[0]); if (modeattacking) { - V_DrawString(4, 188-8, V_YELLOWMAP|V_MONOSPACE, "BEST TIME:"); + V_DrawRightAlignedString((BASEVIDWIDTH/2)-4, BASEVIDHEIGHT-24, V_YELLOWMAP|V_MONOSPACE, "BEST TIME:"); if (hu_demotime != UINT32_MAX) - V_DrawRightAlignedString(120, 188-8, V_MONOSPACE, va("%i:%02i.%02i", + V_DrawString((BASEVIDWIDTH/2)+4, BASEVIDHEIGHT-24, V_MONOSPACE, va("%i'%02i\"%02i", G_TicsToMinutes(hu_demotime,true), G_TicsToSeconds(hu_demotime), G_TicsToCentiseconds(hu_demotime))); else - V_DrawRightAlignedString(120, 188-8, V_MONOSPACE, "--:--.--"); + V_DrawString((BASEVIDWIDTH/2)+4, BASEVIDHEIGHT-24, V_MONOSPACE, "--'--\"--"); - V_DrawString(4, 188, V_YELLOWMAP|V_MONOSPACE, "BEST LAP:"); + V_DrawRightAlignedString((BASEVIDWIDTH/2)-4, BASEVIDHEIGHT-16, V_YELLOWMAP|V_MONOSPACE, "BEST LAP:"); if (hu_demolap != UINT32_MAX) - V_DrawRightAlignedString(120, 188, V_MONOSPACE, va("%i:%02i.%02i", + V_DrawString((BASEVIDWIDTH/2)+4, BASEVIDHEIGHT-16, V_MONOSPACE, va("%i'%02i\"%02i", G_TicsToMinutes(hu_demolap,true), G_TicsToSeconds(hu_demolap), G_TicsToCentiseconds(hu_demolap))); else - V_DrawRightAlignedString(120, 188, V_MONOSPACE, "--:--.--"); + V_DrawString((BASEVIDWIDTH/2)+4, BASEVIDHEIGHT-16, V_MONOSPACE, "--'--\"--"); } } @@ -2112,11 +2113,11 @@ void HU_Drawer(void) if (LUA_HudEnabled(hud_rankings)) #endif HU_DrawRankings(); - if (gametype == GT_COOP) - HU_DrawNetplayCoopOverlay(); + //if (gametype == GT_COOP) + //HU_DrawNetplayCoopOverlay(); } - else - HU_DrawCoopOverlay(); + //else + //HU_DrawCoopOverlay(); #ifdef HAVE_BLUA LUAh_ScoresHUD(); #endif @@ -2274,11 +2275,12 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I { INT32 i, j, rightoffset = 240; const UINT8 *colormap; + INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; //this function is designed for 9 or less score lines only //I_Assert(scorelines <= 9); -- not today bitch, kart fixed it up - V_DrawFill(1, 26, 318, 1, 0); // Draw a horizontal line because it looks nice! + V_DrawFill(1-duptweak, 26, dupadjust-2, 1, 0); // Draw a horizontal line because it looks nice! if (scorelines > 8) { V_DrawFill(160, 26, 1, 154, 0); // Draw a vertical line to separate the two sides. @@ -2562,16 +2564,17 @@ void HU_DrawEmeralds(INT32 x, INT32 y, INT32 pemeralds) // static inline void HU_DrawSpectatorTicker(void) { - int i; - int length = 0, height = 174; - int totallength = 0, templength = 0; + INT32 i; + INT32 length = 0, height = 174; + INT32 totallength = 0, templength = -8; + INT32 dupadjust = (vid.width/vid.dupx), duptweak = (dupadjust - BASEVIDWIDTH)/2; for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].spectator) totallength += (signed)strlen(player_names[i]) * 8 + 16; - length -= (leveltime % (totallength + BASEVIDWIDTH)); - length += BASEVIDWIDTH; + length -= (leveltime % (totallength + dupadjust+8)); + length += dupadjust; for (i = 0; i < MAXPLAYERS; i++) if (playeringame[i] && players[i].spectator) @@ -2579,15 +2582,18 @@ static inline void HU_DrawSpectatorTicker(void) char *pos; char initial[MAXPLAYERNAME+1]; char current[MAXPLAYERNAME+1]; + INT32 len; + + len = ((signed)strlen(player_names[i]) * 8 + 16); strcpy(initial, player_names[i]); pos = initial; - if (length >= -((signed)strlen(player_names[i]) * 8 + 16) && length <= BASEVIDWIDTH) + if (length >= -len) { - if (length < 0) + if (length < -8) { - UINT8 eatenchars = (UINT8)(abs(length) / 8 + 1); + UINT8 eatenchars = (UINT8)(abs(length) / 8); if (eatenchars <= strlen(initial)) { @@ -2595,7 +2601,7 @@ static inline void HU_DrawSpectatorTicker(void) // then compensate the drawing position. pos += eatenchars; strcpy(current, pos); - templength = length % 8 + 8; + templength = ((length + 8) % 8); } else { @@ -2609,10 +2615,11 @@ static inline void HU_DrawSpectatorTicker(void) templength = length; } - V_DrawString(templength, height + 8, V_TRANSLUCENT, current); + V_DrawString(templength - duptweak, height, V_TRANSLUCENT|V_ALLOWLOWERCASE, current); } - length += (signed)strlen(player_names[i]) * 8 + 16; + if ((length += len) >= dupadjust+8) + break; } } @@ -2627,6 +2634,8 @@ static void HU_DrawRankings(void) boolean completed[MAXPLAYERS]; UINT32 whiteplayer = MAXPLAYERS; + V_DrawFadeScreen(0xFF00, 16); // A little more readable, and prevents cheating the fades under other circumstances. + if (cons_menuhighlight.value) hilicol = cons_menuhighlight.value; else if (modeattacking) @@ -2636,9 +2645,9 @@ static void HU_DrawRankings(void) // draw the current gametype in the lower right if (modeattacking) - V_DrawString(4, 188, hilicol, "Record Attack"); + V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, "Record Attack"); else - V_DrawString(4, 188, hilicol, gametype_cons_t[gametype].strvalue); + V_DrawString(4, 188, hilicol|V_SNAPTOBOTTOM|V_SNAPTOLEFT, gametype_cons_t[gametype].strvalue); if (G_GametypeHasTeams()) { @@ -2733,9 +2742,6 @@ static void HU_DrawRankings(void) numplayersingame++; } - if (netgame && numplayersingame <= 1) - K_drawKartFreePlay(leveltime); - for (j = 0; j < numplayersingame; j++) { UINT8 lowestposition = MAXPLAYERS; @@ -2783,11 +2789,11 @@ static void HU_DrawRankings(void) HU_DrawDualTabRankings(32, 32, tab, scorelines, whiteplayer);*/ // draw spectators in a ticker across the bottom - if (!splitscreen && G_GametypeHasSpectators()) + if (netgame && G_GametypeHasSpectators()) HU_DrawSpectatorTicker(); } -static void HU_DrawCoopOverlay(void) +/*static void HU_DrawCoopOverlay(void) { if (token #ifdef HAVE_BLUA @@ -2843,7 +2849,7 @@ static void HU_DrawNetplayCoopOverlay(void) if (emeralds & (1 << i)) V_DrawScaledPatch(20 + (i * 20), 6, 0, emeraldpics[i]); } -} +}*/ // Interface to CECHO settings for the outside world, avoiding the From 558ca6cfec44865c20698e547ac5fe1b46d395cf Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 20:44:18 +0100 Subject: [PATCH 10/49] Make it so hitting enter on the ipv4 option doesn't close all menus with the warning, only if you start trying to connect. --- src/m_menu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index 1827bf7ba..4019a9162 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -7819,6 +7819,8 @@ static void M_ConnectIP(INT32 choice) return; } + M_ClearMenus(true); + COM_BufAddText(va("connect \"%s\"\n", setupm_ip)); // A little "please wait" message. @@ -7850,7 +7852,6 @@ static void M_HandleConnectIP(INT32 choice) case KEY_ENTER: S_StartSound(NULL,sfx_menu1); // Tails - M_ClearMenus(true); M_ConnectIP(1); break; From e92d03ee940177d455ff07eb03189f2dcf4dbef3 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 21:16:19 +0100 Subject: [PATCH 11/49] As requested by Jeck: * gr_md2 on the menu. * Disable interpolerated model option completely for now. Also, tweaked the GL menus a bit to suck less, since I was ferreting around in that area. --- src/hardware/hw_md2.c | 2 ++ src/m_menu.c | 20 +++++++++++--------- src/v_video.c | 4 ++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/hardware/hw_md2.c b/src/hardware/hw_md2.c index 145a01507..2a0957b91 100644 --- a/src/hardware/hw_md2.c +++ b/src/hardware/hw_md2.c @@ -1328,6 +1328,7 @@ void HWR_DrawMD2(gr_vissprite_t *spr) frame = (spr->mobj->frame & FF_FRAMEMASK) % md2->model->header.numFrames; buff = md2->model->glCommandBuffer; curr = &md2->model->frames[frame]; +#if 0 if (cv_grmd2.value == 1 && tics <= durs) { // frames are handled differently for states with FF_ANIMATE, so get the next frame differently for the interpolation @@ -1348,6 +1349,7 @@ void HWR_DrawMD2(gr_vissprite_t *spr) } } } +#endif //Hurdler: it seems there is still a small problem with mobj angle p.x = FIXED_TO_FLOAT(spr->mobj->x); diff --git a/src/m_menu.c b/src/m_menu.c index 4019a9162..4828c21ba 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1241,7 +1241,8 @@ static menuitem_t OP_VideoOptionsMenu[] = {IT_STRING | IT_CVAR, NULL, "Vertical Sync", &cv_vidwait, 90}, #ifdef HWRENDER - {IT_SUBMENU|IT_STRING, NULL, "OpenGL Options...", &OP_OpenGLOptionsDef, 105}, + {IT_STRING | IT_CVAR, NULL, "3D models", &cv_grmd2, 105}, + {IT_SUBMENU|IT_STRING, NULL, "OpenGL Options...", &OP_OpenGLOptionsDef, 115}, #endif }; @@ -1271,18 +1272,19 @@ static menuitem_t OP_VideoModeMenu[] = #ifdef HWRENDER static menuitem_t OP_OpenGLOptionsMenu[] = { - {IT_STRING|IT_CVAR, NULL, "Field of View", &cv_grfov, 10}, - {IT_STRING|IT_CVAR, NULL, "Quality", &cv_scr_depth, 20}, - {IT_STRING|IT_CVAR, NULL, "Texture Filter", &cv_grfiltermode, 30}, - {IT_STRING|IT_CVAR, NULL, "Anisotropic", &cv_granisotropicmode,40}, -#ifdef _WINDOWS + {IT_SUBMENU|IT_STRING, NULL, "Fog...", &OP_OpenGLFogDef, 10}, + {IT_SUBMENU|IT_STRING, NULL, "Gamma...", &OP_OpenGLColorDef, 20}, + + {IT_STRING|IT_CVAR, NULL, "Field of View", &cv_grfov, 35}, + {IT_STRING|IT_CVAR, NULL, "Quality", &cv_scr_depth, 45}, + {IT_STRING|IT_CVAR, NULL, "Texture Filter", &cv_grfiltermode, 55}, + {IT_STRING|IT_CVAR, NULL, "Anisotropic", &cv_granisotropicmode, 65}, +/*#ifdef _WINDOWS {IT_STRING|IT_CVAR, NULL, "Fullscreen", &cv_fullscreen, 50}, #endif #ifdef ALAM_LIGHTING {IT_SUBMENU|IT_STRING, NULL, "Lighting...", &OP_OpenGLLightingDef, 70}, -#endif - {IT_SUBMENU|IT_STRING, NULL, "Fog...", &OP_OpenGLFogDef, 80}, - {IT_SUBMENU|IT_STRING, NULL, "Gamma...", &OP_OpenGLColorDef, 90}, +#endif*/ }; #ifdef ALAM_LIGHTING diff --git a/src/v_video.c b/src/v_video.c index d57276fa4..fc76bf315 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -78,9 +78,9 @@ consvar_t cv_grcoronas = {"gr_coronas", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, consvar_t cv_grcoronasize = {"gr_coronasize", "1", CV_SAVE| CV_FLOAT, 0, NULL, 0, NULL, NULL, 0, 0, NULL}; #endif -static CV_PossibleValue_t CV_MD2[] = {{0, "Off"}, {1, "On"}, {2, "Old"}, {0, NULL}}; +//static CV_PossibleValue_t CV_MD2[] = {{0, "Off"}, {1, "On"}, {2, "Old"}, {0, NULL}}; // console variables in development -consvar_t cv_grmd2 = {"gr_md2", "Off", CV_SAVE, CV_MD2, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_grmd2 = {"gr_md2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; #endif const UINT8 gammatable[5][256] = From 92b6f8bb500af6a54d9902de25f9884c4d8516d4 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 21:41:45 +0100 Subject: [PATCH 12/49] Fix the issue with sliding I identified this morning. Also, apply it to being in a zoom tube, too! For extra forwards compatibility with all the terrible SRB2 Riders ports that are almost an inevitability. --- src/p_user.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index ac4847e7b..ef214e4f8 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6652,7 +6652,13 @@ static void P_MovePlayer(player_t *player) if (player->mo->state != &states[S_KART_SQUISH]) P_SetPlayerMobjState(player->mo, S_KART_SQUISH); } - else if (player->kartstuff[k_spinouttimer] > 0 || player->pflags & PF_SLIDING) + else if ((player->pflags & PF_SLIDING) || (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT)) + { + if (player->mo->state != &states[S_KART_SPIN]) + P_SetPlayerMobjState(player->mo, S_KART_SPIN); + player->frameangle -= ANGLE_22h; + } + else if (player->kartstuff[k_spinouttimer] > 0) { INT32 speed = max(1, min(8, player->kartstuff[k_spinouttimer]/8)); From 18c649cacaaf0e25cf4e9173955b2406066676e9 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 27 Oct 2018 22:05:15 +0100 Subject: [PATCH 13/49] Fix and then subsequently disable the zoom tube angle setting stuff. --- src/p_user.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index ef214e4f8..42833e968 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -6652,7 +6652,7 @@ static void P_MovePlayer(player_t *player) if (player->mo->state != &states[S_KART_SQUISH]) P_SetPlayerMobjState(player->mo, S_KART_SQUISH); } - else if ((player->pflags & PF_SLIDING) || (player->mo->tracer && player->mo->tracer->type == MT_TUBEWAYPOINT)) + else if (player->pflags & PF_SLIDING) { if (player->mo->state != &states[S_KART_SPIN]) P_SetPlayerMobjState(player->mo, S_KART_SPIN); @@ -7346,7 +7346,7 @@ static void P_DoZoomTube(player_t *player) fixed_t dist; boolean reverse; - player->mo->height = P_GetPlayerSpinHeight(player); + //player->mo->height = P_GetPlayerSpinHeight(player); if (player->speed > 0) reverse = false; @@ -7451,6 +7451,11 @@ static void P_DoZoomTube(player_t *player) else if (player == &players[fourthdisplayplayer]) localangle4 = player->mo->angle; } +#if 0 + if (player->mo->state != &states[S_KART_SPIN]) + P_SetPlayerMobjState(player->mo, S_KART_SPIN); + player->frameangle -= ANGLE_22h; +#endif } // From 02c425696fbae2c7d437f0a3d7ac802d3af3a284 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 27 Oct 2018 20:44:05 -0400 Subject: [PATCH 14/49] Reduce camspeed in splitscreen --- src/p_user.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_user.c b/src/p_user.c index 0f89f8262..1b7c71efd 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8250,6 +8250,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (mo->eflags & MFE_VERTICALFLIP) camheight += thiscam->height; + if (splitscreen == 1) + camspeed = (3*camspeed)/4; + if (timeover) angle = mo->angle + FixedAngle(camrotate*FRACUNIT); else if (leveltime < starttime) From 89cd20bd70041fdb2443660c8ff701757d85528d Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 27 Oct 2018 20:56:11 -0400 Subject: [PATCH 15/49] Higher default scale, WANTED indicator scales properly --- src/p_mobj.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 5de7e2468..f4fd40c9f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6798,7 +6798,7 @@ void P_MobjThinker(mobj_t *mobj) && mobj->target->player->health && mobj->target->player->playerstate != PST_DEAD /*&& players[displayplayer].mo && !players[displayplayer].spectator*/) { - fixed_t scale = mobj->target->scale; + fixed_t scale = 4*mobj->target->scale; mobj->color = mobj->target->color; K_MatchGenericExtraFlags(mobj, mobj->target); @@ -6993,7 +6993,7 @@ void P_MobjThinker(mobj_t *mobj) && mobj->target->player->health && mobj->target->player->playerstate != PST_DEAD && players[displayplayer].mo && !players[displayplayer].spectator) { - fixed_t scale = mobj->target->scale; + fixed_t scale = 4*mobj->target->scale; if (!K_IsPlayerWanted(mobj->target->player)) { @@ -7023,10 +7023,13 @@ void P_MobjThinker(mobj_t *mobj) } P_SetThingPosition(mobj); - scale += FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, - players[displayplayer].mo->y-mobj->target->y)), RING_DIST), mobj->target->scale); - if (scale > 16*FRACUNIT) - scale = 16*FRACUNIT; + if (!splitscreen) + { + scale += FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, + players[displayplayer].mo->y-mobj->target->y)), RING_DIST), mobj->target->scale); + if (scale > 16*FRACUNIT) + scale = 16*FRACUNIT; + } mobj->destscale = scale; } else if (mobj->health > 0) From 7e15e8b55d2a02315faaa983bc80c0825122d4cf Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 27 Oct 2018 21:45:04 -0400 Subject: [PATCH 16/49] "if !splitscreen" instances that SHOULD be "if netgame" --- src/hu_stuff.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 4210b70ed..225ef234a 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2293,9 +2293,9 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (players[tab[i].num].spectator || !players[tab[i].num].mo) continue; //ignore them. - if (!splitscreen) // don't draw it on splitscreen, + if (netgame) // don't draw it offline { - if (!(tab[i].num == serverplayer)) + if (tab[i].num != serverplayer) HU_drawPing(x+ 253, y+2, playerpingtable[tab[i].num], false); } @@ -2783,7 +2783,7 @@ static void HU_DrawRankings(void) HU_DrawDualTabRankings(32, 32, tab, scorelines, whiteplayer);*/ // draw spectators in a ticker across the bottom - if (!splitscreen && G_GametypeHasSpectators()) + if (netgame && G_GametypeHasSpectators()) HU_DrawSpectatorTicker(); } From 8d7d84e72aa38bc9ea39392cb5fe0dd2073b69a8 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 27 Oct 2018 21:48:50 -0400 Subject: [PATCH 17/49] This bothers me, so I might as well do it while I'm in here. --- src/hu_stuff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hu_stuff.c b/src/hu_stuff.c index 225ef234a..b28793b7f 100644 --- a/src/hu_stuff.c +++ b/src/hu_stuff.c @@ -2609,7 +2609,7 @@ static inline void HU_DrawSpectatorTicker(void) templength = length; } - V_DrawString(templength, height + 8, V_TRANSLUCENT, current); + V_DrawString(templength, height + 8, V_TRANSLUCENT|V_ALLOWLOWERCASE, current); } length += (signed)strlen(player_names[i]) * 8 + 16; From c0098eecbe444a5b9515ad2a2d39f04c1483ff46 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 27 Oct 2018 22:43:57 -0400 Subject: [PATCH 18/49] Show LOSE/COOL in splitscreen again Looked goofy offline, with 1 WIN and 3 LOSEs, but now that there's COOL and online splitscreen I thought it should come back --- 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 76670f178..faff611da 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7013,7 +7013,7 @@ static void K_drawBattleFullscreen(void) { if (stplyr->kartstuff[k_position] == 1) V_DrawFixedPatch(x< Date: Sat, 27 Oct 2018 23:14:11 -0400 Subject: [PATCH 19/49] No more rescaling gfx for countdown/finish --- src/k_kart.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index faff611da..58e679c87 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5501,8 +5501,8 @@ static patch_t *kp_karmasticker; static patch_t *kp_splitkarmabomb; static patch_t *kp_timeoutsticker; -static patch_t *kp_startcountdown[8]; -static patch_t *kp_racefinish[2]; +static patch_t *kp_startcountdown[16]; +static patch_t *kp_racefinish[6]; static patch_t *kp_positionnum[NUMPOSNUMS][NUMPOSFRAMES]; static patch_t *kp_winnernum[NUMPOSFRAMES]; @@ -5589,9 +5589,25 @@ void K_LoadKartHUDGraphics(void) kp_startcountdown[5] = W_CachePatchName("K_CNT2B", PU_HUDGFX); kp_startcountdown[6] = W_CachePatchName("K_CNT1B", PU_HUDGFX); kp_startcountdown[7] = W_CachePatchName("K_CNTGOB", PU_HUDGFX); + // Splitscreen + kp_startcountdown[8] = W_CachePatchName("K_SMC3A", PU_HUDGFX); + kp_startcountdown[9] = W_CachePatchName("K_SMC2A", PU_HUDGFX); + kp_startcountdown[10] = W_CachePatchName("K_SMC1A", PU_HUDGFX); + kp_startcountdown[11] = W_CachePatchName("K_SMCGOA", PU_HUDGFX); + kp_startcountdown[12] = W_CachePatchName("K_SMC3B", PU_HUDGFX); + kp_startcountdown[13] = W_CachePatchName("K_SMC2B", PU_HUDGFX); + kp_startcountdown[14] = W_CachePatchName("K_SMC1B", PU_HUDGFX); + kp_startcountdown[15] = W_CachePatchName("K_SMCGOB", PU_HUDGFX); + // Finish kp_racefinish[0] = W_CachePatchName("K_FINA", PU_HUDGFX); kp_racefinish[1] = W_CachePatchName("K_FINB", PU_HUDGFX); + // Splitscreen + kp_racefinish[2] = W_CachePatchName("K_SMFINA", PU_HUDGFX); + kp_racefinish[3] = W_CachePatchName("K_SMFINB", PU_HUDGFX); + // 2P splitscreen + kp_racefinish[4] = W_CachePatchName("K_2PFINA", PU_HUDGFX); + kp_racefinish[5] = W_CachePatchName("K_2PFINB", PU_HUDGFX); // Position numbers sprintf(buffer, "K_POSNxx"); @@ -6924,11 +6940,10 @@ static void K_drawKartStartCountdown(void) pnum++; if ((leveltime % (2*5)) / 5) // blink pnum += 4; + if (splitscreen) // splitscreen + pnum += 8; - if (splitscreen) - V_DrawSmallScaledPatch(STCD_X - (SHORT(kp_startcountdown[pnum]->width)/4), STCD_Y - (SHORT(kp_startcountdown[pnum]->height)/4), splitflags, kp_startcountdown[pnum]); - else - V_DrawScaledPatch(STCD_X - (SHORT(kp_startcountdown[pnum]->width)/2), STCD_Y - (SHORT(kp_startcountdown[pnum]->height)/2), splitflags, kp_startcountdown[pnum]); + V_DrawScaledPatch(STCD_X - (SHORT(kp_startcountdown[pnum]->width)/2), STCD_Y - (SHORT(kp_startcountdown[pnum]->height)/2), splitflags, kp_startcountdown[pnum]); } static void K_drawKartFinish(void) @@ -6941,12 +6956,14 @@ static void K_drawKartFinish(void) if ((stplyr->kartstuff[k_cardanimation] % (2*5)) / 5) // blink pnum = 1; - if (splitscreen > 1) - { - V_DrawTinyScaledPatch(STCD_X - (SHORT(kp_racefinish[pnum]->width)/8), STCD_Y - (SHORT(kp_racefinish[pnum]->height)/8), splitflags, kp_racefinish[pnum]); - return; - } + if (splitscreen > 1) // small splitscreen + pnum += 2; + else if (splitscreen == 1) // wide splitscreen + pnum += 4; + if (splitscreen > 1) // Stationary FIN + V_DrawScaledPatch(STCD_X - (SHORT(kp_racefinish[pnum]->width)/2), STCD_Y - (SHORT(kp_racefinish[pnum]->height)/2), splitflags, kp_racefinish[pnum]); + else // Scrolling FINISH { INT32 scaleshift = (FRACBITS - splitscreen); // FRACUNIT or FRACUNIT/2 INT32 x = ((vid.width<width)< Date: Sun, 28 Oct 2018 00:58:49 -0400 Subject: [PATCH 20/49] Fix up respawning so that it takes respawning with Shrink into account --- src/k_kart.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 76670f178..a72e1f1b2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1362,8 +1362,8 @@ void K_RespawnChecker(player_t *player) fixed_t newx, newy, newz; newangle = FixedAngle(((360/8)*i)*FRACUNIT); - newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 31*player->mo->scale); - newy = player->mo->y + P_ReturnThrustY(player->mo, newangle, 31*player->mo->scale); + newx = player->mo->x + P_ReturnThrustX(player->mo, newangle, 31<mo->y + P_ReturnThrustY(player->mo, newangle, 31<mo->eflags & MFE_VERTICALFLIP) newz = player->mo->z + player->mo->height; else @@ -1383,11 +1383,19 @@ void K_RespawnChecker(player_t *player) } else if (player->kartstuff[k_respawn] == 1) { - if (!P_IsObjectOnGround(player->mo)) + if (player->kartstuff[k_growshrinktimer] < 0) + { + player->mo->scalespeed = mapheaderinfo[gamemap-1]->mobj_scale/TICRATE; + player->mo->destscale = 6*(mapheaderinfo[gamemap-1]->mobj_scale)/8; + if (cv_kartdebugshrink.value && !player->bot) + player->mo->destscale = 6*player->mo->destscale/8; + } + + if (!P_IsObjectOnGround(player->mo) && !mapreset) { player->powers[pw_flashing] = 2; - // Sal: That's stupid and prone to accidental usage. + // Sal: The old behavior was stupid and prone to accidental usage. // Let's rip off Mania instead, and turn this into a Drop Dash! if (cmd->buttons & BT_ACCELERATE) @@ -3879,7 +3887,12 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) fast->momz = 3*player->mo->momz/4; } - if (player->kartstuff[k_eggmanexplode]) // You're gonna diiiiie + if (player->playerstate == PST_DEAD || player->kartstuff[k_respawn] > 1) // Ensure these are set correctly here + { + player->mo->colorized = false; + player->mo->color = player->skincolor; + } + else if (player->kartstuff[k_eggmanexplode]) // You're gonna diiiiie { const INT32 flashtime = 4<<(player->kartstuff[k_eggmanexplode]/TICRATE); if (player->kartstuff[k_eggmanexplode] == 1 || (player->kartstuff[k_eggmanexplode] % (flashtime/2) != 0)) @@ -4008,11 +4021,13 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_invincibilitytimer]) player->kartstuff[k_invincibilitytimer]--; - if (player->kartstuff[k_growshrinktimer] > 0) - player->kartstuff[k_growshrinktimer]--; - - if (player->kartstuff[k_growshrinktimer] < 0) - player->kartstuff[k_growshrinktimer]++; + if (!player->kartstuff[k_respawn]) + { + if (player->kartstuff[k_growshrinktimer] > 0) + player->kartstuff[k_growshrinktimer]--; + if (player->kartstuff[k_growshrinktimer] < 0) + player->kartstuff[k_growshrinktimer]++; + } if (player->kartstuff[k_growshrinktimer] == 1 || player->kartstuff[k_growshrinktimer] == -1) { From 88831ae79f704f314336de0503cec0837c3ccab3 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 28 Oct 2018 01:02:30 -0400 Subject: [PATCH 21/49] Fix invincibility item cap It was supposed to be capped at 2 invincibility items at a time, not 3. (may consider scaling with number of players, just not for R1) --- 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 a72e1f1b2..c67a06bfa 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -666,7 +666,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) break; case KITEM_INVINCIBILITY: POWERITEMODDS(newodds); - if ((!cv_invincibility.value) || (pinvin > 2)) newodds = 0; + if ((!cv_invincibility.value) || (pinvin >= 2)) newodds = 0; break; case KITEM_BANANA: if (!cv_banana.value) newodds = 0; From 2f9fa0250d3a2431351a30200062632fe973ba9d Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 28 Oct 2018 01:02:49 -0400 Subject: [PATCH 22/49] This didn't commit with for some reason... --- 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 c67a06bfa..fc46c347f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -700,7 +700,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) break; case KITEM_GROW: POWERITEMODDS(newodds); - if ((!cv_grow.value) || (pinvin > 2)) newodds = 0; + if ((!cv_grow.value) || (pinvin >= 2)) newodds = 0; break; case KITEM_SHRINK: POWERITEMODDS(newodds); From a8e549e0c542f9bea798931e3dec73eb0ed59b55 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 28 Oct 2018 01:22:26 -0400 Subject: [PATCH 23/49] More smoothly decide which invincibility music to use Less P_RestoreMusic conflicts in splitscreen, just see the Toxic Palace video for an example :V --- src/p_user.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 1b7c71efd..fe1dad0ee 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1217,6 +1217,8 @@ void P_RestoreMusic(player_t *player) if (!P_IsLocalPlayer(player)) // Only applies to a local player return; + S_SpeedMusic(1.0f); + // Event - HERE COMES A NEW CHALLENGER if (mapreset) { @@ -1228,24 +1230,47 @@ void P_RestoreMusic(player_t *player) if (P_EndingMusic(player)) return; - S_SpeedMusic(1.0f); - // Event - Level Start if (leveltime < (starttime + (TICRATE/2))) S_ChangeMusicInternal((encoremode ? "estart" : "kstart"), false); //S_StopMusic(); else // see also where time overs are handled - search for "lives = 2" in this file { + INT32 bestlocalmus = 0; // 0 is level music, 1 is invincibility, 2 is grow + + if (splitscreen) + { + if (players[displayplayer].playerstate == PST_LIVE) + bestlocalmus = (players[displayplayer].kartstuff[k_growshrinktimer] > 1 ? 2 : (players[displayplayer].kartstuff[k_invincibilitytimer] > 1 ? 1 : 0)); +#define setbests(p) \ + if (players[p].playerstate == PST_LIVE && (players[p].kartstuff[k_growshrinktimer] > 1 ? 2 : (players[p].kartstuff[k_invincibilitytimer] > 1 ? 1 : 0)) > bestlocalmus) \ + bestlocalmus = (players[p].kartstuff[k_growshrinktimer] > 1 ? 2 : (players[p].kartstuff[k_invincibilitytimer] > 1 ? 1 : 0)); + setbests(secondarydisplayplayer); + if (splitscreen > 1) + setbests(thirddisplayplayer); + if (splitscreen > 2) + setbests(fourthdisplayplayer); +#undef setbests + } + else + { + if (player->playerstate == PST_LIVE) + bestlocalmus = (player->kartstuff[k_growshrinktimer] > 1 ? 2 : (player->kartstuff[k_invincibilitytimer] > 1 ? 1 : 0)); + } + // Item - Grow - if (player->kartstuff[k_growshrinktimer] > 1 && player->playerstate == PST_LIVE) + if (bestlocalmus == 2) S_ChangeMusicInternal("kgrow", true); // Item - Invincibility - else if (player->kartstuff[k_invincibilitytimer] > 1 && player->playerstate == PST_LIVE) + else if (bestlocalmus == 1) S_ChangeMusicInternal("kinvnc", true); else { +#if 0 // Event - Final Lap + // Still works for GME, but disabled for consistency if (G_RaceGametype() && player->laps >= (UINT8)(cv_numlaps.value - 1)) S_SpeedMusic(1.2f); +#endif S_ChangeMusic(mapmusname, mapmusflags, true); } } From ab518c611ca3b20977b06c4d602179842fea2dea Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 28 Oct 2018 01:38:01 -0400 Subject: [PATCH 24/49] Even better: base it off how much timer is left So instead of prioritizing a specific track, the person who activated their powerup the latest gets their music. That should be a nicer solution for when multiple players are activating their powerups at the same time. --- src/p_user.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index fe1dad0ee..2c5806437 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1235,15 +1235,21 @@ void P_RestoreMusic(player_t *player) S_ChangeMusicInternal((encoremode ? "estart" : "kstart"), false); //S_StopMusic(); else // see also where time overs are handled - search for "lives = 2" in this file { - INT32 bestlocalmus = 0; // 0 is level music, 1 is invincibility, 2 is grow + INT32 wantedmus = 0; // 0 is level music, 1 is invincibility, 2 is grow if (splitscreen) { - if (players[displayplayer].playerstate == PST_LIVE) - bestlocalmus = (players[displayplayer].kartstuff[k_growshrinktimer] > 1 ? 2 : (players[displayplayer].kartstuff[k_invincibilitytimer] > 1 ? 1 : 0)); + INT32 bestlocaltimer = 1; + #define setbests(p) \ - if (players[p].playerstate == PST_LIVE && (players[p].kartstuff[k_growshrinktimer] > 1 ? 2 : (players[p].kartstuff[k_invincibilitytimer] > 1 ? 1 : 0)) > bestlocalmus) \ - bestlocalmus = (players[p].kartstuff[k_growshrinktimer] > 1 ? 2 : (players[p].kartstuff[k_invincibilitytimer] > 1 ? 1 : 0)); + if (players[p].playerstate == PST_LIVE) \ + { \ + if (players[p].kartstuff[k_growshrinktimer] > bestlocaltimer) \ + { wantedmus = 2; bestlocaltimer = players[p].kartstuff[k_growshrinktimer]; } \ + else if (players[p].kartstuff[k_invincibilitytimer] > bestlocaltimer) \ + { wantedmus = 1; bestlocaltimer = players[p].kartstuff[k_invincibilitytimer]; } \ + } + setbests(displayplayer); setbests(secondarydisplayplayer); if (splitscreen > 1) setbests(thirddisplayplayer); @@ -1254,14 +1260,19 @@ void P_RestoreMusic(player_t *player) else { if (player->playerstate == PST_LIVE) - bestlocalmus = (player->kartstuff[k_growshrinktimer] > 1 ? 2 : (player->kartstuff[k_invincibilitytimer] > 1 ? 1 : 0)); + { + if (player->kartstuff[k_growshrinktimer] > 1) + wantedmus = 2; + else if (player->kartstuff[k_invincibilitytimer] > 1) + wantedmus = 1; + } } // Item - Grow - if (bestlocalmus == 2) + if (wantedmus == 2) S_ChangeMusicInternal("kgrow", true); // Item - Invincibility - else if (bestlocalmus == 1) + else if (wantedmus == 1) S_ChangeMusicInternal("kinvnc", true); else { From 6c5e7678d1b9dfb08ed909c55a1667453830ea9c Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 28 Oct 2018 01:50:27 -0400 Subject: [PATCH 25/49] Use V_ORANGEMAP for blinking WANTED text in Battle splitscreen --- 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 58e679c87..e47f3bafb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -6601,7 +6601,7 @@ static void K_drawKartWanted(void) if (splitscreen) // Can't fit the poster on screen, sadly { if (K_IsPlayerWanted(stplyr) && leveltime % 10 > 3) - V_DrawRightAlignedString(WANT_X, WANT_Y, K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_HUDTRANS|V_REDMAP), "WANTED"); + V_DrawRightAlignedString(WANT_X, WANT_Y, K_calcSplitFlags(V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_HUDTRANS|V_ORANGEMAP), "WANTED"); return; } From c6d18edf7ccab5d32d21754fc487ce026b01be45 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 28 Oct 2018 13:52:25 -0400 Subject: [PATCH 26/49] Move lap animation up slightly (I'm not gonna remember to do this later either) --- src/k_kart.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e47f3bafb..07ef148b2 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7360,38 +7360,38 @@ static void K_drawLapStartAnim(void) const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation]; V_DrawScaledPatch(BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)), - 64 - (32*max(0, progress-76)), + 56 - (32*max(0, progress-76)), 0, kp_lapanim_emblem); if (stplyr->laps == (UINT8)(cv_numlaps.value - 1)) { V_DrawScaledPatch(27 - (32*max(0, progress-76)), - 40, + 32, 0, kp_lapanim_final[min(progress/2, 10)]); if (progress/2-12 >= 0) { V_DrawScaledPatch(194 + (32*max(0, progress-76)), - 40, + 32, 0, kp_lapanim_lap[min(progress/2-12, 6)]); } } else { V_DrawScaledPatch(61 - (32*max(0, progress-76)), - 40, + 32, 0, kp_lapanim_lap[min(progress/2, 6)]); if (progress/2-8 >= 0) { V_DrawScaledPatch(194 + (32*max(0, progress-76)), - 40, + 32, 0, kp_lapanim_number[(((UINT32)stplyr->laps+1) / 10)][min(progress/2-8, 2)]); if (progress/2-10 >= 0) { V_DrawScaledPatch(221 + (32*max(0, progress-76)), - 40, + 32, 0, kp_lapanim_number[(((UINT32)stplyr->laps+1) % 10)][min(progress/2-10, 2)]); } } From fc156e6fb5509cacecf62d1c61a404b325817ee9 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 29 Oct 2018 05:26:17 -0400 Subject: [PATCH 27/49] Preface with splitscreen checks --- src/s_sound.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/s_sound.c b/src/s_sound.c index 8f2e4a359..6dae619a1 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -531,7 +531,7 @@ void S_StartSoundAtVolume(const void *origin_p, sfxenum_t sfx_id, INT32 volume) pitch = NORM_PITCH; priority = NORM_PRIORITY; - if (origin) + if (splitscreen && origin) volume = FixedDiv(volume<>FRACBITS; if (splitscreen && listenmobj2) // Copy the sound for the split player @@ -1014,7 +1014,7 @@ void S_UpdateSounds(void) pitch = NORM_PITCH; sep = NORM_SEP; - if (c->origin) + if (splitscreen && c->origin) volume = FixedDiv(volume<>FRACBITS; // check non-local sounds for distance clipping @@ -1331,7 +1331,8 @@ INT32 S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32 *v *vol = (15 * ((S_CLIPPING_DIST - approx_dist)>>FRACBITS)) / S_ATTENUATOR; } - *vol = FixedDiv((*vol)<>FRACBITS; + if (splitscreen) + *vol = FixedDiv((*vol)<>FRACBITS; return (*vol > 0); } From 081c9c36e59ff7182a10bd49d4ea2f7847cf9048 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 29 Oct 2018 14:43:21 +0000 Subject: [PATCH 28/49] Make dropped floatingitems not carry player momentum (sorry for leaving this so long, Oni!) --- src/k_kart.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 120517220..ee59566f8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3340,8 +3340,6 @@ void K_DropItems(player_t *player) drop->destscale = (3*drop->destscale)/2;; drop->angle = player->mo->angle + ANGLE_90; - drop->momx = player->mo->momx>>1; - drop->momy = player->mo->momy>>1; P_Thrust(drop, FixedAngle(P_RandomFixed()*180) + player->mo->angle + ANGLE_90, 8*(mapheaderinfo[gamemap-1]->mobj_scale)); From 63130de7f046d3db2488232febf8cdc333e18af6 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 02:46:16 -0400 Subject: [PATCH 29/49] "Joined with" kicks display in the chat instead of console --- src/d_clisrv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 3d5b90a23..97b352da2 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -2922,7 +2922,7 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum) if (otherp >= 0) \ { \ if (otherp != pnum) \ - CONS_Printf("\x82%s\x80 left the game (Joined with \x82%s\x80)\n", player_names[otherp], player_names[pnum]); \ + HU_AddChatText(va("\x82*%s left the game (Joined with %s)", player_names[otherp], player_names[pnum]), false); \ buf[0] = (UINT8)otherp; \ SendNetXCmd(XD_REMOVEPLAYER, &buf, 1); \ otherp = -1; \ From 3761a51e6be79f76e516dc81eb83d33d03597599 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 03:06:36 -0400 Subject: [PATCH 30/49] Fix ENTER GAME option not working --- src/d_netcmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a2dd550f4..df9fb54ab 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3234,6 +3234,8 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) players[playernum].playerstate = PST_REBORN; } + players[playernum].pflags &= ~PF_WANTSTOJOIN; + //Now that we've done our error checking and killed the player //if necessary, put the player on the correct team/status. if (G_TagGametype()) @@ -3315,8 +3317,6 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) else CONS_Printf(M_GetText("%s switched to the %c%s%c.\n"), player_names[playernum], '\x84', M_GetText("Blue Team"), '\x80'); } - else if (players[playernum].pflags & PF_WANTSTOJOIN) - players[playernum].pflags &= ~PF_WANTSTOJOIN; else HU_AddChatText(va("\x82*%s became a spectator.", player_names[playernum]), false); From f5be6fb910583afbcc63b4696e8ec1ce22f04590 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 03:07:33 -0400 Subject: [PATCH 31/49] Cancel pogo spring when bumping a wall Prevents instances where you can use it to stick in one spot in Battle --- src/p_map.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_map.c b/src/p_map.c index 1d8a2daa6..0078a9698 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3784,6 +3784,7 @@ void P_BouncePlayerMove(mobj_t *mo) S_StartSound(mo, sfx_s3k49); } + mo->player->kartstuff[k_pogospring] = 0; // Cancel pogo spring effect so you aren't shoved forward back into the wall you just bounced off P_PlayerHitBounceLine(bestslideline); mo->eflags |= MFE_JUSTBOUNCEDWALL; From b08fb14d623ef1ef1926320e2795b182de8caeba Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 03:13:56 -0400 Subject: [PATCH 32/49] Time over cam & signposts support mobjscale --- src/p_mobj.c | 4 ++-- src/p_spec.c | 6 +++--- src/p_user.c | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f4fd40c9f..9802c88e0 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8509,8 +8509,8 @@ void P_MobjThinker(mobj_t *mobj) case MT_FZEROBOOM: // F-Zero explosion if (!mobj->extravalue1) { - fixed_t mx = P_ReturnThrustX(NULL, mobj->angle, 32<angle, 32<angle, 32*mobj->scale); + fixed_t my = P_ReturnThrustY(NULL, mobj->angle, 32*mobj->scale); mobj_t *explosion = P_SpawnMobj(mobj->x + (2*mx), mobj->y + (2*my), mobj->z+(mobj->height/2), MT_THOK); P_SetMobjState(explosion, S_FZEROBOOM1); diff --git a/src/p_spec.c b/src/p_spec.c index 76ed73aa8..b7006c871 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -3219,7 +3219,7 @@ void P_SetupSignExit(player_t *player) // SRB2Kart: Set sign spinning variables thing->movefactor = thing->z; - thing->z += (768<z += (768*thing->scale) * P_MobjFlip(thing); thing->movecount = 1; ++numfound; @@ -3247,7 +3247,7 @@ void P_SetupSignExit(player_t *player) // SRB2Kart: Set sign spinning variables thing->movefactor = thing->z; - thing->z += (768<z += (768*thing->scale) * P_MobjFlip(thing); thing->movecount = 1; ++numfound; @@ -3259,7 +3259,7 @@ void P_SetupSignExit(player_t *player) // SRB2Kart: FINALLY, add in an alternative if no place is found if (player->mo) { - mobj_t *sign = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + (768<mo->x, player->mo->y, player->mo->z + (768*mapheaderinfo[gamemap-1]->mobj_scale), MT_SIGN); P_SetTarget(&sign->target, player->mo); P_SetMobjState(sign, S_SIGN1); diff --git a/src/p_user.c b/src/p_user.c index 8cd31f723..b5d9397dc 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8606,8 +8606,8 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (timeover == 1) { - thiscam->momx = P_ReturnThrustX(NULL, mo->angle, 32<momy = P_ReturnThrustY(NULL, mo->angle, 32<momx = P_ReturnThrustX(NULL, mo->angle, 32*mo->scale); // Push forward + thiscam->momy = P_ReturnThrustY(NULL, mo->angle, 32*mo->scale); thiscam->momz = 0; } else if (player->exiting || timeover == 2) From 65f67478872ff76fa0232df535fa8243ab9b14e3 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 04:46:24 -0400 Subject: [PATCH 33/49] Push fakes away from other items Prevents stupid item stacking in Battle (you can still do it with bananas, but THOSE are removable, and don't have a similar sprite) --- src/p_map.c | 25 +++++++++++++++++++++++++ src/p_mobj.c | 1 + 2 files changed, 26 insertions(+) diff --git a/src/p_map.c b/src/p_map.c index 0078a9698..2bcfd73a7 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -665,8 +665,33 @@ static boolean PIT_CheckThing(mobj_t *thing) // SRB2kart 011617 - Colission code for kart items //{ + // Push fakes out of other items + if (tmthing->type == MT_FAKEITEM && (thing->type == MT_RANDOMITEM || thing->type == MT_FAKEITEM)) + { + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z + tmthing->height < thing->z) + return true; // underneath + + P_InstaThrust(tmthing, R_PointToAngle2(thing->x, thing->y, tmthing->x, tmthing->y), thing->radius/4); + return true; + } + else if (thing->type == MT_FAKEITEM && (tmthing->type == MT_RANDOMITEM || tmthing->type == MT_FAKEITEM)) + { + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z + tmthing->height < thing->z) + return true; // underneath + + P_InstaThrust(thing, R_PointToAngle2(tmthing->x, tmthing->y, thing->x, thing->y), tmthing->radius/4); + return true; + } + if (tmthing->type == MT_RANDOMITEM) return true; + if (tmthing->type == MT_ORBINAUT || tmthing->type == MT_JAWZ || tmthing->type == MT_JAWZ_DUD || tmthing->type == MT_ORBINAUT_SHIELD || tmthing->type == MT_JAWZ_SHIELD) { diff --git a/src/p_mobj.c b/src/p_mobj.c index 9802c88e0..407ddc391 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8151,6 +8151,7 @@ void P_MobjThinker(mobj_t *mobj) } case MT_BANANA: case MT_FAKEITEM: + mobj->friction = ORIG_FRICTION/4; if (mobj->momx || mobj->momy) P_SpawnGhostMobj(mobj); if (mobj->z <= mobj->floorz && mobj->health > 1) From ef44df00810b61de138874c15ba39c611e717c3e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 04:55:00 -0400 Subject: [PATCH 34/49] Fix incorrect scale of player arrows in non-splitscreen whoops --- src/p_mobj.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index 407ddc391..611562a98 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6829,10 +6829,10 @@ void P_MobjThinker(mobj_t *mobj) if (!splitscreen) { - scale += FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, + scale = mobj->target->scale + FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, players[displayplayer].mo->y-mobj->target->y)), RING_DIST), mobj->target->scale); - if (scale > 16*FRACUNIT) - scale = 16*FRACUNIT; + if (scale > 16*mobj->target->scale) + scale = 16*mobj->target->scale; } mobj->destscale = scale; @@ -7025,10 +7025,10 @@ void P_MobjThinker(mobj_t *mobj) if (!splitscreen) { - scale += FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, + scale = mobj->target->scale + FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, players[displayplayer].mo->y-mobj->target->y)), RING_DIST), mobj->target->scale); - if (scale > 16*FRACUNIT) - scale = 16*FRACUNIT; + if (scale > 16*mobj->target->scale) + scale = 16*mobj->target->scale; } mobj->destscale = scale; } From e5e7bc4c1139eb62f02d4ee09c7b98198cdaf997 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 05:28:39 -0400 Subject: [PATCH 35/49] Use frameangle for rocket sneakers so they rotate around you when you spinout --- 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 ee59566f8..be902e975 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3630,7 +3630,7 @@ static void K_MoveHeldObjects(player_t *player) #if 1 { - angle_t input = player->mo->angle - cur->angle; + angle_t input = player->frameangle - cur->angle; boolean invert = (input > ANGLE_180); if (invert) input = InvAngle(input); @@ -3642,7 +3642,7 @@ static void K_MoveHeldObjects(player_t *player) cur->angle = cur->angle + input; } #else - cur->angle = player->mo->angle; + cur->angle = player->frameangle; #endif angoffset = ANGLE_90 + (ANGLE_180 * num); From 971040fba9a2d5204f248799d3bdc615e79efb03 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 05:32:59 -0400 Subject: [PATCH 36/49] No item usage while squished or respawning --- 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 be902e975..fc90de2bf 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4662,7 +4662,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (cmd->buttons & BT_ATTACK) player->pflags |= PF_ATTACKDOWN; - if (player && player->mo && player->mo->health > 0 && !player->spectator && !(player->exiting || mapreset) && player->kartstuff[k_spinouttimer] == 0) + if (player && player->mo && player->mo->health > 0 && !player->spectator && !(player->exiting || mapreset) + && player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_squishedtimer] == 0 && player->kartstuff[k_respawn] == 0) { // First, the really specific, finicky items that function without the item being directly in your item slot. // Karma item dropping From fc011ce813909c9e86619388fcfdbf79a79d8a04 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 05:35:06 -0400 Subject: [PATCH 37/49] Nerfed squishing After fixing flashing tics not being set properly, 2 seconds of being fully stopped and then another 1.5 seconds minimum of being unable to be hit just feels like an eternity :V --- 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 fc90de2bf..4e576ea3a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1940,7 +1940,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) K_CheckBumpers(); } - player->kartstuff[k_squishedtimer] = 2*TICRATE; + player->kartstuff[k_squishedtimer] = TICRATE; player->powers[pw_flashing] = K_GetKartFlashing(player); From aff865a3e71cc9730cd5ac2602cd01a5940e8591 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 15:14:53 -0400 Subject: [PATCH 38/49] Item distribution experiments based on my experience in netgames Needs tested tonight. - Grow & Rocket Sneakers are slightly more in the back - Sneaker x3 gets handed out more in the back-middle - Removed 5% from Ballhog towards the front - Removed 5% from Shrink in the forward-most column it was in --- src/k_kart.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 4e576ea3a..23b84ff1e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -487,22 +487,22 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS][9] = { //P-Odds 0 1 2 3 4 5 6 7 8 /*Sneaker*/ {20, 0, 0, 4, 6, 6, 0, 0, 0 }, // Sneaker - /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 2, 5, 5, 0 }, // Rocket Sneaker - /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,16 }, // Invincibility + /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3 }, // Rocket Sneaker + /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,14 }, // Invincibility /*Banana*/ { 0, 9, 4, 2, 1, 0, 0, 0, 0 }, // Banana /*Eggman Monitor*/ { 0, 4, 3, 2, 0, 0, 0, 0, 0 }, // Eggman Monitor /*Orbinaut*/ { 0, 6, 5, 3, 2, 0, 0, 0, 0 }, // Orbinaut /*Jawz*/ { 0, 0, 3, 2, 1, 1, 0, 0, 0 }, // Jawz - /*Mine*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Mine - /*Ballhog*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Ballhog + /*Mine*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Mine + /*Ballhog*/ { 0, 0, 0, 2, 1, 0, 0, 0, 0 }, // Ballhog /*Self-Propelled Bomb*/ { 0, 0, 1, 2, 3, 4, 2, 2, 0 }, // Self-Propelled Bomb - /*Grow*/ { 0, 0, 0, 0, 0, 1, 3, 5, 4 }, // Grow - /*Shrink*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0 }, // Shrink + /*Grow*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3 }, // Grow + /*Shrink*/ { 0, 0, 0, 0, 0, 0, 0, 2, 0 }, // Shrink /*Thunder Shield*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Thunder Shield /*Hyudoro*/ { 0, 0, 0, 0, 1, 2, 1, 0, 0 }, // Hyudoro /*Pogo Spring*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Pogo Spring /*Kitchen Sink*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // Kitchen Sink - /*Sneaker x3*/ { 0, 0, 0, 0, 3, 6, 6, 2, 0 }, // Sneaker x3 + /*Sneaker x3*/ { 0, 0, 0, 0, 3, 7, 9, 2, 0 }, // Sneaker x3 /*Banana x3*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Banana x3 /*Banana x10*/ { 0, 0, 0, 0, 1, 0, 0, 0, 0 }, // Banana x10 /*Orbinaut x3*/ { 0, 0, 0, 1, 0, 0, 0, 0, 0 }, // Orbinaut x3 From dd28bda75fc3aa82510539c1e5ea419e7dc9aaa3 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 21:35:17 -0400 Subject: [PATCH 39/49] Brake drfit effect --- src/d_player.h | 1 + src/dehacked.c | 5 +++++ src/info.c | 43 ++++++++++++++++++++++++++++++++++++------- src/info.h | 5 +++++ src/k_kart.c | 33 ++++++++++++++++++++++++++++++++- src/p_enemy.c | 1 + src/p_mobj.c | 42 ++++++++++++++++++++++++++++++++++++++---- 7 files changed, 118 insertions(+), 12 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 866589dfb..91d09df64 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -308,6 +308,7 @@ typedef enum k_destboostcam, // Ditto k_timeovercam, // Camera timer for leaving behind or not k_aizdriftstrat, // Let go of your drift while boosting? Helper for the SICK STRATZ you have just unlocked + k_brakedrift, // Helper for brake-drift spark spawning k_itemroulette, // Used for the roulette when deciding what item to give you (was "pw_kartitem") k_roulettetype, // Used for the roulette, for deciding type (currently only used for Battle, to give you better items from Karma items) diff --git a/src/dehacked.c b/src/dehacked.c index 77663ccda..3dcc92122 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6247,6 +6247,9 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_DRIFTSPARK_C1", "S_DRIFTSPARK_C2", + // Brake drift sparks + "S_BRAKEDRIFT", + // Drift Smoke "S_DRIFTDUST1", "S_DRIFTDUST2", @@ -7393,6 +7396,7 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_INVULNFLASH", "MT_WIPEOUTTRAIL", "MT_DRIFTSPARK", + "MT_BRAKEDRIFT", "MT_DRIFTDUST", "MT_ROCKETSNEAKER", // Rocket sneakers @@ -7895,6 +7899,7 @@ static const char *const KARTSTUFF_LIST[] = { "DESTBOOSTCAM", "TIMEOVERCAM", "AIZDRIFTSTRAT", + "BRAKEDRIFT", "ITEMROULETTE", "ROULETTETYPE", diff --git a/src/info.c b/src/info.c index cde74cee2..18b818c94 100644 --- a/src/info.c +++ b/src/info.c @@ -56,13 +56,13 @@ char sprnames[NUMSPRITES + 1][5] = "SRBJ","SRBK","SRBL","SRBM","SRBN","SRBO", //SRB2kart Sprites "SPRG","BSPR","RNDM","RPOP","SGNS","FAST","DSHR","BOST","BOSM","KFRE", - "KINV","KINF","WIPD","DRIF","DUST","RSHE","FITM","BANA","ORBN","JAWZ", - "SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL", - "POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO", - "CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO", - "ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK","LZI1", - "LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1","GARU","MARR","REAP", - "JITB","CDMO","CDBU","VIEW" + "KINV","KINF","WIPD","DRIF","BDRF","DUST","RSHE","FITM","BANA","ORBN", + "JAWZ","SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN", + "DEZL","POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM", + "SACO","CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB", + "ARRO","ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK", + "LZI1","LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1","GARU","MARR", + "REAP","JITB","CDMO","CDBU","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -2561,6 +2561,8 @@ state_t states[NUMSTATES] = {SPR_DRIF, FF_FULLBRIGHT, 2, {NULL}, 0, 0, S_DRIFTSPARK_C2}, // S_DRIFTSPARK_C1 {SPR_DRIF, FF_FULLBRIGHT|FF_TRANS20, 1, {NULL}, 0, 0, S_DRIFTSPARK_A3}, // S_DRIFTSPARK_C2 (Loop back to A3) + {SPR_BDRF, FF_FULLBRIGHT|FF_PAPERSPRITE|FF_ANIMATE, -1, {NULL}, 5, 2, S_BRAKEDRIFT}, // S_BRAKEDRIFT + {SPR_DUST, 0, 3, {NULL}, 0, 0, S_DRIFTDUST2}, // S_DRIFTDUST1 {SPR_DUST, 1, 3, {NULL}, 0, 0, S_DRIFTDUST3}, // S_DRIFTDUST2 {SPR_DUST, FF_TRANS20|2, 3, {NULL}, 0, 0, S_DRIFTDUST4}, // S_DRIFTDUST3 @@ -14873,6 +14875,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BRAKEDRIFT + -1, // doomednum + S_BRAKEDRIFT, // 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 + 8, // speed + 8*FRACUNIT, // radius + 8*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_DRIFTDUST -1, // doomednum S_DRIFTDUST1, // spawnstate diff --git a/src/info.h b/src/info.h index 78f0edaed..61e0e1dbe 100644 --- a/src/info.h +++ b/src/info.h @@ -601,6 +601,7 @@ typedef enum sprite SPR_KINF, // Invincibility flash SPR_WIPD, // Wipeout dust trail SPR_DRIF, // Drift Sparks + SPR_BDRF, // Brake drift sparks SPR_DUST, // Drift Dust // Kart Items @@ -3109,6 +3110,9 @@ typedef enum state S_DRIFTSPARK_C1, S_DRIFTSPARK_C2, + // Brake drift sparks + S_BRAKEDRIFT, + // Drift Smoke S_DRIFTDUST1, S_DRIFTDUST2, @@ -4272,6 +4276,7 @@ typedef enum mobj_type MT_INVULNFLASH, MT_WIPEOUTTRAIL, MT_DRIFTSPARK, + MT_BRAKEDRIFT, MT_DRIFTDUST, MT_ROCKETSNEAKER, diff --git a/src/k_kart.c b/src/k_kart.c index ee59566f8..126ba1843 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1330,6 +1330,23 @@ static void K_SpawnDashDustRelease(player_t *player) } } +static void K_SpawnBrakeDriftSparks(player_t *player) // Be sure to update the mobj thinker case too! +{ + mobj_t *sparks; + + I_Assert(player != NULL); + I_Assert(player->mo != NULL); + I_Assert(!P_MobjWasRemoved(player->mo)); + + // Position & etc are handled in its thinker, and its spawned invisible. + // This avoids needing to dupe code if we don't need it. + sparks = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BRAKEDRIFT); + P_SetTarget(&sparks->target, player->mo); + P_SetScale(sparks, (sparks->destscale = player->mo->scale)); + K_MatchGenericExtraFlags(sparks, player->mo); + sparks->flags2 |= MF2_DONTDRAW; +} + /** \brief Calculates the respawn timer and drop-boosting \param player player object passed from K_KartPlayerThink @@ -3879,6 +3896,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) fast->momx = 3*player->mo->momx/4; fast->momy = 3*player->mo->momy/4; fast->momz = 3*player->mo->momz/4; + K_MatchGenericExtraFlags(fast, player->mo); } if (player->playerstate == PST_DEAD || player->kartstuff[k_respawn] > 1) // Ensure these are set correctly here @@ -4454,7 +4472,8 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_spinouttimer] > 0 // banana peel || player->speed < FixedMul(10<<16, player->mo->scale)) // you're too slow! { - player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = player->kartstuff[k_aizdriftstrat] = 0; + player->kartstuff[k_drift] = player->kartstuff[k_driftcharge] = 0; + player->kartstuff[k_aizdriftstrat] = player->kartstuff[k_brakedrift] = 0; } if ((!player->kartstuff[k_sneakertimer]) @@ -4468,6 +4487,18 @@ static void K_KartDrift(player_t *player, boolean onground) } else if (player->kartstuff[k_aizdriftstrat] && !player->kartstuff[k_drift]) K_SpawnAIZDust(player); + + if (player->kartstuff[k_drift] + && ((player->cmd.buttons & BT_BRAKE) + || !(player->cmd.buttons & BT_ACCELERATE)) + && P_IsObjectOnGround(player->mo)) + { + if (!player->kartstuff[k_brakedrift]) + K_SpawnBrakeDriftSparks(player); + player->kartstuff[k_brakedrift] = 1; + } + else + player->kartstuff[k_brakedrift] = 0; } // // K_KartUpdatePosition diff --git a/src/p_enemy.c b/src/p_enemy.c index f06718390..b44bb8749 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8435,6 +8435,7 @@ void A_SPBChase(mobj_t *actor) //fast->momz = 3*actor->momz/4; fast->color = SKINCOLOR_RED; fast->colorized = true; + K_MatchGenericExtraFlags(fast, actor); } return; diff --git a/src/p_mobj.c b/src/p_mobj.c index f4fd40c9f..089f6fafe 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8301,6 +8301,43 @@ void P_MobjThinker(mobj_t *mobj) } P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); break; + case MT_BRAKEDRIFT: + if ((!mobj->target || !mobj->target->health || !mobj->target->player || !P_IsObjectOnGround(mobj->target)) + || !mobj->target->player->kartstuff[k_drift] || !mobj->target->player->kartstuff[k_brakedrift] + || !((mobj->target->player->cmd.buttons & BT_BRAKE) + || !(mobj->target->player->cmd.buttons & BT_ACCELERATE))) // Letting go of accel functions about the same as brake-drifting + { + P_RemoveMobj(mobj); + return; + } + else + { + fixed_t newx, newy; + angle_t travelangle; + + travelangle = mobj->target->angle - ((ANGLE_45/5)*mobj->target->player->kartstuff[k_drift]); + + newx = mobj->target->x + P_ReturnThrustX(mobj->target, travelangle+ANGLE_180, 24*mobj->target->scale); + newy = mobj->target->y + P_ReturnThrustY(mobj->target, travelangle+ANGLE_180, 24*mobj->target->scale); + P_TeleportMove(mobj, newx, newy, mobj->target->z); + + mobj->angle = travelangle - ((ANGLE_90/5)*mobj->target->player->kartstuff[k_drift]); + P_SetScale(mobj, (mobj->destscale = mobj->target->scale)); + + if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*4) + mobj->color = (UINT8)(1 + (leveltime % (MAXSKINCOLORS-1))); + else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)*2) + mobj->color = SKINCOLOR_KETCHUP; + else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)) + mobj->color = SKINCOLOR_SAPPHIRE; + else + mobj->color = SKINCOLOR_YELLOW; + + K_MatchGenericExtraFlags(mobj, mobj->target); + if (leveltime & 1) + mobj->flags2 |= MF2_DONTDRAW; + } + break; case MT_PLAYERRETICULE: if (!mobj->target || !mobj->target->health) { @@ -8310,10 +8347,7 @@ void P_MobjThinker(mobj_t *mobj) P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); break; case MT_INSTASHIELDB: - if (leveltime & 1) - mobj->flags2 |= MF2_DONTDRAW; - else - mobj->flags2 &= ~MF2_DONTDRAW; + mobj->flags2 ^= MF2_DONTDRAW; /* FALLTHRU */ case MT_INSTASHIELDA: if (!mobj->target || !mobj->target->health || (mobj->target->player && !mobj->target->player->kartstuff[k_instashield])) From 94429a1cb6be8deb8ebbca3d36d9f6f786fda3b8 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 22:38:43 -0400 Subject: [PATCH 40/49] Fix offsets, add colormapping --- src/k_kart.c | 43 +++++++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ee59566f8..453b0be85 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7376,41 +7376,48 @@ static void K_drawLapStartAnim(void) { // This is an EVEN MORE insanely complicated animation. const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation]; + UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, 0); - V_DrawScaledPatch(BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)), - 56 - (32*max(0, progress-76)), - 0, kp_lapanim_emblem); + V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, + (48 - (32*max(0, progress-76)))*FRACUNIT, + FRACUNIT, V_HUDTRANS, + kp_lapanim_emblem, colormap); if (stplyr->laps == (UINT8)(cv_numlaps.value - 1)) { - V_DrawScaledPatch(27 - (32*max(0, progress-76)), - 32, - 0, kp_lapanim_final[min(progress/2, 10)]); + V_DrawFixedPatch((62 - (32*max(0, progress-76)))*FRACUNIT, // 27 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_final[min(progress/2, 10)], NULL); if (progress/2-12 >= 0) { - V_DrawScaledPatch(194 + (32*max(0, progress-76)), - 32, - 0, kp_lapanim_lap[min(progress/2-12, 6)]); + V_DrawFixedPatch((188 + (32*max(0, progress-76)))*FRACUNIT, // 194 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_lap[min(progress/2-12, 6)], NULL); } } else { - V_DrawScaledPatch(61 - (32*max(0, progress-76)), - 32, - 0, kp_lapanim_lap[min(progress/2, 6)]); + V_DrawFixedPatch((82 - (32*max(0, progress-76)))*FRACUNIT, // 61 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_lap[min(progress/2, 6)], NULL); if (progress/2-8 >= 0) { - V_DrawScaledPatch(194 + (32*max(0, progress-76)), - 32, - 0, kp_lapanim_number[(((UINT32)stplyr->laps+1) / 10)][min(progress/2-8, 2)]); + V_DrawFixedPatch((188 + (32*max(0, progress-76)))*FRACUNIT, // 194 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_number[(((UINT32)stplyr->laps+1) / 10)][min(progress/2-8, 2)], NULL); if (progress/2-10 >= 0) { - V_DrawScaledPatch(221 + (32*max(0, progress-76)), - 32, - 0, kp_lapanim_number[(((UINT32)stplyr->laps+1) % 10)][min(progress/2-10, 2)]); + V_DrawFixedPatch((208 + (32*max(0, progress-76)))*FRACUNIT, // 221 + (-6)*FRACUNIT, // 24 + FRACUNIT, V_HUDTRANS, + kp_lapanim_number[(((UINT32)stplyr->laps+1) % 10)][min(progress/2-10, 2)], NULL); } } } From 04dc2978abd766cb8305da7382211693cdfcc2e7 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 23:10:38 -0400 Subject: [PATCH 41/49] Added judging hands (if'd out) --- src/k_kart.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 453b0be85..78b92a9fe 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5577,6 +5577,9 @@ static patch_t *kp_lapanim_lap[7]; static patch_t *kp_lapanim_final[11]; static patch_t *kp_lapanim_number[10][3]; static patch_t *kp_lapanim_emblem; +#if 0 +static patch_t *kp_lapanim_hand[3]; +#endif void K_LoadKartHUDGraphics(void) { @@ -5796,6 +5799,15 @@ void K_LoadKartHUDGraphics(void) } kp_lapanim_emblem = (patch_t *) W_CachePatchName("K_LAPE00", PU_HUDGFX); + +#if 0 + sprintf(buffer, "K_LAPH0x"); + for (i = 0; i < 3; i++) + { + buffer[7] = '0'+(i+1); + kp_lapanim_hand[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); + } +#endif } // For the item toggle menu @@ -7377,12 +7389,28 @@ static void K_drawLapStartAnim(void) // This is an EVEN MORE insanely complicated animation. const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation]; UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, 0); +#if 0 + UINT8 h = 1; + + if (stplyr->kartstuff[k_position] == 1) + h = 0; + else if (K_IsPlayerLosing(stplyr)) + h = 2; +#endif V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, (48 - (32*max(0, progress-76)))*FRACUNIT, FRACUNIT, V_HUDTRANS, kp_lapanim_emblem, colormap); +#if 0 + V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, + (48 - (32*max(0, progress-76)) + + 4 - abs((leveltime % 8) - 4))*FRACUNIT, + FRACUNIT, V_HUDTRANS, + kp_lapanim_hand[h], NULL); +#endif + if (stplyr->laps == (UINT8)(cv_numlaps.value - 1)) { V_DrawFixedPatch((62 - (32*max(0, progress-76)))*FRACUNIT, // 27 From ee033c1ac4ef7aaccdc7b7d4abfd351b7a65c8dc Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 31 Oct 2018 23:34:13 -0400 Subject: [PATCH 42/49] YOU GOT EM Flashes on screen whenever you get more than 1 karma point at a time, getting you back into the game. --- src/d_player.h | 1 + src/dehacked.c | 1 + src/k_kart.c | 10 ++++++++++ src/p_inter.c | 21 +++++++++++++++++---- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 866589dfb..18099967a 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -344,6 +344,7 @@ typedef enum k_comebackpoints, // Number of times you've bombed or gave an item to someone; once it's 3 it gets set back to 0 and you're given a bumper k_comebackmode, // 0 = bomb, 1 = item 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 NUMKARTSTUFF } kartstufftype_t; diff --git a/src/dehacked.c b/src/dehacked.c index 77663ccda..7222b6ffd 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7927,6 +7927,7 @@ static const char *const KARTSTUFF_LIST[] = { "COMEBACKPOINTS", "COMEBACKMODE", "WANTED", + "YOUGOTEM", }; static const char *const HUDITEMS_LIST[] = { diff --git a/src/k_kart.c b/src/k_kart.c index ee59566f8..14978c672 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4067,6 +4067,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->kartstuff[k_lapanimation]) player->kartstuff[k_lapanimation]--; + if (player->kartstuff[k_yougotem]) + player->kartstuff[k_yougotem]--; + if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer])) { if (player->exiting) @@ -5578,6 +5581,8 @@ static patch_t *kp_lapanim_final[11]; static patch_t *kp_lapanim_number[10][3]; static patch_t *kp_lapanim_emblem; +static patch_t *kp_yougotem; + void K_LoadKartHUDGraphics(void) { INT32 i, j; @@ -5796,6 +5801,8 @@ void K_LoadKartHUDGraphics(void) } kp_lapanim_emblem = (patch_t *) W_CachePatchName("K_LAPE00", PU_HUDGFX); + + kp_yougotem = (patch_t *) W_CachePatchName("YOUGOTEM", PU_HUDGFX); } // For the item toggle menu @@ -7652,6 +7659,9 @@ void K_drawKartHUD(void) K_drawLapStartAnim(); } + if (G_BattleGametype() && !splitscreen && (stplyr->kartstuff[k_yougotem] % 2)) // * YOU GOT EM * + V_DrawScaledPatch(BASEVIDWIDTH/2 - SHORT(kp_yougotem->width), 32, V_HUDTRANS, kp_yougotem); + // Draw FREE PLAY. if (isfreeplay && !stplyr->spectator && timeinmap > 113) K_drawKartFreePlay(leveltime); diff --git a/src/p_inter.c b/src/p_inter.c index af5dc5b12..8b49494b2 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -494,6 +494,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) else { mobj_t *boom = P_SpawnMobj(special->target->x, special->target->y, special->target->z, MT_BOOMEXPLODE); + UINT8 ptadd = (K_IsPlayerWanted(player) ? 2 : 1); + boom->scale = special->target->scale; boom->destscale = special->target->scale; boom->momz = 5*FRACUNIT; @@ -516,12 +518,17 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } if (numingame <= 2) // If so, then an extra karma point so they are 100% certain to switch places; it's annoying to end matches with a bomb kill - special->target->player->kartstuff[k_comebackpoints]++; + ptadd++; } - special->target->player->kartstuff[k_comebackpoints] += (K_IsPlayerWanted(player) ? 2 : 1); + special->target->player->kartstuff[k_comebackpoints] += ptadd; + + if (ptadd > 1) + special->target->player->kartstuff[k_yougotem] = TICRATE; + if (special->target->player->kartstuff[k_comebackpoints] >= 2) K_StealBumper(special->target->player, player, true); + special->target->player->kartstuff[k_comebacktimer] = comebacktime; K_ExplodePlayer(player, special->target, special); @@ -545,6 +552,8 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) else if (special->target->player->kartstuff[k_comebackmode] == 2 && P_CanPickupItem(player, 2)) { mobj_t *poof = P_SpawnMobj(special->x, special->y, special->z, MT_EXPLODE); + UINT8 ptadd = 1; // No WANTED bonus for tricking + S_StartSound(poof, special->info->seesound); if (player->kartstuff[k_bumper] == 1) // If you have only one bumper left, and see if it's a 1v1 @@ -560,14 +569,18 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) } if (numingame <= 2) // If so, then an extra karma point so they are 100% certain to switch places; it's annoying to end matches with a fake kill - special->target->player->kartstuff[k_comebackpoints]++; + ptadd++; } special->target->player->kartstuff[k_comebackmode] = 0; - special->target->player->kartstuff[k_comebackpoints]++; + special->target->player->kartstuff[k_comebackpoints] += ptadd; + + if (ptadd > 1) + special->target->player->kartstuff[k_yougotem] = TICRATE; if (special->target->player->kartstuff[k_comebackpoints] >= 2) K_StealBumper(special->target->player, player, true); + special->target->player->kartstuff[k_comebacktimer] = comebacktime; K_DropItems(player); //K_StripItems(player); From e59102365fbc6e922a088bc7ab2f91566af1e946 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 00:57:38 -0400 Subject: [PATCH 43/49] Battle points are visible --- src/dehacked.c | 32 ++++++++++++++++++++++++ src/info.c | 63 ++++++++++++++++++++++++++++++++++++++++++++--- src/info.h | 39 ++++++++++++++++++++++++++++- src/k_kart.c | 29 ++++++++++++++++++++++ src/k_kart.h | 1 + src/lua_baselib.c | 15 +++++++++++ src/p_mobj.c | 22 +++++++++++++++++ 7 files changed, 197 insertions(+), 4 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 7222b6ffd..8877cee61 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -6758,6 +6758,36 @@ static const char *const STATE_LIST[] = { // array length left dynamic for sanit "S_KARMAWHEEL", // Karma player wheels + "S_BATTLEPOINT1A", // Battle point indicators + "S_BATTLEPOINT1B", + "S_BATTLEPOINT1C", + "S_BATTLEPOINT1D", + "S_BATTLEPOINT1E", + "S_BATTLEPOINT1F", + "S_BATTLEPOINT1G", + "S_BATTLEPOINT1H", + "S_BATTLEPOINT1I", + + "S_BATTLEPOINT2A", + "S_BATTLEPOINT2B", + "S_BATTLEPOINT2C", + "S_BATTLEPOINT2D", + "S_BATTLEPOINT2E", + "S_BATTLEPOINT2F", + "S_BATTLEPOINT2G", + "S_BATTLEPOINT2H", + "S_BATTLEPOINT2I", + + "S_BATTLEPOINT3A", + "S_BATTLEPOINT3B", + "S_BATTLEPOINT3C", + "S_BATTLEPOINT3D", + "S_BATTLEPOINT3E", + "S_BATTLEPOINT3F", + "S_BATTLEPOINT3G", + "S_BATTLEPOINT3H", + "S_BATTLEPOINT3I", + // Thunder shield use stuff; "S_KSPARK1", // Sparkling Radius "S_KSPARK2", @@ -7515,6 +7545,8 @@ static const char *const MOBJTYPE_LIST[] = { // array length left dynamic for s "MT_KARMAHITBOX", "MT_KARMAWHEEL", + "MT_BATTLEPOINT", + "MT_FZEROBOOM", // Midnight Channel stuff: diff --git a/src/info.c b/src/info.c index cde74cee2..928e2cb1b 100644 --- a/src/info.c +++ b/src/info.c @@ -60,9 +60,9 @@ char sprnames[NUMSPRITES + 1][5] = "SSMN","KRBM","BHOG","BHBM","SPBM","THNS","SINK","SITR","KBLN","DEZL", "POKE","AUDI","DECO","DOOD","SNES","GBAS","SPRS","BUZB","CHOM","SACO", "CRAB","SHAD","BRNG","BUMP","FLEN","CLAS","PSHW","ISTA","ISTB","ARRO", - "ITEM","ITMO","ITMI","ITMN","WANT","PBOM","RETI","AIDU","KSPK","LZI1", - "LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1","GARU","MARR","REAP", - "JITB","CDMO","CDBU","VIEW" + "ITEM","ITMO","ITMI","ITMN","WANT","PBOM","HIT1","HIT2","HIT3","RETI", + "AIDU","KSPK","LZI1","LZI2","KLIT","FZSM","FZBM","FPRT","SPTL","ENM1", + "GARU","MARR","REAP","JITB","CDMO","CDBU","VIEW" }; // Doesn't work with g++, needs actionf_p1 (don't modify this comment) @@ -3046,6 +3046,36 @@ state_t states[NUMSTATES] = {SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KARMAWHEEL + {SPR_HIT1, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT1B}, // S_BATTLEPOINT1A + {SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1C}, // S_BATTLEPOINT1B + {SPR_HIT1, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT1D}, // S_BATTLEPOINT1C + {SPR_HIT1, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT1E}, // S_BATTLEPOINT1D + {SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1F}, // S_BATTLEPOINT1E + {SPR_HIT1, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT1G}, // S_BATTLEPOINT1F + {SPR_HIT1, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT1H}, // S_BATTLEPOINT1G + {SPR_HIT1, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT1I}, // S_BATTLEPOINT1H + {SPR_HIT1, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT1I + + {SPR_HIT2, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT2B}, // S_BATTLEPOINT2A + {SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2C}, // S_BATTLEPOINT2B + {SPR_HIT2, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT2D}, // S_BATTLEPOINT2C + {SPR_HIT2, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT2E}, // S_BATTLEPOINT2D + {SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2F}, // S_BATTLEPOINT2E + {SPR_HIT2, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT2G}, // S_BATTLEPOINT2F + {SPR_HIT2, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT2H}, // S_BATTLEPOINT2G + {SPR_HIT2, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT2I}, // S_BATTLEPOINT2H + {SPR_HIT2, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT2I + + {SPR_HIT3, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT3B}, // S_BATTLEPOINT3A + {SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3C}, // S_BATTLEPOINT3B + {SPR_HIT3, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT3D}, // S_BATTLEPOINT3C + {SPR_HIT3, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT3E}, // S_BATTLEPOINT3D + {SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3F}, // S_BATTLEPOINT3E + {SPR_HIT3, 1, 1, {NULL}, 0, 0, S_BATTLEPOINT3G}, // S_BATTLEPOINT3F + {SPR_HIT3, 2, TICRATE, {NULL}, 0, 0, S_BATTLEPOINT3H}, // S_BATTLEPOINT3G + {SPR_HIT3, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT3I}, // S_BATTLEPOINT3H + {SPR_HIT3, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT3I + // Oh no it's annoying lightning states....... // Lightning Sparks (it's the ones we'll use for the radius) {SPR_KSPK, FF_FULLBRIGHT, 2, {A_LightningFollowPlayer}, 0, 0, S_KSPARK2}, // S_KSPARK1 @@ -17276,6 +17306,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BATTLEPOINT + -1, // doomednum + S_INVISIBLE, // 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 + 8, // speed + 8*FRACUNIT, // radius + 8*FRACUNIT, // height + -1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + { // MT_FZEROBOOM -1, // doomednum S_INVISIBLE, // spawnstate diff --git a/src/info.h b/src/info.h index 78f0edaed..d125aa96e 100644 --- a/src/info.h +++ b/src/info.h @@ -651,6 +651,11 @@ typedef enum sprite SPR_WANT, SPR_PBOM, // player bomb + + SPR_HIT1, // battle points + SPR_HIT2, // battle points + SPR_HIT3, // battle points + SPR_RETI, // player reticule SPR_AIDU, @@ -3619,7 +3624,37 @@ typedef enum state S_PLAYERFAKE, S_KARMAWHEEL, - + + S_BATTLEPOINT1A, // Battle point indicators + S_BATTLEPOINT1B, + S_BATTLEPOINT1C, + S_BATTLEPOINT1D, + S_BATTLEPOINT1E, + S_BATTLEPOINT1F, + S_BATTLEPOINT1G, + S_BATTLEPOINT1H, + S_BATTLEPOINT1I, + + S_BATTLEPOINT2A, + S_BATTLEPOINT2B, + S_BATTLEPOINT2C, + S_BATTLEPOINT2D, + S_BATTLEPOINT2E, + S_BATTLEPOINT2F, + S_BATTLEPOINT2G, + S_BATTLEPOINT2H, + S_BATTLEPOINT2I, + + S_BATTLEPOINT3A, + S_BATTLEPOINT3B, + S_BATTLEPOINT3C, + S_BATTLEPOINT3D, + S_BATTLEPOINT3E, + S_BATTLEPOINT3F, + S_BATTLEPOINT3G, + S_BATTLEPOINT3H, + S_BATTLEPOINT3I, + // Thunder shield use stuff; S_KSPARK1, // Sparkling Radius S_KSPARK2, @@ -4394,6 +4429,8 @@ typedef enum mobj_type MT_KARMAHITBOX, MT_KARMAWHEEL, + MT_BATTLEPOINT, + MT_FZEROBOOM, // Midnight Channel stuff: diff --git a/src/k_kart.c b/src/k_kart.c index 14978c672..68478db29 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1784,6 +1784,32 @@ void K_DoInstashield(player_t *player) P_SetTarget(&layerb->target, player->mo); } +void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount) +{ + statenum_t st; + mobj_t *pt; + + if (!source || !source->mo) + return; + + if (amount == 1) + st = S_BATTLEPOINT1A; + else if (amount == 2) + st = S_BATTLEPOINT2A; + else if (amount == 3) + st = S_BATTLEPOINT3A; + else + return; // NO STATE! + + pt = P_SpawnMobj(source->mo->x, source->mo->y, source->mo->z, MT_BATTLEPOINT); + P_SetTarget(&pt->target, source->mo); + P_SetMobjState(pt, st); + if (victim && victim->skincolor) + pt->color = victim->skincolor; + else + pt->color = source->skincolor; +} + void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem) { UINT8 scoremultiply = 1; @@ -1817,6 +1843,7 @@ void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem if (source && source->player && player != source->player) { P_AddPlayerScore(source->player, scoremultiply); + K_SpawnBattlePoints(source->player, player, scoremultiply); if (!trapitem) { source->player->kartstuff[k_wanted] -= wantedreduce; @@ -1907,6 +1934,7 @@ void K_SquishPlayer(player_t *player, mobj_t *source) if (source && source->player && player != source->player) { P_AddPlayerScore(source->player, scoremultiply); + K_SpawnBattlePoints(source->player, player, scoremultiply); source->player->kartstuff[k_wanted] -= wantedreduce; player->kartstuff[k_wanted] -= (wantedreduce/2); } @@ -1996,6 +2024,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor) // A b if (source && source->player && player != source->player) { P_AddPlayerScore(source->player, scoremultiply); + K_SpawnBattlePoints(source->player, player, scoremultiply); source->player->kartstuff[k_wanted] -= wantedreduce; player->kartstuff[k_wanted] -= (wantedreduce/2); } diff --git a/src/k_kart.h b/src/k_kart.h index 671efb89c..1a96d6bb3 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -27,6 +27,7 @@ void K_KartMoveAnimation(player_t *player); void K_KartPlayerThink(player_t *player, ticcmd_t *cmd); void K_KartPlayerAfterThink(player_t *player); void K_DoInstashield(player_t *player); +void K_SpawnBattlePoints(player_t *source, player_t *victim, UINT8 amount); void K_SpinPlayer(player_t *player, mobj_t *source, INT32 type, boolean trapitem); void K_SquishPlayer(player_t *player, mobj_t *source); void K_ExplodePlayer(player_t *player, mobj_t *source, mobj_t *inflictor); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index 8b9a01313..05facf180 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -2109,6 +2109,20 @@ static int lib_kDoInstashield(lua_State *L) return 0; } +static int lib_kSpawnBattlePoints(lua_State *L) +{ + player_t *source = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); + player_t *victim = *((player_t **)luaL_checkudata(L, 2, META_PLAYER)); + UINT8 amount = (UINT8)luaL_checkinteger(L, 3); + NOHUD + if (!source) + return LUA_ErrInvalid(L, "player_t"); + if (!victim) + return LUA_ErrInvalid(L, "player_t"); + K_SpawnBattlePoints(source, victim, amount); + return 0; +} + static int lib_kSpinPlayer(lua_State *L) { player_t *player = *((player_t **)luaL_checkudata(L, 1, META_PLAYER)); @@ -2500,6 +2514,7 @@ static luaL_Reg lib[] = { {"K_KartBouncing",lib_kKartBouncing}, {"K_MatchGenericExtraFlags",lib_kMatchGenericExtraFlags}, {"K_DoInstashield",lib_kDoInstashield}, + {"K_SpawnBattlePoints",lib_kSpawnBattlePoints}, {"K_SpinPlayer",lib_kSpinPlayer}, {"K_SquishPlayer",lib_kSquishPlayer}, {"K_ExplodePlayer",lib_kExplodePlayer}, diff --git a/src/p_mobj.c b/src/p_mobj.c index f4fd40c9f..78c7fe5c6 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8323,6 +8323,28 @@ void P_MobjThinker(mobj_t *mobj) } P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z); break; + case MT_BATTLEPOINT: + if (!mobj->target || P_MobjWasRemoved(mobj->target)) + { + P_RemoveMobj(mobj); + return; + } + + if (mobj->movefactor < 48*mobj->target->scale) + { + mobj->movefactor += (48*mobj->target->scale)/6; + if (mobj->movefactor > mobj->target->height) + mobj->movefactor = mobj->target->height; + } + else if (mobj->movefactor > 48*mobj->target->scale) + { + mobj->movefactor -= (48*mobj->target->scale)/6; + if (mobj->movefactor < mobj->target->height) + mobj->movefactor = mobj->target->height; + } + + P_TeleportMove(mobj, mobj->target->x, mobj->target->y, mobj->target->z + (mobj->target->height/2) + mobj->movefactor); + break; case MT_THUNDERSHIELD: { fixed_t destx, desty; From a4ad09c470c82ba1b9f17a23458ec361054d01ea Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 13:44:09 -0400 Subject: [PATCH 44/49] First frame lasts longer --- src/info.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/info.c b/src/info.c index 928e2cb1b..5aa5dcc2e 100644 --- a/src/info.c +++ b/src/info.c @@ -3046,7 +3046,7 @@ state_t states[NUMSTATES] = {SPR_PBOM, 0, -1, {NULL}, 0, 0, S_NULL}, // S_KARMAWHEEL - {SPR_HIT1, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT1B}, // S_BATTLEPOINT1A + {SPR_HIT1, 0, 7, {NULL}, 0, 0, S_BATTLEPOINT1B}, // S_BATTLEPOINT1A {SPR_HIT1, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT1C}, // S_BATTLEPOINT1B {SPR_HIT1, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT1D}, // S_BATTLEPOINT1C {SPR_HIT1, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT1E}, // S_BATTLEPOINT1D @@ -3056,7 +3056,7 @@ state_t states[NUMSTATES] = {SPR_HIT1, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT1I}, // S_BATTLEPOINT1H {SPR_HIT1, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT1I - {SPR_HIT2, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT2B}, // S_BATTLEPOINT2A + {SPR_HIT2, 0, 7, {NULL}, 0, 0, S_BATTLEPOINT2B}, // S_BATTLEPOINT2A {SPR_HIT2, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT2C}, // S_BATTLEPOINT2B {SPR_HIT2, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT2D}, // S_BATTLEPOINT2C {SPR_HIT2, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT2E}, // S_BATTLEPOINT2D @@ -3066,7 +3066,7 @@ state_t states[NUMSTATES] = {SPR_HIT2, 5, 1, {NULL}, 0, 0, S_BATTLEPOINT2I}, // S_BATTLEPOINT2H {SPR_HIT2, 6, 1, {NULL}, 0, 0, S_NULL}, // S_BATTLEPOINT2I - {SPR_HIT3, 0, 1, {NULL}, 0, 0, S_BATTLEPOINT3B}, // S_BATTLEPOINT3A + {SPR_HIT3, 0, 7, {NULL}, 0, 0, S_BATTLEPOINT3B}, // S_BATTLEPOINT3A {SPR_HIT3, 2, 1, {NULL}, 0, 0, S_BATTLEPOINT3C}, // S_BATTLEPOINT3B {SPR_HIT3, 4, 1, {NULL}, 0, 0, S_BATTLEPOINT3D}, // S_BATTLEPOINT3C {SPR_HIT3, 3, 1, {NULL}, 0, 0, S_BATTLEPOINT3E}, // S_BATTLEPOINT3D From 0c0a53b2d623348c47056780be939a5740bbd78f Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 16:15:25 -0400 Subject: [PATCH 45/49] Lap hands touch-up --- src/d_player.h | 1 + src/dehacked.c | 1 + src/k_kart.c | 27 ++++++++------------------- src/p_spec.c | 37 ++++++++++++++++++++++++++++--------- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 866589dfb..f06a7313a 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -280,6 +280,7 @@ typedef enum k_throwdir, // Held dir of controls; 1 = forward, 0 = none, -1 = backward (was "player->heldDir") k_lapanimation, // Used to show the lap start wing logo animation + k_laphand, // Lap hand gfx to use; 0 = none, 1 = :ok_hand:, 2 = :thumbs_up:, 3 = :thumps_down: k_cardanimation, // Used to determine the position of some full-screen Battle Mode graphics k_voices, // Used to stop the player saying more voices than it should k_tauntvoices, // Used to specifically stop taunt voice spam diff --git a/src/dehacked.c b/src/dehacked.c index 77663ccda..3545e0558 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7867,6 +7867,7 @@ static const char *const KARTSTUFF_LIST[] = { "THROWDIR", "LAPANIMATION", + "LAPHAND", "CARDANIMATION", "VOICES", "TAUNTVOICES", diff --git a/src/k_kart.c b/src/k_kart.c index 78b92a9fe..9af07ec8c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5577,9 +5577,7 @@ static patch_t *kp_lapanim_lap[7]; static patch_t *kp_lapanim_final[11]; static patch_t *kp_lapanim_number[10][3]; static patch_t *kp_lapanim_emblem; -#if 0 static patch_t *kp_lapanim_hand[3]; -#endif void K_LoadKartHUDGraphics(void) { @@ -5800,14 +5798,12 @@ void K_LoadKartHUDGraphics(void) kp_lapanim_emblem = (patch_t *) W_CachePatchName("K_LAPE00", PU_HUDGFX); -#if 0 sprintf(buffer, "K_LAPH0x"); for (i = 0; i < 3; i++) { buffer[7] = '0'+(i+1); kp_lapanim_hand[i] = (patch_t *) W_CachePatchName(buffer, PU_HUDGFX); } -#endif } // For the item toggle menu @@ -7389,27 +7385,20 @@ static void K_drawLapStartAnim(void) // This is an EVEN MORE insanely complicated animation. const UINT8 progress = 80-stplyr->kartstuff[k_lapanimation]; UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, 0); -#if 0 - UINT8 h = 1; - - if (stplyr->kartstuff[k_position] == 1) - h = 0; - else if (K_IsPlayerLosing(stplyr)) - h = 2; -#endif V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, (48 - (32*max(0, progress-76)))*FRACUNIT, FRACUNIT, V_HUDTRANS, kp_lapanim_emblem, colormap); -#if 0 - V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, - (48 - (32*max(0, progress-76)) - + 4 - abs((leveltime % 8) - 4))*FRACUNIT, - FRACUNIT, V_HUDTRANS, - kp_lapanim_hand[h], NULL); -#endif + if (stplyr->kartstuff[k_laphand] >= 1 && stplyr->kartstuff[k_laphand] <= 3) + { + V_DrawFixedPatch((BASEVIDWIDTH/2 + (32*max(0, stplyr->kartstuff[k_lapanimation]-76)))*FRACUNIT, + (48 - (32*max(0, progress-76)) + + 4 - abs((leveltime % 8) - 4))*FRACUNIT, + FRACUNIT, V_HUDTRANS, + kp_lapanim_hand[stplyr->kartstuff[k_laphand]-1], NULL); + } if (stplyr->laps == (UINT8)(cv_numlaps.value - 1)) { diff --git a/src/p_spec.c b/src/p_spec.c index 76ed73aa8..9f18fdc7d 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4196,7 +4196,34 @@ DoneSection2: { if (player->starpostcount >= numstarposts/2) // srb2kart: must have touched *enough* starposts (was originally "(player->starpostnum == numstarposts)") { + UINT8 i; + UINT8 nump = 0; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator) + continue; + nump++; + } + player->laps++; + + // Set up lap animation vars + if (nump > 1) + { + if (K_IsPlayerLosing(player)) + player->kartstuff[k_laphand] = 3; + else + { + if (nump > 2 && player->kartstuff[k_position] == 1) // 1st place in 1v1 uses thumbs up + player->kartstuff[k_laphand] = 1; + else + player->kartstuff[k_laphand] = 2; + } + } + else + player->kartstuff[k_laphand] = 0; // No hands in FREE PLAY + player->kartstuff[k_lapanimation] = 80; if (player->pflags & PF_NIGHTSMODE) @@ -4237,15 +4264,7 @@ DoneSection2: // Figure out how many are playing on the last lap, to prevent spectate griefing if (!nospectategrief && player->laps >= (UINT8)(cv_numlaps.value - 1)) - { - UINT8 i; - for (i = 0; i < MAXPLAYERS; i++) - { - if (!playeringame[i] || players[i].spectator) - continue; - nospectategrief++; - } - } + nospectategrief = nump; } else if (player->starpostnum) { From 5cebc06db641fee7accfb33c92fbdc7240d9462c Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 17:06:10 -0400 Subject: [PATCH 46/49] Properly center this --- 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 68478db29..cef28029d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7689,7 +7689,7 @@ void K_drawKartHUD(void) } if (G_BattleGametype() && !splitscreen && (stplyr->kartstuff[k_yougotem] % 2)) // * YOU GOT EM * - V_DrawScaledPatch(BASEVIDWIDTH/2 - SHORT(kp_yougotem->width), 32, V_HUDTRANS, kp_yougotem); + V_DrawScaledPatch(BASEVIDWIDTH/2 - (SHORT(kp_yougotem->width)/2), 32, V_HUDTRANS, kp_yougotem); // Draw FREE PLAY. if (isfreeplay && !stplyr->spectator && timeinmap > 113) From b26ef23b5294b6aa948ef36ed0f9e3f2c77f5672 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 17:08:30 -0400 Subject: [PATCH 47/49] Double length of msg --- src/p_inter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 8b49494b2..73eb9f98a 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -524,7 +524,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->kartstuff[k_comebackpoints] += ptadd; if (ptadd > 1) - special->target->player->kartstuff[k_yougotem] = TICRATE; + special->target->player->kartstuff[k_yougotem] = 2*TICRATE; if (special->target->player->kartstuff[k_comebackpoints] >= 2) K_StealBumper(special->target->player, player, true); @@ -576,7 +576,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) special->target->player->kartstuff[k_comebackpoints] += ptadd; if (ptadd > 1) - special->target->player->kartstuff[k_yougotem] = TICRATE; + special->target->player->kartstuff[k_yougotem] = 2*TICRATE; if (special->target->player->kartstuff[k_comebackpoints] >= 2) K_StealBumper(special->target->player, player, true); From 3c050b44f304925dcc263825d6bbae18cf8edd4b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 17:37:59 -0400 Subject: [PATCH 48/49] Change default brake color from Yellow to White --- src/p_mobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index f6548e940..12e61dff1 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8331,7 +8331,7 @@ void P_MobjThinker(mobj_t *mobj) else if (mobj->target->player->kartstuff[k_driftcharge] >= K_GetKartDriftSparkValue(mobj->target->player)) mobj->color = SKINCOLOR_SAPPHIRE; else - mobj->color = SKINCOLOR_YELLOW; + mobj->color = SKINCOLOR_WHITE; K_MatchGenericExtraFlags(mobj, mobj->target); if (leveltime & 1) From 28e40b7e971e662381445926b4fb4b6345648a0e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 1 Nov 2018 19:50:31 -0400 Subject: [PATCH 49/49] Fix random crash on squishing Why does this cause a crash? I dunno, beats me, but this seemed to fix it. --- src/p_map.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 2bcfd73a7..5784b3ff3 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1411,19 +1411,17 @@ static boolean PIT_CheckThing(mobj_t *thing) // Make sure they aren't able to damage you ANYWHERE along the Z axis, you have to be TOUCHING the person. && !(thing->z + thing->height < tmthing->z || thing->z > tmthing->z + tmthing->height)) { - // SRB2kart - Squish! - if (tmthing->scale > thing->scale + (FRACUNIT/8)) + + if (tmthing->scale > thing->scale + (FRACUNIT/8)) // SRB2kart - Handle squishes first! K_SquishPlayer(thing->player, tmthing); else if (thing->scale > tmthing->scale + (FRACUNIT/8)) K_SquishPlayer(tmthing->player, thing); - - // SRB2kart - Invincibility! - if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) + else if (tmthing->player->kartstuff[k_invincibilitytimer] && !thing->player->kartstuff[k_invincibilitytimer]) // SRB2kart - Then invincibility! P_DamageMobj(thing, tmthing, tmthing, 1); else if (thing->player->kartstuff[k_invincibilitytimer] && !tmthing->player->kartstuff[k_invincibilitytimer]) P_DamageMobj(tmthing, thing, thing, 1); - if (G_BattleGametype() && (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam)) + /*if (G_BattleGametype() && (!G_GametypeHasTeams() || tmthing->player->ctfteam != thing->player->ctfteam)) { if ((tmthing->player->powers[pw_invulnerability] || tmthing->player->powers[pw_super]) && !thing->player->powers[pw_super]) @@ -1441,7 +1439,7 @@ static boolean PIT_CheckThing(mobj_t *thing) P_DamageMobj(thing, tmthing, tmthing, 1); else if ((thing->player->pflags & PF_TAGIT) && !(tmthing->player->pflags & PF_TAGIT)) P_DamageMobj(tmthing, thing, tmthing, 1); - } + }*/ } // Force solid players in hide and seek to avoid corner stacking.