Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • KartKrew/RingRacers
  • bitten2up/RingRacers
  • X.organic/RingRacers
  • StarManiaKG/the-story-of-subsequent-tutorials-and-dance-dance-revolutions-remastered-rocking-the-4th
  • LoganAir/RingRacers
  • Hanicef/RingRacers
  • aa/RingRacers
  • JugadorXEI/RingRacers
  • Jisk/RingRacers
  • Callmore/RingRacers
  • Lugent/RingRacers
  • Chopp/ring-racers-cope
  • tertu/RingRacers
  • pastel/RingRacers
  • Snu/RingRacers
  • Zwip-Zwap_Zapony/RingRacers
  • haya_/RingRacers
  • Lactozilla/RingRacers
  • SMS_Alfredo/RingRacers
  • spectrumuk2/RingRacers
  • vanhouc/RingRacers
  • diskpoppy/RingRacers
  • kingofmemes2401g/ring-racers-kings-fork
  • LatiusAuro/RingRacers
  • Guil/RingRacers
  • Chearii/RingRacers
  • EeveeEuphoria/RingRacers
  • kimmy/RingRacers
  • spazzylemons/RingRacers
  • brosasaki/RingRacers
  • wehrlia/RingRacers
  • MightyMcTopher/RingRacers
  • FreakyMutantMan/RingRacers
  • troy236/RingRacers
  • Craftyawesome/RingRacers
  • NepDisk/RingRacers
  • alufolie91/RingRacers
  • bird/RingRacers
  • PencilVoid/RingRacers
  • Superstarxalien/RingRacers
  • WTF/RingRacers
  • Lach/RingRacers
  • frostu8/RingRacers
  • Benji_Menji/RingRacers
  • Dr_Nope/RingRacers
  • Nep2Disk/RingRacers
  • Lighto97/RingRacers
