diff --git a/src/k_hud.cpp b/src/k_hud.cpp index b71d5a8f6..077cf8d9c 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include "v_draw.hpp" @@ -5607,6 +5608,104 @@ static void K_DrawGPRankDebugger(void) va(" ** FINAL GRADE: %c", gradeChar)); } +typedef enum +{ + MM_IN, + MM_HOLD, + MM_OUT, +} messagemode_t; + +typedef struct +{ + std::string text; + sfxenum_t sound; +} message_t; + +static std::deque messages = {"Reflected!", "Get the UFO!", "Worm Bagged", "GOTTEM", "Spectator to die why?", ":ubiktune:", "Barrier closing!"}; +static tic_t messagetimer = 0; +static messagemode_t messagemode = MM_IN; + +static tic_t speedyswitch = 2*TICRATE; +static tic_t lazyswitch = 4*TICRATE; + +void K_AddMessage(char *msg, boolean interrupt) +{ + messages.push_back(msg); +} + +void K_TickMessages() +{ + if (messages.size() == 0) + return; + + if (messagetimer == 0 && messagemode == MM_IN) + S_StartSound(NULL, sfx_cdfm15); + + messagetimer++; + + switch (messagemode) + { + case MM_IN: + if (messagetimer > messages[0].length()) + { + messagemode = MM_HOLD; + messagetimer = 0; + } + break; + case MM_HOLD: + if (messages.size() > 1 && messagetimer > speedyswitch) // Waiting message, switch to it right away! + { + messagemode = MM_IN; + messagetimer = 0; + messages.pop_front(); + } + else if (messagetimer > lazyswitch) // If there's no pending message, we can chill for a bit. + { + messagemode = MM_OUT; + messagetimer = 0; + } + break; + case MM_OUT: + if (messagetimer > messages[0].length()) + { + messagemode = MM_IN; + messagetimer = 0; + messages.pop_front(); + } + break; + } +} + +static void K_DrawMessageFeed(void) +{ + if (messages.size() == 0) + return; + + std::string msg = messages[0]; + + UINT8 sublen = messagetimer; + if (messagemode == MM_IN) + sublen = messagetimer; + else if (messagemode == MM_HOLD) + sublen = msg.length(); + else if (messagemode == MM_OUT) + sublen = msg.length() - messagetimer; + + std::string submsg = msg.substr(0, sublen); + + using srb2::Draw; + + Draw::TextElement text(submsg); + text.font(Draw::Font::kMenu); + + UINT8 x = 160; + UINT8 y = 10; + UINT8 sw = text.width(); + + K_DrawSticker(x - sw/2, y, sw, 0, true); + Draw(x, y).align(Draw::Align::kCenter).text(text); +} + void K_drawKartHUD(void) { boolean islonesome = false; @@ -5900,6 +5999,7 @@ void K_drawKartHUD(void) K_DrawBotDebugger(); K_DrawDirectorDebugger(); K_DrawGPRankDebugger(); + K_DrawMessageFeed(); } void K_DrawSticker(INT32 x, INT32 y, INT32 width, INT32 flags, boolean isSmall) diff --git a/src/k_hud.h b/src/k_hud.h index 2f1096965..20bd238e0 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -93,6 +93,9 @@ extern patch_t *kp_button_left[2]; extern patch_t *kp_eggnum[6]; extern patch_t *kp_facenum[MAXPLAYERS+1]; +void K_AddMessage(char *msg, boolean interrupt); +void K_TickMessages(void); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/p_tick.c b/src/p_tick.c index d8e26624f..c8bb7c4ec 100644 --- a/src/p_tick.c +++ b/src/p_tick.c @@ -47,6 +47,7 @@ #include "music.h" #include "k_dialogue.h" #include "m_easing.h" +#include "k_hud.h" // messagetimer #include "lua_profile.h" @@ -1203,6 +1204,7 @@ void P_Ticker(boolean run) if (run && !levelloading && leveltime) { K_TickDialogue(); + K_TickMessages(); } LUA_HOOK(PostThinkFrame);