Files
Sun1602/Client/GameClient/BattleSceneEventText.cpp
T
2022-10-26 12:25:11 +08:00

309 lines
7.6 KiB
C++

#include "SunClientPrecompiledHeader.h"
#include "BattleSceneEventText.h"
#include "Application.h"
#include "InterfaceManager.h"
#include "SoundEffect.h"
#include "EventInfoParser.h"
#include "GlobalFunc.h"
#include "Message.h"
cSceneEventText::cSceneEventText()
{
}
void cSceneEventText::Init()
{
m_iEventTick = 0;
m_bEventState = FALSE;
m_iEventCurScript = 0;
m_iEventCurPage = 0;
m_iEventCurLine = 0;
m_iEventVoiceHandle = -1;
for (int a = 0; a < MAX_EVENT_LINE; a++)
{
ZeroMemory(m_szEventLine[a],sizeof(TCHAR) * MAX_MESSAGE_LENGTH);
}
}
void cSceneEventText::SkipEventScript()
{
if( m_iEventCurScript )
{
SetEventScript(0);
}
}
const int EVENT_LINE_SHOW_INTERVAL = 1500;
const int EVENT_PAGE_SHOW_INTERVAL = 1500;
const int EVENT_PANE_APPEAR_INTERVAL = 500;
const int EVENT_PANE_DISAPPEAR_INTERVAL = 500;
const int EVENT_PANE_HEIGHT = 200;
const int EVENT_LINE_HEIGHT = 30;
const int EVENT_LINE_START_X = 40;
const int EVENT_LINE_START_Y = 50;
void cSceneEventText::ProcessEventScript(DWORD dwTick)
{
if (m_bEventState)
{
// 처음 스르륵
if (m_iEventCurPage == 0)
{
if (m_iEventAppearPane < EVENT_PANE_APPEAR_INTERVAL)
{
m_iEventAppearPane += dwTick;
if (m_iEventAppearPane > EVENT_PANE_APPEAR_INTERVAL)
{
m_iEventAppearPane = EVENT_PANE_APPEAR_INTERVAL;
}
return;
}
}
if (m_iEventCurLine < m_iEventMaxLine)
{
m_iEventLineTick += dwTick;
if (m_iEventLineTick > EVENT_LINE_SHOW_INTERVAL)
{
m_iEventLineTick = 0;
m_iEventCurLine++;
}
}
else
{
m_iEventPageTick += dwTick;
if (m_iEventCurPage < m_iEventMaxPage)
{
if ( m_iEventPageTick > EVENT_PAGE_SHOW_INTERVAL )
{
// 보이스가 없거나 보이스 플레이가 끝났으면 다음 페이지로 고고
if (m_iEventVoiceHandle == -1 || ( (m_iEventVoiceHandle != -1) && wzsnd_getState_voice(m_iEventVoiceHandle) != 1) )
{
m_iEventCurPage++;
m_iEventPageTick = 0;
m_iEventLineTick = 0;
SetEventPage(m_iEventCurPage);
}
}
}
else
{
if (m_iEventAppearPane > 0)
{
m_iEventAppearPane -= dwTick;
if (m_iEventAppearPane < 0)
{
m_iEventAppearPane = 0;
}
}
else
{
SetEventScript(0);
}
}
}
}
}
//-------------------------------------------------------------------------------------------
/**
*/
void cSceneEventText::RenderEventScript()
{
if (m_bEventState)
{
POINT pt = g_pApplication->Get2DModeMapping();
if (m_iEventAppearPane)
{
float fPaneRate = (float)m_iEventAppearPane / (float)EVENT_PANE_APPEAR_INTERVAL;
BOOL bOld2dMode,bOldRealSize;
g_pSunRenderer->Check2DMode(&bOld2dMode,&bOldRealSize);
g_pSunRenderer->Set2DMode( TRUE );
RECT rc;
rc.left = 0;
rc.right = pt.x;
rc.top = 0;
rc.bottom = (LONG)((float)EVENT_PANE_HEIGHT * fPaneRate);
g_InterfaceManager.RenderRect(rc,WzColor_RGBA(0,0,0,255));
rc.top = pt.y - (LONG)((float)EVENT_PANE_HEIGHT * fPaneRate);
rc.bottom = pt.y;
g_InterfaceManager.RenderRect(rc,WzColor_RGBA(0,0,0,255));
if (fPaneRate >= 1.0f)
{
#ifdef _JAPAN
g_pSunRenderer->x_pManagerTextOut->StartToUseFont( StrToWzID("m212") );
#else
g_pSunRenderer->x_pManagerTextOut->StartToUseFont( StrToWzID("m216") );
#endif//_JAPAN 일본나레이션에서는 폰트를 약간크게해다라고 요청
RECT textrc;
textrc.left = EVENT_LINE_START_X;
textrc.right = pt.x;
textrc.top = pt.y - EVENT_PANE_HEIGHT + EVENT_LINE_START_Y;
textrc.bottom = textrc.top + EVENT_LINE_HEIGHT;
for (int a = 0; a < m_iEventCurLine; a++)
{
g_pSunRenderer->x_pManagerTextOut->DrawText(m_szEventLine[a],&textrc,WzColor_RGBA(255,255,255,255));
textrc.top += EVENT_LINE_HEIGHT;
textrc.bottom += EVENT_LINE_HEIGHT;
}
// 마지막라인은 알파로~
if (m_iEventCurLine < m_iEventMaxLine)
{
float fAlpha = (float)m_iEventLineTick / (float)EVENT_LINE_SHOW_INTERVAL;
const int fontcolor = (int)(255.0f * fAlpha);
g_pSunRenderer->x_pManagerTextOut->DrawText(m_szEventLine[m_iEventCurLine],&textrc,WzColor_RGBA(fontcolor,fontcolor,fontcolor,255));
}
g_pSunRenderer->x_pManagerTextOut->EndUseFont();
}
g_pSunRenderer->Set2DMode(bOld2dMode,bOldRealSize);
}
}
}
void cSceneEventText::SetEventScript(int iScript)
{
if (m_iEventVoiceHandle != -1)
{
g_SoundEffect.StopVoice(m_iEventVoiceHandle);
m_iEventVoiceHandle = -1;
}
if (iScript > 0)
{
// 한번 플레이한놈은 다시 안한다.
if (EventInfoParser::Instance()->IsPlayed(iScript))
{
return;
}
m_bEventState = TRUE;
m_iEventCurScript = iScript;
m_iEventCurPage = 0;
m_iEventCurLine = 0;
m_iEventTick = 0;
m_iEventVoiceHandle = -1;
m_iEventMaxPage = 0;
BASE_EventInfo *pInfo = EventInfoParser::Instance()->GetEventInfo(m_iEventCurScript);
if (pInfo)
{
for (int a = 0; a < MAX_EVENT_INFO; a++)
{
if (pInfo->m_EventInfo[a].wText != 0)
{
m_iEventMaxPage++;
}
}
}
m_iEventAppearPane = 0;
m_iEventDisappearPane = 0;
SetEventPage(0);
g_InterfaceManager.SetRenderState(FALSE);
EventInfoParser::Instance()->AddPlayedList(iScript);
keyMsg msg;
ZeroMemory(&msg,sizeof(msg));
msg.dwType = eDoType_invoke_scene_event;
msg.wParam = eSceneEventSkip_EventScript;
msg.DoSomething = GlobalFunc::DoInvokeSceneEvent;
g_KeyQueueManager.PushBack(msg);
}
else
{
m_bEventState = FALSE;
m_iEventCurScript = 0;
m_iEventCurPage = 0;
m_iEventCurLine = 0;
m_iEventTick = 0;
m_iEventVoiceHandle = -1;
m_iEventAppearPane = 0;
m_iEventDisappearPane = 0;
g_InterfaceManager.SetRenderState(TRUE);
g_KeyQueueManager.DeleteMsg(eDoType_invoke_scene_event);
}
}
void cSceneEventText::SetEventPage(int iPage)
{
// 페이지가 더이상없으면 끝
if (iPage < 0 || iPage >= MAX_EVENT_INFO)
{
return;
}
BASE_EventInfo *pInfo = EventInfoParser::Instance()->GetEventInfo(m_iEventCurScript);
if (pInfo)
{
if (pInfo->m_EventInfo[iPage].wSound != 0)
{
m_iEventVoiceHandle = g_SoundEffect.PlayVoice(pInfo->m_EventInfo[iPage].wSound,NULL);
}
else
{
m_iEventVoiceHandle = -1;
}
// 마지막 페이지면 끝~
if (pInfo->m_EventInfo[iPage].wText == 0)
{
return;
}
if( MESSAGE_INFO* pMessageInfo = MessageInfoParser::Instance()->GetMessage(pInfo->m_EventInfo[iPage].wText) )
{
const TCHAR seps[] = _T("#");
assert(_tcslen(pMessageInfo->pszMessage) < MAX_MESSAGE_LENGTH);
TCHAR szBuffer[MAX_MESSAGE_LENGTH + 1] = {0,};
StrnCopy(szBuffer,pMessageInfo->pszMessage,MAX_MESSAGE_LENGTH);
TCHAR* token = _tcstok(szBuffer, seps);
int linecount = 0;
while( token != NULL )
{
if (linecount >= MAX_EVENT_LINE)
{
break;
}
StrnCopy(m_szEventLine[linecount],token,MAX_MESSAGE_LENGTH);
token = _tcstok( NULL, seps );
linecount++;
}
m_iEventCurLine = 0;
m_iEventMaxLine = linecount;
m_iEventPageTick = 0;
m_iEventLineTick = 0;
}
}
}