diff --git a/src/d_netcmd.c b/src/d_netcmd.c index e9d30437f..5d3ad62d7 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -73,6 +73,7 @@ #include "k_bans.h" #include "k_director.h" #include "k_credits.h" +#include "k_hud.h" // K_AddMessage #ifdef SRB2_CONFIG_ENABLE_WEBM_MOVIES #include "m_avrecorder.h" @@ -180,6 +181,8 @@ static void Command_Archivetest_f(void); static void Command_KartGiveItem_f(void); +static void Command_DebugMessageFeed(void); + static void Command_Schedule_Add(void); static void Command_Schedule_Clear(void); static void Command_Schedule_List(void); @@ -434,6 +437,8 @@ void D_RegisterServerCommands(void) COM_AddDebugCommand("give3", Command_KartGiveItem_f); COM_AddDebugCommand("give4", Command_KartGiveItem_f); + COM_AddDebugCommand("debugmessagefeed", Command_DebugMessageFeed); + COM_AddCommand("schedule_add", Command_Schedule_Add); COM_AddCommand("schedule_clear", Command_Schedule_Clear); COM_AddCommand("schedule_list", Command_Schedule_List); @@ -6369,6 +6374,11 @@ static void Command_Archivetest_f(void) } #endif +static void Command_DebugMessageFeed(void) +{ + K_AddMessage("Hello world! A = , Right = ", true, false); +} + /** Give yourself an, optional quantity or one of, an item. */ static void Command_KartGiveItem_f(void) diff --git a/src/k_hud.cpp b/src/k_hud.cpp index bba3d1d9b..762e35683 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -7204,17 +7204,19 @@ static std::vector messagestates{MAXSPLITSCREENPLAYERS}; void K_AddMessage(const char *msg, boolean interrupt, boolean persist) { - for (auto &state : messagestates) + for (UINT8 i = 0; i <= r_splitscreen; i++) { - if (interrupt) - state.clear(); + messagestate_t *state = &messagestates[i]; - std::string parsedmsg = srb2::Draw::TextElement().parse(msg).string(); + if (interrupt) + state->clear(); + + std::string parsedmsg = srb2::Draw::TextElement().as(g_localplayers[i]).parse(msg).string(); if (persist) - state.objective = parsedmsg; + state->objective = parsedmsg; else - state.add(parsedmsg); + state->add(parsedmsg); } } diff --git a/src/k_tally.cpp b/src/k_tally.cpp index 11c07f8ff..fd407e360 100644 --- a/src/k_tally.cpp +++ b/src/k_tally.cpp @@ -37,6 +37,7 @@ #include "g_party.h" #include "g_input.h" #include "k_objects.h" +#include "k_director.h" boolean level_tally_t::UseBonuses(void) { @@ -781,6 +782,24 @@ void level_tally_t::Tick(void) return; } + if (done == true) + { + if (directorWait < TALLY_DIRECTOR_TIME) + { + directorWait++; + + if (directorWait == TALLY_DIRECTOR_TIME && G_IsPartyLocal(owner - players) == true) + { + // Finished tally, go to director while we wait for others to finish. + K_ToggleDirector(G_PartyPosition(owner - players), true); + } + } + } + else + { + directorWait = 0; + } + if (transition < FRACUNIT) { if (transitionTime <= 0) diff --git a/src/k_tally.h b/src/k_tally.h index 335a74979..6ae04ca14 100644 --- a/src/k_tally.h +++ b/src/k_tally.h @@ -57,6 +57,8 @@ typedef enum TALLY_ST_GAMEOVER_DONE, } tally_state_e; +#define TALLY_DIRECTOR_TIME (4 * TICRATE) + struct level_tally_t { boolean active; @@ -97,6 +99,7 @@ struct level_tally_t boolean showGrade; boolean done; boolean releasedFastForward; + INT32 directorWait; #ifdef __cplusplus boolean UseBonuses(void); diff --git a/src/v_draw.cpp b/src/v_draw.cpp index f8fe7df9c..b21e89448 100644 --- a/src/v_draw.cpp +++ b/src/v_draw.cpp @@ -22,6 +22,7 @@ #include "z_zone.h" #include "k_profiles.h" // controls #include "p_local.h" // stplyr +#include "r_fps.h" // R_GetViewNumber() using srb2::Draw; using Chain = Draw::Chain; @@ -176,17 +177,22 @@ Draw::TextElement& Draw::TextElement::parse(std::string_view raw) else if (auto it = translation.find(code); it != translation.end()) // This represents a gamecontrol, turn into Saturn button or generic button. { - UINT8 localplayer = 0; - UINT8 indexedplayer = as_.value_or(stplyr - players); - for (UINT8 i = 0; i < MAXSPLITSCREENPLAYERS; i++) + UINT8 localplayer = R_GetViewNumber(); + + if (as_.has_value()) { - if (g_localplayers[i] == indexedplayer) + UINT8 indexedplayer = as_.value(); + for (UINT8 i = 0; i < MAXSPLITSCREENPLAYERS; i++) { - localplayer = i; - break; + if (g_localplayers[i] == indexedplayer) + { + localplayer = i; + break; + } } } + // This isn't how v_video.cpp checks for buttons and I don't know why. if (cv_descriptiveinput[localplayer].value && ((it->second & 0xF0) != 0x80)) // Should we do game control translation? {