Skip to content

Commit

Permalink
Add "<sender>" support for "Speaker".
Browse files Browse the repository at this point in the history
  • Loading branch information
hzqst committed Feb 11, 2025
1 parent 3a10019 commit 3d102b3
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 69 deletions.
64 changes: 46 additions & 18 deletions Plugins/CaptionMod/SubtitlePanel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,6 @@
#include "SubtitlePanel.h"
#include "privatefuncs.h"

client_textmessage_t* GetCurrentTextMessage();

extern cvar_t* cap_subtitle_prefix;
extern cvar_t* cap_subtitle_waitplay;
extern cvar_t* cap_subtitle_antispam;
Expand Down Expand Up @@ -304,14 +302,14 @@ void CSubLine::Draw(int x, int w, int align)
surface()->DrawFlushText();
}

void SubtitlePanel::StartNextSubtitle(CDictionary *pDict)
void SubtitlePanel::StartNextSubtitle(CDictionary *pDict, const CStartSubtitleContext* pStartSubtitleContext)
{
//Check if there is a next dict to be played
auto pNextDict = pDict->m_pNext;

if(pNextDict)
if (pNextDict)
{
StartSubtitle(pNextDict, pDict->m_flDuration, g_pViewPort->GetCurTime() + pDict->m_flNextDelay);
StartSubtitle(pNextDict, pDict->m_flDuration, g_pViewPort->GetCurTime() + pDict->m_flNextDelay, pStartSubtitleContext);
}
}

Expand Down Expand Up @@ -382,10 +380,18 @@ void SubtitlePanel::StartLine(CSubLine *Line)
//Fade it now
Line->AlphaFade(255, cap_subtitle_fadein->value);

StartNextSubtitle(Line->m_Dict);
//Do we really need sender name here?
CStartSubtitleContext StartSubtitleContext;

if (Line->m_bHasSenderName)
{
StartSubtitleContext.m_pszSenderName = Line->m_SenderName.c_str();
}

StartNextSubtitle(Line->m_Dict, &StartSubtitleContext);
}

CSubLine* SubtitlePanel::AddLine(CDictionary *Dict, wchar_t *wszSentence, int nLength, float flStartTime, float flDuration, int nTextWide)
CSubLine* SubtitlePanel::AddLine(CDictionary *Dict, const CStartSubtitleContext* pStartSubtitleContext, const wchar_t *wszSentence, int nLength, float flStartTime, float flDuration, int nTextWide)
{
CSubLine *Line = new CSubLine(this, Dict);
m_BackLines[m_BackLines.AddToTail()] = Line;
Expand All @@ -398,9 +404,13 @@ CSubLine* SubtitlePanel::AddLine(CDictionary *Dict, wchar_t *wszSentence, int nL
Line->m_Duration = flDuration;
Line->m_Color = Dict->m_Color;

if (Dict->m_bDefaultColor && GetCurrentTextMessage())
if (Dict->m_bDefaultColor && pStartSubtitleContext->m_pCurrentTextMessage)
{
Line->m_Color = Color(GetCurrentTextMessage()->r1, GetCurrentTextMessage()->g1, GetCurrentTextMessage()->b1, GetCurrentTextMessage()->a1);
Line->m_Color = Color(
pStartSubtitleContext->m_pCurrentTextMessage->r1,
pStartSubtitleContext->m_pCurrentTextMessage->g1,
pStartSubtitleContext->m_pCurrentTextMessage->b1,
pStartSubtitleContext->m_pCurrentTextMessage->a1);
}

Line->m_Alpha = 0;
Expand All @@ -409,6 +419,12 @@ CSubLine* SubtitlePanel::AddLine(CDictionary *Dict, wchar_t *wszSentence, int nL
Line->m_FadeOut = cap_subtitle_fadeout->value;
Line->m_TextAlign = Dict->m_iTextAlign ? Dict->m_iTextAlign : m_iTextAlign;

if (pStartSubtitleContext->m_pszSenderName)
{
Line->m_bHasSenderName = true;
Line->m_SenderName = pStartSubtitleContext->m_pszSenderName;
}

return Line;
}

Expand All @@ -418,7 +434,7 @@ static bool IsNonBreakableCharacter(wchar_t ch)
}

//2015-11-26 added htimescale for SubtitlePanel
void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, float flStartTime)
void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, float flStartTime, const CStartSubtitleContext* pStartSubtitleContext)
{
//Delay the current line till the last backline plays
float flLatestStart = 0;
Expand Down Expand Up @@ -449,15 +465,23 @@ void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, flo
}
}

