From 229e8d9592966a438d3aa50dbc3e1273512bfad7 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 17:47:58 +0100 Subject: [PATCH 01/12] WIP splitscreen director lel --- src/g_game.c | 18 +++++- src/k_director.c | 149 +++++++++++++++++++++++++++-------------------- src/k_director.h | 4 +- src/p_tick.c | 5 +- 4 files changed, 108 insertions(+), 68 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 79e94a24b..d6e7ac2ab 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1550,10 +1550,22 @@ boolean G_Responder(event_t *ev) COM_ImmedExecute("changeteam4 spectator"); } } - if (ev->data1 == gamecontrol[gc_director][0] - || ev->data1 == gamecontrol[gc_director][1]) + + if (ev->data1 == gamecontrol[gc_director][0] || ev->data1 == gamecontrol[gc_director][1]) { - K_ToggleDirector(); + K_ToggleDirector(0); + } + else if (ev->data1 == gamecontrolbis[gc_director][0] || ev->data1 == gamecontrolbis[gc_director][1]) + { + K_ToggleDirector(1); + } + else if (ev->data1 == gamecontrol3[gc_director][0] || ev->data1 == gamecontrol3[gc_director][1]) + { + K_ToggleDirector(2); + } + else if (ev->data1 == gamecontrol4[gc_director][0] || ev->data1 == gamecontrol4[gc_director][1]) + { + K_ToggleDirector(3); } if (ev->data1 == gamecontrol[gc_freecam][0] || ev->data1 == gamecontrol[gc_freecam][1]) diff --git a/src/k_director.c b/src/k_director.c index dafea6072..375f8ddb3 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -12,6 +12,7 @@ //#include "k_kart.h" #include "doomdef.h" +#include "doomstat.h" #include "g_game.h" #include "v_video.h" #include "k_director.h" @@ -19,6 +20,8 @@ #include "p_local.h" #include "st_stuff.h" +#include "r_fps.h" + #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? @@ -28,6 +31,7 @@ struct directorinfo { + boolean active; tic_t cooldown; // how long has it been since we last switched? tic_t freeze; // when nonzero, fixed switch pending, freeze logic! INT32 attacker; // who to switch to when freeze delay elapses @@ -38,6 +42,8 @@ struct directorinfo INT32 boredom[MAXPLAYERS]; // how long has a given position had no credible attackers? } directorinfo; +struct directorinfo directorinfosplit[MAXSPLITSCREENPLAYERS]; + boolean K_DirectorIsPlayerAlone(void) { UINT8 pingame = 0; @@ -67,25 +73,30 @@ static fixed_t ScaleFromMap(fixed_t n, fixed_t scale) return FixedMul(n, FixedDiv(scale, mapobjectscale)); } -static boolean K_DirectorIsEnabled(void) +static boolean K_DirectorIsEnabled(const UINT8 viewnum) { - return cv_director.value && !splitscreen && (gamestate == GS_LEVEL && (((!playeringame[consoleplayer] || players[consoleplayer].spectator)) || (demo.playback && !demo.freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone()); + //return cv_director.value && !splitscreen && (gamestate == GS_LEVEL && (((!playeringame[consoleplayer] || players[consoleplayer].spectator)) || (demo.playback && !camera[0].freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone()); + return directorinfosplit[viewnum].active; } void K_InitDirector(void) { INT32 playernum; - directorinfo.cooldown = SWITCHTIME; - directorinfo.freeze = 0; - directorinfo.attacker = 0; - directorinfo.maxdist = 0; - - for (playernum = 0; playernum < MAXPLAYERS; playernum++) + for (UINT8 i = 0; i < MAXSPLITSCREENPLAYERS; i++) { - directorinfo.sortedplayers[playernum] = -1; - directorinfo.gap[playernum] = INT32_MAX; - directorinfo.boredom[playernum] = 0; + directorinfosplit[i].cooldown = SWITCHTIME; + directorinfosplit[i].freeze = 0; + directorinfosplit[i].attacker = 0; + directorinfosplit[i].maxdist = 0; + directorinfosplit[i].active = 0; + + for (playernum = 0; playernum < MAXPLAYERS; playernum++) + { + directorinfosplit[i].sortedplayers[playernum] = -1; + directorinfosplit[i].gap[playernum] = INT32_MAX; + directorinfosplit[i].boredom[playernum] = 0; + } } } @@ -148,13 +159,13 @@ static fixed_t K_GetFinishGap(INT32 leader, INT32 follower) } } -static void K_UpdateDirectorPositions(void) +static void K_UpdateDirectorPositions(const UINT8 viewnum) { INT32 playernum; INT32 position; player_t* target; - memset(directorinfo.sortedplayers, -1, sizeof(directorinfo.sortedplayers)); + memset(directorinfosplit[viewnum].sortedplayers, -1, sizeof(directorinfo.sortedplayers)); for (playernum = 0; playernum < MAXPLAYERS; playernum++) { @@ -162,43 +173,43 @@ static void K_UpdateDirectorPositions(void) if (playeringame[playernum] && !target->spectator && target->kartstuff[k_position] > 0) { - directorinfo.sortedplayers[target->kartstuff[k_position] - 1] = playernum; + directorinfosplit[viewnum].sortedplayers[target->kartstuff[k_position] - 1] = playernum; } } for (position = 0; position < MAXPLAYERS - 1; position++) { - directorinfo.gap[position] = INT32_MAX; + directorinfosplit[viewnum].gap[position] = INT32_MAX; - if (directorinfo.sortedplayers[position] == -1 || directorinfo.sortedplayers[position + 1] == -1) + if (directorinfosplit[viewnum].sortedplayers[position] == -1 || directorinfosplit[viewnum].sortedplayers[position + 1] == -1) { continue; } - directorinfo.gap[position] = ScaleFromMap(K_GetFinishGap(directorinfo.sortedplayers[position], directorinfo.sortedplayers[position + 1]), FRACUNIT); + directorinfosplit[viewnum].gap[position] = ScaleFromMap(K_GetFinishGap(directorinfosplit[viewnum].sortedplayers[position], directorinfosplit[viewnum].sortedplayers[position + 1]), FRACUNIT); - if (directorinfo.gap[position] >= BREAKAWAYDIST) + if (directorinfosplit[viewnum].gap[position] >= BREAKAWAYDIST) { - directorinfo.boredom[position] = (INT32)(min(BOREDOMTIME * 2, directorinfo.boredom[position] + 1)); + directorinfosplit[viewnum].boredom[position] = (INT32)(min(BOREDOMTIME * 2, directorinfosplit[viewnum].boredom[position] + 1)); } - else if (directorinfo.boredom[position] > 0) + else if (directorinfosplit[viewnum].boredom[position] > 0) { - directorinfo.boredom[position]--; + directorinfosplit[viewnum].boredom[position]--; } } - if (directorinfo.sortedplayers[0] == -1) + if (directorinfosplit[viewnum].sortedplayers[0] == -1) { - directorinfo.maxdist = -1; + directorinfosplit[viewnum].maxdist = -1; return; } - directorinfo.maxdist = ScaleFromMap(K_GetDistanceToFinish(players[directorinfo.sortedplayers[0]]), FRACUNIT); + directorinfosplit[viewnum].maxdist = ScaleFromMap(K_GetDistanceToFinish(players[directorinfosplit[viewnum].sortedplayers[0]]), FRACUNIT); } -static boolean K_CanSwitchDirector(void) +static boolean K_CanSwitchDirector(const UINT8 viewnum) { - if (directorinfo.cooldown > 0) + if (directorinfosplit[viewnum].cooldown > 0) { return false; } @@ -206,9 +217,9 @@ static boolean K_CanSwitchDirector(void) return true; } -static void K_DirectorSwitch(INT32 player, boolean force) +static void K_DirectorSwitch(INT32 player, boolean force, const UINT8 viewnum) { - if (!K_DirectorIsEnabled()) + if (!K_DirectorIsEnabled(viewnum)) { return; } @@ -223,29 +234,34 @@ static void K_DirectorSwitch(INT32 player, boolean force) return; } - if (!force && !K_CanSwitchDirector()) + if (!force && !K_CanSwitchDirector(viewnum)) { return; } - G_ResetView(1, player, true); - directorinfo.cooldown = SWITCHTIME; + G_ResetView(viewnum+1, player, true); + directorinfosplit[viewnum].cooldown = SWITCHTIME; } -static void K_DirectorForceSwitch(INT32 player, INT32 time) +static void K_DirectorForceSwitch(INT32 player, INT32 time, const UINT8 viewnum) { if (players[player].exiting) { return; } - directorinfo.attacker = player; - directorinfo.freeze = time; + directorinfosplit[viewnum].attacker = player; + directorinfosplit[viewnum].freeze = time; } +static UINT8 curview = 0; + void K_DirectorFollowAttack(player_t *player, mobj_t *inflictor, mobj_t *source) { - if (!K_DirectorIsEnabled()) + if (player != &players[displayplayers[curview]]) + return; + + if (!K_DirectorIsEnabled(curview)) { return; } @@ -257,11 +273,11 @@ void K_DirectorFollowAttack(player_t *player, mobj_t *inflictor, mobj_t *source) if (inflictor && inflictor->player) { - K_DirectorForceSwitch(inflictor->player - players, TRANSFERTIME); + K_DirectorForceSwitch(inflictor->player - players, TRANSFERTIME, curview); } else if (source && source->player) { - K_DirectorForceSwitch(source->player - players, TRANSFERTIME); + K_DirectorForceSwitch(source->player - players, TRANSFERTIME, curview); } } @@ -317,37 +333,39 @@ void K_DrawDirectorDebugger(void) } } -void K_UpdateDirector(void) +void K_UpdateDirector(const UINT8 viewnum) { - INT32 *displayplayerp = &displayplayers[0]; + INT32 *displayplayerp = &displayplayers[viewnum]; INT32 targetposition; - if (!K_DirectorIsEnabled()) + curview = viewnum; + + if (!K_DirectorIsEnabled(viewnum)) { return; } - K_UpdateDirectorPositions(); + K_UpdateDirectorPositions(viewnum); - if (directorinfo.cooldown > 0) { - directorinfo.cooldown--; + if (directorinfosplit[viewnum].cooldown > 0) { + directorinfosplit[viewnum].cooldown--; } // handle pending forced switches - if (directorinfo.freeze > 0) + if (directorinfosplit[viewnum].freeze > 0) { - if (!(--directorinfo.freeze)) - K_DirectorSwitch(directorinfo.attacker, true); + if (!(--directorinfosplit[viewnum].freeze)) + K_DirectorSwitch(directorinfosplit[viewnum].attacker, true, viewnum); return; } // if there's only one player left in the list, just switch to that player - if (directorinfo.sortedplayers[0] != -1 && (directorinfo.sortedplayers[1] == -1 || + if (directorinfosplit[viewnum].sortedplayers[0] != -1 && (directorinfosplit[viewnum].sortedplayers[1] == -1 || // TODO: Battle; I just threw this together quick. Focus on leader. !race_rules())) { - K_DirectorSwitch(directorinfo.sortedplayers[0], false); + K_DirectorSwitch(directorinfosplit[viewnum].sortedplayers[0], false, viewnum); return; } @@ -359,36 +377,36 @@ void K_UpdateDirector(void) INT32 target; // you are out of players, try again - if (directorinfo.sortedplayers[targetposition] == -1) + if (directorinfosplit[viewnum].sortedplayers[targetposition] == -1) { break; } // pair too far apart? try the next one - if (directorinfo.boredom[targetposition - 1] >= BOREDOMTIME) + if (directorinfosplit[viewnum].boredom[targetposition - 1] >= BOREDOMTIME) { continue; } // pair finished? try the next one - if (players[directorinfo.sortedplayers[targetposition]].exiting) + if (players[directorinfosplit[viewnum].sortedplayers[targetposition]].exiting) { continue; } // don't risk switching away from forward pairs at race end, might miss something! - if (directorinfo.maxdist > PINCHDIST) + if (directorinfosplit[viewnum].maxdist > PINCHDIST) { // if the "next" player is close enough, they should be able to see everyone fine! // walk back through the standings to find a vantage that gets everyone in frame. // (also creates a pretty cool effect w/ overtakes at speed) - while (targetposition < MAXPLAYERS && directorinfo.gap[targetposition] < WALKBACKDIST) + while (targetposition < MAXPLAYERS && directorinfosplit[viewnum].gap[targetposition] < WALKBACKDIST) { targetposition++; } } - target = directorinfo.sortedplayers[targetposition]; + target = directorinfosplit[viewnum].sortedplayers[targetposition]; // stop here since we're already viewing this player if (*displayplayerp == target) @@ -405,30 +423,37 @@ void K_UpdateDirector(void) // if we're certain the back half of the pair is actually in this position, try to switch if (!players[target].kartstuff[k_positiondelay]) { - K_DirectorSwitch(target, false); + K_DirectorSwitch(target, false, viewnum); } // even if we're not certain, if we're certain we're watching the WRONG player, try to switch if (players[*displayplayerp].kartstuff[k_position] != targetposition+1 && !players[*displayplayerp].kartstuff[k_positiondelay]) { - K_DirectorSwitch(target, false); + K_DirectorSwitch(target, false, viewnum); } break; } } -void K_ToggleDirector(void) +void K_ToggleDirector(const UINT8 viewnum) { - if (!directortextactive) - return; + //if (!directortextactive) + //return; - if (!K_DirectorIsEnabled()) + if (!K_DirectorIsEnabled(viewnum)) { - directorinfo.cooldown = 0; // switch immediately + directorinfosplit[viewnum].cooldown = 0; // switch immediately } directortoggletimer = 0; - COM_ImmedExecute("add director 1"); + if (directorinfosplit[viewnum].active == false) + directorinfosplit[viewnum].active = true; + else + directorinfosplit[viewnum].active = false; + + CONS_Printf("director active %d for %d\n", directorinfosplit[viewnum].active, viewnum); + + //COM_ImmedExecute("add director 1"); } diff --git a/src/k_director.h b/src/k_director.h index 3be71b675..a5431d4f5 100644 --- a/src/k_director.h +++ b/src/k_director.h @@ -11,7 +11,7 @@ /// \brief SRB2kart automatic spectator camera. void K_InitDirector(void); -void K_UpdateDirector(void); +void K_UpdateDirector(UINT8 viewnum); void K_DrawDirectorDebugger(void); void K_DirectorFollowAttack(player_t *player, mobj_t *inflictor, mobj_t *source); -void K_ToggleDirector(void); +void K_ToggleDirector(UINT8 viewnum); diff --git a/src/p_tick.c b/src/p_tick.c index 0784957f3..1bd6fa72b 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -698,7 +698,10 @@ void P_Ticker(boolean run) PS_STOP_TIMING(ps_lua_postthinkframe_time); } - K_UpdateDirector(); + for (i = 0; i <= splitscreen; i++) + { + K_UpdateDirector(i); + } // Always move the camera. P_RunChaseCameras(); -- 2.54.0 From b51731d6754f85a4c9bb86b4f0fd7f9a393af10c Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 17:42:04 +0100 Subject: [PATCH 02/12] cleanup director splitscreen stuff --- src/d_netcmd.c | 16 ++++++++++++++-- src/d_netcmd.h | 3 ++- src/g_game.c | 20 +++++++++++++------- src/k_director.c | 38 ++++++++++++++++++++++---------------- src/st_stuff.c | 6 +++--- 5 files changed, 54 insertions(+), 29 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5e1927ff0..19360a24b 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -572,7 +572,15 @@ static CV_PossibleValue_t ps_descriptor_cons_t[] = { {1, "Average"}, {2, "SD"}, {3, "Minimum"}, {4, "Maximum"}, {0, NULL}}; consvar_t cv_ps_descriptor = {"ps_descriptor", "Average", 0, ps_descriptor_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; -consvar_t cv_director = {"director", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; +//consvar_t cv_director = {"director", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; + +consvar_t cv_director[MAXSPLITSCREENPLAYERS] = { + {"director", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"director2", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"director3", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}, + {"director4", "Off", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL} +}; + consvar_t cv_kartdebugdirector = {"debugdirector", "Off", 0, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_showdirectorhud = {"showdirectorhud", "On", CV_SAVE, CV_OnOff, NULL, 0, NULL, NULL, 0, 0, NULL}; @@ -1005,7 +1013,11 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_showviewpointtext); CV_RegisterVar(&cv_showdownloadprompt); - CV_RegisterVar(&cv_director); + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + CV_RegisterVar(&cv_director[i]); + } + CV_RegisterVar(&cv_kartdebugdirector); CV_RegisterVar(&cv_showdirectorhud); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 87d96b40d..77852f60c 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -197,7 +197,8 @@ extern consvar_t cv_ps_thinkframe_page; extern consvar_t cv_ps_samplesize; extern consvar_t cv_ps_descriptor; -extern consvar_t cv_director, cv_kartdebugdirector, cv_showdirectorhud; +extern consvar_t cv_director[4]; // screw you includes +extern consvar_t cv_kartdebugdirector, cv_showdirectorhud; extern consvar_t cv_showtrackaddon; diff --git a/src/g_game.c b/src/g_game.c index d6e7ac2ab..e99400502 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -337,7 +337,7 @@ INT16 prevmap, nextmap; // save if director is enabled // so demos can disable it by default and restore it after -static int directorstate = 0; +static int directorstate[MAXSPLITSCREENPLAYERS] = {0,0,0,0}; tic_t directortoggletimer = 0; static CV_PossibleValue_t recordmultiplayerdemos_cons_t[] = {{0, "Disabled"}, {1, "Manual Save"}, {2, "Auto Save"}, {0, NULL}}; @@ -1213,8 +1213,8 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) displayplayers[0] = consoleplayer; G_FixCamera(1); // i dont like this lmao - if (cv_director.value) - CV_SetValue(&cv_director, 0); + if (cv_director[0].value) + CV_SetValue(&cv_director[0], 0); } } @@ -7292,8 +7292,11 @@ post_compat: players[i].kartweight = kartweight[i]; } - directorstate = cv_director.value; - CV_SetValue(&cv_director, 0); + for (i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + directorstate[i] = cv_director[i].value; + CV_SetValue(&cv_director[i], 0); + } demo.deferstart = true; } @@ -7860,8 +7863,11 @@ void G_StopDemo(void) demobuffer = NULL; if (demo.playback) { - CV_SetValue(&cv_director, directorstate); - directorstate = 0; + for (UINT8 i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + CV_SetValue(&cv_director[i], directorstate[i]); + directorstate[i] = 0; + } } demo.playback = false; if (demo.title) diff --git a/src/k_director.c b/src/k_director.c index 375f8ddb3..f3dd3733c 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -31,7 +31,6 @@ struct directorinfo { - boolean active; tic_t cooldown; // how long has it been since we last switched? tic_t freeze; // when nonzero, fixed switch pending, freeze logic! INT32 attacker; // who to switch to when freeze delay elapses @@ -76,7 +75,7 @@ static fixed_t ScaleFromMap(fixed_t n, fixed_t scale) static boolean K_DirectorIsEnabled(const UINT8 viewnum) { //return cv_director.value && !splitscreen && (gamestate == GS_LEVEL && (((!playeringame[consoleplayer] || players[consoleplayer].spectator)) || (demo.playback && !camera[0].freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone()); - return directorinfosplit[viewnum].active; + return (cv_director[viewnum].value && (gamestate == GS_LEVEL && (((!playeringame[displayplayers[viewnum]] || players[displayplayers[viewnum]].spectator)) || (demo.playback && !camera[viewnum].freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone())); } void K_InitDirector(void) @@ -89,7 +88,6 @@ void K_InitDirector(void) directorinfosplit[i].freeze = 0; directorinfosplit[i].attacker = 0; directorinfosplit[i].maxdist = 0; - directorinfosplit[i].active = 0; for (playernum = 0; playernum < MAXPLAYERS; playernum++) { @@ -254,6 +252,7 @@ static void K_DirectorForceSwitch(INT32 player, INT32 time, const UINT8 viewnum) directorinfosplit[viewnum].freeze = time; } +// HACK: this is awful but idk any other way to pass the viewnum to this static UINT8 curview = 0; void K_DirectorFollowAttack(player_t *player, mobj_t *inflictor, mobj_t *source) @@ -266,11 +265,6 @@ void K_DirectorFollowAttack(player_t *player, mobj_t *inflictor, mobj_t *source) return; } - if (!P_IsDisplayPlayer(player)) - { - return; - } - if (inflictor && inflictor->player) { K_DirectorForceSwitch(inflictor->player - players, TRANSFERTIME, curview); @@ -441,6 +435,9 @@ void K_ToggleDirector(const UINT8 viewnum) //if (!directortextactive) //return; + if (gamestate != GS_LEVEL && (playeringame[displayplayers[viewnum]] || !players[displayplayers[viewnum]].spectator)) + return; + if (!K_DirectorIsEnabled(viewnum)) { directorinfosplit[viewnum].cooldown = 0; // switch immediately @@ -448,12 +445,21 @@ void K_ToggleDirector(const UINT8 viewnum) directortoggletimer = 0; - if (directorinfosplit[viewnum].active == false) - directorinfosplit[viewnum].active = true; - else - directorinfosplit[viewnum].active = false; - - CONS_Printf("director active %d for %d\n", directorinfosplit[viewnum].active, viewnum); - - //COM_ImmedExecute("add director 1"); + switch (viewnum) + { + case 1: + COM_ImmedExecute("add director2 1"); + break; + case 2: + COM_ImmedExecute("add director3 1"); + break; + case 3: + COM_ImmedExecute("add director4 1"); + break; + case 0: + COM_ImmedExecute("add director 1"); + break; + default: + break; + } } diff --git a/src/st_stuff.c b/src/st_stuff.c index 398dc7dbe..b9730000e 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -671,9 +671,9 @@ static void ST_overlayDrawer(void) { char directortext[20] = {0}; - snprintf(directortext, 20, "Director: %s", cv_director.value ? "On" : "Off"); + snprintf(directortext, 20, "Director: %s", cv_director[0].value ? "On" : "Off"); - directortextactive = true; + //directortextactive = true; if ((!demo.playback && directortoggletimer < 13*TICRATE) || (demo.playback && directortoggletimer < 4*TICRATE)) { @@ -689,7 +689,7 @@ static void ST_overlayDrawer(void) else { directortoggletimer = 0; - directortextactive = false; + //directortextactive = false; } if (cv_showviewpointtext.value) -- 2.54.0 From b5b2062efa808f1621a65c6cd1cbd51563ba31c8 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 18:17:34 +0100 Subject: [PATCH 03/12] add K_DirectorIsAvailable --- src/k_director.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/k_director.c b/src/k_director.c index f3dd3733c..7dca59f41 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -72,10 +72,15 @@ static fixed_t ScaleFromMap(fixed_t n, fixed_t scale) return FixedMul(n, FixedDiv(scale, mapobjectscale)); } +static boolean K_DirectorIsAvailable(UINT8 viewnum) +{ + return ((gamestate == GS_LEVEL) && (viewnum <= splitscreen) && (!playeringame[displayplayers[viewnum]] || players[displayplayers[viewnum]].spectator)); +} + static boolean K_DirectorIsEnabled(const UINT8 viewnum) { //return cv_director.value && !splitscreen && (gamestate == GS_LEVEL && (((!playeringame[consoleplayer] || players[consoleplayer].spectator)) || (demo.playback && !camera[0].freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone()); - return (cv_director[viewnum].value && (gamestate == GS_LEVEL && (((!playeringame[displayplayers[viewnum]] || players[displayplayers[viewnum]].spectator)) || (demo.playback && !camera[viewnum].freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone())); + return (cv_director[viewnum].value && (K_DirectorIsAvailable(viewnum) || (demo.playback && (!demo.title || !modeattacking) && !camera[viewnum].freecam)) && !K_DirectorIsPlayerAlone()); } void K_InitDirector(void) @@ -435,7 +440,7 @@ void K_ToggleDirector(const UINT8 viewnum) //if (!directortextactive) //return; - if (gamestate != GS_LEVEL && (playeringame[displayplayers[viewnum]] || !players[displayplayers[viewnum]].spectator)) + if (K_DirectorIsAvailable(viewnum)) return; if (!K_DirectorIsEnabled(viewnum)) -- 2.54.0 From 86aeff55476e1f1d36f9ad06f3e1b13993e5efcb Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 18:25:23 +0100 Subject: [PATCH 04/12] cleanup K_DirectorIsAvailable --- src/k_director.c | 9 +++++---- src/k_director.h | 1 + src/st_stuff.c | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/k_director.c b/src/k_director.c index 7dca59f41..6de578f5f 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -72,15 +72,16 @@ static fixed_t ScaleFromMap(fixed_t n, fixed_t scale) return FixedMul(n, FixedDiv(scale, mapobjectscale)); } -static boolean K_DirectorIsAvailable(UINT8 viewnum) +boolean K_DirectorIsAvailable(UINT8 viewnum) { - return ((gamestate == GS_LEVEL) && (viewnum <= splitscreen) && (!playeringame[displayplayers[viewnum]] || players[displayplayers[viewnum]].spectator)); + if ((demo.playback && demo.title) || modeattacking) + return false; + return ((gamestate == GS_LEVEL) && (viewnum <= splitscreen) && (!playeringame[displayplayers[viewnum]] || players[displayplayers[viewnum]].spectator) && !camera[viewnum].freecam); } static boolean K_DirectorIsEnabled(const UINT8 viewnum) { - //return cv_director.value && !splitscreen && (gamestate == GS_LEVEL && (((!playeringame[consoleplayer] || players[consoleplayer].spectator)) || (demo.playback && !camera[0].freecam && (!demo.title || !modeattacking))) && !K_DirectorIsPlayerAlone()); - return (cv_director[viewnum].value && (K_DirectorIsAvailable(viewnum) || (demo.playback && (!demo.title || !modeattacking) && !camera[viewnum].freecam)) && !K_DirectorIsPlayerAlone()); + return (cv_director[viewnum].value && K_DirectorIsAvailable(viewnum) && !K_DirectorIsPlayerAlone()); } void K_InitDirector(void) diff --git a/src/k_director.h b/src/k_director.h index a5431d4f5..acc00b253 100644 --- a/src/k_director.h +++ b/src/k_director.h @@ -10,6 +10,7 @@ /// \file k_director.h /// \brief SRB2kart automatic spectator camera. +boolean K_DirectorIsAvailable(UINT8 viewnum); void K_InitDirector(void); void K_UpdateDirector(UINT8 viewnum); void K_DrawDirectorDebugger(void); diff --git a/src/st_stuff.c b/src/st_stuff.c index b9730000e..5e536d853 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -667,7 +667,7 @@ static void ST_overlayDrawer(void) if (!hu_showscores) // hide the following if TAB is held { - if (cv_showdirectorhud.value && !splitscreen && ((demo.playback && !camera[viewnum].freecam && (!demo.title || !modeattacking)) || !P_IsLocalPlayer(stplyr)) && !K_DirectorIsPlayerAlone()) + if (cv_showdirectorhud.value && !splitscreen && !P_IsLocalPlayer(stplyr) && K_DirectorIsAvailable(0) && !K_DirectorIsPlayerAlone()) { char directortext[20] = {0}; -- 2.54.0 From 03280db3778570e30258c9a758173299906cda13 Mon Sep 17 00:00:00 2001 From: Alug Date: Sat, 28 Dec 2024 18:52:49 +0100 Subject: [PATCH 05/12] missing inlucde --- src/st_stuff.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/st_stuff.c b/src/st_stuff.c index 5e536d853..3c15a4ff7 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -16,6 +16,7 @@ #include "doomdef.h" #include "g_game.h" #include "g_input.h" +#include "k_director.h" #include "r_local.h" #include "p_local.h" #include "f_finale.h" -- 2.54.0 From a379764076c068500f439a6c57cb7d3f4d1aeaf0 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 05:32:51 +0100 Subject: [PATCH 06/12] fix director toggling + smol cleanup --- src/k_director.c | 27 ++++----------------------- src/st_stuff.c | 8 +------- 2 files changed, 5 insertions(+), 30 deletions(-) diff --git a/src/k_director.c b/src/k_director.c index 6de578f5f..c35d10036 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -76,12 +76,12 @@ boolean K_DirectorIsAvailable(UINT8 viewnum) { if ((demo.playback && demo.title) || modeattacking) return false; - return ((gamestate == GS_LEVEL) && (viewnum <= splitscreen) && (!playeringame[displayplayers[viewnum]] || players[displayplayers[viewnum]].spectator) && !camera[viewnum].freecam); + return ((gamestate == GS_LEVEL) && (demo.playback || ((viewnum <= splitscreen) && (!playeringame[displayplayers[viewnum]] || players[displayplayers[viewnum]].spectator) && !camera[viewnum].freecam && !K_DirectorIsPlayerAlone()))); } static boolean K_DirectorIsEnabled(const UINT8 viewnum) { - return (cv_director[viewnum].value && K_DirectorIsAvailable(viewnum) && !K_DirectorIsPlayerAlone()); + return (cv_director[viewnum].value && K_DirectorIsAvailable(viewnum)); } void K_InitDirector(void) @@ -438,10 +438,7 @@ void K_UpdateDirector(const UINT8 viewnum) void K_ToggleDirector(const UINT8 viewnum) { - //if (!directortextactive) - //return; - - if (K_DirectorIsAvailable(viewnum)) + if (!K_DirectorIsAvailable(viewnum)) return; if (!K_DirectorIsEnabled(viewnum)) @@ -451,21 +448,5 @@ void K_ToggleDirector(const UINT8 viewnum) directortoggletimer = 0; - switch (viewnum) - { - case 1: - COM_ImmedExecute("add director2 1"); - break; - case 2: - COM_ImmedExecute("add director3 1"); - break; - case 3: - COM_ImmedExecute("add director4 1"); - break; - case 0: - COM_ImmedExecute("add director 1"); - break; - default: - break; - } + CV_SetValue(&cv_director[viewnum], (cv_director[viewnum].value ^ 1)); } diff --git a/src/st_stuff.c b/src/st_stuff.c index 3c15a4ff7..26a38b177 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -157,8 +157,6 @@ static patch_t *envelope; player_t *stplyr; UINT8 stplyrnum; -boolean directortextactive = false; - // SRB2kart hudinfo_t hudinfo[NUMHUDITEMS] = @@ -668,14 +666,13 @@ static void ST_overlayDrawer(void) if (!hu_showscores) // hide the following if TAB is held { + // TODO: splitscreen support! if (cv_showdirectorhud.value && !splitscreen && !P_IsLocalPlayer(stplyr) && K_DirectorIsAvailable(0) && !K_DirectorIsPlayerAlone()) { char directortext[20] = {0}; snprintf(directortext, 20, "Director: %s", cv_director[0].value ? "On" : "Off"); - //directortextactive = true; - if ((!demo.playback && directortoggletimer < 13*TICRATE) || (demo.playback && directortoggletimer < 4*TICRATE)) { if (renderisnewtic) @@ -690,7 +687,6 @@ static void ST_overlayDrawer(void) else { directortoggletimer = 0; - //directortextactive = false; } if (cv_showviewpointtext.value) @@ -794,8 +790,6 @@ static void ST_overlayDrawer(void) snprintf(directortoggle, 32, "%s - Toggle Director", item1 != NULL ? item1 : item2 != NULL ? item2 : "Not Bound"); V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, directortoggle); - - directortextactive = true; } else { -- 2.54.0 From 88536666458eb8589fc7d363e26b803ffbea9ff1 Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 05:42:21 +0100 Subject: [PATCH 07/12] track views in directorinfo structs should hopefully fix any potential remaining issues --- src/k_director.c | 69 +++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/src/k_director.c b/src/k_director.c index c35d10036..aae77baf9 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -31,6 +31,8 @@ struct directorinfo { + UINT8 viewnum; + player_t* viewplayer; tic_t cooldown; // how long has it been since we last switched? tic_t freeze; // when nonzero, fixed switch pending, freeze logic! INT32 attacker; // who to switch to when freeze delay elapses @@ -88,12 +90,15 @@ void K_InitDirector(void) { INT32 playernum; + directorinfo.viewnum = 0; + for (UINT8 i = 0; i < MAXSPLITSCREENPLAYERS; i++) { directorinfosplit[i].cooldown = SWITCHTIME; directorinfosplit[i].freeze = 0; directorinfosplit[i].attacker = 0; directorinfosplit[i].maxdist = 0; + directorinfosplit[i].viewplayer = NULL; for (playernum = 0; playernum < MAXPLAYERS; playernum++) { @@ -119,8 +124,8 @@ static fixed_t K_GetDistanceToFinish(player_t player) continue; dist = P_AproxDistance(P_AproxDistance(mo->x - player.mo->x, - mo->y - player.mo->y), - mo->z - player.mo->z) / FRACUNIT; + mo->y - player.mo->y), + mo->z - player.mo->z) / FRACUNIT; break; } @@ -139,7 +144,7 @@ static fixed_t K_GetDistanceToFinish(player_t player) dist = P_AproxDistance(P_AproxDistance(mo->x - player.mo->x, mo->y - player.mo->y), - mo->z - player.mo->z) / FRACUNIT; + mo->z - player.mo->z) / FRACUNIT; break; } @@ -258,26 +263,25 @@ static void K_DirectorForceSwitch(INT32 player, INT32 time, const UINT8 viewnum) directorinfosplit[viewnum].freeze = time; } -// HACK: this is awful but idk any other way to pass the viewnum to this -static UINT8 curview = 0; - void K_DirectorFollowAttack(player_t *player, mobj_t *inflictor, mobj_t *source) { - if (player != &players[displayplayers[curview]]) + if (!K_DirectorIsEnabled(directorinfo.viewnum)) + { return; + } - if (!K_DirectorIsEnabled(curview)) + if (directorinfosplit[directorinfo.viewnum].viewplayer != player) { return; } if (inflictor && inflictor->player) { - K_DirectorForceSwitch(inflictor->player - players, TRANSFERTIME, curview); + K_DirectorForceSwitch(inflictor->player - players, TRANSFERTIME, directorinfo.viewnum); } else if (source && source->player) { - K_DirectorForceSwitch(source->player - players, TRANSFERTIME, curview); + K_DirectorForceSwitch(source->player - players, TRANSFERTIME, directorinfo.viewnum); } } @@ -335,37 +339,36 @@ void K_DrawDirectorDebugger(void) void K_UpdateDirector(const UINT8 viewnum) { - INT32 *displayplayerp = &displayplayers[viewnum]; INT32 targetposition; + directorinfo.viewnum = viewnum; + directorinfosplit[directorinfo.viewnum].viewplayer = &players[displayplayers[directorinfo.viewnum]]; - curview = viewnum; - - if (!K_DirectorIsEnabled(viewnum)) + if (!K_DirectorIsEnabled(directorinfo.viewnum)) { return; } - K_UpdateDirectorPositions(viewnum); + K_UpdateDirectorPositions(directorinfo.viewnum); - if (directorinfosplit[viewnum].cooldown > 0) { - directorinfosplit[viewnum].cooldown--; + if (directorinfosplit[directorinfo.viewnum].cooldown > 0) { + directorinfosplit[directorinfo.viewnum].cooldown--; } // handle pending forced switches - if (directorinfosplit[viewnum].freeze > 0) + if (directorinfosplit[directorinfo.viewnum].freeze > 0) { - if (!(--directorinfosplit[viewnum].freeze)) - K_DirectorSwitch(directorinfosplit[viewnum].attacker, true, viewnum); + if (!(--directorinfosplit[directorinfo.viewnum].freeze)) + K_DirectorSwitch(directorinfosplit[directorinfo.viewnum].attacker, true, directorinfo.viewnum); return; } // if there's only one player left in the list, just switch to that player - if (directorinfosplit[viewnum].sortedplayers[0] != -1 && (directorinfosplit[viewnum].sortedplayers[1] == -1 || + if (directorinfosplit[directorinfo.viewnum].sortedplayers[0] != -1 && (directorinfosplit[directorinfo.viewnum].sortedplayers[1] == -1 || // TODO: Battle; I just threw this together quick. Focus on leader. !race_rules())) { - K_DirectorSwitch(directorinfosplit[viewnum].sortedplayers[0], false, viewnum); + K_DirectorSwitch(directorinfosplit[directorinfo.viewnum].sortedplayers[0], false, directorinfo.viewnum); return; } @@ -377,39 +380,39 @@ void K_UpdateDirector(const UINT8 viewnum) INT32 target; // you are out of players, try again - if (directorinfosplit[viewnum].sortedplayers[targetposition] == -1) + if (directorinfosplit[directorinfo.viewnum].sortedplayers[targetposition] == -1) { break; } // pair too far apart? try the next one - if (directorinfosplit[viewnum].boredom[targetposition - 1] >= BOREDOMTIME) + if (directorinfosplit[directorinfo.viewnum].boredom[targetposition - 1] >= BOREDOMTIME) { continue; } // pair finished? try the next one - if (players[directorinfosplit[viewnum].sortedplayers[targetposition]].exiting) + if (players[directorinfosplit[directorinfo.viewnum].sortedplayers[targetposition]].exiting) { continue; } // don't risk switching away from forward pairs at race end, might miss something! - if (directorinfosplit[viewnum].maxdist > PINCHDIST) + if (directorinfosplit[directorinfo.viewnum].maxdist > PINCHDIST) { // if the "next" player is close enough, they should be able to see everyone fine! // walk back through the standings to find a vantage that gets everyone in frame. // (also creates a pretty cool effect w/ overtakes at speed) - while (targetposition < MAXPLAYERS && directorinfosplit[viewnum].gap[targetposition] < WALKBACKDIST) + while (targetposition < MAXPLAYERS && directorinfosplit[directorinfo.viewnum].gap[targetposition] < WALKBACKDIST) { targetposition++; } } - target = directorinfosplit[viewnum].sortedplayers[targetposition]; + target = directorinfosplit[directorinfo.viewnum].sortedplayers[targetposition]; // stop here since we're already viewing this player - if (*displayplayerp == target) + if (displayplayers[directorinfo.viewnum] == target) { break; } @@ -423,13 +426,13 @@ void K_UpdateDirector(const UINT8 viewnum) // if we're certain the back half of the pair is actually in this position, try to switch if (!players[target].kartstuff[k_positiondelay]) { - K_DirectorSwitch(target, false, viewnum); + K_DirectorSwitch(target, false, directorinfo.viewnum); } - // even if we're not certain, if we're certain we're watching the WRONG player, try to switch - if (players[*displayplayerp].kartstuff[k_position] != targetposition+1 && !players[*displayplayerp].kartstuff[k_positiondelay]) + // even if we're not certain, if we're cetain we're watching the WRONG player, try to switch + if (directorinfosplit[directorinfo.viewnum].viewplayer->kartstuff[k_position] != targetposition+1 && !directorinfosplit[directorinfo.viewnum].viewplayer->kartstuff[k_positiondelay]) { - K_DirectorSwitch(target, false, viewnum); + K_DirectorSwitch(target, false, directorinfo.viewnum); } break; -- 2.54.0 From eef56a7c822a0af1af5799da2ace6495d72338ae Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 05:51:04 +0100 Subject: [PATCH 08/12] make debugdirector show stuff for p1 atleast --- src/k_director.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/k_director.c b/src/k_director.c index aae77baf9..a91221af8 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -301,14 +301,14 @@ void K_DrawDirectorDebugger(void) 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", directorinfo.cooldown)); - V_DrawThinString(230, 0, V_70TRANS, va("MAXDIST: %d", directorinfo.maxdist)); + V_DrawThinString(150, 0, V_70TRANS, va("COOLDOWN: %d", directorinfosplit[0].cooldown)); + V_DrawThinString(230, 0, V_70TRANS, va("MAXDIST: %d", directorinfosplit[0].maxdist)); for (position = 0; position < MAXPLAYERS - 1; position++) { ytxt = 10 * (position + 1); - leader = directorinfo.sortedplayers[position]; - follower = directorinfo.sortedplayers[position + 1]; + leader = directorinfosplit[0].sortedplayers[position]; + follower = directorinfosplit[0].sortedplayers[position + 1]; if (leader == -1 || follower == -1) break; @@ -321,15 +321,15 @@ void K_DrawDirectorDebugger(void) V_DrawThinString(40, ytxt, V_70TRANS, va("NG")); } - V_DrawThinString(80, ytxt, V_70TRANS, va("%d", directorinfo.gap[position])); + V_DrawThinString(80, ytxt, V_70TRANS, va("%d", directorinfosplit[0].gap[position])); - if (directorinfo.boredom[position] >= BOREDOMTIME) + if (directorinfosplit[0].boredom[position] >= BOREDOMTIME) { V_DrawThinString(120, ytxt, V_70TRANS, va("BORED")); } else { - V_DrawThinString(120, ytxt, V_70TRANS, va("%d", directorinfo.boredom[position])); + V_DrawThinString(120, ytxt, V_70TRANS, va("%d", directorinfosplit[0].boredom[position])); } V_DrawThinString(150, ytxt, V_70TRANS, va("%s", player_names[leader])); -- 2.54.0 From 97e6222176568d77e33ebaee72486711292d477e Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 06:02:35 +0100 Subject: [PATCH 09/12] make function to return button names to use with new rebindable cam controls --- src/st_stuff.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/st_stuff.c b/src/st_stuff.c index 26a38b177..00d5376ed 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -651,6 +651,20 @@ static void ST_drawLevelTitle(void) V_DrawLevelTitle(ttlnumxpos+12, bary+6, V_SNAPTOBOTTOM, actnum); } +static const char *ST_GetButtonName(INT32 control, const char *inputtext) +{ + static char buttname[32] = {0}; // Static buffer + const char *item1 = gamecontrol[control][0] != 0 ? G_KeynumToString(gamecontrol[control][0]) : NULL; + const char *item2 = gamecontrol[control][1] != 0 ? G_KeynumToString(gamecontrol[control][1]) : NULL; + + if (item1 != NULL && item2 != NULL) + snprintf(buttname, 32, "%s/%s - %s", item1, item2, inputtext); + else + snprintf(buttname, 32, "%s - %s", item1 != NULL ? item1 : item2 != NULL ? item2 : "Not Bound", inputtext); + + return buttname; +} + // Draw the status bar overlay, customisable: the user chooses which // kind of information to overlay // @@ -777,26 +791,16 @@ static void ST_overlayDrawer(void) { V_DrawString(2, BASEVIDHEIGHT-50, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); V_DrawString(2, BASEVIDHEIGHT-40, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, itemtxt); - V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, M_GetText("Accelerate - Float")); - V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, M_GetText("Brake - Sink")); - - char directortoggle[32] = {0}; - const char *item1 = gamecontrol[gc_director][0] != 0 ? G_KeynumToString(gamecontrol[gc_director][0]) : NULL; - const char *item2 = gamecontrol[gc_director][1] != 0 ? G_KeynumToString(gamecontrol[gc_director][1]) : NULL; - - if (item1 != NULL && item2 != NULL) - snprintf(directortoggle, 32, "%s/%s - Toggle Director", item1, item2); - else - snprintf(directortoggle, 32, "%s - Toggle Director", item1 != NULL ? item1 : item2 != NULL ? item2 : "Not Bound"); - - V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, directortoggle); + V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camfloat, "Float")); + V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camsink, "Sink")); + V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_director, "Toggle Director")); } else { V_DrawString(2, BASEVIDHEIGHT-40, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF|V_YELLOWMAP, M_GetText("- SPECTATING -")); V_DrawString(2, BASEVIDHEIGHT-30, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, itemtxt); - V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, M_GetText("Accelerate - Float")); - V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, M_GetText("Brake - Sink")); + V_DrawString(2, BASEVIDHEIGHT-20, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camfloat, "Float")); + V_DrawString(2, BASEVIDHEIGHT-10, V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_HUDTRANSHALF, ST_GetButtonName(gc_camsink, "Sink")); } } } -- 2.54.0 From bb3f9b5882a1133b0494c945e020e782879e498b Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 16:51:07 +0100 Subject: [PATCH 10/12] fix wrong cam default controls --- src/g_input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/g_input.c b/src/g_input.c index 606f20770..b99874b8d 100644 --- a/src/g_input.c +++ b/src/g_input.c @@ -1143,8 +1143,8 @@ void G_Controldefault(UINT8 player) gamecontrol[gc_talkkey ][1] = KEY_HAT1+1; // D-Pad Down gamecontrol[gc_scores ][1] = KEY_HAT1+0; // D-Pad Up - gamecontrol[gc_camfloat ][1] = 'a'; - gamecontrol[gc_camsink ][1] = 'd'; + gamecontrol[gc_camfloat ][0] = 'a'; + gamecontrol[gc_camsink ][0] = 'd'; gamecontrol[gc_camfloat ][1] = KEY_JOY1+0; // A gamecontrol[gc_camsink ][1] = KEY_JOY1+1; // B -- 2.54.0 From cd4bdde67cd575cccf9b7c7fe8ff8703e392a01f Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 19:33:50 +0100 Subject: [PATCH 11/12] remove this turning off director director will only work when in spec anyways --- src/g_game.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 5c25adaf2..c8ca9c4eb 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1209,9 +1209,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer) { displayplayers[0] = consoleplayer; G_FixCamera(1); - // i dont like this lmao - if (cv_director[0].value) - CV_SetValue(&cv_director[0], 0); } } -- 2.54.0 From f2b9077f5a0194bc154f9aae8ccc5bb1ea1a1d4c Mon Sep 17 00:00:00 2001 From: Alug Date: Sun, 29 Dec 2024 20:00:35 +0100 Subject: [PATCH 12/12] no need to check for all this crap --- src/k_director.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_director.c b/src/k_director.c index a91221af8..ef4e2975d 100644 --- a/src/k_director.c +++ b/src/k_director.c @@ -78,7 +78,7 @@ boolean K_DirectorIsAvailable(UINT8 viewnum) { if ((demo.playback && demo.title) || modeattacking) return false; - return ((gamestate == GS_LEVEL) && (demo.playback || ((viewnum <= splitscreen) && (!playeringame[displayplayers[viewnum]] || players[displayplayers[viewnum]].spectator) && !camera[viewnum].freecam && !K_DirectorIsPlayerAlone()))); + return ((gamestate == GS_LEVEL) && (viewnum <= splitscreen) && (demo.playback || (players[displayplayers[viewnum]].spectator && !K_DirectorIsPlayerAlone()))); } static boolean K_DirectorIsEnabled(const UINT8 viewnum) -- 2.54.0