From 0ca7043baca08eedab79fd761464070406b3da93 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 12 Jan 2019 04:30:41 -0500 Subject: [PATCH 01/49] Uncap player-count item distribution modifiers Was an idea I had in development to make 16P less chaotic, but decided against it due to lack of testing and that it could backfire badly... --- src/k_kart.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8189cd0f8..2c68440f8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -631,15 +631,14 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) } } - if (first != -1 && second != -1) // calculate 2nd's distance from 1st, for SPB + if (first != -1 && second != -1 && !G_BattleGametype()) // calculate 2nd's distance from 1st, for SPB { 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; if (franticitems) secondist = (15*secondist/14); - if (pingame < 8 && !G_BattleGametype()) - secondist = ((28+(8-pingame))*secondist/28); + secondist = ((28+(8-pingame))*secondist/28); } // POWERITEMODDS handles all of the "frantic item" related functionality, for all of our powerful items. @@ -647,14 +646,13 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) // Then, it multiplies it further if there's less than 5 players in game. // This is done to make low player count races more fair & interesting. (1v1s are basically the same as franticitems false in a normal race) // Lastly, it *divides* it by your mashed value, which was determined in K_KartItemRoulette, to punish those who are impatient. - // The last two are very fractional and complicated, very sorry! #define POWERITEMODDS(odds) \ if (franticitems) \ - odds *= 2; \ - if (pingame < 8 && !G_BattleGametype()) \ - odds = FixedMul(odds*FRACUNIT, FRACUNIT+min((8-pingame)*(FRACUNIT/25), FRACUNIT))/FRACUNIT; \ + odds <<= 1; \ + if (!G_BattleGametype()) \ + odds = FixedMul(odds<> FRACBITS; \ if (mashed > 0) \ - odds = FixedDiv(odds*FRACUNIT, mashed+FRACUNIT)/FRACUNIT \ + odds = FixedDiv(odds<> FRACBITS \ switch (item) { @@ -837,8 +835,7 @@ static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT3 if (franticitems) // Frantic items make the distances between everyone artifically higher, for crazier items pdis = (15*pdis/14); - if (pingame < 8 && !G_BattleGametype()) - pdis = ((28+(8-pingame))*pdis/28); + pdis = ((28+(8-pingame))*pdis/28); if (pingame == 1 && oddsvalid[0]) // Record Attack, or just alone useodds = 0; From 5e6109403144894ab9215f9683ba45e10d5adbe9 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 12 Jan 2019 04:31:35 -0500 Subject: [PATCH 02/49] Allow player-count modifiers in Battle --- src/k_kart.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 2c68440f8..b97a518f0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -649,8 +649,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) #define POWERITEMODDS(odds) \ if (franticitems) \ odds <<= 1; \ - if (!G_BattleGametype()) \ - odds = FixedMul(odds<> FRACBITS; \ + odds = FixedMul(odds<> FRACBITS; \ if (mashed > 0) \ odds = FixedDiv(odds<> FRACBITS \ From 2f95fdf4126b14580e1e35577381156908e8ca2e Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 12 Jan 2019 04:43:43 -0500 Subject: [PATCH 03/49] Don't increment ingame count without bumpers --- src/k_kart.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b97a518f0..92aafad55 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -613,21 +613,24 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) { if (!playeringame[i] || players[i].spectator) continue; - - pingame++; + if (!G_BattleGametype() || players[i].kartstuff[k_bumper]) + pingame++; if (players[i].exiting) pexiting++; if (players[i].mo) { - if (players[i].kartstuff[k_position] == 1 && first == -1) - first = i; - if (players[i].kartstuff[k_position] == 2 && second == -1) - second = i; if (players[i].kartstuff[k_itemtype] == KITEM_INVINCIBILITY || players[i].kartstuff[k_itemtype] == KITEM_GROW || players[i].kartstuff[k_invincibilitytimer] || players[i].kartstuff[k_growshrinktimer] > 0) pinvin++; + if (!G_BattleGametype()) + { + if (players[i].kartstuff[k_position] == 1 && first == -1) + first = i; + if (players[i].kartstuff[k_position] == 2 && second == -1) + second = i; + } } } From 1512b08fded8ac5ed6edc4b3aa72f291a7218114 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 12 Jan 2019 05:01:36 -0500 Subject: [PATCH 04/49] Some house-cleaning --- src/k_kart.c | 126 ++++++++++++++++++++------------------------------- 1 file changed, 48 insertions(+), 78 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 92aafad55..049e3c540 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -603,6 +603,32 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) UINT8 pingame = 0, pexiting = 0, pinvin = 0; SINT8 first = -1, second = -1; INT32 secondist = 0; + boolean itemenabled[NUMKARTRESULTS] = { + cv_sneaker.value, + cv_rocketsneaker.value, + cv_invincibility.value, + cv_banana.value, + cv_eggmanmonitor.value, + cv_orbinaut.value, + cv_jawz.value, + cv_mine.value, + cv_ballhog.value, + cv_selfpropelledbomb.value, + cv_grow.value, + cv_shrink.value, + cv_thundershield.value, + cv_hyudoro.value, + cv_kitchensink.value, + cv_triplesneaker.value, + cv_triplebanana.value, + cv_decabanana.value, + cv_tripleorbinaut.value, + cv_quadorbinaut.value, + cv_dualjawz.value + }; + + if (!itemenabled[item] && !modeattacking) + return 0; if (G_BattleGametype()) newodds = K_KartItemOddsBattle[item-1][pos]; @@ -634,14 +660,14 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) } } - if (first != -1 && second != -1 && !G_BattleGametype()) // calculate 2nd's distance from 1st, for SPB + if (first != -1 && second != -1) // calculate 2nd's distance from 1st, for SPB { 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; if (franticitems) - secondist = (15*secondist/14); - secondist = ((28+(8-pingame))*secondist/28); + secondist = (15 * secondist) / 14; + secondist = ((28 + (8-pingame)) * secondist) / 28; } // POWERITEMODDS handles all of the "frantic item" related functionality, for all of our powerful items. @@ -658,97 +684,41 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) switch (item) { - case KITEM_SNEAKER: - if ((!cv_sneaker.value) && (!modeattacking)) newodds = 0; - break; - case KITEM_ROCKETSNEAKER: - POWERITEMODDS(newodds); - if (!cv_rocketsneaker.value) newodds = 0; - break; case KITEM_INVINCIBILITY: - POWERITEMODDS(newodds); - if ((!cv_invincibility.value) || (pinvin >= 2)) newodds = 0; - break; - case KITEM_BANANA: - if (!cv_banana.value) newodds = 0; - break; - case KITEM_EGGMAN: - if (!cv_eggmanmonitor.value) newodds = 0; - break; - case KITEM_ORBINAUT: - if (!cv_orbinaut.value) newodds = 0; - break; + case KITEM_GROW: + if (pinvin >= 2) + newodds = 0; + else + /* FALLTHRU */ + case KITEM_ROCKETSNEAKER: case KITEM_JAWZ: - POWERITEMODDS(newodds); - if (!cv_jawz.value) newodds = 0; - break; case KITEM_MINE: - POWERITEMODDS(newodds); - if (!cv_mine.value) newodds = 0; - break; case KITEM_BALLHOG: + case KITEM_THUNDERSHIELD: + case KRITEM_TRIPLESNEAKER: + case KRITEM_TRIPLEBANANA: + case KRITEM_TENFOLDBANANA: + case KRITEM_TRIPLEORBINAUT: + case KRITEM_QUADORBINAUT: + case KRITEM_DUALJAWZ: POWERITEMODDS(newodds); - if (!cv_ballhog.value) newodds = 0; break; case KITEM_SPB: //POWERITEMODDS(newodds); - if ((!cv_selfpropelledbomb.value) - || (indirectitemcooldown > 0) - || (pexiting > 0) - || (secondist/distvar < (4+gamespeed))) + if ((indirectitemcooldown > 0) || (pexiting > 0) || (secondist/distvar < 5)) newodds = 0; - newodds *= min((secondist/distvar)-(3+gamespeed), 3); - break; - case KITEM_GROW: - POWERITEMODDS(newodds); - if ((!cv_grow.value) || (pinvin >= 2)) newodds = 0; + else + newodds *= min((secondist/distvar)-4, 3); break; case KITEM_SHRINK: POWERITEMODDS(newodds); - if ((!cv_shrink.value) - || (indirectitemcooldown > 0) - || (pingame-1 <= pexiting)) newodds = 0; - break; - case KITEM_THUNDERSHIELD: - POWERITEMODDS(newodds); - if (!cv_thundershield.value) newodds = 0; - break; - case KITEM_HYUDORO: - if (!cv_hyudoro.value) newodds = 0; - break; - case KITEM_POGOSPRING: - if (!cv_pogospring.value) newodds = 0; - break; - case KITEM_KITCHENSINK: - newodds = 0; // Not obtained via normal means. - break; - case KRITEM_TRIPLESNEAKER: - POWERITEMODDS(newodds); - if (!cv_triplesneaker.value) newodds = 0; - break; - case KRITEM_TRIPLEBANANA: - POWERITEMODDS(newodds); - if (!cv_triplebanana.value) newodds = 0; - break; - case KRITEM_TENFOLDBANANA: - POWERITEMODDS(newodds); - if (!cv_decabanana.value) newodds = 0; - break; - case KRITEM_TRIPLEORBINAUT: - POWERITEMODDS(newodds); - if (!cv_tripleorbinaut.value) newodds = 0; - break; - case KRITEM_QUADORBINAUT: - POWERITEMODDS(newodds); - if (!cv_quadorbinaut.value) newodds = 0; - break; - case KRITEM_DUALJAWZ: - POWERITEMODDS(newodds); - if (!cv_dualjawz.value) newodds = 0; + if ((indirectitemcooldown > 0) || (pingame-1 <= pexiting)) + newodds = 0; break; default: break; } + #undef POWERITEMODDS return newodds; From 1cfd5a905f1bb5a1c0f3b3d0b5658660dab5fe18 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 12 Jan 2019 05:03:05 -0500 Subject: [PATCH 05/49] spacing & () --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 049e3c540..ffe30eb51 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -806,8 +806,8 @@ static INT32 K_FindUseodds(player_t *player, fixed_t mashed, INT32 pingame, INT3 if (oddsvalid[8]) SETUPDISTTABLE(8,1); if (franticitems) // Frantic items make the distances between everyone artifically higher, for crazier items - pdis = (15*pdis/14); - pdis = ((28+(8-pingame))*pdis/28); + pdis = (15 * pdis) / 14; + pdis = ((28 + (8-pingame)) * pdis) / 28; if (pingame == 1 && oddsvalid[0]) // Record Attack, or just alone useodds = 0; From 6047ae34551501d4ebb9d98b7d3ddb8a68069fa9 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Sat, 12 Jan 2019 05:12:20 -0500 Subject: [PATCH 06/49] Update comment to be more accurate --- 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 ffe30eb51..63c9d4541 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -673,7 +673,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) // POWERITEMODDS handles all of the "frantic item" related functionality, for all of our powerful items. // First, it multiplies it by 2 if franticitems is true; easy-peasy. // Then, it multiplies it further if there's less than 5 players in game. - // This is done to make low player count races more fair & interesting. (1v1s are basically the same as franticitems false in a normal race) + // This is done to make low player count races more fair & interesting. (2P normal would be about halfway between 8P normal and 8P frantic) // Lastly, it *divides* it by your mashed value, which was determined in K_KartItemRoulette, to punish those who are impatient. #define POWERITEMODDS(odds) \ if (franticitems) \ From 0037f5c91dc2af68a2bec4a33954eb249a3f00c8 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 15 Jan 2019 19:01:55 +0000 Subject: [PATCH 07/49] First steps at implementing a mechanism that allows you to load non-cheaty good-faith mods such as custom characters with no Lua scripting, and play record attack with them. Features a few bad hacks and a few more areas of improvement; I'll try to iron them out before they hit `next` or `master`. --- src/d_main.c | 1 + src/d_netcmd.c | 7 +++++-- src/dehacked.c | 28 +++++++++++++++++++++++++++- src/doomstat.h | 3 +++ src/g_game.c | 44 ++++++++++++++++++++++++++++++++------------ src/lua_script.c | 3 +++ src/m_cheat.c | 1 + src/m_cond.c | 2 +- src/m_menu.c | 4 ++-- src/p_setup.c | 14 +++++++++++--- src/r_things.c | 5 +++-- src/r_things.h | 2 +- src/y_inter.c | 2 +- 13 files changed, 91 insertions(+), 25 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index 29a916863..f3539df74 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1253,6 +1253,7 @@ void D_SRB2Main(void) #endif //ifndef DEVELOP mainwadstally = packetsizetally; + majormods = false; cht_Init(); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index e15ed9aac..d6e78c911 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2214,10 +2214,13 @@ static void Command_Map_f(void) return; } - if (!(netgame || multiplayer) && (!modifiedgame || savemoddata)) + if (!(netgame || multiplayer) && (!majormods || savemoddata)) { if (COM_CheckParm("-force")) + { G_SetGameModified(false); + majormods = true; + } else { CONS_Printf(M_GetText("Sorry, level change disabled in single player.\n")); @@ -4915,7 +4918,7 @@ static void Command_Isgamemodified_f(void) { if (savemoddata) CONS_Printf(M_GetText("modifiedgame is true, but you can save medal and record data in this mod.\n")); - else if (modifiedgame) + else if (/*modifiedgame*/ majormods) CONS_Printf(M_GetText("modifiedgame is true, extras will not be unlocked\n")); else CONS_Printf(M_GetText("modifiedgame is false, you can unlock extras\n")); diff --git a/src/dehacked.c b/src/dehacked.c index e7e1ae69c..49d9d1071 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3417,18 +3417,21 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (fastcmp(word, "FREESLOT")) { readfreeslots(f); + majormods = true; continue; } else if (fastcmp(word, "MAINCFG")) { readmaincfg(f); DEH_WriteUndoline(word, "", UNDO_HEADER); + majormods = true; continue; } else if (fastcmp(word, "WIPES")) { readwipes(f); DEH_WriteUndoline(word, "", UNDO_HEADER); + //majormods = true; continue; } word2 = strtok(NULL, " "); @@ -3449,6 +3452,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + //majormods = true; continue; } if (word2) @@ -3462,12 +3466,14 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) // Read texture from spec file. readtexture(f, word2); DEH_WriteUndoline(word, word2, UNDO_HEADER); + //majormods = true; } else if (fastcmp(word, "PATCH")) { // Read patch from spec file. readpatch(f, word2, wad); DEH_WriteUndoline(word, word2, UNDO_HEADER); + //majormods = true; } else if (fastcmp(word, "THING") || fastcmp(word, "MOBJ") || fastcmp(word, "OBJECT")) { @@ -3481,10 +3487,12 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + majormods = true; } /* else if (fastcmp(word, "ANIMTEX")) { readAnimTex(f, i); + //majormods = true; }*/ else if (fastcmp(word, "LIGHT")) { @@ -3498,6 +3506,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + //majormods = true; #endif } else if (fastcmp(word, "SPRITE")) @@ -3513,6 +3522,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + //majormods = true; #endif } else if (fastcmp(word, "LEVEL")) @@ -3525,7 +3535,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) i = M_MapNumber(word2[0], word2[1]); if (i > 0 && i <= NUMMAPS) + { + if (mapheaderinfo[i]) + majormods = true; // only mark as a major mod if it replaces an already-existing mapheaderinfo readlevelheader(f, i); + } else { deh_warning("Level number %d out of range (1 - %d)", i, NUMMAPS); @@ -3543,6 +3557,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + //majormods = true; -- might have to reconsider in a future update } else if (fastcmp(word, "FRAME") || fastcmp(word, "STATE")) { @@ -3556,6 +3571,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + majormods = true; } // Added translations to this just in case its re-enabled /* else if (fastcmp(word, "POINTER")) @@ -3578,6 +3594,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } else deh_warning("pointer (Frame %d) : missing ')'", i); + majormods = true; }*/ else if (fastcmp(word, "SOUND")) { @@ -3591,6 +3608,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + //majormods = true; -- ...this won't bite me in the ass later, will it? } /* else if (fastcmp(word, "SPRITE")) { @@ -3611,6 +3629,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } else deh_warning("Sprite %d doesn't exist",i); + //majormods = true; }*/ else if (fastcmp(word, "HUDITEM")) { @@ -3624,6 +3643,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + //majormods = true; } else if (fastcmp(word, "EMBLEM")) { @@ -3644,6 +3664,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + majormods = true; } else if (fastcmp(word, "EXTRAEMBLEM")) { @@ -3664,6 +3685,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + majormods = true; } else if (fastcmp(word, "UNLOCKABLE")) { @@ -3680,6 +3702,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); + majormods = true; } else if (fastcmp(word, "CONDITIONSET")) { @@ -3697,6 +3720,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } // no undo support for this insanity yet //DEH_WriteUndoline(word, word2, UNDO_HEADER); + majormods = true; } else if (fastcmp(word, "SRB2KART")) { @@ -3743,6 +3767,8 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (clearall || fastcmp(word2, "LEVELS")) clear_levels(); + + majormods = true; } else deh_warning("Unknown word: %s", word); @@ -9737,7 +9763,7 @@ static inline int lib_getenum(lua_State *L) lua_pushboolean(L, devparm); return 1; } else if (fastcmp(word,"modifiedgame")) { - lua_pushboolean(L, modifiedgame && !savemoddata); + lua_pushboolean(L, /*modifiedgame*/ majormods && !savemoddata); return 1; } else if (fastcmp(word,"menuactive")) { lua_pushboolean(L, menuactive); diff --git a/src/doomstat.h b/src/doomstat.h index 6d710e28c..9ae2726d7 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -54,6 +54,7 @@ extern boolean gamecomplete; // Set if homebrew PWAD stuff has been added. extern boolean modifiedgame; +extern boolean majormods; extern UINT16 mainwads; extern boolean savemoddata; // This mod saves time/emblem data. extern boolean disableSpeedAdjust; // Don't alter the duration of player states if true @@ -280,6 +281,8 @@ typedef struct #define LF2_NIGHTSATTACK 8 ///< Show this map in NiGHTS mode menu #define LF2_NOVISITNEEDED 16 ///< Available in time attack/nights mode without visiting the level +#define LF2_EXISTSHACK 128 ///< Map lump exists; as noted, a single-bit hack that can be freely movable to other variables without concern. + // Save override #define SAVE_NEVER -1 #define SAVE_DEFAULT 0 diff --git a/src/g_game.c b/src/g_game.c index 1e0c7e462..28171e75c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -86,7 +86,8 @@ INT16 lastmapsaved = 0; // Last map we auto-saved at boolean gamecomplete = false; UINT16 mainwads = 0; -boolean modifiedgame; // Set if homebrew PWAD stuff has been added. +boolean modifiedgame = false; // Set if homebrew PWAD stuff has been added. +boolean majormods = false; // Set if Lua/Gameplay SOC/replacement map has been added. boolean savemoddata = false; UINT8 paused; UINT8 modeattacking = ATTACKING_NONE; @@ -5918,6 +5919,19 @@ void G_DoPlayDemo(char *defdemoname) return; } + // Skin not loaded? + if (!SetPlayerSkin(0, skin)) + { + snprintf(msg, 1024, M_GetText("%s features a character that is not loaded.\n"), pdemoname); + CONS_Alert(CONS_ERROR, "%s", msg); + M_StartMessage(msg, NULL, MM_NOTHING); + Z_Free(pdemoname); + Z_Free(demobuffer); + demoplayback = false; + titledemo = false; + return; + } + Z_Free(pdemoname); memset(&oldcmd,0,sizeof(oldcmd)); @@ -5949,9 +5963,6 @@ void G_DoPlayDemo(char *defdemoname) P_SetRandSeed(randseed); G_InitNew(false, G_BuildMapName(gamemap), true, true); // Doesn't matter whether you reset or not here, given changes to resetplayer. - // Set skin - SetPlayerSkin(0, skin); - // Set color for (i = 0; i < MAXSKINCOLORS; i++) if (!stricmp(KartColor_Names[i],color)) // SRB2kart @@ -6146,6 +6157,22 @@ void G_AddGhost(char *defdemoname) return; } + gh->oldmo->skin = &skins[0]; + for (i = 0; i < numskins; i++) + if (!stricmp(skins[i].name,skin)) + { + gh->oldmo->skin = &skins[i]; + break; + } + + if (i == numskins) + { + CONS_Alert(CONS_NOTICE, M_GetText("Failed to add ghost %s: Invalid character.\n"), pdemoname); + Z_Free(pdemoname); + Z_Free(buffer); + return; + } + gh = Z_Calloc(sizeof(demoghost), PU_LEVEL, NULL); gh->next = ghosts; gh->buffer = buffer; @@ -6191,14 +6218,7 @@ void G_AddGhost(char *defdemoname) gh->oldmo.z = gh->mo->z; // Set skin - gh->mo->skin = &skins[0]; - for (i = 0; i < numskins; i++) - if (!stricmp(skins[i].name,skin)) - { - gh->mo->skin = &skins[i]; - break; - } - gh->oldmo.skin = gh->mo->skin; + gh->mo.skin = gh->oldmo->skin; // Set color gh->mo->color = ((skin_t*)gh->mo->skin)->prefcolor; diff --git a/src/lua_script.c b/src/lua_script.c index 34a260527..d7c4a160e 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -212,6 +212,9 @@ void LUA_LoadLump(UINT16 wad, UINT16 lump) LUA_LoadFile(&f, name); // actually load file! + // Okay, we've modified the game beyond the point of no return. + majormods = true; + free(name); Z_Free(f.data); } diff --git a/src/m_cheat.c b/src/m_cheat.c index 9c53f9011..499dac28d 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -1268,6 +1268,7 @@ void Command_ObjectPlace_f(void) REQUIRE_NOULTIMATE; G_SetGameModified(multiplayer); + majormods = true; // Entering objectplace? if (!objectplacing) diff --git a/src/m_cond.c b/src/m_cond.c index 35eccd1c4..b0e49a683 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -385,7 +385,7 @@ UINT8 M_UpdateUnlockablesAndExtraEmblems(boolean force) char cechoText[992] = ""; UINT8 cechoLines = 0; - if (modifiedgame && !savemoddata + if (/*modifiedgame*/ majormods && !savemoddata && !force) // SRB2Kart: for enabling unlocks online in modified servers return false; diff --git a/src/m_menu.c b/src/m_menu.c index 8c0e6079f..03cc8002f 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2773,10 +2773,10 @@ boolean M_Responder(event_t *ev) || (currentMenu->menuitems[itemOn].status & IT_TYPE)==IT_SUBMENU) && (currentMenu->menuitems[itemOn].status & IT_CALLTYPE)) { - if (((currentMenu->menuitems[itemOn].status & IT_CALLTYPE) & IT_CALL_NOTMODIFIED) && modifiedgame && !savemoddata) + if (((currentMenu->menuitems[itemOn].status & IT_CALLTYPE) & IT_CALL_NOTMODIFIED) && /*modifiedgame*/ majormods && !savemoddata) { S_StartSound(NULL, sfx_menu1); - M_StartMessage(M_GetText("This cannot be done with add-ons\nor in a cheated game.\n\n(Press a key)\n"), NULL, MM_NOTHING); + M_StartMessage(M_GetText("This cannot be done with complex add-ons\nor in a cheated game.\n\n(Press a key)\n"), NULL, MM_NOTHING); return true; } } diff --git a/src/p_setup.c b/src/p_setup.c index 49b22184e..0a59a2a94 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -234,7 +234,7 @@ static void P_ClearSingleMapHeaderInfo(INT16 i) DEH_WriteUndoline("LEVELFLAGS", va("%d", mapheaderinfo[num]->levelflags), UNDO_NONE); mapheaderinfo[num]->levelflags = 0; DEH_WriteUndoline("MENUFLAGS", va("%d", mapheaderinfo[num]->menuflags), UNDO_NONE); - mapheaderinfo[num]->menuflags = 0; + mapheaderinfo[num]->menuflags = (mainwads ? 0 : LF2_EXISTSHACK); // see p_setup.c - prevents replacing maps in addons with easier versions // TODO grades support for delfile (pfft yeah right) P_DeleteGrades(num); // SRB2Kart @@ -1120,7 +1120,7 @@ static inline void P_SpawnEmblems(void) static void P_SpawnSecretItems(boolean loademblems) { // Now let's spawn those funky emblem things! Tails 12-08-2002 - if (netgame || multiplayer || (modifiedgame && !savemoddata)) // No cheating!! + if (netgame || multiplayer || (/*modifiedgame*/ majormods && !savemoddata)) // No cheating!! return; if (loademblems) @@ -3272,7 +3272,7 @@ boolean P_SetupLevel(boolean skipprecip) nextmapoverride = 0; skipstats = false; - if (!(netgame || multiplayer) && (!modifiedgame || savemoddata)) + if (!(netgame || multiplayer) && (/*!modifiedgame*/ !majormods || savemoddata)) mapvisited[gamemap-1] |= MV_VISITED; levelloading = false; @@ -3455,6 +3455,14 @@ boolean P_AddWadFile(const char *wadfilename) continue; num = (INT16)M_MapNumber(name[3], name[4]); + // we want to record whether this map exists. if it doesn't have a header, we can assume it's not relephant + if (num <= NUMMAPS && mapheaderinfo[num-1]) + { + if (mapheaderinfo[num-1]->menuflags & LF2_EXISTSHACK) + majormods = true; // oops, double-defined - no record attack privileges for you + mapheaderinfo[num-1]->menuflags |= LF2_EXISTSHACK; + } + //If you replaced the map you're on, end the level when done. if (num == gamemap) replacedcurrentmap = true; diff --git a/src/r_things.c b/src/r_things.c index 1825d2d94..a47200634 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2635,7 +2635,7 @@ INT32 R_SkinAvailable(const char *name) } // network code calls this when a 'skin change' is received -void SetPlayerSkin(INT32 playernum, const char *skinname) +boolean SetPlayerSkin(INT32 playernum, const char *skinname) { INT32 i; player_t *player = &players[playernum]; @@ -2646,7 +2646,7 @@ void SetPlayerSkin(INT32 playernum, const char *skinname) if (stricmp(skins[i].name, skinname) == 0) { SetPlayerSkinByNum(playernum, i); - return; + return true; } } @@ -2656,6 +2656,7 @@ void SetPlayerSkin(INT32 playernum, const char *skinname) CONS_Alert(CONS_WARNING, M_GetText("Player %d (%s) skin '%s' not found\n"), playernum, player_names[playernum], skinname); SetPlayerSkinByNum(playernum, 0); + return false; } // Same as SetPlayerSkin, but uses the skin #. diff --git a/src/r_things.h b/src/r_things.h index a8635034a..bc51f7111 100644 --- a/src/r_things.h +++ b/src/r_things.h @@ -194,7 +194,7 @@ typedef struct drawnode_s extern INT32 numskins; extern skin_t skins[MAXSKINS + 1]; -void SetPlayerSkin(INT32 playernum,const char *skinname); +boolean SetPlayerSkin(INT32 playernum,const char *skinname); void SetPlayerSkinByNum(INT32 playernum,INT32 skinnum); // Tails 03-16-2002 INT32 R_SkinAvailable(const char *name); void R_AddSkins(UINT16 wadnum); diff --git a/src/y_inter.c b/src/y_inter.c index 021519e3b..046d6d6d3 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -786,7 +786,7 @@ void Y_StartIntermission(void) } case int_race: // (time-only race) { - if ((!modifiedgame || savemoddata) && !multiplayer && !demoplayback) // remove this once we have a proper time attack screen + if ((/*!modifiedgame*/ !majormods || savemoddata) && !multiplayer && !demoplayback) // remove this once we have a proper time attack screen { // Update visitation flags mapvisited[gamemap-1] |= MV_BEATEN; From 6238a144b8b516a0e59f6d7e7919dced8abe6f1e Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 16 Jan 2019 15:27:23 +0000 Subject: [PATCH 08/49] Woops, didn't commit the most up-to-date g_game.c originally (old one didn't compile) --- src/g_game.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 28171e75c..a1ca4e733 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -5922,7 +5922,7 @@ void G_DoPlayDemo(char *defdemoname) // Skin not loaded? if (!SetPlayerSkin(0, skin)) { - snprintf(msg, 1024, M_GetText("%s features a character that is not loaded.\n"), pdemoname); + snprintf(msg, 1024, M_GetText("%s features a character that is not currently loaded.\n"), pdemoname); CONS_Alert(CONS_ERROR, "%s", msg); M_StartMessage(msg, NULL, MM_NOTHING); Z_Free(pdemoname); @@ -6157,11 +6157,11 @@ void G_AddGhost(char *defdemoname) return; } - gh->oldmo->skin = &skins[0]; + gh->oldmo.skin = &skins[0]; for (i = 0; i < numskins; i++) if (!stricmp(skins[i].name,skin)) { - gh->oldmo->skin = &skins[i]; + gh->oldmo.skin = &skins[i]; break; } @@ -6218,7 +6218,7 @@ void G_AddGhost(char *defdemoname) gh->oldmo.z = gh->mo->z; // Set skin - gh->mo.skin = gh->oldmo->skin; + gh->mo->skin = gh->oldmo.skin; // Set color gh->mo->color = ((skin_t*)gh->mo->skin)->prefcolor; From e61665b612dbead118b2c7ea28b91f704bc10ef6 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 17 Jan 2019 20:51:41 +0000 Subject: [PATCH 09/49] * Increased leniency for SOC wrt "major mods". * If your file defines state and object freeslots in SOC, you are allowed to modify those freeslots IN ANY SOC SCRIPT IN THE SAME FILE without being marked as a "major mod". * If your file contains broken unlockables/emblems that don't actually have effect for any reason, it's not counted as a "major mod". * Added add-ons menu message for adding a "major mod". --- src/dehacked.c | 36 +++++++++++++++++++++++++++++------- src/dehacked.h | 2 ++ src/m_menu.c | 15 +++++++++++++-- src/w_wad.c | 2 ++ 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 49d9d1071..2e8ce562d 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -602,6 +602,14 @@ done: Z_Free(s); } +static int freeslotusage[2][2] = {{0, 0}, {0, 0}}; // [S_, MT_][max, previous .wad's max] + +void DEH_UpdateMaxFreeslots(void) +{ + freeslotusage[0][1] = freeslotusage[0][0]; + freeslotusage[1][1] = freeslotusage[1][0]; +} + // TODO: Figure out how to do undolines for this.... // TODO: Warnings for running out of freeslots static void readfreeslots(MYFILE *f) @@ -664,6 +672,7 @@ static void readfreeslots(MYFILE *f) if (!FREE_STATES[i]) { FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); strcpy(FREE_STATES[i],word); + freeslotusage[0][0]++; break; } } @@ -673,6 +682,7 @@ static void readfreeslots(MYFILE *f) if (!FREE_MOBJS[i]) { FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); strcpy(FREE_MOBJS[i],word); + freeslotusage[1][0]++; break; } } @@ -3417,7 +3427,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (fastcmp(word, "FREESLOT")) { readfreeslots(f); - majormods = true; + //majormods = true; continue; } else if (fastcmp(word, "MAINCFG")) @@ -3480,14 +3490,17 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (i == 0 && word2[0] != '0') // If word2 isn't a number i = get_mobjtype(word2); // find a thing by name if (i < NUMMOBJTYPES && i >= 0) + { + if (i < (MT_FIRSTFREESLOT+freeslotusage[1][1])) + majormods = true; // affecting something earlier than the first freeslot allocated in this .wad? DENIED readthing(f, i); + } else { deh_warning("Thing %d out of range (0 - %d)", i, NUMMOBJTYPES-1); ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - majormods = true; } /* else if (fastcmp(word, "ANIMTEX")) { @@ -3564,14 +3577,17 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (i == 0 && word2[0] != '0') // If word2 isn't a number i = get_state(word2); // find a state by name if (i < NUMSTATES && i >= 0) + { + if (i < (S_FIRSTFREESLOT+freeslotusage[0][1])) + majormods = true; // affecting something earlier than the first freeslot allocated in this .wad? DENIED readframe(f, i); + } else { deh_warning("Frame %d out of range (0 - %d)", i, NUMSTATES-1); ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - majormods = true; } // Added translations to this just in case its re-enabled /* else if (fastcmp(word, "POINTER")) @@ -3657,6 +3673,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (numemblems < i) numemblems = i; reademblemdata(f, i); + majormods = true; } else { @@ -3664,7 +3681,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - majormods = true; } else if (fastcmp(word, "EXTRAEMBLEM")) { @@ -3678,6 +3694,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (numextraemblems < i) numextraemblems = i; readextraemblemdata(f, i); + majormods = true; } else { @@ -3685,7 +3702,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - majormods = true; } else if (fastcmp(word, "UNLOCKABLE")) { @@ -3695,14 +3711,16 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } else if (i > 0 && i <= MAXUNLOCKABLES) + { readunlockable(f, i - 1); + majormods = true; + } else { deh_warning("Unlockable number %d out of range (1 - %d)", i, MAXUNLOCKABLES); ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - majormods = true; } else if (fastcmp(word, "CONDITIONSET")) { @@ -3712,7 +3730,10 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } else if (i > 0 && i <= MAXCONDITIONSETS) + { readconditionset(f, (UINT8)i); + majormods = true; + } else { deh_warning("Condition set number %d out of range (1 - %d)", i, MAXCONDITIONSETS); @@ -3720,7 +3741,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } // no undo support for this insanity yet //DEH_WriteUndoline(word, word2, UNDO_HEADER); - majormods = true; } else if (fastcmp(word, "SRB2KART")) { @@ -9381,6 +9401,7 @@ static inline int lib_freeslot(lua_State *L) CONS_Printf("State S_%s allocated.\n",word); FREE_STATES[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); strcpy(FREE_STATES[i],word); + freeslotusage[0][0]++; lua_pushinteger(L, i); r++; break; @@ -9396,6 +9417,7 @@ static inline int lib_freeslot(lua_State *L) CONS_Printf("MobjType MT_%s allocated.\n",word); FREE_MOBJS[i] = Z_Malloc(strlen(word)+1, PU_STATIC, NULL); strcpy(FREE_MOBJS[i],word); + freeslotusage[1][0]++; lua_pushinteger(L, i); r++; break; diff --git a/src/dehacked.h b/src/dehacked.h index 683fe7d94..0d6cc9022 100644 --- a/src/dehacked.h +++ b/src/dehacked.h @@ -37,6 +37,8 @@ void DEH_UnloadDehackedWad(UINT16 wad); void DEH_LoadDehackedLump(lumpnum_t lumpnum); void DEH_LoadDehackedLumpPwad(UINT16 wad, UINT16 lump); +void DEH_UpdateMaxFreeslots(void); + void DEH_Check(void); fixed_t get_number(const char *word); diff --git a/src/m_menu.c b/src/m_menu.c index 03cc8002f..e68027c61 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4551,9 +4551,14 @@ static char *M_AddonsHeaderPath(void) #define CLEARNAME Z_Free(refreshdirname);\ refreshdirname = NULL +static boolean prevmajormods = false; + static void M_AddonsClearName(INT32 choice) { - CLEARNAME; + if (majormods == prevmajormods || savemoddata) + { + CLEARNAME; + } M_StopMessage(choice); } @@ -4566,7 +4571,7 @@ static boolean M_AddonsRefresh(void) return true; } - if (refreshdirmenu & REFRESHDIR_ADDFILE) + if ((refreshdirmenu & REFRESHDIR_ADDFILE) || (majormods != prevmajormods && !savemoddata)) { char *message = NULL; @@ -4583,6 +4588,12 @@ static boolean M_AddonsRefresh(void) S_StartSound(NULL, sfx_s224); message = va("%c%s\x80\nA file was loaded with %s.\nCheck the console log for more information.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname, ((refreshdirmenu & REFRESHDIR_ERROR) ? "errors" : "warnings")); } + else if (majormods != prevmajormods && !savemoddata) + { + S_StartSound(NULL, sfx_s221); + message = va("%c%s\x80\nGameplay has now been modified.\nIf you want to play record attack mode, restart the game to clear existing add-ons.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); + prevmajormods = majormods; + } if (message) { diff --git a/src/w_wad.c b/src/w_wad.c index 63bee97de..58a65191d 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -799,6 +799,8 @@ UINT16 W_InitFile(const char *filename) break; } + DEH_UpdateMaxFreeslots(); + W_InvalidateLumpnumCache(); return wadfile->numlumps; } From 4a87838f069528087b881ef94c39b2d0e0fedf0c Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 17 Jan 2019 22:01:28 +0000 Subject: [PATCH 10/49] * Refactor all instances of `majormods = true;` to route through G_SetGameModified, and catch a few spots I missed in the process. * Make G_SetGameModified only console-print for major mods. * Add amnesty to "major mod" detection while loading files with custom savedatas. * Improved the console prints for command `isgamemodified`. --- src/d_main.c | 4 +-- src/d_netcmd.c | 23 ++++++++--------- src/d_netfil.c | 2 +- src/dehacked.c | 66 +++++++++++++++++++++++------------------------- src/filesrch.h | 3 ++- src/g_game.c | 12 ++++++--- src/g_game.h | 2 +- src/lua_script.c | 2 +- src/m_cheat.c | 13 +++++----- src/m_menu.c | 14 ++++++---- src/p_setup.c | 4 ++- src/w_wad.c | 3 +++ 12 files changed, 80 insertions(+), 68 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index f3539df74..fd85770ca 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1162,7 +1162,7 @@ void D_SRB2Main(void) if (s) // Check for NULL? { if (!W_VerifyNMUSlumps(s)) - G_SetGameModified(true); + G_SetGameModified(true, false); D_AddFile(s); } } @@ -1189,7 +1189,7 @@ void D_SRB2Main(void) else { if (!M_CheckParm("-server")) - G_SetGameModified(true); + G_SetGameModified(true, true); autostart = true; } } diff --git a/src/d_netcmd.c b/src/d_netcmd.c index d6e78c911..244e3058a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2218,8 +2218,7 @@ static void Command_Map_f(void) { if (COM_CheckParm("-force")) { - G_SetGameModified(false); - majormods = true; + G_SetGameModified(false, true); } else { @@ -3789,7 +3788,7 @@ static void Command_RunSOC(void) if (!P_RunSOC(fn)) CONS_Printf(M_GetText("Could not find SOC.\n")); else - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, false); return; } @@ -3843,7 +3842,7 @@ static void Got_RunSOCcmd(UINT8 **cp, INT32 playernum) } P_RunSOC(filename); - G_SetGameModified(true); + G_SetGameModified(true, false); } /** Adds a pwad at runtime. @@ -3880,7 +3879,7 @@ static void Command_Addfile(void) CONS_Printf(M_GetText("Only the server or a remote admin can use this.\n")); return; } - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, false); } // Add file on your client directly if it is trivial, or you aren't in a netgame. @@ -4126,7 +4125,7 @@ static void Got_Addfilecmd(UINT8 **cp, INT32 playernum) return; } - G_SetGameModified(true); + G_SetGameModified(true, false); } static void Command_ListWADS_f(void) @@ -4483,7 +4482,7 @@ static void Ringslinger_OnChange(void) } if (cv_ringslinger.value) // Only if it's been turned on - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, true); } static void Gravity_OnChange(void) @@ -4504,7 +4503,7 @@ static void Gravity_OnChange(void) #endif if (!CV_IsSetToDefault(&cv_gravity)) - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, true); gravity = cv_gravity.value; } @@ -4900,7 +4899,7 @@ static void Fishcake_OnChange(void) // so don't make modifiedgame always on! if (cv_debug) { - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, true); } else if (cv_debug != cv_fishcake.value) @@ -4917,11 +4916,11 @@ static void Fishcake_OnChange(void) static void Command_Isgamemodified_f(void) { if (savemoddata) - CONS_Printf(M_GetText("modifiedgame is true, but you can save medal and record data in this mod.\n")); + CONS_Printf(M_GetText("The game is modified, but you can save medal and record data in this add-on.\n")); else if (/*modifiedgame*/ majormods) - CONS_Printf(M_GetText("modifiedgame is true, extras will not be unlocked\n")); + CONS_Printf(M_GetText("Major add-ons have been loaded, so you cannot play record attack.\n")); else - CONS_Printf(M_GetText("modifiedgame is false, you can unlock extras\n")); + CONS_Printf(M_GetText("No major add-ons are loaded. You can play record attack, earn medals and unlock extras.\n")); } static void Command_Cheats_f(void) diff --git a/src/d_netfil.c b/src/d_netfil.c index c7cfdbc11..99a058403 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -426,7 +426,7 @@ void CL_LoadServerFiles(void) else if (fileneeded[i].status == FS_FOUND) { P_AddWadFile(fileneeded[i].filename); - G_SetGameModified(true); + G_SetGameModified(true, false); fileneeded[i].status = FS_OPEN; } else if (fileneeded[i].status == FS_MD5SUMBAD) diff --git a/src/dehacked.c b/src/dehacked.c index 2e8ce562d..4edeb987c 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -21,6 +21,7 @@ #include "w_wad.h" #include "m_menu.h" #include "m_misc.h" +#include "filesrch.h" // for refreshdirmenu #include "f_finale.h" #include "dehacked.h" #include "st_stuff.h" @@ -79,8 +80,6 @@ static powertype_t get_power(const char *word); boolean deh_loaded = false; static int dbg_line; -static boolean gamedataadded = false; - #ifdef DELFILE typedef struct undehacked_s { @@ -3149,6 +3148,7 @@ static void readmaincfg(MYFILE *f) strlcpy(gamedatafilename, word2, sizeof (gamedatafilename)); strlwr(gamedatafilename); savemoddata = true; + majormods = false; // Also save a time attack folder filenamelen = strlen(gamedatafilename)-4; // Strip off the extension @@ -3161,7 +3161,7 @@ static void readmaincfg(MYFILE *f) // can't use sprintf since there is %u in savegamename strcatbf(savegamename, srb2home, PATHSEP); - gamedataadded = true; + refreshdirmenu |= REFRESHDIR_GAMEDATA; } else if (fastcmp(word, "RESETDATA")) { @@ -3392,8 +3392,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) for (i = 0; i < NUMSFX; i++) savesfxnames[i] = S_sfx[i].name; - gamedataadded = false; - // it doesn't test the version of SRB2 and version of dehacked file dbg_line = -1; // start at -1 so the first line is 0. while (!myfeof(f)) @@ -3427,21 +3425,21 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (fastcmp(word, "FREESLOT")) { readfreeslots(f); - //majormods = true; + //G_SetGameModified(multiplayer, true); continue; } else if (fastcmp(word, "MAINCFG")) { + G_SetGameModified(multiplayer, true); readmaincfg(f); DEH_WriteUndoline(word, "", UNDO_HEADER); - majormods = true; continue; } else if (fastcmp(word, "WIPES")) { readwipes(f); DEH_WriteUndoline(word, "", UNDO_HEADER); - //majormods = true; + //G_SetGameModified(multiplayer, true); continue; } word2 = strtok(NULL, " "); @@ -3462,7 +3460,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //majormods = true; + //G_SetGameModified(multiplayer, true); continue; } if (word2) @@ -3476,14 +3474,14 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) // Read texture from spec file. readtexture(f, word2); DEH_WriteUndoline(word, word2, UNDO_HEADER); - //majormods = true; + //G_SetGameModified(multiplayer, true); } else if (fastcmp(word, "PATCH")) { // Read patch from spec file. readpatch(f, word2, wad); DEH_WriteUndoline(word, word2, UNDO_HEADER); - //majormods = true; + //G_SetGameModified(multiplayer, true); } else if (fastcmp(word, "THING") || fastcmp(word, "MOBJ") || fastcmp(word, "OBJECT")) { @@ -3492,7 +3490,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (i < NUMMOBJTYPES && i >= 0) { if (i < (MT_FIRSTFREESLOT+freeslotusage[1][1])) - majormods = true; // affecting something earlier than the first freeslot allocated in this .wad? DENIED + G_SetGameModified(multiplayer, true); // affecting something earlier than the first freeslot allocated in this .wad? DENIED readthing(f, i); } else @@ -3505,7 +3503,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) /* else if (fastcmp(word, "ANIMTEX")) { readAnimTex(f, i); - //majormods = true; + //G_SetGameModified(multiplayer, true); }*/ else if (fastcmp(word, "LIGHT")) { @@ -3519,7 +3517,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //majormods = true; + //G_SetGameModified(multiplayer, true); #endif } else if (fastcmp(word, "SPRITE")) @@ -3535,7 +3533,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //majormods = true; + //G_SetGameModified(multiplayer, true); #endif } else if (fastcmp(word, "LEVEL")) @@ -3550,7 +3548,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (i > 0 && i <= NUMMAPS) { if (mapheaderinfo[i]) - majormods = true; // only mark as a major mod if it replaces an already-existing mapheaderinfo + G_SetGameModified(multiplayer, true); // only mark as a major mod if it replaces an already-existing mapheaderinfo readlevelheader(f, i); } else @@ -3570,7 +3568,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //majormods = true; -- might have to reconsider in a future update + //G_SetGameModified(multiplayer, true); -- might have to reconsider in a future update } else if (fastcmp(word, "FRAME") || fastcmp(word, "STATE")) { @@ -3579,7 +3577,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (i < NUMSTATES && i >= 0) { if (i < (S_FIRSTFREESLOT+freeslotusage[0][1])) - majormods = true; // affecting something earlier than the first freeslot allocated in this .wad? DENIED + G_SetGameModified(multiplayer, true); // affecting something earlier than the first freeslot allocated in this .wad? DENIED readframe(f, i); } else @@ -3610,7 +3608,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } else deh_warning("pointer (Frame %d) : missing ')'", i); - majormods = true; + G_SetGameModified(multiplayer, true); }*/ else if (fastcmp(word, "SOUND")) { @@ -3624,7 +3622,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //majormods = true; -- ...this won't bite me in the ass later, will it? + //G_SetGameModified(multiplayer, true); -- ...this won't bite me in the ass later, will it? } /* else if (fastcmp(word, "SPRITE")) { @@ -3645,7 +3643,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } else deh_warning("Sprite %d doesn't exist",i); - //majormods = true; + //G_SetGameModified(multiplayer, true); }*/ else if (fastcmp(word, "HUDITEM")) { @@ -3659,11 +3657,11 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //majormods = true; + //G_SetGameModified(multiplayer, true); } else if (fastcmp(word, "EMBLEM")) { - if (!gamedataadded) + if (!(refreshdirmenu & REFRESHDIR_GAMEDATA)) { deh_warning("You must define a custom gamedata to use \"%s\"", word); ignorelines(f); @@ -3673,7 +3671,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (numemblems < i) numemblems = i; reademblemdata(f, i); - majormods = true; + G_SetGameModified(multiplayer, true); } else { @@ -3684,7 +3682,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } else if (fastcmp(word, "EXTRAEMBLEM")) { - if (!gamedataadded) + if (!(refreshdirmenu & REFRESHDIR_GAMEDATA)) { deh_warning("You must define a custom gamedata to use \"%s\"", word); ignorelines(f); @@ -3694,7 +3692,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (numextraemblems < i) numextraemblems = i; readextraemblemdata(f, i); - majormods = true; + G_SetGameModified(multiplayer, true); } else { @@ -3705,7 +3703,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } else if (fastcmp(word, "UNLOCKABLE")) { - if (!gamedataadded) + if (!(refreshdirmenu & REFRESHDIR_GAMEDATA)) { deh_warning("You must define a custom gamedata to use \"%s\"", word); ignorelines(f); @@ -3713,7 +3711,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) else if (i > 0 && i <= MAXUNLOCKABLES) { readunlockable(f, i - 1); - majormods = true; + G_SetGameModified(multiplayer, true); } else { @@ -3724,7 +3722,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } else if (fastcmp(word, "CONDITIONSET")) { - if (!gamedataadded) + if (!(refreshdirmenu & REFRESHDIR_GAMEDATA)) { deh_warning("You must define a custom gamedata to use \"%s\"", word); ignorelines(f); @@ -3732,7 +3730,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) else if (i > 0 && i <= MAXCONDITIONSETS) { readconditionset(f, (UINT8)i); - majormods = true; + G_SetGameModified(multiplayer, true); } else { @@ -3761,7 +3759,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) { boolean clearall = (fastcmp(word2, "ALL")); - if (!gamedataadded) + if (!(refreshdirmenu & REFRESHDIR_GAMEDATA)) { deh_warning("You must define a custom gamedata to use \"%s\"", word); continue; @@ -3788,7 +3786,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (clearall || fastcmp(word2, "LEVELS")) clear_levels(); - majormods = true; + G_SetGameModified(multiplayer, true); } else deh_warning("Unknown word: %s", word); @@ -3800,8 +3798,8 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) deh_warning("No word in this line: %s", s); } // end while - if (gamedataadded) - G_LoadGameData(); + /*if (gamedataadded) -- REFRESHDIR_GAMEDATA murdered this + G_LoadGameData();*/ dbg_line = -1; if (deh_num_warning) diff --git a/src/filesrch.h b/src/filesrch.h index 4186271b0..01a528482 100644 --- a/src/filesrch.h +++ b/src/filesrch.h @@ -88,7 +88,8 @@ typedef enum REFRESHDIR_WARNING = 4, REFRESHDIR_ERROR = 8, REFRESHDIR_NOTLOADED = 16, - REFRESHDIR_MAX = 32 + REFRESHDIR_MAX = 32, + REFRESHDIR_GAMEDATA = 64 } refreshdir_enum; void closefilemenu(boolean validsize); diff --git a/src/g_game.c b/src/g_game.c index a1ca4e733..789c5cc5b 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -16,6 +16,7 @@ #include "d_main.h" #include "d_player.h" #include "f_finale.h" +#include "filesrch.h" // for refreshdirmenu #include "p_setup.h" #include "p_saveg.h" #include "i_system.h" @@ -753,16 +754,21 @@ void G_SetNightsRecords(void) }*/ // for consistency among messages: this modifies the game and removes savemoddata. -void G_SetGameModified(boolean silent) +void G_SetGameModified(boolean silent, boolean major) { - if (modifiedgame && !savemoddata) + if ((majormods && modifiedgame && !savemoddata) || (refreshdirmenu & REFRESHDIR_GAMEDATA)) // new gamedata amnesty? return; modifiedgame = true; savemoddata = false; + if (!major) + return; + + majormods = true; + if (!silent) - CONS_Alert(CONS_NOTICE, M_GetText("Game must be restarted to record statistics.\n")); + CONS_Alert(CONS_NOTICE, M_GetText("Game must be restarted to play record attack.\n")); // If in record attack recording, cancel it. if (modeattacking) diff --git a/src/g_game.h b/src/g_game.h index 14dc12d01..793cfe956 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -227,7 +227,7 @@ boolean G_GetRetryFlag(void); void G_LoadGameData(void); void G_LoadGameSettings(void); -void G_SetGameModified(boolean silent); +void G_SetGameModified(boolean silent, boolean major); void G_SetGamestate(gamestate_t newstate); diff --git a/src/lua_script.c b/src/lua_script.c index d7c4a160e..1f87d33ee 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -213,7 +213,7 @@ void LUA_LoadLump(UINT16 wad, UINT16 lump) LUA_LoadFile(&f, name); // actually load file! // Okay, we've modified the game beyond the point of no return. - majormods = true; + G_SetGameModified(multiplayer, true); free(name); Z_Free(f.data); diff --git a/src/m_cheat.c b/src/m_cheat.c index 499dac28d..acb53b227 100644 --- a/src/m_cheat.c +++ b/src/m_cheat.c @@ -121,7 +121,7 @@ static UINT8 cheatf_devmode(void) S_StartSound(0, sfx_itemup); // Just unlock all the things and turn on -debug and console devmode. - G_SetGameModified(false); + G_SetGameModified(false, false); // might need to revist the latter later for (i = 0; i < MAXUNLOCKABLES; i++) unlockables[i].unlocked = true; devparm = true; @@ -295,7 +295,7 @@ void Command_CheatNoClip_f(void) plyr->pflags ^= PF_NOCLIP; CONS_Printf(M_GetText("No Clipping %s\n"), plyr->pflags & PF_NOCLIP ? M_GetText("On") : M_GetText("Off")); - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, true); } void Command_CheatGod_f(void) @@ -310,7 +310,7 @@ void Command_CheatGod_f(void) plyr->pflags ^= PF_GODMODE; CONS_Printf(M_GetText("Sissy Mode %s\n"), plyr->pflags & PF_GODMODE ? M_GetText("On") : M_GetText("Off")); - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, true); } void Command_CheatNoTarget_f(void) @@ -325,7 +325,7 @@ void Command_CheatNoTarget_f(void) plyr->pflags ^= PF_INVIS; CONS_Printf(M_GetText("SEP Field %s\n"), plyr->pflags & PF_INVIS ? M_GetText("On") : M_GetText("Off")); - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, true); } void Command_Scale_f(void) @@ -727,7 +727,7 @@ void Command_Devmode_f(void) return; } - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, true); } /*void Command_Setrings_f(void) @@ -1267,8 +1267,7 @@ void Command_ObjectPlace_f(void) REQUIRE_SINGLEPLAYER; REQUIRE_NOULTIMATE; - G_SetGameModified(multiplayer); - majormods = true; + G_SetGameModified(multiplayer, true); // Entering objectplace? if (!objectplacing) diff --git a/src/m_menu.c b/src/m_menu.c index e68027c61..b1d9ba093 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4555,7 +4555,7 @@ static boolean prevmajormods = false; static void M_AddonsClearName(INT32 choice) { - if (majormods == prevmajormods || savemoddata) + if (!majormods || prevmajormods) { CLEARNAME; } @@ -4568,10 +4568,14 @@ static boolean M_AddonsRefresh(void) if ((refreshdirmenu & REFRESHDIR_NORMAL) && !preparefilemenu(true)) { UNEXIST; + CLEARNAME; return true; } - if ((refreshdirmenu & REFRESHDIR_ADDFILE) || (majormods != prevmajormods && !savemoddata)) + if (!majormods && prevmajormods) + prevmajormods = false; + + if ((refreshdirmenu & REFRESHDIR_ADDFILE) || (majormods && !prevmajormods)) { char *message = NULL; @@ -4588,7 +4592,7 @@ static boolean M_AddonsRefresh(void) S_StartSound(NULL, sfx_s224); message = va("%c%s\x80\nA file was loaded with %s.\nCheck the console log for more information.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname, ((refreshdirmenu & REFRESHDIR_ERROR) ? "errors" : "warnings")); } - else if (majormods != prevmajormods && !savemoddata) + else if (majormods && !prevmajormods && !savemoddata) { S_StartSound(NULL, sfx_s221); message = va("%c%s\x80\nGameplay has now been modified.\nIf you want to play record attack mode, restart the game to clear existing add-ons.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); @@ -5141,7 +5145,7 @@ static void M_GetAllEmeralds(INT32 choice) emeralds = ((EMERALD7)*2)-1; M_StartMessage(M_GetText("You now have all 7 emeralds.\nUse them wisely.\nWith great power comes great ring drain.\n"),NULL,MM_NOTHING); - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, true); } static void M_DestroyRobotsResponse(INT32 ch) @@ -5152,7 +5156,7 @@ static void M_DestroyRobotsResponse(INT32 ch) // Destroy all robots P_DestroyRobots(); - G_SetGameModified(multiplayer); + G_SetGameModified(multiplayer, true); } static void M_DestroyRobots(INT32 choice) diff --git a/src/p_setup.c b/src/p_setup.c index 0a59a2a94..fcb1ac786 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3459,7 +3459,7 @@ boolean P_AddWadFile(const char *wadfilename) if (num <= NUMMAPS && mapheaderinfo[num-1]) { if (mapheaderinfo[num-1]->menuflags & LF2_EXISTSHACK) - majormods = true; // oops, double-defined - no record attack privileges for you + G_SetGameModified(multiplayer, true); // oops, double-defined - no record attack privileges for you mapheaderinfo[num-1]->menuflags |= LF2_EXISTSHACK; } @@ -3489,6 +3489,8 @@ boolean P_AddWadFile(const char *wadfilename) SendNetXCmd(XD_EXITLEVEL, NULL, 0); } + refreshdirmenu &= ~REFRESHDIR_GAMEDATA; // Under usual circumstances we'd wait for REFRESHDIR_GAMEDATA to disappear the next frame, but it's a bit too dangerous for that... + return true; } diff --git a/src/w_wad.c b/src/w_wad.c index 58a65191d..efa09ce43 100644 --- a/src/w_wad.c +++ b/src/w_wad.c @@ -34,6 +34,7 @@ #include "z_zone.h" #include "fastcmp.h" +#include "g_game.h" // G_LoadGameData #include "filesrch.h" #include "i_video.h" // rendermode @@ -799,6 +800,8 @@ UINT16 W_InitFile(const char *filename) break; } + if (refreshdirmenu & REFRESHDIR_GAMEDATA) + G_LoadGameData(); DEH_UpdateMaxFreeslots(); W_InvalidateLumpnumCache(); From 88dc2569e48bcd0e90de8b7989c23f6700f40c34 Mon Sep 17 00:00:00 2001 From: toaster Date: Thu, 17 Jan 2019 22:12:59 +0000 Subject: [PATCH 11/49] Remove irrelevant attempts at majormod setting for SOC events which explicitly can only happen if a gamedata is created. --- src/dehacked.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/dehacked.c b/src/dehacked.c index 4edeb987c..7820928dd 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3671,7 +3671,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (numemblems < i) numemblems = i; reademblemdata(f, i); - G_SetGameModified(multiplayer, true); } else { @@ -3692,7 +3691,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (numextraemblems < i) numextraemblems = i; readextraemblemdata(f, i); - G_SetGameModified(multiplayer, true); } else { @@ -3709,10 +3707,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } else if (i > 0 && i <= MAXUNLOCKABLES) - { readunlockable(f, i - 1); - G_SetGameModified(multiplayer, true); - } else { deh_warning("Unlockable number %d out of range (1 - %d)", i, MAXUNLOCKABLES); @@ -3728,10 +3723,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } else if (i > 0 && i <= MAXCONDITIONSETS) - { readconditionset(f, (UINT8)i); - G_SetGameModified(multiplayer, true); - } else { deh_warning("Condition set number %d out of range (1 - %d)", i, MAXCONDITIONSETS); @@ -3785,8 +3777,6 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (clearall || fastcmp(word2, "LEVELS")) clear_levels(); - - G_SetGameModified(multiplayer, true); } else deh_warning("Unknown word: %s", word); From 0eca0e6613d942c5295cbecd62d9216489d3d6f1 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 18 Jan 2019 13:01:40 +0000 Subject: [PATCH 12/49] Turns out modifiedgame was getting set during startup because of making it use G_SetGameModified. Uh, woops? --- src/d_main.c | 1 - src/g_game.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/d_main.c b/src/d_main.c index fd85770ca..5cf95f4b8 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1253,7 +1253,6 @@ void D_SRB2Main(void) #endif //ifndef DEVELOP mainwadstally = packetsizetally; - majormods = false; cht_Init(); diff --git a/src/g_game.c b/src/g_game.c index 789c5cc5b..1b583e175 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -756,7 +756,7 @@ void G_SetNightsRecords(void) // for consistency among messages: this modifies the game and removes savemoddata. void G_SetGameModified(boolean silent, boolean major) { - if ((majormods && modifiedgame && !savemoddata) || (refreshdirmenu & REFRESHDIR_GAMEDATA)) // new gamedata amnesty? + if ((majormods && modifiedgame && !savemoddata) || !mainwads || (refreshdirmenu & REFRESHDIR_GAMEDATA)) // new gamedata amnesty? return; modifiedgame = true; From 51b20073a29fa633d7176c629ee49881150d272b Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 18 Jan 2019 13:04:12 +0000 Subject: [PATCH 13/49] Add warning message when attempting to use the master server browser while `modifiedgame` is true. (We assume that if you're using an IP address connection, you're more of a power user.) --- src/m_menu.c | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index b1d9ba093..d03868870 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -274,14 +274,13 @@ static menu_t SP_TimeAttackDef, SP_ReplayDef, SP_GuestReplayDef, SP_GhostDef; #ifndef NONET static void M_StartServerMenu(INT32 choice); static void M_ConnectMenu(INT32 choice); -#endif -static void M_StartOfflineServerMenu(INT32 choice); -static void M_StartServer(INT32 choice); -#ifndef NONET +static void M_ConnectMenuModChecks(INT32 choice); static void M_Refresh(INT32 choice); static void M_Connect(INT32 choice); static void M_ChooseRoom(INT32 choice); #endif +static void M_StartOfflineServerMenu(INT32 choice); +static void M_StartServer(INT32 choice); static void M_SetupMultiPlayer(INT32 choice); static void M_SetupMultiPlayer2(INT32 choice); static void M_SetupMultiPlayer3(INT32 choice); @@ -969,11 +968,11 @@ static menuitem_t MP_MainMenu[] = {IT_HEADER, NULL, "Join a game", NULL, 132-24}, #ifndef NONET - {IT_STRING|IT_CALL, NULL, "Internet server browser...",M_ConnectMenu, 142-24}, + {IT_STRING|IT_CALL, NULL, "Internet server browser...",M_ConnectMenuModChecks, 142-24}, {IT_STRING|IT_KEYHANDLER, NULL, "Specify IPv4 address:", M_HandleConnectIP, 150-24}, #else - {IT_GRAYEDOUT, NULL, "Internet server browser...",M_ConnectMenu, 142-24}, - {IT_GRAYEDOUT, NULL, "Specify IPv4 address:", M_HandleConnectIP, 150-24}, + {IT_GRAYEDOUT, NULL, "Internet server browser...",NULL, 142-24}, + {IT_GRAYEDOUT, NULL, "Specify IPv4 address:", NULL, 150-24}, #endif //{IT_HEADER, NULL, "Player setup", NULL, 80}, //{IT_STRING|IT_CALL, NULL, "Name, character, color...", M_SetupMultiPlayer, 90}, @@ -4583,7 +4582,7 @@ static boolean M_AddonsRefresh(void) { S_StartSound(NULL, sfx_s26d); if (refreshdirmenu & REFRESHDIR_MAX) - message = va("%c%s\x80\nMaximum number of add-ons reached.\nA file could not be loaded.\nIf you want to play with this add-on, restart the game to clear existing ones.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); + message = va("%c%s\x80\nMaximum number of add-ons reached.\nA file could not be loaded.\nif you wish to play with this add-on, restart the game to clear existing ones.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); else message = va("%c%s\x80\nA file was not loaded.\nCheck the console log for more information.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); } @@ -4595,7 +4594,7 @@ static boolean M_AddonsRefresh(void) else if (majormods && !prevmajormods && !savemoddata) { S_StartSound(NULL, sfx_s221); - message = va("%c%s\x80\nGameplay has now been modified.\nIf you want to play record attack mode, restart the game to clear existing add-ons.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); + message = va("%c%s\x80\nGameplay has now been modified.\nif you wish to play record attack mode, restart the game to clear existing add-ons.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); prevmajormods = majormods; } @@ -7423,6 +7422,20 @@ static void M_ConnectMenu(INT32 choice) M_Refresh(0); } +static void M_ConnectMenuModChecks(INT32 choice) +{ + (void)choice; + // okay never mind we want to COMMUNICATE to the player pre-emptively instead of letting them try and then get confused when it doesn't work + + if (modifiedgame) + { + M_StartMessage(M_GetText("Add-ons are currently loaded.\nYou will only be able to join a server if\nit has the same ones loaded in the same order.\nIf you wish to play on other servers,\nrestart the game to clear existing add-ons.\n(Press a key)\n"),M_ConnectMenu,MM_EVENTHANDLER); + return; + } + + M_ConnectMenu(-1); +} + static UINT32 roomIds[NUM_LIST_ROOMS]; static void M_RoomMenu(INT32 choice) From b912ae36c28c852103eca4bf168e1f73a818a886 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 18 Jan 2019 14:11:59 +0000 Subject: [PATCH 14/49] Improve readability of server browser add-ons message. --- src/m_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index d03868870..9534a456d 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -7429,7 +7429,7 @@ static void M_ConnectMenuModChecks(INT32 choice) if (modifiedgame) { - M_StartMessage(M_GetText("Add-ons are currently loaded.\nYou will only be able to join a server if\nit has the same ones loaded in the same order.\nIf you wish to play on other servers,\nrestart the game to clear existing add-ons.\n(Press a key)\n"),M_ConnectMenu,MM_EVENTHANDLER); + M_StartMessage(M_GetText("Add-ons are currently loaded.\n\nYou will only be able to join a server if\nit has the same ones loaded in the same order, which may be unlikely.\n\nIf you wish to play on other servers,\nrestart the game to clear existing add-ons.\n\n(Press a key)\n"),M_ConnectMenu,MM_EVENTHANDLER); return; } From 5dac9c47316989ba2be80833882bd9c2040d2287 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 18 Jan 2019 14:53:43 +0000 Subject: [PATCH 15/49] whoopsie doodle, forgot gh wasn't allocated until after this section --- src/g_game.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 1b583e175..327a96ba6 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -6018,6 +6018,7 @@ void G_AddGhost(char *defdemoname) UINT8 *buffer,*p; mapthing_t *mthing; UINT16 count, ghostversion; + skin_t *ghskin = &skins[0]; name[16] = '\0'; skin[16] = '\0'; @@ -6163,11 +6164,10 @@ void G_AddGhost(char *defdemoname) return; } - gh->oldmo.skin = &skins[0]; for (i = 0; i < numskins; i++) if (!stricmp(skins[i].name,skin)) { - gh->oldmo.skin = &skins[i]; + ghskin = &skins[i]; break; } @@ -6224,7 +6224,7 @@ void G_AddGhost(char *defdemoname) gh->oldmo.z = gh->mo->z; // Set skin - gh->mo->skin = gh->oldmo.skin; + gh->mo->skin = gh->oldmo.skin = ghskin; // Set color gh->mo->color = ((skin_t*)gh->mo->skin)->prefcolor; From 963c4451b441b287e12d19d403177717595e77ca Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 21 Jan 2019 21:48:52 +0000 Subject: [PATCH 16/49] Fix incorrect condition for setting savemoddata to false. --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 327a96ba6..60fd56cbe 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -760,11 +760,11 @@ void G_SetGameModified(boolean silent, boolean major) return; modifiedgame = true; - savemoddata = false; if (!major) return; + savemoddata = false; majormods = true; if (!silent) From 7786e5b17288f8df0f110722ac2f71e02449da5c Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 21 Jan 2019 21:49:39 +0000 Subject: [PATCH 17/49] Fix everything Sal wanted changed. --- src/d_netcmd.c | 10 ++++++---- src/dehacked.c | 5 ++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 244e3058a..617ff78f3 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4916,11 +4916,13 @@ static void Fishcake_OnChange(void) static void Command_Isgamemodified_f(void) { if (savemoddata) - CONS_Printf(M_GetText("The game is modified, but you can save medal and record data in this add-on.\n")); - else if (/*modifiedgame*/ majormods) - CONS_Printf(M_GetText("Major add-ons have been loaded, so you cannot play record attack.\n")); + CONS_Printf("The game has been modified with an add-on with its own save data, so you can play Record Attack and earn medals.\n"); + else if (majormods) + CONS_Printf("The game has been modified with major add-ons, so you cannot play Record Attack.\n"); + else if (modifiedgame) + CONS_Printf("The game has been modified with only minor add-ons. You can play Record Attack, earn medals and unlock extras.\n"); else - CONS_Printf(M_GetText("No major add-ons are loaded. You can play record attack, earn medals and unlock extras.\n")); + CONS_Printf("The game has not been modified. You can play Record Attack, earn medals and unlock extras.\n"); } static void Command_Cheats_f(void) diff --git a/src/dehacked.c b/src/dehacked.c index 7820928dd..8bb2d5676 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -9773,7 +9773,10 @@ static inline int lib_getenum(lua_State *L) lua_pushboolean(L, devparm); return 1; } else if (fastcmp(word,"modifiedgame")) { - lua_pushboolean(L, /*modifiedgame*/ majormods && !savemoddata); + lua_pushboolean(L, modifiedgame && !savemoddata); + return 1; + } else if (fastcmp(word,"majormods")) { + lua_pushboolean(L, majormods); return 1; } else if (fastcmp(word,"menuactive")) { lua_pushboolean(L, menuactive); From 004cde8a5761180641050ba39de599337a8a1f30 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 26 Jan 2019 16:58:45 +0000 Subject: [PATCH 18/49] Code cleanup as requested by Sal and Sryder. * majormods and savemoddata cannot coexist as true values, so going through and making situations that involve both only reference one. * Clean up comments in `dehacked.c`. --- src/d_netcmd.c | 2 +- src/dehacked.c | 22 +++++++++++----------- src/g_game.c | 2 +- src/m_cond.c | 3 +-- src/m_menu.c | 4 ++-- src/p_setup.c | 4 ++-- src/y_inter.c | 2 +- 7 files changed, 19 insertions(+), 20 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 1da2c5234..67f8c3a2b 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -2209,7 +2209,7 @@ static void Command_Map_f(void) return; } - if (!(netgame || multiplayer) && (!majormods || savemoddata)) + if (!(netgame || multiplayer) && !majormods) { if (COM_CheckParm("-force")) { diff --git a/src/dehacked.c b/src/dehacked.c index 835502820..0ad67ff0b 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -3425,7 +3425,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) if (fastcmp(word, "FREESLOT")) { readfreeslots(f); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. continue; } else if (fastcmp(word, "MAINCFG")) @@ -3439,7 +3439,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) { readwipes(f); DEH_WriteUndoline(word, "", UNDO_HEADER); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. continue; } word2 = strtok(NULL, " "); @@ -3460,7 +3460,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. continue; } if (word2) @@ -3474,14 +3474,14 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) // Read texture from spec file. readtexture(f, word2); DEH_WriteUndoline(word, word2, UNDO_HEADER); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. } else if (fastcmp(word, "PATCH")) { // Read patch from spec file. readpatch(f, word2, wad); DEH_WriteUndoline(word, word2, UNDO_HEADER); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. } else if (fastcmp(word, "THING") || fastcmp(word, "MOBJ") || fastcmp(word, "OBJECT")) { @@ -3503,7 +3503,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) /* else if (fastcmp(word, "ANIMTEX")) { readAnimTex(f, i); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. }*/ else if (fastcmp(word, "LIGHT")) { @@ -3517,7 +3517,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. #endif } else if (fastcmp(word, "SPRITE")) @@ -3533,7 +3533,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. #endif } else if (fastcmp(word, "LEVEL")) @@ -3622,7 +3622,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //G_SetGameModified(multiplayer, true); -- ...this won't bite me in the ass later, will it? + // This is not a major mod. } /* else if (fastcmp(word, "SPRITE")) { @@ -3643,7 +3643,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) } else deh_warning("Sprite %d doesn't exist",i); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. }*/ else if (fastcmp(word, "HUDITEM")) { @@ -3657,7 +3657,7 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad) ignorelines(f); } DEH_WriteUndoline(word, word2, UNDO_HEADER); - //G_SetGameModified(multiplayer, true); + // This is not a major mod. } else if (fastcmp(word, "EMBLEM")) { diff --git a/src/g_game.c b/src/g_game.c index e347cf7c5..1e0744f4c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -756,7 +756,7 @@ void G_SetNightsRecords(void) // for consistency among messages: this modifies the game and removes savemoddata. void G_SetGameModified(boolean silent, boolean major) { - if ((majormods && modifiedgame && !savemoddata) || !mainwads || (refreshdirmenu & REFRESHDIR_GAMEDATA)) // new gamedata amnesty? + if ((majormods && modifiedgame) || !mainwads || (refreshdirmenu & REFRESHDIR_GAMEDATA)) // new gamedata amnesty? return; modifiedgame = true; diff --git a/src/m_cond.c b/src/m_cond.c index b0e49a683..b777e7d22 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -385,8 +385,7 @@ UINT8 M_UpdateUnlockablesAndExtraEmblems(boolean force) char cechoText[992] = ""; UINT8 cechoLines = 0; - if (/*modifiedgame*/ majormods && !savemoddata - && !force) // SRB2Kart: for enabling unlocks online in modified servers + if (majormods && !force) // SRB2Kart: for enabling unlocks online in modified servers return false; M_CheckUnlockConditions(); diff --git a/src/m_menu.c b/src/m_menu.c index 1edb1cdff..2ea7234c2 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -2738,7 +2738,7 @@ boolean M_Responder(event_t *ev) || (currentMenu->menuitems[itemOn].status & IT_TYPE)==IT_SUBMENU) && (currentMenu->menuitems[itemOn].status & IT_CALLTYPE)) { - if (((currentMenu->menuitems[itemOn].status & IT_CALLTYPE) & IT_CALL_NOTMODIFIED) && /*modifiedgame*/ majormods && !savemoddata) + if (((currentMenu->menuitems[itemOn].status & IT_CALLTYPE) & IT_CALL_NOTMODIFIED) && majormods) { S_StartSound(NULL, sfx_menu1); M_StartMessage(M_GetText("This cannot be done with complex add-ons\nor in a cheated game.\n\n(Press a key)\n"), NULL, MM_NOTHING); @@ -4567,7 +4567,7 @@ static boolean M_AddonsRefresh(void) S_StartSound(NULL, sfx_s224); message = va("%c%s\x80\nA file was loaded with %s.\nCheck the console log for more information.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname, ((refreshdirmenu & REFRESHDIR_ERROR) ? "errors" : "warnings")); } - else if (majormods && !prevmajormods && !savemoddata) + else if (majormods && !prevmajormods) { S_StartSound(NULL, sfx_s221); message = va("%c%s\x80\nGameplay has now been modified.\nif you wish to play record attack mode, restart the game to clear existing add-ons.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); diff --git a/src/p_setup.c b/src/p_setup.c index fcb1ac786..912791cf9 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1120,7 +1120,7 @@ static inline void P_SpawnEmblems(void) static void P_SpawnSecretItems(boolean loademblems) { // Now let's spawn those funky emblem things! Tails 12-08-2002 - if (netgame || multiplayer || (/*modifiedgame*/ majormods && !savemoddata)) // No cheating!! + if (netgame || multiplayer || majormods) // No cheating!! return; if (loademblems) @@ -3272,7 +3272,7 @@ boolean P_SetupLevel(boolean skipprecip) nextmapoverride = 0; skipstats = false; - if (!(netgame || multiplayer) && (/*!modifiedgame*/ !majormods || savemoddata)) + if (!(netgame || multiplayer) && !majormods) mapvisited[gamemap-1] |= MV_VISITED; levelloading = false; diff --git a/src/y_inter.c b/src/y_inter.c index 046d6d6d3..795f7f1b4 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -786,7 +786,7 @@ void Y_StartIntermission(void) } case int_race: // (time-only race) { - if ((/*!modifiedgame*/ !majormods || savemoddata) && !multiplayer && !demoplayback) // remove this once we have a proper time attack screen + if (!majormods && !multiplayer && !demoplayback) // remove this once we have a proper time attack screen { // Update visitation flags mapvisited[gamemap-1] |= MV_BEATEN; From 4e4d663b3ec2590fe8e9dbad5b4088cbb90c4eab Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 26 Jan 2019 19:12:53 +0000 Subject: [PATCH 19/49] Do a bit more cleanup. Notably, prevent skins setting a bunch of things in preperation for this branch hitting the mainstream. Also, make SF_RUNONWATER set off majormods. I was under strong pressure to remove it and almost did but honestly it's kind of endearing and I think like one character in Releases uses it..? --- src/p_map.c | 235 +------------------------------------------------ src/p_mobj.c | 3 +- src/p_spec.c | 19 ++-- src/p_user.c | 68 -------------- src/r_things.c | 29 +++--- 5 files changed, 24 insertions(+), 330 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index c307e5721..051a1e6f4 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3231,129 +3231,6 @@ isblocking: return false; // stop } -// -// P_IsClimbingValid -// -// Unlike P_DoClimbing, don't use when up against a one-sided linedef. -// -static boolean P_IsClimbingValid(player_t *player, angle_t angle) -{ - fixed_t platx, platy; - subsector_t *glidesector; - fixed_t floorz, ceilingz; - - platx = P_ReturnThrustX(player->mo, angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale)); - platy = P_ReturnThrustY(player->mo, angle, player->mo->radius + FixedMul(8*FRACUNIT, player->mo->scale)); - - glidesector = R_PointInSubsector(player->mo->x + platx, player->mo->y + platy); - -#ifdef ESLOPE - floorz = glidesector->sector->f_slope ? P_GetZAt(glidesector->sector->f_slope, player->mo->x, player->mo->y) : glidesector->sector->floorheight; - ceilingz = glidesector->sector->c_slope ? P_GetZAt(glidesector->sector->c_slope, player->mo->x, player->mo->y) : glidesector->sector->ceilingheight; -#else - floorz = glidesector->sector->floorheight; - ceilingz = glidesector->sector->ceilingheight; -#endif - - if (glidesector->sector != player->mo->subsector->sector) - { - boolean floorclimb = false; - fixed_t topheight, bottomheight; - - if (glidesector->sector->ffloors) - { - ffloor_t *rover; - for (rover = glidesector->sector->ffloors; rover; rover = rover->next) - { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER)) - continue; - - topheight = *rover->topheight; - bottomheight = *rover->bottomheight; - -#ifdef ESLOPE - if (*rover->t_slope) - topheight = P_GetZAt(*rover->t_slope, player->mo->x, player->mo->y); - if (*rover->b_slope) - bottomheight = P_GetZAt(*rover->b_slope, player->mo->x, player->mo->y); -#endif - - floorclimb = true; - - if (player->mo->eflags & MFE_VERTICALFLIP) - { - if ((topheight < player->mo->z + player->mo->height) && ((player->mo->z + player->mo->height + player->mo->momz) < topheight)) - { - floorclimb = true; - } - if (topheight < player->mo->z) // Waaaay below the ledge. - { - floorclimb = false; - } - if (bottomheight > player->mo->z + player->mo->height - FixedMul(16*FRACUNIT,player->mo->scale)) - { - floorclimb = false; - } - } - else - { - if ((bottomheight > player->mo->z) && ((player->mo->z - player->mo->momz) > bottomheight)) - { - floorclimb = true; - } - if (bottomheight > player->mo->z + player->mo->height) // Waaaay below the ledge. - { - floorclimb = false; - } - if (topheight < player->mo->z + FixedMul(16*FRACUNIT,player->mo->scale)) - { - floorclimb = false; - } - } - - if (floorclimb) - break; - } - } - - if (player->mo->eflags & MFE_VERTICALFLIP) - { - if ((floorz <= player->mo->z + player->mo->height) - && ((player->mo->z + player->mo->height - player->mo->momz) <= floorz)) - floorclimb = true; - - if ((floorz > player->mo->z) - && glidesector->sector->floorpic == skyflatnum) - return false; - - if ((player->mo->z + player->mo->height - FixedMul(16*FRACUNIT,player->mo->scale) > ceilingz) - || (player->mo->z + player->mo->height <= floorz)) - floorclimb = true; - } - else - { - if ((ceilingz >= player->mo->z) - && ((player->mo->z - player->mo->momz) >= ceilingz)) - floorclimb = true; - - if ((ceilingz < player->mo->z+player->mo->height) - && glidesector->sector->ceilingpic == skyflatnum) - return false; - - if ((player->mo->z + FixedMul(16*FRACUNIT,player->mo->scale) < ceilingz) - || (player->mo->z >= ceilingz)) - floorclimb = true; - } - - if (!floorclimb) - return false; - - return true; - } - - return false; -} - // // PTR_SlideTraverse // @@ -3407,117 +3284,7 @@ isblocking: P_ProcessSpecialSector(slidemo->player, slidemo->subsector->sector, li->polyobj->lines[0]->backsector); } - if (slidemo->player && (slidemo->player->pflags & PF_GLIDING || slidemo->player->climbing) - && slidemo->player->charability == CA_GLIDEANDCLIMB) - { - line_t *checkline = li; - sector_t *checksector; - ffloor_t *rover; - fixed_t topheight, bottomheight; - boolean fofline = false; - INT32 side = P_PointOnLineSide(slidemo->x, slidemo->y, li); - - if (!side && li->backsector) - checksector = li->backsector; - else - checksector = li->frontsector; - - if (checksector->ffloors) - { - for (rover = checksector->ffloors; rover; rover = rover->next) - { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER) || (rover->flags & FF_BUSTUP)) - continue; - - topheight = *rover->topheight; - bottomheight = *rover->bottomheight; - -#ifdef ESLOPE - if (*rover->t_slope) - topheight = P_GetZAt(*rover->t_slope, slidemo->x, slidemo->y); - if (*rover->b_slope) - bottomheight = P_GetZAt(*rover->b_slope, slidemo->x, slidemo->y); -#endif - - if (topheight < slidemo->z) - continue; - - if (bottomheight > slidemo->z + slidemo->height) - continue; - - // Got this far, so I guess it's climbable. // TODO: Climbing check, also, better method to do this? - if (rover->master->flags & ML_TFERLINE) - { - size_t linenum = li-checksector->lines[0]; - checkline = rover->master->frontsector->lines[0] + linenum; - fofline = true; - } - - break; - } - } - - // see about climbing on the wall - if (!(checkline->flags & ML_NOCLIMB)) - { - boolean canclimb; - angle_t climbangle, climbline; - INT32 whichside = P_PointOnLineSide(slidemo->x, slidemo->y, li); - - climbangle = climbline = R_PointToAngle2(li->v1->x, li->v1->y, li->v2->x, li->v2->y); - - if (whichside) // on second side? - climbline += ANGLE_180; - - climbangle += (ANGLE_90 * (whichside ? -1 : 1)); - - canclimb = (li->backsector ? P_IsClimbingValid(slidemo->player, climbangle) : true); - - if (((!slidemo->player->climbing && abs((signed)(slidemo->angle - ANGLE_90 - climbline)) < ANGLE_45) - || (slidemo->player->climbing == 1 && abs((signed)(slidemo->angle - climbline)) < ANGLE_135)) - && canclimb) - { - slidemo->angle = climbangle; - if (!demoplayback || P_AnalogMove(slidemo->player)) - { - if (slidemo->player == &players[consoleplayer]) - localangle = slidemo->angle; - else if (slidemo->player == &players[secondarydisplayplayer]) - localangle2 = slidemo->angle; - else if (slidemo->player == &players[thirddisplayplayer]) - localangle3 = slidemo->angle; - else if (slidemo->player == &players[fourthdisplayplayer]) - localangle4 = slidemo->angle; - } - - if (!slidemo->player->climbing) - { - S_StartSound(slidemo->player->mo, sfx_s3k4a); - slidemo->player->climbing = 5; - } - - slidemo->player->pflags &= ~(PF_GLIDING|PF_SPINNING|PF_JUMPED|PF_THOKKED); - slidemo->player->glidetime = 0; - slidemo->player->secondjump = 0; - - if (slidemo->player->climbing > 1) - slidemo->momz = slidemo->momx = slidemo->momy = 0; - - if (fofline) - whichside = 0; - - if (!whichside) - { - slidemo->player->lastsidehit = checkline->sidenum[whichside]; - slidemo->player->lastlinehit = (INT16)(checkline - lines); - } - - P_Thrust(slidemo, slidemo->angle, FixedMul(5*FRACUNIT, slidemo->scale)); - } - } - } - - if (in->frac < bestslidefrac && (!slidemo->player || !slidemo->player->climbing)) + if (in->frac < bestslidefrac) { secondslidefrac = bestslidefrac; secondslideline = bestslideline; diff --git a/src/p_mobj.c b/src/p_mobj.c index f71ff2092..d380b97a3 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3233,8 +3233,7 @@ boolean P_CanRunOnWater(player_t *player, ffloor_t *rover) #endif *rover->topheight; - if (!(player->pflags & PF_NIGHTSMODE) && !player->homing - && (((player->charability == CA_SWIM) || player->powers[pw_super] || player->charflags & SF_RUNONWATER) && player->mo->ceilingz-topheight >= player->mo->height) + if (((player->charflags & SF_RUNONWATER) && player->mo->ceilingz-topheight >= player->mo->height) && (rover->flags & FF_SWIMMABLE) && !(player->pflags & PF_SPINNING) && player->speed > FixedMul(player->runspeed, player->mo->scale) && !(player->pflags & PF_SLIDING) && abs(player->mo->z - topheight) < FixedMul(30*FRACUNIT, player->mo->scale)) diff --git a/src/p_spec.c b/src/p_spec.c index ca4967ce3..24f56c432 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1758,12 +1758,12 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller switch (specialtype) { - case 305: // continuous + /*case 305: // continuous case 306: // each time case 307: // once if (!(actor && actor->player && actor->player->charability == dist/10)) return false; - break; + break;*/ case 309: // continuous case 310: // each time // Only red team members can activate this. @@ -3864,14 +3864,6 @@ DoneSection2: P_InstaThrust(player->mo, player->mo->angle, linespeed); - /*if (GETSECSPECIAL(sector->special, 3) == 6 && (player->charability2 == CA2_SPINDASH)) // SRB2kart - { - if (!(player->pflags & PF_SPINNING)) - player->pflags |= PF_SPINNING; - - //P_SetPlayerMobjState(player->mo, S_PLAY_ATK1); - }*/ - player->kartstuff[k_dashpadcooldown] = TICRATE/3; player->kartstuff[k_drift] = 0; player->kartstuff[k_driftcharge] = 0; @@ -5781,7 +5773,7 @@ void P_SpawnSpecials(INT32 fromnetsave) lines[i].special = 0; continue; } - /*else -- commented out because irrelevant to kart + /*else -- commented out because irrelevant to kart. keeping here because we can use these flags for something else now { if ((players[consoleplayer].charability == CA_THOK && (lines[i].flags & ML_NOSONIC)) || (players[consoleplayer].charability == CA_FLY && (lines[i].flags & ML_NOTAILS)) @@ -7997,12 +7989,13 @@ static void P_SearchForDisableLinedefs(void) } else if ((lines[i].flags & ML_NETONLY) == ML_NETONLY) continue; // Net-only never triggers in single player - else if (players[consoleplayer].charability == CA_THOK && (lines[i].flags & ML_NOSONIC)) + // commented out because irrelevant to kart. keeping here because we can use these flags for something else now + /*else if (players[consoleplayer].charability == CA_THOK && (lines[i].flags & ML_NOSONIC)) continue; else if (players[consoleplayer].charability == CA_FLY && (lines[i].flags & ML_NOTAILS)) continue; else if (players[consoleplayer].charability == CA_GLIDEANDCLIMB && (lines[i].flags & ML_NOKNUX)) - continue; + continue;*/ // Disable any linedef specials with our tag. for (j = -1; (j = P_FindLineFromLineTag(&lines[i], j)) >= 0;) diff --git a/src/p_user.c b/src/p_user.c index d7423d803..ce411d2d1 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -7323,74 +7323,6 @@ static void P_MovePlayer(player_t *player) if (CheckForBustableBlocks) P_CheckBustableBlocks(player); - // Special handling for - // gliding in 2D mode - if ((twodlevel || player->mo->flags2 & MF2_TWOD) && player->pflags & PF_GLIDING && player->charability == CA_GLIDEANDCLIMB - && !(player->mo->flags & MF_NOCLIP)) - { - msecnode_t *node; // only place it's being used in P_MovePlayer now - fixed_t oldx; - fixed_t oldy; - fixed_t floorz, ceilingz; - - oldx = player->mo->x; - oldy = player->mo->y; - - P_UnsetThingPosition(player->mo); - player->mo->x += player->mo->momx; - player->mo->y += player->mo->momy; - P_SetThingPosition(player->mo); - - for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) - { - if (!node->m_sector) - break; - - if (node->m_sector->ffloors) - { - ffloor_t *rover; - fixed_t topheight, bottomheight; - - for (rover = node->m_sector->ffloors; rover; rover = rover->next) - { - if (!(rover->flags & FF_EXISTS) || !(rover->flags & FF_BLOCKPLAYER)) - continue; - - 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); - if (topheight > player->mo->z && bottomheight < player->mo->z) - { - P_ResetPlayer(player); - S_StartSound(player->mo, sfx_s3k4a); - player->climbing = 5; - player->mo->momx = player->mo->momy = player->mo->momz = 0; - break; - } - } - } - - floorz = P_GetFloorZ(player->mo, node->m_sector, player->mo->x, player->mo->y, NULL); - ceilingz = P_GetCeilingZ(player->mo, node->m_sector, player->mo->x, player->mo->y, NULL); - - if (player->mo->z+player->mo->height > ceilingz - && node->m_sector->ceilingpic == skyflatnum) - continue; - - if (floorz > player->mo->z || ceilingz < player->mo->z) - { - P_ResetPlayer(player); - S_StartSound(player->mo, sfx_s3k4a); - player->climbing = 5; - player->mo->momx = player->mo->momy = player->mo->momz = 0; - break; - } - } - P_UnsetThingPosition(player->mo); - player->mo->x = oldx; - player->mo->y = oldy; - P_SetThingPosition(player->mo); - } - // Check for a BOUNCY sector! if (CheckForBouncySector) P_CheckBouncySectors(player); diff --git a/src/r_things.c b/src/r_things.c index c0a71b024..135ae6a29 100644 --- a/src/r_things.c +++ b/src/r_things.c @@ -2895,27 +2895,27 @@ void R_AddSkins(UINT16 wadnum) #define FULLPROCESS(field) else if (!stricmp(stoken, #field)) skin->field = get_number(value); // character type identification FULLPROCESS(flags) - FULLPROCESS(ability) - FULLPROCESS(ability2) + //FULLPROCESS(ability) + //FULLPROCESS(ability2) - FULLPROCESS(thokitem) - FULLPROCESS(spinitem) - FULLPROCESS(revitem) + //FULLPROCESS(thokitem) + //FULLPROCESS(spinitem) + //FULLPROCESS(revitem) #undef FULLPROCESS #define GETSPEED(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value)<field = atoi(value); +/*#define GETINT(field) else if (!stricmp(stoken, #field)) skin->field = atoi(value); GETINT(thrustfactor) GETINT(accelstart) GETINT(acceleration) -#undef GETINT +#undef GETINT*/ #define GETKARTSTAT(field) \ else if (!stricmp(stoken, #field)) \ @@ -2934,8 +2934,8 @@ void R_AddSkins(UINT16 wadnum) else if (!stricmp(stoken, "prefcolor")) skin->prefcolor = K_GetKartColorByName(value); - else if (!stricmp(stoken, "jumpfactor")) - skin->jumpfactor = FLOAT_TO_FIXED(atof(value)); + //else if (!stricmp(stoken, "jumpfactor")) + //skin->jumpfactor = FLOAT_TO_FIXED(atof(value)); else if (!stricmp(stoken, "highresscale")) skin->highresscale = FLOAT_TO_FIXED(atof(value)); else @@ -3045,6 +3045,9 @@ next_token: HWR_AddPlayerMD2(numskins); #endif + if (skin->flags & SF_RUNONWATER) // this is literally the only way a skin can be a major mod... this might be a bit heavy handed + G_SetGameModified(multiplayer, true); + numskins++; } return; From f7d8c3877e567ac62be9ef93f4f47035443087e4 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 27 Jan 2019 17:51:46 -0500 Subject: [PATCH 20/49] Scale number of allowed invuln items w/ player count 0-5 players: 1 invincibility/grow allowed out at once 6-9 players: 2 invincibilities (how it was before) 10-13 players: 3 invincibilities 14+ players: 4 invincibilites --- 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 18165a7f2..bc5e53caa 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -700,7 +700,7 @@ static INT32 K_KartGetItemOdds(UINT8 pos, SINT8 item, fixed_t mashed) { case KITEM_INVINCIBILITY: case KITEM_GROW: - if (pinvin >= 2) + if (pinvin >= max(1, (pingame+2) / 4)) newodds = 0; else /* FALLTHRU */ From 95251808d4167913c5f3611787523b7cfcfdcd52 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 27 Jan 2019 17:52:53 -0500 Subject: [PATCH 21/49] Thin names for 9+ player intermission --- src/y_inter.c | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/y_inter.c b/src/y_inter.c index 021519e3b..a8b1f740b 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -474,16 +474,12 @@ void Y_IntermissionDrawer(void) V_DrawScaledPatch(x+16, y-4, 0, W_CachePatchName(va("K_CHILI%d", cursorframe+1), PU_CACHE)); } - if (!gutter) - strlcpy(strtime, data.match.name[i], 6); - else - STRBUFCPY(strtime, data.match.name[i]); + STRBUFCPY(strtime, data.match.name[i]); - V_DrawString(x+36, y, - ((data.match.num[i] == whiteplayer) - ? hilicol|V_ALLOWLOWERCASE - : V_ALLOWLOWERCASE), - strtime); + if (!gutter) + V_DrawThinString(x+36, y, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); + else + V_DrawString(x+36, y, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); if (data.match.rankingsmode) { From d6e5be72e0d22df6e2a351ee62ae3e680b2c6db3 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 27 Jan 2019 21:11:49 -0500 Subject: [PATCH 22/49] Apply to TAB rankings too --- src/k_kart.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index ee50cfdd2..0410a931c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7097,19 +7097,15 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I continue; //ignore them. if (netgame // don't draw it offline - && tab[i].num != serverplayer) + && tab[i].num != serverplayer) HU_drawPing(x + ((i < 8) ? -19 : rightoffset + 13), y+2, playerpingtable[tab[i].num], false); - if (scorelines > 8) - strlcpy(strtime, tab[i].name, 6); - else - STRBUFCPY(strtime, tab[i].name); + STRBUFCPY(strtime, tab[i].name); - V_DrawString(x + 20, y, - ((tab[i].num == whiteplayer) - ? hilicol|V_ALLOWLOWERCASE - : V_ALLOWLOWERCASE), - strtime); + if (scorelines > 8) + V_DrawThinString(x + 20, y, ((tab[i].num == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); + else + V_DrawString(x + 20, y, ((tab[i].num == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); if (players[tab[i].num].mo->color) { From 60c62b7a932eb06edf1afecc38fb6704a249799e Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 27 Jan 2019 21:57:18 -0500 Subject: [PATCH 23/49] Remove offroad leniency bias Everyone now has flat, equal 1-second leniency --- src/k_kart.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index f01f0d0b2..5de534bb9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1264,7 +1264,6 @@ static UINT8 K_CheckOffroadCollide(mobj_t *mo, sector_t *sec) */ static void K_UpdateOffroad(player_t *player) { - fixed_t kartweight = player->kartweight; fixed_t offroad; sector_t *nextsector = R_PointInSubsector( player->mo->x + player->mo->momx*2, player->mo->y + player->mo->momy*2)->sector; @@ -1284,13 +1283,11 @@ static void K_UpdateOffroad(player_t *player) if (offroadstrength) { if (K_CheckOffroadCollide(player->mo, player->mo->subsector->sector) && player->kartstuff[k_offroad] == 0) - player->kartstuff[k_offroad] = 16; + player->kartstuff[k_offroad] = (TICRATE/2); if (player->kartstuff[k_offroad] > 0) { - // 1872 is the magic number - 35 frames adds up to approximately 65536. 1872/4 = 468/3 = 156 - // A higher kart weight means you can stay offroad for longer without losing speed - offroad = (1872 + 5*156 - kartweight*156)*offroadstrength; + offroad = (FRACUNIT * offroadstrength) / TICRATE; //if (player->kartstuff[k_growshrinktimer] > 1) // grow slows down half as fast // offroad /= 2; From 1c2ff9310e8ee21e189b04411d7321e083d0d086 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 27 Jan 2019 21:58:17 -0500 Subject: [PATCH 24/49] Wipeout slowdown timer is set to 20 tics if below, instead of adding up per bump. --- src/k_kart.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5de534bb9..b7029452e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1211,8 +1211,8 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) mobj1->player->kartstuff[k_justbumped] = bumptime; if (mobj1->player->kartstuff[k_spinouttimer]) { - mobj1->player->kartstuff[k_wipeoutslow] += wipeoutslowtime+1; - mobj1->player->kartstuff[k_spinouttimer] += wipeoutslowtime+1; + mobj1->player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1; + mobj1->player->kartstuff[k_spinouttimer] = max(wipeoutslowtime+1, mobj1->player->kartstuff[k_spinouttimer]); } } @@ -1223,8 +1223,8 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) mobj2->player->kartstuff[k_justbumped] = bumptime; if (mobj2->player->kartstuff[k_spinouttimer]) { - mobj2->player->kartstuff[k_wipeoutslow] += wipeoutslowtime+1; - mobj2->player->kartstuff[k_spinouttimer] += wipeoutslowtime+1; + mobj2->player->kartstuff[k_wipeoutslow] = wipeoutslowtime+1; + mobj2->player->kartstuff[k_spinouttimer] = max(wipeoutslowtime+1, mobj2->player->kartstuff[k_spinouttimer]); } } } From 240252fe085bf68393e401dede0473bb97d954da Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 27 Jan 2019 21:58:44 -0500 Subject: [PATCH 25/49] Wipeout slowdown is x2 strength --- src/k_kart.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b7029452e..12da394a4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5429,6 +5429,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->mo->friction += 4608; if (player->speed > 0 && cmd->forwardmove < 0 && player->mo->friction == 59392) player->mo->friction += 1608; + + // Karma ice physics if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) { player->mo->friction += 1228; @@ -5448,11 +5450,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->mo->movefactor < 32) player->mo->movefactor = 32; } + + // Wipeout slowdown if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow]) { - player->mo->friction -= FixedMul(1228, player->kartstuff[k_offroad]); + player->mo->friction -= FixedMul(2456, player->kartstuff[k_offroad]); if (player->kartstuff[k_wipeoutslow] == 1) - player->mo->friction -= 4912; + player->mo->friction -= 9824; } K_KartDrift(player, onground); From f12972c377e2347108f2b88e63c28fa513e3a977 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 27 Jan 2019 22:28:44 -0500 Subject: [PATCH 26/49] Wipeout slowdown in offroad is static --- src/k_kart.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 12da394a4..d36856389 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -5454,7 +5454,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) // Wipeout slowdown if (player->kartstuff[k_spinouttimer] && player->kartstuff[k_wipeoutslow]) { - player->mo->friction -= FixedMul(2456, player->kartstuff[k_offroad]); + if (player->kartstuff[k_offroad]) + player->mo->friction -= 4912; if (player->kartstuff[k_wipeoutslow] == 1) player->mo->friction -= 9824; } From 753083a457862b317fb7007a0ac4805ff46fc50b Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 27 Jan 2019 23:18:40 -0500 Subject: [PATCH 27/49] Change offroad leniency from 1 second to 0.5 seconds, don't make friction more forgiving in offroad --- src/k_kart.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index d36856389..a54f8ef5b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1287,7 +1287,7 @@ static void K_UpdateOffroad(player_t *player) if (player->kartstuff[k_offroad] > 0) { - offroad = (FRACUNIT * offroadstrength) / TICRATE; + offroad = (FRACUNIT * offroadstrength) / (TICRATE/2); //if (player->kartstuff[k_growshrinktimer] > 1) // grow slows down half as fast // offroad /= 2; @@ -5425,10 +5425,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } // Friction - if (player->speed > 0 && cmd->forwardmove == 0 && player->mo->friction == 59392) - player->mo->friction += 4608; - if (player->speed > 0 && cmd->forwardmove < 0 && player->mo->friction == 59392) - player->mo->friction += 1608; + if (!player->kartstuff[k_offroad]) + { + if (player->speed > 0 && cmd->forwardmove == 0 && player->mo->friction == 59392) + player->mo->friction += 4608; + if (player->speed > 0 && cmd->forwardmove < 0 && player->mo->friction == 59392) + player->mo->friction += 1608; + } // Karma ice physics if (G_BattleGametype() && player->kartstuff[k_bumper] <= 0) From 090ba300df4555a0ab8973f1da68c68d188a1641 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sun, 27 Jan 2019 23:25:03 -0500 Subject: [PATCH 28/49] Sparks can't be started in offroad --- src/k_kart.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index a54f8ef5b..118da2c52 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4667,8 +4667,6 @@ static void K_KartDrift(player_t *player, boolean onground) player->kartstuff[k_driftend] = 0; } - - // Incease/decrease the drift value to continue drifting in that direction if (player->kartstuff[k_spinouttimer] == 0 && player->kartstuff[k_jmp] == 1 && onground && player->kartstuff[k_drift] != 0) { @@ -4700,7 +4698,7 @@ static void K_KartDrift(player_t *player, boolean onground) // Disable drift-sparks until you're going fast enough if (player->kartstuff[k_getsparks] == 0) driftadditive = 0; - if (player->speed > minspeed*2) + if (player->speed > minspeed*2 && !player->kartstuff[k_offroad]) player->kartstuff[k_getsparks] = 1; // This spawns the drift sparks From 2e232b67ba59c6bb30a7eedf7de9d7a0a351e457 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 28 Jan 2019 16:32:07 +0000 Subject: [PATCH 29/49] * Did some reviewing, turns out there's literally no reason to disable savemoddata when majormods gets tripped and it's just a stupid thing vanilla did for modifiedgame for some reason that we almost inherited with our new solution? * Adjusted the save system to acknowledge the new status quo. Instead of trying to save modifiedgame in the file like some sort of extremely boneheaded honour system everyone and their mothers hacks around, we just use it to determine whether the save is for a mod with savedata or not (this keeps backwards compatibility based on how we were using it, anyways, especially with the *force* parameter...) * Added a menu message for attempting to play a demo set on a map that isn't loaded, as opposed to letting it I_Error. * Minor tweaks to addons menu representing modded status. --- src/d_netcmd.c | 6 +++--- src/g_game.c | 25 ++++++++++++++++--------- src/m_menu.c | 7 +++++-- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 67f8c3a2b..1c90d1815 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -4910,10 +4910,10 @@ static void Fishcake_OnChange(void) */ static void Command_Isgamemodified_f(void) { - if (savemoddata) - CONS_Printf("The game has been modified with an add-on with its own save data, so you can play Record Attack and earn medals.\n"); - else if (majormods) + if (majormods) CONS_Printf("The game has been modified with major add-ons, so you cannot play Record Attack.\n"); + else if (savemoddata) + CONS_Printf("The game has been modified with an add-on with its own save data, so you can play Record Attack and earn medals.\n"); else if (modifiedgame) CONS_Printf("The game has been modified with only minor add-ons. You can play Record Attack, earn medals and unlock extras.\n"); else diff --git a/src/g_game.c b/src/g_game.c index 1e0744f4c..8dffb7d5f 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -764,7 +764,7 @@ void G_SetGameModified(boolean silent, boolean major) if (!major) return; - savemoddata = false; + //savemoddata = false; -- there is literally no reason to do this anymore. majormods = true; if (!silent) @@ -3933,7 +3933,6 @@ 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; @@ -3950,9 +3949,7 @@ void G_SaveGameData(boolean force) return; } - 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) + if (majormods && !force) { free(savebuffer); save_p = savebuffer = NULL; @@ -3965,7 +3962,7 @@ void G_SaveGameData(boolean force) WRITEUINT32(save_p, totalplaytime); WRITEUINT32(save_p, matchesplayed); - btemp = (UINT8)(savemoddata || modifiedgame); + btemp = (UINT8)(savemoddata); // what used to be here was profoundly dunderheaded WRITEUINT8(save_p, btemp); // TODO put another cipher on these things? meh, I don't care... @@ -4051,9 +4048,6 @@ 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 @@ -5925,6 +5919,19 @@ void G_DoPlayDemo(char *defdemoname) return; } + // ...*map* not loaded? + if (!gamemap || (gamemap > NUMMAPS) || !mapheaderinfo[gamemap-1] || !(mapheaderinfo[gamemap-1]->menuflags & LF2_EXISTSHACK)) + { + snprintf(msg, 1024, M_GetText("%s features a course that is not currently loaded.\n"), pdemoname); + CONS_Alert(CONS_ERROR, "%s", msg); + M_StartMessage(msg, NULL, MM_NOTHING); + Z_Free(pdemoname); + Z_Free(demobuffer); + demoplayback = false; + titledemo = false; + return; + } + Z_Free(pdemoname); memset(&oldcmd,0,sizeof(oldcmd)); diff --git a/src/m_menu.c b/src/m_menu.c index 2ea7234c2..9e51cb50e 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4543,7 +4543,10 @@ static boolean M_AddonsRefresh(void) if ((refreshdirmenu & REFRESHDIR_NORMAL) && !preparefilemenu(true)) { UNEXIST; - CLEARNAME; + if (refreshdirname) + { + CLEARNAME; + } return true; } @@ -4723,7 +4726,7 @@ static void M_DrawAddons(void) V_DrawSmallScaledPatch(x, y + 4, (menusearch[0] ? 0 : V_TRANSLUCENT), addonsp[NUM_EXT+3]); x = BASEVIDWIDTH - x - 16; - V_DrawSmallScaledPatch(x, y + 4, ((!modifiedgame || savemoddata) ? 0 : V_TRANSLUCENT), addonsp[NUM_EXT+4]); + V_DrawSmallScaledPatch(x, y + 4, ((!majormods) ? 0 : V_TRANSLUCENT), addonsp[NUM_EXT+4]); if (modifiedgame) V_DrawSmallScaledPatch(x, y + 4, 0, addonsp[NUM_EXT+2]); From 56f67c9db5e579ef3d2eed0df9b0ee716365d150 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 28 Jan 2019 17:28:15 +0000 Subject: [PATCH 30/49] You will never have Lua consoleplayer. (This is a quick, cheap hack to make splitscreen not almost impossible to support in major mods like Wipezones.) --- src/lua_hudlib.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/lua_hudlib.c b/src/lua_hudlib.c index ca952a009..cd8e03923 100644 --- a/src/lua_hudlib.c +++ b/src/lua_hudlib.c @@ -34,6 +34,8 @@ static UINT8 hud_enabled[(hud_MAX/8)+1]; static UINT8 hudAvailable; // hud hooks field +static UINT8 camnum = 1; + // must match enum hud in lua_hud.h static const char *const hud_disable_options[] = { "stagetitle", @@ -134,7 +136,8 @@ enum cameraf { camera_height, camera_momx, camera_momy, - camera_momz + camera_momz, + camera_pnum }; @@ -153,6 +156,7 @@ static const char *const camera_opt[] = { "momx", "momy", "momz", + "pnum", NULL}; static int lib_getHudInfo(lua_State *L) @@ -308,6 +312,9 @@ static int camera_get(lua_State *L) case camera_momz: lua_pushinteger(L, cam->momz); break; + case camera_pnum: + lua_pushinteger(L, camnum); + break; } return 1; } @@ -772,13 +779,25 @@ void LUAh_GameHUD(player_t *stplayr) LUA_PushUserdata(gL, stplayr, META_PLAYER); if (splitscreen > 2 && stplayr == &players[fourthdisplayplayer]) + { LUA_PushUserdata(gL, &camera4, META_CAMERA); + camnum = 4; + } else if (splitscreen > 1 && stplayr == &players[thirddisplayplayer]) + { LUA_PushUserdata(gL, &camera3, META_CAMERA); + camnum = 3; + } else if (splitscreen && stplayr == &players[secondarydisplayplayer]) + { LUA_PushUserdata(gL, &camera2, META_CAMERA); + camnum = 2; + } else + { LUA_PushUserdata(gL, &camera, META_CAMERA); + camnum = 1; + } lua_pushnil(gL); while (lua_next(gL, -5) != 0) { From bbde1752246e4a8d74a2c46cb59576c3f84b33d4 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Mon, 28 Jan 2019 12:47:23 -0500 Subject: [PATCH 31/49] Reduce frequency of Eggman items, give some of those points to Orbinaut or Banana --- src/k_kart.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index bc5e53caa..619f2b1ed 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -499,9 +499,9 @@ static INT32 K_KartItemOddsRace[NUMKARTRESULTS][10] = /*Sneaker*/ {20, 0, 0, 4, 6, 6, 0, 0, 0, 0 }, // Sneaker /*Rocket Sneaker*/ { 0, 0, 0, 0, 0, 1, 3, 5, 3, 0 }, // Rocket Sneaker /*Invincibility*/ { 0, 0, 0, 0, 0, 1, 4, 6,14, 0 }, // Invincibility - /*Banana*/ { 0, 9, 4, 2, 1, 0, 0, 0, 0, 0 }, // Banana - /*Eggman Monitor*/ { 0, 4, 3, 2, 0, 0, 0, 0, 0, 0 }, // Eggman Monitor - /*Orbinaut*/ { 0, 6, 5, 3, 2, 0, 0, 0, 0, 0 }, // Orbinaut + /*Banana*/ { 0,10, 4, 2, 1, 0, 0, 0, 0, 0 }, // Banana + /*Eggman Monitor*/ { 0, 3, 2, 1, 0, 0, 0, 0, 0, 0 }, // Eggman Monitor + /*Orbinaut*/ { 0, 8, 6, 4, 2, 0, 0, 0, 0, 0 }, // Orbinaut /*Jawz*/ { 0, 0, 3, 2, 1, 1, 0, 0, 0, 0 }, // Jawz /*Mine*/ { 0, 0, 2, 2, 1, 0, 0, 0, 0, 0 }, // Mine /*Ballhog*/ { 0, 0, 0, 2, 1, 0, 0, 0, 0, 0 }, // Ballhog From 19287212184471da3622415756b5cfb07c601a67 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Mon, 28 Jan 2019 14:12:08 -0500 Subject: [PATCH 32/49] Better cpusleep - Default to 1, which means potential for a 1-frame loss every once in a while but no longer a complete cpu hog - New minimum is 0, since -1 just did the exact same thing as 0. --- src/d_netcmd.c | 4 ++-- src/sdl/i_system.c | 2 +- src/sdl12/i_system.c | 2 +- src/win32/win_sys.c | 2 +- src/win32ce/win_sys.c | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 41f88ab95..775f2225e 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -214,7 +214,7 @@ static CV_PossibleValue_t autobalance_cons_t[] = {{0, "MIN"}, {4, "MAX"}, {0, NU static CV_PossibleValue_t teamscramble_cons_t[] = {{0, "Off"}, {1, "Random"}, {2, "Points"}, {0, NULL}}; static CV_PossibleValue_t startingliveslimit_cons_t[] = {{1, "MIN"}, {99, "MAX"}, {0, NULL}}; -static CV_PossibleValue_t sleeping_cons_t[] = {{-1, "MIN"}, {1000/TICRATE, "MAX"}, {0, NULL}}; +static CV_PossibleValue_t sleeping_cons_t[] = {{0, "MIN"}, {1000/TICRATE, "MAX"}, {0, NULL}}; static CV_PossibleValue_t competitionboxes_cons_t[] = {{0, "Normal"}, {1, "Random"}, {2, "Teleports"}, {3, "None"}, {0, NULL}}; @@ -447,7 +447,7 @@ consvar_t cv_runscripts = {"runscripts", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL consvar_t cv_pause = {"pausepermission", "Server", CV_NETVAR, pause_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_mute = {"mute", "Off", CV_NETVAR|CV_CALL, CV_OnOff, Mute_OnChange, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_sleep = {"cpusleep", "-1", CV_SAVE, sleeping_cons_t, NULL, -1, NULL, NULL, 0, 0, NULL}; +consvar_t cv_sleep = {"cpusleep", "1", CV_SAVE, sleeping_cons_t, NULL, -1, NULL, NULL, 0, 0, NULL}; INT16 gametype = GT_RACE; // SRB2kart boolean forceresetplayers = false; diff --git a/src/sdl/i_system.c b/src/sdl/i_system.c index 2154a070b..f360072a0 100644 --- a/src/sdl/i_system.c +++ b/src/sdl/i_system.c @@ -3018,7 +3018,7 @@ void I_StartupTimer(void) void I_Sleep(void) { - if (cv_sleep.value != -1) + if (cv_sleep.value > 0) SDL_Delay(cv_sleep.value); } diff --git a/src/sdl12/i_system.c b/src/sdl12/i_system.c index 0e5adbb40..d055a4ca5 100644 --- a/src/sdl12/i_system.c +++ b/src/sdl12/i_system.c @@ -2914,7 +2914,7 @@ void I_StartupTimer(void) void I_Sleep(void) { #if !(defined (_arch_dreamcast) || defined (_XBOX)) - if (cv_sleep.value != -1) + if (cv_sleep.value > 0) SDL_Delay(cv_sleep.value); #endif } diff --git a/src/win32/win_sys.c b/src/win32/win_sys.c index 75aca68df..fa9d6d644 100644 --- a/src/win32/win_sys.c +++ b/src/win32/win_sys.c @@ -261,7 +261,7 @@ tic_t I_GetTime(void) void I_Sleep(void) { - if (cv_sleep.value != -1) + if (cv_sleep.value > 0) Sleep(cv_sleep.value); } diff --git a/src/win32ce/win_sys.c b/src/win32ce/win_sys.c index 3b6a47258..091171b52 100644 --- a/src/win32ce/win_sys.c +++ b/src/win32ce/win_sys.c @@ -265,7 +265,7 @@ tic_t I_GetTime(void) void I_Sleep(void) { - if (cv_sleep.value != -1) + if (cv_sleep.value > 0) Sleep(cv_sleep.value); } From 366d320cc33768ee670a092e274b59383ac935b9 Mon Sep 17 00:00:00 2001 From: Steel Titanium Date: Tue, 29 Jan 2019 13:27:43 -0500 Subject: [PATCH 33/49] Remove CV_HIDEN flag for serversort --- src/m_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/m_menu.c b/src/m_menu.c index f0831a172..f337f1b49 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -443,7 +443,7 @@ static CV_PossibleValue_t serversort_cons_t[] = { {5,"Gametype"}, {0,NULL} }; -consvar_t cv_serversort = {"serversort", "Ping", CV_HIDEN | CV_CALL, serversort_cons_t, M_SortServerList, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_serversort = {"serversort", "Ping", CV_CALL, serversort_cons_t, M_SortServerList, 0, NULL, NULL, 0, 0, NULL}; // autorecord demos for time attack static consvar_t cv_autorecord = {"autorecord", "Yes", 0, CV_YesNo, NULL, 0, NULL, NULL, 0, 0, NULL}; From e2117f29e214d8a52724d1e87d52147db88c735b Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 30 Jan 2019 01:21:20 -0500 Subject: [PATCH 34/49] Thin the rest of this screen's stuff too --- src/k_kart.c | 24 ++++++++++++++++++------ src/y_inter.c | 30 ++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 0410a931c..dde4849ed 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7145,12 +7145,24 @@ void HU_DrawTabRankings(INT32 x, INT32 y, playersort_t *tab, INT32 scorelines, I if (G_RaceGametype()) { #define timestring(time) va("%i'%02i\"%02i", G_TicsToMinutes(time, true), G_TicsToSeconds(time), G_TicsToCentiseconds(time)) - if (players[tab[i].num].exiting) - V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(players[tab[i].num].realtime)); - else if (players[tab[i].num].pflags & PF_TIMEOVER) - V_DrawRightAlignedThinString(x+rightoffset, y-1, 0, "NO CONTEST."); - else if (circuitmap) - V_DrawRightAlignedString(x+rightoffset, y, 0, va("Lap %d", tab[i].count)); + if (scorelines > 8) + { + if (players[tab[i].num].exiting) + V_DrawRightAlignedThinString(x+rightoffset, y-1, hilicol|V_6WIDTHSPACE, timestring(players[tab[i].num].realtime)); + else if (players[tab[i].num].pflags & PF_TIMEOVER) + V_DrawRightAlignedThinString(x+rightoffset, y-1, V_6WIDTHSPACE, "NO CONTEST."); + else if (circuitmap) + V_DrawRightAlignedThinString(x+rightoffset, y-1, V_6WIDTHSPACE, va("Lap %d", tab[i].count)); + } + else + { + if (players[tab[i].num].exiting) + V_DrawRightAlignedString(x+rightoffset, y, hilicol, timestring(players[tab[i].num].realtime)); + else if (players[tab[i].num].pflags & PF_TIMEOVER) + V_DrawRightAlignedThinString(x+rightoffset, y-1, 0, "NO CONTEST."); + else if (circuitmap) + V_DrawRightAlignedString(x+rightoffset, y, 0, va("Lap %d", tab[i].count)); + } #undef timestring } else diff --git a/src/y_inter.c b/src/y_inter.c index a8b1f740b..31960a08c 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -432,7 +432,7 @@ void Y_IntermissionDrawer(void) if (data.match.encore) V_DrawCenteredString(-4 + x + BASEVIDWIDTH/2, 12-8, hilicol, "ENCORE MODE"); - if (!gutter) + if (data.match.numplayers > NUMFORNEWCOLUMN) { V_DrawFill(x+156, 24, 1, 158, 0); V_DrawFill((x-3) - duptweak, 182, dupadjust-2, 1, 0); @@ -476,8 +476,8 @@ void Y_IntermissionDrawer(void) STRBUFCPY(strtime, data.match.name[i]); - if (!gutter) - V_DrawThinString(x+36, y, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); + if (data.match.numplayers > NUMFORNEWCOLUMN) + V_DrawThinString(x+36, y-1, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE|V_6WIDTHSPACE, strtime); else V_DrawString(x+36, y, ((data.match.num[i] == whiteplayer) ? hilicol : 0)|V_ALLOWLOWERCASE, strtime); @@ -490,17 +490,23 @@ void Y_IntermissionDrawer(void) else snprintf(strtime, sizeof strtime, "(+ %d)", data.match.increase[data.match.num[i]]); - V_DrawRightAlignedString(x+120+gutter, y, 0, strtime); + if (data.match.numplayers > NUMFORNEWCOLUMN) + V_DrawRightAlignedThinString(x+135+gutter, y-1, V_6WIDTHSPACE, strtime); + else + V_DrawRightAlignedString(x+120+gutter, y, 0, strtime); } snprintf(strtime, sizeof strtime, "%d", data.match.val[i]); - V_DrawRightAlignedString(x+152+gutter, y, 0, strtime); + if (data.match.numplayers > NUMFORNEWCOLUMN) + V_DrawRightAlignedThinString(x+152+gutter, y-1, V_6WIDTHSPACE, strtime); + else + V_DrawRightAlignedString(x+152+gutter, y, 0, strtime); } else { if (data.match.val[i] == (UINT32_MAX-1)) - V_DrawRightAlignedThinString(x+152+gutter, y-1, 0, "NO CONTEST."); + V_DrawRightAlignedThinString(x+152+gutter, y-1, (data.match.numplayers > NUMFORNEWCOLUMN ? V_6WIDTHSPACE : 0), "NO CONTEST."); else { if (intertype == int_race) @@ -509,10 +515,18 @@ void Y_IntermissionDrawer(void) G_TicsToSeconds(data.match.val[i]), G_TicsToCentiseconds(data.match.val[i])); strtime[sizeof strtime - 1] = '\0'; - V_DrawRightAlignedString(x+152+gutter, y, 0, strtime); + if (data.match.numplayers > NUMFORNEWCOLUMN) + V_DrawRightAlignedThinString(x+152+gutter, y-1, V_6WIDTHSPACE, strtime); + else + V_DrawRightAlignedString(x+152+gutter, y, 0, strtime); } else - V_DrawRightAlignedString(x+152+gutter, y, 0, va("%i", data.match.val[i])); + { + if (data.match.numplayers > NUMFORNEWCOLUMN) + V_DrawRightAlignedThinString(x+152+gutter, y-1, V_6WIDTHSPACE, va("%i", data.match.val[i])); + else + V_DrawRightAlignedString(x+152+gutter, y, 0, va("%i", data.match.val[i])); + } } } From 9870378c376b70284627545d96287c40f6ff2715 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 30 Jan 2019 14:14:24 -0500 Subject: [PATCH 35/49] Slower orbit, always have 1 orbit item deploy behind you, and higher gravity for Orbinaut/Jawz --- src/info.c | 4 ++-- src/k_kart.c | 6 +++--- src/p_mobj.c | 9 ++++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/info.c b/src/info.c index ea9eac9d5..ccdfa3cf9 100644 --- a/src/info.c +++ b/src/info.c @@ -15449,7 +15449,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_ORBINAUT_SHIELDDEAD, // deathstate S_NULL, // xdeathstate sfx_None, // deathsound - 10*FRACUNIT, // speed + 4*FRACUNIT, // speed 16*FRACUNIT, // radius 32*FRACUNIT, // height 0, // display offset @@ -15530,7 +15530,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_JAWZ_DEAD1, // deathstate S_JAWZ_DEAD2, // xdeathstate sfx_None, // deathsound - 10*FRACUNIT, // speed + 4*FRACUNIT, // speed 16*FRACUNIT, // radius 32*FRACUNIT, // height 0, // display offset diff --git a/src/k_kart.c b/src/k_kart.c index dbc9b7405..9d3a12c51 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3646,7 +3646,7 @@ static void K_MoveHeldObjects(player_t *player) cur->angle += FixedAngle(cur->info->speed); if (cur->extravalue1 < radius) - cur->extravalue1 += FixedMul(P_AproxDistance(cur->extravalue1, radius), FRACUNIT/12); + cur->extravalue1 += P_AproxDistance(cur->extravalue1, radius) / 12; if (cur->extravalue1 > radius) cur->extravalue1 = radius; @@ -5109,7 +5109,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) for (moloop = 0; moloop < player->kartstuff[k_itemamount]; moloop++) { - newangle = FixedAngle(((360/player->kartstuff[k_itemamount])*moloop)*FRACUNIT) + ANGLE_90; + newangle = (player->mo->angle + ANGLE_157h) + FixedAngle(((360 / player->kartstuff[k_itemamount]) * moloop) << FRACBITS) + ANGLE_90; mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_ORBINAUT_SHIELD); if (!mo) { @@ -5150,7 +5150,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) for (moloop = 0; moloop < player->kartstuff[k_itemamount]; moloop++) { - newangle = FixedAngle(((360/player->kartstuff[k_itemamount])*moloop)*FRACUNIT) + ANGLE_90; + newangle = (player->mo->angle + ANGLE_157h) + FixedAngle(((360 / player->kartstuff[k_itemamount]) * moloop) << FRACBITS) + ANGLE_90; mo = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_JAWZ_SHIELD); if (!mo) { diff --git a/src/p_mobj.c b/src/p_mobj.c index d380b97a3..ed53f6471 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1354,7 +1354,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo) if (wasflip == !(mo->eflags & MFE_VERTICALFLIP)) // note!! == ! is not equivalent to != here - turns numeric into bool this way P_PlayerFlip(mo); if (mo->player->kartstuff[k_pogospring]) - gravityadd = FixedMul(gravityadd, 5*FRACUNIT/2); + gravityadd = (5*gravityadd)/2; } else { @@ -1404,11 +1404,14 @@ fixed_t P_GetMobjGravity(mobj_t *mo) break; case MT_BANANA: case MT_EGGMANITEM: + case MT_ORBINAUT: + case MT_JAWZ: + case MT_JAWZ_DUD: case MT_SSMINE: - gravityadd = FixedMul(gravityadd, 5*FRACUNIT/2); + gravityadd = (5*gravityadd)/2; break; case MT_SINK: - gravityadd = FixedMul(gravityadd, 5*FRACUNIT); // Double gravity + gravityadd = (5*gravityadd); // Double gravity break; case MT_SIGN: gravityadd /= 8; From 29cb923c36892d6a775785b8ffbcf221f16363f7 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 30 Jan 2019 14:24:04 -0500 Subject: [PATCH 36/49] Speed updates based on number of orbiting items --- src/k_kart.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9d3a12c51..a9e1f9bed 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3626,6 +3626,7 @@ static void K_MoveHeldObjects(player_t *player) case MT_JAWZ_SHIELD: { mobj_t *cur = player->mo->hnext; + fixed_t speed = ((8 - min(4, player->kartstuff[k_itemamount])) * cur->info->speed) / 7; player->kartstuff[k_bananadrag] = 0; // Just to make sure @@ -3643,7 +3644,7 @@ static void K_MoveHeldObjects(player_t *player) cur->color = player->skincolor; cur->angle -= ANGLE_90; - cur->angle += FixedAngle(cur->info->speed); + cur->angle += FixedAngle(speed); if (cur->extravalue1 < radius) cur->extravalue1 += P_AproxDistance(cur->extravalue1, radius) / 12; From dded2e76564129ec2f6b1ffcf77e3546d92c5f49 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 30 Jan 2019 14:42:24 -0500 Subject: [PATCH 37/49] Play hit confirm sound for shields --- src/p_map.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 051a1e6f4..41e5a455d 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -752,9 +752,7 @@ static boolean PIT_CheckThing(mobj_t *thing) // Player Damage P_DamageMobj(thing, tmthing, tmthing->target, 1); K_KartBouncing(thing, tmthing, false, false); - - if (tmthing->type == MT_ORBINAUT || tmthing->type == MT_JAWZ || tmthing->type == MT_JAWZ_DUD) - S_StartSound(thing, sfx_s3k7b); + S_StartSound(thing, sfx_s3k7b); // This Item Damage if (tmthing->eflags & MFE_VERTICALFLIP) @@ -1035,9 +1033,7 @@ static boolean PIT_CheckThing(mobj_t *thing) // Player Damage P_DamageMobj(tmthing, thing, thing->target, 1); K_KartBouncing(tmthing, thing, false, false); - - if (thing->type == MT_ORBINAUT || thing->type == MT_JAWZ || thing->type == MT_JAWZ_DUD) - S_StartSound(tmthing, sfx_s3k7b); + S_StartSound(tmthing, sfx_s3k7b); // Other Item Damage if (thing->eflags & MFE_VERTICALFLIP) From 33ac6947299c6ec72bcbe6cda8e3c0da086a992c Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 30 Jan 2019 15:02:24 -0500 Subject: [PATCH 38/49] Don't bump while flashing --- src/k_kart.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index a9e1f9bed..d09e3b605 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1068,6 +1068,21 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) || (mobj2->player && mobj2->player->kartstuff[k_respawn])) return; + // Don't bump if you're flashing + if (mobj1->player && mobj1->player->powers[pw_flashing] > 0 + && mobj1->player->powers[pw_flashing] < K_GetKartFlashing(mobj1->player)-1) + { + mobj1->player->powers[pw_flashing]++; + return; + } + + if (mobj2->player && mobj2->player->powers[pw_flashing] > 0 + && mobj2->player->powers[pw_flashing] < K_GetKartFlashing(mobj2->player)-1) + { + mobj2->player->powers[pw_flashing]++; + return; + } + // Don't bump if you've recently bumped if (mobj1->player && mobj1->player->kartstuff[k_justbumped]) { From 50b23b751293312b22a222fad2608e458cb7fa91 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 30 Jan 2019 15:39:29 -0500 Subject: [PATCH 39/49] Add delay to Jawz target switching, set Jawz target when fired --- src/d_player.h | 3 ++- src/dehacked.c | 3 ++- src/k_kart.c | 28 +++++++++++++++++++++++++--- src/p_enemy.c | 4 ++-- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 27fdef8dc..5ce9066b2 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -348,10 +348,11 @@ typedef enum k_wanted, // Timer for determining WANTED status, lowers when hitting people, prevents the game turning into Camp Lazlo k_yougotem, // "You Got Em" gfx when hitting someone as a karma player via a method that gets you back in the game instantly - // v1.0.2 vars + // v1.0.2+ vars k_itemblink, // Item flashing after roulette, prevents Hyudoro stealing AND serves as a mashing indicator k_itemblinkmode, // Type of flashing: 0 = white (normal), 1 = red (mashing), 2 = rainbow (enhanced items) k_getsparks, // Disable drift sparks at low speed, JUST enough to give acceleration the actual headstart above speed + k_jawztargetdelay, // Delay for Jawz target switching, to make it less twitchy NUMKARTSTUFF } kartstufftype_t; diff --git a/src/dehacked.c b/src/dehacked.c index 0ad67ff0b..b03530a45 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -8333,7 +8333,8 @@ static const char *const KARTSTUFF_LIST[] = { "ITEMBLINK", "ITEMBLINKMODE", - "GETSPARKS" + "GETSPARKS", + "JAWZTARGETDELAY" }; static const char *const HUDITEMS_LIST[] = { diff --git a/src/k_kart.c b/src/k_kart.c index d09e3b605..f2490c9b3 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -2517,7 +2517,17 @@ static mobj_t *K_SpawnKartMissile(mobj_t *source, mobjtype_t type, angle_t an, I break; case MT_JAWZ: if (source && source->player) + { + INT32 lasttarg = source->player->kartstuff[k_lastjawztarget]; th->cvmem = source->player->skincolor; + if ((lasttarg >= 0 && lasttarg < MAXPLAYERS) + && playeringame[lasttarg] + && !players[lasttarg].spectator + && players[lasttarg].mo) + { + P_SetTarget(&th->tracer, players[lasttarg].mo); + } + } else th->cvmem = SKINCOLOR_KETCHUP; /* FALLTHRU */ @@ -4454,12 +4464,22 @@ void K_KartPlayerAfterThink(player_t *player) // Jawz reticule (seeking) if (player->kartstuff[k_itemtype] == KITEM_JAWZ && player->kartstuff[k_itemheld]) { - player_t *targ = K_FindJawzTarget(player->mo, player); + INT32 lasttarg = player->kartstuff[k_lastjawztarget]; + player_t *targ; mobj_t *ret; - if (!targ) + if (player->kartstuff[k_jawztargetdelay] && playeringame[lasttarg] && !players[lasttarg].spectator) + { + targ = &players[lasttarg]; + player->kartstuff[k_jawztargetdelay]--; + } + else + targ = K_FindJawzTarget(player->mo, player); + + if (!targ || !targ->mo || P_MobjWasRemoved(targ->mo)) { player->kartstuff[k_lastjawztarget] = -1; + player->kartstuff[k_jawztargetdelay] = 0; return; } @@ -4469,7 +4489,7 @@ void K_KartPlayerAfterThink(player_t *player) ret->tics = 1; ret->color = player->skincolor; - if (targ-players != player->kartstuff[k_lastjawztarget]) + if (targ-players != lasttarg) { if (P_IsLocalPlayer(player) || P_IsLocalPlayer(targ)) S_StartSound(NULL, sfx_s3k89); @@ -4477,11 +4497,13 @@ void K_KartPlayerAfterThink(player_t *player) S_StartSound(targ->mo, sfx_s3k89); player->kartstuff[k_lastjawztarget] = targ-players; + player->kartstuff[k_jawztargetdelay] = 5; } } else { player->kartstuff[k_lastjawztarget] = -1; + player->kartstuff[k_jawztargetdelay] = 0; } } diff --git a/src/p_enemy.c b/src/p_enemy.c index 8a6d7597f..9d3aa9519 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -8264,8 +8264,8 @@ void A_JawzChase(mobj_t *actor) if (actor->tracer) { - if (G_RaceGametype()) // Stop looking after first target in race - actor->extravalue1 = 1; + /*if (G_RaceGametype()) // Stop looking after first target in race + actor->extravalue1 = 1;*/ if (actor->tracer->health) { From 7ff02458824a71385cb57e6a4aee8cf72cca4b1d Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 30 Jan 2019 15:41:15 -0500 Subject: [PATCH 40/49] Increase target cone for Race --- 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 f2490c9b3..426ce2f63 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3932,7 +3932,7 @@ player_t *K_FindJawzTarget(mobj_t *actor, player_t *source) if (thisang > ANGLE_180) thisang = InvAngle(thisang); - if (thisang > ANGLE_45) // Don't go for people who are behind you + if (thisang > (G_RaceGametype() ? ANGLE_67h : ANGLE_45)) // Don't go for people who are behind you continue; // Jawz only go after the person directly ahead of you in race... sort of literally now! From f7516f0f0078219d0973b5fd82ed41c62d6b1410 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 30 Jan 2019 15:43:45 -0500 Subject: [PATCH 41/49] Reorganize these checks --- src/k_kart.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 426ce2f63..9a8adb22f 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3932,13 +3932,14 @@ player_t *K_FindJawzTarget(mobj_t *actor, player_t *source) if (thisang > ANGLE_180) thisang = InvAngle(thisang); - if (thisang > (G_RaceGametype() ? ANGLE_67h : ANGLE_45)) // Don't go for people who are behind you - continue; - // Jawz only go after the person directly ahead of you in race... sort of literally now! if (G_RaceGametype()) { - if (player->kartstuff[k_position] >= source->kartstuff[k_position]) // Don't pay attention to people behind you + // Don't go for people who are behind you + if (thisang > ANGLE_67h) + continue; + // Don't pay attention to people who aren't above your position + if (player->kartstuff[k_position] >= source->kartstuff[k_position]) continue; if ((best == -1) || (player->kartstuff[k_position] > best)) { @@ -3951,6 +3952,11 @@ player_t *K_FindJawzTarget(mobj_t *actor, player_t *source) fixed_t thisdist; fixed_t thisavg; + // Don't go for people who are behind you + if (thisang > ANGLE_45) + continue; + + // Don't pay attention to dead players if (player->kartstuff[k_bumper] <= 0) continue; From 8409a0f42cf575757b98bfbcce26110acdc6c43b Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Wed, 30 Jan 2019 15:57:46 -0500 Subject: [PATCH 42/49] Shift around flashing bump stuff --- src/k_kart.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 9a8adb22f..850b703a9 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1068,19 +1068,24 @@ void K_KartBouncing(mobj_t *mobj1, mobj_t *mobj2, boolean bounce, boolean solid) || (mobj2->player && mobj2->player->kartstuff[k_respawn])) return; - // Don't bump if you're flashing - if (mobj1->player && mobj1->player->powers[pw_flashing] > 0 - && mobj1->player->powers[pw_flashing] < K_GetKartFlashing(mobj1->player)-1) - { - mobj1->player->powers[pw_flashing]++; - return; - } + { // Don't bump if you're flashing + INT32 flash; - if (mobj2->player && mobj2->player->powers[pw_flashing] > 0 - && mobj2->player->powers[pw_flashing] < K_GetKartFlashing(mobj2->player)-1) - { - mobj2->player->powers[pw_flashing]++; - return; + flash = K_GetKartFlashing(mobj1->player); + if (mobj1->player && mobj1->player->powers[pw_flashing] > 0 && mobj1->player->powers[pw_flashing] < flash) + { + if (mobj1->player->powers[pw_flashing] < flash-1) + mobj1->player->powers[pw_flashing]++; + return; + } + + flash = K_GetKartFlashing(mobj2->player); + if (mobj2->player && mobj2->player->powers[pw_flashing] > 0 && mobj2->player->powers[pw_flashing] < flash) + { + if (mobj2->player->powers[pw_flashing] < flash-1) + mobj2->player->powers[pw_flashing]++; + return; + } } // Don't bump if you've recently bumped From d2a286efd721d477e3234dbe180f8f908390cfe6 Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Thu, 31 Jan 2019 19:15:28 -0600 Subject: [PATCH 43/49] Potentially fix 64-bit builds crashing on certain replays --- src/g_game.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index d8022e089..dcd67b401 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -5141,15 +5141,13 @@ void G_GhostTicker(void) for (i = 0; i < count; i++) { g->p += 4; // reserved - type = READUINT32(g->p); + demo_p += 4; // backwards compat. health = READUINT16(g->p); x = READFIXED(g->p); y = READFIXED(g->p); z = READFIXED(g->p); angle = READANGLE(g->p); - if (!(mobjinfo[type].flags & MF_SHOOTABLE) - || !(mobjinfo[type].flags & (MF_ENEMY|MF_MONITOR)) - || health != 0 || i >= 4) // only spawn for the first 4 hits per frame, to prevent ghosts from splode-spamming too bad. + if (health != 0 || i >= 4) // only spawn for the first 4 hits per frame, to prevent ghosts from splode-spamming too bad. continue; poof = P_SpawnMobj(x, y, z, MT_GHOST); poof->angle = angle; From e5885aad6fb69a3a99bdf34573a368cd7061a5bf Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Thu, 31 Jan 2019 23:21:00 -0600 Subject: [PATCH 44/49] Fix replay weirdness Sryder's Pleasure Castle ghost tries to return to England with this line. --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index dcd67b401..58f8b0d93 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -5141,7 +5141,7 @@ void G_GhostTicker(void) for (i = 0; i < count; i++) { g->p += 4; // reserved - demo_p += 4; // backwards compat. + type = READUINT32(g->p); health = READUINT16(g->p); x = READFIXED(g->p); y = READFIXED(g->p); From 6cdc1f4f2459c8400952d815be05dd3c6046f01e Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Fri, 1 Feb 2019 15:42:29 -0600 Subject: [PATCH 45/49] Skip over type CORRECTLY, this time. --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 58f8b0d93..7cddad082 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -5141,7 +5141,7 @@ void G_GhostTicker(void) for (i = 0; i < count; i++) { g->p += 4; // reserved - type = READUINT32(g->p); + g->p += 4; // backwards compat., type used to be here health = READUINT16(g->p); x = READFIXED(g->p); y = READFIXED(g->p); From 7d05d41cf317b77d5abc15fd63071aa3e21e130e Mon Sep 17 00:00:00 2001 From: wolfy852 Date: Fri, 1 Feb 2019 15:45:53 -0600 Subject: [PATCH 46/49] Comment out type --- src/g_game.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_game.c b/src/g_game.c index 7cddad082..df7119c3c 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -5134,7 +5134,7 @@ void G_GhostTicker(void) if (ziptic & EZT_HIT) { // Spawn hit poofs for killing things! UINT16 i, count = READUINT16(g->p), health; - UINT32 type; + //UINT32 type; fixed_t x,y,z; angle_t angle; mobj_t *poof; From b7ea18bb4ecd06b68776e860f65e1218a86348d7 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 1 Feb 2019 18:51:15 -0500 Subject: [PATCH 47/49] Tweak incorrect capitalisation. --- src/m_menu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/m_menu.c b/src/m_menu.c index ee94ab3cd..923186875 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -4561,7 +4561,7 @@ static boolean M_AddonsRefresh(void) { S_StartSound(NULL, sfx_s26d); if (refreshdirmenu & REFRESHDIR_MAX) - message = va("%c%s\x80\nMaximum number of add-ons reached.\nA file could not be loaded.\nif you wish to play with this add-on, restart the game to clear existing ones.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); + message = va("%c%s\x80\nMaximum number of add-ons reached.\nA file could not be loaded.\nIf you wish to play with this add-on, restart the game to clear existing ones.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); else message = va("%c%s\x80\nA file was not loaded.\nCheck the console log for more information.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); } @@ -4573,7 +4573,7 @@ static boolean M_AddonsRefresh(void) else if (majormods && !prevmajormods) { S_StartSound(NULL, sfx_s221); - message = va("%c%s\x80\nGameplay has now been modified.\nif you wish to play record attack mode, restart the game to clear existing add-ons.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); + message = va("%c%s\x80\nGameplay has now been modified.\nIf you wish to play Record Attack mode, restart the game to clear existing add-ons.\n\n(Press a key)\n", ('\x80' + (highlightflags>>V_CHARCOLORSHIFT)), refreshdirname); prevmajormods = majormods; } From 838c2aa68d5c65274d19bba6fcf973182adacdc8 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 2 Feb 2019 00:58:51 -0500 Subject: [PATCH 48/49] Offroad spark fix & sink --- src/k_kart.c | 10 ++++------ src/p_mobj.c | 4 +--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 850b703a9..aa6a0cc35 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1637,10 +1637,8 @@ static void K_GetKartBoostPower(player_t *player) && player->kartstuff[k_offroad] >= 0) boostpower = FixedDiv(boostpower, player->kartstuff[k_offroad] + FRACUNIT); - if (player->kartstuff[k_itemtype] == KITEM_KITCHENSINK) - boostpower = max((TICRATE/2), (5*TICRATE)-(player->kartstuff[k_bananadrag]/2))*boostpower/(5*TICRATE); - else if (player->kartstuff[k_bananadrag] > TICRATE) - boostpower = 4*boostpower/5; + if (player->kartstuff[k_bananadrag] > TICRATE) + boostpower = (4*boostpower)/5; // Banana drag/offroad dust if (boostpower < FRACUNIT @@ -4716,9 +4714,9 @@ static void K_KartDrift(player_t *player, boolean onground) } // Disable drift-sparks until you're going fast enough - if (player->kartstuff[k_getsparks] == 0) + if (player->kartstuff[k_getsparks] == 0 || player->kartstuff[k_offroad]) driftadditive = 0; - if (player->speed > minspeed*2 && !player->kartstuff[k_offroad]) + if (player->speed > minspeed*2) player->kartstuff[k_getsparks] = 1; // This spawns the drift sparks diff --git a/src/p_mobj.c b/src/p_mobj.c index ed53f6471..746fc1afd 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1408,10 +1408,8 @@ fixed_t P_GetMobjGravity(mobj_t *mo) case MT_JAWZ: case MT_JAWZ_DUD: case MT_SSMINE: - gravityadd = (5*gravityadd)/2; - break; case MT_SINK: - gravityadd = (5*gravityadd); // Double gravity + gravityadd = (5*gravityadd)/2; break; case MT_SIGN: gravityadd /= 8; From 4679e48a3d46b5a6460affc2dec17f6bd5b6ee60 Mon Sep 17 00:00:00 2001 From: Sally Cochenour Date: Sat, 2 Feb 2019 01:43:32 -0500 Subject: [PATCH 49/49] Offroad code cleanup --- src/k_kart.c | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index aa6a0cc35..5a45d5ff4 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -1239,9 +1239,8 @@ static UINT8 K_CheckOffroadCollide(mobj_t *mo, sector_t *sec) for (i = 2; i < 5; i++) { if ((sec2 && GETSECSPECIAL(sec2->special, 1) == i) - || (P_IsObjectOnRealGround(mo, sec) - && GETSECSPECIAL(sec->special, 1) == i)) - return i; + || (P_IsObjectOnRealGround(mo, sec) && GETSECSPECIAL(sec->special, 1) == i)) + return i-1; } return 0; @@ -1258,19 +1257,9 @@ static void K_UpdateOffroad(player_t *player) fixed_t offroad; sector_t *nextsector = R_PointInSubsector( player->mo->x + player->mo->momx*2, player->mo->y + player->mo->momy*2)->sector; + UINT8 offroadstrength = K_CheckOffroadCollide(player->mo, nextsector); - fixed_t offroadstrength = 0; - - if (K_CheckOffroadCollide(player->mo, nextsector) == 2) // Weak Offroad - offroadstrength = 1; - else if (K_CheckOffroadCollide(player->mo, nextsector) == 3) // Mid Offroad - offroadstrength = 2; - else if (K_CheckOffroadCollide(player->mo, nextsector) == 4) // Strong Offroad - offroadstrength = 3; - - // If you are offroad, a timer starts. Depending on your weight value, the timer increments differently. - //if ((nextsector->special & 256) && nextsector->special != 768 - // && nextsector->special != 1024 && nextsector->special != 4864) + // If you are in offroad, a timer starts. if (offroadstrength) { if (K_CheckOffroadCollide(player->mo, player->mo->subsector->sector) && player->kartstuff[k_offroad] == 0) @@ -1278,7 +1267,7 @@ static void K_UpdateOffroad(player_t *player) if (player->kartstuff[k_offroad] > 0) { - offroad = (FRACUNIT * offroadstrength) / (TICRATE/2); + offroad = (offroadstrength << FRACBITS) / (TICRATE/2); //if (player->kartstuff[k_growshrinktimer] > 1) // grow slows down half as fast // offroad /= 2; @@ -1286,8 +1275,8 @@ static void K_UpdateOffroad(player_t *player) player->kartstuff[k_offroad] += offroad; } - if (player->kartstuff[k_offroad] > FRACUNIT*offroadstrength) - player->kartstuff[k_offroad] = FRACUNIT*offroadstrength; + if (player->kartstuff[k_offroad] > (offroadstrength << FRACBITS)) + player->kartstuff[k_offroad] = (offroadstrength << FRACBITS); } else player->kartstuff[k_offroad] = 0;