Files
Leviathan/Client/Game/game/Interface/Arena/SUIMsgControlPenaltyCustomizer.cpp
T
2026-06-01 12:46:52 +02:00

131 lines
3.4 KiB
C++

#include "stdafx.h"
#include "SUIMsgControlPenaltyCustomizer.h"
#include <toolkit/XStringUtil.h>
#include "SStringDB.h"
cMsgControlPenaltyCustomizer::cMsgControlPenaltyCustomizer() : m_wndBlockTime(NULL),
m_wndPenaltyCount(NULL),
m_wndPenaltyCountTime(NULL),
m_blockTime(0.0f),
m_time(0)
{
}
void cMsgControlPenaltyCustomizer::customizing()
{
assert(!m_msgControl && "m_msgControl of the penalty msg box is null");
KUIWnd* wndMsg = m_msgControl->GetChild(m_msgControl->getMsgControlId());
assert(!wndMsg && "msg control of the penalty msg box is null");
std::string caption;
// block time
caption = convertTimeToString(m_blockTime, 2484);
m_wndBlockTime = m_msgControl->addStatic("staticBlockTime", caption.c_str());
/// 중복 퇴장 페널티일 때만 페널티 카운트를 출력해 준다
if (2 <= m_penaltyCount)
{
/// penalty count
caption = "<hcenter>";
caption += SR(2421, "#@value@#", m_penaltyCount);
m_wndPenaltyCount = m_msgControl->addStatic("staticPenaltyCount", caption.c_str());
/// penalty count time
caption = convertTimeToString(m_penaltyCountTime, 2487);
m_wndPenaltyCountTime = m_msgControl->addStatic("staticPenaltyCountTime", caption.c_str());
}
/// 메세지 텍스트 바로 아래에 와야 된다.
int y = wndMsg->GetRect().bottom;
/// 여유분
y -= 10;
/// move controls, x는 중앙 정렬 되어 있으므로 y 값이 이동 시키면 된다.
if (m_wndBlockTime)
{
m_wndBlockTime->MovePos(m_wndBlockTime->GetRect().left, y);
y += m_wndBlockTime->GetRect().GetHeight();
}
if (m_wndPenaltyCount)
{
m_wndPenaltyCount->MovePos(m_wndPenaltyCount->GetRect().left, y);
y += m_wndPenaltyCount->GetRect().GetHeight();
}
if (m_wndPenaltyCountTime)
{
m_wndPenaltyCountTime->MovePos(m_wndPenaltyCountTime->GetRect().left, y);
y += m_wndPenaltyCountTime->GetRect().GetHeight();
}
/// 여유분
y += 10;
int buttonTop = y;
m_msgControl->getButtonTopPos(buttonTop);
int addedHeight = y - buttonTop;
m_msgControl->moveButtons(0, addedHeight);
/// resize
KRect wndR = m_msgControl->GetRect();
wndR.bottom += addedHeight;
m_msgControl->SetRect(wndR);
m_msgControl->UpdateBack();
}
void cMsgControlPenaltyCustomizer::process(DWORD dwTime)
{
DWORD elapsedTime = 0;
if (m_time)
elapsedTime = dwTime - m_time;
m_time = dwTime;
float e = (float)elapsedTime/1000.0f;
procBlockTime(e);
procPenaltyCountTime(e);
}
void cMsgControlPenaltyCustomizer::procBlockTime(float elapsedTime)
{
if (!m_wndBlockTime)
return ;
m_blockTime -= elapsedTime;
if (0.0f > m_blockTime)
m_blockTime = 0.0f;
std::string caption = convertTimeToString(m_blockTime, 2484);
m_wndBlockTime->SetCaption(caption.c_str());
}
void cMsgControlPenaltyCustomizer::procPenaltyCountTime(float elapsedTime)
{
if (!m_wndPenaltyCountTime)
return ;
m_penaltyCountTime -= elapsedTime;
if (0.0f > m_penaltyCountTime)
m_penaltyCountTime = 0.0f;
std::string caption = convertTimeToString(m_penaltyCountTime, 2487);
m_wndPenaltyCountTime->SetCaption(caption.c_str());
}
std::string cMsgControlPenaltyCustomizer::convertTimeToString(float t, int stringId)
{
int hour, minute;
extractTime(t, hour, minute);
std::string str = "<hcenter>";
str += SR(stringId, "#@hours@#", hour, "#@minutes@#", minute);
return str;
}
void cMsgControlPenaltyCustomizer::extractTime(float t, int& h, int& m)
{
int s = (int)t;
h = s/3600;
s -= h * 3600;
m = s/60;
}