std::wstring sentence;
std::wstring speakerName;
std::wstring fullSentence;

pDict->ProcessString(pDict->m_szSentence, pStartSubtitleContext, fullSentence);

pDict->FinalizeString(sentence, (cap_subtitle_prefix->value >= 1.0f) ? true : false);
if (cap_subtitle_prefix->value >= 1.0f)
{
pDict->ProcessString(pDict->m_szSpeaker, pStartSubtitleContext, speakerName);

fullSentence = speakerName + fullSentence;
}

int iPanelWidth = GetWide();
int iMaxTextWidth = iPanelWidth - (m_iScaledXSpace << 1);

wchar_t szBuf[4096];
wchar_t *pStart = &sentence[0];
wchar_t *pStart = &fullSentence[0];
wchar_t *p = pStart;

if(!pStart[0])
Expand Down Expand Up @@ -491,15 +515,19 @@ void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, flo
if(flDuration <= 0)
flDuration = 4.0f;

if (!pDict->m_bOverrideDuration && GetCurrentTextMessage())
if (!pDict->m_bOverrideDuration && pStartSubtitleContext->m_pCurrentTextMessage)
{
if (GetCurrentTextMessage()->effect == 2 && GetCurrentTextMessage()->pMessage)
if (pStartSubtitleContext->m_pCurrentTextMessage->effect == 2 &&
pStartSubtitleContext->m_pCurrentTextMessage->pMessage)
{
flDuration = (GetCurrentTextMessage()->fadein * sentence.length() ) + GetCurrentTextMessage()->fadeout + GetCurrentTextMessage()->holdtime;
flDuration = (pStartSubtitleContext->m_pCurrentTextMessage->fadein * fullSentence.length() ) +
pStartSubtitleContext->m_pCurrentTextMessage->fadeout + pStartSubtitleContext->m_pCurrentTextMessage->holdtime;
}
else
{
flDuration = GetCurrentTextMessage()->holdtime + GetCurrentTextMessage()->fadein + GetCurrentTextMessage()->fadeout;
flDuration = pStartSubtitleContext->m_pCurrentTextMessage->holdtime +
pStartSubtitleContext->m_pCurrentTextMessage->fadein +
pStartSubtitleContext->m_pCurrentTextMessage->fadeout;
}
}

Expand Down Expand Up @@ -600,7 +628,7 @@ void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, flo
else//real duration = original starttime - real starttime + original duration
flRealDuration = max(flStartTime + flCalcStartTime - flRealStartTime, 0) + flCalcDuration;

pAddedLine = AddLine(pDict, pStart, nCharNum, flRealStartTime, flRealDuration, nWide);
pAddedLine = AddLine(pDict, pStartSubtitleContext, pStart, nCharNum, flRealStartTime, flRealDuration, nWide);

//Skip CRLF
while (*p == L'\r' || *p == L'\n')
Expand Down
13 changes: 10 additions & 3 deletions Plugins/CaptionMod/SubtitlePanel.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ class CSubLine
m_Dict = Dict;
m_TextWide = 0;
m_TextAlign = ALIGN_DEFAULT;
m_bHasSenderName = false;
}
virtual ~CSubLine()
{
Expand Down Expand Up @@ -130,6 +131,8 @@ class CSubLine
CDictionary *m_Dict;//Linked dictionary
int m_TextWide;
textalign_t m_TextAlign;
bool m_bHasSenderName;
std::string m_SenderName;
};

class SubtitlePanel : public vgui::EditablePanel
Expand All @@ -143,16 +146,20 @@ class SubtitlePanel : public vgui::EditablePanel
void VidInit(void);
void ConnectToServer(const char* game, int IP, int port);
void AdjustClock(double flAdjustment);

