From d85f42689b71f4a737e3ae263e9ba01023f00e8c Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Tue, 8 May 2018 18:14:39 -0400 Subject: [PATCH 01/51] Don't increment totalplaytime if a demo is playing. --- src/p_tick.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_tick.c b/src/p_tick.c index f4bc59323..e81d0e5b6 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -607,6 +607,7 @@ void P_Ticker(boolean run) } // Keep track of how long they've been playing! + if (!demoplayback) // Don't incerment if a demo is playing. totalplaytime++; if (!useNightsSS && G_IsSpecialStage(gamemap)) From a41f8756e10a9f75c9227fa017f2203cd2e0ac1e Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Tue, 8 May 2018 18:36:47 -0400 Subject: [PATCH 02/51] Add indentation --- src/p_tick.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_tick.c b/src/p_tick.c index e81d0e5b6..aaf44f5e1 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -608,7 +608,7 @@ void P_Ticker(boolean run) // Keep track of how long they've been playing! if (!demoplayback) // Don't incerment if a demo is playing. - totalplaytime++; + totalplaytime++; if (!useNightsSS && G_IsSpecialStage(gamemap)) P_DoSpecialStageStuff(); From 9bd92b7e2d4cf8c5f752b2000c90376537299cdc Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Tue, 8 May 2018 18:38:28 -0400 Subject: [PATCH 03/51] Fix small typo --- src/p_tick.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_tick.c b/src/p_tick.c index aaf44f5e1..4c59f8b48 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -607,7 +607,7 @@ void P_Ticker(boolean run) } // Keep track of how long they've been playing! - if (!demoplayback) // Don't incerment if a demo is playing. + if (!demoplayback) // Don't increment if a demo is playing. totalplaytime++; if (!useNightsSS && G_IsSpecialStage(gamemap)) From 3b7bf18971ea86eb5e2be40319eb3c2a5d819230 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Fri, 11 May 2018 20:35:46 +0100 Subject: [PATCH 04/51] Fix both Bouncy FOF and Space Countdown sector specials working on FOFs without the FF_EXISTS flag Also move the Bouncy FOF sector special check above the FOF heights checking in P_CheckBouncySectors, because it means not having to waste time calculating FOF heights only for it not to be bouncy anyway :P --- src/p_user.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/p_user.c b/src/p_user.c index 7abf85347..da8e19caa 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1621,6 +1621,9 @@ boolean P_InSpaceSector(mobj_t *mo) // Returns true if you are in space for (rover = sector->ffloors; rover; rover = rover->next) { + if (!(rover->flags & FF_EXISTS)) + continue; + if (GETSECSPECIAL(rover->master->frontsector->special, 1) != SPACESPECIAL) continue; #ifdef ESLOPE @@ -1835,6 +1838,12 @@ static void P_CheckBouncySectors(player_t *player) for (rover = node->m_sector->ffloors; rover; rover = rover->next) { + if (!(rover->flags & FF_EXISTS)) + continue; // FOFs should not be bouncy if they don't even "exist" + + if (GETSECSPECIAL(rover->master->frontsector->special, 1) != 15) + continue; // this sector type is required for FOFs to be bouncy + topheight = P_GetFOFTopZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL); bottomheight = P_GetFOFBottomZ(player->mo, node->m_sector, rover, player->mo->x, player->mo->y, NULL); @@ -1848,7 +1857,6 @@ static void P_CheckBouncySectors(player_t *player) && oldz + player->mo->height > P_GetFOFBottomZ(player->mo, node->m_sector, rover, oldx, oldy, NULL)) top = false; - if (GETSECSPECIAL(rover->master->frontsector->special, 1) == 15) { fixed_t linedist; From 85aff6fa6b574d1e77239f0ba3948e8107635203 Mon Sep 17 00:00:00 2001 From: Sryder Date: Wed, 16 May 2018 21:04:57 +0100 Subject: [PATCH 05/51] Fix FF_FULLBRIGHT not working in sectors with multiple light levels in OpenGL --- src/hardware/hw_main.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 81021ef7f..b758c828e 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -4228,6 +4228,9 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) i = 0; temp = FLOAT_TO_FIXED(realtop); + if (spr->mobj->frame & FF_FULLBRIGHT) + lightlevel = 255; + #ifdef ESLOPE for (i = 1; i < sector->numlights; i++) { @@ -4235,14 +4238,16 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) : sector->lightlist[i].height; if (h <= temp) { - lightlevel = *list[i-1].lightlevel; + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = *list[i-1].lightlevel; colormap = list[i-1].extra_colormap; break; } } #else i = R_GetPlaneLight(sector, temp, false); - lightlevel = *list[i].lightlevel; + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = *list[i].lightlevel; colormap = list[i].extra_colormap; #endif @@ -4257,7 +4262,8 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) // even if we aren't changing colormap or lightlevel, we still need to continue drawing down the sprite if (!(list[i].flags & FF_NOSHADE) && (list[i].flags & FF_CUTSPRITES)) { - lightlevel = *list[i].lightlevel; + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = *list[i].lightlevel; colormap = list[i].extra_colormap; } From 0c0d54c98c1b3954204d9c88ed68937ee489c2c0 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Thu, 17 May 2018 13:57:19 -0400 Subject: [PATCH 06/51] Fix console typo --- src/p_setup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_setup.c b/src/p_setup.c index 52cd6ddbb..362e0966d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3003,7 +3003,7 @@ boolean P_AddWadFile(const char *wadfilename, char **firstmapname) if ((numlumps = W_LoadWadFile(wadfilename)) == INT16_MAX) { - CONS_Printf(M_GetText("Errors occured while loading %s; not added.\n"), wadfilename); + CONS_Printf(M_GetText("Errors occurred while loading %s; not added.\n"), wadfilename); return false; } else wadnum = (UINT16)(numwadfiles-1); From 424b66d09b6f3c74af10b61651bad9ee8dfadac0 Mon Sep 17 00:00:00 2001 From: Sryder Date: Thu, 17 May 2018 22:17:20 +0100 Subject: [PATCH 07/51] OpenGL Map Specific palettes working This makes OpenGL stop using a specific function that doesn't really do anything for it anymore. It looks like it was used for a hack that would change the colour of polygons for the flashpal equivalent in DOOM. I made it so ST_DoPaletteStuff doesn't set the flashpal in OpenGL as it already does its own hacky overlay and doing that would cause all the textures to be flushed more mid-level, it could be enabled for more correct flashpals, but they still wouldn't effect fog or lighting. This means the palette will be set when going to the title screen, and twice when starting a map, (causing the OpenGL cached textures to also be flushed at those times) --- src/d_main.c | 7 +------ src/p_setup.c | 5 ----- src/st_stuff.c | 10 +++++----- 3 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 4cdfb13d9..fbec5f7d8 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -730,11 +730,6 @@ void D_StartTitle(void) CON_ToggleOff(); // Reset the palette -#ifdef HWRENDER - if (rendermode == render_opengl) - HWR_SetPaletteColor(0); - else -#endif if (rendermode != render_none) V_SetPaletteLump("PLAYPAL"); } @@ -1223,7 +1218,7 @@ void D_SRB2Main(void) CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n"); R_Init(); - // setting up sound + // setting up sound if (dedicated) { nosound = true; diff --git a/src/p_setup.c b/src/p_setup.c index 52cd6ddbb..c3aa9884d 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2503,11 +2503,6 @@ boolean P_SetupLevel(boolean skipprecip) // Reset the palette -#ifdef HWRENDER - if (rendermode == render_opengl) - HWR_SetPaletteColor(0); - else -#endif if (rendermode != render_none) V_SetPaletteLump("PLAYPAL"); diff --git a/src/st_stuff.c b/src/st_stuff.c index 3562a9b71..72e0b6b94 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -210,17 +210,17 @@ void ST_doPaletteStuff(void) else palette = 0; +#ifdef HWRENDER + if (rendermode == render_opengl) + palette = 0; // No flashpals here in OpenGL +#endif + palette = min(max(palette, 0), 13); if (palette != st_palette) { st_palette = palette; -#ifdef HWRENDER - if (rendermode == render_opengl) - HWR_SetPaletteColor(0); - else -#endif if (rendermode != render_none) { V_SetPaletteLump(GetPalette()); // Reset the palette From 2d3ae11d6f25168516f04429856e92eeb247e03e Mon Sep 17 00:00:00 2001 From: Tasos Sahanidis Date: Thu, 17 May 2018 17:55:38 +0300 Subject: [PATCH 08/51] Correct C FixedMul() off-by-one errors The FixedMul() C implementation would produce off by one results, causing constant desyncs on 64 bit builds and builds without an ASM implementation of the function. This is fixed by shifting instead of dividing, possibly avoiding rounding errors. --- src/m_fixed.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/m_fixed.c b/src/m_fixed.c index ce7471a28..014457386 100644 --- a/src/m_fixed.c +++ b/src/m_fixed.c @@ -33,7 +33,9 @@ */ fixed_t FixedMul(fixed_t a, fixed_t b) { - return (fixed_t)((((INT64)a * b) ) / FRACUNIT); + // Need to cast to unsigned before shifting to avoid undefined behaviour + // for negative integers + return (fixed_t)(((UINT64)((INT64)a * b)) >> FRACBITS); } #endif //__USE_C_FIXEDMUL__ From 745be2c641722280469f4b003a7d71ff54bb4fba Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 21 May 2018 20:02:30 +0100 Subject: [PATCH 09/51] Stop Each Time trigger linedefs and object-carrying scrollers from doing anything with FOFs without FF_EXISTS --- src/p_floor.c | 14 ++++++++++++++ src/p_spec.c | 27 +++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/p_floor.c b/src/p_floor.c index 35c743a07..f30637659 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -2103,6 +2103,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) boolean floortouch = false; fixed_t bottomheight, topheight; msecnode_t *node; + ffloor_t *rover; for (i = 0; i < MAXPLAYERS; i++) { @@ -2150,6 +2151,19 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) { targetsec = §ors[targetsecnum]; + // Find the FOF corresponding to the control linedef + for (rover = targetsec->ffloors; rover; rover = rover->next) + { + if (rover->master == sec->lines[i]) + break; + } + + if (!rover) // This should be impossible, but don't complain if it is the case somehow + continue; + + if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there + continue; + for (j = 0; j < MAXPLAYERS; j++) { if (!playeringame[j]) diff --git a/src/p_spec.c b/src/p_spec.c index c62c3b209..d308a9b3f 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6628,6 +6628,7 @@ void T_Scroll(scroll_t *s) line_t *line; size_t i; INT32 sect; + ffloor_t *rover; case sc_side: // scroll wall texture side = sides + s->affectee; @@ -6669,6 +6670,19 @@ void T_Scroll(scroll_t *s) sector_t *psec; psec = sectors + sect; + // Find the FOF corresponding to the control linedef + for (rover = psec->ffloors; rover; rover = rover->next) + { + if (rover->master == sec->lines[i]) + break; + } + + if (!rover) // This should be impossible, but don't complain if it is the case somehow + continue; + + if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there + continue; + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6732,6 +6746,19 @@ void T_Scroll(scroll_t *s) sector_t *psec; psec = sectors + sect; + // Find the FOF corresponding to the control linedef + for (rover = psec->ffloors; rover; rover = rover->next) + { + if (rover->master == sec->lines[i]) + break; + } + + if (!rover) // This should be impossible, but don't complain if it is the case somehow + continue; + + if (!(rover->flags & FF_EXISTS)) // If the FOF does not "exist", we pretend that nobody's there + continue; + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; From 51606f675f90c37d20924312b64dc004766cec21 Mon Sep 17 00:00:00 2001 From: Sryder Date: Sat, 26 May 2018 13:13:37 +0100 Subject: [PATCH 10/51] Very large map rendering issue fixed Move old fix for too large maps having rendering issues from R_CheckBBox to OpenGL's HWR_CheckBBox From what I know, this effects at least Aerial Garden and Seraphic Skylands --- src/hardware/hw_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index 81021ef7f..059a09b15 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -2901,8 +2901,8 @@ static boolean HWR_CheckBBox(fixed_t *bspcoord) py2 = bspcoord[checkcoord[boxpos][3]]; // check clip list for an open space - angle1 = R_PointToAngle(px1, py1) - dup_viewangle; - angle2 = R_PointToAngle(px2, py2) - dup_viewangle; + angle1 = R_PointToAngle2(dup_viewx>>1, dup_viewy>>1, px1>>1, py1>>1) - dup_viewangle; + angle2 = R_PointToAngle2(dup_viewx>>1, dup_viewy>>1, px2>>1, py2>>1) - dup_viewangle; span = angle1 - angle2; From 71fa00e4235b5448513d503221395db74b573e57 Mon Sep 17 00:00:00 2001 From: Monster Iestyn Date: Mon, 28 May 2018 21:29:46 +0100 Subject: [PATCH 11/51] Ignore mouse button events if the mouse's focus is not actually on the window at the moment. This should hopefully kill the F12 getting stuck issue once and for all. --- src/sdl/i_video.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index 87ce84158..4eab0ae3c 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -658,6 +658,14 @@ static void Impl_HandleMouseButtonEvent(SDL_MouseButtonEvent evt, Uint32 type) SDL_memset(&event, 0, sizeof(event_t)); + // Ignore the event if the mouse is not actually focused on the window. + // This can happen if you used the mouse to restore keyboard focus; + // this apparently makes a mouse button down event but not a mouse button up event, + // resulting in whatever key was pressed down getting "stuck" if we don't ignore it. + // -- Monster Iestyn (28/05/18) + if (SDL_GetMouseFocus() != window) + return; + /// \todo inputEvent.button.which if (USE_MOUSEINPUT) { From cabc70faea608b87c3630e9b14a620eb2c1c189a Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 30 May 2018 17:22:31 -0400 Subject: [PATCH 12/51] Record Attack sets all of kart's gameplay variables now --- src/p_setup.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 3071b224c..8f307df46 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2985,20 +2985,28 @@ boolean P_SetupLevel(boolean skipprecip) }*/ // SRB2Kart: map load variables - if (modeattacking) + if (modeattacking) // Just play it safe and set everything + { gamespeed = 2; - else if (G_BattleGametype()) - gamespeed = 0; - else - gamespeed = cv_kartspeed.value; - - if (G_BattleGametype()) mirrormode = false; + franticitems = false; + comeback = true; + } else - mirrormode = cv_kartmirror.value; + { + if (G_BattleGametype()) + gamespeed = 0; + else + gamespeed = cv_kartspeed.value; - franticitems = cv_kartfrantic.value; - comeback = cv_kartcomeback.value; + if (G_BattleGametype()) + mirrormode = false; + else + mirrormode = cv_kartmirror.value; + + franticitems = cv_kartfrantic.value; + comeback = cv_kartcomeback.value; + } // clear special respawning que iquehead = iquetail = 0; From 4c995e7e47029b2bbe77088f59863631e8353200 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 30 May 2018 17:29:40 -0400 Subject: [PATCH 13/51] Changing from Relaxed Standard Turbo to the typical Easy Normal Hard Reception to the naming convention has been either "don't care" or "too hard to remember" --- src/command.c | 2 +- src/d_netcmd.c | 2 +- src/g_game.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/command.c b/src/command.c index 89d09b359..a1f0a46b3 100644 --- a/src/command.c +++ b/src/command.c @@ -67,7 +67,7 @@ CV_PossibleValue_t karthud_cons_t[] = { {0, "Off"}, {1, "Default"}, {2, "SNES"}, {3, "MK64"}, {0, NULL}}; CV_PossibleValue_t kartspeed_cons_t[] = { - {0, "Relaxed"}, {1, "Standard"}, {2, "Turbo"}, + {0, "Easy"}, {1, "Normal"}, {2, "Hard"}, {0, NULL}}; #define COM_BUF_SIZE 8192 // command buffer size diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 651e0cfb6..231ab8ce0 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -357,7 +357,7 @@ consvar_t cv_kartminimap = {"kartminimap", "4", CV_SAVE, kartminimap_cons_t, NUL consvar_t cv_kartcheck = {"kartcheck", "Yes", CV_SAVE, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartstarsfx_cons_t[] = {{0, "Music"}, {1, "SMK"}, {0, NULL}}; consvar_t cv_kartstarsfx = {"kartstarsfx", "SMK", CV_SAVE, kartstarsfx_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_kartspeed = {"kartspeed", "Standard", CV_NETVAR|CV_CALL|CV_NOINIT, kartspeed_cons_t, KartSpeed_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_kartspeed = {"kartspeed", "Normal", CV_NETVAR|CV_CALL|CV_NOINIT, kartspeed_cons_t, KartSpeed_OnChange, 0, NULL, NULL, 0, 0, NULL}; static CV_PossibleValue_t kartballoons_cons_t[] = {{1, "MIN"}, {12, "MAX"}, {0, NULL}}; consvar_t cv_kartballoons = {"kartballoons", "3", CV_NETVAR|CV_CHEAT, kartballoons_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_kartfrantic = {"kartfrantic", "Off", CV_NETVAR|CV_CHEAT|CV_CALL|CV_NOINIT, CV_OnOff, KartFrantic_OnChange, 0, NULL, NULL, 0, 0, NULL}; diff --git a/src/g_game.c b/src/g_game.c index 80671c51e..cdde5d500 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -242,7 +242,7 @@ INT32 cheats; //for multiplayer cheat commands // SRB2Kart // Cvars that we don't want changed mid-game -UINT8 gamespeed; // Game's current speed (or difficulty, or cc, or etc); 0-2 for relaxed, standard, & turbo +UINT8 gamespeed; // Game's current speed (or difficulty, or cc, or etc); 0 for easy, 1 for normal, 2 for hard boolean mirrormode; // Mirror Mode currently enabled? boolean franticitems; // Frantic items currently enabled? boolean comeback; // Battle Mode's karma comeback is on/off From 91354d86b2f531477e5f20b2a20c78d2ac36ffe1 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 30 May 2018 18:38:30 -0400 Subject: [PATCH 14/51] Fix Star/Mega music persisting after death for splitscreen players --- src/g_game.c | 9 ++------ src/k_kart.c | 2 +- src/p_user.c | 63 ++++++++++++++++++++++++++-------------------------- 3 files changed, 34 insertions(+), 40 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index cdde5d500..595126fe8 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2481,15 +2481,10 @@ void G_PlayerReborn(INT32 player) mapmusname[6] = 0; mapmusflags = mapheaderinfo[gamemap-1]->mustrack & MUSIC_TRACKMASK; } - //SRB2kart - leveltime stuff - if (leveltime > 157) - { - S_ChangeMusic(mapmusname, mapmusflags, true); - if (p->laps == (unsigned)(cv_numlaps.value - 1)) - S_SpeedMusic(1.2f); - } } + P_RestoreMusic(p); + if (leveltime > 157 && !p->spectator) p->kartstuff[k_lakitu] = 48; // Lakitu Spawner diff --git a/src/k_kart.c b/src/k_kart.c index 671492944..8ac1a7473 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1172,7 +1172,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Plays the music after the starting countdown. if (P_IsLocalPlayer(player) && leveltime == 158) - S_ChangeMusicInternal(mapmusname, true); + S_ChangeMusic(mapmusname, mapmusflags, true); } void K_KartPlayerAfterThink(player_t *player) diff --git a/src/p_user.c b/src/p_user.c index 1245ed173..13da9a0e8 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1164,41 +1164,21 @@ void P_RestoreMusic(player_t *player) if (!player->exiting) { // Item - Mega Mushroom - if (player->kartstuff[k_growshrinktimer] > 1) + if (player->kartstuff[k_growshrinktimer] > 1 && player->playerstate == PST_LIVE) S_ChangeMusicInternal("mega", true); - // Item - Star - else if (player->kartstuff[k_startimer] > 1) + else if (player->kartstuff[k_startimer] > 1 && player->playerstate == PST_LIVE) S_ChangeMusicInternal("minvnc", false); - - // Event - Final Lap - else if (player->laps == (UINT8)(cv_numlaps.value - 1)) + else if (leveltime > 157) { - S_SpeedMusic(1.2f); + // Event - Final Lap + if (player->laps == (UINT8)(cv_numlaps.value - 1)) + S_SpeedMusic(1.2f); S_ChangeMusic(mapmusname, mapmusflags, true); } else - S_ChangeMusic(mapmusname, mapmusflags, true); + S_StopMusic(); } - - /* SRB2kart - old stuff - if (player->powers[pw_super] && !(mapheaderinfo[gamemap-1]->levelflags & LF_NOSSMUSIC)) - S_ChangeMusicInternal("supers", true); - else if (player->powers[pw_invulnerability] > 1) - S_ChangeMusicInternal((mariomode) ? "minvnc" : "invinc", false); - else if (player->powers[pw_sneakers] > 1 && !player->powers[pw_super]) - { - if (mapheaderinfo[gamemap-1]->levelflags & LF_SPEEDMUSIC) - { - S_SpeedMusic(1.4f); - S_ChangeMusic(mapmusname, mapmusflags, true); - } - else - S_ChangeMusicInternal("shoes", true); - } - else - S_ChangeMusic(mapmusname, mapmusflags, true); - */ } // @@ -8152,12 +8132,31 @@ static void P_DeathThink(player_t *player) { if (player->deadtimer != gameovertics) ; - // Restore the other player's music once we're dead for long enough + // Restore the first available player's music once we're dead for long enough // -- that is, as long as they aren't dead too - else if (player == &players[displayplayer] && players[secondarydisplayplayer].lives > 0) - P_RestoreMusic(&players[secondarydisplayplayer]); - else if (player == &players[secondarydisplayplayer] && players[displayplayer].lives > 0) - P_RestoreMusic(&players[displayplayer]); + else + { + INT32 i; + + for (i = 0; i < 4; i++) + { + if (i > splitscreen) + break; + + if (i == 0 && player != &players[displayplayer] && players[displayplayer].lives > 0) + P_RestoreMusic(&players[displayplayer]); + else if (i == 1 && player != &players[secondarydisplayplayer] && players[secondarydisplayplayer].lives > 0) + P_RestoreMusic(&players[secondarydisplayplayer]); + else if (i == 2 && player != &players[thirddisplayplayer] && players[thirddisplayplayer].lives > 0) + P_RestoreMusic(&players[thirddisplayplayer]); + else if (i == 3 && player != &players[fourthdisplayplayer] && players[fourthdisplayplayer].lives > 0) + P_RestoreMusic(&players[fourthdisplayplayer]); + else + continue; + + break; + } + } } } From 80be093e46845b9d8104038aeeaeb55d9a74ae35 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 30 May 2018 22:53:06 -0400 Subject: [PATCH 15/51] A couple of RA-related things An unlockables/time emblems update, the stats screen shows all maps without needing to visit each one, and respawning is enabled in Record Attack now --- src/g_game.c | 4 +- src/m_cond.c | 145 ++++++++++++++++++++++++--------------------------- src/m_menu.c | 21 ++++++-- src/p_tick.c | 3 +- 4 files changed, 87 insertions(+), 86 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 595126fe8..f69ba8fd1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2862,11 +2862,11 @@ void G_DoReborn(INT32 playernum) player_t *player = &players[playernum]; boolean starpost = false; - if (modeattacking) + /*if (modeattacking) // Not needed for SRB2Kart. { M_EndModeAttackRun(); return; - } + }*/ // Make sure objectplace is OFF when you first start the level! OP_ResetObjectplace(); diff --git a/src/m_cond.c b/src/m_cond.c index f2b163ea7..78e331b69 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -32,95 +32,80 @@ conditionset_t conditionSets[MAXCONDITIONSETS]; // Default Emblem locations emblem_t emblemlocations[MAXEMBLEMS] = { - // -- MAP01: GREEN HILLS -- - // Time: 1:30.00 - {ET_TIME, 0,0,0, 1, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, - // -- MAP02: NORTHERN DISTRICT -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 2, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP03: SUNBEAM PARADISE -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 3, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP04: PIPE SPEEDWAY -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 4, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP05: DARKVILE GARDEN -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 5, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP06: MEGABLOCK CASTLE -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 6, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP07: MIDNIGHT MEADOW -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 7, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP11: HILL TOP -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 11, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP13: SAPPHIRE COAST -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 13, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP15: BLUE MOUNTAIN -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 15, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP19: CASINO RESORT -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 19, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP21: SILVERCLOUD ISLAND -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 21, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP25: CANYON RUSH -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 25, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP26: CLOUD CRADLE K -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 26, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP27: TOXIC PALACE -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 27, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP30: ANCIENT TOMB -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 30, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP31: SUB-ZERO PEAK -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 31, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP32: VIRTUAL HIGHWAY -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 32, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP33: EGGMAN'S NIGHTCLUB -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 37, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP61: GBA RAINBOW ROAD -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 61, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP70: SONIC SPEEDWAY -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 70, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP72: AURORA ATOLL -- - // Time: x:xx.xx - {ET_TIME, 0,0,0, 72, 'T', SKINCOLOR_GREY, 300*TICRATE, "", 0}, - // -- MAP79: BARREN BADLANDS -- - // Time: 2:30.00 - {ET_TIME, 0,0,0, 79, 'T', SKINCOLOR_GREY, 150*TICRATE, "", 0}, + // SILVER TIME TROPHIES + {ET_TIME, 0,0,0, 1, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // Green Hills Zone - Time: 1:30 + {ET_TIME, 0,0,0, 2, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Pipe Speedway Zone - Time: 1:50 + {ET_TIME, 0,0,0, 3, 'T', SKINCOLOR_GREY, 135*TICRATE, "", 0}, // Dark Race - 2:15 + {ET_TIME, 0,0,0, 4, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Darkvile Garden Zone - 1:45 + {ET_TIME, 0,0,0, 5, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Northern District Zone - 2:20 + {ET_TIME, 0,0,0, 6, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Sonic Speedway Zone - 2:00 + {ET_TIME, 0,0,0, 7, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Egg Zeppelin Zone - 2:00 + {ET_TIME, 0,0,0, 8, 'T', SKINCOLOR_GREY, 95*TICRATE, "", 0}, // Hill Top Zone - 1:35 + {ET_TIME, 0,0,0, 9, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Sunbeam Paradise Zone - 1:50 + {ET_TIME, 0,0,0, 10, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Diamond Square Zone - 1:50 + {ET_TIME, 0,0,0, 11, 'T', SKINCOLOR_GREY, 150*TICRATE, "", 0}, // Misty Maze Zone - 2:30 + {ET_TIME, 0,0,0, 12, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Midnight Meadow Zone - 2:00 + {ET_TIME, 0,0,0, 13, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Megablock Castle Zone - 2:10 + {ET_TIME, 0,0,0, 14, 'T', SKINCOLOR_GREY, 150*TICRATE, "", 0}, // Sub-Zero Peak Zone - 2:30 + {ET_TIME, 0,0,0, 15, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Sapphire Coast Zone - 1:50 + {ET_TIME, 0,0,0, 16, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Silvercloud Island Zone - 2:20 + {ET_TIME, 0,0,0, 17, 'T', SKINCOLOR_GREY, 135*TICRATE, "", 0}, // Petroleum Refinery Zone - 2:15 + {ET_TIME, 0,0,0, 18, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Canyon Rush Zone - 2:10 + {ET_TIME, 0,0,0, 19, 'T', SKINCOLOR_GREY, 160*TICRATE, "", 0}, // Blue Mountain Zone - 2:40 + {ET_TIME, 0,0,0, 20, 'T', SKINCOLOR_GREY, 165*TICRATE, "", 0}, // Casino Resort Zone - 2:45 + {ET_TIME, 0,0,0, 21, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Desert Palace Zone - 1:45 + {ET_TIME, 0,0,0, 22, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Red Barrage Area - 1:50 + {ET_TIME, 0,0,0, 23, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Vanilla Hotel Zone - 1:45 + {ET_TIME, 0,0,0, 24, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Twinkle Cart - 1:50 + {ET_TIME, 0,0,0, 25, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Pleasure Castle - 1:50 + {ET_TIME, 0,0,0, 26, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Aurora Atoll Zone - 2:20 + {ET_TIME, 0,0,0, 27, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Barren Badlands Zone - 2:10 + {ET_TIME, 0,0,0, 28, 'T', SKINCOLOR_GREY, 155*TICRATE, "", 0}, // Toxic Palace Zone - 2:35 + {ET_TIME, 0,0,0, 29, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Ancient Tomb Zone - 2:10 + {ET_TIME, 0,0,0, 30, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Cloud Cradle Zone K - 2:00 + {ET_TIME, 0,0,0, 31, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Kodachrome Void Zone - 1:50 + {ET_TIME, 0,0,0, 32, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Egg Quarters - 2:20 + {ET_TIME, 0,0,0, 33, 'T', SKINCOLOR_GREY, 115*TICRATE, "", 0}, // Boiling Bedrock Zone - 1:55 + {ET_TIME, 0,0,0, 34, 'T', SKINCOLOR_GREY, 140*TICRATE, "", 0}, // Virtual Highway Zone - 2:20 + {ET_TIME, 0,0,0, 35, 'T', SKINCOLOR_GREY, 120*TICRATE, "", 0}, // Eggman's Nightclub Zone - 2:00 + {ET_TIME, 0,0,0, 36, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // KKR Ganbare Dochu 2 - 1:30 + {ET_TIME, 0,0,0, 37, 'T', SKINCOLOR_GREY, 80*TICRATE, "", 0}, // CK Chao Circuit 1 - 1:20 + {ET_TIME, 0,0,0, 38, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // CK Chao Circuit 2 - 2:10 + {ET_TIME, 0,0,0, 39, 'T', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // CK Cloud Tops 2 - 1:40 + {ET_TIME, 0,0,0, 40, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // CK Regal Raceway - 2:10 + {ET_TIME, 0,0,0, 41, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // SM Dimension Heist - 2:10 + {ET_TIME, 0,0,0, 42, 'T', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // SRB2 Frozen Night - 1:40 + {ET_TIME, 0,0,0, 43, 'T', SKINCOLOR_GREY, 100*TICRATE, "", 0}, // MKSC Sky Garden - 1:40 + {ET_TIME, 0,0,0, 44, 'T', SKINCOLOR_GREY, 95*TICRATE, "", 0}, // MKDS Peach Gardens - 1:35 + {ET_TIME, 0,0,0, 45, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // MKSC Rainbow Road - 1:45 + {ET_TIME, 0,0,0, 46, 'T', SKINCOLOR_GREY, 70*TICRATE, "", 0}, // SMK Mario Circuit 1 - 1:10 + {ET_TIME, 0,0,0, 47, 'T', SKINCOLOR_GREY, 90*TICRATE, "", 0}, // SMK Donut Plains 1 - 1:30 + {ET_TIME, 0,0,0, 48, 'T', SKINCOLOR_GREY, 75*TICRATE, "", 0}, // SMK Ghost Valley 2 - 1:15 + {ET_TIME, 0,0,0, 49, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // SMK Mario Circuit 3 - 1:45 + {ET_TIME, 0,0,0, 50, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0} // SMK Rainbow Road - 2:10 + // GOLD DEV TIME TROPHIES + // ...none yet! }; // Default Extra Emblems extraemblem_t extraemblems[MAXEXTRAEMBLEMS] = { - {"Experienced Driver", "Play 50 Matches", 10, 'X', SKINCOLOR_BLUE, 0}, + {"Experienced Driver", "Play 100 Matches", 10, 'X', SKINCOLOR_BLUE, 0}, }; // Default Unlockables unlockable_t unlockables[MAXUNLOCKABLES] = { // Name, Objective, Menu Height, ConditionSet, Unlock Type, Variable, NoCecho, NoChecklist - /* 01 */ {"SNES Cup", "Collect 5 Emblems", 0, 1, SECRET_NONE, 0, false, false, 0}, - /* 02 */ {"Chaotic Kart Cup", "Collect 15 Emblems", 0, 2, SECRET_NONE, 0, false, false, 0}, + /* 01 */ {"Egg Cup", "", 0, 1, SECRET_NONE, 0, false, false, 0}, + /* 02 */ {"SMK Cup", "", 0, 2, SECRET_NONE, 0, false, false, 0}, + /* 03 */ {"Chao Cup", "", 0, 3, SECRET_NONE, 0, false, false, 0}, - /* 03 */ {"Record Attack", "", 0, -1, SECRET_RECORDATTACK, 0, true, true, 0}, + /* 04 */ {"Record Attack", "", 0, -1, SECRET_RECORDATTACK, 0, true, true, 0}, }; // Default number of emblems and extra emblems -INT32 numemblems = 23; +INT32 numemblems = 50; INT32 numextraemblems = 1; // DEFAULT CONDITION SETS FOR SRB2KART: @@ -132,12 +117,16 @@ void M_SetupDefaultConditionSets(void) M_AddRawCondition(1, 1, UC_TOTALEMBLEMS, 5, 0, 0); M_AddRawCondition(1, 2, UC_MATCHESPLAYED, 10, 0, 0); - // -- 2: Collect 15 emblems OR play 30 matches + // -- 2: Collect 15 emblems OR play 25 matches M_AddRawCondition(2, 1, UC_TOTALEMBLEMS, 15, 0, 0); - M_AddRawCondition(2, 2, UC_MATCHESPLAYED, 30, 0, 0); + M_AddRawCondition(2, 2, UC_MATCHESPLAYED, 25, 0, 0); - // -- 10: Play 50 matches - M_AddRawCondition(10, 1, UC_TOTALEMBLEMS, 50, 0, 0); + // -- 3: Collect 30 emblems OR play 50 matches + M_AddRawCondition(3, 1, UC_TOTALEMBLEMS, 30, 0, 0); + M_AddRawCondition(3, 2, UC_MATCHESPLAYED, 50, 0, 0); + + // -- 10: Play 100 matches + M_AddRawCondition(10, 1, UC_MATCHESPLAYED, 100, 0, 0); } void M_AddRawCondition(UINT8 set, UINT8 id, conditiontype_t c, INT32 r, INT16 x1, INT16 x2) diff --git a/src/m_menu.c b/src/m_menu.c index 632c0dcaf..c45e9aa53 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -5308,10 +5308,11 @@ static void M_Statistics(INT32 choice) if (!mapheaderinfo[i] || mapheaderinfo[i]->lvlttl[0] == '\0') continue; - if (!(mapheaderinfo[i]->typeoflevel & TOL_SP) || (mapheaderinfo[i]->menuflags & LF2_HIDEINSTATS)) + if (!(mapheaderinfo[i]->typeoflevel & TOL_RACE) // TOL_SP + || (mapheaderinfo[i]->menuflags & LF2_HIDEINSTATS)) continue; - if (!mapvisited[i]) + if (M_MapLocked(i+1)) // !mapvisited[i] continue; statsMapList[j++] = i; @@ -5346,10 +5347,20 @@ static void M_DrawStatsMaps(int location) mnum = statsMapList[i]; M_DrawMapEmblems(mnum+1, 292, y); - if (mapheaderinfo[mnum]->actnum != 0) - V_DrawString(20, y, V_YELLOWMAP, va("%s %d", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->actnum)); + if (mapheaderinfo[mnum]->zonttl) + { + if (mapheaderinfo[mnum]->actnum != 0) + V_DrawString(20, y, V_YELLOWMAP, va("%s %s %d", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->zonttl, mapheaderinfo[mnum]->actnum)); + else + V_DrawString(20, y, V_YELLOWMAP, va("%s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->zonttl)); + } else - V_DrawString(20, y, V_YELLOWMAP, mapheaderinfo[mnum]->lvlttl); + { + if (mapheaderinfo[mnum]->actnum != 0) + V_DrawString(20, y, V_YELLOWMAP, va("%s %d", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->actnum)); + else + V_DrawString(20, y, V_YELLOWMAP, mapheaderinfo[mnum]->lvlttl); + } y += 8; diff --git a/src/p_tick.c b/src/p_tick.c index 658e53253..1b1eea12e 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -608,7 +608,8 @@ void P_Ticker(boolean run) } // Keep track of how long they've been playing! - totalplaytime++; + if (!demoplayback) + totalplaytime++; if (!useNightsSS && G_IsSpecialStage(gamemap)) P_DoSpecialStageStuff(); From aff74fa2344bf4186d87c251d37fa5c08d5a0508 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 31 May 2018 01:06:48 -0400 Subject: [PATCH 16/51] nice nice --- src/g_input.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/g_input.c b/src/g_input.c index df0ee776a..2822cc294 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1197,6 +1197,7 @@ static const char *gamecontrolname[num_gamecontrols] = "brake", "fire", "lookback", + "camreset", "camtoggle", "spectate", "lookup", From a3fe415d8ad5d485676bff08eebcabfc4c760d72 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 31 May 2018 15:39:00 -0400 Subject: [PATCH 17/51] Thaaaat was stupid of me --- src/g_game.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index f69ba8fd1..9d72ee4f2 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3658,6 +3658,7 @@ void G_LoadGameData(void) // Saves the main data file, which stores information such as emblems found, etc. void G_SaveGameData(boolean force) { + const boolean wasmodified = modifiedgame; size_t length; INT32 i, j; UINT8 btemp; @@ -3674,8 +3675,9 @@ void G_SaveGameData(boolean force) return; } - if (modifiedgame && !savemoddata - && !force) // SRB2Kart: for enabling unlocks online in modified servers + if (force) // SRB2Kart: for enabling unlocks online, even if the game is modified + modifiedgame = savemoddata; // L-let's just sort of... hack around the cheat protection, because I'm too worried about just removing it @@; + else if (modifiedgame && !savemoddata) { free(savebuffer); save_p = savebuffer = NULL; @@ -3774,6 +3776,9 @@ void G_SaveGameData(boolean force) FIL_WriteFile(va(pandf, srb2home, gamedatafilename), savebuffer, length); free(savebuffer); save_p = savebuffer = NULL; + + if (force) // Eeeek, I'm sorry for my sins! + modifiedgame = wasmodified; } #define VERSIONSIZE 16 From 71572b94d1b7969a89abd58ab43428aaa59f33a5 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 31 May 2018 18:49:19 -0400 Subject: [PATCH 18/51] Splitscreen-friendly voting screen --- src/d_netcmd.c | 11 ++- src/d_netcmd.h | 2 +- src/y_inter.c | 195 ++++++++++++++++++++++++++++++++++--------------- 3 files changed, 144 insertions(+), 64 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 231ab8ce0..dd7981f3a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -1977,13 +1977,18 @@ void D_SetupVote(void) SendNetXCmd(XD_SETUPVOTE, buf, p - buf); } -void D_ModifyClientVote(SINT8 voted) +void D_ModifyClientVote(SINT8 voted, UINT8 splitplayer) { char buf[1]; char *p = buf; - WRITESINT8(p, voted); - SendNetXCmd(XD_MODIFYVOTE, &buf, 1); + if (splitplayer > 0) // Don't actually send anything for splitscreen + votes[splitplayer] = voted; + else + { + WRITESINT8(p, voted); + SendNetXCmd(XD_MODIFYVOTE, &buf, 1); + } } void D_PickVote(void) diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 53132d744..f7b978bd1 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -252,7 +252,7 @@ void Command_Retry_f(void); void D_GameTypeChanged(INT32 lastgametype); // not a real _OnChange function anymore void D_MapChange(INT32 pmapnum, INT32 pgametype, boolean pultmode, boolean presetplayers, INT32 pdelay, boolean pskipprecutscene, boolean pfromlevelselect); void D_SetupVote(void); -void D_ModifyClientVote(SINT8 voted); +void D_ModifyClientVote(SINT8 voted, UINT8 splitplayer); void D_PickVote(void); void ObjectPlace_OnChange(void); boolean IsPlayerAdmin(INT32 playernum); diff --git a/src/y_inter.c b/src/y_inter.c index d6f2aa309..f18edafd4 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -168,17 +168,23 @@ static void Y_FollowIntermission(void); static void Y_UnloadData(void); // SRB2Kart: voting stuff - +// Level images typedef struct { char str[40]; patch_t *pic; } y_votelvlinfo; +// Clientside & splitscreen player info. typedef struct { SINT8 selection; UINT8 delay; +} y_voteplayer; + +typedef struct +{ + y_voteplayer playerinfo[4]; UINT8 ranim; UINT8 rtics; UINT8 roffset; @@ -2129,7 +2135,8 @@ static void Y_UnloadData(void) // void Y_VoteDrawer(void) { - INT32 i, x, y = 0; + INT32 i, x, y = 0, height = 0; + UINT8 selected[4]; if (rendermode == render_none) return; @@ -2148,11 +2155,34 @@ void Y_VoteDrawer(void) (vid.height / vid.dupy) - SHORT(bgpatch->height), V_SNAPTOTOP|V_SNAPTOLEFT, bgpatch); - y = 30; + for (i = 0; i < 4; i++) // First, we need to figure out the height of this thing... + { + UINT8 j; + selected[i] = 0; // Initialize + + for (j = 0; j <= splitscreen; j++) + { + if (voteclient.playerinfo[j].selection == i) + selected[i]++; + } + + if (selected[i]) + height += 50; + else + height += 25; + + if (i < 3) + height += 5-splitscreen; + } + + y = (200-height)/2; for (i = 0; i < 4; i++) { char str[40]; patch_t *pic; + UINT8 sizeadd = selected[i]; + UINT8 j; + UINT8 color; if (i == 3) { @@ -2166,25 +2196,52 @@ void Y_VoteDrawer(void) pic = levelinfo[i].pic; } - if (i == voteclient.selection) + if (selected[i]) { - if (votes[consoleplayer] == -1) + for (j = 0; j <= splitscreen; j++) // another loop for drawing the selection backgrounds in the right order, grumble grumble.. { - V_DrawScaledPatch(BASEVIDWIDTH-124, y+21, V_SNAPTORIGHT, cursor); - if (votetic % 4 > 1) - V_DrawFill(BASEVIDWIDTH-101, y-1, 82, 52, 120|V_SNAPTORIGHT); + INT32 handy = y; + + if (voteclient.playerinfo[j].selection != i) + continue; + + switch (j) + { + case 1: + color = 215; + break; + case 2: + color = 127; + break; + case 3: + color = 161; + break; + default: + color = 103; + break; + } + + handy += 6*(3-splitscreen) + (13*j); + V_DrawScaledPatch(BASEVIDWIDTH-124, handy, V_SNAPTORIGHT, cursor); + + if (votetic % 5 == 0) + V_DrawFill(BASEVIDWIDTH-100-sizeadd, y-sizeadd, 80+(sizeadd*2), 50+(sizeadd*2), 120|V_SNAPTORIGHT); else - V_DrawFill(BASEVIDWIDTH-101, y-1, 82, 52, 103|V_SNAPTORIGHT); + V_DrawFill(BASEVIDWIDTH-100-sizeadd, y-sizeadd, 80+(sizeadd*2), 50+(sizeadd*2), color|V_SNAPTORIGHT); + sizeadd--; } + V_DrawSmallScaledPatch(BASEVIDWIDTH-100, y, V_SNAPTORIGHT, pic); V_DrawRightAlignedThinString(BASEVIDWIDTH-20, 40+y, V_SNAPTORIGHT, str); - y += 55; + y += 50; } else { V_DrawTinyScaledPatch(BASEVIDWIDTH-60, y, V_SNAPTORIGHT, pic); - y += 30; + y += 25; } + + y += 5-splitscreen; } x = 20; @@ -2224,9 +2281,6 @@ void Y_VoteDrawer(void) } } - if (splitscreen) // only 1p has a vote in splitscreen - break; - y += 30; if (y > BASEVIDHEIGHT-40) @@ -2248,7 +2302,6 @@ void Y_VoteDrawer(void) // void Y_VoteTicker(void) { - boolean pressed = false; INT32 i; if (paused || P_AutoPause()) @@ -2267,7 +2320,7 @@ void Y_VoteTicker(void) { if (!playeringame[i] || players[i].spectator) votes[i] = -1; // Spectators are the lower class, and have effectively no voice in the government. Democracy sucks. - else if (pickedvote != -1 && votes[i] == -1 && !splitscreen) + else if (pickedvote != -1 && votes[i] == -1) votes[i] = 3; // Slow people get random } @@ -2280,9 +2333,6 @@ void Y_VoteTicker(void) if (timer) timer--; - if (voteclient.delay) - voteclient.delay--; - if (pickedvote != -1) { timer = 0; @@ -2325,7 +2375,7 @@ void Y_VoteTicker(void) if (voteclient.rendoff == 0) { if (tempvotes[((pickedvote + voteclient.roffset + 4) % numvotes)] == pickedvote - && voteclient.rsynctime % 50 == 0) // Song is 1.45 seconds long (sorry @ whoever wants to replace it in a music wad :V) + && voteclient.rsynctime % 51 == 0) // Song is 1.45 seconds long (sorry @ whoever wants to replace it in a music wad :V) { voteclient.rendoff = voteclient.roffset+4; S_ChangeMusicInternal("voteeb", false); @@ -2346,34 +2396,63 @@ void Y_VoteTicker(void) if (votetic < 3*(NEWTICRATE/7)) // give it some time before letting you control it :V return; - if ((playeringame[consoleplayer] && !players[consoleplayer].spectator) - && !voteclient.delay && pickedvote == -1 && votes[consoleplayer] == -1) + for (i = 0; i <= splitscreen; i++) { - if (InputDown(gc_aimforward, 1) || JoyAxis(AXISMOVE, 1) < 0) - { - voteclient.selection--; - pressed = true; - } - if ((InputDown(gc_aimbackward, 1) || JoyAxis(AXISMOVE, 1) > 0) && !pressed) - { - voteclient.selection++; - pressed = true; - } - if (voteclient.selection < 0) - voteclient.selection = 3; - if (voteclient.selection > 3) - voteclient.selection = 0; - if (InputDown(gc_accelerate, 1) && !pressed) - { - D_ModifyClientVote(voteclient.selection); - pressed = true; - } - } + UINT8 p; + boolean pressed = false; - if (pressed) - { - S_StartSound(NULL, sfx_kc4a); - voteclient.delay = NEWTICRATE/7; + switch (i) + { + case 1: + p = secondarydisplayplayer; + break; + case 2: + p = thirddisplayplayer; + break; + case 3: + p = fourthdisplayplayer; + break; + default: + p = consoleplayer; + break; + } + + if (voteclient.playerinfo[i].delay) + voteclient.playerinfo[i].delay--; + + if ((playeringame[p] && !players[p].spectator) + && !voteclient.playerinfo[i].delay + && pickedvote == -1 && votes[p] == -1) + { + if (InputDown(gc_aimforward, i+1) || JoyAxis(AXISAIM, i+1) < 0) + { + voteclient.playerinfo[i].selection--; + pressed = true; + } + + if ((InputDown(gc_aimbackward, i+1) || JoyAxis(AXISAIM, i+1) > 0) && !pressed) + { + voteclient.playerinfo[i].selection++; + pressed = true; + } + + if (voteclient.playerinfo[i].selection < 0) + voteclient.playerinfo[i].selection = 3; + if (voteclient.playerinfo[i].selection > 3) + voteclient.playerinfo[i].selection = 0; + + if ((InputDown(gc_accelerate, i+1) || JoyAxis(AXISMOVE, i+1) > 0) && !pressed) + { + D_ModifyClientVote(voteclient.playerinfo[i].selection, i); + pressed = true; + } + } + + if (pressed) + { + S_StartSound(NULL, sfx_kc4a); + voteclient.playerinfo[i].delay = NEWTICRATE/7; + } } if (server) @@ -2382,25 +2461,17 @@ void Y_VoteTicker(void) { for (i = 0; i < MAXPLAYERS; i++) { - if ((playeringame[i] && !players[i].spectator) && votes[i] == -1 && !splitscreen) + if ((playeringame[i] && !players[i].spectator) && votes[i] == -1) votes[i] = 3; } } else { - if (splitscreen) + for (i = 0; i < MAXPLAYERS; i++) { - if (votes[0] == -1) + if ((playeringame[i] && !players[i].spectator) && votes[i] == -1) return; } - else - { - for (i = 0; i < MAXPLAYERS; i++) - { - if ((playeringame[i] && !players[i].spectator) && votes[i] == -1) - return; - } - } } timer = 0; @@ -2434,8 +2505,12 @@ void Y_StartVote(void) timer = cv_votetime.value*TICRATE; pickedvote = -1; - voteclient.selection = 0; - voteclient.delay = 0; + for (i = 0; i < 3; i++) + { + voteclient.playerinfo[i].selection = 0; + voteclient.playerinfo[i].delay = 0; + } + voteclient.ranim = 0; voteclient.rtics = 1; voteclient.roffset = 0; @@ -2538,7 +2613,7 @@ void Y_SetupVoteFinish(SINT8 pick, SINT8 level) for (i = 0; i < MAXPLAYERS; i++) { - if ((playeringame[i] && !players[i].spectator) && votes[i] == -1 && !splitscreen) + if ((playeringame[i] && !players[i].spectator) && votes[i] == -1) votes[i] = 3; if (votes[i] == -1 || endtype > 1) // Don't need to go on From e4d380d2ad91b9ff602c8bd61885fce1c2c299bb Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 31 May 2018 19:21:26 -0400 Subject: [PATCH 19/51] I continue to be a buffoon. --- src/g_game.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 9d72ee4f2..269d25f19 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -3204,9 +3204,12 @@ INT16 G_RandMap(INT16 tolflags, INT16 pprevmap, boolean dontadd, boolean ignoreb else { ix = okmaps[M_RandomKey(numokmaps)]; - for (bufx = NUMMAPS; bufx > 0; bufx--) - randmapbuffer[bufx] = randmapbuffer[bufx-1]; - randmapbuffer[0] = ix; + if (!dontadd) + { + for (bufx = NUMMAPS; bufx > 0; bufx--) + randmapbuffer[bufx] = randmapbuffer[bufx-1]; + randmapbuffer[0] = ix; + } } Z_Free(okmaps); From abf1ae5a24db4269b6a5ddf976f33721ffb2fa80 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Fri, 1 Jun 2018 02:19:40 -0400 Subject: [PATCH 20/51] Messing with item distributions a tad --- src/k_kart.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8ac1a7473..94122d95a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -368,10 +368,10 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][9] = /*Magnet*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet /*Boo*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo /*Mushroom*/ { 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom - /*Triple Mushroom*/ { 0, 0, 0, 0, 3,10, 6, 4, 0 }, // Triple Mushroom - /*Mega Mushroom*/ { 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // Mega Mushroom - /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0, 4, 6, 8 }, // Gold Mushroom - /*Star*/ { 0, 0, 0, 0, 0, 1, 6, 8,12 }, // Star + /*Triple Mushroom*/ { 0, 0, 0, 0, 3, 8, 6, 4, 0 }, // Triple Mushroom + /*Mega Mushroom*/ { 0, 0, 0, 0, 0, 1, 1, 1, 2 }, // Mega Mushroom + /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 2, 4, 3, 0 }, // Gold Mushroom + /*Star*/ { 0, 0, 0, 0, 0, 1, 6, 8,18 }, // Star /*Triple Banana*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana /*Fake Item*/ { 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item @@ -392,26 +392,26 @@ static INT32 K_KartItemOddsBalloons[NUMKARTITEMS][5] = { //P-Odds 0 1 2 3 4 /*Magnet*/ { 0, 0, 0, 0, 0 }, // Magnet - /*Boo*/ { 0, 1, 3, 2, 0 }, // Boo - /*Mushroom*/ { 1, 2, 5, 1, 0 }, // Mushroom + /*Boo*/ { 0, 0, 1, 1, 0 }, // Boo + /*Mushroom*/ { 0, 1, 3, 1, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0 }, // Triple Mushroom - /*Mega Mushroom*/ { 1, 1, 0, 0, 0 }, // Mega Mushroom + /*Mega Mushroom*/ { 1, 2, 0, 0, 0 }, // Mega Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0 }, // Gold Mushroom - /*Star*/ { 1, 1, 0, 0, 0 }, // Star + /*Star*/ { 1, 2, 0, 0, 0 }, // Star - /*Triple Banana*/ { 0, 3, 1, 1, 0 }, // Triple Banana - /*Fake Item*/ { 0, 0, 2, 2, 1 }, // Fake Item + /*Triple Banana*/ { 0, 1, 1, 0, 0 }, // Triple Banana + /*Fake Item*/ { 0, 0, 2, 1, 1 }, // Fake Item /*Banana*/ { 0, 0, 3, 1, 1 }, // Banana - /*Green Shell*/ { 0, 0, 5, 3, 1 }, // Green Shell - /*Red Shell*/ { 0, 3, 3, 1, 0 }, // Red Shell - /*Triple Green Shell*/ { 0, 3, 3, 1, 0 }, // Triple Green Shell + /*Green Shell*/ { 0, 0, 5, 3, 2 }, // Green Shell + /*Red Shell*/ { 0, 3, 3, 0, 0 }, // Red Shell + /*Triple Green Shell*/ { 0, 1, 1, 0, 0 }, // Triple Green Shell /*Bob-omb*/ { 0, 3, 3, 0, 0 }, // Bob-omb /*Blue Shell*/ { 0, 0, 0, 0, 0 }, // Blue Shell /*Fire Flower*/ { 0, 3, 3, 0, 0 }, // Fire Flower - /*Triple Red Shell*/ { 1, 1, 0, 0, 0 }, // Triple Red Shell + /*Triple Red Shell*/ { 1, 2, 0, 0, 0 }, // Triple Red Shell /*Lightning*/ { 0, 0, 0, 0, 0 }, // Lightning - /*Feather*/ { 0, 0, 3, 2, 1 } // Feather + /*Feather*/ { 0, 0, 1, 1, 0 } // Feather }; /** \brief Item Roulette for Kart From c5b95659b28640fcf7ab3418233953277929a3ae Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 2 Jun 2018 10:29:43 -0400 Subject: [PATCH 21/51] Changed time requirements to accomedate lap changes --- src/k_kart.c | 2 +- src/m_cond.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 94122d95a..930f40afc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -393,7 +393,7 @@ static INT32 K_KartItemOddsBalloons[NUMKARTITEMS][5] = //P-Odds 0 1 2 3 4 /*Magnet*/ { 0, 0, 0, 0, 0 }, // Magnet /*Boo*/ { 0, 0, 1, 1, 0 }, // Boo - /*Mushroom*/ { 0, 1, 3, 1, 0 }, // Mushroom + /*Mushroom*/ { 0, 1, 2, 1, 0 }, // Mushroom /*Triple Mushroom*/ { 0, 0, 0, 0, 0 }, // Triple Mushroom /*Mega Mushroom*/ { 1, 2, 0, 0, 0 }, // Mega Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0 }, // Gold Mushroom diff --git a/src/m_cond.c b/src/m_cond.c index 78e331b69..7d07d00ad 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -52,9 +52,9 @@ emblem_t emblemlocations[MAXEMBLEMS] = {ET_TIME, 0,0,0, 17, 'T', SKINCOLOR_GREY, 135*TICRATE, "", 0}, // Petroleum Refinery Zone - 2:15 {ET_TIME, 0,0,0, 18, 'T', SKINCOLOR_GREY, 130*TICRATE, "", 0}, // Canyon Rush Zone - 2:10 {ET_TIME, 0,0,0, 19, 'T', SKINCOLOR_GREY, 160*TICRATE, "", 0}, // Blue Mountain Zone - 2:40 - {ET_TIME, 0,0,0, 20, 'T', SKINCOLOR_GREY, 165*TICRATE, "", 0}, // Casino Resort Zone - 2:45 + {ET_TIME, 0,0,0, 20, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Casino Resort Zone - 1:50 {ET_TIME, 0,0,0, 21, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Desert Palace Zone - 1:45 - {ET_TIME, 0,0,0, 22, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Red Barrage Area - 1:50 + {ET_TIME, 0,0,0, 22, 'T', SKINCOLOR_GREY, 165*TICRATE, "", 0}, // Red Barrage Area - 2:45 {ET_TIME, 0,0,0, 23, 'T', SKINCOLOR_GREY, 105*TICRATE, "", 0}, // Vanilla Hotel Zone - 1:45 {ET_TIME, 0,0,0, 24, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Twinkle Cart - 1:50 {ET_TIME, 0,0,0, 25, 'T', SKINCOLOR_GREY, 110*TICRATE, "", 0}, // Pleasure Castle - 1:50 From d5d1073a791d67e5eaa3a3eeb6d62b08592f67f7 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 2 Jun 2018 10:57:43 -0400 Subject: [PATCH 22/51] Fix Battle scoring, hopefully --- src/k_kart.c | 12 ++++++------ src/p_user.c | 4 ++++ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 930f40afc..92baa5a2d 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1390,8 +1390,8 @@ void K_SpinPlayer(player_t *player, mobj_t *source) if (G_BattleGametype()) { - /*if (source && source->player && player != source->player) - P_AddPlayerScore(source->player, 1);*/ + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); if (player->kartstuff[k_balloon] > 0) { @@ -1448,8 +1448,8 @@ void K_SquishPlayer(player_t *player, mobj_t *source) if (G_BattleGametype()) { - /*if (source && source->player && player != source->player) - P_AddPlayerScore(source->player, 1);*/ + if (source && source->player && player != source->player) + P_AddPlayerScore(source->player, 1); if (player->kartstuff[k_balloon] > 0) { @@ -1505,7 +1505,7 @@ void K_ExplodePlayer(player_t *player, mobj_t *source) // A bit of a hack, we ju if (source->player->kartstuff[k_comebackpoints] >= 3) K_StealBalloon(source->player, player, true); } - //P_AddPlayerScore(source->player, 1); + P_AddPlayerScore(source->player, 1); } if (player->kartstuff[k_balloon] > 0) @@ -3437,7 +3437,7 @@ void K_CheckBalloons(void) if (playeringame[winnernum]) { - P_AddPlayerScore(&players[winnernum], 1); + players[winnernum].score += 1; CONS_Printf(M_GetText("%s recieved a point for winning!\n"), player_names[winnernum]); } diff --git a/src/p_user.c b/src/p_user.c index 13da9a0e8..e4af0d62b 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1041,6 +1041,10 @@ void P_AddPlayerScore(player_t *player, UINT32 amount) { UINT32 oldscore; +#if 1 + return; // Nope, still don't need this for Battle even +#endif + if (player->bot) player = &players[consoleplayer]; From c9907bfa756427adfded904fed6cda542a389a30 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 3 Jun 2018 16:13:26 -0400 Subject: [PATCH 23/51] Support ALL of the classic games' sounds Sonic 1, 2, 3D Blast, & CD, on top of the existing S3K and Chaotix. --- src/sounds.c | 371 +++++++++++++++++++++++++++++++++++++++++---------- src/sounds.h | 371 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 602 insertions(+), 140 deletions(-) diff --git a/src/sounds.c b/src/sounds.c index 6a20d65a5..94fdef2c4 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -264,6 +264,139 @@ sfxinfo_t S_sfx[NUMSFX] = {"brakrl", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR}, {"brakrx", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR}, + // Sonic 1 sounds + {"s1a0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1a9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1aa", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ab", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ac", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ad", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ae", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1af", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1b9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ba", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1bb", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1bc", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1bd", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1be", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1bf", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1c9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ca", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1cb", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1cc", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1cd", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1ce", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s1cf", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + + // Sonic 2 sounds + {"s220", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s221", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s222", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s223", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s224", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s225", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s226", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s227", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s228", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s229", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s22f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s230", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s231", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s232", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s233", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s234", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s235", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s236", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s237", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s238", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s239", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s23f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s240", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s241", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s242", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s243", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s244", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s245", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s246", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s247", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s248", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s249", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s250", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s251", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s252", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s253", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // 1st place finish + {"s254", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s255", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s256", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s257", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s258", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s259", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s25f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s260", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s261", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s262", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s263", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s264", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s265", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s266", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s267", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s268", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s269", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s270", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + // S3&K sounds {"s3k33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, @@ -466,6 +599,174 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3kdbs", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3kdbl", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + // 3D Blast sounds (the "missing" ones are direct copies of S3K's, no minor differences what-so-ever) + {"3db06", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"3db09", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"3db14", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"3db16", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + + // Sonic CD sounds + {"cdfm00", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm01", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm02", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm03", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm04", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm05", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm06", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm07", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm08", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm09", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm10", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm11", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm12", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm13", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm14", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm15", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm16", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm17", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm18", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm19", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm20", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm21", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm22", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm23", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm24", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm25", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm26", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm27", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm28", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm29", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm30", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm31", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm32", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm35", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm36", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm37", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm38", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm39", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm44", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm45", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm48", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm50", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm51", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm52", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm53", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm54", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm55", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm56", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm57", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm58", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm59", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm62", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm63", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm64", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm65", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm66", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm67", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm68", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm69", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm70", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm71", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm72", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm73", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm74", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm75", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm76", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm77", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm78", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdfm79", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"cdpcm9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + + // Knuckles Chaotix sounds + {"kc2a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc2f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Pogo Spring + {"kc30", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc31", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc32", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc35", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc36", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc37", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc38", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc39", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Voting roulette + {"kc3a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc3f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Unlock everything cheat + {"kc43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc44", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc45", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc48", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Vote picked + {"kc49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Voting beep + {"kc4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc4f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc50", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc51", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc52", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc53", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc54", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc55", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc56", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc57", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc58", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc59", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Shrink + {"kc5a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Grow + {"kc5b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc5c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc5d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc5e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc5f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc62", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc63", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc64", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc65", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc66", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc67", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc68", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc69", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc6b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc6c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc6d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"kc6e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + // SRB2kart {"lkt1", true, 192, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"lkt2", true, 192, 0, -1, NULL, 0, -1, -1, LUMPERROR}, @@ -505,76 +806,6 @@ sfxinfo_t S_sfx[NUMSFX] = {"boing", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"smkinv", false, 140, 16, -1, NULL, 0, -1, -1, LUMPERROR}, - // Knuckles Chaotix sounds - {"kc2a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc2f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Pogo Spring - {"kc30", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc31", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc32", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc35", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc36", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc37", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc38", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc39", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc3f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc40", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc41", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc42", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc43", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc44", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc45", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc48", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc4f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc50", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc51", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc52", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc53", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc54", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc55", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc56", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc57", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc58", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc59", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Shrink - {"kc5a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Grow - {"kc5b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc5c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc5d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc5e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc5f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc60", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc61", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc62", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc63", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc64", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc65", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc66", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc67", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc68", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc69", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc6b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc6c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc6d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"kc6e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - // SRB2kart - Skin sounds {"kwin", false, 64, 0, -1, NULL, 0, SKSWIN, -1, LUMPERROR}, {"klose", false, 64, 0, -1, NULL, 0, SKSLOSE, -1, LUMPERROR}, diff --git a/src/sounds.h b/src/sounds.h index 2a004e4c6..28a288da2 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -336,6 +336,139 @@ typedef enum sfx_brakrl, // Rocket launcher sfx_brakrx, // Rocket explodes + // S1 sounds + sfx_s1a0, + sfx_s1a1, + sfx_s1a2, + sfx_s1a3, + sfx_s1a4, + sfx_s1a5, + sfx_s1a6, + sfx_s1a7, + sfx_s1a8, + sfx_s1a9, + sfx_s1aa, + sfx_s1ab, + sfx_s1ac, + sfx_s1ad, + sfx_s1ae, + sfx_s1af, + sfx_s1b0, + sfx_s1b1, + sfx_s1b2, + sfx_s1b3, + sfx_s1b4, + sfx_s1b5, + sfx_s1b6, + sfx_s1b7, + sfx_s1b8, + sfx_s1b9, + sfx_s1ba, + sfx_s1bb, + sfx_s1bc, + sfx_s1bd, + sfx_s1be, + sfx_s1bf, + sfx_s1c0, + sfx_s1c1, + sfx_s1c2, + sfx_s1c3, + sfx_s1c4, + sfx_s1c5, + sfx_s1c6, + sfx_s1c7, + sfx_s1c8, + sfx_s1c9, + sfx_s1ca, + sfx_s1cb, + sfx_s1cc, + sfx_s1cd, + sfx_s1ce, + sfx_s1cf, + + // S2 sounds + sfx_s220, + sfx_s221, + sfx_s222, + sfx_s223, + sfx_s224, + sfx_s225, + sfx_s226, + sfx_s227, + sfx_s228, + sfx_s229, + sfx_s22a, + sfx_s22b, + sfx_s22c, + sfx_s22d, + sfx_s22e, + sfx_s22f, + sfx_s230, + sfx_s231, + sfx_s232, + sfx_s233, + sfx_s234, + sfx_s235, + sfx_s236, + sfx_s237, + sfx_s238, + sfx_s239, + sfx_s23a, + sfx_s23b, + sfx_s23c, + sfx_s23d, + sfx_s23e, + sfx_s23f, + sfx_s240, + sfx_s241, + sfx_s242, + sfx_s243, + sfx_s244, + sfx_s245, + sfx_s246, + sfx_s247, + sfx_s248, + sfx_s249, + sfx_s24a, + sfx_s24b, + sfx_s24c, + sfx_s24d, + sfx_s24e, + sfx_s24f, + sfx_s250, + sfx_s251, + sfx_s252, + sfx_s253, + sfx_s254, + sfx_s255, + sfx_s256, + sfx_s257, + sfx_s258, + sfx_s259, + sfx_s25a, + sfx_s25b, + sfx_s25c, + sfx_s25d, + sfx_s25e, + sfx_s25f, + sfx_s260, + sfx_s261, + sfx_s262, + sfx_s263, + sfx_s264, + sfx_s265, + sfx_s266, + sfx_s267, + sfx_s268, + sfx_s269, + sfx_s26a, + sfx_s26b, + sfx_s26c, + sfx_s26d, + sfx_s26e, + sfx_s26f, + sfx_s270, + // S3&K sounds sfx_s3k33, sfx_s3k34, @@ -538,6 +671,174 @@ typedef enum sfx_s3kdbs, sfx_s3kdbl, + // 3DB sounds + sfx_3db06, + sfx_3db09, + sfx_3db14, + sfx_3db16, + + // SCD sounds + sfx_cdfm00, + sfx_cdfm01, + sfx_cdfm02, + sfx_cdfm03, + sfx_cdfm04, + sfx_cdfm05, + sfx_cdfm06, + sfx_cdfm07, + sfx_cdfm08, + sfx_cdfm09, + sfx_cdfm10, + sfx_cdfm11, + sfx_cdfm12, + sfx_cdfm13, + sfx_cdfm14, + sfx_cdfm15, + sfx_cdfm16, + sfx_cdfm17, + sfx_cdfm18, + sfx_cdfm19, + sfx_cdfm20, + sfx_cdfm21, + sfx_cdfm22, + sfx_cdfm23, + sfx_cdfm24, + sfx_cdfm25, + sfx_cdfm26, + sfx_cdfm27, + sfx_cdfm28, + sfx_cdfm29, + sfx_cdfm30, + sfx_cdfm31, + sfx_cdfm32, + sfx_cdfm33, + sfx_cdfm34, + sfx_cdfm35, + sfx_cdfm36, + sfx_cdfm37, + sfx_cdfm38, + sfx_cdfm39, + sfx_cdfm40, + sfx_cdfm41, + sfx_cdfm42, + sfx_cdfm43, + sfx_cdfm44, + sfx_cdfm45, + sfx_cdfm46, + sfx_cdfm47, + sfx_cdfm48, + sfx_cdfm49, + sfx_cdfm50, + sfx_cdfm51, + sfx_cdfm52, + sfx_cdfm53, + sfx_cdfm54, + sfx_cdfm55, + sfx_cdfm56, + sfx_cdfm57, + sfx_cdfm58, + sfx_cdfm59, + sfx_cdfm60, + sfx_cdfm61, + sfx_cdfm62, + sfx_cdfm63, + sfx_cdfm64, + sfx_cdfm65, + sfx_cdfm66, + sfx_cdfm67, + sfx_cdfm68, + sfx_cdfm69, + sfx_cdfm70, + sfx_cdfm71, + sfx_cdfm72, + sfx_cdfm73, + sfx_cdfm74, + sfx_cdfm75, + sfx_cdfm76, + sfx_cdfm77, + sfx_cdfm78, + sfx_cdfm79, + sfx_cdpcm0, + sfx_cdpcm1, + sfx_cdpcm2, + sfx_cdpcm3, + sfx_cdpcm4, + sfx_cdpcm5, + sfx_cdpcm6, + sfx_cdpcm7, + sfx_cdpcm8, + sfx_cdpcm9, + + // KC sounds + sfx_kc2a, + sfx_kc2b, + sfx_kc2c, + sfx_kc2d, + sfx_kc2e, + sfx_kc2f, + sfx_kc30, + sfx_kc31, + sfx_kc32, + sfx_kc33, + sfx_kc34, + sfx_kc35, + sfx_kc36, + sfx_kc37, + sfx_kc38, + sfx_kc39, + sfx_kc3a, + sfx_kc3b, + sfx_kc3c, + sfx_kc3d, + sfx_kc3e, + sfx_kc3f, + sfx_kc40, + sfx_kc41, + sfx_kc42, + sfx_kc43, + sfx_kc44, + sfx_kc45, + sfx_kc46, + sfx_kc47, + sfx_kc48, + sfx_kc49, + sfx_kc4a, + sfx_kc4b, + sfx_kc4c, + sfx_kc4d, + sfx_kc4e, + sfx_kc4f, + sfx_kc50, + sfx_kc51, + sfx_kc52, + sfx_kc53, + sfx_kc54, + sfx_kc55, + sfx_kc56, + sfx_kc57, + sfx_kc58, + sfx_kc59, + sfx_kc5a, + sfx_kc5b, + sfx_kc5c, + sfx_kc5d, + sfx_kc5e, + sfx_kc5f, + sfx_kc60, + sfx_kc61, + sfx_kc62, + sfx_kc63, + sfx_kc64, + sfx_kc65, + sfx_kc66, + sfx_kc67, + sfx_kc68, + sfx_kc69, + sfx_kc6b, + sfx_kc6c, + sfx_kc6d, + sfx_kc6e, + // SRB2kart sfx_lkt1, sfx_lkt2, @@ -577,76 +878,6 @@ typedef enum sfx_boing, sfx_smkinv, - // KC sounds - sfx_kc2a, - sfx_kc2b, - sfx_kc2c, - sfx_kc2d, - sfx_kc2e, - sfx_kc2f, // Pogo Spring - sfx_kc30, - sfx_kc31, - sfx_kc32, - sfx_kc33, - sfx_kc34, - sfx_kc35, - sfx_kc36, - sfx_kc37, - sfx_kc38, - sfx_kc39, // Voting roulette - sfx_kc3a, - sfx_kc3b, - sfx_kc3c, - sfx_kc3d, - sfx_kc3e, - sfx_kc3f, - sfx_kc40, - sfx_kc41, - sfx_kc42, // Unlock everything cheat - sfx_kc43, - sfx_kc44, - sfx_kc45, - sfx_kc46, - sfx_kc47, - sfx_kc48, // Vote picked - sfx_kc49, - sfx_kc4a, // Voting beep - sfx_kc4b, - sfx_kc4c, - sfx_kc4d, - sfx_kc4e, - sfx_kc4f, - sfx_kc50, - sfx_kc51, - sfx_kc52, - sfx_kc53, - sfx_kc54, - sfx_kc55, - sfx_kc56, - sfx_kc57, - sfx_kc58, - sfx_kc59, // Shrink - sfx_kc5a, // Grow - sfx_kc5b, - sfx_kc5c, - sfx_kc5d, - sfx_kc5e, - sfx_kc5f, - sfx_kc60, - sfx_kc61, - sfx_kc62, - sfx_kc63, - sfx_kc64, - sfx_kc65, - sfx_kc66, - sfx_kc67, - sfx_kc68, - sfx_kc69, - sfx_kc6b, - sfx_kc6c, - sfx_kc6d, - sfx_kc6e, - sfx_kwin, sfx_klose, sfx_slow, From 681ee4fcfa6bd0a7776c1a2d6ee4c04a765a0249 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 3 Jun 2018 18:20:21 -0400 Subject: [PATCH 24/51] Exit siren, disable constant forcing of Mario Mode sounds --- src/info.c | 42 +++++++++++++++++++++--------------------- src/p_inter.c | 2 +- src/p_spec.c | 11 ++++++----- src/s_sound.c | 8 ++++---- src/sounds.c | 4 ++-- 5 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/info.c b/src/info.c index 4a75ac2c0..979715bf4 100644 --- a/src/info.c +++ b/src/info.c @@ -14248,30 +14248,30 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = }, { // MT_RANDOMITEM - 2000, // doomednum - S_RANDOMITEM1, // spawnstate - 1000, // spawnhealth - S_NULL, // seestate - sfx_None, // seesound - 0, // reactiontime - sfx_None, // attacksound - S_NULL, // painstate - 0, // painchance - sfx_None, // painsound - S_NULL, // meleestate - S_NULL, // missilestate + 2000, // doomednum + S_RANDOMITEM1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate S_DEADRANDOMITEM, // deathstate - S_NULL, // xdeathstate - sfx_pop, // deathsound - 60*FRACUNIT, // speed - 36*FRACUNIT, // radius - 36*FRACUNIT, // height - 0, // display offset - 100, // mass + S_NULL, // xdeathstate + sfx_kc2e, // deathsound + 60*FRACUNIT, // speed + 36*FRACUNIT, // radius + 36*FRACUNIT, // height + 0, // display offset + 100, // mass MT_RANDOMITEMPOP, // damage - sfx_None, // activesound + sfx_None, // activesound MF_SLIDEME|MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags - S_NULL // raisestate + S_NULL // raisestate }, { // MT_RANDOMITEMPOP diff --git a/src/p_inter.c b/src/p_inter.c index da84a1fcb..d3587717a 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1207,7 +1207,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) { // blatant reuse of a variable that's normally unused in circuit if (!player->tossdelay) - S_StartSound(toucher, sfx_lose); + S_StartSound(toucher, sfx_s26d); player->tossdelay = 3; return; } diff --git a/src/p_spec.c b/src/p_spec.c index b069736b6..b7d3baeb5 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4201,7 +4201,7 @@ DoneSection2: { // blatant reuse of a variable that's normally unused in circuit if (!player->tossdelay) - S_StartSound(player->mo, sfx_lose); + S_StartSound(player->mo, sfx_s26d); player->tossdelay = 3; } @@ -4221,12 +4221,13 @@ DoneSection2: } else S_ChangeMusicInternal("karok", true); - // - //HU_SetCEchoFlags(0); - //HU_SetCEchoDuration(5); - //HU_DoCEcho("FINISHED!"); } + if (player->kartstuff[k_position] == 1) + S_StartSound(NULL, sfx_s253); + else + S_StartSound(NULL, sfx_s221); + P_DoPlayerExit(player); } } diff --git a/src/s_sound.c b/src/s_sound.c index 7ea09e987..157c06eed 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -751,7 +751,7 @@ void S_StartSound(const void *origin, sfxenum_t sfx_id) if (sound_disabled) return; - if (true) // Sounds change in Mario mode! // SRB2kart - every sound is mario. + if (mariomode) // Sounds change in Mario mode! { switch (sfx_id) { @@ -764,9 +764,9 @@ void S_StartSound(const void *origin, sfxenum_t sfx_id) case sfx_thok: sfx_id = sfx_mario7; break; - case sfx_pop: - sfx_id = sfx_mkitem; // SRB2kart - break; +// case sfx_pop: +// sfx_id = sfx_mkitem; // SRB2kart +// break; case sfx_jump: sfx_id = sfx_mario6; break; diff --git a/src/sounds.c b/src/sounds.c index 94fdef2c4..83413c7b6 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -316,7 +316,7 @@ sfxinfo_t S_sfx[NUMSFX] = // Sonic 2 sounds {"s220", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s221", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s221", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Normal finish {"s222", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s223", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s224", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, @@ -392,7 +392,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"s26a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s26b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s26c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s26d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s26d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Missed checkpoint {"s26e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s26f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s270", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, From 31c3b80039c2ad5d7127e28022c359c0b684b1df Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 3 Jun 2018 18:25:28 -0400 Subject: [PATCH 25/51] Less timer reduce on gold shroom --- 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 92baa5a2d..184c8003b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2802,7 +2802,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (ATTACK_IS_DOWN && player->kartstuff[k_goldshroomtimer] > 1 && onground && NO_BOO) { K_DoMushroom(player, true); - player->kartstuff[k_goldshroomtimer] -= 10; + player->kartstuff[k_goldshroomtimer] -= 5; if (player->kartstuff[k_goldshroomtimer] < 1) player->kartstuff[k_goldshroomtimer] = 1; } From 937d95e5a88ed5dfc0ef077989f259fe22e081b9 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 3 Jun 2018 18:58:50 -0400 Subject: [PATCH 26/51] Remove collide debug stuff --- src/d_netcmd.c | 7 ------- src/d_netcmd.h | 5 ----- src/k_kart.c | 8 +------- src/p_map.c | 3 +-- src/sounds.c | 2 +- 5 files changed, 3 insertions(+), 22 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index dd7981f3a..5c8343d6e 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -369,13 +369,6 @@ consvar_t cv_speedometer = {"speedometer", "Off", CV_SAVE, speedometer_cons_t, N static CV_PossibleValue_t votetime_cons_t[] = {{10, "MIN"}, {3600, "MAX"}, {0, NULL}}; consvar_t cv_votetime = {"votetime", "20", CV_NETVAR, votetime_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t cv_collideminimum_cons_t[] = {{1, "MIN"}, {16384, "MAX"}, {0, NULL}}; -consvar_t cv_collideminimum = {"collide_minspeed", "25", CV_NETVAR, cv_collideminimum_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -static CV_PossibleValue_t cv_collidesoundnum_cons_t[] = {{1, "MIN"}, {1208, "MAX"}, {0, NULL}}; -consvar_t cv_collidesoundnum = {"collide_soundnum", "231", CV_NETVAR, cv_collidesoundnum_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_collidesounds = {"collide_sounds", "Yes", CV_NETVAR, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; -// - consvar_t cv_ringslinger = {"ringslinger", "No", CV_NETVAR|CV_NOSHOWHELP|CV_CALL|CV_CHEAT, CV_YesNo, Ringslinger_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_gravity = {"gravity", "0.8", CV_RESTRICT|CV_FLOAT|CV_CALL, NULL, Gravity_OnChange, 0, NULL, NULL, 0, 0, NULL}; diff --git a/src/d_netcmd.h b/src/d_netcmd.h index f7b978bd1..ad957ed75 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -128,11 +128,6 @@ extern consvar_t cv_speedometer; extern consvar_t cv_votetime; -extern consvar_t cv_collideminimum; -extern consvar_t cv_collidesoundnum; -extern consvar_t cv_collidesounds; -// - extern consvar_t cv_itemfinder; extern consvar_t cv_inttime, cv_advancemap, cv_playersforexit; diff --git a/src/k_kart.c b/src/k_kart.c index 184c8003b..94ab9077a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -325,9 +325,6 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartmirror); CV_RegisterVar(&cv_speedometer); CV_RegisterVar(&cv_votetime); - CV_RegisterVar(&cv_collideminimum); - CV_RegisterVar(&cv_collidesoundnum); - CV_RegisterVar(&cv_collidesounds); } //} @@ -699,10 +696,7 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) return; } - if (cv_collidesounds.value == 1) - { - S_StartSound(mobj1, cv_collidesoundnum.value); - } + S_StartSound(mobj1, sfx_s3k49); fx = P_SpawnMobj(mobj1->x/2 + mobj2->x/2, mobj1->y/2 + mobj2->y/2, mobj1->z/2 + mobj2->z/2, MT_BUMP); if (mobj1->eflags & MFE_VERTICALFLIP) diff --git a/src/p_map.c b/src/p_map.c index c36d8efab..9191038bf 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3990,8 +3990,7 @@ bounceback: fx->eflags &= ~MFE_VERTICALFLIP; fx->scale = mo->scale; - if (cv_collidesounds.value == 1) - S_StartSound(mo, cv_collidesoundnum.value); + S_StartSound(mo, sfx_s3k49); } } diff --git a/src/sounds.c b/src/sounds.c index 83413c7b6..e66599209 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -420,7 +420,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"s3k46", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k47", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k48", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s3k49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s3k49", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Kart bump sound {"s3k4a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s3k4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, From 23af399f6175e0b9815a21ec9bea19849d5d423d Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 3 Jun 2018 20:11:08 -0400 Subject: [PATCH 27/51] Some Battle fixes and additions - mapgotboxes is synched - Karma bombs/items flash while spinning out - Karma bombs have a sound + explosion when hitting someone - Karma bombs can no longer attempt to attack a player that is flashing and have to WAIT... again - Fixed MT_GREENITEM's bounce sound, after breaking from last commit (WHY ARE YOU ABUSING MARIO MODE SOUNDS, STOP, AGHH) --- src/info.c | 2 +- src/k_kart.c | 6 +++++- src/p_map.c | 30 ++++++++++++++++++++++++++---- src/p_saveg.c | 2 ++ 4 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/info.c b/src/info.c index 979715bf4..3c7e28940 100644 --- a/src/info.c +++ b/src/info.c @@ -14686,7 +14686,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL, // seestate sfx_tossed, // seesound 8, // reactiontime - sfx_tink, // attacksound + sfx_mario1, // attacksound S_NULL, // painstate 0, // painchance sfx_None, // painsound diff --git a/src/k_kart.c b/src/k_kart.c index 94ab9077a..c4da0b22e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3268,7 +3268,11 @@ void K_MoveKartPlayer(player_t *player, boolean onground) else if (player->kartstuff[k_comebackmode] == 1 && player->mo->tracer->state != &states[S_PLAYERITEM]) P_SetMobjState(player->mo->tracer, S_PLAYERITEM); - player->mo->tracer->flags2 &= ~MF2_DONTDRAW; + + if (player->powers[pw_flashing] && (leveltime & 1)) + player->mo->tracer->flags2 |= MF2_DONTDRAW; + else + player->mo->tracer->flags2 &= ~MF2_DONTDRAW; } } else if (G_RaceGametype() || player->kartstuff[k_balloon] > 0) diff --git a/src/p_map.c b/src/p_map.c index 9191038bf..05e120647 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1668,21 +1668,42 @@ static boolean PIT_CheckThing(mobj_t *thing) if (thing->player->kartstuff[k_balloon] <= 0 || tmthing->player->kartstuff[k_balloon] <= 0) { if (thing->player->kartstuff[k_comebackmode] == 0 - && tmthing->player->kartstuff[k_balloon] > 0) + && (tmthing->player->kartstuff[k_balloon] > 0 + && !tmthing->player->powers[pw_flashing])) { + mobj_t *boom = P_SpawnMobj(thing->x, thing->y, thing->z, MT_BOOMPARTICLE); + boom->scale = thing->scale; + boom->destscale = thing->scale; + boom->momz = 5*FRACUNIT; + if (thing->player->skincolor) + boom->color = thing->player->skincolor; + else + boom->color = SKINCOLOR_RED; + S_StartSound(boom, sfx_s3k4e); K_ExplodePlayer(tmthing->player, thing); thing->player->kartstuff[k_comebacktimer] = comebacktime; return true; } else if (tmthing->player->kartstuff[k_comebackmode] == 0 - && thing->player->kartstuff[k_balloon] > 0) + && (thing->player->kartstuff[k_balloon] > 0 + && !thing->player->powers[pw_flashing])) { + mobj_t *boom = P_SpawnMobj(tmthing->x, tmthing->y, tmthing->z, MT_BOOMPARTICLE); + boom->scale = tmthing->scale; + boom->destscale = tmthing->scale; + boom->momz = 5*FRACUNIT; + if (tmthing->player->skincolor) + boom->color = tmthing->player->skincolor; + else + boom->color = SKINCOLOR_RED; + S_StartSound(boom, sfx_s3k4e); K_ExplodePlayer(thing->player, tmthing); tmthing->player->kartstuff[k_comebacktimer] = comebacktime; return true; } else if (thing->player->kartstuff[k_comebackmode] == 1 - && (tmthing->player->kartstuff[k_balloon] > 0 && P_CanPickupItem(tmthing->player, true))) + && (tmthing->player->kartstuff[k_balloon] > 0 + && P_CanPickupItem(tmthing->player, true))) { thing->player->kartstuff[k_comebackmode] = 0; thing->player->kartstuff[k_comebackpoints]++; @@ -1695,7 +1716,8 @@ static boolean PIT_CheckThing(mobj_t *thing) return true; } else if (tmthing->player->kartstuff[k_comebackmode] == 1 - && (thing->player->kartstuff[k_balloon] > 0 && P_CanPickupItem(thing->player, true))) + && (thing->player->kartstuff[k_balloon] > 0 + && P_CanPickupItem(thing->player, true))) { tmthing->player->kartstuff[k_comebackmode] = 0; tmthing->player->kartstuff[k_comebackpoints]++; diff --git a/src/p_saveg.c b/src/p_saveg.c index eaa38813d..e1a9944a7 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3252,6 +3252,7 @@ static void P_NetArchiveMisc(void) WRITEUINT8(save_p, mirrormode); WRITEUINT8(save_p, franticitems); WRITEUINT8(save_p, comeback); + WRITEINT32(save_p, numgotboxes); // Probably shouldn't need nummapboxes // Is it paused? if (paused) @@ -3343,6 +3344,7 @@ static inline boolean P_NetUnArchiveMisc(void) mirrormode = (boolean)READUINT8(save_p); franticitems = (boolean)READUINT8(save_p); comeback = (boolean)READUINT8(save_p); + numgotboxes = READINT32(save_p); // Is it paused? if (READUINT8(save_p) == 0x2f) From 2abe82869d80c0bcd9f8035b2143f7a729f3e7f2 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 3 Jun 2018 20:19:03 -0400 Subject: [PATCH 28/51] Adjustin' to Oni's requests Only 1st place finish sound is global, use signpost instead of starpost --- src/p_spec.c | 4 ++-- src/sounds.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/p_spec.c b/src/p_spec.c index b7d3baeb5..9aafc2ca9 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4225,8 +4225,8 @@ DoneSection2: if (player->kartstuff[k_position] == 1) S_StartSound(NULL, sfx_s253); - else - S_StartSound(NULL, sfx_s221); + else if (P_IsLocalPlayer(player)) + S_StartSound(NULL, sfx_s24f); P_DoPlayerExit(player); } diff --git a/src/sounds.c b/src/sounds.c index e66599209..57d8852eb 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -316,7 +316,7 @@ sfxinfo_t S_sfx[NUMSFX] = // Sonic 2 sounds {"s220", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s221", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Normal finish + {"s221", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s222", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s223", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s224", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, @@ -362,7 +362,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"s24c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s24d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s24e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, - {"s24f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, + {"s24f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, // Normal finish {"s250", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s251", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, {"s252", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR}, From 049e0c231c42133995e827d83d9119a5062021a9 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 3 Jun 2018 20:58:52 -0400 Subject: [PATCH 29/51] SUPER CHARGED KARMA ITEMS They give equal chance on a lot of good shit, instead of the normal boring pool of items, mwahaha (also calls P_CheckRacers when someone spectates) --- src/d_main.c | 2 +- src/d_netcmd.c | 2 ++ src/d_player.h | 1 + src/k_kart.c | 57 +++++++++++++++++++++++++++----------------------- src/p_map.c | 2 ++ 5 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index c0de6133a..df1180c89 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -702,7 +702,7 @@ void D_SRB2Loop(void) else if (rendertimeout < entertic) // in case the server hang or netsplit { // Lagless camera! Yay! - /* + /* Not yay, it ruins Kart's drift :y if (gamestate == GS_LEVEL && netgame) { if (camera.chase) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5c8343d6e..f4cd3e129 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3235,6 +3235,8 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) P_CheckSurvivors(); else if (G_BattleGametype()) K_CheckBalloons(); // SRB2Kart + else if (G_RaceGametype()) + K_CheckRacers(); // also SRB2Kart } // diff --git a/src/d_player.h b/src/d_player.h index 2d0edd1b9..80e633dcd 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -262,6 +262,7 @@ typedef enum k_offroad, // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed 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) k_itemclose, // Used to animate the item window closing (was "pw_psychic") // Some items use timers for their duration or effects diff --git a/src/k_kart.c b/src/k_kart.c index c4da0b22e..2f36665a3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -385,30 +385,30 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][9] = /*Feather*/ { 0, 0, 0, 0, 0, 0, 0, 0, 0 } // Feather }; -static INT32 K_KartItemOddsBalloons[NUMKARTITEMS][5] = +static INT32 K_KartItemOddsBalloons[NUMKARTITEMS][6] = { - //P-Odds 0 1 2 3 4 - /*Magnet*/ { 0, 0, 0, 0, 0 }, // Magnet - /*Boo*/ { 0, 0, 1, 1, 0 }, // Boo - /*Mushroom*/ { 0, 1, 2, 1, 0 }, // Mushroom - /*Triple Mushroom*/ { 0, 0, 0, 0, 0 }, // Triple Mushroom - /*Mega Mushroom*/ { 1, 2, 0, 0, 0 }, // Mega Mushroom - /*Gold Mushroom*/ { 0, 0, 0, 0, 0 }, // Gold Mushroom - /*Star*/ { 1, 2, 0, 0, 0 }, // Star + //P-Odds 0 1 2 3 4 5 + /*Magnet*/ { 0, 0, 0, 0, 0, 0 }, // Magnet + /*Boo*/ { 0, 0, 1, 1, 0, 0 }, // Boo + /*Mushroom*/ { 0, 1, 2, 1, 0, 1 }, // Mushroom + /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 0 }, // Triple Mushroom + /*Mega Mushroom*/ { 1, 2, 0, 0, 0, 1 }, // Mega Mushroom + /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0 }, // Gold Mushroom + /*Star*/ { 1, 2, 0, 0, 0, 1 }, // Star - /*Triple Banana*/ { 0, 1, 1, 0, 0 }, // Triple Banana - /*Fake Item*/ { 0, 0, 2, 1, 1 }, // Fake Item - /*Banana*/ { 0, 0, 3, 1, 1 }, // Banana - /*Green Shell*/ { 0, 0, 5, 3, 2 }, // Green Shell - /*Red Shell*/ { 0, 3, 3, 0, 0 }, // Red Shell - /*Triple Green Shell*/ { 0, 1, 1, 0, 0 }, // Triple Green Shell - /*Bob-omb*/ { 0, 3, 3, 0, 0 }, // Bob-omb - /*Blue Shell*/ { 0, 0, 0, 0, 0 }, // Blue Shell - /*Fire Flower*/ { 0, 3, 3, 0, 0 }, // Fire Flower - /*Triple Red Shell*/ { 1, 2, 0, 0, 0 }, // Triple Red Shell - /*Lightning*/ { 0, 0, 0, 0, 0 }, // Lightning + /*Triple Banana*/ { 0, 1, 1, 0, 0, 1 }, // Triple Banana + /*Fake Item*/ { 0, 0, 2, 1, 1, 0 }, // Fake Item + /*Banana*/ { 0, 0, 3, 1, 1, 0 }, // Banana + /*Green Shell*/ { 0, 0, 5, 3, 2, 0 }, // Green Shell + /*Red Shell*/ { 0, 3, 3, 0, 0, 1 }, // Red Shell + /*Triple Green Shell*/ { 0, 1, 1, 0, 0, 1 }, // Triple Green Shell + /*Bob-omb*/ { 0, 3, 3, 0, 0, 1 }, // Bob-omb + /*Blue Shell*/ { 0, 0, 0, 0, 0, 0 }, // Blue Shell + /*Fire Flower*/ { 0, 3, 3, 0, 0, 1 }, // Fire Flower + /*Triple Red Shell*/ { 1, 2, 0, 0, 0, 1 }, // Triple Red Shell + /*Lightning*/ { 0, 0, 0, 0, 0, 0 }, // Lightning - /*Feather*/ { 0, 0, 1, 1, 0 } // Feather + /*Feather*/ { 0, 0, 1, 1, 0, 0 } // Feather }; /** \brief Item Roulette for Kart @@ -593,11 +593,16 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (G_BattleGametype()) // Battle Mode { - useodds = (player->kartstuff[k_balloon]-avgballoon)+2; // 0 is two balloons below average, 2 is average, 4 is two balloons above average - if (useodds > 4) - useodds = 4; - if (useodds < 0) - useodds = 0; + if (player->kartstuff[k_roulettetype] == 1) + useodds = 5; + else + { + useodds = (player->kartstuff[k_balloon]-avgballoon)+2; // 0 is two balloons below average, 2 is average, 4 is two balloons above average + if (useodds > 4) + useodds = 4; + if (useodds < 0) + useodds = 0; + } } else { diff --git a/src/p_map.c b/src/p_map.c index 05e120647..16a3838b6 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1710,6 +1710,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (netgame && cv_hazardlog.value) CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[thing->player-players], player_names[tmthing->player-players]); tmthing->player->kartstuff[k_itemroulette] = 1; + tmthing->player->kartstuff[k_roulettetype] = 1; if (thing->player->kartstuff[k_comebackpoints] >= 3) K_StealBalloon(thing->player, tmthing->player, true); thing->player->kartstuff[k_comebacktimer] = comebacktime; @@ -1724,6 +1725,7 @@ static boolean PIT_CheckThing(mobj_t *thing) if (netgame && cv_hazardlog.value) CONS_Printf(M_GetText("%s gave an item to %s.\n"), player_names[tmthing->player-players], player_names[thing->player-players]); thing->player->kartstuff[k_itemroulette] = 1; + thing->player->kartstuff[k_roulettetype] = 1; if (tmthing->player->kartstuff[k_comebackpoints] >= 3) K_StealBalloon(tmthing->player, thing->player, true); tmthing->player->kartstuff[k_comebacktimer] = comebacktime; From 515f13c9b39721edc81c0598ee0de5e0ddde7962 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 3 Jun 2018 21:01:59 -0400 Subject: [PATCH 30/51] Leave the camera behind while exiting, for dramatic effect! --- src/p_user.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/p_user.c b/src/p_user.c index e4af0d62b..8a9f2437c 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -8304,6 +8304,9 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall subsector_t *newsubsec; fixed_t f1, f2; + if (player->exiting) // SRB2Kart: Leave the camera behind while exiting, for dramatic effect! + return true; + cameranoclip = (player->pflags & (PF_NOCLIP|PF_NIGHTSMODE)) || (player->mo->flags & (MF_NOCLIP|MF_NOCLIPHEIGHT)); // Noclipping player camera noclips too!! if (!(player->climbing || (player->pflags & PF_NIGHTSMODE) || player->playerstate == PST_DEAD)) From 8a82c5eb66ba3f9822d25f082bc6c0cae4f32ae4 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sun, 3 Jun 2018 21:07:36 -0400 Subject: [PATCH 31/51] P, not K --- src/d_netcmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index f4cd3e129..02c12fcd1 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -3236,7 +3236,7 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum) else if (G_BattleGametype()) K_CheckBalloons(); // SRB2Kart else if (G_RaceGametype()) - K_CheckRacers(); // also SRB2Kart + P_CheckRacers(); // also SRB2Kart } // From 01d67c18b309e9ae72b0f671f00b58c847e9ad71 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 4 Jun 2018 00:29:31 -0400 Subject: [PATCH 32/51] WHOOPS --- src/k_kart.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/k_kart.c b/src/k_kart.c index 2f36665a3..88a9f7ff3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -665,6 +665,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) #undef SETITEMRESULT player->kartstuff[k_itemroulette] = 0; // Since we're done, clear the roulette number + player->kartstuff[k_roulettetype] = 0; // This too if (P_IsLocalPlayer(player)) S_StartSound(NULL, sfx_mkitmF); From 5a8eab9513e0375756cec878f0e93f718820dfb1 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 4 Jun 2018 16:19:36 -0400 Subject: [PATCH 33/51] Minimap offset support --- src/k_kart.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 88a9f7ff3..9461cd467 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4774,6 +4774,13 @@ static void K_drawKartMinimap(void) splitflags |= V_HUDTRANSHALF; } + // let offsets transfer to the heads, too! + if (mirrormode) + x += SHORT(AutomapPic->leftoffset); + else + x -= SHORT(AutomapPic->leftoffset); + y -= SHORT(AutomapPic->topoffset); + // Player's tiny icons on the Automap. for (i = 0; i < MAXPLAYERS; i++) { From 3ff296787ad7598d6f5835797e25601475e8acb2 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 4 Jun 2018 16:30:16 -0400 Subject: [PATCH 34/51] Revert "Merge branch 'master' into sonicitems" This reverts commit ec65ad380e2eb9f34564ea4044d6b81db62b1116, reversing changes made to 70baa4fcd86f73c892e09105e12504b2b89e84e3. --- src/console.c | 7 +- src/d_clisrv.c | 43 +- src/d_main.c | 19 +- src/d_netcmd.c | 28 +- src/d_netfil.c | 38 +- src/dehacked.c | 11 + src/f_finale.c | 18 +- src/g_game.c | 23 +- src/g_input.c | 40 +- src/g_input.h | 1 - src/hardware/hw_defs.h | 9 +- src/hardware/hw_draw.c | 290 ++------- src/hardware/hw_drv.h | 2 - src/hardware/hw_glob.h | 2 +- src/hardware/hw_main.c | 974 +++++++++++++++---------------- src/hardware/r_opengl/r_opengl.c | 256 +++----- src/lua_script.c | 31 +- src/m_menu.c | 66 +-- src/m_misc.c | 26 +- src/p_setup.c | 13 +- src/r_things.h | 2 +- src/sdl/hwsym_sdl.c | 1 - src/sdl/i_system.c | 28 +- src/sdl/i_video.c | 1 - src/sdl/ogl_sdl.c | 7 +- src/sdl/sdl_sound.c | 9 + src/sdl12/hwsym_sdl.c | 1 - src/sdl12/i_video.c | 1 - src/v_video.c | 8 + src/win32/win_dll.c | 2 - 30 files changed, 714 insertions(+), 1243 deletions(-) diff --git a/src/console.c b/src/console.c index c0f120551..5a7605d02 100644 --- a/src/console.c +++ b/src/console.c @@ -836,9 +836,8 @@ boolean CON_Responder(event_t *ev) return true; } - // ...why shouldn't it eat the key? if it doesn't, it just means you - // can control Sonic from the console, which is silly - return true; //return false; + // don't eat the key + return false; } // command completion forward (tab) and backward (shift-tab) @@ -1037,7 +1036,7 @@ boolean CON_Responder(event_t *ev) // enter a char into the command prompt if (key < 32 || key > 127) - return true; // even if key can't be printed, eat it anyway + return false; // add key to cmd line here if (key >= 'A' && key <= 'Z' && !shiftdown) //this is only really necessary for dedicated servers diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 9190853ee..9485e9105 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1214,37 +1214,22 @@ static inline void CL_DrawConnectionStatus(void) if (lastfilenum != -1) { INT32 dldlength; - static char tempname[28]; - fileneeded_t *file = &fileneeded[lastfilenum]; - char *filename = file->filename; + static char tempname[32]; Net_GetNetStat(); - dldlength = (INT32)((file->currentsize/(double)file->totalsize) * 256); + dldlength = (INT32)((fileneeded[lastfilenum].currentsize/(double)fileneeded[lastfilenum].totalsize) * 256); if (dldlength > 256) dldlength = 256; V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, 256, 8, 175); V_DrawFill(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, dldlength, 8, 160); memset(tempname, 0, sizeof(tempname)); - // offset filename to just the name only part - filename += strlen(filename) - nameonlylength(filename); - - if (strlen(filename) > sizeof(tempname)-1) // too long to display fully - { - size_t endhalfpos = strlen(filename)-10; - // display as first 14 chars + ... + last 10 chars - // which should add up to 27 if our math(s) is correct - snprintf(tempname, sizeof(tempname), "%.14s...%.10s", filename, filename+endhalfpos); - } - else // we can copy the whole thing in safely - { - strncpy(tempname, filename, sizeof(tempname)-1); - } + nameonly(strncpy(tempname, fileneeded[lastfilenum].filename, 31)); V_DrawCenteredString(BASEVIDWIDTH/2, BASEVIDHEIGHT-24-32, V_YELLOWMAP, va(M_GetText("Downloading \"%s\""), tempname)); V_DrawString(BASEVIDWIDTH/2-128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE, - va(" %4uK/%4uK",fileneeded[lastfilenum].currentsize>>10,file->totalsize>>10)); + va(" %4uK/%4uK",fileneeded[lastfilenum].currentsize>>10,fileneeded[lastfilenum].totalsize>>10)); V_DrawRightAlignedString(BASEVIDWIDTH/2+128, BASEVIDHEIGHT-24, V_20TRANS|V_MONOSPACE, va("%3.1fK/s ", ((double)getbps)/1024)); } @@ -2309,7 +2294,7 @@ static void Command_connect(void) // Assume we connect directly. boolean viams = false; - if (COM_Argc() < 2 || *COM_Argv(1) == 0) + if (COM_Argc() < 2) { CONS_Printf(M_GetText( "Connect (port): connect to a server\n" @@ -4163,8 +4148,7 @@ FILESTAMP INT32 k = *txtpak++; // playernum const size_t txtsize = txtpak[0]+1; - if (i >= gametic) // Don't copy old net commands - M_Memcpy(D_GetTextcmd(i, k), txtpak, txtsize); + M_Memcpy(D_GetTextcmd(i, k), txtpak, txtsize); txtpak += txtsize; } } @@ -4666,7 +4650,6 @@ static void Local_Maketic(INT32 realtics) void SV_SpawnPlayer(INT32 playernum, INT32 x, INT32 y, angle_t angle) { tic_t tic; - UINT8 numadjust = 0; (void)x; (void)y; @@ -4676,21 +4659,7 @@ void SV_SpawnPlayer(INT32 playernum, INT32 x, INT32 y, angle_t angle) // spawning, but will be applied afterwards. for (tic = server ? maketic : (neededtic - 1); tic >= gametic; tic--) - { - if (numadjust++ == BACKUPTICS) - { - DEBFILE(va("SV_SpawnPlayer: All netcmds for player %d adjusted!\n", playernum)); - // We already adjusted them all, waste of time doing the same thing over and over - // This shouldn't happen normally though, either gametic was 0 (which is handled now anyway) - // or maketic >= gametic + BACKUPTICS - // -- Monster Iestyn 16/01/18 - break; - } netcmds[tic%BACKUPTICS][playernum].angleturn = (INT16)((angle>>16) | TICCMD_RECEIVED); - - if (!tic) // failsafe for gametic == 0 -- Monster Iestyn 16/01/18 - break; - } } // create missed tic diff --git a/src/d_main.c b/src/d_main.c index c0de6133a..8548ac49d 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1168,7 +1168,7 @@ void D_SRB2Main(void) // add any files specified on the command line with -file wadfile // to the wad list - if (!(M_CheckParm("-connect") && !M_CheckParm("-server"))) + if (!(M_CheckParm("-connect"))) { if (M_CheckParm("-file")) { @@ -1325,16 +1325,8 @@ void D_SRB2Main(void) CONS_Printf("R_Init(): Init SRB2 refresh daemon.\n"); R_Init(); - // setting up sound - if (dedicated) - { - nosound = true; - nomidimusic = nodigimusic = true; - } - else - { - CONS_Printf("S_Init(): Setting up sound.\n"); - } + // setting up sound + CONS_Printf("S_Init(): Setting up sound.\n"); if (M_CheckParm("-nosound")) nosound = true; if (M_CheckParm("-nomusic")) // combines -nomidimusic and -nodigmusic @@ -1433,7 +1425,7 @@ void D_SRB2Main(void) ultimatemode = true; }*/ - if (autostart || netgame) + if (autostart || netgame || M_CheckParm("+connect") || M_CheckParm("-connect")) { gameaction = ga_nothing; @@ -1471,7 +1463,8 @@ void D_SRB2Main(void) } } - if (server && !M_CheckParm("+map")) + if (server && !M_CheckParm("+map") && !M_CheckParm("+connect") + && !M_CheckParm("-connect")) { // Prevent warping to nonexistent levels if (W_CheckNumForName(G_BuildMapName(pstartmap)) == LUMPERROR) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 05b5ee4f2..d3ed20c95 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -252,17 +252,17 @@ consvar_t cv_allowseenames = {"allowseenames", "Yes", CV_NETVAR, CV_YesNo, NULL, consvar_t cv_playername = {"name", "Sonic", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_playername2 = {"name2", "Tails", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name2_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_playername3 = {"name3", "Knuckles", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name3_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_playername4 = {"name4", "Dr. Eggman", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name4_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playername4 = { "name4", "Metal Sonic", CV_SAVE|CV_CALL|CV_NOINIT, NULL, Name4_OnChange, 0, NULL, NULL, 0, 0, NULL}; // player colors -consvar_t cv_playercolor = {"color", "Blue", CV_SAVE|CV_CALL|CV_NOINIT, Color_cons_t, Color_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_playercolor2 = {"color2", "Orange", CV_SAVE|CV_CALL|CV_NOINIT, Color_cons_t, Color2_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_playercolor3 = {"color3", "Red", CV_SAVE|CV_CALL|CV_NOINIT, Color_cons_t, Color3_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_playercolor4 = {"color4", "Red", CV_SAVE|CV_CALL|CV_NOINIT, Color_cons_t, Color4_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playercolor = {"color", "Blue", CV_CALL|CV_NOINIT, Color_cons_t, Color_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playercolor2 = {"color2", "Orange", CV_CALL|CV_NOINIT, Color_cons_t, Color2_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playercolor3 = {"color3", "Red", CV_CALL|CV_NOINIT, Color_cons_t, Color3_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_playercolor4 = {"color4", "Blue", CV_CALL|CV_NOINIT, Color_cons_t, Color4_OnChange, 0, NULL, NULL, 0, 0, NULL}; // player's skin, saved for commodity, when using a favorite skins wad.. -consvar_t cv_skin = {"skin", DEFAULTSKIN, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_skin2 = {"skin2", DEFAULTSKIN2, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin2_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_skin3 = {"skin3", DEFAULTSKIN3, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin3_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_skin4 = {"skin4", DEFAULTSKIN4, CV_SAVE|CV_CALL|CV_NOINIT, NULL, Skin4_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_skin = {"skin", DEFAULTSKIN, CV_CALL|CV_NOINIT, NULL, Skin_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_skin2 = {"skin2", DEFAULTSKIN2, CV_CALL|CV_NOINIT, NULL, Skin2_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_skin3 = {"skin3", DEFAULTSKIN3, CV_CALL|CV_NOINIT, NULL, Skin3_OnChange, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_skin4 = {"skin4", DEFAULTSKIN4, CV_CALL|CV_NOINIT, NULL, Skin4_OnChange, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_skipmapcheck = {"skipmapcheck", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -682,6 +682,7 @@ void D_RegisterServerCommands(void) */ void D_RegisterClientCommands(void) { + const char *username; INT32 i; for (i = 0; i < MAXSKINCOLORS; i++) @@ -742,6 +743,8 @@ void D_RegisterClientCommands(void) #endif // register these so it is saved to config + if ((username = I_GetUserName())) + cv_playername.defaultvalue = username; CV_RegisterVar(&cv_playername); CV_RegisterVar(&cv_playercolor); CV_RegisterVar(&cv_skin); // r_things.c (skin NAME) @@ -1802,12 +1805,7 @@ static void Command_Playdemo_f(void) CONS_Printf(M_GetText("Playing back demo '%s'.\n"), name); - // Internal if no extension, external if one exists - // If external, convert the file name to a path in SRB2's home directory - if (FIL_CheckExtension(name)) - G_DoPlayDemo(va("%s"PATHSEP"%s", srb2home, name)); - else - G_DoPlayDemo(name); + G_DoPlayDemo(name); } static void Command_Timedemo_f(void) diff --git a/src/d_netfil.c b/src/d_netfil.c index 6742cfe28..172624ad2 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -990,41 +990,19 @@ filestatus_t checkfilemd5(char *filename, const UINT8 *wantedmd5sum) return FS_FOUND; // will never happen, but makes the compiler shut up } -// Rewritten by Monster Iestyn to be less stupid -// Note: if completepath is true, "filename" is modified, but only if FS_FOUND is going to be returned -// (Don't worry about WinCE's version of filesearch, nobody cares about that OS anymore) filestatus_t findfile(char *filename, const UINT8 *wantedmd5sum, boolean completepath) { - filestatus_t homecheck; // store result of last file search - boolean badmd5 = false; // store whether md5 was bad from either of the first two searches (if nothing was found in the third) + filestatus_t homecheck = filesearch(filename, srb2home, wantedmd5sum, false, 10); + if (homecheck == FS_FOUND) + return filesearch(filename, srb2home, wantedmd5sum, completepath, 10); - // first, check SRB2's "home" directory - homecheck = filesearch(filename, srb2home, wantedmd5sum, completepath, 10); + homecheck = filesearch(filename, srb2path, wantedmd5sum, false, 10); + if (homecheck == FS_FOUND) + return filesearch(filename, srb2path, wantedmd5sum, completepath, 10); - if (homecheck == FS_FOUND) // we found the file, so return that we have :) - return FS_FOUND; - else if (homecheck == FS_MD5SUMBAD) // file has a bad md5; move on and look for a file with the right md5 - badmd5 = true; - // if not found at all, just move on without doing anything - - // next, check SRB2's "path" directory - homecheck = filesearch(filename, srb2path, wantedmd5sum, completepath, 10); - - if (homecheck == FS_FOUND) // we found the file, so return that we have :) - return FS_FOUND; - else if (homecheck == FS_MD5SUMBAD) // file has a bad md5; move on and look for a file with the right md5 - badmd5 = true; - // if not found at all, just move on without doing anything - - // finally check "." directory #ifdef _arch_dreamcast - homecheck = filesearch(filename, "/cd", wantedmd5sum, completepath, 10); + return filesearch(filename, "/cd", wantedmd5sum, completepath, 10); #else - homecheck = filesearch(filename, ".", wantedmd5sum, completepath, 10); + return filesearch(filename, ".", wantedmd5sum, completepath, 10); #endif - - if (homecheck != FS_NOTFOUND) // if not found this time, fall back on the below return statement - return homecheck; // otherwise return the result we got - - return (badmd5 ? FS_MD5SUMBAD : FS_NOTFOUND); // md5 sum bad or file not found } diff --git a/src/dehacked.c b/src/dehacked.c index 09a892cd3..f2caf1547 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1883,6 +1883,7 @@ static void readframe(MYFILE *f, INT32 num) char *word1; char *word2 = NULL; char *tmp; + INT32 j; do { @@ -1897,6 +1898,16 @@ static void readframe(MYFILE *f, INT32 num) if (s == tmp) continue; // Skip comment lines, but don't break. + for (j = 0; s[j] != '\n'; j++) + { + if (s[j] == '=') + { + j += 2; + j = atoi(&s[j]); + break; + } + } + word1 = strtok(s, " "); if (word1) strupr(word1); diff --git a/src/f_finale.c b/src/f_finale.c index 913d76252..e6cd6d0ee 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -222,19 +222,11 @@ static void F_SkyScroll(INT32 scrollspeed) #ifdef HWRENDER else if (rendermode != render_none) { // if only software rendering could be this simple and retarded - INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); - INT32 y, pw = SHORT(pat->width) * dupz, ph = SHORT(pat->height) * dupz; - scrolled = animtimer * dupz; - for (x = 0; x < vid.width; x += pw) - { - for (y = 0; y < vid.height; y += ph) - { - if (scrolled > 0) - V_DrawScaledPatch(scrolled - pw, y, V_NOSCALESTART, pat); - - V_DrawScaledPatch(x + scrolled, y, V_NOSCALESTART, pat); - } - } + scrolled = animtimer; + if (scrolled > 0) + V_DrawScaledPatch(scrolled - SHORT(pat->width), 0, 0, pat); + for (x = 0; x < fakedwidth; x += SHORT(pat->width)) + V_DrawScaledPatch(x + scrolled, 0, 0, pat); } #endif diff --git a/src/g_game.c b/src/g_game.c index 4d04052a3..0263b2a7e 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1159,14 +1159,13 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) INT32 laim, th, tspeed, forward, side, axis; //i const INT32 speed = 1; // these ones used for multiple conditions - boolean turnleft, turnright, invertmouse, mouseaiming, lookaxis, analog, analogjoystickmove, gamepadjoystickmove, kbl, rd; + boolean turnleft, turnright, invertmouse, mouseaiming, lookaxis, analog, analogjoystickmove, gamepadjoystickmove, kbl; player_t *player; camera_t *thiscam; angle_t lang; static INT32 turnheld, turnheld2, turnheld3, turnheld4; // for accelerative turning static boolean keyboard_look, keyboard_look2, keyboard_look3, keyboard_look4; // true if lookup/down using keyboard - static boolean resetdown, resetdown2, resetdown3, resetdown4; // don't cam reset every frame switch (ssplayer) { @@ -1177,7 +1176,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) laim = localaiming2; th = turnheld2; kbl = keyboard_look2; - rd = resetdown2; G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); break; case 3: @@ -1187,7 +1185,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) laim = localaiming3; th = turnheld3; kbl = keyboard_look3; - rd = resetdown3; G_CopyTiccmd(cmd, I_BaseTiccmd3(), 1); break; case 4: @@ -1197,7 +1194,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) laim = localaiming4; th = turnheld4; kbl = keyboard_look4; - rd = resetdown4; G_CopyTiccmd(cmd, I_BaseTiccmd4(), 1); break; case 1: @@ -1208,7 +1204,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) laim = localaiming; th = turnheld; kbl = keyboard_look; - rd = resetdown; G_CopyTiccmd(cmd, I_BaseTiccmd(), 1); // empty, or external driver break; } @@ -1405,15 +1400,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (InputDown(gc_custom3, ssplayer)) cmd->buttons |= BT_CUSTOM3; - if (InputDown(gc_camreset, ssplayer)) - { - if (thiscam->chase && !rd) - P_ResetCamera(player, thiscam); - rd = true; - } - else - rd = false; - // player aiming shit, ahhhh... { INT32 player_invert = invertmouse ? -1 : 1; @@ -1569,7 +1555,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) localaiming2 = laim; keyboard_look2 = kbl; turnheld2 = th; - resetdown2 = rd; camspin2 = InputDown(gc_lookback, ssplayer); break; case 3: @@ -1577,7 +1562,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) localaiming3 = laim; keyboard_look3 = kbl; turnheld3 = th; - resetdown3 = rd; camspin3 = InputDown(gc_lookback, ssplayer); break; case 4: @@ -1585,7 +1569,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) localaiming4 = laim; keyboard_look4 = kbl; turnheld4 = th; - resetdown4 = rd; camspin4 = InputDown(gc_lookback, ssplayer); break; case 1: @@ -1594,7 +1577,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) localaiming = laim; keyboard_look = kbl; turnheld = th; - resetdown = rd; camspin = InputDown(gc_lookback, ssplayer); break; } @@ -4086,8 +4068,7 @@ void G_InitNew(UINT8 pultmode, const char *mapname, boolean resetplayer, boolean unlocktriggers = 0; // clear itemfinder, just in case - if (!dedicated) // except in dedicated servers, where it is not registered and can actually I_Error debug builds - CV_StealthSetValue(&cv_itemfinder, 0); + CV_StealthSetValue(&cv_itemfinder, 0); } // internal game map diff --git a/src/g_input.c b/src/g_input.c index df0ee776a..485263cb3 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1293,6 +1293,7 @@ void G_Controldefault(void) gamecontrol[gc_lookback ][1] = KEY_JOY1+5; // RB // Extra controls + gamecontrol[gc_camtoggle ][0] = KEY_BACKSPACE; gamecontrol[gc_pause ][0] = KEY_PAUSE; gamecontrol[gc_console ][0] = KEY_CONSOLE; gamecontrol[gc_talkkey ][0] = 't'; @@ -1303,47 +1304,10 @@ void G_Controldefault(void) gamecontrol[gc_scores ][1] = KEY_JOY1+6; // Back gamecontrol[gc_spectate ][1] = KEY_JOY1+7; // Start (This is sort of like MP's pause...?) + // Spectator controls gamecontrol[gc_lookup ][0] = KEY_PGUP; gamecontrol[gc_lookdown ][0] = KEY_PGDN; gamecontrol[gc_centerview ][0] = KEY_END; - gamecontrol[gc_camreset ][0] = KEY_HOME; - gamecontrol[gc_camtoggle ][0] = KEY_BACKSPACE; - - // Player 2 controls - gamecontrolbis[gc_aimforward ][0] = KEY_2HAT1+0; - gamecontrolbis[gc_aimbackward][0] = KEY_2HAT1+1; - gamecontrolbis[gc_turnleft ][0] = KEY_2HAT1+2; - gamecontrolbis[gc_turnright ][0] = KEY_2HAT1+3; - gamecontrolbis[gc_accelerate ][0] = KEY_2JOY1+0; // A - gamecontrolbis[gc_drift ][0] = KEY_2JOY1+1; // X - gamecontrolbis[gc_brake ][0] = KEY_2JOY1+2; // B - gamecontrolbis[gc_fire ][0] = KEY_2JOY1+4; // LB - gamecontrolbis[gc_lookback ][0] = KEY_2JOY1+5; // RB - gamecontrolbis[gc_spectate ][0] = KEY_2JOY1+7; // Start - - // Player 3 controls - gamecontrol3[gc_aimforward ][0] = KEY_3HAT1+0; - gamecontrol3[gc_aimbackward][0] = KEY_3HAT1+1; - gamecontrol3[gc_turnleft ][0] = KEY_3HAT1+2; - gamecontrol3[gc_turnright ][0] = KEY_3HAT1+3; - gamecontrol3[gc_accelerate ][0] = KEY_3JOY1+0; // A - gamecontrol3[gc_drift ][0] = KEY_3JOY1+1; // X - gamecontrol3[gc_brake ][0] = KEY_3JOY1+2; // B - gamecontrol3[gc_fire ][0] = KEY_3JOY1+4; // LB - gamecontrol3[gc_lookback ][0] = KEY_3JOY1+5; // RB - gamecontrol3[gc_spectate ][0] = KEY_3JOY1+7; // Start - - // Player 4 controls - gamecontrol4[gc_aimforward ][0] = KEY_4HAT1+0; - gamecontrol4[gc_aimbackward][0] = KEY_4HAT1+1; - gamecontrol4[gc_turnleft ][0] = KEY_4HAT1+2; - gamecontrol4[gc_turnright ][0] = KEY_4HAT1+3; - gamecontrol4[gc_accelerate ][0] = KEY_4JOY1+0; // A - gamecontrol4[gc_drift ][0] = KEY_4JOY1+1; // X - gamecontrol4[gc_brake ][0] = KEY_4JOY1+2; // B - gamecontrol4[gc_fire ][0] = KEY_4JOY1+4; // LB - gamecontrol4[gc_lookback ][0] = KEY_4JOY1+5; // RB - gamecontrol4[gc_spectate ][0] = KEY_4JOY1+7; // Start } //#endif diff --git a/src/g_input.h b/src/g_input.h index 7e49fff34..6f2c65162 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -103,7 +103,6 @@ typedef enum gc_brake, gc_fire, gc_lookback, - gc_camreset, gc_camtoggle, gc_spectate, gc_lookup, diff --git a/src/hardware/hw_defs.h b/src/hardware/hw_defs.h index 9a490a964..48029138d 100644 --- a/src/hardware/hw_defs.h +++ b/src/hardware/hw_defs.h @@ -20,8 +20,8 @@ #define _HWR_DEFS_ #include "../doomtype.h" -#define ZCLIP_PLANE 4.0f // Used for the actual game drawing -#define NZCLIP_PLANE 0.9f // Seems to be only used for the HUD and screen textures +#define ZCLIP_PLANE 4.0f +#define NZCLIP_PLANE 0.9f // ========================================================================== // SIMPLE TYPES @@ -134,13 +134,12 @@ enum EPolyFlags PF_Masked = 0x00000001, // Poly is alpha scaled and 0 alpha pels are discarded (holes in texture) PF_Translucent = 0x00000002, // Poly is transparent, alpha = level of transparency - PF_Additive = 0x00000004, // Poly is added to the frame buffer + PF_Additive = 0x00000024, // Poly is added to the frame buffer PF_Environment = 0x00000008, // Poly should be drawn environment mapped. // Hurdler: used for text drawing PF_Substractive = 0x00000010, // for splat PF_NoAlphaTest = 0x00000020, // hiden param - PF_Fog = 0x00000040, // Fog blocks - PF_Blending = (PF_Environment|PF_Additive|PF_Translucent|PF_Masked|PF_Substractive|PF_Fog)&~PF_NoAlphaTest, + PF_Blending = (PF_Environment|PF_Additive|PF_Translucent|PF_Masked|PF_Substractive)&~PF_NoAlphaTest, // other flag bits diff --git a/src/hardware/hw_draw.c b/src/hardware/hw_draw.c index c142e74c4..108482a52 100644 --- a/src/hardware/hw_draw.c +++ b/src/hardware/hw_draw.c @@ -147,7 +147,10 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, // | /| // |/ | // 0--1 - float dupx, dupy, fscale, fwidth, fheight; + float sdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f; + float sdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f; + float pdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f*FIXED_TO_FLOAT(pscale); + float pdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f*FIXED_TO_FLOAT(pscale); if (alphalevel >= 10 && alphalevel < 13) return; @@ -158,40 +161,23 @@ void HWR_DrawFixedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscale, else HWR_GetMappedPatch(gpatch, colormap); - dupx = (float)vid.dupx; - dupy = (float)vid.dupy; - switch (option & V_SCALEPATCHMASK) { case V_NOSCALEPATCH: - dupx = dupy = 1.0f; + pdupx = pdupy = 2.0f; break; case V_SMALLSCALEPATCH: - dupx = (float)vid.smalldupx; - dupy = (float)vid.smalldupy; + pdupx = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupx); + pdupy = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupy); break; case V_MEDSCALEPATCH: - dupx = (float)vid.meddupx; - dupy = (float)vid.meddupy; + pdupx = 2.0f * FIXED_TO_FLOAT(vid.fmeddupx); + pdupy = 2.0f * FIXED_TO_FLOAT(vid.fmeddupy); break; } - dupx = dupy = (dupx < dupy ? dupx : dupy); - fscale = FIXED_TO_FLOAT(pscale); - - if (option & V_OFFSET) - { - cx -= (float)gpatch->leftoffset * dupx * fscale; - cy -= (float)gpatch->topoffset * dupy * fscale; - } - else - { - cy -= (float)gpatch->topoffset * fscale; - if (option & V_FLIP) - cx -= ((float)gpatch->width - (float)gpatch->leftoffset) * fscale; - else - cx -= (float)gpatch->leftoffset * fscale; - } + if (option & V_NOSCALESTART) + sdupx = sdupy = 2.0f; if (option & V_SPLITSCREEN) cy += FIXED_TO_FLOAT((BASEVIDHEIGHT/2)<= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT) - { - // Need to temporarily cache the real patch to get the colour of the top left pixel - patch_t *realpatch = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC); - const column_t *column = (const column_t *)((const UINT8 *)(realpatch) + LONG((realpatch)->columnofs[0])); - const UINT8 *source = (const UINT8 *)(column) + 3; - HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0])); - Z_Free(realpatch); - } - // centre screen - if (vid.width != BASEVIDWIDTH * vid.dupx) - { - if (option & V_SNAPTORIGHT) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); - else if (!(option & V_SNAPTOLEFT)) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; - } - if (vid.height != BASEVIDHEIGHT * vid.dupy) - { - if ((option & (V_SPLITSCREEN|V_SNAPTOBOTTOM)) == (V_SPLITSCREEN|V_SNAPTOBOTTOM)) - cy += ((float)vid.height/2 - ((float)BASEVIDHEIGHT/2 * dupy)); - else if (option & V_SNAPTOBOTTOM) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); - else if (!(option & V_SNAPTOTOP)) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; - } - } - } - - if (pscale != FRACUNIT) - { - fwidth = (float)gpatch->width * fscale * dupx; - fheight = (float)gpatch->height * fscale * dupy; + v[0].x = v[3].x = (cx*sdupx-(gpatch->width-gpatch->leftoffset)*pdupx)/vid.width - 1; + v[2].x = v[1].x = (cx*sdupx+gpatch->leftoffset*pdupx)/vid.width - 1; } else { - fwidth = (float)gpatch->width * dupx; - fheight = (float)gpatch->height * dupy; + v[0].x = v[3].x = (cx*sdupx-gpatch->leftoffset*pdupx)/vid.width - 1; + v[2].x = v[1].x = (cx*sdupx+(gpatch->width-gpatch->leftoffset)*pdupx)/vid.width - 1; } - // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 - cx = -1 + (cx / (vid.width/2)); - cy = 1 - (cy / (vid.height/2)); - - // fwidth and fheight are similar - fwidth /= vid.width / 2; - fheight /= vid.height / 2; - - // set the polygon vertices to the right positions - v[0].x = v[3].x = cx; - v[2].x = v[1].x = cx + fwidth; - - v[0].y = v[1].y = cy; - v[2].y = v[3].y = cy - fheight; + v[0].y = v[1].y = 1-(cy*sdupy-gpatch->topoffset*pdupy)/vid.height; + v[2].y = v[3].y = 1-(cy*sdupy+(gpatch->height-gpatch->topoffset)*pdupy)/vid.height; v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; @@ -315,7 +250,10 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal // | /| // |/ | // 0--1 - float dupx, dupy, fscale, fwidth, fheight; + float sdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f; + float sdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f; + float pdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f*FIXED_TO_FLOAT(pscale); + float pdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f*FIXED_TO_FLOAT(pscale); if (alphalevel >= 10 && alphalevel < 13) return; @@ -323,109 +261,28 @@ void HWR_DrawCroppedPatch(GLPatch_t *gpatch, fixed_t x, fixed_t y, fixed_t pscal // make patch ready in hardware cache HWR_GetPatch(gpatch); - dupx = (float)vid.dupx; - dupy = (float)vid.dupy; - switch (option & V_SCALEPATCHMASK) { case V_NOSCALEPATCH: - dupx = dupy = 1.0f; + pdupx = pdupy = 2.0f; break; case V_SMALLSCALEPATCH: - dupx = (float)vid.smalldupx; - dupy = (float)vid.smalldupy; + pdupx = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupx); + pdupy = 2.0f * FIXED_TO_FLOAT(vid.fsmalldupy); break; case V_MEDSCALEPATCH: - dupx = (float)vid.meddupx; - dupy = (float)vid.meddupy; + pdupx = 2.0f * FIXED_TO_FLOAT(vid.fmeddupx); + pdupy = 2.0f * FIXED_TO_FLOAT(vid.fmeddupy); break; } - dupx = dupy = (dupx < dupy ? dupx : dupy); - fscale = FIXED_TO_FLOAT(pscale); + if (option & V_NOSCALESTART) + sdupx = sdupy = 2.0f; - cy -= (float)gpatch->topoffset * fscale; - cx -= (float)gpatch->leftoffset * fscale; - - if (!(option & V_NOSCALESTART)) - { - cx = cx * dupx; - cy = cy * dupy; - - if (!(option & V_SCALEPATCHMASK)) - { - // if it's meant to cover the whole screen, black out the rest - // cx and cy are possibly *slightly* off from float maths - // This is done before here compared to software because we directly alter cx and cy to centre - if (cx >= -0.1f && cx <= 0.1f && SHORT(gpatch->width) == BASEVIDWIDTH && cy >= -0.1f && cy <= 0.1f && SHORT(gpatch->height) == BASEVIDHEIGHT) - { - // Need to temporarily cache the real patch to get the colour of the top left pixel - patch_t *realpatch = W_CacheLumpNumPwad(gpatch->wadnum, gpatch->lumpnum, PU_STATIC); - const column_t *column = (const column_t *)((const UINT8 *)(realpatch) + LONG((realpatch)->columnofs[0])); - const UINT8 *source = (const UINT8 *)(column) + 3; - HWR_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, (column->topdelta == 0xff ? 31 : source[0])); - Z_Free(realpatch); - } - // centre screen - if (vid.width != BASEVIDWIDTH * vid.dupx) - { - if (option & V_SNAPTORIGHT) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); - else if (!(option & V_SNAPTOLEFT)) - cx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx))/2; - } - if (vid.height != BASEVIDHEIGHT * vid.dupy) - { - if ((option & (V_SPLITSCREEN|V_SNAPTOBOTTOM)) == (V_SPLITSCREEN|V_SNAPTOBOTTOM)) - cy += ((float)vid.height/2 - ((float)BASEVIDHEIGHT/2 * dupy)); - else if (option & V_SNAPTOBOTTOM) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); - else if (!(option & V_SNAPTOTOP)) - cy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy))/2; - } - } - } - - fwidth = w; - fheight = h; - - if (fwidth > w - sx) - fwidth = w - sx; - - if (fheight > h - sy) - fheight = h - sy; - - if (fwidth > gpatch->width) - fwidth = gpatch->width; - - if (fheight > gpatch->height) - fheight = gpatch->height; - - if (pscale != FRACUNIT) - { - fwidth *= fscale * dupx; - fheight *= fscale * dupy; - } - else - { - fwidth *= dupx; - fheight *= dupy; - } - - // positions of the cx, cy, are between 0 and vid.width/vid.height now, we need them to be between -1 and 1 - cx = -1 + (cx / (vid.width/2)); - cy = 1 - (cy / (vid.height/2)); - - // fwidth and fheight are similar - fwidth /= vid.width / 2; - fheight /= vid.height / 2; - - // set the polygon vertices to the right positions - v[0].x = v[3].x = cx; - v[2].x = v[1].x = cx + fwidth; - - v[0].y = v[1].y = cy; - v[2].y = v[3].y = cy - fheight; + v[0].x = v[3].x = (cx*sdupx - gpatch->leftoffset * pdupx) / vid.width - 1; + v[2].x = v[1].x = (cx*sdupx + ((w-sx) - gpatch->leftoffset) * pdupx) / vid.width - 1; + v[0].y = v[1].y = 1 - (cy*sdupy - gpatch->topoffset * pdupy) / vid.height; + v[2].y = v[3].y = 1 - (cy*sdupy + ((h-sy) - gpatch->topoffset) * pdupy) / vid.height; v[0].z = v[1].z = v[2].z = v[3].z = 1.0f; @@ -802,7 +659,7 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) { FOutVector v[4]; FSurfaceInfo Surf; - float fx, fy, fw, fh; + float sdupx, sdupy; if (w < 0 || h < 0) return; // consistency w/ software @@ -811,79 +668,16 @@ void HWR_DrawFill(INT32 x, INT32 y, INT32 w, INT32 h, INT32 color) // | /| // |/ | // 0--1 + sdupx = FIXED_TO_FLOAT(vid.fdupx)*2.0f; + sdupy = FIXED_TO_FLOAT(vid.fdupy)*2.0f; - fx = (float)x; - fy = (float)y; - fw = (float)w; - fh = (float)h; + if (color & V_NOSCALESTART) + sdupx = sdupy = 2.0f; - if (!(color & V_NOSCALESTART)) - { - float dupx = (float)vid.dupx, dupy = (float)vid.dupy; - - if (x == 0 && y == 0 && w == BASEVIDWIDTH && h == BASEVIDHEIGHT) - { - RGBA_t rgbaColour = V_GetColor(color); - FRGBAFloat clearColour; - clearColour.red = (float)rgbaColour.s.red / 255; - clearColour.green = (float)rgbaColour.s.green / 255; - clearColour.blue = (float)rgbaColour.s.blue / 255; - clearColour.alpha = 1; - HWD.pfnClearBuffer(true, false, &clearColour); - return; - } - - fx *= dupx; - fy *= dupy; - fw *= dupx; - fh *= dupy; - - if (vid.width != BASEVIDWIDTH * vid.dupx) - { - if (color & V_SNAPTORIGHT) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)); - else if (!(color & V_SNAPTOLEFT)) - fx += ((float)vid.width - ((float)BASEVIDWIDTH * dupx)) / 2; - } - if (vid.height != BASEVIDHEIGHT * dupy) - { - // same thing here - if (color & V_SNAPTOBOTTOM) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)); - else if (!(color & V_SNAPTOTOP)) - fy += ((float)vid.height - ((float)BASEVIDHEIGHT * dupy)) / 2; - } - } - - if (fx >= vid.width || fy >= vid.height) - return; - if (fx < 0) - { - fw += fx; - fx = 0; - } - if (fy < 0) - { - fh += fy; - fy = 0; - } - - if (fw <= 0 || fh <= 0) - return; - if (fx + fw > vid.width) - fw = (float)vid.width - fx; - if (fy + fh > vid.height) - fh = (float)vid.height - fy; - - fx = -1 + fx / (vid.width / 2); - fy = 1 - fy / (vid.height / 2); - fw = fw / (vid.width / 2); - fh = fh / (vid.height / 2); - - v[0].x = v[3].x = fx; - v[2].x = v[1].x = fx + fw; - v[0].y = v[1].y = fy; - v[2].y = v[3].y = fy - fh; + v[0].x = v[3].x = (x*sdupx)/vid.width - 1; + v[2].x = v[1].x = (x*sdupx + w*sdupx)/vid.width - 1; + v[0].y = v[1].y = 1-(y*sdupy)/vid.height; + v[2].y = v[3].y = 1-(y*sdupy + h*sdupy)/vid.height; //Hurdler: do we still use this argb color? if not, we should remove it v[0].argb = v[1].argb = v[2].argb = v[3].argb = 0xff00ff00; //; diff --git a/src/hardware/hw_drv.h b/src/hardware/hw_drv.h index a5ac82001..7672f47c2 100644 --- a/src/hardware/hw_drv.h +++ b/src/hardware/hw_drv.h @@ -79,7 +79,6 @@ EXPORT char *HWRAPI(GetRenderer) (void); #define SCREENVERTS 10 EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]); #endif -EXPORT void HWRAPI(FlushScreenTextures) (void); EXPORT void HWRAPI(StartScreenWipe) (void); EXPORT void HWRAPI(EndScreenWipe) (void); EXPORT void HWRAPI(DoScreenWipe) (float alpha); @@ -125,7 +124,6 @@ struct hwdriver_s #ifdef SHUFFLE PostImgRedraw pfnPostImgRedraw; #endif - FlushScreenTextures pfnFlushScreenTextures; StartScreenWipe pfnStartScreenWipe; EndScreenWipe pfnEndScreenWipe; DoScreenWipe pfnDoScreenWipe; diff --git a/src/hardware/hw_glob.h b/src/hardware/hw_glob.h index fea06caff..5d1a81d4f 100644 --- a/src/hardware/hw_glob.h +++ b/src/hardware/hw_glob.h @@ -68,7 +68,6 @@ typedef struct gr_vissprite_s struct gr_vissprite_s *prev; struct gr_vissprite_s *next; float x1, x2; - float z1, z2; float tz, ty; lumpnum_t patchlumpnum; boolean flip; @@ -79,6 +78,7 @@ typedef struct gr_vissprite_s //Hurdler: 25/04/2000: now support colormap in hardware mode UINT8 *colormap; INT32 dispoffset; // copy of info->dispoffset, affects ordering but not drawing + float z1, z2; } gr_vissprite_t; // -------- diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c index b7797e546..d990f59a1 100644 --- a/src/hardware/hw_main.c +++ b/src/hardware/hw_main.c @@ -117,7 +117,7 @@ consvar_t cv_grfiltermode = {"gr_filtermode", "Nearest", CV_CALL, grfiltermode_c consvar_t cv_granisotropicmode = {"gr_anisotropicmode", "1", CV_CALL, granisotropicmode_cons_t, CV_anisotropic_ONChange, 0, NULL, NULL, 0, 0, NULL}; //static consvar_t cv_grzbuffer = {"gr_zbuffer", "On", 0, CV_OnOff}; -consvar_t cv_grcorrecttricks = {"gr_correcttricks", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_grcorrecttricks = {"gr_correcttricks", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_grsolvetjoin = {"gr_solvetjoin", "On", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; static void CV_FogDensity_ONChange(void) @@ -493,10 +493,10 @@ UINT32 HWR_Lighting(INT32 light, UINT32 color, UINT32 fadecolor, boolean fogbloc } -static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color) // Let's see if this can work +static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color, UINT32 fadecolor) // Let's see if this can work { - RGBA_t realcolor, surfcolor; - INT32 alpha; + RGBA_t realcolor, fogcolor, surfcolor; + INT32 alpha, fogalpha; // Don't go out of bounds if (light < 0) @@ -505,11 +505,13 @@ static UINT8 HWR_FogBlockAlpha(INT32 light, UINT32 color) // Let's see if this c light = 255; realcolor.rgba = color; + fogcolor.rgba = fadecolor; alpha = (realcolor.s.alpha*255)/25; + fogalpha = (fogcolor.s.alpha*255)/25; - // at 255 brightness, alpha is between 0 and 127, at 0 brightness alpha will always be 255 - surfcolor.s.alpha = (alpha*light)/(2*256)+255-light; + // Fog blocks seem to get slightly more opaque with more opaque colourmap opacity, and much more opaque with darker brightness + surfcolor.s.alpha = (UINT8)(CALCLIGHT(light, ((0xFF-light)+alpha)/2)+CALCLIGHT(0xFF-light, ((light)+fogalpha)/2)); return surfcolor.s.alpha; } @@ -775,10 +777,10 @@ static void HWR_RenderPlane(sector_t *sector, extrasubsector_t *xsub, boolean is Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, true); } - if (PolyFlags & (PF_Translucent|PF_Fog)) + if (PolyFlags & PF_Translucent) { Surf.FlatColor.s.alpha = (UINT8)alpha; - PolyFlags |= PF_Modulated|PF_Clip; + PolyFlags |= PF_Modulated|PF_Occlude|PF_Clip; } else PolyFlags |= PF_Masked|PF_Modulated|PF_Clip; @@ -1069,11 +1071,12 @@ static float HWR_ClipViewSegment(INT32 x, polyvertex_t *v1, polyvertex_t *v2) // // HWR_SplitWall // -static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, FSurfaceInfo* Surf, UINT32 cutflag, ffloor_t *pfloor) +static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, FSurfaceInfo* Surf, UINT32 cutflag) { /* SoM: split up and light walls according to the lightlist. This may also include leaving out parts of the wall that can't be seen */ + GLTexture_t * glTex; float realtop, realbot, top, bot; float pegt, pegb, pegmul; @@ -1096,8 +1099,8 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, INT32 solid, i; lightlist_t * list = sector->lightlist; const UINT8 alpha = Surf->FlatColor.s.alpha; - FUINT lightnum = sector->lightlevel; - extracolormap_t *colormap = NULL; + FUINT lightnum; + extracolormap_t *colormap; realtop = top = wallVerts[3].y; realbot = bot = wallVerts[0].y; @@ -1113,7 +1116,7 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, endpegmul = (endpegb - endpegt) / (endtop - endbot); #endif - for (i = 0; i < sector->numlights; i++) + for (i = 1; i < sector->numlights; i++) { #ifdef ESLOPE if (endtop < endrealbot) @@ -1121,38 +1124,35 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, if (top < realbot) return; - // There's a compiler warning here if this comment isn't here because of indentation - if (!(list[i].flags & FF_NOSHADE)) - { - if (pfloor && (pfloor->flags & FF_FOG)) - { - lightnum = pfloor->master->frontsector->lightlevel; - colormap = pfloor->master->frontsector->extra_colormap; - } - else - { - lightnum = *list[i].lightlevel; - colormap = list[i].extra_colormap; - } - } + //Hurdler: fix a crashing bug, but is it correct? +// if (!list[i].caster) +// continue; solid = false; - if ((sector->lightlist[i].flags & FF_CUTSOLIDS) && !(cutflag & FF_EXTRA)) - solid = true; - else if ((sector->lightlist[i].flags & FF_CUTEXTRA) && (cutflag & FF_EXTRA)) + if (list[i].caster) { - if (sector->lightlist[i].flags & FF_EXTRA) + if (sector->lightlist[i].caster->flags & FF_CUTSOLIDS && !(cutflag & FF_EXTRA)) + solid = true; + else if (sector->lightlist[i].caster->flags & FF_CUTEXTRA && cutflag & FF_EXTRA) { - if ((sector->lightlist[i].flags & (FF_FOG|FF_SWIMMABLE)) == (cutflag & (FF_FOG|FF_SWIMMABLE))) // Only merge with your own types + if (sector->lightlist[i].caster->flags & FF_EXTRA) + { + if (sector->lightlist[i].caster->flags == cutflag) // Only merge with your own types + solid = true; + } + else solid = true; } else - solid = true; + solid = false; } else solid = false; + if (cutflag == FF_CUTSOLIDS) // These are regular walls sent in from StoreWallRange, they shouldn't be cut from this + solid = false; + #ifdef ESLOPE if (list[i].slope) { @@ -1192,55 +1192,34 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, if (solid && endtop > endbheight) endtop = endbheight; #endif - } - -#ifdef ESLOPE - if (i + 1 < sector->numlights) - { - if (list[i+1].slope) - { - temp = P_GetZAt(list[i+1].slope, v1x, v1y); - bheight = FIXED_TO_FLOAT(temp); - temp = P_GetZAt(list[i+1].slope, v2x, v2y); - endbheight = FIXED_TO_FLOAT(temp); - } - else - bheight = endbheight = FIXED_TO_FLOAT(list[i+1].height); - } - else - { - bheight = realbot; - endbheight = endrealbot; - } -#else - if (i + 1 < sector->numlights) - { - bheight = FIXED_TO_FLOAT(list[i+1].height); - } - else - { - bheight = realbot; - } -#endif - -#ifdef ESLOPE - if (endbheight >= endtop) -#endif - if (bheight >= top) continue; + } //Found a break; - bot = bheight; + bot = height; if (bot < realbot) bot = realbot; #ifdef ESLOPE - endbot = endbheight; + endbot = endheight; if (endbot < endrealbot) endbot = endrealbot; #endif + + // colormap test + if (list[i-1].caster) + { + lightnum = *list[i-1].lightlevel; + colormap = list[i-1].extra_colormap; + } + else + { + lightnum = sector->lightlevel; + colormap = sector->extra_colormap; + } + Surf->FlatColor.s.alpha = alpha; #ifdef ESLOPE @@ -1263,16 +1242,23 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, wallVerts[0].y = wallVerts[1].y = bot; #endif - if (cutflag & FF_FOG) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) + glTex = HWR_GetTexture(texnum); + if (cutflag & FF_TRANSLUCENT) HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap); + else if (glTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Environment, false, lightnum, colormap); else HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap); - top = bot; + if (solid) + top = bheight; + else + top = height; #ifdef ESLOPE - endtop = endbot; + if (solid) + endtop = endbheight; + else + endtop = endheight; #endif } @@ -1284,7 +1270,17 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, if (top <= realbot) return; - Surf->FlatColor.s.alpha = alpha; + if (list[i-1].caster) + { + lightnum = *list[i-1].lightlevel; + colormap = list[i-1].extra_colormap; + } + else + { + lightnum = sector->lightlevel; + colormap = sector->extra_colormap; + } + Surf->FlatColor.s.alpha = alpha; #ifdef ESLOPE wallVerts[3].t = pegt + ((realtop - top) * pegmul); @@ -1306,14 +1302,119 @@ static void HWR_SplitWall(sector_t *sector, wallVert3D *wallVerts, INT32 texnum, wallVerts[0].y = wallVerts[1].y = bot; #endif - if (cutflag & FF_FOG) - HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Fog|PF_NoTexture, true, lightnum, colormap); - else if (cutflag & FF_TRANSLUCENT) + glTex = HWR_GetTexture(texnum); + if (cutflag & FF_TRANSLUCENT) HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Translucent, false, lightnum, colormap); + else if (glTex->mipmap.flags & TF_TRANSPARENT) + HWR_AddTransparentWall(wallVerts, Surf, texnum, PF_Environment, false, lightnum, colormap); else HWR_ProjectWall(wallVerts, Surf, PF_Masked, lightnum, colormap); } +// +// HWR_SplitFog +// Exclusively for fog +// +static void HWR_SplitFog(sector_t *sector, wallVert3D *wallVerts, FSurfaceInfo* Surf, UINT32 cutflag, FUINT lightnum, extracolormap_t *colormap) +{ + /* SoM: split up and light walls according to the + lightlist. This may also include leaving out parts + of the wall that can't be seen */ + float realtop, realbot, top, bot; + float pegt, pegb, pegmul; + float height = 0.0f, bheight = 0.0f; + INT32 solid, i; + lightlist_t * list = sector->lightlist; + const UINT8 alpha = Surf->FlatColor.s.alpha; + + realtop = top = wallVerts[2].y; + realbot = bot = wallVerts[0].y; + pegt = wallVerts[2].t; + pegb = wallVerts[0].t; + pegmul = (pegb - pegt) / (top - bot); + + for (i = 1; i < sector->numlights; i++) + { + if (top < realbot) + return; + + //Hurdler: fix a crashing bug, but is it correct? +// if (!list[i].caster) +// continue; + + solid = false; + + if (list[i].caster) + { + if (sector->lightlist[i].caster->flags & FF_FOG && cutflag & FF_FOG) // Only fog cuts fog + { + if (sector->lightlist[i].caster->flags & FF_EXTRA) + { + if (sector->lightlist[i].caster->flags == cutflag) // only cut by the same + solid = true; + } + else + solid = true; + } + } + + height = FIXED_TO_FLOAT(list[i].height); + + if (solid) + bheight = FIXED_TO_FLOAT(*list[i].caster->bottomheight); + + if (height >= top) + { + if (solid && top > bheight) + top = bheight; + continue; + } + + //Found a break; + bot = height; + + if (bot < realbot) + bot = realbot; + + { + + + + Surf->FlatColor.s.alpha = alpha; + } + + wallVerts[3].t = wallVerts[2].t = pegt + ((realtop - top) * pegmul); + wallVerts[0].t = wallVerts[1].t = pegt + ((realtop - bot) * pegmul); + + // set top/bottom coords + wallVerts[2].y = wallVerts[3].y = top; + wallVerts[0].y = wallVerts[1].y = bot; + + if (!solid) // Don't draw it if there's more fog behind it + HWR_AddTransparentWall(wallVerts, Surf, 0, PF_Translucent|PF_NoTexture, true, lightnum, colormap); + + top = height; + } + + bot = realbot; + if (top <= realbot) + return; + + { + + Surf->FlatColor.s.alpha = alpha; + } + + wallVerts[3].t = wallVerts[2].t = pegt + ((realtop - top) * pegmul); + wallVerts[0].t = wallVerts[1].t = pegt + ((realtop - bot) * pegmul); + + // set top/bottom coords + wallVerts[2].y = wallVerts[3].y = top; + wallVerts[0].y = wallVerts[1].y = bot; + + HWR_AddTransparentWall(wallVerts, Surf, 0, PF_Translucent|PF_NoTexture, true, lightnum, colormap); +} + // HWR_DrawSkyWalls // Draw walls into the depth buffer so that anything behind is culled properly static void HWR_DrawSkyWall(wallVert3D *wallVerts, FSurfaceInfo *Surf, fixed_t bottom, fixed_t top) @@ -1590,7 +1691,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) #endif if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, gr_toptexture, &Surf, FF_CUTLEVEL, NULL); + HWR_SplitWall(gr_frontsector, wallVerts, gr_toptexture, &Surf, FF_CUTSOLIDS); else if (grTex->mipmap.flags & TF_TRANSPARENT) HWR_AddTransparentWall(wallVerts, &Surf, gr_toptexture, PF_Environment, false, lightnum, colormap); else @@ -1673,7 +1774,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) #endif if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, gr_bottomtexture, &Surf, FF_CUTLEVEL, NULL); + HWR_SplitWall(gr_frontsector, wallVerts, gr_bottomtexture, &Surf, FF_CUTSOLIDS); else if (grTex->mipmap.flags & TF_TRANSPARENT) HWR_AddTransparentWall(wallVerts, &Surf, gr_bottomtexture, PF_Environment, false, lightnum, colormap); else @@ -1936,14 +2037,15 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) } #endif + if (grTex->mipmap.flags & TF_TRANSPARENT) + blendmode = PF_Translucent; + if (gr_frontsector->numlights) { if (!(blendmode & PF_Masked)) - HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_TRANSLUCENT, NULL); + HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_TRANSLUCENT); else - { - HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTLEVEL, NULL); - } + HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTSOLIDS); } else if (!(blendmode & PF_Masked)) HWR_AddTransparentWall(wallVerts, &Surf, gr_midtexture, blendmode, false, lightnum, colormap); @@ -2094,7 +2196,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) #endif // I don't think that solid walls can use translucent linedef types... if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTLEVEL, NULL); + HWR_SplitWall(gr_frontsector, wallVerts, gr_midtexture, &Surf, FF_CUTSOLIDS); else { if (grTex->mipmap.flags & TF_TRANSPARENT) @@ -2216,7 +2318,7 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { FBITFIELD blendmode; - blendmode = PF_Fog|PF_NoTexture; + blendmode = PF_Translucent|PF_NoTexture; lightnum = rover->master->frontsector->lightlevel; colormap = rover->master->frontsector->extra_colormap; @@ -2224,15 +2326,15 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) if (rover->master->frontsector->extra_colormap) { - Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba); + Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba,rover->master->frontsector->extra_colormap->fadergba); } else { - Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG); + Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG,FADEFOG); } if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, 0, &Surf, rover->flags, rover); + HWR_SplitFog(gr_frontsector, wallVerts, &Surf, rover->flags, lightnum, colormap); else HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap); } @@ -2240,14 +2342,18 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if (rover->flags & FF_TRANSLUCENT) { blendmode = PF_Translucent; Surf.FlatColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1; } + else if (grTex->mipmap.flags & TF_TRANSPARENT) + { + blendmode = PF_Environment; + } if (gr_frontsector->numlights) - HWR_SplitWall(gr_frontsector, wallVerts, texnum, &Surf, rover->flags, rover); + HWR_SplitWall(gr_frontsector, wallVerts, texnum, &Surf, rover->flags); else { if (blendmode != PF_Masked) @@ -2336,22 +2442,22 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { FBITFIELD blendmode; - blendmode = PF_Fog|PF_NoTexture; + blendmode = PF_Translucent|PF_NoTexture; lightnum = rover->master->frontsector->lightlevel; colormap = rover->master->frontsector->extra_colormap; if (rover->master->frontsector->extra_colormap) { - Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba); + Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,rover->master->frontsector->extra_colormap->rgba,rover->master->frontsector->extra_colormap->fadergba); } else { - Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG); + Surf.FlatColor.s.alpha = HWR_FogBlockAlpha(rover->master->frontsector->lightlevel,NORMALFOG,FADEFOG); } if (gr_backsector->numlights) - HWR_SplitWall(gr_backsector, wallVerts, 0, &Surf, rover->flags, rover); + HWR_SplitFog(gr_backsector, wallVerts, &Surf, rover->flags, lightnum, colormap); else HWR_AddTransparentWall(wallVerts, &Surf, 0, blendmode, true, lightnum, colormap); } @@ -2359,14 +2465,18 @@ static void HWR_StoreWallRange(double startfrac, double endfrac) { FBITFIELD blendmode = PF_Masked; - if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + if (rover->flags & FF_TRANSLUCENT) { blendmode = PF_Translucent; Surf.FlatColor.s.alpha = (UINT8)rover->alpha-1 > 255 ? 255 : rover->alpha-1; } + else if (grTex->mipmap.flags & TF_TRANSPARENT) + { + blendmode = PF_Environment; + } if (gr_backsector->numlights) - HWR_SplitWall(gr_backsector, wallVerts, texnum, &Surf, rover->flags, rover); + HWR_SplitWall(gr_backsector, wallVerts, texnum, &Surf, rover->flags); else { if (blendmode != PF_Masked) @@ -2680,7 +2790,7 @@ static void HWR_AddLine(seg_t * line) angle_t span, tspan; // SoM: Backsector needs to be run through R_FakeFlat - static sector_t tempsec; + sector_t tempsec; if (line->polyseg && !(line->polyseg->flags & POF_RENDERSIDES)) return; @@ -3239,7 +3349,7 @@ static void HWR_Subsector(size_t num) INT16 count; seg_t *line; subsector_t *sub; - static sector_t tempsec; //SoM: 4/7/2000 + sector_t tempsec; //SoM: 4/7/2000 INT32 floorlightlevel; INT32 ceilinglightlevel; INT32 locFloorHeight, locCeilingHeight; @@ -3422,6 +3532,8 @@ static void HWR_Subsector(size_t num) { /// \todo fix light, xoffs, yoffs, extracolormap ? ffloor_t * rover; + + R_Prep3DFloors(gr_frontsector); for (rover = gr_frontsector->ffloors; rover; rover = rover->next) { @@ -3455,19 +3567,19 @@ static void HWR_Subsector(size_t num) light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); if (rover->master->frontsector->extra_colormap) - alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba); + alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba, rover->master->frontsector->extra_colormap->fadergba); else - alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG); + alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG, FADEFOG); HWR_AddTransparentFloor(0, &extrasubsectors[num], false, *rover->bottomheight, *gr_frontsector->lightlist[light].lightlevel, - alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, + alpha, rover->master->frontsector, PF_Translucent|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) // SoM: Flags are more efficient + else if (rover->flags & FF_TRANSLUCENT) // SoM: Flags are more efficient { light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); #ifndef SORTING @@ -3518,19 +3630,19 @@ static void HWR_Subsector(size_t num) light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); if (rover->master->frontsector->extra_colormap) - alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba); + alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, rover->master->frontsector->extra_colormap->rgba, rover->master->frontsector->extra_colormap->fadergba); else - alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG); + alpha = HWR_FogBlockAlpha(*gr_frontsector->lightlist[light].lightlevel, NORMALFOG, FADEFOG); HWR_AddTransparentFloor(0, &extrasubsectors[num], true, *rover->topheight, *gr_frontsector->lightlist[light].lightlevel, - alpha, rover->master->frontsector, PF_Fog|PF_NoTexture, + alpha, rover->master->frontsector, PF_Translucent|PF_NoTexture, true, rover->master->frontsector->extra_colormap); } - else if (rover->flags & FF_TRANSLUCENT && rover->alpha < 256) + else if (rover->flags & FF_TRANSLUCENT) { light = R_GetPlaneLight(gr_frontsector, centerHeight, dup_viewz < cullHeight ? true : false); #ifndef SORTING @@ -3932,10 +4044,12 @@ static boolean HWR_DoCulling(line_t *cullheight, line_t *viewcullheight, float v static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float this_scale) { + UINT8 i; + float tr_x, tr_y; + FOutVector *wv; FOutVector swallVerts[4]; FSurfaceInfo sSurf; fixed_t floorheight, mobjfloor; - float offset = 0; mobjfloor = HWR_OpaqueFloorAtPos( spr->mobj->x, spr->mobj->y, @@ -3978,8 +4092,6 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t } floorheight = FixedInt(spr->mobj->z - floorheight); - - offset = floorheight; } else floorheight = FixedInt(spr->mobj->z - mobjfloor); @@ -3992,42 +4104,47 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t // 0--1 // x1/x2 were already scaled in HWR_ProjectSprite - // First match the normal sprite swallVerts[0].x = swallVerts[3].x = spr->x1; swallVerts[2].x = swallVerts[1].x = spr->x2; - swallVerts[0].z = swallVerts[3].z = spr->z1; - swallVerts[2].z = swallVerts[1].z = spr->z2; if (spr->mobj && this_scale != 1.0f) { // Always a pixel above the floor, perfectly flat. swallVerts[0].y = swallVerts[1].y = swallVerts[2].y = swallVerts[3].y = spr->ty - gpatch->topoffset * this_scale - (floorheight+3); - // Now transform the TOP vertices along the floor in the direction of the camera - swallVerts[3].x = spr->x1 + ((gpatch->height * this_scale) + offset) * gr_viewcos; - swallVerts[2].x = spr->x2 + ((gpatch->height * this_scale) + offset) * gr_viewcos; - swallVerts[3].z = spr->z1 + ((gpatch->height * this_scale) + offset) * gr_viewsin; - swallVerts[2].z = spr->z2 + ((gpatch->height * this_scale) + offset) * gr_viewsin; + swallVerts[0].z = swallVerts[1].z = spr->tz - (gpatch->height-gpatch->topoffset) * this_scale; + swallVerts[2].z = swallVerts[3].z = spr->tz + gpatch->topoffset * this_scale; } else { // Always a pixel above the floor, perfectly flat. swallVerts[0].y = swallVerts[1].y = swallVerts[2].y = swallVerts[3].y = spr->ty - gpatch->topoffset - (floorheight+3); - // Now transform the TOP vertices along the floor in the direction of the camera - swallVerts[3].x = spr->x1 + (gpatch->height + offset) * gr_viewcos; - swallVerts[2].x = spr->x2 + (gpatch->height + offset) * gr_viewcos; - swallVerts[3].z = spr->z1 + (gpatch->height + offset) * gr_viewsin; - swallVerts[2].z = spr->z2 + (gpatch->height + offset) * gr_viewsin; + // Spread out top away from the camera. (Fixme: Make it always move out in the same direction!... somehow.) + swallVerts[0].z = swallVerts[1].z = spr->tz - (gpatch->height-gpatch->topoffset); + swallVerts[2].z = swallVerts[3].z = spr->tz + gpatch->topoffset; } - // We also need to move the bottom ones away when shadowoffs is on - if (cv_shadowoffs.value) + // transform + wv = swallVerts; + + for (i = 0; i < 4; i++,wv++) { - swallVerts[0].x = spr->x1 + offset * gr_viewcos; - swallVerts[1].x = spr->x2 + offset * gr_viewcos; - swallVerts[0].z = spr->z1 + offset * gr_viewsin; - swallVerts[1].z = spr->z2 + offset * gr_viewsin; + // Offset away from the camera based on height from floor. + if (cv_shadowoffs.value) + wv->z += floorheight; + wv->z += 3; + + //look up/down ----TOTAL SUCKS!!!--- do the 2 in one!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + tr_x = wv->z; + tr_y = wv->y; + wv->y = (tr_x * gr_viewludcos) + (tr_y * gr_viewludsin); + wv->z = (tr_x * gr_viewludsin) - (tr_y * gr_viewludcos); + // ---------------------- mega lame test ---------------------------------- + + //scale y before frustum so that frustum can be scaled to screen height + wv->y *= ORIGINAL_ASPECT * gr_fovlud; + wv->x *= gr_fovlud; } if (spr->flip) @@ -4107,285 +4224,6 @@ static void HWR_DrawSpriteShadow(gr_vissprite_t *spr, GLPatch_t *gpatch, float t } } -static void HWR_SplitSprite(gr_vissprite_t *spr) -{ - float this_scale = 1.0f; - FOutVector wallVerts[4]; - GLPatch_t *gpatch; - FSurfaceInfo Surf; - const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)spr->mobj->skin)->flags & SF_HIRES); - extracolormap_t *colormap; - FUINT lightlevel; - FBITFIELD blend = 0; - UINT8 alpha; - - INT32 i; - float realtop, realbot, top, bot; - float towtop, towbot, towmult; - float bheight; - const sector_t *sector = spr->mobj->subsector->sector; - const lightlist_t *list = sector->lightlist; -#ifdef ESLOPE - float endrealtop, endrealbot, endtop, endbot; - float endbheight; - fixed_t temp; - fixed_t v1x, v1y, v2x, v2y; -#endif - - this_scale = FIXED_TO_FLOAT(spr->mobj->scale); - - if (hires) - this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)spr->mobj->skin)->highresscale); - - gpatch = W_CachePatchNum(spr->patchlumpnum, PU_CACHE); - - // cache the patch in the graphics card memory - //12/12/99: Hurdler: same comment as above (for md2) - //Hurdler: 25/04/2000: now support colormap in hardware mode - HWR_GetMappedPatch(gpatch, spr->colormap); - - // Draw shadow BEFORE sprite - if (cv_shadow.value // Shadows enabled - && (spr->mobj->flags & (MF_SCENERY|MF_SPAWNCEILING|MF_NOGRAVITY)) != (MF_SCENERY|MF_SPAWNCEILING|MF_NOGRAVITY) // Ceiling scenery have no shadow. - && !(spr->mobj->flags2 & MF2_DEBRIS) // Debris have no corona or shadow. -#ifdef ALAM_LIGHTING - && !(t_lspr[spr->mobj->sprite]->type // Things with dynamic lights have no shadow. - && (!spr->mobj->player || spr->mobj->player->powers[pw_super])) // Except for non-super players. -#endif - && (spr->mobj->z >= spr->mobj->floorz)) // Without this, your shadow shows on the floor, even after you die and fall through the ground. - { - //////////////////// - // SHADOW SPRITE! // - //////////////////// - HWR_DrawSpriteShadow(spr, gpatch, this_scale); - } - - wallVerts[0].x = wallVerts[3].x = spr->x1; - wallVerts[2].x = wallVerts[1].x = spr->x2; - wallVerts[0].z = wallVerts[3].z = spr->z1; - wallVerts[1].z = wallVerts[2].z = spr->z2; - - wallVerts[2].y = wallVerts[3].y = spr->ty; - if (spr->mobj && this_scale != 1.0f) - wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height * this_scale; - else - wallVerts[0].y = wallVerts[1].y = spr->ty - gpatch->height; - - v1x = FLOAT_TO_FIXED(spr->x1); - v1y = FLOAT_TO_FIXED(spr->z1); - v2x = FLOAT_TO_FIXED(spr->x2); - v2y = FLOAT_TO_FIXED(spr->z2); - - if (spr->flip) - { - wallVerts[0].sow = wallVerts[3].sow = gpatch->max_s; - wallVerts[2].sow = wallVerts[1].sow = 0; - }else{ - wallVerts[0].sow = wallVerts[3].sow = 0; - wallVerts[2].sow = wallVerts[1].sow = gpatch->max_s; - } - - // flip the texture coords (look familiar?) - if (spr->vflip) - { - wallVerts[3].tow = wallVerts[2].tow = gpatch->max_t; - wallVerts[0].tow = wallVerts[1].tow = 0; - }else{ - wallVerts[3].tow = wallVerts[2].tow = 0; - wallVerts[0].tow = wallVerts[1].tow = gpatch->max_t; - } - - realtop = top = wallVerts[3].y; - realbot = bot = wallVerts[0].y; - towtop = wallVerts[3].tow; - towbot = wallVerts[0].tow; - towmult = (towbot - towtop) / (top - bot); - -#ifdef ESLOPE - endrealtop = endtop = wallVerts[2].y; - endrealbot = endbot = wallVerts[1].y; -#endif - - if (!cv_translucency.value) // translucency disabled - { - Surf.FlatColor.s.alpha = 0xFF; - blend = PF_Translucent|PF_Occlude; - } - else if (spr->mobj->flags2 & MF2_SHADOW) - { - Surf.FlatColor.s.alpha = 0x40; - blend = PF_Translucent; - } - else if (spr->mobj->frame & FF_TRANSMASK) - blend = HWR_TranstableToAlpha((spr->mobj->frame & FF_TRANSMASK)>>FF_TRANSSHIFT, &Surf); - else - { - // BP: i agree that is little better in environement but it don't - // work properly under glide nor with fogcolor to ffffff :( - // Hurdler: PF_Environement would be cool, but we need to fix - // the issue with the fog before - Surf.FlatColor.s.alpha = 0xFF; - blend = PF_Translucent|PF_Occlude; - } - - alpha = Surf.FlatColor.s.alpha; - - // Start with the lightlevel and colormap from the top of the sprite - lightlevel = *list[sector->numlights - 1].lightlevel; - colormap = list[sector->numlights - 1].extra_colormap; - i = 0; - temp = FLOAT_TO_FIXED(realtop); - -#ifdef ESLOPE - for (i = 1; i < sector->numlights; i++) - { - fixed_t h = sector->lightlist[i].slope ? P_GetZAt(sector->lightlist[i].slope, spr->mobj->x, spr->mobj->y) - : sector->lightlist[i].height; - if (h <= temp) - { - lightlevel = *list[i-1].lightlevel; - colormap = list[i-1].extra_colormap; - break; - } - } -#else - i = R_GetPlaneLight(sector, temp, false); - lightlevel = *list[i].lightlevel; - colormap = list[i].extra_colormap; -#endif - - for (i = 0; i < sector->numlights; i++) - { -#ifdef ESLOPE - if (endtop < endrealbot) -#endif - if (top < realbot) - return; - - // even if we aren't changing colormap or lightlevel, we still need to continue drawing down the sprite - if (!(list[i].flags & FF_NOSHADE) && (list[i].flags & FF_CUTSPRITES)) - { - lightlevel = *list[i].lightlevel; - colormap = list[i].extra_colormap; - } - -#ifdef ESLOPE - if (i + 1 < sector->numlights) - { - if (list[i+1].slope) - { - temp = P_GetZAt(list[i+1].slope, v1x, v1y); - bheight = FIXED_TO_FLOAT(temp); - temp = P_GetZAt(list[i+1].slope, v2x, v2y); - endbheight = FIXED_TO_FLOAT(temp); - } - else - bheight = endbheight = FIXED_TO_FLOAT(list[i+1].height); - } - else - { - bheight = realbot; - endbheight = endrealbot; - } -#else - if (i + 1 < sector->numlights) - { - bheight = FIXED_TO_FLOAT(list[i+1].height); - } - else - { - bheight = realbot; - } -#endif - -#ifdef ESLOPE - if (endbheight >= endtop) -#endif - if (bheight >= top) - continue; - - bot = bheight; - - if (bot < realbot) - bot = realbot; - -#ifdef ESLOPE - endbot = endbheight; - - if (endbot < endrealbot) - endbot = endrealbot; -#endif - -#ifdef ESLOPE - wallVerts[3].tow = towtop + ((realtop - top) * towmult); - wallVerts[2].tow = towtop + ((endrealtop - endtop) * towmult); - wallVerts[0].tow = towtop + ((realtop - bot) * towmult); - wallVerts[1].tow = towtop + ((endrealtop - endbot) * towmult); - - wallVerts[3].y = top; - wallVerts[2].y = endtop; - wallVerts[0].y = bot; - wallVerts[1].y = endbot; -#else - wallVerts[3].tow = wallVerts[2].tow = towtop + ((realtop - top) * towmult); - wallVerts[0].tow = wallVerts[1].tow = towtop + ((realtop - bot) * towmult); - - wallVerts[2].y = wallVerts[3].y = top; - wallVerts[0].y = wallVerts[1].y = bot; -#endif - - if (colormap) - Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false); - else - Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false); - - Surf.FlatColor.s.alpha = alpha; - - HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated|PF_Clip); - - top = bot; -#ifdef ESLOPE - endtop = endbot; -#endif - } - - bot = realbot; -#ifdef ESLOPE - endbot = endrealbot; - if (endtop <= endrealbot) -#endif - if (top <= realbot) - return; - - // If we're ever down here, somehow the above loop hasn't draw all the light levels of sprite -#ifdef ESLOPE - wallVerts[3].tow = towtop + ((realtop - top) * towmult); - wallVerts[2].tow = towtop + ((endrealtop - endtop) * towmult); - wallVerts[0].tow = towtop + ((realtop - bot) * towmult); - wallVerts[1].tow = towtop + ((endrealtop - endbot) * towmult); - - wallVerts[3].y = top; - wallVerts[2].y = endtop; - wallVerts[0].y = bot; - wallVerts[1].y = endbot; -#else - wallVerts[3].tow = wallVerts[2].tow = towtop + ((realtop - top) * towmult); - wallVerts[0].tow = wallVerts[1].tow = towtop + ((realtop - bot) * towmult); - - wallVerts[2].y = wallVerts[3].y = top; - wallVerts[0].y = wallVerts[1].y = bot; -#endif - - if (colormap) - Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false); - else - Surf.FlatColor.rgba = HWR_Lighting(lightlevel, NORMALFOG, FADEFOG, false, false); - - Surf.FlatColor.s.alpha = alpha; - - HWD.pfnDrawPolygon(&Surf, wallVerts, 4, blend|PF_Modulated|PF_Clip); -} - // -----------------+ // HWR_DrawSprite : Draw flat sprites // : (monsters, bonuses, weapons, lights, ...) @@ -4393,8 +4231,10 @@ static void HWR_SplitSprite(gr_vissprite_t *spr) // -----------------+ static void HWR_DrawSprite(gr_vissprite_t *spr) { - float this_scale = 1.0f; + UINT8 i; + float tr_x, tr_y, this_scale = 1.0f; FOutVector wallVerts[4]; + FOutVector *wv; GLPatch_t *gpatch; // sprite patch converted to hardware FSurfaceInfo Surf; const boolean hires = (spr->mobj && spr->mobj->skin && ((skin_t *)spr->mobj->skin)->flags & SF_HIRES); @@ -4410,12 +4250,6 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) if (!spr->mobj->subsector) return; - if (spr->mobj->subsector->sector->numlights) - { - HWR_SplitSprite(spr); - return; - } - // cache sprite graphics //12/12/99: Hurdler: // OK, I don't change anything for MD2 support because I want to be @@ -4449,7 +4283,24 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) // make a wall polygon (with 2 triangles), using the floor/ceiling heights, // and the 2d map coords of start/end vertices wallVerts[0].z = wallVerts[3].z = spr->z1; - wallVerts[1].z = wallVerts[2].z = spr->z2; + wallVerts[2].z = wallVerts[1].z = spr->z2; + + // transform + wv = wallVerts; + + for (i = 0; i < 4; i++,wv++) + { + //look up/down ----TOTAL SUCKS!!!--- do the 2 in one!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + tr_x = wv->z; + tr_y = wv->y; + wv->y = (tr_x * gr_viewludcos) + (tr_y * gr_viewludsin); + wv->z = (tr_x * gr_viewludsin) - (tr_y * gr_viewludcos); + // ---------------------- mega lame test ---------------------------------- + + //scale y before frustum so that frustum can be scaled to screen height + wv->y *= ORIGINAL_ASPECT * gr_fovlud; + wv->x *= gr_fovlud; + } if (spr->flip) { @@ -4501,8 +4352,26 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) UINT8 lightlevel = 255; extracolormap_t *colormap = sector->extra_colormap; - if (!(spr->mobj->frame & FF_FULLBRIGHT)) - lightlevel = sector->lightlevel; + if (sector->numlights) + { + INT32 light; + + light = R_GetPlaneLight(sector, spr->mobj->z + spr->mobj->height, false); // Always use the light at the top instead of whatever I was doing before + + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = *sector->lightlist[light].lightlevel; + + if (sector->lightlist[light].extra_colormap) + colormap = sector->lightlist[light].extra_colormap; + } + else + { + if (!(spr->mobj->frame & FF_FULLBRIGHT)) + lightlevel = sector->lightlevel; + + if (sector->extra_colormap) + colormap = sector->extra_colormap; + } if (colormap) Surf.FlatColor.rgba = HWR_Lighting(lightlevel, colormap->rgba, colormap->fadergba, false, false); @@ -4542,8 +4411,11 @@ static void HWR_DrawSprite(gr_vissprite_t *spr) // Sprite drawer for precipitation static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) { + UINT8 i; FBITFIELD blend = 0; + float tr_x, tr_y; FOutVector wallVerts[4]; + FOutVector *wv; GLPatch_t *gpatch; // sprite patch converted to hardware FSurfaceInfo Surf; @@ -4569,8 +4441,24 @@ static inline void HWR_DrawPrecipitationSprite(gr_vissprite_t *spr) // make a wall polygon (with 2 triangles), using the floor/ceiling heights, // and the 2d map coords of start/end vertices - wallVerts[0].z = wallVerts[3].z = spr->z1; - wallVerts[1].z = wallVerts[2].z = spr->z2; + wallVerts[0].z = wallVerts[1].z = wallVerts[2].z = wallVerts[3].z = spr->tz; + + // transform + wv = wallVerts; + + for (i = 0; i < 4; i++, wv++) + { + //look up/down ----TOTAL SUCKS!!!--- do the 2 in one!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + tr_x = wv->z; + tr_y = wv->y; + wv->y = (tr_x * gr_viewludcos) + (tr_y * gr_viewludsin); + wv->z = (tr_x * gr_viewludsin) - (tr_y * gr_viewludcos); + // ---------------------- mega lame test ---------------------------------- + + //scale y before frustum so that frustum can be scaled to screen height + wv->y *= ORIGINAL_ASPECT * gr_fovlud; + wv->x *= gr_fovlud; + } wallVerts[0].sow = wallVerts[3].sow = 0; wallVerts[2].sow = wallVerts[1].sow = gpatch->max_s; @@ -4703,33 +4591,6 @@ static void HWR_SortVisSprites(void) gr_vsprsortedhead.prev->next = best; gr_vsprsortedhead.prev = best; } - - // Sryder: Oh boy, while it's nice having ALL the sprites sorted properly, it fails when we bring MD2's into the - // mix and they want to be translucent. So let's place all the translucent sprites and MD2's AFTER - // everything else, but still ordered of course, the depth buffer can handle the opaque ones plenty fine. - // We just need to move all translucent ones to the end in order - // TODO: Fully sort all sprites and MD2s with walls and floors, this part will be unnecessary after that - best = gr_vsprsortedhead.next; - for (i = 0; i < gr_visspritecount; i++) - { - if ((best->mobj->flags2 & MF2_SHADOW) || (best->mobj->frame & FF_TRANSMASK)) - { - if (best == gr_vsprsortedhead.next) - { - gr_vsprsortedhead.next = best->next; - } - best->prev->next = best->next; - best->next->prev = best->prev; - best->prev = gr_vsprsortedhead.prev; - gr_vsprsortedhead.prev->next = best; - gr_vsprsortedhead.prev = best; - ds = best; - best = best->next; - ds->next = &gr_vsprsortedhead; - } - else - best = best->next; - } } // A drawnode is something that points to a 3D floor, 3D side, or masked @@ -5063,7 +4924,6 @@ static void HWR_CreateDrawNodes(void) // Draw all vissprites // -------------------------------------------------------------------------- #ifdef SORTING -// added the stransform so they can be switched as drawing happenes so MD2s and sprites are sorted correctly with each other static void HWR_DrawSprites(void) { if (gr_visspritecount > 0) @@ -5084,20 +4944,44 @@ static void HWR_DrawSprites(void) { if (!cv_grmd2.value || md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound || md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale < 0.0f) HWR_DrawSprite(spr); - else - HWR_DrawMD2(spr); - } - else - { - if (!cv_grmd2.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f) - HWR_DrawSprite(spr); - else - HWR_DrawMD2(spr); } + else if (!cv_grmd2.value || md2_models[spr->mobj->sprite].notfound || md2_models[spr->mobj->sprite].scale < 0.0f) + HWR_DrawSprite(spr); } } } #endif +// -------------------------------------------------------------------------- +// Draw all MD2 +// -------------------------------------------------------------------------- +static void HWR_DrawMD2S(void) +{ + if (gr_visspritecount > 0) + { + gr_vissprite_t *spr; + + // draw all MD2 back to front + for (spr = gr_vsprsortedhead.next; + spr != &gr_vsprsortedhead; + spr = spr->next) + { +#ifdef HWPRECIP + if (!spr->precip) + { +#endif + if (spr->mobj && spr->mobj->skin && spr->mobj->sprite == SPR_PLAY) + { + if (md2_playermodels[(skin_t*)spr->mobj->skin-skins].notfound == false && md2_playermodels[(skin_t*)spr->mobj->skin-skins].scale > 0.0f) + HWR_DrawMD2(spr); + } + else if (md2_models[spr->mobj->sprite].notfound == false && md2_models[spr->mobj->sprite].scale > 0.0f) + HWR_DrawMD2(spr); +#ifdef HWPRECIP + } +#endif + } + } +} // -------------------------------------------------------------------------- // HWR_AddSprites @@ -5182,10 +5066,8 @@ static void HWR_ProjectSprite(mobj_t *thing) { gr_vissprite_t *vis; float tr_x, tr_y; - float tz; + float tx, tz; float x1, x2; - float z1, z2; - float rightsin, rightcos; float this_scale; float gz, gzt; spritedef_t *sprdef; @@ -5196,7 +5078,9 @@ static void HWR_ProjectSprite(mobj_t *thing) angle_t ang; INT32 heightsec, phs; const boolean papersprite = (thing->frame & FF_PAPERSPRITE); + float offset; float ang_scale = 1.0f, ang_scalez = 0.0f; + float z1, z2; if (!thing) return; @@ -5214,9 +5098,7 @@ static void HWR_ProjectSprite(mobj_t *thing) if (tz < ZCLIP_PLANE && !papersprite && (!cv_grmd2.value || md2_models[thing->sprite].notfound == true)) //Yellow: Only MD2's dont disappear return; - // The above can stay as it works for cutting sprites that are too close - tr_x = FIXED_TO_FLOAT(thing->x); - tr_y = FIXED_TO_FLOAT(thing->y); + tx = (tr_x * gr_viewsin) - (tr_y * gr_viewcos); // decide which patch to use for sprite relative to player #ifdef RANGECHECK @@ -5302,27 +5184,33 @@ static void HWR_ProjectSprite(mobj_t *thing) if (thing->skin && ((skin_t *)thing->skin)->flags & SF_HIRES) this_scale = this_scale * FIXED_TO_FLOAT(((skin_t *)thing->skin)->highresscale); - rightsin = FIXED_TO_FLOAT(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT)); - rightcos = FIXED_TO_FLOAT(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT)); + // calculate edges of the shape if (flip) - { - x1 = (FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset) * this_scale); - x2 = (FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset) * this_scale); - } + offset = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset) * this_scale; else - { - x1 = (FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset) * this_scale); - x2 = (FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset) * this_scale); - } + offset = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset) * this_scale; - z1 = tr_y + x1 * rightsin; - z2 = tr_y - x2 * rightsin; + z1 = tz - (offset * ang_scalez); + tx -= offset * ang_scale; + + // project x + x1 = gr_windowcenterx + (tx * gr_centerx / tz); + + //faB : tr_x doesnt matter + // hurdler: it's used in cliptosolidsegs + tr_x = x1; + + x1 = tx; + + offset = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width) * this_scale; + + z2 = z1 + (offset * ang_scalez); + tx += offset * ang_scale; if (papersprite && max(z1, z2) < ZCLIP_PLANE) return; - x1 = tr_x + x1 * rightcos; - x2 = tr_x - x2 * rightcos; + x2 = gr_windowcenterx + (tx * gr_centerx / tz); if (thing->eflags & MFE_VERTICALFLIP) { @@ -5359,10 +5247,13 @@ static void HWR_ProjectSprite(mobj_t *thing) // store information in a vissprite vis = HWR_NewVisSprite(); vis->x1 = x1; +#if 0 vis->x2 = x2; - vis->z1 = z1; - vis->z2 = z2; - vis->tz = tz; // Keep tz for the simple sprite sorting that happens +#else + (void)x2; +#endif + vis->x2 = tx; + vis->tz = tz; vis->dispoffset = thing->info->dispoffset; // Monster Iestyn: 23/11/15: HARDWARE SUPPORT AT LAST vis->patchlumpnum = sprframe->lumppat[rot]; vis->flip = flip; @@ -5405,7 +5296,7 @@ static void HWR_ProjectSprite(mobj_t *thing) vis->colormap = colormaps; // set top/bottom coords - vis->ty = gzt; + vis->ty = gzt - gr_viewz; //CONS_Debug(DBG_RENDER, "------------------\nH: sprite : %d\nH: frame : %x\nH: type : %d\nH: sname : %s\n\n", // thing->sprite, thing->frame, thing->type, sprnames[thing->sprite]); @@ -5424,10 +5315,8 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) { gr_vissprite_t *vis; float tr_x, tr_y; - float tz; + float tx, tz; float x1, x2; - float z1, z2; - float rightsin, rightcos; spritedef_t *sprdef; spriteframe_t *sprframe; size_t lumpoff; @@ -5445,8 +5334,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) if (tz < ZCLIP_PLANE) return; - tr_x = FIXED_TO_FLOAT(thing->x); - tr_y = FIXED_TO_FLOAT(thing->y); + tx = (tr_x * gr_viewsin) - (tr_y * gr_viewcos); // decide which patch to use for sprite relative to player if ((unsigned)thing->sprite >= numsprites) @@ -5473,32 +5361,32 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) lumpoff = sprframe->lumpid[0]; flip = sprframe->flip; // Will only be 0x00 or 0xFF - rightsin = FIXED_TO_FLOAT(FINESINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT)); - rightcos = FIXED_TO_FLOAT(FINECOSINE((viewangle + ANGLE_90)>>ANGLETOFINESHIFT)); - if (flip) - { - x1 = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset); - x2 = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset); - } - else - { - x1 = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset); - x2 = FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width - spritecachedinfo[lumpoff].offset); - } + // calculate edges of the shape + tx -= FIXED_TO_FLOAT(spritecachedinfo[lumpoff].offset); - z1 = tr_y + x1 * rightsin; - z2 = tr_y - x2 * rightsin; - x1 = tr_x + x1 * rightcos; - x2 = tr_x - x2 * rightcos; + // project x + x1 = gr_windowcenterx + (tx * gr_centerx / tz); + + //faB : tr_x doesnt matter + // hurdler: it's used in cliptosolidsegs + tr_x = x1; + + x1 = tx; + + tx += FIXED_TO_FLOAT(spritecachedinfo[lumpoff].width); + x2 = gr_windowcenterx + (tx * gr_centerx / tz); // // store information in a vissprite // vis = HWR_NewVisSprite(); vis->x1 = x1; +#if 0 vis->x2 = x2; - vis->z1 = z1; - vis->z2 = z2; +#else + (void)x2; +#endif + vis->x2 = tx; vis->tz = tz; vis->dispoffset = 0; // Monster Iestyn: 23/11/15: HARDWARE SUPPORT AT LAST vis->patchlumpnum = sprframe->lumppat[rot]; @@ -5508,7 +5396,7 @@ static void HWR_ProjectPrecipitationSprite(precipmobj_t *thing) vis->colormap = colormaps; // set top/bottom coords - vis->ty = FIXED_TO_FLOAT(thing->z + spritecachedinfo[lumpoff].topoffset); + vis->ty = FIXED_TO_FLOAT(thing->z + spritecachedinfo[lumpoff].topoffset) - gr_viewz; vis->precip = true; } @@ -5536,13 +5424,12 @@ static void HWR_DrawSkyBackground(player_t *player) //Hurdler: the sky is the only texture who need 4.0f instead of 1.0 // because it's called just after clearing the screen // and thus, the near clipping plane is set to 3.99 - // Sryder: Just use the near clipping plane value then - v[0].x = v[3].x = -ZCLIP_PLANE-1; - v[1].x = v[2].x = ZCLIP_PLANE+1; - v[0].y = v[1].y = -ZCLIP_PLANE-1; - v[2].y = v[3].y = ZCLIP_PLANE+1; + v[0].x = v[3].x = -4.0f; + v[1].x = v[2].x = 4.0f; + v[0].y = v[1].y = -4.0f; + v[2].y = v[3].y = 4.0f; - v[0].z = v[1].z = v[2].z = v[3].z = ZCLIP_PLANE+1; + v[0].z = v[1].z = v[2].z = v[3].z = 4.0f; // X @@ -5615,7 +5502,7 @@ static inline void HWR_ClearView(void) (INT32)gr_viewwindowy, (INT32)(gr_viewwindowx + gr_viewwidth), (INT32)(gr_viewwindowy + gr_viewheight), - ZCLIP_PLANE); + 3.99f); HWD.pfnClearBuffer(false, true, 0); //disable clip window - set to full size @@ -5650,8 +5537,6 @@ void HWR_SetViewSize(void) gr_pspritexscale = ((vid.width*gr_pspriteyscale*BASEVIDHEIGHT)/BASEVIDWIDTH)/vid.height; gr_pspriteyscale = ((vid.height*gr_pspritexscale*BASEVIDWIDTH)/BASEVIDHEIGHT)/vid.width; - - HWD.pfnFlushScreenTextures(); } // ========================================================================== @@ -5660,6 +5545,7 @@ void HWR_SetViewSize(void) void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player) { const float fpov = FIXED_TO_FLOAT(cv_grfov.value+player->fovadd); + FTransform stransform; postimg_t *type; if (splitscreen && player == &players[secondarydisplayplayer]) @@ -5742,12 +5628,36 @@ void HWR_RenderSkyboxView(INT32 viewnumber, player_t *player) atransform.y = gr_viewy; // FIXED_TO_FLOAT(viewy) atransform.z = gr_viewz; // FIXED_TO_FLOAT(viewz) atransform.scalex = 1; - atransform.scaley = (float)vid.width/vid.height; + atransform.scaley = ORIGINAL_ASPECT; atransform.scalez = 1; atransform.fovxangle = fpov; // Tails atransform.fovyangle = fpov; // Tails atransform.splitscreen = splitscreen; + // Transform for sprites + stransform.anglex = 0.0f; + stransform.angley = -270.0f; + + if (*type == postimg_flip) + stransform.flip = true; + else + stransform.flip = false; + + if (*type == postimg_mirror) + stransform.mirror = true; + else + stransform.mirror = false; + + stransform.x = 0.0f; + stransform.y = 0.0f; + stransform.z = 0.0f; + stransform.scalex = 1; + stransform.scaley = 1; + stransform.scalez = 1; + stransform.fovxangle = 90.0f; + stransform.fovyangle = 90.0f; + stransform.splitscreen = splitscreen; + gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l))); //------------------------------------------------------------------------ @@ -5830,7 +5740,10 @@ if (0) #ifdef SORTING HWR_SortVisSprites(); #endif + HWR_DrawMD2S(); + // Draw the sprites with trivial transform + HWD.pfnSetTransform(&stransform); #ifdef SORTING HWR_DrawSprites(); #endif @@ -5875,6 +5788,7 @@ if (0) void HWR_RenderPlayerView(INT32 viewnumber, player_t *player) { const float fpov = FIXED_TO_FLOAT(cv_grfov.value+player->fovadd); + FTransform stransform; postimg_t *type; const boolean skybox = (skyboxmo[0] && cv_skybox.value); // True if there's a skybox object and skyboxes are on @@ -5972,12 +5886,36 @@ void HWR_RenderPlayerView(INT32 viewnumber, player_t *player) atransform.y = gr_viewy; // FIXED_TO_FLOAT(viewy) atransform.z = gr_viewz; // FIXED_TO_FLOAT(viewz) atransform.scalex = 1; - atransform.scaley = (float)vid.width/vid.height; + atransform.scaley = ORIGINAL_ASPECT; atransform.scalez = 1; atransform.fovxangle = fpov; // Tails atransform.fovyangle = fpov; // Tails atransform.splitscreen = splitscreen; + // Transform for sprites + stransform.anglex = 0.0f; + stransform.angley = -270.0f; + + if (*type == postimg_flip) + stransform.flip = true; + else + stransform.flip = false; + + if (*type == postimg_mirror) + stransform.mirror = true; + else + stransform.mirror = false; + + stransform.x = 0.0f; + stransform.y = 0.0f; + stransform.z = 0.0f; + stransform.scalex = 1; + stransform.scaley = 1; + stransform.scalez = 1; + stransform.fovxangle = 90.0f; + stransform.fovyangle = 90.0f; + stransform.splitscreen = splitscreen; + gr_fovlud = (float)(1.0l/tan((double)(fpov*M_PIl/360l))); //------------------------------------------------------------------------ @@ -6060,7 +5998,10 @@ if (0) #ifdef SORTING HWR_SortVisSprites(); #endif + HWR_DrawMD2S(); + // Draw the sprites with trivial transform + HWD.pfnSetTransform(&stransform); #ifdef SORTING HWR_DrawSprites(); #endif @@ -6251,7 +6192,6 @@ void HWR_Shutdown(void) HWR_FreeExtraSubsectors(); HWR_FreePolyPool(); HWR_FreeTextureCache(); - HWD.pfnFlushScreenTextures(); } void transform(float *cx, float *cy, float *cz) diff --git a/src/hardware/r_opengl/r_opengl.c b/src/hardware/r_opengl/r_opengl.c index 8316397c7..7bab2dbc7 100644 --- a/src/hardware/r_opengl/r_opengl.c +++ b/src/hardware/r_opengl/r_opengl.c @@ -59,7 +59,7 @@ typedef struct GLRGBAFloat GLRGBAFloat; #define N_PI_DEMI (M_PIl/2.0f) //(1.5707963268f) #define ASPECT_RATIO (1.0f) //(320.0f/200.0f) -#define FAR_CLIPPING_PLANE 32768.0f // Draw further! Tails 01-21-2001 +#define FAR_CLIPPING_PLANE 150000.0f // Draw further! Tails 01-21-2001 static float NEAR_CLIPPING_PLANE = NZCLIP_PLANE; // ************************************************************************** @@ -107,19 +107,10 @@ static GLint viewport[4]; #endif // Yay for arbitrary numbers! NextTexAvail is buggy for some reason. -// Sryder: NextTexAvail is broken for these because palette changes or changes to the texture filter or antialiasing -// flush all of the stored textures, leaving them unavailable at times such as between levels -// These need to start at 0 and be set to their number, and be reset to 0 when deleted so that intel GPUs -// can know when the textures aren't there, as textures are always considered resident in their virtual memory -// TODO: Store them in a more normal way -#define SCRTEX_SCREENTEXTURE 65535 -#define SCRTEX_STARTSCREENWIPE 65534 -#define SCRTEX_ENDSCREENWIPE 65533 -#define SCRTEX_FINALSCREENTEXTURE 65532 -static GLuint screentexture = 0; -static GLuint startScreenWipe = 0; -static GLuint endScreenWipe = 0; -static GLuint finalScreenTexture = 0; +static GLuint screentexture = 60000; +static GLuint startScreenWipe = 60001; +static GLuint endScreenWipe = 60002; +static GLuint finalScreenTexture = 60003; #if 0 GLuint screentexture = FIRST_TEX_AVAIL; #endif @@ -272,7 +263,6 @@ FUNCPRINTF void DBG_Printf(const char *lpFmt, ...) /* texture mapping */ //GL_EXT_copy_texture #ifndef KOS_GL_COMPATIBILITY #define pglCopyTexImage2D glCopyTexImage2D -#define pglCopyTexSubImage2D glCopyTexSubImage2D #endif #else //!STATIC_OPENGL @@ -397,8 +387,6 @@ static PFNglBindTexture pglBindTexture; /* texture mapping */ //GL_EXT_copy_texture typedef void (APIENTRY * PFNglCopyTexImage2D) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); static PFNglCopyTexImage2D pglCopyTexImage2D; -typedef void (APIENTRY * PFNglCopyTexSubImage2D) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); -static PFNglCopyTexSubImage2D pglCopyTexSubImage2D; #endif /* GLU functions */ typedef GLint (APIENTRY * PFNgluBuild2DMipmaps) (GLenum target, GLint internalFormat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *data); @@ -515,7 +503,6 @@ boolean SetupGLfunc(void) GETOPENGLFUNC(pglBindTexture , glBindTexture) GETOPENGLFUNC(pglCopyTexImage2D , glCopyTexImage2D) - GETOPENGLFUNC(pglCopyTexSubImage2D , glCopyTexSubImage2D) #undef GETOPENGLFUNC @@ -667,10 +654,6 @@ void SetModelView(GLint w, GLint h) { // DBG_Printf("SetModelView(): %dx%d\n", (int)w, (int)h); - // The screen textures need to be flushed if the width or height change so that they be remade for the correct size - if (screen_width != w || screen_height != h) - FlushScreenTextures(); - screen_width = w; screen_height = h; @@ -818,7 +801,6 @@ void Flush(void) screentexture = FIRST_TEX_AVAIL; } #endif - tex_downloaded = 0; } @@ -1074,56 +1056,30 @@ EXPORT void HWRAPI(SetBlend) (FBITFIELD PolyFlags) switch (PolyFlags & PF_Blending) { case PF_Translucent & PF_Blending: pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); -#endif break; case PF_Masked & PF_Blending: // Hurdler: does that mean lighting is only made by alpha src? // it sounds ok, but not for polygonsmooth pglBlendFunc(GL_SRC_ALPHA, GL_ZERO); // 0 alpha = holes in texture -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_GREATER, 0.5f); -#endif break; case PF_Additive & PF_Blending: #ifdef ATI_RAGE_PRO_COMPATIBILITY pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency #else pglBlendFunc(GL_SRC_ALPHA, GL_ONE); // src * alpha + dest -#endif -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); #endif break; case PF_Environment & PF_Blending: pglBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); -#endif break; case PF_Substractive & PF_Blending: // good for shadow // not realy but what else ? pglBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); -#endif - break; - case PF_Fog & PF_Fog: - // Sryder: Fog - // multiplies input colour by input alpha, and destination colour by input colour, then adds them - pglBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR); -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_NOTEQUAL, 0.0f); -#endif break; default : // must be 0, otherwise it's an error // No blending pglBlendFunc(GL_ONE, GL_ZERO); // the same as no blending -#ifndef KOS_GL_COMPATIBILITY - pglAlphaFunc(GL_GREATER, 0.5f); -#endif break; } } @@ -1383,7 +1339,6 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo) tex[w*j+i].s.green = 0; tex[w*j+i].s.blue = 0; tex[w*j+i].s.alpha = 0; - pTexInfo->flags |= TF_TRANSPARENT; // there is a hole in it } else { @@ -1454,22 +1409,8 @@ EXPORT void HWRAPI(SetTexture) (FTextureInfo *pTexInfo) tex_downloaded = pTexInfo->downloaded; pglBindTexture(GL_TEXTURE_2D, pTexInfo->downloaded); - // disable texture filtering on any texture that has holes so there's no dumb borders or blending issues - if (pTexInfo->flags & TF_TRANSPARENT) - { -#ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NONE); -#else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -#endif - } - else - { - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); - } + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_filter); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_filter); #ifdef KOS_GL_COMPATIBILITY pglTexImage2D(GL_TEXTURE_2D, 0, GL_ARGB4444, w, h, 0, GL_ARGB4444, GL_UNSIGNED_BYTE, ptex); @@ -1923,6 +1864,12 @@ static void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration, ambient[1] = 0.75f; if (ambient[2] > 0.75f) ambient[2] = 0.75f; + + if (color[3] < 255) + { + pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + pglDepthMask(GL_FALSE); + } } pglEnable(GL_CULL_FACE); @@ -1951,12 +1898,10 @@ static void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration, pglMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient); pglMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); #endif - if (color[3] < 255) - SetBlend(PF_Translucent|PF_Modulated|PF_Clip); - else - SetBlend(PF_Masked|PF_Modulated|PF_Occlude|PF_Clip); } + DrawPolygon(NULL, NULL, 0, PF_Masked|PF_Modulated|PF_Occlude|PF_Clip); + pglPushMatrix(); // should be the same as glLoadIdentity //Hurdler: now it seems to work pglTranslatef(pos->x, pos->z, pos->y); @@ -1964,6 +1909,14 @@ static void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration, scaley = -scaley; pglRotatef(pos->angley, 0.0f, -1.0f, 0.0f); pglRotatef(pos->anglex, -1.0f, 0.0f, 0.0f); + //pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency + + // Remove depth mask when the model is transparent so it doesn't cut thorugh sprites // SRB2CBTODO: For all stuff too?! + if (color && color[3] < 255) + { + pglBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // alpha = level of transparency + pglDepthMask(GL_FALSE); + } val = *gl_cmd_buffer++; @@ -2031,6 +1984,7 @@ static void DrawMD2Ex(INT32 *gl_cmd_buffer, md2_frame_t *frame, INT32 duration, if (color) pglDisable(GL_LIGHTING); pglShadeModel(GL_FLAT); + pglDepthMask(GL_TRUE); pglDisable(GL_CULL_FACE); } @@ -2185,25 +2139,10 @@ EXPORT void HWRAPI(PostImgRedraw) (float points[SCREENVERTS][SCREENVERTS][2]) } #endif //SHUFFLE -// Sryder: This needs to be called whenever the screen changes resolution in order to reset the screen textures to use -// a new size -EXPORT void HWRAPI(FlushScreenTextures) (void) -{ - pglDeleteTextures(1, &screentexture); - pglDeleteTextures(1, &startScreenWipe); - pglDeleteTextures(1, &endScreenWipe); - pglDeleteTextures(1, &finalScreenTexture); - screentexture = 0; - startScreenWipe = 0; - endScreenWipe = 0; - finalScreenTexture = 0; -} - // Create Screen to fade from EXPORT void HWRAPI(StartScreenWipe) (void) { INT32 texsize = 2048; - boolean firstTime = (startScreenWipe == 0); // Use a power of two texture, dammit if(screen_width <= 512) @@ -2212,38 +2151,27 @@ EXPORT void HWRAPI(StartScreenWipe) (void) texsize = 1024; // Create screen texture - if (firstTime) - startScreenWipe = SCRTEX_STARTSCREENWIPE; pglBindTexture(GL_TEXTURE_2D, startScreenWipe); - - if (firstTime) - { #ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); #else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif - Clamp2D(GL_TEXTURE_WRAP_S); - Clamp2D(GL_TEXTURE_WRAP_T); + Clamp2D(GL_TEXTURE_WRAP_S); + Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); -#endif - } - else -#ifndef KOS_GL_COMPATIBILITY - pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif - tex_downloaded = startScreenWipe; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } // Create Screen to fade to EXPORT void HWRAPI(EndScreenWipe)(void) { INT32 texsize = 2048; - boolean firstTime = (endScreenWipe == 0); // Use a power of two texture, dammit if(screen_width <= 512) @@ -2252,32 +2180,21 @@ EXPORT void HWRAPI(EndScreenWipe)(void) texsize = 1024; // Create screen texture - if (firstTime) - endScreenWipe = SCRTEX_ENDSCREENWIPE; pglBindTexture(GL_TEXTURE_2D, endScreenWipe); - - if (firstTime) - { #ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); #else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif - Clamp2D(GL_TEXTURE_WRAP_S); - Clamp2D(GL_TEXTURE_WRAP_T); + Clamp2D(GL_TEXTURE_WRAP_S); + Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); -#endif - } - else -#ifndef KOS_GL_COMPATIBILITY - pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif - - tex_downloaded = endScreenWipe; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } @@ -2319,7 +2236,7 @@ EXPORT void HWRAPI(DrawIntermissionBG)(void) pglEnd(); - tex_downloaded = screentexture; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } // Do screen fades! @@ -2410,7 +2327,6 @@ EXPORT void HWRAPI(DoScreenWipe)(float alpha) pglDisable(GL_TEXTURE_2D); // disable the texture in the 2nd texture unit pglActiveTexture(GL_TEXTURE0); - tex_downloaded = endScreenWipe; } else { @@ -2436,10 +2352,11 @@ EXPORT void HWRAPI(DoScreenWipe)(float alpha) pglTexCoord2f(xfix, 0.0f); pglVertex3f(1.0f, -1.0f, 1.0f); pglEnd(); - tex_downloaded = endScreenWipe; #ifndef MINI_GL_COMPATIBILITY } #endif + + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } @@ -2447,7 +2364,6 @@ EXPORT void HWRAPI(DoScreenWipe)(float alpha) EXPORT void HWRAPI(MakeScreenTexture) (void) { INT32 texsize = 2048; - boolean firstTime = (screentexture == 0); // Use a power of two texture, dammit if(screen_width <= 512) @@ -2456,37 +2372,26 @@ EXPORT void HWRAPI(MakeScreenTexture) (void) texsize = 1024; // Create screen texture - if (firstTime) - screentexture = SCRTEX_SCREENTEXTURE; pglBindTexture(GL_TEXTURE_2D, screentexture); - - if (firstTime) - { #ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); #else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif - Clamp2D(GL_TEXTURE_WRAP_S); - Clamp2D(GL_TEXTURE_WRAP_T); + Clamp2D(GL_TEXTURE_WRAP_S); + Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); -#endif - } - else -#ifndef KOS_GL_COMPATIBILITY - pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif - tex_downloaded = screentexture; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } EXPORT void HWRAPI(MakeScreenFinalTexture) (void) { INT32 texsize = 2048; - boolean firstTime = (finalScreenTexture == 0); // Use a power of two texture, dammit if(screen_width <= 512) @@ -2495,40 +2400,27 @@ EXPORT void HWRAPI(MakeScreenFinalTexture) (void) texsize = 1024; // Create screen texture - if (firstTime) - finalScreenTexture = SCRTEX_FINALSCREENTEXTURE; pglBindTexture(GL_TEXTURE_2D, finalScreenTexture); - - if (firstTime) - { #ifdef KOS_GL_COMPATIBILITY - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_FILTER_NONE); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_FILTER_NONE); #else - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + pglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); #endif - Clamp2D(GL_TEXTURE_WRAP_S); - Clamp2D(GL_TEXTURE_WRAP_T); + Clamp2D(GL_TEXTURE_WRAP_S); + Clamp2D(GL_TEXTURE_WRAP_T); #ifndef KOS_GL_COMPATIBILITY - pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); -#endif - } - else -#ifndef KOS_GL_COMPATIBILITY - pglCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, texsize, texsize); + pglCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, texsize, texsize, 0); #endif - tex_downloaded = finalScreenTexture; + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) { float xfix, yfix; - float origaspect, newaspect; - float xoff = 1, yoff = 1; // xoffset and yoffset for the polygon to have black bars around the screen - FRGBAFloat clearColour; INT32 texsize = 2048; if(screen_width <= 1024) @@ -2539,47 +2431,35 @@ EXPORT void HWRAPI(DrawScreenFinalTexture)(int width, int height) xfix = 1/((float)(texsize)/((float)((screen_width)))); yfix = 1/((float)(texsize)/((float)((screen_height)))); - origaspect = (float)screen_width / screen_height; - newaspect = (float)width / height; - if (origaspect < newaspect) - { - xoff = origaspect / newaspect; - yoff = 1; - } - else if (origaspect > newaspect) - { - xoff = 1; - yoff = newaspect / origaspect; - } - + //pglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); pglViewport(0, 0, width, height); - clearColour.red = clearColour.green = clearColour.blue = 0; - clearColour.alpha = 1; - ClearBuffer(true, false, &clearColour); pglBindTexture(GL_TEXTURE_2D, finalScreenTexture); pglBegin(GL_QUADS); pglColor4f(1.0f, 1.0f, 1.0f, 1.0f); // Bottom left pglTexCoord2f(0.0f, 0.0f); - pglVertex3f(-xoff, -yoff, 1.0f); + pglVertex3f(-1, -1, 1.0f); // Top left pglTexCoord2f(0.0f, yfix); - pglVertex3f(-xoff, yoff, 1.0f); + pglVertex3f(-1, 1, 1.0f); // Top right pglTexCoord2f(xfix, yfix); - pglVertex3f(xoff, yoff, 1.0f); + pglVertex3f(1, 1, 1.0f); // Bottom right pglTexCoord2f(xfix, 0.0f); - pglVertex3f(xoff, -yoff, 1.0f); + pglVertex3f(1, -1, 1.0f); pglEnd(); - tex_downloaded = finalScreenTexture; + SetModelView(screen_width, screen_height); + SetStates(); + + tex_downloaded = 0; // 0 so it knows it doesn't have any of the cached patches downloaded right now } #endif //HWRENDER diff --git a/src/lua_script.c b/src/lua_script.c index 7ed30367b..b9c61ff97 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -479,10 +479,10 @@ static const struct { {NULL, ARCH_NULL} }; -static UINT8 GetUserdataArchType(int index) +static UINT8 GetUserdataArchType(void) { UINT8 i; - lua_getmetatable(gL, index); + lua_getmetatable(gL, -1); for (i = 0; meta2arch[i].meta; i++) { @@ -561,7 +561,7 @@ static UINT8 ArchiveValue(int TABLESINDEX, int myindex) break; } case LUA_TUSERDATA: - switch (GetUserdataArchType(myindex)) + switch (GetUserdataArchType()) { case ARCH_MOBJINFO: { @@ -768,25 +768,16 @@ static void ArchiveTables(void) lua_pushnil(gL); while (lua_next(gL, -2)) { - // Write key - e = ArchiveValue(TABLESINDEX, -2); // key should be either a number or a string, ArchiveValue can handle this. - if (e == 2) // invalid key type (function, thread, lightuserdata, or anything we don't recognise) - { - lua_pushvalue(gL, -2); - CONS_Alert(CONS_ERROR, "Index '%s' (%s) of table %d could not be archived!\n", lua_tostring(gL, -1), luaL_typename(gL, -1), i); - lua_pop(gL, 1); - } - // Write value + ArchiveValue(TABLESINDEX, -2); // key should be either a number or a string, ArchiveValue can handle this. e = ArchiveValue(TABLESINDEX, -1); if (e == 1) n++; // the table contained a new table we'll have to archive. :( - else if (e == 2) // invalid value type + else if (e == 2) { lua_pushvalue(gL, -2); CONS_Alert(CONS_ERROR, "Type of value for table %d entry '%s' (%s) could not be archived!\n", i, lua_tostring(gL, -1), luaL_typename(gL, -1)); lua_pop(gL, 1); } - lua_pop(gL, 1); } lua_pop(gL, 1); @@ -922,17 +913,11 @@ static void UnArchiveTables(void) lua_rawgeti(gL, TABLESINDEX, i); while (true) { - if (UnArchiveValue(TABLESINDEX) == 1) // read key + if (UnArchiveValue(TABLESINDEX) == 1) break; - if (UnArchiveValue(TABLESINDEX) == 2) // read value + if (UnArchiveValue(TABLESINDEX) == 2) n++; - if (lua_isnil(gL, -2)) // if key is nil (if a function etc was accidentally saved) - { - CONS_Alert(CONS_ERROR, "A nil key in table %d was found! (Invalid key type or corrupted save?)\n", i); - lua_pop(gL, 2); // pop key and value instead of setting them in the table, to prevent Lua panic errors - } - else - lua_rawset(gL, -3); + lua_rawset(gL, -3); } lua_pop(gL, 1); } diff --git a/src/m_menu.c b/src/m_menu.c index e7375a8d9..007ea1d9c 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1129,6 +1129,7 @@ static menuitem_t OP_MoveControlsMenu[] = {IT_CALL | IT_STRING2, NULL, "Use/Throw Item", M_ChangeControl, gc_fire }, {IT_CALL | IT_STRING2, NULL, "Look Backward", M_ChangeControl, gc_lookback }, + {IT_CALL | IT_STRING2, NULL, "Toggle Chasecam", M_ChangeControl, gc_camtoggle }, {IT_CALL | IT_STRING2, NULL, "Talk key", M_ChangeControl, gc_talkkey }, {IT_CALL | IT_STRING2, NULL, "Team-Talk key", M_ChangeControl, gc_teamkey }, {IT_CALL | IT_STRING2, NULL, "Rankings/Scores", M_ChangeControl, gc_scores }, @@ -1136,8 +1137,8 @@ static menuitem_t OP_MoveControlsMenu[] = {IT_CALL | IT_STRING2, NULL, "Pause", M_ChangeControl, gc_pause }, {IT_CALL | IT_STRING2, NULL, "Console", M_ChangeControl, gc_console }, - {IT_SUBMENU | IT_STRING, NULL, "Spectator Controls...", &OP_SpectateControlsDef, 112}, - {IT_SUBMENU | IT_STRING, NULL, "Custom Lua Actions...", &OP_CustomControlsDef, 120}, + {IT_SUBMENU | IT_STRING, NULL, "Spectator Controls...",&OP_SpectateControlsDef,120}, + {IT_SUBMENU | IT_STRING, NULL, "Custom Actions...", &OP_CustomControlsDef, 128}, }; static menuitem_t OP_SpectateControlsMenu[] = @@ -1146,8 +1147,6 @@ static menuitem_t OP_SpectateControlsMenu[] = {IT_CALL | IT_STRING2, NULL, "Look Up", M_ChangeControl, gc_lookup }, {IT_CALL | IT_STRING2, NULL, "Look Down", M_ChangeControl, gc_lookdown }, {IT_CALL | IT_STRING2, NULL, "Center View", M_ChangeControl, gc_centerview}, - {IT_CALL | IT_STRING2, NULL, "Reset Camera", M_ChangeControl, gc_camreset }, - {IT_CALL | IT_STRING2, NULL, "Toggle Chasecam", M_ChangeControl, gc_camtoggle }, }; static menuitem_t OP_CustomControlsMenu[] = @@ -6711,13 +6710,6 @@ static void M_DrawConnectIPMenu(void) static void M_ConnectIP(INT32 choice) { (void)choice; - - if (*setupm_ip == 0) - { - M_StartMessage("You must specify an IP address.\n", NULL, MM_NOTHING); - return; - } - COM_BufAddText(va("connect \"%s\"\n", setupm_ip)); // A little "please wait" message. @@ -7382,12 +7374,13 @@ static void M_Setup1PControlsMenu(INT32 choice) setupcontrols = gamecontrol; // was called from main Options (for console player, then) currentMenu->lastOn = itemOn; - // Unhide P1-only controls - OP_MoveControlsMenu[9].status = IT_CALL|IT_STRING2; // Talk - OP_MoveControlsMenu[10].status = IT_CALL|IT_STRING2; // Team talk - OP_MoveControlsMenu[11].status = IT_CALL|IT_STRING2; // Rankings - OP_MoveControlsMenu[12].status = IT_CALL|IT_STRING2; // Pause - OP_MoveControlsMenu[13].status = IT_CALL|IT_STRING2; // Console + // Unhide the three non-P2 controls + OP_MoveControlsMenu[12].status = IT_CALL|IT_STRING2; + OP_MoveControlsMenu[13].status = IT_CALL|IT_STRING2; + OP_MoveControlsMenu[14].status = IT_CALL|IT_STRING2; + // Unide the pause/console controls too + OP_MoveControlsMenu[10].status = IT_CALL|IT_STRING2; + OP_MoveControlsMenu[11].status = IT_CALL|IT_STRING2; OP_MoveControlsDef.prevMenu = &OP_P1ControlsDef; M_SetupNextMenu(&OP_MoveControlsDef); @@ -7402,12 +7395,13 @@ static void M_Setup2PControlsMenu(INT32 choice) setupcontrols = gamecontrolbis; currentMenu->lastOn = itemOn; - // Hide P1-only controls - OP_MoveControlsMenu[9].status = IT_GRAYEDOUT2; // Talk - OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; // Team talk - OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; // Rankings - OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; // Pause - OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; // Console + // Hide the three non-P2 controls + OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[14].status = IT_GRAYEDOUT2; + // Hide the pause/console controls too + OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; OP_MoveControlsDef.prevMenu = &OP_P2ControlsDef; M_SetupNextMenu(&OP_MoveControlsDef); @@ -7423,12 +7417,13 @@ static void M_Setup3PControlsMenu(INT32 choice) setupcontrols = gamecontrol3; currentMenu->lastOn = itemOn; - // Hide P1-only controls - OP_MoveControlsMenu[9].status = IT_GRAYEDOUT2; // Talk - OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; // Team talk - OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; // Rankings - OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; // Pause - OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; // Console + // Hide the three non-P3 controls + OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[14].status = IT_GRAYEDOUT2; + // Hide the pause/console controls too + OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; OP_MoveControlsDef.prevMenu = &OP_P3ControlsDef; M_SetupNextMenu(&OP_MoveControlsDef); @@ -7443,12 +7438,13 @@ static void M_Setup4PControlsMenu(INT32 choice) setupcontrols = gamecontrol4; currentMenu->lastOn = itemOn; - // Hide P1-only controls - OP_MoveControlsMenu[9].status = IT_GRAYEDOUT2; // Talk - OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; // Team talk - OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; // Rankings - OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; // Pause - OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; // Console + // Hide the three non-P4 controls + OP_MoveControlsMenu[12].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[13].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[14].status = IT_GRAYEDOUT2; + // Hide the pause/console controls too + OP_MoveControlsMenu[10].status = IT_GRAYEDOUT2; + OP_MoveControlsMenu[11].status = IT_GRAYEDOUT2; OP_MoveControlsDef.prevMenu = &OP_P4ControlsDef; M_SetupNextMenu(&OP_MoveControlsDef); diff --git a/src/m_misc.c b/src/m_misc.c index 573354f09..0d0be0f67 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -644,12 +644,13 @@ static void M_PNGhdr(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png_ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png_byte movie) { #ifdef PNG_TEXT_SUPPORTED -#define SRB2PNGTXT 10 //PNG_KEYWORD_MAX_LENGTH(79) is the max +#define SRB2PNGTXT 11 //PNG_KEYWORD_MAX_LENGTH(79) is the max png_text png_infotext[SRB2PNGTXT]; char keytxt[SRB2PNGTXT][12] = { - "Title", "Description", "Playername", "Mapnum", "Mapname", + "Title", "Author", "Description", "Playername", "Mapnum", "Mapname", "Location", "Interface", "Revision", "Build Date", "Build Time"}; char titletxt[] = "SRB2Kart " VERSIONSTRING; + png_charp authortxt = I_GetUserName(); png_charp playertxt = cv_playername.zstring; char desctxt[] = "SRB2Kart Screenshot"; char Movietxt[] = "SRB2Kart Movie"; @@ -700,18 +701,19 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png png_infotext[i].key = keytxt[i]; png_infotext[0].text = titletxt; + png_infotext[1].text = authortxt; if (movie) - png_infotext[1].text = Movietxt; + png_infotext[2].text = Movietxt; else - png_infotext[1].text = desctxt; - png_infotext[2].text = playertxt; - png_infotext[3].text = maptext; - png_infotext[4].text = lvlttltext; - png_infotext[5].text = locationtxt; - png_infotext[6].text = interfacetxt; - png_infotext[7].text = strncpy(ctrevision, comprevision, sizeof(ctrevision)-1); - png_infotext[8].text = strncpy(ctdate, compdate, sizeof(ctdate)-1); - png_infotext[9].text = strncpy(cttime, comptime, sizeof(cttime)-1); + png_infotext[2].text = desctxt; + png_infotext[3].text = playertxt; + png_infotext[4].text = maptext; + png_infotext[5].text = lvlttltext; + png_infotext[6].text = locationtxt; + png_infotext[7].text = interfacetxt; + png_infotext[8].text = strncpy(ctrevision, comprevision, sizeof(ctrevision)-1); + png_infotext[9].text = strncpy(ctdate, compdate, sizeof(ctdate)-1); + png_infotext[10].text = strncpy(cttime, comptime, sizeof(cttime)-1); png_set_text(png_ptr, png_info_ptr, png_infotext, SRB2PNGTXT); #undef SRB2PNGTXT diff --git a/src/p_setup.c b/src/p_setup.c index 3071b224c..1986380da 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2629,7 +2629,6 @@ boolean P_SetupLevel(boolean skipprecip) { tic_t starttime = I_GetTime(); tic_t endtime = starttime + (3*TICRATE)/2; - tic_t nowtime; S_StartSound(NULL, sfx_s3kaf); @@ -2639,17 +2638,9 @@ boolean P_SetupLevel(boolean skipprecip) F_WipeEndScreen(); F_RunWipe(wipedefs[wipe_speclevel_towhite], false); - nowtime = lastwipetic; // Hold on white for extra effect. - while (nowtime < endtime) - { - // wait loop - while (!((nowtime = I_GetTime()) - lastwipetic)) - I_Sleep(); - lastwipetic = nowtime; - if (moviemode) // make sure we save frames for the white hold too - M_SaveFrame(); - } + while (I_GetTime() < endtime) + I_Sleep(); ranspecialwipe = 1; } diff --git a/src/r_things.h b/src/r_things.h index 347f204f7..7a9729a3e 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -69,7 +69,7 @@ void R_DrawMasked(void); #define DEFAULTSKIN "sonic" #define DEFAULTSKIN2 "tails" // secondary player #define DEFAULTSKIN3 "knuckles" // third player -#define DEFAULTSKIN4 "eggman" // fourth player +#define DEFAULTSKIN4 "metalsonic" // fourth player typedef struct { diff --git a/src/sdl/hwsym_sdl.c b/src/sdl/hwsym_sdl.c index 05ac6450e..f4686d2bf 100644 --- a/src/sdl/hwsym_sdl.c +++ b/src/sdl/hwsym_sdl.c @@ -94,7 +94,6 @@ void *hwSym(const char *funcName,void *handle) #ifdef SHUFFLE GETFUNC(PostImgRedraw); #endif //SHUFFLE - GETFUNC(FlushScreenTextures); GETFUNC(StartScreenWipe); GETFUNC(EndScreenWipe); GETFUNC(DoScreenWipe); diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 3575afa87..9ee17cc31 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -3371,7 +3371,7 @@ const char *I_LocateWad(void) return waddir; } -#ifdef __linux__ +#if defined(LINUX) || defined(LINUX64) #define MEMINFO_FILE "/proc/meminfo" #define MEMTOTAL "MemTotal:" #define MEMFREE "MemFree:" @@ -3391,23 +3391,20 @@ UINT32 I_GetFreeMem(UINT32 *total) }; if ((kd = kvm_open(NULL, NULL, NULL, O_RDONLY, "kvm_open")) == NULL) { - if (total) - *total = 0L; + *total = 0L; return 0; } if (kvm_nlist(kd, namelist) != 0) { kvm_close (kd); - if (total) - *total = 0L; + *total = 0L; return 0; } if (kvm_read(kd, namelist[X_SUM].n_value, &sum, sizeof (sum)) != sizeof (sum)) { kvm_close(kd); - if (total) - *total = 0L; + *total = 0L; return 0; } kvm_close(kd); @@ -3438,7 +3435,7 @@ UINT32 I_GetFreeMem(UINT32 *total) (PVOID) &pr_arena, sizeof (UINT32)); return pr_arena; -#elif defined (__linux__) +#elif defined (LINUX) || defined (LINUX64) /* Linux */ char buf[1024]; char *memTag; @@ -3454,28 +3451,25 @@ UINT32 I_GetFreeMem(UINT32 *total) if (n < 0) { // Error - if (total) - *total = 0L; + *total = 0L; return 0; } buf[n] = '\0'; - if ((memTag = strstr(buf, MEMTOTAL)) == NULL) + if (NULL == (memTag = strstr(buf, MEMTOTAL))) { // Error - if (total) - *total = 0L; + *total = 0L; return 0; } memTag += sizeof (MEMTOTAL); totalKBytes = atoi(memTag); - if ((memTag = strstr(buf, MEMFREE)) == NULL) + if (NULL == (memTag = strstr(buf, MEMFREE))) { // Error - if (total) - *total = 0L; + *total = 0L; return 0; } @@ -3490,7 +3484,7 @@ UINT32 I_GetFreeMem(UINT32 *total) if (total) *total = 48<<20; return 48<<20; -#endif +#endif /* LINUX */ } const CPUInfoFlags *I_CPUInfo(void) diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c index df8af61bf..121033496 100644 --- a/src/sdl/i_video.c +++ b/src/sdl/i_video.c @@ -1506,7 +1506,6 @@ void I_StartupGraphics(void) #ifdef SHUFFLE HWD.pfnPostImgRedraw = hwSym("PostImgRedraw",NULL); #endif - HWD.pfnFlushScreenTextures=hwSym("FlushScreenTextures",NULL); HWD.pfnStartScreenWipe = hwSym("StartScreenWipe",NULL); HWD.pfnEndScreenWipe = hwSym("EndScreenWipe",NULL); HWD.pfnDoScreenWipe = hwSym("DoScreenWipe",NULL); diff --git a/src/sdl/ogl_sdl.c b/src/sdl/ogl_sdl.c index 4347b35b2..cd7ced7ca 100644 --- a/src/sdl/ogl_sdl.c +++ b/src/sdl/ogl_sdl.c @@ -214,11 +214,8 @@ void OglSdlFinishUpdate(boolean waitvbl) HWR_DrawScreenFinalTexture(sdlw, sdlh); SDL_GL_SwapWindow(window); - GClipRect(0, 0, realwidth, realheight, NZCLIP_PLANE); - - // Sryder: We need to draw the final screen texture again into the other buffer in the original position so that - // effects that want to take the old screen can do so after this - HWR_DrawScreenFinalTexture(realwidth, realheight); + SetModelView(realwidth, realheight); + SetStates(); } EXPORT void HWRAPI( OglSdlSetPalette) (RGBA_t *palette, RGBA_t *pgamma) diff --git a/src/sdl/sdl_sound.c b/src/sdl/sdl_sound.c index bc98ee2f9..3e8372674 100644 --- a/src/sdl/sdl_sound.c +++ b/src/sdl/sdl_sound.c @@ -1180,6 +1180,12 @@ void I_StartupSound(void) audio.callback = I_UpdateStream; audio.userdata = &localdata; + if (dedicated) + { + nosound = nomidimusic = nodigimusic = true; + return; + } + // Configure sound device CONS_Printf("I_StartupSound:\n"); @@ -1475,6 +1481,9 @@ void I_InitMusic(void) I_AddExitFunc(I_ShutdownGMEMusic); #endif + if ((nomidimusic && nodigimusic) || dedicated) + return; + #ifdef HAVE_MIXER MIX_VERSION(&MIXcompiled) MIXlinked = Mix_Linked_Version(); diff --git a/src/sdl12/hwsym_sdl.c b/src/sdl12/hwsym_sdl.c index 49340138f..54f5da3a0 100644 --- a/src/sdl12/hwsym_sdl.c +++ b/src/sdl12/hwsym_sdl.c @@ -100,7 +100,6 @@ void *hwSym(const char *funcName,void *handle) #ifdef SHUFFLE GETFUNC(PostImgRedraw); #endif //SHUFFLE - GETFUNC(FlushScreenTextures); GETFUNC(StartScreenWipe); GETFUNC(EndScreenWipe); GETFUNC(DoScreenWipe); diff --git a/src/sdl12/i_video.c b/src/sdl12/i_video.c index f44b60c82..8754587af 100644 --- a/src/sdl12/i_video.c +++ b/src/sdl12/i_video.c @@ -1972,7 +1972,6 @@ void I_StartupGraphics(void) #ifdef SHUFFLE HWD.pfnPostImgRedraw = hwSym("PostImgRedraw",NULL); #endif - HWD.pfnFlushScreenTextures=hwSym("FlushScreenTextures",NULL); HWD.pfnStartScreenWipe = hwSym("StartScreenWipe",NULL); HWD.pfnEndScreenWipe = hwSym("EndScreenWipe",NULL); HWD.pfnDoScreenWipe = hwSym("DoScreenWipe",NULL); diff --git a/src/v_video.c b/src/v_video.c index 801a577f1..68998139b 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -943,6 +943,14 @@ void V_DrawPatchFill(patch_t *pat) INT32 dupz = (vid.dupx < vid.dupy ? vid.dupx : vid.dupy); INT32 x, y, pw = SHORT(pat->width) * dupz, ph = SHORT(pat->height) * dupz; +#ifdef HWRENDER + if (rendermode == render_opengl) + { + pw = FixedMul(SHORT(pat->width)*FRACUNIT, vid.fdupx)>>FRACBITS; + ph = FixedMul(SHORT(pat->height)*FRACUNIT, vid.fdupy)>>FRACBITS; + } +#endif + for (x = 0; x < vid.width; x += pw) { for (y = 0; y < vid.height; y += ph) diff --git a/src/win32/win_dll.c b/src/win32/win_dll.c index c9b3fba4e..8fa4d17f7 100644 --- a/src/win32/win_dll.c +++ b/src/win32/win_dll.c @@ -117,7 +117,6 @@ static loadfunc_t hwdFuncTable[] = { #ifdef SHUFFLE {"PostImgRedraw@4", &hwdriver.pfnPostImgRedraw}, #endif - {"FlushScreenTextures@0",&hwdriver.pfnFlushScreenTextures}, {"StartScreenWipe@0", &hwdriver.pfnStartScreenWipe}, {"EndScreenWipe@0", &hwdriver.pfnEndScreenWipe}, {"DoScreenWipe@4", &hwdriver.pfnDoScreenWipe}, @@ -148,7 +147,6 @@ static loadfunc_t hwdFuncTable[] = { #ifdef SHUFFLE {"PostImgRedraw", &hwdriver.pfnPostImgRedraw}, #endif - {"FlushScreenTextures"},&hwdriver.pfnFlushScreenTextures}, {"StartScreenWipe", &hwdriver.pfnStartScreenWipe}, {"EndScreenWipe", &hwdriver.pfnEndScreenWipe}, {"DoScreenWipe", &hwdriver.pfnDoScreenWipe}, From 64c8423897d6b20544c24658acc0a1e3e34b1120 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 4 Jun 2018 22:53:45 -0400 Subject: [PATCH 35/51] We did it, we finally fixed... The Shell Boost Bug Instead of adding to your speed, it relatively multiplies it if you're above your top speed. This is applied to ALL of Kart projectiles as well, not just shells. May we never run into our own shell that we threw on a boost pad ever again. --- src/k_kart.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9461cd467..d6eea1104 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1767,6 +1767,7 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle mobj_t *th; angle_t an; fixed_t x, y, z; + fixed_t finalspeed = speed; mobj_t *throwmo; //INT32 dir; @@ -1778,8 +1779,11 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle //else // dir = 1; - x = source->x + source->momx; - y = source->y + source->momy; + if (source->player && source->player->speed > K_GetKartSpeed(source->player, false)) + finalspeed = FixedMul(speed, FixedDiv(source->player->speed, K_GetKartSpeed(source->player, false))); + + x = source->x + source->momx + FixedMul(finalspeed, FINECOSINE(an>>ANGLETOFINESHIFT)); + y = source->y + source->momy + FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT)); z = source->z; // spawn on the ground please if (P_MobjFlip(source) < 0) @@ -1821,11 +1825,11 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t angle } th->angle = an; - th->momx = FixedMul(speed, FINECOSINE(an>>ANGLETOFINESHIFT)); - th->momy = FixedMul(speed, FINESINE(an>>ANGLETOFINESHIFT)); + th->momx = FixedMul(finalspeed, FINECOSINE(an>>ANGLETOFINESHIFT)); + th->momy = FixedMul(finalspeed, FINESINE(an>>ANGLETOFINESHIFT)); x = x + P_ReturnThrustX(source, an, source->radius + th->radius); - x = y + P_ReturnThrustY(source, an, source->radius + th->radius); + y = y + P_ReturnThrustY(source, an, source->radius + th->radius); throwmo = P_SpawnMobj(x, y, z, MT_FIREDITEM); throwmo->movecount = 1; throwmo->movedir = source->angle - an; @@ -1977,7 +1981,7 @@ static mobj_t *K_ThrowKartItem(player_t *player, boolean missile, mobjtype_t map else { // Shoot forward - mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED + player->speed); + mo = K_SpawnKartMissile(player->mo, mapthing, player->mo->angle, 0, PROJSPEED); } } } From d9998d94fb92a95eadf299fee6a804845e7917c2 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 4 Jun 2018 22:56:58 -0400 Subject: [PATCH 36/51] Disable weather in netgames Some people like to lag up the whole server by enabling precip, so y'know what, just turn it off in netgames. Weather can just stay a Record Attack/splitscreen only feature now I guess --- src/p_mobj.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/p_mobj.c b/src/p_mobj.c index a77b97b7e..479c8f996 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -9169,7 +9169,8 @@ void P_SpawnPrecipitation(void) subsector_t *precipsector = NULL; precipmobj_t *rainmo = NULL; - if (dedicated || !cv_precipdensity.value || curWeather == PRECIP_NONE) + if (dedicated || !cv_precipdensity.value || curWeather == PRECIP_NONE + || netgame) // SRB2Kart return; // Use the blockmap to narrow down our placing patterns From 3289f4aab539397843263deb30b8990118994bd4 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Mon, 4 Jun 2018 23:23:52 -0400 Subject: [PATCH 37/51] MFE_JUSTBOUNCEDWALL Hopefully, this should prevent instances where shells/Oni get caught on walls. --- src/dehacked.c | 2 +- src/p_map.c | 9 ++++++++- src/p_mobj.c | 2 +- src/p_mobj.h | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 71d1d8f4c..0196806a7 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7306,7 +7306,7 @@ static const char *const MOBJEFLAG_LIST[] = { "JUSTSTEPPEDDOWN", // used for ramp sectors "VERTICALFLIP", // Vertically flip sprite/allow upside-down physics "GOOWATER", // Goo water - "\x01", // free: 1<<7 (name un-matchable) + "JUSTBOUNCEDWALL", // SRB2Kart: Mobj already bounced off a wall this tic "SPRUNG", // Mobj was already sprung this tic "APPLYPMOMZ", // Platform movement NULL diff --git a/src/p_map.c b/src/p_map.c index 16a3838b6..ece49f260 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3886,6 +3886,12 @@ void P_BounceMove(mobj_t *mo) //INT32 hitcount; fixed_t mmomx = 0, mmomy = 0; + if (mo->eflags & MFE_JUSTBOUNCEDWALL) + { + P_SlideMove(mo, true); + return; + } + slidemo = mo; //hitcount = 0; @@ -4018,7 +4024,8 @@ bounceback: } } - P_HitBounceLine(bestslideline); // clip the moves + P_HitBounceLine(bestslideline); + mo->eflags |= MFE_JUSTBOUNCEDWALL; mo->momx = tmxmove; mo->momy = tmymove; diff --git a/src/p_mobj.c b/src/p_mobj.c index 479c8f996..2ba98af03 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6407,7 +6407,7 @@ void P_MobjThinker(mobj_t *mobj) P_SetTarget(&mobj->tracer, NULL); mobj->flags2 &= ~MF2_PUSHED; - mobj->eflags &= ~MFE_SPRUNG; + mobj->eflags &= ~(MFE_SPRUNG|MFE_JUSTBOUNCEDWALL); tmfloorthing = tmhitthing = NULL; diff --git a/src/p_mobj.h b/src/p_mobj.h index 3617ea407..01171a57f 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -233,7 +233,8 @@ typedef enum MFE_VERTICALFLIP = 1<<5, // Goo water MFE_GOOWATER = 1<<6, - // free: to and including 1<<7 + // SRB2Kart: The mobj just hit & bounced off a wall, this is cleared on next frame + MFE_JUSTBOUNCEDWALL = 1<<7, // Mobj was already sprung this tic MFE_SPRUNG = 1<<8, // Platform movement From a1fad489c625b7a4984d46874da578aac0f4e3b2 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 5 Jun 2018 01:34:05 -0400 Subject: [PATCH 38/51] actnum is now a 2 character long string For Cloud Cradle Zone, Act K --- src/d_clisrv.c | 11 ++++++----- src/d_netcmd.c | 16 +++++++++++++--- src/dehacked.c | 6 ++++-- src/doomstat.h | 2 +- src/g_game.c | 11 +++++++---- src/lua_maplib.c | 2 +- src/m_menu.c | 18 +++++++++--------- src/m_misc.c | 4 ++-- src/p_setup.c | 10 +++++----- src/st_stuff.c | 15 ++++++--------- src/v_video.c | 4 ++-- src/y_inter.c | 20 ++++++++++---------- 12 files changed, 66 insertions(+), 53 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 9190853ee..fd4b2d158 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1319,7 +1319,7 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime) else netbuffer->u.serverinfo.iszone = 0; - netbuffer->u.serverinfo.actnum = mapheaderinfo[gamemap-1]->actnum; + netbuffer->u.serverinfo.actnum = 0; //mapheaderinfo[gamemap-1]->actnum p = PutFileNeeded(); @@ -1636,15 +1636,16 @@ static void CL_LoadReceivedSavegame(void) if (P_LoadNetGame()) { - const INT32 actnum = mapheaderinfo[gamemap-1]->actnum; CONS_Printf(M_GetText("Map is now \"%s"), G_BuildMapName(gamemap)); if (strcmp(mapheaderinfo[gamemap-1]->lvlttl, "")) { CONS_Printf(": %s", mapheaderinfo[gamemap-1]->lvlttl); - if (!(mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE)) + if (strcmp(mapheaderinfo[gamemap-1]->zonttl, "")) + CONS_Printf(" %s", mapheaderinfo[gamemap-1]->zonttl); + else if (!(mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE)) CONS_Printf(M_GetText(" ZONE")); - if (actnum > 0) - CONS_Printf(" %2d", actnum); + if (strcmp(mapheaderinfo[gamemap-1]->actnum, "")) + CONS_Printf(" %s", mapheaderinfo[gamemap-1]->actnum); } CONS_Printf("\"\n"); } diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 02c12fcd1..276cc1d00 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4523,10 +4523,20 @@ static void Command_Showmap_f(void) { if (gamestate == GS_LEVEL) { - if (mapheaderinfo[gamemap-1]->actnum) - CONS_Printf("%s (%d): %s %d\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum); + if (mapheaderinfo[gamemap-1]->zonttl) + { + if (mapheaderinfo[gamemap-1]->actnum) + CONS_Printf("%s (%d): %s %s %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl, mapheaderinfo[gamemap-1]->actnum); + else + CONS_Printf("%s (%d): %s %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl); + } else - CONS_Printf("%s (%d): %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl); + { + if (mapheaderinfo[gamemap-1]->actnum) + CONS_Printf("%s (%d): %s %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum); + else + CONS_Printf("%s (%d): %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl); + } } else CONS_Printf(M_GetText("You must be in a level to use this.\n")); diff --git a/src/dehacked.c b/src/dehacked.c index 0196806a7..be3c2d754 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -1136,10 +1136,12 @@ static void readlevelheader(MYFILE *f, INT32 num) } else if (fastcmp(word, "ACT")) { - if (i >= 0 && i < 20) // 0 for no act number, TTL1 through TTL19 + /*if (i >= 0 && i < 20) // 0 for no act number, TTL1 through TTL19 mapheaderinfo[num-1]->actnum = (UINT8)i; else - deh_warning("Level header %d: invalid act number %d", num, i); + deh_warning("Level header %d: invalid act number %d", num, i);*/ + deh_strlcpy(mapheaderinfo[num-1]->actnum, word2, + sizeof(mapheaderinfo[num-1]->actnum), va("Level header %d: actnum", num)); } else if (fastcmp(word, "NEXTLEVEL")) { diff --git a/src/doomstat.h b/src/doomstat.h index 41a3656fc..4eb7ecdef 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -220,7 +220,7 @@ typedef struct char lvlttl[22]; ///< Level name without "Zone". (21 character limit instead of 32, 21 characters can display on screen max anyway) char subttl[33]; ///< Subtitle for level char zonttl[22]; ///< "ZONE" replacement name - UINT8 actnum; ///< Act number or 0 for none. + char actnum[3]; ///< SRB2Kart: Now a 2 character long string. UINT16 typeoflevel; ///< Combination of typeoflevel flags. INT16 nextlevel; ///< Map number of next level, or 1100-1102 to end. char musname[7]; ///< Music track to play. "" for no music. diff --git a/src/g_game.c b/src/g_game.c index 269d25f19..f9e92a4f1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4149,7 +4149,7 @@ char *G_BuildMapTitle(INT32 mapnum) { size_t len = 1; const char *zonetext = NULL; - const INT32 actnum = mapheaderinfo[mapnum-1]->actnum; + const char *actnum = NULL; len += strlen(mapheaderinfo[mapnum-1]->lvlttl); if (strcmp(mapheaderinfo[mapnum-1]->zonttl, "")) @@ -4162,14 +4162,17 @@ char *G_BuildMapTitle(INT32 mapnum) zonetext = M_GetText("ZONE"); len += strlen(zonetext) + 1; // ' ' + zonetext } - if (actnum > 0) - len += 1 + 11; // ' ' + INT32 + if (strcmp(mapheaderinfo[mapnum-1]->actnum, "")) + { + actnum = M_GetText(mapheaderinfo[mapnum-1]->actnum); + len += strlen(actnum) + 1; // ' ' + actnum + } title = Z_Malloc(len, PU_STATIC, NULL); sprintf(title, "%s", mapheaderinfo[mapnum-1]->lvlttl); if (zonetext) sprintf(title + strlen(title), " %s", zonetext); - if (actnum > 0) sprintf(title + strlen(title), " %d", actnum); + if (actnum) sprintf(title + strlen(title), " %s", actnum); } return title; diff --git a/src/lua_maplib.c b/src/lua_maplib.c index 771dd0af1..c8ff4e286 100644 --- a/src/lua_maplib.c +++ b/src/lua_maplib.c @@ -1185,7 +1185,7 @@ static int mapheaderinfo_get(lua_State *L) else if (fastcmp(field,"zonttl")) lua_pushstring(L, header->zonttl); else if (fastcmp(field,"actnum")) - lua_pushinteger(L, header->actnum); + lua_pushstring(L, header->actnum); else if (fastcmp(field,"typeoflevel")) lua_pushinteger(L, header->typeoflevel); else if (fastcmp(field,"nextlevel")) diff --git a/src/m_menu.c b/src/m_menu.c index c45e9aa53..4de30fa9c 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3373,15 +3373,15 @@ static void M_DrawPauseMenu(void) if (mapheaderinfo[gamemap-1]->zonttl) { - if (mapheaderinfo[gamemap-1]->actnum != 0) - V_DrawString(40, 28, V_YELLOWMAP, va("%s %s %d", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl, mapheaderinfo[gamemap-1]->actnum)); + if (mapheaderinfo[gamemap-1]->actnum) + V_DrawString(40, 28, V_YELLOWMAP, va("%s %s %s", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl, mapheaderinfo[gamemap-1]->actnum)); else V_DrawString(40, 28, V_YELLOWMAP, va("%s %s", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl)); } else { - if (mapheaderinfo[gamemap-1]->actnum != 0) - V_DrawString(40, 28, V_YELLOWMAP, va("%s %d", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum)); + if (mapheaderinfo[gamemap-1]->actnum) + V_DrawString(40, 28, V_YELLOWMAP, va("%s %s", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum)); else V_DrawString(40, 28, V_YELLOWMAP, mapheaderinfo[gamemap-1]->lvlttl); } @@ -4896,7 +4896,7 @@ static void M_ReadSavegameInfo(UINT32 slot) else { strcpy(savegameinfo[slot].levelname, mapheaderinfo[(fake-1) & 8191]->lvlttl); - savegameinfo[slot].actnum = mapheaderinfo[(fake-1) & 8191]->actnum; + savegameinfo[slot].actnum = 0; //mapheaderinfo[(fake-1) & 8191]->actnum } #ifdef SAVEGAMES_OTHERVERSIONS @@ -5349,15 +5349,15 @@ static void M_DrawStatsMaps(int location) if (mapheaderinfo[mnum]->zonttl) { - if (mapheaderinfo[mnum]->actnum != 0) - V_DrawString(20, y, V_YELLOWMAP, va("%s %s %d", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->zonttl, mapheaderinfo[mnum]->actnum)); + if (mapheaderinfo[mnum]->actnum) + V_DrawString(20, y, V_YELLOWMAP, va("%s %s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->zonttl, mapheaderinfo[mnum]->actnum)); else V_DrawString(20, y, V_YELLOWMAP, va("%s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->zonttl)); } else { - if (mapheaderinfo[mnum]->actnum != 0) - V_DrawString(20, y, V_YELLOWMAP, va("%s %d", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->actnum)); + if (mapheaderinfo[mnum]->actnum) + V_DrawString(20, y, V_YELLOWMAP, va("%s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->actnum)); else V_DrawString(20, y, V_YELLOWMAP, mapheaderinfo[mnum]->lvlttl); } diff --git a/src/m_misc.c b/src/m_misc.c index 573354f09..7ebf1ac35 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -679,9 +679,9 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png if (gamestate == GS_LEVEL && mapheaderinfo[gamemap-1]->lvlttl[0] != '\0') snprintf(lvlttltext, 48, "%s%s%s", mapheaderinfo[gamemap-1]->lvlttl, - (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? mapheaderinfo[gamemap-1]->zonttl : // SRB2kart + (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->zonttl) : // SRB2kart ((mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE"), - (mapheaderinfo[gamemap-1]->actnum > 0) ? va(" %d",mapheaderinfo[gamemap-1]->actnum) : ""); + (mapheaderinfo[gamemap-1]->actnum) ? va(" %s",mapheaderinfo[gamemap-1]->actnum) : ""); else snprintf(lvlttltext, 48, "Unknown"); diff --git a/src/p_setup.c b/src/p_setup.c index 3deabb762..e32d3b861 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -179,8 +179,8 @@ static void P_ClearSingleMapHeaderInfo(INT16 i) mapheaderinfo[num]->subttl[0] = '\0'; DEH_WriteUndoline("ZONETITLE", mapheaderinfo[num]->zonttl, UNDO_NONE); // SRB2kart mapheaderinfo[num]->zonttl[0] = '\0'; - DEH_WriteUndoline("ACT", va("%d", mapheaderinfo[num]->actnum), UNDO_NONE); - mapheaderinfo[num]->actnum = 0; + DEH_WriteUndoline("ACT", mapheaderinfo[num]->actnum, UNDO_NONE); // SRB2kart + mapheaderinfo[num]->actnum[0] = '\0'; DEH_WriteUndoline("TYPEOFLEVEL", va("%d", mapheaderinfo[num]->typeoflevel), UNDO_NONE); mapheaderinfo[num]->typeoflevel = 0; DEH_WriteUndoline("NEXTLEVEL", va("%d", mapheaderinfo[num]->nextlevel), UNDO_NONE); @@ -2681,9 +2681,9 @@ boolean P_SetupLevel(boolean skipprecip) V_DrawSmallString(1, 191, V_ALLOWLOWERCASE, M_GetText("Speeding off to...")); snprintf(tx, 63, "%s%s%s", mapheaderinfo[gamemap-1]->lvlttl, - (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? mapheaderinfo[gamemap-1]->zonttl : // SRB2kart + (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->zonttl) : // SRB2kart ((mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE"), - (mapheaderinfo[gamemap-1]->actnum > 0) ? va(", Act %d",mapheaderinfo[gamemap-1]->actnum) : ""); + (mapheaderinfo[gamemap-1]->actnum) ? va(", Act %s",mapheaderinfo[gamemap-1]->actnum) : ""); V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx); I_UpdateNoVsync(); } @@ -3039,7 +3039,7 @@ boolean P_SetupLevel(boolean skipprecip) if (!(netgame || multiplayer || demoplayback || demorecording || metalrecording || modeattacking || players[consoleplayer].lives <= 0) && (!modifiedgame || savemoddata) && cursaveslot >= 0 && !ultimatemode && !(mapheaderinfo[gamemap-1]->menuflags & LF2_HIDEINMENU) - && (!G_IsSpecialStage(gamemap)) && gamemap != lastmapsaved && (mapheaderinfo[gamemap-1]->actnum < 2 || gamecomplete)) + && (!G_IsSpecialStage(gamemap)) && gamemap != lastmapsaved && (/*mapheaderinfo[gamemap-1]->actnum < 2 ||*/ gamecomplete)) G_SaveGame((UINT32)cursaveslot); if (savedata.lives > 0) diff --git a/src/st_stuff.c b/src/st_stuff.c index 0e0e9749b..33f7a275b 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -77,7 +77,7 @@ static patch_t *race1; static patch_t *race2; static patch_t *race3; static patch_t *racego; -static patch_t *ttlnum; +//static patch_t *ttlnum; static patch_t *nightslink; static patch_t *count5; static patch_t *count4; @@ -753,7 +753,7 @@ static void ST_drawLevelTitle(void) char *lvlttl = mapheaderinfo[gamemap-1]->lvlttl; char *subttl = mapheaderinfo[gamemap-1]->subttl; char *zonttl = mapheaderinfo[gamemap-1]->zonttl; // SRB2kart - INT32 actnum = mapheaderinfo[gamemap-1]->actnum; + char *actnum = mapheaderinfo[gamemap-1]->actnum; INT32 lvlttlxpos; INT32 subttlxpos = BASEVIDWIDTH/2; INT32 ttlnumxpos; @@ -765,11 +765,8 @@ static void ST_drawLevelTitle(void) if (!(timeinmap > 2 && timeinmap-3 < 110)) return; - if (actnum > 0) - { - ttlnum = W_CachePatchName(va("TTL%.2d", actnum), PU_CACHE); - lvlttlxpos = ((BASEVIDWIDTH/2) - (V_LevelNameWidth(lvlttl)/2)) - SHORT(ttlnum->width); - } + if (strlen(actnum) > 0) + lvlttlxpos = ((BASEVIDWIDTH/2) - (V_LevelNameWidth(lvlttl)/2)) - V_LevelNameWidth(actnum); else lvlttlxpos = ((BASEVIDWIDTH/2) - (V_LevelNameWidth(lvlttl)/2)); @@ -801,8 +798,8 @@ static void ST_drawLevelTitle(void) default: zoney = 104; lvlttly = 80; break; } - if (actnum) - V_DrawScaledPatch(ttlnumxpos, zoney, 0, ttlnum); + if (strlen(actnum) > 0) + V_DrawLevelTitle(ttlnumxpos+12, zoney, 0, actnum); V_DrawLevelTitle(lvlttlxpos, lvlttly, 0, lvlttl); diff --git a/src/v_video.c b/src/v_video.c index 801a577f1..ac0eed177 100644 --- a/src/v_video.c +++ b/src/v_video.c @@ -1774,7 +1774,7 @@ void V_DrawLevelTitle(INT32 x, INT32 y, INT32 option, const char *string) c = toupper(c) - LT_FONTSTART; if (c < 0 || c >= LT_FONTSIZE || !lt_font[c]) { - cx += 16*dupx; + cx += 12*dupx; continue; } @@ -1805,7 +1805,7 @@ INT32 V_LevelNameWidth(const char *string) { c = toupper(string[i]) - LT_FONTSTART; if (c < 0 || c >= LT_FONTSIZE || !lt_font[c]) - w += 16; + w += 12; else w += SHORT(lt_font[c]->width); } diff --git a/src/y_inter.c b/src/y_inter.c index f18edafd4..a25038733 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -1122,10 +1122,10 @@ void Y_StartIntermission(void) data.coop.ptotal = W_CachePatchName("YB_TOTAL", PU_STATIC); // get act number - if (mapheaderinfo[prevmap]->actnum) + /*if (mapheaderinfo[prevmap]->actnum) data.coop.ttlnum = W_CachePatchName(va("TTL%.2d", mapheaderinfo[prevmap]->actnum), PU_STATIC); - else + else*/ data.coop.ttlnum = W_CachePatchName("TTL01", PU_STATIC); // get background patches @@ -1317,7 +1317,7 @@ void Y_StartIntermission(void) if (mapheaderinfo[prevmap]->actnum) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s %.32s * %d *", + "%.32s %.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->zonttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1330,7 +1330,7 @@ void Y_StartIntermission(void) if (mapheaderinfo[prevmap]->actnum) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s * %d *", + "%.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1380,7 +1380,7 @@ void Y_StartIntermission(void) if (mapheaderinfo[prevmap]->actnum) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s %.32s * %d *", + "%.32s %.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->zonttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1393,7 +1393,7 @@ void Y_StartIntermission(void) if (mapheaderinfo[prevmap]->actnum) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s * %d *", + "%.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1423,7 +1423,7 @@ void Y_StartIntermission(void) if (mapheaderinfo[prevmap]->actnum) snprintf(data.match.levelstring, sizeof data.match.levelstring, - "%.32s * %d *", + "%.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.match.levelstring, @@ -1459,7 +1459,7 @@ void Y_StartIntermission(void) if (mapheaderinfo[prevmap]->actnum) snprintf(data.competition.levelstring, sizeof data.competition.levelstring, - "%.32s * %d *", + "%.32s * %s *", mapheaderinfo[prevmap]->lvlttl, mapheaderinfo[prevmap]->actnum); else snprintf(data.competition.levelstring, @@ -2530,7 +2530,7 @@ void Y_StartVote(void) if (mapheaderinfo[votelevels[i]]->actnum) snprintf(levelinfo[i].str, sizeof levelinfo[i].str, - "%.32s %.32s %d", + "%.32s %.32s %s", mapheaderinfo[votelevels[i]]->lvlttl, mapheaderinfo[votelevels[i]]->zonttl, mapheaderinfo[votelevels[i]]->actnum); else snprintf(levelinfo[i].str, @@ -2543,7 +2543,7 @@ void Y_StartVote(void) if (mapheaderinfo[votelevels[i]]->actnum) snprintf(levelinfo[i].str, sizeof levelinfo[i].str, - "%.32s %d", + "%.32s %s", mapheaderinfo[votelevels[i]]->lvlttl, mapheaderinfo[votelevels[i]]->actnum); else snprintf(levelinfo[i].str, From 99b55ea3a18974250b375bb12879a88b6fdfe8f8 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 5 Jun 2018 02:11:47 -0400 Subject: [PATCH 39/51] Multiplayer cursors in voting --- src/y_inter.c | 61 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index a25038733..30b2a4715 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -38,6 +38,7 @@ #include "m_random.h" // P_RandomKey #include "g_input.h" // PLAYER1INPUTDOWN +#include "k_kart.h" // colortranslations #ifdef HWRENDER #include "hardware/hw_main.h" @@ -197,6 +198,10 @@ static y_voteclient voteclient; static INT32 votetic; static INT32 voteendtic = -1; static patch_t *cursor = NULL; +static patch_t *cursor1 = NULL; +static patch_t *cursor2 = NULL; +static patch_t *cursor3 = NULL; +static patch_t *cursor4 = NULL; static patch_t *randomlvl = NULL; static void Y_UnloadVoteData(void); @@ -2201,33 +2206,53 @@ void Y_VoteDrawer(void) for (j = 0; j <= splitscreen; j++) // another loop for drawing the selection backgrounds in the right order, grumble grumble.. { INT32 handy = y; + UINT8 *colormap; + patch_t *thiscurs; if (voteclient.playerinfo[j].selection != i) continue; - switch (j) + if (splitscreen == 0) { - case 1: - color = 215; - break; - case 2: - color = 127; - break; - case 3: - color = 161; - break; - default: - color = 103; - break; + thiscurs = cursor; + color = colortranslations[players[consoleplayer].skincolor][7]; + colormap = NULL; + } + else + { + switch (j) + { + case 1: + thiscurs = cursor2; + color = colortranslations[players[secondarydisplayplayer].skincolor][7]; + colormap = R_GetTranslationColormap(-1, players[secondarydisplayplayer].skincolor, GTC_CACHE); + break; + case 2: + thiscurs = cursor3; + color = colortranslations[players[thirddisplayplayer].skincolor][7]; + colormap = R_GetTranslationColormap(-1, players[thirddisplayplayer].skincolor, GTC_CACHE); + break; + case 3: + thiscurs = cursor4; + color = colortranslations[players[fourthdisplayplayer].skincolor][7]; + colormap = R_GetTranslationColormap(-1, players[fourthdisplayplayer].skincolor, GTC_CACHE); + break; + default: + thiscurs = cursor1; + color = colortranslations[players[consoleplayer].skincolor][7]; + colormap = R_GetTranslationColormap(-1, players[consoleplayer].skincolor, GTC_CACHE); + break; + } } handy += 6*(3-splitscreen) + (13*j); - V_DrawScaledPatch(BASEVIDWIDTH-124, handy, V_SNAPTORIGHT, cursor); + V_DrawMappedPatch(BASEVIDWIDTH-124, handy, V_SNAPTORIGHT, thiscurs, colormap); if (votetic % 5 == 0) V_DrawFill(BASEVIDWIDTH-100-sizeadd, y-sizeadd, 80+(sizeadd*2), 50+(sizeadd*2), 120|V_SNAPTORIGHT); else V_DrawFill(BASEVIDWIDTH-100-sizeadd, y-sizeadd, 80+(sizeadd*2), 50+(sizeadd*2), color|V_SNAPTORIGHT); + sizeadd--; } @@ -2500,6 +2525,10 @@ void Y_StartVote(void) widebgpatch = W_CachePatchName("INTERSCW", PU_STATIC); bgpatch = W_CachePatchName("INTERSCR", PU_STATIC); cursor = W_CachePatchName("M_CURSOR", PU_STATIC); + cursor1 = W_CachePatchName("P1CURSOR", PU_STATIC); + cursor2 = W_CachePatchName("P2CURSOR", PU_STATIC); + cursor3 = W_CachePatchName("P3CURSOR", PU_STATIC); + cursor4 = W_CachePatchName("P4CURSOR", PU_STATIC); randomlvl = W_CachePatchName("RANDOMLV", PU_STATIC); timer = cv_votetime.value*TICRATE; @@ -2582,6 +2611,10 @@ static void Y_UnloadVoteData(void) UNLOAD(widebgpatch); UNLOAD(bgpatch); UNLOAD(cursor); + UNLOAD(cursor1); + UNLOAD(cursor2); + UNLOAD(cursor3); + UNLOAD(cursor4); UNLOAD(randomlvl); UNLOAD(levelinfo[3].pic); From d00e29c7df839f5e7087ff17e234009197d35d9f Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 5 Jun 2018 02:41:55 -0400 Subject: [PATCH 40/51] P_RestoreMusic restores level exit music as well Splitscreen fix --- src/k_kart.c | 2 +- src/p_spec.c | 6 +++--- src/p_user.c | 19 +++++++++++++++++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index d6eea1104..06f32a9e6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4271,7 +4271,7 @@ static void K_DrawKartPositionNum(INT32 num) break; } } - else if (stplyr->laps+1 == cv_numlaps.value || stplyr->exiting) // Check for the final lap, or won + else if (stplyr->laps+1 >= cv_numlaps.value || stplyr->exiting) // Check for the final lap, or won { // Alternate frame every three frames switch (leveltime % 9) diff --git a/src/p_spec.c b/src/p_spec.c index 18314c2ea..7883a2ca7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -4210,7 +4210,9 @@ DoneSection2: if (P_IsLocalPlayer(player)) { // SRB2kart 200117 - if (!splitscreen) + if (splitscreen) + S_ChangeMusicInternal("karwin", true); + else { if (player->kartstuff[k_position] == 1) S_ChangeMusicInternal("karwin", true); @@ -4219,8 +4221,6 @@ DoneSection2: else S_ChangeMusicInternal("karok", true); } - else - S_ChangeMusicInternal("karok", true); } if (player->kartstuff[k_position] == 1) diff --git a/src/p_user.c b/src/p_user.c index 691ecee7b..80da049f5 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1165,7 +1165,21 @@ void P_RestoreMusic(player_t *player) S_SpeedMusic(1.0f); // SRB2kart - We have some different powers than vanilla, some of which tweak the music. - if (!player->exiting) + if (splitscreen != 0 && (players[consoleplayer].exiting + || players[secondarydisplayplayer].exiting + || players[thirddisplayplayer].exiting + || players[fourthdisplayplayer].exiting)) + S_ChangeMusicInternal("karwin", true); + else if (splitscreen == 0 && player->exiting) + { + if (player->kartstuff[k_position] == 1) + S_ChangeMusicInternal("karwin", true); + else if (K_IsPlayerLosing(player)) + S_ChangeMusicInternal("karlos", true); + else + S_ChangeMusicInternal("karok", true); + } + else { // Item - Mega Mushroom if (player->kartstuff[k_growshrinktimer] > 1 && player->playerstate == PST_LIVE) @@ -1176,7 +1190,7 @@ void P_RestoreMusic(player_t *player) else if (leveltime > 157) { // Event - Final Lap - if (player->laps == (UINT8)(cv_numlaps.value - 1)) + if (G_RaceGametype() && player->laps >= (UINT8)(cv_numlaps.value - 1)) S_SpeedMusic(1.2f); S_ChangeMusic(mapmusname, mapmusflags, true); } @@ -10129,3 +10143,4 @@ void P_PlayerAfterThink(player_t *player) K_KartPlayerAfterThink(player); } + From 23d83423cc7df5647c974c2a727e4e16c3ae3ea4 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 5 Jun 2018 17:12:42 -0400 Subject: [PATCH 41/51] Lots of cmd restructuring. - cmd->driftturn exists now, for figuring out how far you're turning. Added to prevent analog sticks from being able to get drift sparks faster. - Feather bounce strafing moved to use cmd->sidemove, which means it also supports analog now. - Braking now waits a few tics for you to be stopped for a few tics before it lets you go in reverse, as per Sev's request. - Removed a lot of unused/redundant/commented out control code, and reorganized some of the existing code. --- src/d_player.h | 1 + src/d_ticcmd.h | 10 +-- src/dehacked.c | 3 - src/g_game.c | 184 +++++++++++++++---------------------- src/k_kart.c | 67 +++++++------- src/lua_playerlib.c | 4 + src/p_mobj.c | 8 +- src/p_user.c | 214 +++----------------------------------------- 8 files changed, 131 insertions(+), 360 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 80e633dcd..60727fca5 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -260,6 +260,7 @@ typedef enum k_boostcharge, // Charge-up for boosting at the start of the race, or when Lakitu drops you k_jmp, // In Mario Kart, letting go of the jump button stops the drift k_offroad, // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed + k_brakestop, // Wait until you've made a complete stop for a few tics before letting brake go in reverse. 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/d_ticcmd.h b/src/d_ticcmd.h index 0a7511488..afb052ce6 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -25,18 +25,13 @@ typedef enum { BT_ACCELERATE = 1, // Accelerate - BT_DRIFT = 1<<2, // Drift (direction is cmd->angleturn) + BT_DRIFT = 1<<2, // Drift (direction is cmd->driftturn) BT_BRAKE = 1<<3, // Brake BT_ATTACK = 1<<4, // Use Item BT_FORWARD = 1<<5, // Aim Item Forward BT_BACKWARD = 1<<6, // Aim Item Backward - //BT_SPECTATE = 1<<7, // Toggle Spectate - // Want more button space? Help get rid of this hack :V - BT_DRIFTLEFT = 1<<7, // Drift left hack - BT_DRIFTRIGHT = 1<<8, // Drift right hack - - // free: 1<<9 to 1<<12 + // free: 1<<7 to 1<<12 // Lua garbage BT_CUSTOM1 = 1<<13, @@ -64,6 +59,7 @@ typedef struct INT16 angleturn; // <<16 for angle delta - saved as 1 byte into demos INT16 aiming; // vertical aiming, see G_BuildTicCmd UINT16 buttons; + INT16 driftturn; // SRB2Kart: Used for getting drift turn speed } ATTRPACK ticcmd_t; #if defined(_MSC_VER) diff --git a/src/dehacked.c b/src/dehacked.c index be3c2d754..4eb0ecd1e 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8031,9 +8031,6 @@ struct { {"BT_ATTACK",BT_ATTACK}, {"BT_FORWARD",BT_FORWARD}, {"BT_BACKWARD",BT_BACKWARD}, - //{"BT_SPECTATE",BT_SPECTATE}, - {"BT_DRIFTLEFT",BT_DRIFTLEFT}, - {"BT_DRIFTRIGHT",BT_DRIFTRIGHT}, {"BT_CUSTOM1",BT_CUSTOM1}, // Lua customizable {"BT_CUSTOM2",BT_CUSTOM2}, // Lua customizable {"BT_CUSTOM3",BT_CUSTOM3}, // Lua customizable diff --git a/src/g_game.c b/src/g_game.c index f9e92a4f1..4f41d1176 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1150,16 +1150,15 @@ angle_t localangle, localangle2, localangle3, localangle4; boolean camspin, camspin2, camspin3, camspin4; static fixed_t forwardmove[2] = {25<>16, 50<>16}; -static fixed_t sidemove[2] = {25<>16, 50<>16}; // faster! +static fixed_t sidemove[2] = {2<>16, 4<>16}; static fixed_t angleturn[3] = {400, 800, 200}; // + slow turn void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { - boolean forcestrafe = false; INT32 laim, th, tspeed, forward, side, axis; //i const INT32 speed = 1; // these ones used for multiple conditions - boolean turnleft, turnright, invertmouse, mouseaiming, lookaxis, analog, analogjoystickmove, gamepadjoystickmove, kbl, rd; + boolean turnleft, turnright, invertmouse, mouseaiming, lookaxis, analogjoystickmove, gamepadjoystickmove, kbl, rd; player_t *player; camera_t *thiscam; angle_t lang; @@ -1231,7 +1230,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) lookaxis = cv_lookaxis2.value; analogjoystickmove = cv_usejoystick2.value && !Joystick2.bGamepadStyle; gamepadjoystickmove = cv_usejoystick2.value && Joystick2.bGamepadStyle; - analog = cv_analog2.value; break; case 3: mouseaiming = false; @@ -1239,7 +1237,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) lookaxis = cv_lookaxis3.value; analogjoystickmove = cv_usejoystick3.value && !Joystick3.bGamepadStyle; gamepadjoystickmove = cv_usejoystick3.value && Joystick3.bGamepadStyle; - analog = cv_analog3.value; break; case 4: mouseaiming = false; @@ -1247,7 +1244,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) lookaxis = cv_lookaxis4.value; analogjoystickmove = cv_usejoystick4.value && !Joystick4.bGamepadStyle; gamepadjoystickmove = cv_usejoystick4.value && Joystick4.bGamepadStyle; - analog = cv_analog4.value; break; case 1: default: @@ -1256,7 +1252,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) lookaxis = cv_lookaxis.value; analogjoystickmove = cv_usejoystick.value && !Joystick.bGamepadStyle; gamepadjoystickmove = cv_usejoystick.value && Joystick.bGamepadStyle; - analog = cv_analog.value; break; } @@ -1292,49 +1287,66 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else tspeed = speed; + cmd->driftturn = 0; + // let movement keys cancel each other out - if (analog) // Analog + if (turnright && !(turnleft)) { - if (turnright) - cmd->angleturn = (INT16)(cmd->angleturn - angleturn[tspeed]); - if (turnleft) - cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]); + cmd->angleturn = (INT16)(cmd->angleturn - angleturn[tspeed]); + cmd->driftturn = (INT16)(cmd->driftturn - angleturn[tspeed]); + } + else if (turnleft && !(turnright)) + { + cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]); + cmd->driftturn = (INT16)(cmd->driftturn + angleturn[tspeed]); } - if (analog || twodlevel - || (player->mo && (player->mo->flags2 & MF2_TWOD)) - || (!demoplayback && (player->climbing - || (player->pflags & PF_NIGHTSMODE) - || (player->pflags & PF_SLIDING) - || (player->pflags & PF_FORCESTRAFE)))) // Analog - forcestrafe = true; + if (analogjoystickmove && axis != 0) + { + // JOYAXISRANGE should be 1023 (divide by 1024) + cmd->angleturn = (INT16)(cmd->angleturn - ((axis * angleturn[1]) >> 10)); // ANALOG! + cmd->driftturn = (INT16)(cmd->driftturn - ((axis * angleturn[1]) >> 10)); + } - if (forcestrafe) // Analog + // Specator mouse turning + if (player->spectator) + { + cmd->angleturn = (INT16)(cmd->angleturn - (mousex*(mirrormode ? -1 : 1)*8)); + cmd->driftturn = (INT16)(cmd->driftturn - (mousex*(mirrormode ? -1 : 1)*8)); + } + + // Bounce pad strafing + if (!demoplayback && ((player->pflags & PF_FORCESTRAFE) || (player->kartstuff[k_feather] & 2))) { if (turnright) - side += sidemove[speed]; + side += sidemove[1]; if (turnleft) - side -= sidemove[speed]; - + side -= sidemove[1]; if (analogjoystickmove && axis != 0) { // JOYAXISRANGE is supposed to be 1023 (divide by 1024) - side += ((axis * sidemove[1]) >> 10); + side += ((axis * sidemove[0]) >> 10); } } - else - { - if (turnright && !(turnleft)) - cmd->angleturn = (INT16)(cmd->angleturn - angleturn[tspeed]); - else if (turnleft && !(turnright)) - cmd->angleturn = (INT16)(cmd->angleturn + angleturn[tspeed]); - if (analogjoystickmove && axis != 0) - { - // JOYAXISRANGE should be 1023 (divide by 1024) - cmd->angleturn = (INT16)(cmd->angleturn - ((axis * angleturn[1]) >> 10)); // ANALOG! - } - } + //{ SRB2kart - Drift support + // limit turning to angleturn[1] to stop mouselook letting you look too fast + if (cmd->angleturn > angleturn[1]) + cmd->angleturn = angleturn[1]; + else if (cmd->angleturn < -angleturn[1]) + cmd->angleturn = -angleturn[1]; + + if (cmd->driftturn > angleturn[1]) + cmd->driftturn = angleturn[1]; + else if (cmd->driftturn < -angleturn[1]) + cmd->driftturn = -angleturn[1]; + + if (player->mo) + cmd->angleturn = K_GetKartTurnValue(player, cmd->angleturn); + + // SRB2kart - no additional angle if not moving + if ((player->mo && player->speed > 0) || (leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE) || (player->spectator || objectplacing)) + lang += (cmd->angleturn<<16); if (player->spectator || objectplacing) // SRB2Kart: spectators need special controls { @@ -1392,7 +1404,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (InputDown(gc_fire, ssplayer) || (cv_usejoystick.value && axis > 0)) cmd->buttons |= BT_ATTACK; - // drift button + // drift with any button/key axis = JoyAxis(AXISDRIFT, ssplayer); if (InputDown(gc_drift, ssplayer) || (cv_usejoystick.value && axis > 0)) cmd->buttons |= BT_DRIFT; @@ -1405,6 +1417,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) if (InputDown(gc_custom3, ssplayer)) cmd->buttons |= BT_CUSTOM3; + // Reset camera if (InputDown(gc_camreset, ssplayer)) { if (thiscam->chase && !rd) @@ -1414,7 +1427,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) else rd = false; - // player aiming shit, ahhhh... + // spectator aiming shit, ahhhh... { INT32 player_invert = invertmouse ? -1 : 1; INT32 screen_invert = @@ -1463,15 +1476,13 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) cmd->aiming = G_ClipAimingPitch(&laim); } - if (player->spectator) - cmd->angleturn = (INT16)(cmd->angleturn - (mousex*(mirrormode ? -1 : 1)*8)); - mousex = mousey = mlooky = 0; if (forward > MAXPLMOVE) forward = MAXPLMOVE; else if (forward < -MAXPLMOVE) forward = -MAXPLMOVE; + if (side > MAXPLMOVE) side = MAXPLMOVE; else if (side < -MAXPLMOVE) @@ -1479,86 +1490,20 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) // No additional acceleration when moving forward/backward and strafing simultaneously. // do this AFTER we cap to MAXPLMOVE so people can't find ways to cheese around this. - if (!forcestrafe && forward && side) + // SRB2Kart: We don't need this; we WANT bounce strafing to plain stack on top of normal movement. + /*if (!bouncestrafe && forward && side) { forward = FixedMul(forward, 3*FRACUNIT/4); side = FixedMul(side, 3*FRACUNIT/4); - } + }*/ - //Silly hack to make 2d mode *somewhat* playable with no chasecam. - if ((twodlevel || (player->mo && player->mo->flags2 & MF2_TWOD)) && !thiscam->chase) - { - INT32 temp = forward; - forward = side; - side = temp; - } - - if (cmd->buttons & BT_BRAKE && !forward) // Sal: If you're not accelerating, but going forward, then you should just lose your momentum. Request from Sev - { - cmd->forwardmove = (SINT8)(cmd->forwardmove / 2); - cmd->sidemove = (SINT8)(cmd->sidemove / 2); - } - else + if (forward || side) { cmd->forwardmove = (SINT8)(cmd->forwardmove + forward); - if (mirrormode) - cmd->sidemove = (SINT8)(cmd->sidemove - side); - else - cmd->sidemove = (SINT8)(cmd->sidemove + side); + cmd->sidemove = (SINT8)(cmd->sidemove + side); } - if (ssplayer == 2 && player->bot == 1) { - if (!player->powers[pw_tailsfly] && (cmd->forwardmove || cmd->sidemove || cmd->buttons)) - { - player->bot = 2; // A player-controlled bot. Returns to AI when it respawns. - //CV_SetValue(&cv_analog2, true); - } - else - { - G_CopyTiccmd(cmd, I_BaseTiccmd2(), 1); // empty, or external driver - B_BuildTiccmd(player, cmd); - } - } - - //{ SRB2kart - Drift support - axis = JoyAxis(AXISTURN, ssplayer); - if (mirrormode) - axis = -axis; - - // TODO: Remove this hack please :( - if (cmd->angleturn > 0) // Drifting to the left - cmd->buttons |= BT_DRIFTLEFT; - else - cmd->buttons &= ~BT_DRIFTLEFT; - - if (cmd->angleturn < 0) // Drifting to the right - cmd->buttons |= BT_DRIFTRIGHT; - else - cmd->buttons &= ~BT_DRIFTRIGHT; - //} - - if (analog) { - cmd->angleturn = (INT16)(thiscam->angle >> 16); - if (player->awayviewtics) - cmd->angleturn = (INT16)(player->awayviewmobj->angle >> 16); - } - else - { - // limit turning to angleturn[1] to stop mouselook letting you look too fast - if (cmd->angleturn > angleturn[1]) - cmd->angleturn = angleturn[1]; - else if (cmd->angleturn < -angleturn[1]) - cmd->angleturn = -angleturn[1]; - - if (player->mo) - cmd->angleturn = K_GetKartTurnValue(player, cmd->angleturn); - - // SRB2kart - no additional angle if not moving - if ((player->mo && player->speed > 0) || (leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE) || (player->spectator || objectplacing)) - lang += (cmd->angleturn<<16); - - cmd->angleturn = (INT16)(lang >> 16); - } + cmd->angleturn = (INT16)(lang >> 16); if (!hu_stopped) { @@ -4197,6 +4142,7 @@ char *G_BuildMapTitle(INT32 mapnum) #define ZT_ANGLE 0x04 #define ZT_BUTTONS 0x08 #define ZT_AIMING 0x10 +#define ZT_DRIFT 0x20 #define DEMOMARKER 0x80 // demoend static ticcmd_t oldcmd; @@ -4254,6 +4200,7 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n) dest[i].angleturn = SHORT(src[i].angleturn); dest[i].aiming = (INT16)SHORT(src[i].aiming); dest[i].buttons = (UINT16)SHORT(src[i].buttons); + dest[i].driftturn = (INT16)SHORT(src[i].driftturn); } return dest; } @@ -4277,6 +4224,8 @@ void G_ReadDemoTiccmd(ticcmd_t *cmd, INT32 playernum) oldcmd.buttons = (oldcmd.buttons & (BT_FORWARD|BT_BACKWARD)) | (READUINT16(demo_p) & ~(BT_FORWARD|BT_BACKWARD)); if (ziptic & ZT_AIMING) oldcmd.aiming = READINT16(demo_p); + if (ziptic & ZT_DRIFT) + oldcmd.driftturn = READINT16(demo_p); G_CopyTiccmd(cmd, &oldcmd, 1); @@ -4333,6 +4282,13 @@ void G_WriteDemoTiccmd(ticcmd_t *cmd, INT32 playernum) ziptic |= ZT_AIMING; } + if (cmd->driftturn != oldcmd.driftturn) + { + WRITEINT16(demo_p,cmd->driftturn); + oldcmd.driftturn = cmd->driftturn; + ziptic |= ZT_DRIFT; + } + *ziptic_p = ziptic; // attention here for the ticcmd size! @@ -4705,6 +4661,8 @@ void G_GhostTicker(void) g->p += 2; if (ziptic & ZT_AIMING) g->p += 2; + if (ziptic & ZT_DRIFT) + g->p += 2; // Grab ghost data. ziptic = READUINT8(g->p); diff --git a/src/k_kart.c b/src/k_kart.c index 06f32a9e6..06e104368 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -947,11 +947,11 @@ void K_KartMoveAnimation(player_t *player) // Standing frames - S_KART_STND1 S_KART_STND1_L S_KART_STND1_R if (player->speed == 0) { - if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state >= &states[S_KART_STND1_R] && player->mo->state <= &states[S_KART_STND2_R])) + if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_STND1_R] && player->mo->state <= &states[S_KART_STND2_R])) P_SetPlayerMobjState(player->mo, S_KART_STND1_R); - else if (cmd->buttons & BT_DRIFTLEFT && !(player->mo->state >= &states[S_KART_STND1_L] && player->mo->state <= &states[S_KART_STND2_L])) + else if (cmd->driftturn > 0 && !(player->mo->state >= &states[S_KART_STND1_L] && player->mo->state <= &states[S_KART_STND2_L])) P_SetPlayerMobjState(player->mo, S_KART_STND1_L); - else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(player->mo->state >= &states[S_KART_STND1] && player->mo->state <= &states[S_KART_STND2])) + else if (cmd->driftturn == 0 && !(player->mo->state >= &states[S_KART_STND1] && player->mo->state <= &states[S_KART_STND2])) P_SetPlayerMobjState(player->mo, S_KART_STND1); } // Drifting Left - S_KART_DRIFT1_L @@ -969,21 +969,21 @@ void K_KartMoveAnimation(player_t *player) // Run frames - S_KART_RUN1 S_KART_RUN1_L S_KART_RUN1_R else if (player->speed > FixedMul(player->runspeed, player->mo->scale)) { - if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state >= &states[S_KART_RUN1_R] && player->mo->state <= &states[S_KART_RUN2_R])) + if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_RUN1_R] && player->mo->state <= &states[S_KART_RUN2_R])) P_SetPlayerMobjState(player->mo, S_KART_RUN1_R); - else if (cmd->buttons & BT_DRIFTLEFT && !(player->mo->state >= &states[S_KART_RUN1_L] && player->mo->state <= &states[S_KART_RUN2_L])) + else if (cmd->driftturn > 0 && !(player->mo->state >= &states[S_KART_RUN1_L] && player->mo->state <= &states[S_KART_RUN2_L])) P_SetPlayerMobjState(player->mo, S_KART_RUN1_L); - else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(player->mo->state >= &states[S_KART_RUN1] && player->mo->state <= &states[S_KART_RUN2])) + else if (cmd->driftturn == 0 && !(player->mo->state >= &states[S_KART_RUN1] && player->mo->state <= &states[S_KART_RUN2])) P_SetPlayerMobjState(player->mo, S_KART_RUN1); } // Walk frames - S_KART_WALK1 S_KART_WALK1_L S_KART_WALK1_R else if (player->speed <= FixedMul(player->runspeed, player->mo->scale)) { - if (cmd->buttons & BT_DRIFTRIGHT && !(player->mo->state >= &states[S_KART_WALK1_R] && player->mo->state <= &states[S_KART_WALK2_R])) + if (cmd->driftturn < 0 && !(player->mo->state >= &states[S_KART_WALK1_R] && player->mo->state <= &states[S_KART_WALK2_R])) P_SetPlayerMobjState(player->mo, S_KART_WALK1_R); - else if (cmd->buttons & BT_DRIFTLEFT && !(player->mo->state >= &states[S_KART_WALK1_L] && player->mo->state <= &states[S_KART_WALK2_L])) + else if (cmd->driftturn > 0 && !(player->mo->state >= &states[S_KART_WALK1_L] && player->mo->state <= &states[S_KART_WALK2_L])) P_SetPlayerMobjState(player->mo, S_KART_WALK1_L); - else if (!(cmd->buttons & BT_DRIFTRIGHT || cmd->buttons & BT_DRIFTLEFT) && !(player->mo->state >= &states[S_KART_WALK1] && player->mo->state <= &states[S_KART_WALK2])) + else if (cmd->driftturn == 0 && !(player->mo->state >= &states[S_KART_WALK1] && player->mo->state <= &states[S_KART_WALK2])) P_SetPlayerMobjState(player->mo, S_KART_WALK1); } } @@ -1344,6 +1344,15 @@ fixed_t K_3dKartMovement(player_t *player, boolean onground, fixed_t forwardmove if (!onground) return 0; // If the player isn't on the ground, there is no change in speed + if (forwardmove <= 0 && player->kartstuff[k_brakestop] < 6) // Don't start reversing with brakes until you've made a stop first + { + if (player->speed < 8*FRACUNIT) + player->kartstuff[k_brakestop]++; + return 0; + } + else if (forwardmove > 0) + player->kartstuff[k_brakestop] = 0; + // ACCELCODE!!!1!11! oldspeed = R_PointToDist2(0, 0, player->rmomx, player->rmomy); // FixedMul(P_AproxDistance(player->rmomx, player->rmomy), player->mo->scale); newspeed = FixedDiv(FixedDiv(FixedMul(oldspeed, accelmax - p_accel) + FixedMul(p_speed, p_accel), accelmax), ORIG_FRICTION); @@ -2423,7 +2432,7 @@ static void K_KartDrift(player_t *player, boolean onground) kartspeed = 1; // IF YOU CHANGE THESE: MAKE SURE YOU UPDATE THE SAME VALUES IN p_mobjc, "case MT_DRIFT:" - dsone = 26*4 + kartspeed*2 + (9 - player->kartweight); + dsone = (26*4 + kartspeed*2 + (9 - player->kartweight))*8; dstwo = dsone*2; // Drifting is actually straffing + automatic turning. @@ -2457,7 +2466,7 @@ static void K_KartDrift(player_t *player, boolean onground) } // Drifting: left or right? - if ((player->cmd.buttons & BT_DRIFTLEFT) && player->speed > FixedMul(10<<16, player->mo->scale) && player->kartstuff[k_jmp] == 1 + if ((player->cmd.driftturn > 0) && player->speed > FixedMul(10<<16, player->mo->scale) && player->kartstuff[k_jmp] == 1 && (player->kartstuff[k_drift] == 0 || player->kartstuff[k_driftend] == 1)) // && player->kartstuff[k_drift] != 1) { // Starting left drift @@ -2465,7 +2474,7 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; player->kartstuff[k_driftcharge] = 0; } - else if ((player->cmd.buttons & BT_DRIFTRIGHT) && player->speed > FixedMul(10<<16, player->mo->scale) && player->kartstuff[k_jmp] == 1 + else if ((player->cmd.driftturn < 0) && player->speed > FixedMul(10<<16, player->mo->scale) && player->kartstuff[k_jmp] == 1 && (player->kartstuff[k_drift] == 0 || player->kartstuff[k_driftend] == 1)) // && player->kartstuff[k_drift] != -1) { // Starting right drift @@ -2494,7 +2503,7 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 0) { - fixed_t driftadditive = 3; + fixed_t driftadditive = 24; if (player->kartstuff[k_drift] >= 1) // Drifting to the left { @@ -2502,10 +2511,10 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_drift] > 5) player->kartstuff[k_drift] = 5; - if (player->cmd.buttons & BT_DRIFTLEFT) // Inward - driftadditive++; - if (player->cmd.buttons & BT_DRIFTRIGHT) // Outward - driftadditive--; + if (player->cmd.driftturn > 0) // Inward + driftadditive += (player->cmd.driftturn/800)/8; + if (player->cmd.driftturn < 0) // Outward + driftadditive -= (player->cmd.driftturn/800)/8; } else if (player->kartstuff[k_drift] <= -1) // Drifting to the right { @@ -2513,10 +2522,10 @@ static void K_KartDrift(player_t *player, boolean onground) if (player->kartstuff[k_drift] < -5) player->kartstuff[k_drift] = -5; - if (player->cmd.buttons & BT_DRIFTRIGHT) // Inward - driftadditive++; - if (player->cmd.buttons & BT_DRIFTLEFT) // Outward - driftadditive--; + if (player->cmd.driftturn < 0) // Inward + driftadditive += (player->cmd.driftturn/800)/4; + if (player->cmd.driftturn > 0) // Outward + driftadditive -= (player->cmd.driftturn/800)/4; } // This spawns the drift sparks @@ -3325,24 +3334,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) K_KartDrift(player, onground); - // Feather strafing - if (player->kartstuff[k_feather] & 2) - { - fixed_t strafe = 0; - fixed_t strength = FRACUNIT/32; - if (cmd->buttons & BT_DRIFTLEFT) - strafe--; - if (cmd->buttons & BT_DRIFTRIGHT) - strafe++; - strength += FixedDiv(player->speed, K_GetKartSpeed(player, true)); - P_Thrust(player->mo, player->mo->angle-ANGLE_90, strafe*strength); - } - // Quick Turning // You can't turn your kart when you're not moving. // So now it's time to burn some rubber! - if (player->speed < 2 && leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE - && ((cmd->buttons & BT_DRIFTLEFT) || (cmd->buttons & BT_DRIFTRIGHT))) + if (player->speed < 2 && leveltime > 140 && cmd->buttons & BT_ACCELERATE && cmd->buttons & BT_BRAKE && cmd->driftturn != 0) { if (leveltime % 20 == 0) S_StartSound(player->mo, sfx_mkslid); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 0d488fdb3..1eed10b0f 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -733,6 +733,8 @@ static int ticcmd_get(lua_State *L) lua_pushinteger(L, cmd->aiming); else if (fastcmp(field,"buttons")) lua_pushinteger(L, cmd->buttons); + else if (fastcmp(field,"driftturn")) + lua_pushinteger(L, cmd->driftturn); else return NOFIELD; @@ -759,6 +761,8 @@ static int ticcmd_set(lua_State *L) cmd->aiming = (INT16)luaL_checkinteger(L, 3); else if (fastcmp(field,"buttons")) cmd->buttons = (UINT16)luaL_checkinteger(L, 3); + else if (fastcmp(field,"driftturn")) + cmd->driftturn = (INT16)luaL_checkinteger(L, 3); else return NOFIELD; diff --git a/src/p_mobj.c b/src/p_mobj.c index 2ba98af03..4176881ee 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2891,6 +2891,12 @@ static void P_PlayerZMovement(mobj_t *mo) mo->momx = mo->momx/2; mo->momy = mo->momy/2; } + + if (mo->player->cmd.buttons & BT_BRAKE && !(mo->player->cmd.forwardmove)) // FURTHER slowdown if you're braking. + { + mo->momx = mo->momx/2; + mo->momy = mo->momy/2; + } } if (mo->health) @@ -6559,7 +6565,7 @@ void P_MobjThinker(mobj_t *mobj) if (G_BattleGametype() && mobj->target->player->kartstuff[k_balloon] <= 0) kartspeed = 1; - dsone = 26*4 + kartspeed*2 + (9 - mobj->target->player->kartweight); + dsone = (26*4 + kartspeed*2 + (9 - mobj->target->player->kartweight))*8; dstwo = dsone*2; if (mobj->target->player->kartstuff[k_driftcharge] < dsone) diff --git a/src/p_user.c b/src/p_user.c index 80da049f5..20a0e4eb9 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -4684,7 +4684,6 @@ static void P_3dMovement(player_t *player) angle_t movepushangle, movepushsideangle; // Analog //INT32 topspeed, acceleration, thrustfactor; fixed_t movepushforward = 0, movepushside = 0; - INT32 mforward = 0, mbackward = 0; angle_t dangle; // replaces old quadrants bits //boolean dangleflip = false; // SRB2kart - toaster //fixed_t normalspd = FixedMul(player->normalspeed, player->mo->scale); @@ -4772,12 +4771,6 @@ static void P_3dMovement(player_t *player) //dangleflip = true; } - // now use it to determine direction! - if (dangle <= ANGLE_45) // angles 0-45 or 315-360 - mforward = 1; // going forwards - else if (dangle >= ANGLE_135) // angles 135-225 - mbackward = 1; // going backwards - // anything else will leave both at 0, so no need to do anything else //{ SRB2kart 220217 - Toaster Code for misplaced thrust @@ -4803,104 +4796,13 @@ static void P_3dMovement(player_t *player) cmd->forwardmove = 0; // Do not let the player control movement if not onground. - onground = P_IsObjectOnGround(player->mo); - - // SRB2Kart: shhhhhhh don't question me, feather and speed bumps are supposed to control like you're on the ground :p - if (player->kartstuff[k_feather] & 2) - onground = true; + // SRB2Kart: feather and speed bumps are supposed to control like you're on the ground + onground = (P_IsObjectOnGround(player->mo) || (player->kartstuff[k_feather] & 2)); player->aiming = cmd->aiming<pflags & PF_SLIDING) - { - normalspd = FixedMul(36<mo->scale); - thrustfactor = 5; - acceleration = 96 + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * 40; - topspeed = normalspd; - } - else if (player->bot) - { // Bot steals player 1's stats - normalspd = FixedMul(players[consoleplayer].normalspeed, player->mo->scale); - thrustfactor = players[consoleplayer].thrustfactor; - acceleration = players[consoleplayer].accelstart + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * players[consoleplayer].acceleration; - - if (player->powers[pw_tailsfly]) - topspeed = normalspd/2; - else if (player->mo->eflags & (MFE_UNDERWATER|MFE_GOOWATER)) - { - topspeed = normalspd/2; - acceleration = 2*acceleration/3; - } - else - topspeed = normalspd; - } - else if (player->powers[pw_super] || player->powers[pw_sneakers] || player->kartstuff[k_startimer] || player->kartstuff[k_mushroomtimer]) - { - if (player->powers[pw_sneakers] && (player->kartstuff[k_growshrinktimer] > 0 || player->kartstuff[k_mushroomtimer] > 0 || player->kartstuff[k_startimer] > 0)) - thrustfactor = player->thrustfactor*3; - else - thrustfactor = player->thrustfactor*2; - acceleration = player->accelstart/2 + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * player->acceleration/2; - - - if (player->powers[pw_tailsfly]) - topspeed = normalspd; - else if (player->mo->eflags & (MFE_UNDERWATER|MFE_GOOWATER)) - { - topspeed = normalspd; - acceleration = 2*acceleration/3; - } - - if (cmd->forwardmove < 0) - topspeed = 5<<16; - else - topspeed = (normalspd * 3)/2; //> 60<<16 ? 60<<16 : normalspd * 2; - } - else - { - thrustfactor = player->thrustfactor; - acceleration = player->accelstart + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * player->acceleration; - - - if (player->powers[pw_tailsfly]) - topspeed = normalspd/2; - else if (player->mo->eflags & (MFE_UNDERWATER|MFE_GOOWATER)) - { - topspeed = normalspd/2; - acceleration = 2*acceleration/3; - } - if (cmd->forwardmove < 0) - topspeed = 5<<16; - else - topspeed = normalspd; - } - - // Better maneuverability while flying - //if(player->powers[pw_tailsfly]) - //{ - // thrustfactor = player->thrustfactor*2; - // acceleration = player->accelstart + (FixedDiv(player->speed, player->mo->scale)>>FRACBITS) * player->acceleration; - //} - - if (player->mo->movefactor != FRACUNIT) // Friction-scaled acceleration... - acceleration = FixedMul(acceleration<mo->movefactor)>>FRACBITS; - */ - // Forward movement - if (player->climbing) - { - if (cmd->forwardmove) - { - P_SetObjectMomZ(player->mo, FixedDiv(cmd->forwardmove*FRACUNIT, 10*FRACUNIT), false); - if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])) - player->mo->momz *= 2; - } - } - else if (!analogmove - //&& cmd->forwardmove != 0 - && !(player->pflags & PF_GLIDING || player->exiting - || (P_PlayerInPain(player) && !onground))) + if (!(player->exiting || (P_PlayerInPain(player) && !onground))) { //movepushforward = cmd->forwardmove * (thrustfactor * acceleration); movepushforward = K_3dKartMovement(player, onground, cmd->forwardmove); @@ -4909,25 +4811,14 @@ static void P_3dMovement(player_t *player) if (!onground) movepushforward >>= 2; // proper air movement - // Allow a bit of movement while spinning - if (player->pflags & PF_SPINNING) - { - if ((mforward && cmd->forwardmove > 0) || (mbackward && cmd->forwardmove < 0)) - movepushforward = 0; - else if (!(player->pflags & PF_STARTDASH)) - movepushforward = FixedDiv(movepushforward, 16*FRACUNIT); - else - movepushforward = 0; - } - // don't need to account for scale here with kart accel code //movepushforward = FixedMul(movepushforward, player->mo->scale); if (player->mo->movefactor != FRACUNIT) // Friction-scaled acceleration... movepushforward = FixedMul(movepushforward, player->mo->movefactor); - //if (mforward && cmd->forwardmove < 0) // SRB2kart - braking isn't instant - // movepushforward /= 32; + if (cmd->buttons & BT_BRAKE && !cmd->forwardmove) // SRB2kart - braking isn't instant + movepushforward /= 64; #ifdef ESLOPE totalthrust.x += P_ReturnThrustX(player->mo, movepushangle, movepushforward); @@ -4940,91 +4831,14 @@ static void P_3dMovement(player_t *player) { K_MomentumToFacing(player); } + // Sideways movement - if (player->climbing) + if (cmd->sidemove != 0 && !(player->exiting || (P_PlayerInPain(player)))) { - if (player->powers[pw_super] && ALL7EMERALDS(player->powers[pw_emeralds])) - P_InstaThrust(player->mo, player->mo->angle-ANGLE_90, FixedMul(FixedDiv(cmd->sidemove*FRACUNIT, 5*FRACUNIT), player->mo->scale)); - else - P_InstaThrust(player->mo, player->mo->angle-ANGLE_90, FixedMul(FixedDiv(cmd->sidemove*FRACUNIT, 10*FRACUNIT), player->mo->scale)); - } - // Analog movement control - else if (analogmove) - { - if (!(player->pflags & PF_GLIDING || player->exiting || P_PlayerInPain(player))) - { - angle_t controldirection; - - // Calculate the angle at which the controls are pointing - // to figure out the proper mforward and mbackward. - // (Why was it so complicated before? ~Red) - controldirection = R_PointToAngle2(0, 0, cmd->forwardmove*FRACUNIT, -cmd->sidemove*FRACUNIT)+movepushangle; - - //movepushforward = max(abs(cmd->sidemove), abs(cmd->forwardmove)) * (thrustfactor * acceleration); - movepushforward = K_3dKartMovement(player, onground, max(abs(cmd->sidemove), abs(cmd->forwardmove))); - - // allow very small movement while in air for gameplay - if (!onground) - movepushforward >>= 2; // proper air movement - - // Allow a bit of movement while spinning - if (player->pflags & PF_SPINNING) - { - // Stupid little movement prohibitor hack - // that REALLY shouldn't belong in analog code. - if ((mforward && cmd->forwardmove > 0) || (mbackward && cmd->forwardmove < 0)) - movepushforward = 0; - else if (!(player->pflags & PF_STARTDASH)) - movepushforward = FixedDiv(movepushforward, 16*FRACUNIT); - else - movepushforward = 0; - } - - movepushsideangle = controldirection; - - // don't need to account for scale here with kart accel code - //movepushforward = FixedMul(movepushforward, player->mo->scale); - - //if (mforward && cmd->forwardmove < 0) // SRB2kart - braking isn't instant - // movepushforward /= 32; - -#ifdef ESLOPE - totalthrust.x += P_ReturnThrustX(player->mo, controldirection, movepushforward); - totalthrust.y += P_ReturnThrustY(player->mo, controldirection, movepushforward); -#else - P_Thrust(player->mo, controldirection, movepushforward); -#endif - } - } - else if (cmd->sidemove && !(player->pflags & PF_GLIDING) && !player->exiting && !P_PlayerInPain(player)) - { - //movepushside = cmd->sidemove * (thrustfactor * acceleration); if (cmd->sidemove > 0) - movepushside = K_3dKartMovement(player, onground, 50); + movepushside = (cmd->sidemove * FRACUNIT/128) + FixedDiv(player->speed, K_GetKartSpeed(player, true)); else - movepushside = -(K_3dKartMovement(player, onground, 50)); - - if (!onground) - { - movepushside >>= 2; - - // Reduce movepushslide even more if over "max" flight speed - if (player->powers[pw_tailsfly] && player->speed > K_GetKartSpeed(player, true)) //topspeed) - movepushside >>= 2; - } - - // Allow a bit of movement while spinning - if (player->pflags & PF_SPINNING) - { - if (!(player->pflags & PF_STARTDASH)) - movepushside = FixedDiv(movepushside,16*FRACUNIT); - else - movepushside = 0; - } - - // Finally move the player now that his speed/direction has been decided. - // don't need to account for scale here with kart accel code - //movepushside = FixedMul(movepushside, player->mo->scale); + movepushside = (cmd->sidemove * FRACUNIT/128) - FixedDiv(player->speed, K_GetKartSpeed(player, true)); #ifdef ESLOPE totalthrust.x += P_ReturnThrustX(player->mo, movepushsideangle, movepushside); @@ -6496,13 +6310,13 @@ void P_ElementalFireTrail(player_t *player) } } -static void P_SkidStuff(player_t *player) +/*static void P_SkidStuff(player_t *player) { fixed_t pmx = player->rmomx + player->cmomx; fixed_t pmy = player->rmomy + player->cmomy; // Knuckles glides into the dirt. - /* // SRB2kart - don't need + // SRB2kart - don't need if (player->pflags & PF_GLIDING && player->skidtime) { // Fell off a ledge... @@ -6540,7 +6354,7 @@ static void P_SkidStuff(player_t *player) } } // Skidding! - else*/if (onground && !(player->mo->eflags & MFE_GOOWATER) && !(player->pflags & (PF_JUMPED|PF_SPINNING|PF_SLIDING)) && !(player->charflags & SF_NOSKID)) + elseif (onground && !(player->mo->eflags & MFE_GOOWATER) && !(player->pflags & (PF_JUMPED|PF_SPINNING|PF_SLIDING)) && !(player->charflags & SF_NOSKID)) { if (player->skidtime) { @@ -6587,7 +6401,7 @@ static void P_SkidStuff(player_t *player) S_StopSound(player->mo); } } -} +}*/ // // P_MovePlayer @@ -6762,7 +6576,7 @@ static void P_MovePlayer(player_t *player) if (maptol & TOL_2D) runspd = FixedMul(runspd, 2*FRACUNIT/3); - P_SkidStuff(player); + //P_SkidStuff(player); ///////////////////////// // MOVEMENT ANIMATIONS // From 4fd88293ffd397f28fafe3e95c64d9ce230b29ae Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 5 Jun 2018 17:28:46 -0400 Subject: [PATCH 42/51] Use strlen for all of the valid zone title/act num checks --- src/d_clisrv.c | 6 +++--- src/d_netcmd.c | 6 +++--- src/g_game.c | 4 ++-- src/m_menu.c | 12 ++++++------ src/m_misc.c | 2 +- src/p_setup.c | 2 +- src/y_inter.c | 32 ++++++++++++++++---------------- 7 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index fd4b2d158..0d3b9141e 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -1637,14 +1637,14 @@ static void CL_LoadReceivedSavegame(void) if (P_LoadNetGame()) { CONS_Printf(M_GetText("Map is now \"%s"), G_BuildMapName(gamemap)); - if (strcmp(mapheaderinfo[gamemap-1]->lvlttl, "")) + if (strlen(mapheaderinfo[gamemap-1]->lvlttl) > 0) { CONS_Printf(": %s", mapheaderinfo[gamemap-1]->lvlttl); - if (strcmp(mapheaderinfo[gamemap-1]->zonttl, "")) + if (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) CONS_Printf(" %s", mapheaderinfo[gamemap-1]->zonttl); else if (!(mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE)) CONS_Printf(M_GetText(" ZONE")); - if (strcmp(mapheaderinfo[gamemap-1]->actnum, "")) + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) CONS_Printf(" %s", mapheaderinfo[gamemap-1]->actnum); } CONS_Printf("\"\n"); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 276cc1d00..2f2657d71 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4523,16 +4523,16 @@ static void Command_Showmap_f(void) { if (gamestate == GS_LEVEL) { - if (mapheaderinfo[gamemap-1]->zonttl) + if (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) { - if (mapheaderinfo[gamemap-1]->actnum) + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) CONS_Printf("%s (%d): %s %s %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl, mapheaderinfo[gamemap-1]->actnum); else CONS_Printf("%s (%d): %s %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl); } else { - if (mapheaderinfo[gamemap-1]->actnum) + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) CONS_Printf("%s (%d): %s %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum); else CONS_Printf("%s (%d): %s\n", G_BuildMapName(gamemap), gamemap, mapheaderinfo[gamemap-1]->lvlttl); diff --git a/src/g_game.c b/src/g_game.c index 4f41d1176..8b1e658f4 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4097,7 +4097,7 @@ char *G_BuildMapTitle(INT32 mapnum) const char *actnum = NULL; len += strlen(mapheaderinfo[mapnum-1]->lvlttl); - if (strcmp(mapheaderinfo[mapnum-1]->zonttl, "")) + if (strlen(mapheaderinfo[mapnum-1]->zonttl) > 0) { zonetext = M_GetText(mapheaderinfo[mapnum-1]->zonttl); len += strlen(zonetext) + 1; // ' ' + zonetext @@ -4107,7 +4107,7 @@ char *G_BuildMapTitle(INT32 mapnum) zonetext = M_GetText("ZONE"); len += strlen(zonetext) + 1; // ' ' + zonetext } - if (strcmp(mapheaderinfo[mapnum-1]->actnum, "")) + if (strlen(mapheaderinfo[mapnum-1]->actnum) > 0) { actnum = M_GetText(mapheaderinfo[mapnum-1]->actnum); len += strlen(actnum) + 1; // ' ' + actnum diff --git a/src/m_menu.c b/src/m_menu.c index 4de30fa9c..879823102 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3371,16 +3371,16 @@ static void M_DrawPauseMenu(void) // Draw any and all emblems at the top. M_DrawMapEmblems(gamemap, 272, 28); - if (mapheaderinfo[gamemap-1]->zonttl) + if (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) { - if (mapheaderinfo[gamemap-1]->actnum) + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) V_DrawString(40, 28, V_YELLOWMAP, va("%s %s %s", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl, mapheaderinfo[gamemap-1]->actnum)); else V_DrawString(40, 28, V_YELLOWMAP, va("%s %s", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->zonttl)); } else { - if (mapheaderinfo[gamemap-1]->actnum) + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) V_DrawString(40, 28, V_YELLOWMAP, va("%s %s", mapheaderinfo[gamemap-1]->lvlttl, mapheaderinfo[gamemap-1]->actnum)); else V_DrawString(40, 28, V_YELLOWMAP, mapheaderinfo[gamemap-1]->lvlttl); @@ -5347,16 +5347,16 @@ static void M_DrawStatsMaps(int location) mnum = statsMapList[i]; M_DrawMapEmblems(mnum+1, 292, y); - if (mapheaderinfo[mnum]->zonttl) + if (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) { - if (mapheaderinfo[mnum]->actnum) + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) V_DrawString(20, y, V_YELLOWMAP, va("%s %s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->zonttl, mapheaderinfo[mnum]->actnum)); else V_DrawString(20, y, V_YELLOWMAP, va("%s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->zonttl)); } else { - if (mapheaderinfo[mnum]->actnum) + if (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) V_DrawString(20, y, V_YELLOWMAP, va("%s %s", mapheaderinfo[mnum]->lvlttl, mapheaderinfo[mnum]->actnum)); else V_DrawString(20, y, V_YELLOWMAP, mapheaderinfo[mnum]->lvlttl); diff --git a/src/m_misc.c b/src/m_misc.c index 7ebf1ac35..5727067c8 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -681,7 +681,7 @@ static void M_PNGText(png_structp png_ptr, png_infop png_info_ptr, PNG_CONST png mapheaderinfo[gamemap-1]->lvlttl, (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->zonttl) : // SRB2kart ((mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE"), - (mapheaderinfo[gamemap-1]->actnum) ? va(" %s",mapheaderinfo[gamemap-1]->actnum) : ""); + (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->actnum) : ""); else snprintf(lvlttltext, 48, "Unknown"); diff --git a/src/p_setup.c b/src/p_setup.c index e32d3b861..e57fad947 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2683,7 +2683,7 @@ boolean P_SetupLevel(boolean skipprecip) mapheaderinfo[gamemap-1]->lvlttl, (strlen(mapheaderinfo[gamemap-1]->zonttl) > 0) ? va(" %s",mapheaderinfo[gamemap-1]->zonttl) : // SRB2kart ((mapheaderinfo[gamemap-1]->levelflags & LF_NOZONE) ? "" : " ZONE"), - (mapheaderinfo[gamemap-1]->actnum) ? va(", Act %s",mapheaderinfo[gamemap-1]->actnum) : ""); + (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) ? va(", Act %s",mapheaderinfo[gamemap-1]->actnum) : ""); V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx); I_UpdateNoVsync(); } diff --git a/src/y_inter.c b/src/y_inter.c index 30b2a4715..cd56b346b 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -295,7 +295,7 @@ void Y_IntermissionDrawer(void) V_DrawLevelTitle(data.coop.passedx1, 49, 0, data.coop.passed1); V_DrawLevelTitle(data.coop.passedx2, 49+V_LevelNameHeight(data.coop.passed2)+2, 0, data.coop.passed2); - if (mapheaderinfo[gamemap-1]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) V_DrawScaledPatch(244, 57, 0, data.coop.ttlnum); //if (gottimebonus && endtic != -1) @@ -1159,24 +1159,24 @@ void Y_StartIntermission(void) if (strlen(skins[players[consoleplayer].skin].realname) > 13) { strcpy(data.coop.passed1, "YOU GOT"); - strcpy(data.coop.passed2, (mapheaderinfo[gamemap-1]->actnum) ? "THROUGH ACT" : "THROUGH THE ACT"); + strcpy(data.coop.passed2, (strlen(mapheaderinfo[prevmap]->actnum) > 0) ? "THROUGH ACT" : "THROUGH THE ACT"); } // long enough that "X GOT" won't fit so use "X PASSED THE ACT" else if (strlen(skins[players[consoleplayer].skin].realname) > 8) { strcpy(data.coop.passed1, skins[players[consoleplayer].skin].realname); - strcpy(data.coop.passed2, (mapheaderinfo[gamemap-1]->actnum) ? "PASSED ACT" : "PASSED THE ACT"); + strcpy(data.coop.passed2, (strlen(mapheaderinfo[prevmap]->actnum) > 0) ? "PASSED ACT" : "PASSED THE ACT"); } // length is okay for normal use else { snprintf(data.coop.passed1, sizeof data.coop.passed1, "%s GOT", skins[players[consoleplayer].skin].realname); - strcpy(data.coop.passed2, (mapheaderinfo[gamemap-1]->actnum) ? "THROUGH ACT" : "THROUGH THE ACT"); + strcpy(data.coop.passed2, (strlen(mapheaderinfo[prevmap]->actnum) > 0) ? "THROUGH ACT" : "THROUGH THE ACT"); } // set X positions - if (mapheaderinfo[gamemap-1]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) { data.coop.passedx1 = 62 + (176 - V_LevelNameWidth(data.coop.passed1))/2; data.coop.passedx2 = 62 + (176 - V_LevelNameWidth(data.coop.passed2))/2; @@ -1317,9 +1317,9 @@ void Y_StartIntermission(void) Y_CalculateMatchWinners(); // set up the levelstring - if (mapheaderinfo[prevmap]->zonttl) + if (strlen(mapheaderinfo[prevmap]->zonttl) > 0) { - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, "%.32s %.32s * %s *", @@ -1332,7 +1332,7 @@ void Y_StartIntermission(void) } else { - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, "%.32s * %s *", @@ -1380,9 +1380,9 @@ void Y_StartIntermission(void) Y_CalculateTournamentPoints(); // set up the levelstring - if (mapheaderinfo[prevmap]->zonttl) + if (strlen(mapheaderinfo[prevmap]->zonttl) > 0) { - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, "%.32s %.32s * %s *", @@ -1395,7 +1395,7 @@ void Y_StartIntermission(void) } else { - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, "%.32s * %s *", @@ -1425,7 +1425,7 @@ void Y_StartIntermission(void) Y_CalculateMatchWinners(); // set up the levelstring - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.match.levelstring, sizeof data.match.levelstring, "%.32s * %s *", @@ -1461,7 +1461,7 @@ void Y_StartIntermission(void) Y_CalculateCompetitionWinners(); // set up the levelstring - if (mapheaderinfo[prevmap]->actnum) + if (strlen(mapheaderinfo[prevmap]->actnum) > 0) snprintf(data.competition.levelstring, sizeof data.competition.levelstring, "%.32s * %s *", @@ -2554,9 +2554,9 @@ void Y_StartVote(void) lumpnum_t lumpnum; // set up the str - if (mapheaderinfo[votelevels[i]]->zonttl) + if (strlen(mapheaderinfo[votelevels[i]]->zonttl) > 0) { - if (mapheaderinfo[votelevels[i]]->actnum) + if (strlen(mapheaderinfo[votelevels[i]]->actnum) > 0) snprintf(levelinfo[i].str, sizeof levelinfo[i].str, "%.32s %.32s %s", @@ -2569,7 +2569,7 @@ void Y_StartVote(void) } else { - if (mapheaderinfo[votelevels[i]]->actnum) + if (strlen(mapheaderinfo[votelevels[i]]->actnum) > 0) snprintf(levelinfo[i].str, sizeof levelinfo[i].str, "%.32s %s", From b871a4d8e1495676184d7d554b2a179934f1799d Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 5 Jun 2018 18:47:15 -0400 Subject: [PATCH 43/51] Dang it, I always forget these... --- src/dehacked.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dehacked.c b/src/dehacked.c index 4eb0ecd1e..bf12c29c4 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7566,8 +7566,10 @@ static const char *const KARTSTUFF_LIST[] = { "BOOSTCHARGE", "JMP", "OFFROAD", + "BRAKESTOP", "ITEMROULETTE", + "ROULETTETYPE", "ITEMCLOSE", "MAGNETTIMER", From 09fa365bb1b95dab3d5b6ec328782fbae460147b Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 5 Jun 2018 21:36:48 -0400 Subject: [PATCH 44/51] The Lightning Update - 30 sec cooldown on all lightning types - Delay before Blue Lightning hits, based off of distance - Blue Lightning can swap targets if 1st place is passed - Blue Lightning can only be handed out if 2nd is far away enough from first --- src/d_player.h | 1 + src/dehacked.c | 1 + src/doomstat.h | 4 + src/g_game.c | 5 + src/k_kart.c | 576 +++++++++++++++++++++++++++++-------------------- src/p_saveg.c | 14 +- src/p_tick.c | 32 +++ 7 files changed, 399 insertions(+), 234 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 60727fca5..9f1cc6ab0 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -279,6 +279,7 @@ typedef enum k_spinouttimer, // Spin-out from a banana peel or oil slick (was "pw_bananacam") k_laserwisptimer, // The duration and relative angle of the laser k_justbumped, // Prevent players from endlessly bumping into each other + k_deathsentence, // 30 seconds to live... (Blue Shell murder timer (not actually 30 sec, I just couldn't help the FF reference :p)) k_poweritemtimer, // Battle mode, how long before you're allowed another power item (Star, Megashroom) k_comebacktimer, // Battle mode, how long before you become a bomb after death diff --git a/src/dehacked.c b/src/dehacked.c index bf12c29c4..2aed79683 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7584,6 +7584,7 @@ static const char *const KARTSTUFF_LIST[] = { "SPINOUTTIMER", "LASERWISPTIMER", "JUSTBUMPED", + "DEATHSENTENCE", "POWERITEMTIMER", "COMEBACKTIMER", diff --git a/src/doomstat.h b/src/doomstat.h index 4eb7ecdef..ea5151b19 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -445,6 +445,10 @@ extern boolean franticitems; extern boolean mirrormode; extern boolean comeback; +extern tic_t lightningcooldown; +extern tic_t blueshellincoming; +extern UINT8 blueshellplayer; + extern boolean legitimateexit; extern boolean comebackshowninfo; extern tic_t curlap, bestlap; diff --git a/src/g_game.c b/src/g_game.c index 8b1e658f4..bbce2d3e1 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -252,6 +252,11 @@ INT16 votelevels[4]; // Levels that were rolled by the host SINT8 votes[MAXPLAYERS]; // Each player's vote SINT8 pickedvote; // What vote the host rolls +// Server-sided variables +tic_t lightningcooldown; // Cooldown before any more lightning/blue shell is awarded +tic_t blueshellincoming; // Timer before blue shell hits, can switch targets at this point +UINT8 blueshellplayer; // Player num that used the last blue shell + // Client-sided variables (NEVER use in anything that needs to be synced with other players) boolean legitimateexit; // Did this client actually finish the match? boolean comebackshowninfo; // Have you already seen the "ATTACK OR PROTECT" message? diff --git a/src/k_kart.c b/src/k_kart.c index 06e104368..bd7d0dfd1 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -25,6 +25,9 @@ // franticitems is Frantic Mode items, bool // mirrormode is Mirror Mode (duh), bool // comeback is Battle Mode's karma comeback, also bool +// lightningcooldown is timer before anyone's allowed another lightning/blue shell +// blueshellincoming is the timer before k_deathsentence is cast on the player in 1st +// blueshellplayer is the last player who fired one //{ SRB2kart Color Code @@ -473,6 +476,7 @@ static void K_KartGetItemResult(player_t *player, fixed_t getitem, boolean retro player->kartstuff[k_blueshell] = 1; else player->kartstuff[k_bobomb] |= 2; + lightningcooldown = 30*TICRATE; break; case 16: // Fire Flower - or - Deton (Blue Shell) if (retrokart) @@ -488,6 +492,7 @@ static void K_KartGetItemResult(player_t *player, fixed_t getitem, boolean retro break; case 18: // Lightning player->kartstuff[k_lightning] = 1; + lightningcooldown = 30*TICRATE; break; case 19: // Feather player->kartstuff[k_feather] |= 1; @@ -537,6 +542,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) INT32 chance = 0, numchoices = 0; INT32 distvar = (64*14); INT32 avgballoon = 0; + INT32 secondist = 0; // This makes the roulette cycle through items - if this is 0, you shouldn't be here. if (player->kartstuff[k_itemroulette]) @@ -567,8 +573,9 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) // Gotta check how many players are active at this moment. for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i] && !players[i].spectator) - pingame++; + if (!playeringame[i] || players[i].spectator) + continue; + pingame++; if (players[i].exiting) pexiting++; if (players[i].kartstuff[k_balloon] > 0) @@ -580,13 +587,29 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i] && !players[i].spectator && players[i].mo - && players[i].kartstuff[k_position] < player->kartstuff[k_position]) - pdis += P_AproxDistance(P_AproxDistance(players[i].mo->x - player->mo->x, - players[i].mo->y - player->mo->y), - players[i].mo->z - player->mo->z) / mapheaderinfo[gamemap-1]->mobj_scale - * (pingame - players[i].kartstuff[k_position]) - / ((pingame - 1) * (pingame + 1) / 3); + SINT8 first = -1; + SINT8 second = -1; + + if (playeringame[i] && !players[i].spectator && players[i].mo) + { + if (players[i].kartstuff[k_position] < player->kartstuff[k_position]) + pdis += P_AproxDistance(P_AproxDistance(players[i].mo->x - player->mo->x, + players[i].mo->y - player->mo->y), + players[i].mo->z - player->mo->z) / mapheaderinfo[gamemap-1]->mobj_scale + * (pingame - players[i].kartstuff[k_position]) + / ((pingame - 1) * (pingame + 1) / 3); + if (players[i].kartstuff[k_position] == 1 && first == -1) + first = i; + if (players[i].kartstuff[k_position] == 2 && second == -1) + second = i; + } + + if (first != -1 && second != -1 && !secondist) // calculate 2nd's distance from 1st, for blue shell + secondist = P_AproxDistance(P_AproxDistance(players[first].mo->x - players[second].mo->x, + players[first].mo->y - players[second].mo->y), + players[first].mo->z - players[second].mo->z) / mapheaderinfo[gamemap-1]->mobj_scale + * (pingame - 1) + / ((pingame - 1) * (pingame + 1) / 3); } player->kartstuff[k_itemclose] = 0; // Reset the item window closer. @@ -626,25 +649,26 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) // Check the game type to differentiate odds. //if (gametype == GT_RETRO) //{ - if (cv_magnet.value) SETITEMRESULT(useodds, 1); // Magnet - if (cv_boo.value) SETITEMRESULT(useodds, 2); // Boo - if (cv_mushroom.value || modeattacking) SETITEMRESULT(useodds, 3); // Mushroom - if (cv_triplemushroom.value) SETITEMRESULT(useodds, 4); // Triple Mushroom - if (cv_megashroom.value && !player->kartstuff[k_poweritemtimer]) SETITEMRESULT(useodds, 5); // Mega Mushroom - if (cv_goldshroom.value) SETITEMRESULT(useodds, 6); // Gold Mushroom - if (cv_star.value && !player->kartstuff[k_poweritemtimer]) SETITEMRESULT(useodds, 7); // Star - if (cv_triplebanana.value) SETITEMRESULT(useodds, 8); // Triple Banana - if (cv_fakeitem.value) SETITEMRESULT(useodds, 9); // Fake Item - if (cv_banana.value) SETITEMRESULT(useodds, 10); // Banana - if (cv_greenshell.value) SETITEMRESULT(useodds, 11); // Green Shell - if (cv_redshell.value) SETITEMRESULT(useodds, 12); // Red Shell - if (cv_triplegreenshell.value) SETITEMRESULT(useodds, 13); // Triple Green Shell - if (cv_bobomb.value) SETITEMRESULT(useodds, 14); // Bob-omb - if (cv_blueshell.value && pexiting == 0) SETITEMRESULT(useodds, 15); // Blue Shell - if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower - if (cv_tripleredshell.value && pingame > 2) SETITEMRESULT(useodds, 17); // Triple Red Shell - if (cv_lightning.value && pingame > pexiting) SETITEMRESULT(useodds, 18); // Lightning - if (cv_feather.value) SETITEMRESULT(useodds, 19); // Feather + if (cv_magnet.value) SETITEMRESULT(useodds, 1); // Magnet + if (cv_boo.value) SETITEMRESULT(useodds, 2); // Boo + if (cv_mushroom.value || modeattacking) SETITEMRESULT(useodds, 3); // Mushroom + if (cv_triplemushroom.value) SETITEMRESULT(useodds, 4); // Triple Mushroom + if (cv_megashroom.value && !player->kartstuff[k_poweritemtimer]) SETITEMRESULT(useodds, 5); // Mega Mushroom + if (cv_goldshroom.value) SETITEMRESULT(useodds, 6); // Gold Mushroom + if (cv_star.value && !player->kartstuff[k_poweritemtimer]) SETITEMRESULT(useodds, 7); // Star + if (cv_triplebanana.value) SETITEMRESULT(useodds, 8); // Triple Banana + if (cv_fakeitem.value) SETITEMRESULT(useodds, 9); // Fake Item + if (cv_banana.value) SETITEMRESULT(useodds, 10); // Banana + if (cv_greenshell.value) SETITEMRESULT(useodds, 11); // Green Shell + if (cv_redshell.value) SETITEMRESULT(useodds, 12); // Red Shell + if (cv_triplegreenshell.value) SETITEMRESULT(useodds, 13); // Triple Green Shell + if (cv_bobomb.value) SETITEMRESULT(useodds, 14); // Bob-omb + if (cv_blueshell.value && pexiting == 0 + && !lightningcooldown && secondist > distvar*6) SETITEMRESULT(useodds, 15); // Blue Shell + if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower + if (cv_tripleredshell.value && pingame > 2) SETITEMRESULT(useodds, 17); // Triple Red Shell + if (cv_lightning.value && pingame > pexiting && !lightningcooldown) SETITEMRESULT(useodds, 18); // Lightning + if (cv_feather.value) SETITEMRESULT(useodds, 19); // Feather prandom = P_RandomKey(numchoices); @@ -988,206 +1012,6 @@ void K_KartMoveAnimation(player_t *player) } } -/** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c - - \param player player object passed from P_PlayerThink - \param cmd control input from player - - \return void -*/ -void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) -{ - K_UpdateOffroad(player); - - // setting players to use the star colormap and spawning afterimages - if (player->kartstuff[k_startimer]) - { - mobj_t *ghost; - player->mo->colorized = true; - ghost = P_SpawnGhostMobj(player->mo); - ghost->fuse = 4; - ghost->frame |= FF_FULLBRIGHT; - } - else - { - player->mo->colorized = false; - } - - if (player->kartstuff[k_itemclose]) - player->kartstuff[k_itemclose]--; - - if (player->kartstuff[k_spinout]) - player->kartstuff[k_spinout]--; - - if (player->kartstuff[k_spinouttimer]) - player->kartstuff[k_spinouttimer]--; - else if (!comeback) - player->kartstuff[k_comebacktimer] = comebacktime; - else if (player->kartstuff[k_comebacktimer]) - { - player->kartstuff[k_comebacktimer]--; - if (player == &players[consoleplayer] && player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer] <= 0) - comebackshowninfo = true; // client has already seen the message - } - - if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == K_GetKartFlashing()) - player->powers[pw_flashing]--; - - if (player->kartstuff[k_magnettimer]) - player->kartstuff[k_magnettimer]--; - - if (player->kartstuff[k_mushroomtimer]) - player->kartstuff[k_mushroomtimer]--; - - if (player->kartstuff[k_floorboost]) - player->kartstuff[k_floorboost]--; - - if (player->kartstuff[k_driftboost]) - player->kartstuff[k_driftboost]--; - - if (player->kartstuff[k_startimer]) - player->kartstuff[k_startimer]--; - - 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) - { - player->mo->destscale = mapheaderinfo[gamemap-1]->mobj_scale; - P_RestoreMusic(player); - } - - if (player->kartstuff[k_bootaketimer] == 0 && player->kartstuff[k_boostolentimer] == 0 - && player->kartstuff[k_goldshroomtimer]) - player->kartstuff[k_goldshroomtimer]--; - - if (player->kartstuff[k_bootimer]) - player->kartstuff[k_bootimer]--; - - if (player->kartstuff[k_bootaketimer]) - player->kartstuff[k_bootaketimer]--; - - if (player->kartstuff[k_boostolentimer]) - player->kartstuff[k_boostolentimer]--; - - if (player->kartstuff[k_squishedtimer]) - player->kartstuff[k_squishedtimer]--; - - if (player->kartstuff[k_laserwisptimer]) - player->kartstuff[k_laserwisptimer]--; - - if (player->kartstuff[k_justbumped]) - player->kartstuff[k_justbumped]--; - - if (player->kartstuff[k_poweritemtimer]) - player->kartstuff[k_poweritemtimer]--; - - if (player->kartstuff[k_lapanimation]) - player->kartstuff[k_lapanimation]--; - - if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer])) - { - if (player->exiting) - { - if (player->exiting < 6*TICRATE) - player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; - } - else - { - if (player->kartstuff[k_comebacktimer] < 6*TICRATE) - player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1; - else if (player->kartstuff[k_comebacktimer] < 9*TICRATE) - player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; - } - - if (player->kartstuff[k_cardanimation] > 164) - player->kartstuff[k_cardanimation] = 164; - if (player->kartstuff[k_cardanimation] < 0) - player->kartstuff[k_cardanimation] = 0; - } - else - player->kartstuff[k_cardanimation] = 0; - - if (player->kartstuff[k_sounds]) - player->kartstuff[k_sounds]--; - - // ??? - /* - if (player->kartstuff[k_jmp] > 1 && onground) - { - S_StartSound(player->mo, sfx_spring); - P_DoJump(player, false); - player->mo->momz *= player->kartstuff[k_jmp]; - player->kartstuff[k_jmp] = 0; - } - */ - - if (player->kartstuff[k_comebacktimer]) - player->kartstuff[k_comebackmode] = 0; - - if (P_IsObjectOnGround(player->mo) && !(player->mo->momz) - && player->kartstuff[k_feather] & 2) - player->kartstuff[k_feather] &= ~2; - - if (cmd->buttons & BT_DRIFT) - player->kartstuff[k_jmp] = 1; - else - player->kartstuff[k_jmp] = 0; - - // Lakitu Checker - if (player->kartstuff[k_lakitu]) - K_LakituChecker(player); - - // Roulette Code - //K_KartItemRouletteByPosition(player, cmd); // Old, position-based - K_KartItemRouletteByDistance(player, cmd); // New, distance-based - - // Stopping of the horrible star SFX - if (player->mo->health <= 0 || player->mo->player->kartstuff[k_startimer] <= 0 - || player->mo->player->kartstuff[k_growshrinktimer] > 0) // If you don't have invincibility (or mega is active too) - { - if (S_SoundPlaying(player->mo, sfx_star)) // But the sound is playing - S_StopSoundByID(player->mo, sfx_star); // Stop it - } - - // And the same for the mega mushroom SFX - if (!(player->mo->health > 0 && player->mo->player->kartstuff[k_growshrinktimer] > 0)) // If you aren't big - { - if (S_SoundPlaying(player->mo, sfx_mega)) // But the sound is playing - S_StopSoundByID(player->mo, sfx_mega); // Stop it - } - - // AAAAAAND handle the SMK star alarm - if (player->mo->health > 0 && (player->mo->player->kartstuff[k_startimer] > 0 - || player->mo->player->kartstuff[k_growshrinktimer] > 0)) - { - if (leveltime % 13 == 0 && cv_kartstarsfx.value && !P_IsLocalPlayer(player)) - S_StartSound(player->mo, sfx_smkinv); - } - else if (S_SoundPlaying(player->mo, sfx_smkinv)) - S_StopSoundByID(player->mo, sfx_smkinv); - - // Plays the music after the starting countdown. - if (P_IsLocalPlayer(player) && leveltime == 158) - S_ChangeMusic(mapmusname, mapmusflags, true); -} - -void K_KartPlayerAfterThink(player_t *player) -{ - if (player->kartstuff[k_startimer]) - { - player->mo->frame |= FF_FULLBRIGHT; - } - else - { - if (!(player->mo->state->frame & FF_FULLBRIGHT)) - player->mo->frame &= ~FF_FULLBRIGHT; - } -} - static void K_PlayTauntSound(mobj_t *source) { S_StartSound(source, sfx_taunt1+P_RandomKey(4)); @@ -2261,7 +2085,7 @@ void K_DoMushroom(player_t *player, boolean doPFlag) player->kartstuff[k_sounds] = 50; } -static void K_DoLightning(player_t *player, boolean bluelightning) +static void K_DoLightning(player_t *player) { mobj_t *mo; thinker_t *think; @@ -2284,7 +2108,7 @@ static void K_DoLightning(player_t *player, boolean bluelightning) if (mo->player && !mo->player->spectator && mo->player->kartstuff[k_position] < player->kartstuff[k_position]) - P_DamageMobj(mo, player->mo, player->mo, bluelightning ? 65 : 64); + P_DamageMobj(mo, player->mo, player->mo, 64); else continue; } @@ -2296,6 +2120,21 @@ static void K_DoLightning(player_t *player, boolean bluelightning) player->kartstuff[k_sounds] = 50; } +static void K_DoBlueShell(player_t *victim, player_t *source) +{ + INT32 i; + S_StartSound(victim->mo, sfx_bkpoof); // Sound the BANG! + + for (i = 0; i < MAXPLAYERS; i++) + { + if (playeringame[i]) + P_FlashPal(&players[i], PAL_NUKE, 10); + } + + if (victim->mo && !victim->spectator) + P_DamageMobj(victim->mo, source->mo, source->mo, 65); +} + void K_DoBouncePad(mobj_t *mo, fixed_t vertispeed) { if (mo->player && mo->player->spectator) @@ -2346,6 +2185,213 @@ void K_DoBouncePad(mobj_t *mo, fixed_t vertispeed) S_StartSound(mo, sfx_boing); } +/** \brief Decreases various kart timers and powers per frame. Called in P_PlayerThink in p_user.c + + \param player player object passed from P_PlayerThink + \param cmd control input from player + + \return void +*/ +void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) +{ + K_UpdateOffroad(player); + + // setting players to use the star colormap and spawning afterimages + if (player->kartstuff[k_startimer]) + { + mobj_t *ghost; + player->mo->colorized = true; + ghost = P_SpawnGhostMobj(player->mo); + ghost->fuse = 4; + ghost->frame |= FF_FULLBRIGHT; + } + else + { + player->mo->colorized = false; + } + + if (player->kartstuff[k_itemclose]) + player->kartstuff[k_itemclose]--; + + if (player->kartstuff[k_spinout]) + player->kartstuff[k_spinout]--; + + if (player->kartstuff[k_spinouttimer]) + player->kartstuff[k_spinouttimer]--; + else if (!comeback) + player->kartstuff[k_comebacktimer] = comebacktime; + else if (player->kartstuff[k_comebacktimer]) + { + player->kartstuff[k_comebacktimer]--; + if (player == &players[consoleplayer] && player->kartstuff[k_balloon] <= 0 && player->kartstuff[k_comebacktimer] <= 0) + comebackshowninfo = true; // client has already seen the message + } + + if (player->kartstuff[k_spinout] == 0 && player->kartstuff[k_spinouttimer] == 0 && player->powers[pw_flashing] == K_GetKartFlashing()) + player->powers[pw_flashing]--; + + if (player->kartstuff[k_magnettimer]) + player->kartstuff[k_magnettimer]--; + + if (player->kartstuff[k_mushroomtimer]) + player->kartstuff[k_mushroomtimer]--; + + if (player->kartstuff[k_floorboost]) + player->kartstuff[k_floorboost]--; + + if (player->kartstuff[k_driftboost]) + player->kartstuff[k_driftboost]--; + + if (player->kartstuff[k_startimer]) + player->kartstuff[k_startimer]--; + + 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) + { + player->mo->destscale = mapheaderinfo[gamemap-1]->mobj_scale; + P_RestoreMusic(player); + } + + if (player->kartstuff[k_bootaketimer] == 0 && player->kartstuff[k_boostolentimer] == 0 + && player->kartstuff[k_goldshroomtimer]) + player->kartstuff[k_goldshroomtimer]--; + + if (player->kartstuff[k_bootimer]) + player->kartstuff[k_bootimer]--; + + if (player->kartstuff[k_bootaketimer]) + player->kartstuff[k_bootaketimer]--; + + if (player->kartstuff[k_boostolentimer]) + player->kartstuff[k_boostolentimer]--; + + if (player->kartstuff[k_squishedtimer]) + player->kartstuff[k_squishedtimer]--; + + if (player->kartstuff[k_laserwisptimer]) + player->kartstuff[k_laserwisptimer]--; + + if (player->kartstuff[k_justbumped]) + player->kartstuff[k_justbumped]--; + + if (player->kartstuff[k_deathsentence]) + { + if (player->kartstuff[k_deathsentence] == 1) + K_DoBlueShell(player, &players[blueshellplayer]); + player->kartstuff[k_deathsentence]--; + } + + if (player->kartstuff[k_poweritemtimer]) + player->kartstuff[k_poweritemtimer]--; + + if (player->kartstuff[k_lapanimation]) + player->kartstuff[k_lapanimation]--; + + if (G_BattleGametype() && (player->exiting || player->kartstuff[k_comebacktimer])) + { + if (player->exiting) + { + if (player->exiting < 6*TICRATE) + player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; + } + else + { + if (player->kartstuff[k_comebacktimer] < 6*TICRATE) + player->kartstuff[k_cardanimation] -= ((164-player->kartstuff[k_cardanimation])/8)+1; + else if (player->kartstuff[k_comebacktimer] < 9*TICRATE) + player->kartstuff[k_cardanimation] += ((164-player->kartstuff[k_cardanimation])/8)+1; + } + + if (player->kartstuff[k_cardanimation] > 164) + player->kartstuff[k_cardanimation] = 164; + if (player->kartstuff[k_cardanimation] < 0) + player->kartstuff[k_cardanimation] = 0; + } + else + player->kartstuff[k_cardanimation] = 0; + + if (player->kartstuff[k_sounds]) + player->kartstuff[k_sounds]--; + + // ??? + /* + if (player->kartstuff[k_jmp] > 1 && onground) + { + S_StartSound(player->mo, sfx_spring); + P_DoJump(player, false); + player->mo->momz *= player->kartstuff[k_jmp]; + player->kartstuff[k_jmp] = 0; + } + */ + + if (player->kartstuff[k_comebacktimer]) + player->kartstuff[k_comebackmode] = 0; + + if (P_IsObjectOnGround(player->mo) && !(player->mo->momz) + && player->kartstuff[k_feather] & 2) + player->kartstuff[k_feather] &= ~2; + + if (cmd->buttons & BT_DRIFT) + player->kartstuff[k_jmp] = 1; + else + player->kartstuff[k_jmp] = 0; + + // Lakitu Checker + if (player->kartstuff[k_lakitu]) + K_LakituChecker(player); + + // Roulette Code + //K_KartItemRouletteByPosition(player, cmd); // Old, position-based + K_KartItemRouletteByDistance(player, cmd); // New, distance-based + + // Stopping of the horrible star SFX + if (player->mo->health <= 0 || player->mo->player->kartstuff[k_startimer] <= 0 + || player->mo->player->kartstuff[k_growshrinktimer] > 0) // If you don't have invincibility (or mega is active too) + { + if (S_SoundPlaying(player->mo, sfx_star)) // But the sound is playing + S_StopSoundByID(player->mo, sfx_star); // Stop it + } + + // And the same for the mega mushroom SFX + if (!(player->mo->health > 0 && player->mo->player->kartstuff[k_growshrinktimer] > 0)) // If you aren't big + { + if (S_SoundPlaying(player->mo, sfx_mega)) // But the sound is playing + S_StopSoundByID(player->mo, sfx_mega); // Stop it + } + + // AAAAAAND handle the SMK star alarm + if (player->mo->health > 0 && (player->mo->player->kartstuff[k_startimer] > 0 + || player->mo->player->kartstuff[k_growshrinktimer] > 0)) + { + if (leveltime % 13 == 0 && cv_kartstarsfx.value && !P_IsLocalPlayer(player)) + S_StartSound(player->mo, sfx_smkinv); + } + else if (S_SoundPlaying(player->mo, sfx_smkinv)) + S_StopSoundByID(player->mo, sfx_smkinv); + + // Plays the music after the starting countdown. + if (P_IsLocalPlayer(player) && leveltime == 158) + S_ChangeMusic(mapmusname, mapmusflags, true); +} + +void K_KartPlayerAfterThink(player_t *player) +{ + if (player->kartstuff[k_startimer]) + { + player->mo->frame |= FF_FULLBRIGHT; + } + else + { + if (!(player->mo->state->frame & FF_FULLBRIGHT)) + player->mo->frame &= ~FF_FULLBRIGHT; + } +} + // Returns false if this player being placed here causes them to collide with any other player // Used in g_game.c for match etc. respawning // This does not check along the z because the z is not correctly set for the spawnee at this point @@ -3141,14 +3187,47 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // Thunder else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_lightning] == 1 && NO_BOO) { - K_DoLightning(player, false); + K_DoLightning(player); player->kartstuff[k_lightning] = 0; player->kartstuff[k_itemclose] = 10; } // Blue Shell else if (ATTACK_IS_DOWN && !HOLDING_ITEM && player->kartstuff[k_blueshell] == 1 && NO_BOO) { - K_DoLightning(player, true); + UINT8 i; + UINT8 bestrank = 0; + fixed_t dist = 0; + + //K_DoLightning(player, true); + + for (i = 0; i < MAXPLAYERS; i++) + { + fixed_t thisdist; + if (!playeringame[i] || players[i].spectator) + continue; + if (&players[i] == player) + continue; + if (!players[i].mo) + continue; + if (players[i].exiting) + continue; + thisdist = R_PointToDist2(player->mo->x, player->mo->y, players[i].mo->x, players[i].mo->y); + if (bestrank == 0 || players[i].kartstuff[k_position] < bestrank) + { + bestrank = players[i].kartstuff[k_position]; + dist = thisdist; + } + } + + if (dist == 0) + blueshellincoming = 6*TICRATE; // If you couldn't find anyone, just set an abritary timer + else + blueshellincoming = (tic_t)max(1, FixedDiv(dist, 64*FRACUNIT)/FRACUNIT); + + blueshellplayer = player-players; + player->pflags |= PF_ATTACKDOWN; + K_PlayTauntSound(player->mo); + player->kartstuff[k_sounds] = 50; player->kartstuff[k_blueshell] = 0; player->kartstuff[k_itemclose] = 10; } @@ -3526,6 +3605,7 @@ static patch_t *kp_checkmega; static patch_t *kp_checkmegaw; static patch_t *kp_rankballoon; static patch_t *kp_ranknoballoons; +static patch_t *kp_bswarning[2]; /* static patch_t *kp_neonoitem; static patch_t *kp_electroshield; @@ -3694,6 +3774,10 @@ void K_LoadKartHUDGraphics(void) kp_rankballoon = W_CachePatchName("K_BLNICO", PU_HUDGFX); kp_ranknoballoons = W_CachePatchName("K_NOBLNS", PU_HUDGFX); + // Blue Shell warning + kp_bswarning[0] = W_CachePatchName("K_BSWRN1", PU_HUDGFX); + kp_bswarning[1] = W_CachePatchName("K_BSWRN2", PU_HUDGFX); + /* // Neo-Kart item windows kp_electroshield = W_CachePatchName("KNITELEC", PU_HUDGFX); @@ -3737,6 +3821,7 @@ INT32 FACE_X, FACE_Y; // Top-four Faces INT32 LAKI_X, LAKI_Y; // Lakitu INT32 CHEK_Y; // CHECK graphic INT32 MINI_X, MINI_Y; // Minimap +INT32 BSWR_X, BSWR_Y; // Blue Shell warning static void K_initKartHUD(void) { @@ -3804,6 +3889,9 @@ static void K_initKartHUD(void) // Minimap MINI_X = BASEVIDWIDTH - 50; // 270 MINI_Y = BASEVIDHEIGHT/2; // 100 + // Blue Shell warning + BSWR_X = BASEVIDWIDTH/2; // 270 + BSWR_Y = BASEVIDHEIGHT- 24; // 176 if (splitscreen) // Splitscreen { @@ -3816,6 +3904,8 @@ static void K_initKartHUD(void) MINI_Y = (BASEVIDHEIGHT/2); + BSWR_Y = (BASEVIDHEIGHT/2)-8; + if (splitscreen > 1) // 3P/4P Small Splitscreen { ITEM_X = 0; @@ -3829,6 +3919,8 @@ static void K_initKartHUD(void) MINI_X = (3*BASEVIDWIDTH/4); MINI_Y = (3*BASEVIDHEIGHT/4); + BSWR_X = BASEVIDWIDTH/4; + if (splitscreen > 2) // 4P-only { MINI_X = (BASEVIDWIDTH/2); @@ -4534,6 +4626,23 @@ static void K_drawKartBalloonsOrKarma(void) } } +static void K_drawBlueShellWarning(void) +{ + patch_t *localpatch = kp_nodraw; + INT32 splitflags = K_calcSplitFlags(V_SNAPTOBOTTOM); + + if (!(stplyr->kartstuff[k_deathsentence] > 0 + || (blueshellincoming > 0 && blueshellincoming < 2*TICRATE && stplyr->kartstuff[k_position] == 1))) + return; + + if (leveltime % 8 > 3) + localpatch = kp_bswarning[1]; + else + localpatch = kp_bswarning[0]; + + V_DrawScaledPatch(BSWR_X, BSWR_Y, splitflags, localpatch); +} + fixed_t K_FindCheckX(fixed_t px, fixed_t py, angle_t ang, fixed_t mx, fixed_t my) { fixed_t dist, x; @@ -5103,6 +5212,9 @@ void K_drawKartHUD(void) // Draw the numerical position K_DrawKartPositionNum(stplyr->kartstuff[k_position]); } + + // You're about to DIEEEEE + K_drawBlueShellWarning(); } else if (G_BattleGametype()) // Battle-only { diff --git a/src/p_saveg.c b/src/p_saveg.c index e1a9944a7..0fc69ad3a 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -3248,11 +3248,16 @@ static void P_NetArchiveMisc(void) WRITEUINT32(save_p, hidetime); // SRB2kart + WRITEINT32(save_p, numgotboxes); + WRITEUINT8(save_p, gamespeed); WRITEUINT8(save_p, mirrormode); WRITEUINT8(save_p, franticitems); WRITEUINT8(save_p, comeback); - WRITEINT32(save_p, numgotboxes); // Probably shouldn't need nummapboxes + + WRITEUINT32(save_p, lightningcooldown); + WRITEUINT32(save_p, blueshellincoming); + WRITEUINT8(save_p, blueshellplayer); // Is it paused? if (paused) @@ -3340,11 +3345,16 @@ static inline boolean P_NetUnArchiveMisc(void) hidetime = READUINT32(save_p); // SRB2kart + numgotboxes = READINT32(save_p); + gamespeed = READUINT8(save_p); mirrormode = (boolean)READUINT8(save_p); franticitems = (boolean)READUINT8(save_p); comeback = (boolean)READUINT8(save_p); - numgotboxes = READINT32(save_p); + + lightningcooldown = READUINT32(save_p); + blueshellincoming = READUINT32(save_p); + blueshellplayer = READUINT8(save_p); // Is it paused? if (READUINT8(save_p) == 0x2f) diff --git a/src/p_tick.c b/src/p_tick.c index 84c368352..8235e8d5c 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -677,6 +677,38 @@ void P_Ticker(boolean run) if (countdown2) countdown2--; + if (blueshellincoming && --blueshellincoming <= 0) + { + UINT8 best = 0; + SINT8 hurtthisguy = -1; + + blueshellincoming = 0; + + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || players[i].spectator) + continue; + + if (!players[i].mo) + continue; + + if (players[i].exiting) + continue; + + if (best <= 0 || players[i].kartstuff[k_position] < best) + { + best = players[i].kartstuff[k_position]; + hurtthisguy = i; + } + } + + if (hurtthisguy != -1) + players[hurtthisguy].kartstuff[k_deathsentence] = TICRATE+1; + } + + if (lightningcooldown) + lightningcooldown--; + if (quake.time) { fixed_t ir = quake.intensity>>1; From 441f0f8abf1fdfcb012def88fb65ebdaa31c7916 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 5 Jun 2018 21:45:54 -0400 Subject: [PATCH 45/51] Lightning cooldown change - Lightning cooldown reduced to 20 seconds - You can no longer mash to get an item quicker --- src/k_kart.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index bd7d0dfd1..081db2245 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -476,7 +476,7 @@ static void K_KartGetItemResult(player_t *player, fixed_t getitem, boolean retro player->kartstuff[k_blueshell] = 1; else player->kartstuff[k_bobomb] |= 2; - lightningcooldown = 30*TICRATE; + lightningcooldown = 20*TICRATE; break; case 16: // Fire Flower - or - Deton (Blue Shell) if (retrokart) @@ -492,7 +492,7 @@ static void K_KartGetItemResult(player_t *player, fixed_t getitem, boolean retro break; case 18: // Lightning player->kartstuff[k_lightning] = 1; - lightningcooldown = 30*TICRATE; + lightningcooldown = 20*TICRATE; break; case 19: // Feather player->kartstuff[k_feather] |= 1; @@ -535,7 +535,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) { INT32 i; INT32 pingame = 0, pexiting = 0; - INT32 roulettestop; + //INT32 roulettestop; INT32 prandom; INT32 pdis = 0, useodds = 0; INT32 spawnchance[NUMKARTITEMS * NUMKARTODDS]; @@ -554,13 +554,12 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsLocalPlayer(player)) S_StartSound(NULL,sfx_mkitm1 + ((player->kartstuff[k_itemroulette] / 3) % 8)); - roulettestop = (TICRATE*1) + (3*(pingame - player->kartstuff[k_position])); + //roulettestop = (TICRATE*1) + (3*(pingame - player->kartstuff[k_position])); // If the roulette finishes or the player presses BT_ATTACK, stop the roulette and calculate the item. // I'm returning via the exact opposite, however, to forgo having another bracket embed. Same result either way, I think. // Finally, if you get past this check, now you can actually start calculating what item you get. - if (!(player->kartstuff[k_itemroulette] >= (TICRATE*3) - || ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_itemroulette] >= roulettestop))) + if (!(player->kartstuff[k_itemroulette] >= (TICRATE*3))) //|| ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_itemroulette] >= roulettestop))) return; if (cmd->buttons & BT_ATTACK) From 14dcbe1a210de0f5b0063486cd252699b3cc872d Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 5 Jun 2018 23:46:25 -0400 Subject: [PATCH 46/51] Adjustin' BL based off the netgame, and mashing is back Now it just cripples your chances for good items, mwaha --- src/k_kart.c | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 081db2245..21b16c388 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -380,7 +380,7 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][9] = /*Red Shell*/ { 0, 0, 3, 2, 2, 1, 0, 0, 0 }, // Red Shell /*Triple Green Shell*/ { 0, 0, 0, 1, 1, 1, 0, 0, 0 }, // Triple Green Shell /*Bob-omb*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Bob-omb - /*Blue Shell*/ { 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // Blue Shell + /*Blue Shell*/ { 0, 0, 1, 2, 4, 3, 1, 0, 0 }, // Blue Shell /*Fire Flower*/ { 0, 0, 1, 2, 1, 0, 0, 0, 0 }, // Fire Flower /*Triple Red Shell*/ { 0, 0, 0, 1, 1, 0, 0, 0, 0 }, // Triple Red Shell /*Lightning*/ { 0, 0, 0, 0, 0, 0, 1, 2, 0 }, // Lightning @@ -512,7 +512,7 @@ static void K_KartGetItemResult(player_t *player, fixed_t getitem, boolean retro \return void */ -static INT32 K_KartGetItemOdds(INT32 pos, INT32 itemnum) +static INT32 K_KartGetItemOdds(INT32 pos, INT32 itemnum, boolean mashed) { INT32 newodds; @@ -521,10 +521,15 @@ static INT32 K_KartGetItemOdds(INT32 pos, INT32 itemnum) else newodds = K_KartItemOddsDistance_Retro[itemnum-1][pos]; - if (franticitems && (itemnum == 1 || itemnum == 4 || itemnum == 5 || itemnum == 6 + if (itemnum == 1 || itemnum == 4 || itemnum == 5 || itemnum == 6 || itemnum == 7 || itemnum == 8 || itemnum == 12 || itemnum == 13 || itemnum == 14 || itemnum == 15 - || itemnum == 16 || itemnum == 17 || itemnum == 18)) - newodds *= 2; + || itemnum == 16 || itemnum == 17 || itemnum == 18) // Powerful items! + { + if (franticitems) + newodds *= 2; + if (mashed) + newodds /= 2; + } return newodds; } @@ -535,7 +540,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) { INT32 i; INT32 pingame = 0, pexiting = 0; - //INT32 roulettestop; + INT32 roulettestop; INT32 prandom; INT32 pdis = 0, useodds = 0; INT32 spawnchance[NUMKARTITEMS * NUMKARTODDS]; @@ -543,6 +548,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) INT32 distvar = (64*14); INT32 avgballoon = 0; INT32 secondist = 0; + boolean mashed = false; // This makes the roulette cycle through items - if this is 0, you shouldn't be here. if (player->kartstuff[k_itemroulette]) @@ -554,12 +560,14 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if ((player->kartstuff[k_itemroulette] % 3) == 1 && P_IsLocalPlayer(player)) S_StartSound(NULL,sfx_mkitm1 + ((player->kartstuff[k_itemroulette] / 3) % 8)); - //roulettestop = (TICRATE*1) + (3*(pingame - player->kartstuff[k_position])); + roulettestop = (TICRATE*1) + (3*(pingame - player->kartstuff[k_position])); // If the roulette finishes or the player presses BT_ATTACK, stop the roulette and calculate the item. // I'm returning via the exact opposite, however, to forgo having another bracket embed. Same result either way, I think. // Finally, if you get past this check, now you can actually start calculating what item you get. - if (!(player->kartstuff[k_itemroulette] >= (TICRATE*3))) //|| ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_itemroulette] >= roulettestop))) + if ((cmd->buttons & BT_ATTACK) && player->kartstuff[k_itemroulette] >= roulettestop) + mashed = true; // Mashing halves your chances for the good items + else if (!(player->kartstuff[k_itemroulette] >= (TICRATE*3))) return; if (cmd->buttons & BT_ATTACK) @@ -629,7 +637,10 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) else { if (franticitems) // Frantic items make the distances between everyone artifically higher :P + { pdis = (15*pdis/14); + secondist = (15*pdis/14); + } if (pingame == 1) useodds = 0; // Record Attack, or just alone else if (pdis <= distvar * 0) useodds = 1; // (64*14) * 0 = 0 else if (pdis <= distvar * 1) useodds = 2; // (64*14) * 1 = 896 @@ -642,7 +653,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) } #define SETITEMRESULT(pos, itemnum) \ - for (chance = 0; chance < K_KartGetItemOdds(pos, itemnum); chance++) \ + for (chance = 0; chance < K_KartGetItemOdds(pos, itemnum, mashed); chance++) \ spawnchance[numchoices++] = itemnum // Check the game type to differentiate odds. @@ -663,7 +674,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (cv_triplegreenshell.value) SETITEMRESULT(useodds, 13); // Triple Green Shell if (cv_bobomb.value) SETITEMRESULT(useodds, 14); // Bob-omb if (cv_blueshell.value && pexiting == 0 - && !lightningcooldown && secondist > distvar*6) SETITEMRESULT(useodds, 15); // Blue Shell + && !lightningcooldown && secondist > distvar*2) SETITEMRESULT(useodds, 15); // Blue Shell if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower if (cv_tripleredshell.value && pingame > 2) SETITEMRESULT(useodds, 17); // Triple Red Shell if (cv_lightning.value && pingame > pexiting && !lightningcooldown) SETITEMRESULT(useodds, 18); // Lightning From 118f8f8b2de53aff1453607f357aa7c7166302dc Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 6 Jun 2018 18:36:39 -0400 Subject: [PATCH 47/51] Flags for only drawing an object on one person's screen, for juicy Boo splitscreen support (also more item changes from last night that I just forgot to commit earlier) --- src/dehacked.c | 4 +++ src/info.c | 2 +- src/k_kart.c | 93 ++++++++++++++++++++++++++++++++------------------ src/p_inter.c | 12 +++---- src/p_mobj.c | 84 +++++++++++++++++++++++++++++++++++++++------ src/p_mobj.h | 5 +++ src/p_setup.c | 4 +++ src/r_bsp.c | 10 +++--- src/r_bsp.h | 2 +- src/r_main.c | 18 ++++++++-- src/r_things.c | 49 ++++++++++++++++++++++++-- src/r_things.h | 2 +- 12 files changed, 220 insertions(+), 65 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 2aed79683..02a0c0bf6 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -7311,6 +7311,10 @@ static const char *const MOBJEFLAG_LIST[] = { "JUSTBOUNCEDWALL", // SRB2Kart: Mobj already bounced off a wall this tic "SPRUNG", // Mobj was already sprung this tic "APPLYPMOMZ", // Platform movement + "DRAWONLYFORP1", // SRB2Kart: Splitscreen sprite draw flags + "DRAWONLYFORP2", + "DRAWONLYFORP3", + "DRAWONLYFORP4", NULL }; diff --git a/src/info.c b/src/info.c index 3c7e28940..7ab34df06 100644 --- a/src/info.c +++ b/src/info.c @@ -15242,7 +15242,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 1, // damage sfx_None, // activesound - MF_NOCLIP|MF_NOCLIPHEIGHT|MF_NOGRAVITY|MF_SCENERY, // flags + MF_NOBLOCKMAP|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_NOGRAVITY|MF_SCENERY, // flags S_NULL // raisestate }, diff --git a/src/k_kart.c b/src/k_kart.c index 21b16c388..8eaf09aca 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -367,11 +367,11 @@ static INT32 K_KartItemOddsDistance_Retro[NUMKARTITEMS][9] = //P-Odds 0 1 2 3 4 5 6 7 8 /*Magnet*/ { 0, 1, 2, 0, 0, 0, 0, 0, 0 }, // Magnet /*Boo*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0 }, // Boo - /*Mushroom*/ { 1, 0, 0, 3, 7, 5, 0, 0, 0 }, // Mushroom - /*Triple Mushroom*/ { 0, 0, 0, 0, 3, 8, 6, 4, 0 }, // Triple Mushroom - /*Mega Mushroom*/ { 0, 0, 0, 0, 0, 1, 1, 1, 2 }, // Mega Mushroom - /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 2, 4, 3, 0 }, // Gold Mushroom - /*Star*/ { 0, 0, 0, 0, 0, 1, 6, 8,18 }, // Star + /*Mushroom*/ {20, 0, 0, 3, 7, 6, 0, 0, 0 }, // Mushroom + /*Triple Mushroom*/ { 0, 0, 0, 0, 3, 8, 7, 4, 0 }, // Triple Mushroom + /*Mega Mushroom*/ { 0, 0, 0, 0, 0, 0, 1, 1, 2 }, // Mega Mushroom + /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 3, 5, 4, 0 }, // Gold Mushroom + /*Star*/ { 0, 0, 0, 0, 0, 1, 6, 9,18 }, // Star /*Triple Banana*/ { 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Triple Banana /*Fake Item*/ { 0, 4, 2, 1, 0, 0, 0, 0, 0 }, // Fake Item @@ -393,25 +393,25 @@ static INT32 K_KartItemOddsBalloons[NUMKARTITEMS][6] = //P-Odds 0 1 2 3 4 5 /*Magnet*/ { 0, 0, 0, 0, 0, 0 }, // Magnet /*Boo*/ { 0, 0, 1, 1, 0, 0 }, // Boo - /*Mushroom*/ { 0, 1, 2, 1, 0, 1 }, // Mushroom - /*Triple Mushroom*/ { 0, 0, 0, 0, 0, 0 }, // Triple Mushroom - /*Mega Mushroom*/ { 1, 2, 0, 0, 0, 1 }, // Mega Mushroom + /*Mushroom*/ { 3, 1, 2, 2, 0, 2 }, // Mushroom + /*Triple Mushroom*/ { 3, 0, 0, 0, 0, 2 }, // Triple Mushroom + /*Mega Mushroom*/ { 4, 2, 0, 0, 0, 2 }, // Mega Mushroom /*Gold Mushroom*/ { 0, 0, 0, 0, 0, 0 }, // Gold Mushroom - /*Star*/ { 1, 2, 0, 0, 0, 1 }, // Star + /*Star*/ { 4, 2, 1, 0, 0, 2 }, // Star - /*Triple Banana*/ { 0, 1, 1, 0, 0, 1 }, // Triple Banana - /*Fake Item*/ { 0, 0, 2, 1, 1, 0 }, // Fake Item - /*Banana*/ { 0, 0, 3, 1, 1, 0 }, // Banana - /*Green Shell*/ { 0, 0, 5, 3, 2, 0 }, // Green Shell - /*Red Shell*/ { 0, 3, 3, 0, 0, 1 }, // Red Shell - /*Triple Green Shell*/ { 0, 1, 1, 0, 0, 1 }, // Triple Green Shell - /*Bob-omb*/ { 0, 3, 3, 0, 0, 1 }, // Bob-omb + /*Triple Banana*/ { 0, 2, 2, 1, 1, 2 }, // Triple Banana + /*Fake Item*/ { 0, 0, 2, 2, 3, 0 }, // Fake Item + /*Banana*/ { 0, 0, 2, 3, 6, 0 }, // Banana + /*Green Shell*/ { 0, 0, 3, 5,10, 0 }, // Green Shell + /*Red Shell*/ { 3, 3, 2, 1, 0, 2 }, // Red Shell + /*Triple Green Shell*/ { 0, 3, 1, 1, 0, 2 }, // Triple Green Shell + /*Bob-omb*/ { 0, 3, 2, 1, 0, 2 }, // Bob-omb /*Blue Shell*/ { 0, 0, 0, 0, 0, 0 }, // Blue Shell - /*Fire Flower*/ { 0, 3, 3, 0, 0, 1 }, // Fire Flower - /*Triple Red Shell*/ { 1, 2, 0, 0, 0, 1 }, // Triple Red Shell + /*Fire Flower*/ { 0, 2, 1, 1, 0, 2 }, // Fire Flower + /*Triple Red Shell*/ { 3, 2, 0, 0, 0, 2 }, // Triple Red Shell /*Lightning*/ { 0, 0, 0, 0, 0, 0 }, // Lightning - /*Feather*/ { 0, 0, 1, 1, 0, 0 } // Feather + /*Feather*/ { 0, 0, 1, 2, 0, 0 } // Feather }; /** \brief Item Roulette for Kart @@ -548,6 +548,8 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) INT32 distvar = (64*14); INT32 avgballoon = 0; INT32 secondist = 0; + SINT8 first = -1; + SINT8 second = -1; boolean mashed = false; // This makes the roulette cycle through items - if this is 0, you shouldn't be here. @@ -594,9 +596,6 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) for (i = 0; i < MAXPLAYERS; i++) { - SINT8 first = -1; - SINT8 second = -1; - if (playeringame[i] && !players[i].spectator && players[i].mo) { if (players[i].kartstuff[k_position] < player->kartstuff[k_position]) @@ -610,15 +609,15 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (players[i].kartstuff[k_position] == 2 && second == -1) second = i; } - - if (first != -1 && second != -1 && !secondist) // calculate 2nd's distance from 1st, for blue shell - secondist = P_AproxDistance(P_AproxDistance(players[first].mo->x - players[second].mo->x, - players[first].mo->y - players[second].mo->y), - players[first].mo->z - players[second].mo->z) / mapheaderinfo[gamemap-1]->mobj_scale - * (pingame - 1) - / ((pingame - 1) * (pingame + 1) / 3); } + if (first != -1 && second != -1 && !secondist) // calculate 2nd's distance from 1st, for blue shell + secondist = P_AproxDistance(P_AproxDistance(players[first].mo->x - players[second].mo->x, + players[first].mo->y - players[second].mo->y), + players[first].mo->z - players[second].mo->z) / mapheaderinfo[gamemap-1]->mobj_scale + * (pingame - 1) + / ((pingame - 1) * (pingame + 1) / 3); + player->kartstuff[k_itemclose] = 0; // Reset the item window closer. if (G_BattleGametype()) // Battle Mode @@ -652,6 +651,8 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) else useodds = 8; } + //CONS_Printf("%d %d\n", secondist, distvar*2); + #define SETITEMRESULT(pos, itemnum) \ for (chance = 0; chance < K_KartGetItemOdds(pos, itemnum, mashed); chance++) \ spawnchance[numchoices++] = itemnum @@ -674,7 +675,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (cv_triplegreenshell.value) SETITEMRESULT(useodds, 13); // Triple Green Shell if (cv_bobomb.value) SETITEMRESULT(useodds, 14); // Bob-omb if (cv_blueshell.value && pexiting == 0 - && !lightningcooldown && secondist > distvar*2) SETITEMRESULT(useodds, 15); // Blue Shell + && (secondist > distvar*4) && !lightningcooldown) SETITEMRESULT(useodds, 15); // Blue Shell if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower if (cv_tripleredshell.value && pingame > 2) SETITEMRESULT(useodds, 17); // Triple Red Shell if (cv_lightning.value && pingame > pexiting && !lightningcooldown) SETITEMRESULT(useodds, 18); // Lightning @@ -3323,23 +3324,47 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->kartstuff[k_bootimer] > 0) { - if ((player == &players[displayplayer] && !splitscreen) - || (!(player == &players[displayplayer] && !splitscreen) - && (player->kartstuff[k_bootimer] < 1*TICRATE/2 || player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2)))) + if (splitscreen) { if (leveltime & 1) player->mo->flags2 |= MF2_DONTDRAW; else player->mo->flags2 &= ~MF2_DONTDRAW; + + if (player->kartstuff[k_bootimer] >= (1*TICRATE/2) && player->kartstuff[k_bootimer] <= bootime-(1*TICRATE/2)) + { + if (player == &players[secondarydisplayplayer]) + player->mo->eflags |= MFE_DRAWONLYFORP2; + else if (player == &players[thirddisplayplayer] && splitscreen > 1) + player->mo->eflags |= MFE_DRAWONLYFORP3; + else if (player == &players[fourthdisplayplayer] && splitscreen > 2) + player->mo->eflags |= MFE_DRAWONLYFORP4; + else + player->mo->eflags |= MFE_DRAWONLYFORP1; + } + else + player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } else - player->mo->flags2 |= MF2_DONTDRAW; + { + if (player == &players[displayplayer] + || (player != &players[displayplayer] && (player->kartstuff[k_bootimer] < (1*TICRATE/2) || player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2)))) + { + if (leveltime & 1) + player->mo->flags2 |= MF2_DONTDRAW; + else + player->mo->flags2 &= ~MF2_DONTDRAW; + } + else + player->mo->flags2 |= MF2_DONTDRAW; + } player->powers[pw_flashing] = player->kartstuff[k_bootimer]; // We'll do this for now, let's people know about the invisible people through subtle hints } else if (player->kartstuff[k_bootimer] == 0) { player->mo->flags2 &= ~MF2_DONTDRAW; + player->mo->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } if (G_BattleGametype() && player->kartstuff[k_balloon] <= 0) // dead in match? you da bomb diff --git a/src/p_inter.c b/src/p_inter.c index d3587717a..6099e585b 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3127,8 +3127,10 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da player->kartstuff[k_mushroomtimer] = 0; // Thunder - if (damage == 64 && player != source->player) + if (damage == 64) { + if (player == source->player) + return false; // Don't flip out while super! if (!player->kartstuff[k_startimer] && player->kartstuff[k_growshrinktimer] <= 0) { @@ -3148,20 +3150,18 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_LIGHTNING); return true; } - else if (damage == 64 && player == source->player) - return false; // Blue Thunder - if (damage == 65 && player->kartstuff[k_position] == 1) + if (damage == 65) { + if (player == source->player) + return false; // Just need to do this now! Being thrown upwards is done by the explosion. P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUELIGHTNING); blueexplode = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_BLUEEXPLOSION); P_SetTarget(&blueexplode->target, source); return true; } - else if (damage == 65 && player->kartstuff[k_position] > 1) - return false; //} // Sudden-Death mode diff --git a/src/p_mobj.c b/src/p_mobj.c index 4176881ee..bbf0848c8 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6264,6 +6264,26 @@ void P_RunShadows(void) else mobj->flags2 &= ~MF2_DONTDRAW; + if (mobj->target->eflags & MFE_DRAWONLYFORP1) // groooooaann... + mobj->eflags |= MFE_DRAWONLYFORP1; + else + mobj->eflags &= ~MFE_DRAWONLYFORP1; + + if (mobj->target->eflags & MFE_DRAWONLYFORP2) + mobj->eflags |= MFE_DRAWONLYFORP2; + else + mobj->eflags &= ~MFE_DRAWONLYFORP2; + + if (mobj->target->eflags & MFE_DRAWONLYFORP3) + mobj->eflags |= MFE_DRAWONLYFORP3; + else + mobj->eflags &= ~MFE_DRAWONLYFORP3; + + if (mobj->target->eflags & MFE_DRAWONLYFORP4) + mobj->eflags |= MFE_DRAWONLYFORP4; + else + mobj->eflags &= ~MFE_DRAWONLYFORP4; + // First scale to the same radius P_SetScale(mobj, FixedDiv(mobj->target->radius, mobj->info->radius)); @@ -6576,27 +6596,46 @@ void P_MobjThinker(mobj_t *mobj) if (mobj->target->player->kartstuff[k_bootimer] > 0) { - if ((mobj->target->player == &players[displayplayer] - || (splitscreen && mobj->target->player == &players[secondarydisplayplayer]) - || (splitscreen > 1 && mobj->target->player == &players[thirddisplayplayer]) - || (splitscreen > 2 && mobj->target->player == &players[fourthdisplayplayer])) - || (!(mobj->target->player == &players[displayplayer] - || (splitscreen && mobj->target->player == &players[secondarydisplayplayer]) - || (splitscreen > 1 && mobj->target->player == &players[thirddisplayplayer]) - || (splitscreen > 2 && mobj->target->player == &players[fourthdisplayplayer])) - && (mobj->target->player->kartstuff[k_bootimer] < 1*TICRATE/2 || mobj->target->player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2)))) + if (splitscreen) { if (leveltime & 1) mobj->flags2 |= MF2_DONTDRAW; else mobj->flags2 &= ~MF2_DONTDRAW; + + if (mobj->target->player->kartstuff[k_bootimer] >= (1*TICRATE/2) && mobj->target->player->kartstuff[k_bootimer] <= bootime-(1*TICRATE/2)) + { + if (mobj->target->player == &players[secondarydisplayplayer]) + mobj->eflags |= MFE_DRAWONLYFORP2; + else if (mobj->target->player == &players[thirddisplayplayer] && splitscreen > 1) + mobj->eflags |= MFE_DRAWONLYFORP3; + else if (mobj->target->player == &players[fourthdisplayplayer] && splitscreen > 2) + mobj->eflags |= MFE_DRAWONLYFORP4; + else + mobj->eflags |= MFE_DRAWONLYFORP1; + } + else + mobj->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } else - mobj->flags2 |= MF2_DONTDRAW; + { + if (mobj->target->player == &players[displayplayer] + || (mobj->target->player != &players[displayplayer] + && (mobj->target->player->kartstuff[k_bootimer] < (1*TICRATE/2) || mobj->target->player->kartstuff[k_bootimer] > bootime-(1*TICRATE/2)))) + { + if (leveltime & 1) + mobj->flags2 |= MF2_DONTDRAW; + else + mobj->flags2 &= ~MF2_DONTDRAW; + } + else + mobj->flags2 |= MF2_DONTDRAW; + } } else if (mobj->target->player->kartstuff[k_bootimer] == 0) { mobj->flags2 &= ~MF2_DONTDRAW; + mobj->eflags &= ~(MFE_DRAWONLYFORP1|MFE_DRAWONLYFORP2|MFE_DRAWONLYFORP3|MFE_DRAWONLYFORP4); } // Actor's distance from its Target, or Radius. @@ -6791,7 +6830,7 @@ void P_MobjThinker(mobj_t *mobj) } break; case MT_BATTLEBALLOON: - if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->mo + if (mobj->health > 0 && mobj->target && mobj->target->player && mobj->target->player->health > 0 && !mobj->target->player->spectator) { fixed_t rad = 32*mobj->target->scale; @@ -6822,6 +6861,26 @@ void P_MobjThinker(mobj_t *mobj) offz = mobj->target->height / 5; } + if (mobj->target->eflags & MFE_DRAWONLYFORP1) // groooooaann... + mobj->eflags |= MFE_DRAWONLYFORP1; + else + mobj->eflags &= ~MFE_DRAWONLYFORP1; + + if (mobj->target->eflags & MFE_DRAWONLYFORP2) + mobj->eflags |= MFE_DRAWONLYFORP2; + else + mobj->eflags &= ~MFE_DRAWONLYFORP2; + + if (mobj->target->eflags & MFE_DRAWONLYFORP3) + mobj->eflags |= MFE_DRAWONLYFORP3; + else + mobj->eflags &= ~MFE_DRAWONLYFORP3; + + if (mobj->target->eflags & MFE_DRAWONLYFORP4) + mobj->eflags |= MFE_DRAWONLYFORP4; + else + mobj->eflags &= ~MFE_DRAWONLYFORP4; + if (mobj->target->flags2 & MF2_DONTDRAW) mobj->flags2 |= MF2_DONTDRAW; else @@ -6931,6 +6990,9 @@ void P_MobjThinker(mobj_t *mobj) else if (mobj->target->player->kartstuff[k_banana]) P_SetMobjState(mobj, S_PLAYERARROW_BANANA); else if (mobj->target->player->kartstuff[k_greenshell]) P_SetMobjState(mobj, S_PLAYERARROW_GREENSHELL); else if (mobj->target->player->kartstuff[k_mushroom]) P_SetMobjState(mobj, S_PLAYERARROW_MUSHROOM); + else if (mobj->target->player->kartstuff[k_mushroom] + && mobj->target->player->kartstuff[k_mushroomtimer] > 1 + && !(leveltime & 1)) P_SetMobjState(mobj, S_PLAYERARROW_EMPTY); // S_INVISIBLE else P_SetMobjState(mobj, S_PLAYERARROW); // S_INVISIBLE scale += FixedMul(FixedDiv(abs(P_AproxDistance(players[displayplayer].mo->x-mobj->target->x, diff --git a/src/p_mobj.h b/src/p_mobj.h index 01171a57f..919a3d58a 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -239,6 +239,11 @@ typedef enum MFE_SPRUNG = 1<<8, // Platform movement MFE_APPLYPMOMZ = 1<<9, + // SRB2Kart: Splitscreen sprite display; very wasteful but I couldn't think of another way to do it... + MFE_DRAWONLYFORP1 = 1<<10, + MFE_DRAWONLYFORP2 = 1<<11, + MFE_DRAWONLYFORP3 = 1<<12, + MFE_DRAWONLYFORP4 = 1<<13, // free: to and including 1<<15 } mobjeflag_t; diff --git a/src/p_setup.c b/src/p_setup.c index e57fad947..0b6cba1df 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3003,6 +3003,10 @@ boolean P_SetupLevel(boolean skipprecip) comeback = cv_kartcomeback.value; } + lightningcooldown = 0; + blueshellincoming = 0; + blueshellplayer = 0; + // clear special respawning que iquehead = iquetail = 0; diff --git a/src/r_bsp.c b/src/r_bsp.c index 10fac7a52..234d6ee0a 100644 --- a/src/r_bsp.c +++ b/src/r_bsp.c @@ -855,7 +855,7 @@ static void R_AddPolyObjects(subsector_t *sub) drawseg_t *firstseg; -static void R_Subsector(size_t num) +static void R_Subsector(size_t num, UINT8 ssplayer) { INT32 count, floorlightlevel, ceilinglightlevel, light; seg_t *line; @@ -1213,7 +1213,7 @@ static void R_Subsector(size_t num) // Either you must pass the fake sector and handle validcount here, on the // real sector, or you must account for the lighting in some other way, // like passing it as an argument. - R_AddSprites(sub->sector, (floorlightlevel+ceilinglightlevel)/2); + R_AddSprites(sub->sector, (floorlightlevel+ceilinglightlevel)/2, ssplayer); firstseg = NULL; @@ -1419,7 +1419,7 @@ INT32 R_GetPlaneLight(sector_t *sector, fixed_t planeheight, boolean underside) // // killough 5/2/98: reformatted, removed tail recursion -void R_RenderBSPNode(INT32 bspnum) +void R_RenderBSPNode(INT32 bspnum, UINT8 ssplayer) { node_t *bsp; INT32 side; @@ -1430,7 +1430,7 @@ void R_RenderBSPNode(INT32 bspnum) // Decide which side the view point is on. side = R_PointOnSide(viewx, viewy, bsp); // Recursively divide front space. - R_RenderBSPNode(bsp->children[side]); + R_RenderBSPNode(bsp->children[side], ssplayer); // Possibly divide back space. @@ -1448,5 +1448,5 @@ void R_RenderBSPNode(INT32 bspnum) portalcullsector = NULL; } - R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR); + R_Subsector(bspnum == -1 ? 0 : bspnum & ~NF_SUBSECTOR, ssplayer); } diff --git a/src/r_bsp.h b/src/r_bsp.h index e871b5dde..db340221e 100644 --- a/src/r_bsp.h +++ b/src/r_bsp.h @@ -37,7 +37,7 @@ extern INT32 doorclosed; void R_ClearClipSegs(void); void R_PortalClearClipSegs(INT32 start, INT32 end); void R_ClearDrawSegs(void); -void R_RenderBSPNode(INT32 bspnum); +void R_RenderBSPNode(INT32 bspnum, UINT8 ssplayer); void R_AddPortal(INT32 line1, INT32 line2, INT32 x1, INT32 x2); #ifdef POLYOBJECTS diff --git a/src/r_main.c b/src/r_main.c index 82b2b6d54..c516b87ae 100644 --- a/src/r_main.c +++ b/src/r_main.c @@ -1335,6 +1335,18 @@ void R_RenderPlayerView(player_t *player) { portal_pair *portal; const boolean skybox = (skyboxmo[0] && cv_skybox.value); + UINT8 ssplayer; + + if (player == &players[secondarydisplayplayer] && splitscreen) + ssplayer = 2; + else if (player == &players[thirddisplayplayer] && splitscreen > 1) + ssplayer = 3; + else if (player == &players[fourthdisplayplayer] && splitscreen > 2) + ssplayer = 4; + else if (splitscreen) + ssplayer = 1; + else + ssplayer = 0; if (cv_homremoval.value && player == &players[displayplayer]) // if this is display player 1 { @@ -1371,7 +1383,7 @@ void R_RenderPlayerView(player_t *player) R_ClearVisibleFloorSplats(); #endif - R_RenderBSPNode((INT32)numnodes - 1); + R_RenderBSPNode((INT32)numnodes - 1, ssplayer); R_ClipSprites(); R_DrawPlanes(); #ifdef FLOORSPLATS @@ -1404,7 +1416,7 @@ void R_RenderPlayerView(player_t *player) mytotal = 0; ProfZeroTimer(); #endif - R_RenderBSPNode((INT32)numnodes - 1); + R_RenderBSPNode((INT32)numnodes - 1, ssplayer); R_ClipSprites(); #ifdef TIMING RDMSR(0x10, &mycount); @@ -1429,7 +1441,7 @@ void R_RenderPlayerView(player_t *player) validcount++; - R_RenderBSPNode((INT32)numnodes - 1); + R_RenderBSPNode((INT32)numnodes - 1, ssplayer); R_ClipSprites(); //R_DrawPlanes(); //R_DrawMasked(); diff --git a/src/r_things.c b/src/r_things.c index 541a7816b..7309f452a 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -29,6 +29,7 @@ #include "d_netfil.h" // blargh. for nameonly(). #include "m_cheat.h" // objectplace #include "k_kart.h" // SRB2kart +#include "p_local.h" // stplyr #ifdef HWRENDER #include "hardware/hw_md2.h" #endif @@ -1675,7 +1676,7 @@ static void R_ProjectPrecipitationSprite(precipmobj_t *thing) // R_AddSprites // During BSP traversal, this adds sprites by sector. // -void R_AddSprites(sector_t *sec, INT32 lightlevel) +void R_AddSprites(sector_t *sec, INT32 lightlevel, UINT8 ssplayer) { mobj_t *thing; precipmobj_t *precipthing; // Tails 08-25-2002 @@ -1718,6 +1719,25 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) continue; + if (splitscreen) + { + if (thing->eflags & MFE_DRAWONLYFORP1) + if (ssplayer != 1) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP2) + if (ssplayer != 2) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) + if (ssplayer != 3) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) + if (ssplayer != 4) + continue; + } + approx_dist = P_AproxDistance(viewx-thing->x, viewy-thing->y); if (approx_dist <= limit_dist) @@ -1728,8 +1748,31 @@ void R_AddSprites(sector_t *sec, INT32 lightlevel) { // Draw everything in sector, no checks for (thing = sec->thinglist; thing; thing = thing->snext) - if (!(thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW)) - R_ProjectSprite(thing); + { + if (thing->sprite == SPR_NULL || thing->flags2 & MF2_DONTDRAW) + continue; + + if (splitscreen) + { + if (thing->eflags & MFE_DRAWONLYFORP1) + if (ssplayer != 1) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP2) + if (ssplayer != 2) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP3 && splitscreen > 1) + if (ssplayer != 3) + continue; + + if (thing->eflags & MFE_DRAWONLYFORP4 && splitscreen > 2) + if (ssplayer != 4) + continue; + } + + R_ProjectSprite(thing); + } } // Someone seriously wants infinite draw distance for precipitation? diff --git a/src/r_things.h b/src/r_things.h index 347f204f7..c7d4989ca 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -55,7 +55,7 @@ void R_DelSpriteDefs(UINT16 wadnum); #endif //SoM: 6/5/2000: Light sprites correctly! -void R_AddSprites(sector_t *sec, INT32 lightlevel); +void R_AddSprites(sector_t *sec, INT32 lightlevel, UINT8 ssplayer); void R_InitSprites(void); void R_ClearSprites(void); void R_ClipSprites(void); From d24f0597b02dc1eb83ad1a9631c85b07aed3a951 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 6 Jun 2018 20:25:28 -0400 Subject: [PATCH 48/51] This print doesn't work for some reason?! It keeps replacing actnum with zonttl, but ONLY if zonttl is set. Weird as heck, can't figure out why, commenting out for now. --- src/p_setup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/p_setup.c b/src/p_setup.c index 0b6cba1df..bc29cc6cd 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2674,7 +2674,7 @@ boolean P_SetupLevel(boolean skipprecip) } // Print "SPEEDING OFF TO [ZONE] [ACT 1]..." - if (rendermode != render_none) + /*if (rendermode != render_none) { // Don't include these in the fade! char tx[64]; @@ -2686,7 +2686,7 @@ boolean P_SetupLevel(boolean skipprecip) (strlen(mapheaderinfo[gamemap-1]->actnum) > 0) ? va(", Act %s",mapheaderinfo[gamemap-1]->actnum) : ""); V_DrawSmallString(1, 195, V_ALLOWLOWERCASE, tx); I_UpdateNoVsync(); - } + }*/ #ifdef HAVE_BLUA LUA_InvalidateLevel(); From 795ed07a30046b620e8f3cb79bdc93a7da7d1007 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 6 Jun 2018 20:41:23 -0400 Subject: [PATCH 49/51] No bumping when respawning --- src/k_kart.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 8eaf09aca..bc812b440 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -726,6 +726,10 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) || (mobj2->player && mobj2->player->playerstate != PST_LIVE)) return; + if ((mobj1->player && mobj1->player->kartstuff[k_lakitu]) + || (mobj2->player && mobj2->player->kartstuff[k_lakitu])) + return; + // Don't bump if you've recently bumped if ((mobj1->player && mobj1->player->kartstuff[k_justbumped]) || (mobj2->player && mobj1->player->kartstuff[k_justbumped])) From c57d25b2137650d049917dbb76ce42a1c0f99f72 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Wed, 6 Jun 2018 20:52:13 -0400 Subject: [PATCH 50/51] 1v1 battle no items fix --- 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 bc812b440..f1c7c8f9e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -677,7 +677,7 @@ static void K_KartItemRouletteByDistance(player_t *player, ticcmd_t *cmd) if (cv_blueshell.value && pexiting == 0 && (secondist > distvar*4) && !lightningcooldown) SETITEMRESULT(useodds, 15); // Blue Shell if (cv_fireflower.value) SETITEMRESULT(useodds, 16); // Fire Flower - if (cv_tripleredshell.value && pingame > 2) SETITEMRESULT(useodds, 17); // Triple Red Shell + if (cv_tripleredshell.value) SETITEMRESULT(useodds, 17); // Triple Red Shell if (cv_lightning.value && pingame > pexiting && !lightningcooldown) SETITEMRESULT(useodds, 18); // Lightning if (cv_feather.value) SETITEMRESULT(useodds, 19); // Feather From 8ba0fd4ea1ed395a6f170d03590d3242133288b5 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Thu, 7 Jun 2018 02:51:18 -0400 Subject: [PATCH 51/51] P_RestoreMusic fix --- src/p_user.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/p_user.c b/src/p_user.c index 20a0e4eb9..8eb12233d 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1165,12 +1165,13 @@ void P_RestoreMusic(player_t *player) S_SpeedMusic(1.0f); // SRB2kart - We have some different powers than vanilla, some of which tweak the music. - if (splitscreen != 0 && (players[consoleplayer].exiting + if (splitscreen != 0 && G_RaceGametype() + && (players[consoleplayer].exiting || players[secondarydisplayplayer].exiting || players[thirddisplayplayer].exiting || players[fourthdisplayplayer].exiting)) S_ChangeMusicInternal("karwin", true); - else if (splitscreen == 0 && player->exiting) + else if (splitscreen == 0 && G_RaceGametype() && player->exiting) { if (player->kartstuff[k_position] == 1) S_ChangeMusicInternal("karwin", true);