diff --git a/src/d_netcmd.c b/src/d_netcmd.c index ed2d47ede..87580d21a 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -510,6 +510,8 @@ static CV_PossibleValue_t perfstats_cons_t[] = { {0, "Off"}, {1, "Rendering"}, {2, "Logic"}, {3, "ThinkFrame"}, {0, NULL}}; consvar_t cv_perfstats = CVAR_INIT ("perfstats", "Off", 0, perfstats_cons_t, NULL); +consvar_t cv_director = CVAR_INIT ("director", "Off", 0, CV_OnOff, NULL); + char timedemo_name[256]; boolean timedemo_csv; char timedemo_csv_id[256]; @@ -742,6 +744,8 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_showping); CV_RegisterVar(&cv_showviewpointtext); + CV_RegisterVar(&cv_director); + CV_RegisterVar(&cv_dummyconsvar); #ifdef USE_STUN diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 4813dd07e..ba3c68452 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -113,6 +113,8 @@ extern consvar_t cv_sleep; extern consvar_t cv_perfstats; +extern consvar_t cv_director; + extern char timedemo_name[256]; extern boolean timedemo_csv; extern char timedemo_csv_id[256]; diff --git a/src/k_director.c b/src/k_director.c index 3461a6327..0de6b8957 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -12,13 +12,12 @@ #include "d_netcmd.h" #include "p_local.h" -#define SWITCHTIME TICRATE*5 -#define DEBOUNCETIME TICRATE/6 -#define BOREDOMTIME 3*TICRATE/2 -#define TRANSFERTIME TICRATE -#define BREAKAWAYDIST 4000 -#define WALKBACKDIST 600 -#define PINCHDIST 30000 +#define SWITCHTIME TICRATE*5 // cooldown between unforced switches +#define BOREDOMTIME 3*TICRATE/2 // how long until players considered far apart? +#define TRANSFERTIME TICRATE // how long to delay reaction shots? +#define BREAKAWAYDIST 4000 // how *far* until players considered far apart? +#define WALKBACKDIST 600 // how close should a trailing player be before we switch? +#define PINCHDIST 30000 // how close should the leader be to be considered "end of race"? void K_UpdateDirectorPositions(void); boolean K_CanSwitchDirector(void); @@ -31,7 +30,7 @@ void K_DirectorForceSwitch(INT32 player, INT32 time); INT32 cooldown = 0; // how long has it been since we last switched? INT32 freeze = 0; // when nonzero, fixed switch pending, freeze logic! INT32 attacker = 0; // who to switch to when freeze delay elapses -INT32 maxdist = 0; +INT32 maxdist = 0; // how far is the closest player from finishing? INT32 sortedplayers[MAXPLAYERS] = {0}; // position-1 goes in, player index comes out. INT32 gap[MAXPLAYERS] = {0}; // gap between a given position and their closest pursuer @@ -74,7 +73,7 @@ boolean K_CanSwitchDirector(void) { INT32 *displayplayerp = &displayplayers[0]; if (players[*displayplayerp].trickpanel > 0) return false; - if (cooldown < SWITCHTIME); + if (cooldown < SWITCHTIME) return false; return true; } @@ -111,20 +110,24 @@ void K_DrawDirectorDebugger(void) { INT32 leader; INT32 follower; INT32 ytxt; + if (!cv_kartdebugdirector.value) return; + V_DrawThinString(10, 0, V_70TRANS, va("PLACE")); V_DrawThinString(40, 0, V_70TRANS, va("CONF?")); V_DrawThinString(80, 0, V_70TRANS, va("GAP")); V_DrawThinString(120, 0, V_70TRANS, va("BORED")); V_DrawThinString(150, 0, V_70TRANS, va("COOLDOWN: %d", cooldown)); V_DrawThinString(230, 0, V_70TRANS, va("MAXDIST: %d", maxdist)); + for (playernum = 0; playernum < MAXPLAYERS-1; ++playernum) { ytxt = 10*playernum+10; leader = sortedplayers[playernum]; follower = sortedplayers[playernum+1]; if (leader == -1 || follower == -1) break; + V_DrawThinString(10, ytxt, V_70TRANS, va("%d", playernum)); V_DrawThinString(20, ytxt, V_70TRANS, va("%d", playernum+1)); if (players[leader].positiondelay) @@ -143,6 +146,9 @@ void K_UpdateDirector(void) { INT32 *displayplayerp = &displayplayers[0]; INT32 targetposition; + if (!cv_director.value) + return; + K_UpdateDirectorPositions(); cooldown++; @@ -180,7 +186,6 @@ void K_UpdateDirector(void) { } } - target = sortedplayers[targetposition+1]; // if we're certain the back half of the pair is actually in this position, try to switch diff --git a/src/k_kart.c b/src/k_kart.c index d1b654411..4332d4416 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3276,10 +3276,11 @@ static void K_RemoveGrowShrink(player_t *player) void K_TumblePlayer(player_t *player, mobj_t *inflictor, mobj_t *source) { - K_DirectorFollowAttack(player, inflictor, source); fixed_t gravityadjust; (void)source; + K_DirectorFollowAttack(player, inflictor, source); + player->tumbleBounces = 1; if (player->tripWireState == TRIP_PASSED)