public://Subtitle interface
void StartSubtitle(CDictionary * pDict, float flDurationTime, float flStartTime);
void StartNextSubtitle(CDictionary *pDict);
CSubLine* AddLine(CDictionary *Dict, wchar_t *wszSentence, int nLength, float flStartTime, float flDuration, int nTextLength);

void StartSubtitle(CDictionary * pDict, float flDurationTime, float flStartTime, const CStartSubtitleContext * pStartSubtitleContext);
void StartNextSubtitle(CDictionary *pDict, const CStartSubtitleContext* pStartSubtitleContext);

CSubLine* AddLine(CDictionary *Dict, const CStartSubtitleContext* pStartSubtitleContext, const wchar_t *wszSentence, int nLength, float flStartTime, float flDuration, int nTextLength);
void StartLine(CSubLine *Line);
void ClearSubtitle(void);
#if 0
void QuerySubtitlePanelVars(SubtitlePanelVars_t *vars);
void UpdateSubtitlePanelVars(SubtitlePanelVars_t *vars);
#endif

protected:
virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
virtual void PaintBackground(void);
Expand Down
35 changes: 15 additions & 20 deletions Plugins/CaptionMod/Viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -759,19 +759,19 @@ void CViewport::LoadBaseDictionary(void)
gEngfuncs.Con_Printf("LoadBaseDictionary: %d lines are loaded.\n", nRowCount - 1);
}

const char* GetSenderName();
//const char* GetSenderName();

//KeyBinding Name(jump) -> Key Name(SPACE)
const char *PrimaryKey_ForBinding(const char *binding)
const char *PrimaryKey_ForBinding(const CStartSubtitleContext* pStartSubtitleContext, const char *binding)
{
if(binding[0] == '+')
binding ++;

if (!strcmp(binding, "sender") && GetSenderName())
if (!strcmp(binding, "sender") && pStartSubtitleContext->m_pszSenderName)
{
return GetSenderName();
return pStartSubtitleContext->m_pszSenderName;
}

if(binding[0] == '+')
binding ++;

for (int i = 255; i >= 0; --i)
{
const char *found = gameuifuncs->Key_BindingForKey(i);
Expand All @@ -793,9 +793,9 @@ const char *PrimaryKey_ForBinding(const char *binding)
return "<not bound>";
}

void CDictionary::FinalizeString(std::wstring &output, bool bPrefix)
void CDictionary::ProcessString(const std::wstring& input, const CStartSubtitleContext* pStartSubtitleContext, std::wstring& output)
{
auto finalize = m_szSentence;
auto finalize = input;

static std::wregex pattern(L"(<([A-Za-z_]+)>)");
std::wsmatch result;
Expand All @@ -813,8 +813,8 @@ void CDictionary::FinalizeString(std::wstring &output, bool bPrefix)
auto wkeybind = result[2].str();

char akeybind[256] = {0};
g_pVGuiLocalize->ConvertUnicodeToANSI(wkeybind.c_str(), akeybind, sizeof(akeybind) - 1);
const char *pszBinding = PrimaryKey_ForBinding(akeybind);
localize()->ConvertUnicodeToANSI(wkeybind.c_str(), akeybind, sizeof(akeybind) - 1);
const char *pszBinding = PrimaryKey_ForBinding(pStartSubtitleContext, akeybind);

if (pszBinding)
{
Expand Down Expand Up @@ -842,11 +842,6 @@ void CDictionary::FinalizeString(std::wstring &output, bool bPrefix)

searchStart = result.suffix().first;
}

if(bPrefix)
output = m_szSpeaker + finalize;
else
output = finalize;
}

void CViewport::Start(void)
Expand Down Expand Up @@ -899,17 +894,17 @@ void CViewport::Init(void)
m_HudMenu.Init();
}

void CViewport::StartSubtitle(CDictionary *dict, float flDurationTime)
void CViewport::StartSubtitle(CDictionary *dict, float flDurationTime, const CStartSubtitleContext* pStartSubtitleContext)
{
if (cap_enabled && cap_enabled->value) {
m_pSubtitlePanel->StartSubtitle(dict, flDurationTime, g_pViewPort->GetCurTime());
m_pSubtitlePanel->StartSubtitle(dict, flDurationTime, g_pViewPort->GetCurTime(), pStartSubtitleContext);
}
}