47 results
Show changes
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
//
// This program is free software distributed under the
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
//
......@@ -1917,9 +1917,9 @@ static const char *CON_LoadingStrings[LOADED_ALLDONE+1] =
"Init zone memory...", //LOADED_ZINIT
"Init game timing...", //LOADED_ISTARTUPTIMER
"Loading main assets...", //LOADED_IWAD
"Loading add-ons...", //LOADED_PWAD
"Init graphics subsystem...", //LOADED_ISTARTUPGRAPHICS
"Cache fonts...", //LOADED_HUINIT
"Loading add-ons...", //LOADED_PWAD
"Load settings...", //LOADED_CONFIG
"Cache textures...", //LOADED_INITTEXTUREDATA
"Cache sprites...", //LOADED_INITSPIRTES
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
//
......@@ -42,9 +42,9 @@ typedef enum
LOADED_ZINIT = 1,
LOADED_ISTARTUPTIMER,
LOADED_IWAD,
LOADED_PWAD,
LOADED_ISTARTUPGRAPHICS,
LOADED_HUINIT,
LOADED_PWAD,
LOADED_CONFIG,
LOADED_INITTEXTUREDATA,
LOADED_INITSPRITES,
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
// Copyright (C) 2024 by Kart Krew
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
// Copyright (C) 2025 by Kart Krew
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
// Copyright (C) 2024 by Kart Krew
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
// Copyright (C) 2025 by Kart Krew
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
// Copyright (C) 2024 by Kart Krew
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
// Copyright (C) 2025 by Kart Krew
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
......@@ -238,11 +238,12 @@ bool operator!=(const srb2::StaticVec<T, L1>& lhs, const srb2::StaticVec<T, L2>&
template <typename T, size_t Limit>
struct std::hash<srb2::StaticVec<T, Limit>>
{
uint64_t operator()(const srb2::StaticVec<T, Limit>& input) const
size_t operator()(const srb2::StaticVec<T, Limit>& input) const
{
constexpr const uint64_t prime {0x00000100000001B3};
std::size_t ret {0xcbf29ce484222325};
constexpr size_t prime = sizeof(size_t) == 8 ? 0x00000100000001B3 : 0x01000193;
constexpr size_t basis = sizeof(size_t) == 8 ? 0xcbf29ce484222325 : 0x811c9dc5;
size_t ret = basis;
for (auto itr = input.begin(); itr != input.end(); itr++)
{
ret = (ret * prime) ^ std::hash<T>(*itr);
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
// Copyright (C) 2024 by Kart Krew
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
// Copyright (C) 2025 by Kart Krew
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
// Copyright (C) 2024 by Kart Krew
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
// Copyright (C) 2025 by Kart Krew
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by James Robert Roman
// Copyright (C) 2024 by Kart Krew
// Copyright (C) 2025 by James Robert Roman
// Copyright (C) 2025 by Kart Krew
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
......@@ -301,7 +301,6 @@ consvar_t cv_addons_md5 = Player("addons_md5", "Name").values({{0, "Name"}, {1,
consvar_t cv_addons_search_case = Player("addons_search_case", "No").yes_no();
consvar_t cv_addons_search_type = Player("addons_search_type", "Anywhere").values({{0, "Start"}, {1, "Anywhere"}});
consvar_t cv_addons_showall = Player("addons_showall", "No").yes_no();
consvar_t cv_allowguests = Player("allowguests", "On").on_off();
consvar_t cv_alttitle = Player("alttitle", "Off").on_off();
consvar_t cv_alwaysgrabmouse = GraphicsDriver("alwaysgrabmouse", "Off").on_off();
......@@ -318,6 +317,7 @@ void Captioning_OnChange(void);
consvar_t cv_closedcaptioning = Player("closedcaptioning", "Off").on_off().onchange(Captioning_OnChange);
consvar_t cv_continuousmusic = Player("continuousmusic", "On").on_off();
consvar_t cv_streamersafemusic = Player("streamersafemusic", "Off").on_off();
consvar_t cv_controlperkey = Player("controlperkey", "One").values({{1, "One"}, {2, "Several"}});
// actual general (maximum) sound & music volume, saved into the config
......@@ -399,7 +399,6 @@ consvar_t cv_menuframeskip = Player("menuframeskip", "Off").values({
{144, "MAX"},
{0, "Off"},
});
consvar_t cv_mindelay = Player("mindelay", "2").min_max(0, 30);
consvar_t cv_movebob = Player("movebob", "1.0").floating_point().min_max(0, 4*FRACUNIT);
consvar_t cv_netstat = Player("netstat", "Off").on_off().dont_save(); // show bandwidth statistics
consvar_t cv_netticbuffer = Player("netticbuffer", "1").min_max(0, 3);
......@@ -408,6 +407,11 @@ consvar_t cv_netticbuffer = Player("netticbuffer", "1").min_max(0, 3);
void SetChannelsNum(void);
consvar_t cv_numChannels = Player("snd_channels", "64").values(CV_Unsigned).onchange(SetChannelsNum);
extern CV_PossibleValue_t soundmixingbuffersize_cons_t[];
consvar_t cv_soundmixingbuffersize = Player("snd_mixingbuffersize", "2048")
.values(soundmixingbuffersize_cons_t)
.onchange_noinit([]() { COM_ImmedExecute("restartaudio"); });
extern CV_PossibleValue_t perfstats_cons_t[];
consvar_t cv_perfstats = Player("perfstats", "Off").dont_save().values(perfstats_cons_t);
......@@ -546,12 +550,15 @@ consvar_t cv_pause = NetVar("pausepermission", "Server Admins").values({{0, "Ser
consvar_t cv_pingmeasurement = Server("pingmeasurement", "Frames").values({{0, "Frames"}, {1, "Milliseconds"}});
consvar_t cv_playbackspeed = Server("playbackspeed", "1").min_max(1, 10).dont_save();
static constexpr const char* kNetDemoRecordDefault =
#ifdef DEVELOP
consvar_t cv_recordmultiplayerdemos = Server("netdemo_record", "Auto Save").values({{2, "Auto Save"}});
"Auto Save";
#else
consvar_t cv_recordmultiplayerdemos = Server("netdemo_record", "Manual Save").values({{0, "Disabled"}, {1, "Manual Save"}, {2, "Auto Save"}});
"Manual Save";
#endif
consvar_t cv_recordmultiplayerdemos = Server("netdemo_record", kNetDemoRecordDefault).values({{0, "Disabled"}, {1, "Manual Save"}, {2, "Auto Save"}});
consvar_t cv_reducevfx = Server("reducevfx", "No").yes_no();
consvar_t cv_screenshake = Server("screenshake", "Full").values({{0, "Off"}, {1, "Half"}, {2, "Full"}});
......@@ -629,6 +636,9 @@ consvar_t cv_zvote_length = NetVar("zvote_length", "20").values(CV_Unsigned);
consvar_t cv_zvote_quorum = NetVar("zvote_quorum", "0.6").floating_point().min_max(0, FRACUNIT);
consvar_t cv_zvote_spectators = NetVar("zvote_spectator_votes", "Off").on_off();
consvar_t cv_allowguests = NetVar("allowguests", "On").on_off();
consvar_t cv_gamestochat = NetVar("gamestochat", "0").min_max(0, 99);
//
// Netvars that don't save...
......@@ -713,7 +723,7 @@ consvar_t cv_kartbot = UnsavedNetVar("bots", "Off").values({
consvar_t cv_kartbumpers = UnsavedNetVar("battlebumpers", "3").min_max(0, 12);
void KartEliminateLast_OnChange(void);
consvar_t cv_karteliminatelast = UnsavedNetVar("eliminatelast", "Yes").yes_no().onchange(KartEliminateLast_OnChange);
consvar_t cv_karteliminatelast = NetVar("eliminatelast", "Yes").yes_no().onchange(KartEliminateLast_OnChange);
void KartEncore_OnChange(void);
consvar_t cv_kartencore = UnsavedNetVar("encore", "Auto").values({{-1, "Auto"}, {0, "Off"}, {1, "On"}}).onchange_noinit(KartEncore_OnChange);
......@@ -783,8 +793,6 @@ consvar_t cv_votetime = UnsavedNetVar("votetime", "20").min_max(10, 3600);
// Cheats don't save...
//
consvar_t cv_4thgear = OnlineCheat("4thgear", "Off").values(CV_OnOff).flags(CV_NOSHOWHELP).description("Surpassing your limits!");
consvar_t cv_barriertime = OnlineCheat("barriertime", "30").values(CV_Natural).description("How long it takes for the Barrier to shrink in Battle Overtime");
consvar_t cv_battlespawn = OnlineCheat("battlespawn", "0").values(CV_Unsigned).description("Spawn every player at the same spawnpoint in Battle (0 = random spawns)");
consvar_t cv_battletest = OnlineCheat("battletest", "Off").on_off().description("Free Play goes to Battle instead of Prisons");
......@@ -851,7 +859,7 @@ consvar_t cv_ufo_health = OnlineCheat("ufo_health", "-1").min_max(-1, 100).descr
consvar_t cv_botscanvote = ServerCheat("botscanvote", "No").yes_no();
void Gravity_OnChange(void);
consvar_t cv_gravity = ServerCheat("gravity", "0.8").floating_point().onchange(Gravity_OnChange).description("Change the default gravity"); // change DEFAULT_GRAVITY if you change this
consvar_t cv_gravity = ServerCheat("gravity", "0.8").floating_point().min_max(0, 200*FRACUNIT).onchange(Gravity_OnChange).description("Change the default gravity"); // change DEFAULT_GRAVITY if you change this
consvar_t cv_kartdebugcolorize = ServerCheat("debugcolorize", "Off").on_off().description("Show all colorized options on the HUD");
consvar_t cv_kartdebugdirector = ServerCheat("debugdirector", "Off").on_off().description("Show director AI on the HUD");
......@@ -917,6 +925,8 @@ consvar_t cv_renderhitbox = PlayerCheat("renderhitbox", "Off").values(renderhitb
consvar_t cv_bighead = Player("bighead", "Off").dont_save().values(CV_OnOff).flags(CV_NOSHOWHELP).description("Works out at the library");
consvar_t cv_shittysigns = Player("shittysigns", "Off").dont_save().values(CV_OnOff).flags(CV_NOSHOWHELP).description("It's better because it's worse");
consvar_t cv_tastelesstaunts = Player("tastelesstaunts", "Off").dont_save().values(CV_OnOff).flags(CV_NOSHOWHELP).description("Universally hated in dev");
consvar_t cv_4thgear = UnsavedNetVar("4thgear", "Off").values(CV_OnOff).flags(CV_NOSHOWHELP).description("Surpassing your limits!");
consvar_t cv_levelskull = UnsavedNetVar("levelskull", "Off").values(CV_OnOff).flags(CV_NOSHOWHELP).description("What Storm Rig looked like 2 months before 2.0");
//
// Dummy variables used solely in the menu system.
......@@ -934,7 +944,7 @@ consvar_t cv_dummyextraspassword = MenuDummy("dummyextraspassword", "");
extern CV_PossibleValue_t gpdifficulty_cons_t[];
void Dummygpdifficulty_OnChange(void);
consvar_t cv_dummygpdifficulty = MenuDummy("dummygpdifficulty", "Normal").values(gpdifficulty_cons_t).onchange(Dummygpdifficulty_OnChange);
consvar_t cv_dummygpdifficulty = MenuDummy("dummygpdifficulty", "Intense").values(gpdifficulty_cons_t).onchange(Dummygpdifficulty_OnChange);
consvar_t cv_dummygpencore = MenuDummy("dummygpencore", "Off").on_off();
consvar_t cv_dummyip = MenuDummy("dummyip", "");
......@@ -964,8 +974,9 @@ void Dummymenuplayer_OnChange(void);
consvar_t cv_dummymenuplayer = MenuDummy("dummymenuplayer", "P1").onchange(Dummymenuplayer_OnChange).values({{0, "NOPE"}, {1, "P1"}, {2, "P2"}, {3, "P3"}, {4, "P4"}});
consvar_t cv_dummyprofileautoroulette = MenuDummy("dummyprofileautoroulette", "Off").on_off();
consvar_t cv_dummyprofilefov = MenuDummy("dummyprofilefov", "90").min_max(70, 110);
consvar_t cv_dummyprofilefov = MenuDummy("dummyprofilefov", "100").min_max(70, 110);
consvar_t cv_dummyprofilelitesteer = MenuDummy("dummyprofilelitesteer", "Off").on_off();
consvar_t cv_dummyprofileautoring = MenuDummy("dummyprofileautoring", "Off").on_off();
consvar_t cv_dummyprofilekickstart = MenuDummy("dummyprofilekickstart", "Off").on_off();
consvar_t cv_dummyprofilename = MenuDummy("dummyprofilename", "");
consvar_t cv_dummyprofileplayername = MenuDummy("dummyprofileplayername", "");
......@@ -1078,6 +1089,13 @@ consvar_t cv_litesteer[MAXSPLITSCREENPLAYERS] = {
Player("litesteer4", "Off").on_off().onchange(weaponPrefChange4),
};
consvar_t cv_autoring[MAXSPLITSCREENPLAYERS] = {
Player("autoring", "Off").on_off().onchange(weaponPrefChange),
Player("autoring2", "Off").on_off().onchange(weaponPrefChange2),
Player("autoring3", "Off").on_off().onchange(weaponPrefChange3),
Player("autoring4", "Off").on_off().onchange(weaponPrefChange4),
};
consvar_t cv_cam_dist[MAXSPLITSCREENPLAYERS] = {
Player("cam_dist", "190").floating_point(),
Player("cam2_dist", "190").floating_point(),
......@@ -1166,10 +1184,10 @@ consvar_t cv_followercolor[MAXSPLITSCREENPLAYERS] = {
void Fov_OnChange(void);
consvar_t cv_fov[MAXSPLITSCREENPLAYERS] = {
Player("fov", "90").floating_point().min_max(60*FRACUNIT, 179*FRACUNIT).onchange(Fov_OnChange).dont_save(),
Player("fov2", "90").floating_point().min_max(60*FRACUNIT, 179*FRACUNIT).onchange(Fov_OnChange).dont_save(),
Player("fov3", "90").floating_point().min_max(60*FRACUNIT, 179*FRACUNIT).onchange(Fov_OnChange).dont_save(),
Player("fov4", "90").floating_point().min_max(60*FRACUNIT, 179*FRACUNIT).onchange(Fov_OnChange).dont_save(),
Player("fov", "100").floating_point().min_max(60*FRACUNIT, 179*FRACUNIT).onchange(Fov_OnChange).dont_save(),
Player("fov2", "100").floating_point().min_max(60*FRACUNIT, 179*FRACUNIT).onchange(Fov_OnChange).dont_save(),
Player("fov3", "100").floating_point().min_max(60*FRACUNIT, 179*FRACUNIT).onchange(Fov_OnChange).dont_save(),
Player("fov4", "100").floating_point().min_max(60*FRACUNIT, 179*FRACUNIT).onchange(Fov_OnChange).dont_save(),
};
consvar_t cv_freecam_speed = Player("freecam_speed", "1").min_max(-64, 10).dont_save();
......@@ -1193,6 +1211,8 @@ consvar_t cv_kickstartaccel[MAXSPLITSCREENPLAYERS] = {
Player("kickstartaccel4", "Off").on_off().onchange(weaponPrefChange4)
};
consvar_t cv_mindelay = Player("mindelay", "2").min_max(0, 15).onchange(weaponPrefChange);
extern CV_PossibleValue_t Color_cons_t[];
void Color1_OnChange(void);
void Color2_OnChange(void);
......@@ -1330,8 +1350,6 @@ consvar_t cv_chatwidth = Player("chatwidth", "150").min_max(64, 150);
// old shit console chat. (mostly exists for stuff like terminal, not because I cared if anyone liked the old chat.)
consvar_t cv_consolechat = Player("chatmode", "Yes").values({{0, "Yes"}, {2, "No"}});
consvar_t cv_gamestochat = Player("gamestochat", "0").min_max(0, 99);
void Mute_OnChange(void);
consvar_t cv_mute = UnsavedNetVar("mute", "Off").on_off().onchange(Mute_OnChange);
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Ronald "Eidolon" Kinard
// Copyright (C) 2024 by Kart Krew
// Copyright (C) 2025 by Ronald "Eidolon" Kinard
// Copyright (C) 2025 by Kart Krew
//
// This program is free software distributed under the
// terms of the GNU General Public License, version 2.
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
//
......@@ -52,6 +52,7 @@
#include "stun.h"
// SRB2Kart
#include "k_credits.h"
#include "k_kart.h"
#include "k_battle.h"
#include "k_pwrlv.h"
......@@ -122,6 +123,7 @@ UINT16 pingmeasurecount = 1;
UINT32 realpingtable[MAXPLAYERS]; //the base table of ping where an average will be sent to everyone.
UINT32 playerpingtable[MAXPLAYERS]; //table of player latency values.
UINT32 playerpacketlosstable[MAXPLAYERS];
UINT32 playerdelaytable[MAXPLAYERS]; // mindelay values.
#define GENTLEMANSMOOTHING (TICRATE)
static tic_t reference_lag;
......@@ -3344,6 +3346,7 @@ void SV_ResetServer(void)
memset(realpingtable, 0, sizeof realpingtable);
memset(playerpingtable, 0, sizeof playerpingtable);
memset(playerpacketlosstable, 0, sizeof playerpacketlosstable);
memset(playerdelaytable, 0, sizeof playerdelaytable);
ClearAdminPlayers();
Schedule_Clear();
......@@ -4724,8 +4727,7 @@ static void PT_Say(int node)
{
size_t i;
const size_t j = strlen(say.message);
for (i = 0; i < j; i++)
for (i = 0; i < sizeof say.message && say.message[i]; i++)
{
if (say.message[i] & 0x80)
{
......@@ -4763,7 +4765,7 @@ static void PT_Say(int node)
DoSayCommand(say.message, say.target, say.flags, say.source);
}
static char NodeToSplitPlayer(int node, int split)
static int8_t NodeToSplitPlayer(int node, int split)
{
if (split == 0)
return nodetoplayer[node];
......@@ -5278,6 +5280,7 @@ static void HandlePacketFromPlayer(SINT8 node)
{
playerpingtable[i] = (tic_t)netbuffer->u.netinfo.pingtable[i];
playerpacketlosstable[i] = netbuffer->u.netinfo.packetloss[i];
playerdelaytable[i] = netbuffer->u.netinfo.delay[i];
}
}
......@@ -5758,8 +5761,26 @@ static void CL_SendClientCmd(void)
spike_time = 0;
}
/*
if (server) // Clients have to wait for the gamestate to make it back. Servers don't!
lagDelay *= 2; // Simulate the HELLFUCK NIGHTMARE of a complete round trip.
*/
// [deep breath in]
// Plausible, elegant explanation that is WRONG AND SUPER HARMFUL.
// Clients with stable connections were adding their mindelay to network delay,
// even when their mindelay was as high or higher than network delay—which made
// client delay APPEAR slower than host mindelay, by the exact value that made
// "lmao just double it" make sense at the time.
//
// While this fix made client connections match server mindelay in our most common
// test environment, it also masked an issue that seriously affected online handling
// responsiveness, completely ruining our opportunity to further investigate it!
//
// See UpdatePingTable.
// I am taking this shitty code to my grave as an example of "never trust your brain".
// -Tyron 2024-05-15
}
packetsize = sizeof (clientcmd_pak);
......@@ -6146,17 +6167,22 @@ boolean TryRunTics(tic_t realtics)
ps_tictime = I_GetPreciseTime() - ps_tictime;
if (D_IsDeferredStartTitle())
{
D_StartTitle();
}
// Leave a certain amount of tics present in the net buffer as long as we've ran at least one tic this frame.
if (client && gamestate == GS_LEVEL && leveltime > 1 && neededtic <= gametic + cv_netticbuffer.value)
{
break;
}
}
if (F_IsDeferredContinueCredits())
{
F_ContinueCredits();
}
if (D_IsDeferredStartTitle())
{
D_StartTitle();
}
}
else
{
......@@ -6251,6 +6277,7 @@ static inline void PingUpdate(void)
}
netbuffer->u.netinfo.packetloss[i] = lost;
netbuffer->u.netinfo.delay[i] = playerdelaytable[i];
}
// send the server's maxping as last element of our ping table. This is useful to let us know when we're about to get kicked.
......@@ -6285,61 +6312,55 @@ static void UpdatePingTable(void)
{
if (playeringame[i] && playernode[i] > 0)
{
if (! server_lagless && playernode[i] > 0 && !players[i].spectator)
{
lag = GetLag(playernode[i]);
realpingtable[i] += lag;
// TicsToMilliseconds can't handle pings over 1000ms lol
realpingtable[i] += GetLag(playernode[i]);
if (!players[i].spectator)
{
lag = playerpingtable[i];
if (! fastest || lag < fastest)
fastest = lag;
}
else
{
// TicsToMilliseconds can't handle pings over 1000ms lol
realpingtable[i] += GetLag(playernode[i]);
}
}
}
// Don't gentleman below your mindelay
if (fastest < (tic_t)cv_mindelay.value)
fastest = (tic_t)cv_mindelay.value;
pingmeasurecount++;
if (server_lagless)
lowest_lag = 0;
else
{
lowest_lag = fastest;
if (fastest)
lag = fastest;
else
lag = GetLag(0);
// Don't gentleman below your mindelay
if (lowest_lag < (tic_t)cv_mindelay.value)
lowest_lag = (tic_t)cv_mindelay.value;
lag = ( realpingtable[0] + lag );
pingmeasurecount++;
switch (playerpernode[0])
{
case 4:
realpingtable[nodetoplayer4[0]] = lag;
/*FALLTHRU*/
case 3:
realpingtable[nodetoplayer3[0]] = lag;
/*FALLTHRU*/
case 2:
realpingtable[nodetoplayer2[0]] = lag;
/*FALLTHRU*/
case 1:
realpingtable[nodetoplayer[0]] = lag;
}
switch (playerpernode[0])
{
case 4:
playerdelaytable[nodetoplayer4[0]] = lowest_lag;
/*FALLTHRU*/
case 3:
playerdelaytable[nodetoplayer3[0]] = lowest_lag;
/*FALLTHRU*/
case 2:
playerdelaytable[nodetoplayer2[0]] = lowest_lag;
/*FALLTHRU*/
case 1:
playerdelaytable[nodetoplayer[0]] = lowest_lag;
}
}
else // We're a client, handle mindelay on the way out.
{
if ((neededtic - gametic) < (tic_t)cv_mindelay.value)
lowest_lag = cv_mindelay.value - (neededtic - gametic);
// Previously (neededtic - gametic) - WRONG VALUE!
// Pretty sure that's measuring jitter, not RTT.
// Stable connections would be punished by adding their mindelay to network delay!
tic_t mydelay = playerpingtable[consoleplayer];
if (mydelay < (tic_t)cv_mindelay.value)
lowest_lag = cv_mindelay.value - mydelay;
else
lowest_lag = 0;
}
}
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
//
......@@ -395,7 +395,7 @@ struct resultsall_pak
struct say_pak
{
char message[HU_MAXMSGLEN + 1];
char message[HU_MAXMSGLEN];
UINT8 target;
UINT8 flags;
UINT8 source;
......@@ -405,6 +405,7 @@ struct netinfo_pak
{
UINT32 pingtable[MAXPLAYERS+1];
UINT32 packetloss[MAXPLAYERS+1];
UINT32 delay[MAXPLAYERS+1];
} ATTRPACK;
//
......@@ -546,6 +547,7 @@ extern UINT16 pingmeasurecount;
extern UINT32 realpingtable[MAXPLAYERS];
extern UINT32 playerpingtable[MAXPLAYERS];
extern UINT32 playerpacketlosstable[MAXPLAYERS];
extern UINT32 playerdelaytable[MAXPLAYERS];
extern tic_t servermaxping;
extern boolean server_lagless;
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
// Copyright (C) 1996 by id Software, Inc.
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
// Copyright (C) 1996 by id Software, Inc.
......@@ -107,18 +107,18 @@ extern "C" consvar_t cv_lua_profile, cv_menuframeskip;
/* Manually defined asset hashes
*/
#define ASSET_HASH_BIOS_PK3 "8e3df443ae9cfde1888a0a152c49a4fb"
#define ASSET_HASH_BIOS_PK3 "2f3d5ac37fccd77a2bf7376f60a70ab1"
#define ASSET_HASH_SCRIPTS_PK3 "15e65f7f6d5460f9362c646714f57578"
#define ASSET_HASH_GFX_PK3 "3232da11054bcef8ea8048e4b8888c7e"
#define ASSET_HASH_GFX_PK3 "142df1ca805fd80a688a318cc4d24ca0"
#define ASSET_HASH_TEXTURES_GENERAL_PK3 "1c91e9d6f407ba8350f7c2dce0035936"
#define ASSET_HASH_TEXTURES_SEGAZONES_PK3 "fb8d3bdf9cd63c508170e89d8d71d2e7"
#define ASSET_HASH_TEXTURES_ORIGINALZONES_PK3 "9939a34fbca13864e0b6fb5e8a846e7b"
#define ASSET_HASH_TEXTURES_SEGAZONES_PK3 "a029a0993e5f04056eb6c139b1ffa924"
#define ASSET_HASH_TEXTURES_ORIGINALZONES_PK3 "ee5c04df39386e6cd93d346769b37693"
#define ASSET_HASH_CHARS_PK3 "bf014478cdda5e9208e3dea3c51f58c5"
#define ASSET_HASH_FOLLOWERS_PK3 "19abaf775a4334ca1f450249ae5d3d6d"
#define ASSET_HASH_MAPS_PK3 "5e7167fd78cf838306f925a1c7652968"
#define ASSET_HASH_UNLOCKS_PK3 "2b80614902ad48b21a3451c3b430721b"
#define ASSET_HASH_STAFFGHOSTS_PK3 "8601eb4ea3d8c27699f4984f30e81525"
#define ASSET_HASH_SHADERS_PK3 "dbfb1d5eb9818cd2fb81680c0bab05c0"
#define ASSET_HASH_FOLLOWERS_PK3 "a37b8796fc1d83d3398f79767aa0de47"
#define ASSET_HASH_MAPS_PK3 "a8bd1f924531c483f500d96583b7b837"
#define ASSET_HASH_UNLOCKS_PK3 "ebc06ff46c2cc80e93dadf5f7099d7b8"
#define ASSET_HASH_STAFFGHOSTS_PK3 "9cb77f6c0e801c1bc61ca84870b65707"
#define ASSET_HASH_SHADERS_PK3 "7aefd2aa55129b31210aa094cf782695"
#ifdef USE_PATCH_FILE
#define ASSET_HASH_PATCH_PK3 "00000000000000000000000000000000"
#endif
......@@ -1486,7 +1486,7 @@ void D_SRB2Main(void)
// Print GPL notice for our console users (Linux)
CONS_Printf(
"\n\nDr. Robotnik's Ring Racers\n"
"Copyright (C) 2024 by Kart Krew\n\n"
"Copyright (C) 2025 by Kart Krew\n\n"
"This program comes with ABSOLUTELY NO WARRANTY.\n\n"
"This is free software, and you are welcome to redistribute it\n"
"and/or modify it under the terms of the GNU General Public License\n"
......@@ -1755,17 +1755,6 @@ void D_SRB2Main(void)
CON_SetLoadingProgress(LOADED_IWAD);
CONS_Printf("W_InitMultipleFiles(): Adding external PWADs.\n");
W_InitMultipleFiles(startuppwads, true);
D_CleanFile(startuppwads);
//
// search for pwad maps
//
P_InitMapData();
CON_SetLoadingProgress(LOADED_PWAD);
M_PasswordInit();
//---------------------------------------------------- READY SCREEN
......@@ -1798,14 +1787,35 @@ void D_SRB2Main(void)
CON_Init();
CON_SetLoadingProgress(LOADED_HUINIT);
D_RegisterServerCommands();
D_RegisterClientCommands(); // be sure that this is called before D_CheckNetGame
R_RegisterEngineStuff();
S_RegisterSoundStuff();
I_RegisterSysCommands();
CON_SetLoadingProgress(LOADED_HUINIT);
CONS_Printf("W_InitMultipleFiles(): Adding external PWADs.\n");
// HACK: Refer to https://git.do.srb2.org/KartKrew/RingRacers/-/merge_requests/29#note_61574
partadd_earliestfile = numwadfiles;
W_InitMultipleFiles(startuppwads, true);
// Only search for pwad maps and reload graphics if we actually have a pwad added
if (startuppwads[0] != NULL)
{
//
// search for pwad maps
//
P_InitMapData();
HU_LoadGraphics();
}
D_CleanFile(startuppwads);
partadd_earliestfile = UINT16_MAX;
CON_SetLoadingProgress(LOADED_PWAD);
M_Init();
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
// Copyright (C) 1996 by id Software, Inc.
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
// Copyright (C) 1996 by id Software, Inc.
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
// Copyright (C) 1996 by id Software, Inc.
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
//
......@@ -1258,6 +1258,7 @@ enum {
WP_SHRINKME = 1<<1,
WP_AUTOROULETTE = 1<<2,
WP_ANALOGSTICK = 1<<3,
WP_AUTORING = 1<<4,
};
void WeaponPref_Send(UINT8 ssplayer)
......@@ -1276,7 +1277,14 @@ void WeaponPref_Send(UINT8 ssplayer)
if (gamecontrolflags[ssplayer] & GCF_ANALOGSTICK)
prefs |= WP_ANALOGSTICK;
SendNetXCmdForPlayer(ssplayer, XD_WEAPONPREF, &prefs, 1);
if (cv_autoring[ssplayer].value)
prefs |= WP_AUTORING;
UINT8 buf[2];
buf[0] = prefs;
buf[1] = cv_mindelay.value;
SendNetXCmdForPlayer(ssplayer, XD_WEAPONPREF, buf, sizeof buf);
}
void WeaponPref_Save(UINT8 **cp, INT32 playernum)
......@@ -1297,6 +1305,9 @@ void WeaponPref_Save(UINT8 **cp, INT32 playernum)
if (player->pflags & PF_ANALOGSTICK)
prefs |= WP_ANALOGSTICK;
if (player->pflags & PF_AUTORING)
prefs |= WP_AUTORING;
WRITEUINT8(*cp, prefs);
}
......@@ -1307,7 +1318,7 @@ size_t WeaponPref_Parse(const UINT8 *bufstart, INT32 playernum)
UINT8 prefs = READUINT8(p);
player->pflags &= ~(PF_KICKSTARTACCEL|PF_SHRINKME|PF_AUTOROULETTE);
player->pflags &= ~(PF_KICKSTARTACCEL|PF_SHRINKME|PF_AUTOROULETTE|PF_AUTORING);
if (prefs & WP_KICKSTARTACCEL)
player->pflags |= PF_KICKSTARTACCEL;
......@@ -1323,6 +1334,9 @@ size_t WeaponPref_Parse(const UINT8 *bufstart, INT32 playernum)
else
player->pflags &= ~PF_ANALOGSTICK;
if (prefs & WP_AUTORING)
player->pflags |= PF_AUTORING;
if (leveltime < 2)
{
// BAD HACK: No other place I tried to slot this in
......@@ -1338,6 +1352,13 @@ static void Got_WeaponPref(const UINT8 **cp,INT32 playernum)
{
*cp += WeaponPref_Parse(*cp, playernum);
UINT8 mindelay = READUINT8(*cp);
if (server)
{
for (UINT8 i = 0; i < G_LocalSplitscreenPartySize(playernum); ++i)
playerdelaytable[G_LocalSplitscreenPartyMember(playernum, i)] = mindelay;
}
// SEE ALSO g_demo.c
demo_extradata[playernum] |= DXD_WEAPONPREF;
}
......@@ -2982,6 +3003,12 @@ static void Command_RestartLevel(void)
return;
}
if (K_CanChangeRules(false) == false && CV_CheatsEnabled() == false)
{
CONS_Printf(M_GetText("Cheats must be enabled.\n"));
return;
}
if (cv_kartencore.value != 0)
{
newencore = (cv_kartencore.value == 1) || encoremode;
......@@ -6390,7 +6417,7 @@ void Command_ExitGame_f(void)
// YES, this is where demo.attract gets cleared!
if (demo.attract == DEMO_ATTRACT_CREDITS)
{
F_ContinueCredits(); // <-- clears demo.attract
F_DeferContinueCredits(); // <-- clears demo.attract
}
else if (restoreMenu == NULL) // this is true for attract demos too!
{
......@@ -6434,14 +6461,12 @@ void Command_Retry_f(void)
*/
static void Command_Isgamemodified_f(void)
{
if (majormods)
CONS_Printf("The game has been modified with major addons, so you cannot play Record Attack.\n");
else if (savemoddata)
CONS_Printf("The game has been modified with an addon with its own save data, so you can play Record Attack and earn medals.\n");
if (savemoddata)
CONS_Printf("The game has been modified with an addon using its own save data.\n");
else if (modifiedgame)
CONS_Printf("The game has been modified with only minor addons. You can play Record Attack, earn medals and unlock extras.\n");
CONS_Printf("The game has been modified, but is still using Ring Racers save data.\n");
else
CONS_Printf("The game has not been modified. You can play Record Attack, earn medals and unlock extras.\n");
CONS_Printf("The game has not been modified.\n");
}
#ifdef _DEBUG
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
//
......@@ -101,6 +101,7 @@ extern consvar_t cv_debugrank;
extern consvar_t cv_battletest;
extern consvar_t cv_bighead;
extern consvar_t cv_levelskull;
extern consvar_t cv_shittysigns;
extern consvar_t cv_tastelesstaunts;
extern consvar_t cv_4thgear;
......
// DR. ROBOTNIK'S RING RACERS
//-----------------------------------------------------------------------------
// Copyright (C) 2024 by Kart Krew.
// Copyright (C) 2025 by Kart Krew.
// Copyright (C) 2020 by Sonic Team Junior.
// Copyright (C) 2000 by DooM Legacy Team.
//
......@@ -62,8 +62,8 @@
static boolean AddFileToSendQueue(INT32 node, const char *filename, UINT8 fileid);
#ifdef HAVE_CURL
size_t curlwrite_data(void *ptr, size_t size, size_t nmemb, FILE *stream);
int curlprogress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow);
static size_t curlwrite_data(void *ptr, size_t size, size_t nmemb, FILE *stream);
static int curlprogress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow);
#endif
// Sender structure
......@@ -1778,21 +1778,34 @@ filestatus_t findfile(char *filename, const UINT8 *wantedmd5sum, boolean complet
}
#ifdef HAVE_CURL
size_t curlwrite_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
static size_t curlwrite_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
size_t written;
written = fwrite(ptr, size, nmemb, stream);
return written;
}
int curlprogress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
static int curlprogress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow)
{
time_t curtime;
(void)clientp;
(void)ultotal;
(void)ulnow; // Function prototype requires these but we won't use, so just discard
curtime = time(NULL);
curl_dlnow = dlnow;
curl_dltotal = dltotal;
getbytes = curl_dlnow / (time(NULL) - curl_starttime); // To-do: Make this more accurate???
if (curtime > curl_starttime)
{
getbytes = curl_dlnow / (curtime - curl_starttime); // To-do: Make this more accurate???
}
else
{
getbytes = 0;
}
return 0;
}
......