void CViewport::StartNextSubtitle(CDictionary* dict)
void CViewport::StartNextSubtitle(CDictionary* dict, const CStartSubtitleContext* pStartSubtitleContext)
{
if (cap_enabled && cap_enabled->value) {
m_pSubtitlePanel->StartNextSubtitle(dict);
m_pSubtitlePanel->StartNextSubtitle(dict, pStartSubtitleContext);
}
}

Expand Down
20 changes: 17 additions & 3 deletions Plugins/CaptionMod/Viewport.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,14 +57,28 @@ typedef struct QuerySubtitlePanelVars_s
float m_flHoldTimeScale;
}SubtitlePanelVars_t;

class CStartSubtitleContext
{
public:
CStartSubtitleContext()
{
m_pszSenderName = nullptr;
m_pCurrentTextMessage = nullptr;
}


const char* m_pszSenderName;
client_textmessage_t* m_pCurrentTextMessage;
};

class CDictionary
{
public:
CDictionary();
virtual ~CDictionary();

void Load(CSV::CSVDocument::row_type &row, Color &defaultColor, vgui::IScheme *ischeme);
void FinalizeString(std::wstring &output, bool iPrefix);
void ProcessString(const std::wstring& input, const CStartSubtitleContext* pStartSubtitleContext, std::wstring& output);

dict_t m_Type;
std::string m_szTitle;
Expand Down Expand Up @@ -121,8 +135,8 @@ class CViewport : public vgui::Panel
void LinkDictionary(void);

//Subtitle Interface
void StartSubtitle(CDictionary *dict, float flDurationTime);
void StartNextSubtitle(CDictionary *dict);
void StartSubtitle(CDictionary *dict, float flDurationTime, const CStartSubtitleContext* pStartSubtitleContext);
void StartNextSubtitle(CDictionary *dict, const CStartSubtitleContext* pStartSubtitleContext);

//Dictionary Hashtable
CDictionary *FindDictionary(const char *szValue);
Expand Down
16 changes: 12 additions & 4 deletions Plugins/CaptionMod/exportfuncs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,9 @@ void S_StartWave(sfx_t *sfx, float distance, float avol)
duration = S_GetDuration(sfx);
}

g_pViewPort->StartSubtitle(pDict, duration);
CStartSubtitleContext StartSubtitleContext;

g_pViewPort->StartSubtitle(pDict, duration, &StartSubtitleContext);
}

static char szsentences[] = "sound/sentences.txt";
Expand Down Expand Up @@ -653,7 +655,9 @@ bool S_StartSentence(const char *name, float distance, float avol)
});
}

g_pViewPort->StartSubtitle(pDict, duration);
CStartSubtitleContext StartSubtitleContext;

g_pViewPort->StartSubtitle(pDict, duration, &StartSubtitleContext);

return true;
}
Expand Down Expand Up @@ -798,7 +802,9 @@ bool ScClient_StartSentence(const char* name, float distance, float avol)
#endif
}

g_pViewPort->StartSubtitle(pDict, duration);
CStartSubtitleContext StartSubtitleContext;

g_pViewPort->StartSubtitle(pDict, duration, &StartSubtitleContext);

return true;
}
Expand Down Expand Up @@ -853,7 +859,9 @@ void ScClient_StartWave(const char* name, float distance, float avol, int ms_dur
duration = ms_duration / 1000.0f;
}

g_pViewPort->StartSubtitle(pDict, duration);
CStartSubtitleContext StartSubtitleContext;

g_pViewPort->StartSubtitle(pDict, duration, &StartSubtitleContext);
}

void __fastcall ScClient_SoundEngine_PlayFMODSound(void* pSoundEngine, int, int flags, int entindex, float* origin, int channel, const char* name, float fvol, float attenuation, int extraflags, int pitch, int sentenceIndex, float soundLength)
Expand Down
Loading

0 comments on commit 3d102b3

Please sign in to comment.