client/UserInterface/PythonEventManager.cpp

1212 lines
32 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "StdAfx.h"
#include "PythonEventManager.h"
#include "PythonNetworkStream.h"
#include "PythonNonPlayer.h"
#include "AbstractApplication.h"
#include "../gamelib/ItemData.h"
#include "../gamelib/ItemManager.h"
#include "../eterPack/EterPackManager.h"
#include "PythonMiniMap.h"
const long c_lNormal_Waiting_Time = 10;
const int c_fLine_Temp = 16;
void ShowArgument(script::TArgList & rArgumentList)
{
for (script::TArgList::iterator itor=rArgumentList.begin(); itor!=rArgumentList.end(); ++itor)
{
const std::string & rName = (*itor).strName;
Tracen(rName.c_str());
}
}
const std::string& GetArgumentString(const char * c_szName, script::TArgList & rArgumentList)
{
for (script::TArgList::iterator itor = rArgumentList.begin(); itor != rArgumentList.end(); ++itor)
{
const std::string & rName = (*itor).strName;
if (0 == rName.compare(c_szName))
return (*itor).strValue;
}
static std::string strEmptyValue = "";
return strEmptyValue;
}
const char * GetArgument(const char * c_szName, script::TArgList & rArgumentList)
{
return GetArgumentString(c_szName, rArgumentList).c_str();
}
void GetCameraSettingFromArgList(script::TArgList & rArgList, IAbstractApplication::SCameraSetting * pCameraSetting)
{
int ix = atoi(GetArgument("x", rArgList));
int iy = atoi(GetArgument("y", rArgList));
int iz = atoi(GetArgument("z", rArgList));
int iUpDir = atoi(GetArgument("up", rArgList));
int iViewDir = atoi(GetArgument("view", rArgList));
int iCrossDir = atoi(GetArgument("cross", rArgList));
int iDistance = atoi(GetArgument("distance", rArgList));
int iRot = atoi(GetArgument("rot", rArgList));
int iPitch = atoi(GetArgument("pitch", rArgList));
ZeroMemory(pCameraSetting, sizeof(IAbstractApplication::SCameraSetting));
pCameraSetting->v3CenterPosition.x = float(ix);
pCameraSetting->v3CenterPosition.y = float(iy);
pCameraSetting->v3CenterPosition.z = float(iz);
pCameraSetting->kCmrPos.m_fUpDir = float(iUpDir);
pCameraSetting->kCmrPos.m_fViewDir = float(iViewDir);
pCameraSetting->kCmrPos.m_fCrossDir = float(iCrossDir);
pCameraSetting->fZoom = float(iDistance);
pCameraSetting->fRotation = float(iRot);
pCameraSetting->fPitch = float(iPitch);
}
void CPythonEventManager::__InitEventSet(TEventSet& rEventSet)
{
rEventSet.ix = 0;
rEventSet.iy = 0;
rEventSet.iWidth = 0;
rEventSet.iyLocal = 0;
rEventSet.isLock = false;
rEventSet.lLastDelayTime = 0;
rEventSet.iCurrentLetter = 0;
rEventSet.CurrentColor = D3DXCOLOR(1, 1, 1, 1);
rEventSet.strCurrentLine = "";
rEventSet.pCurrentTextLine = NULL;
rEventSet.ScriptTextLineList.clear();
rEventSet.isConfirmWait = FALSE;
rEventSet.pConfirmTimeTextLine = NULL;
rEventSet.iConfirmEndTime = 0;
rEventSet.DiffuseColor = D3DXCOLOR(1, 1, 1, 1);
rEventSet.lWaitingTime = c_lNormal_Waiting_Time;
rEventSet.iRestrictedCharacterCount = 30;
rEventSet.iVisibleStartLine = 0;
rEventSet.iVisibleLineCount = BOX_VISIBLE_LINE_COUNT;
rEventSet.iAdjustLine = 0;
rEventSet.isTextCenterMode = false;
rEventSet.isWaitFlag = false;
__InsertLine(rEventSet);
}
int CPythonEventManager::RegisterEventSet(const char * c_szFileName)
{
CMappedFile File;
LPCVOID pMap;
if (!CEterPackManager::Instance().Get(File, c_szFileName, &pMap))
return -1;
std::string strEventString;
strEventString.resize(File.Size()+1);
File.Read(&strEventString[0], File.Size());
TEventSet * pEventSet = m_EventSetPool.Alloc();
if (!pEventSet)
return -1;
if (!pEventSet->ScriptGroup.Create(strEventString))
{
__ClearEventSetp(pEventSet);
return -1;
}
strncpy(pEventSet->szFileName, c_szFileName, 32);
pEventSet->pCurrentTextLine = NULL;
pEventSet->poEventHandler = NULL;
__InitEventSet(*pEventSet);
int iEmptySlotIndex = GetEmptyEventSetSlot();
m_EventSetVector[iEmptySlotIndex] = pEventSet;
return iEmptySlotIndex;
}
int CPythonEventManager::RegisterEventSetFromString(const std::string& strScript)
{
TEventSet* pEventSet = m_EventSetPool.Alloc();
if (!pEventSet)
return -1;
// SCRIPT_PARSING_FAILURE_CLEAR_BUG <20><>ũ<EFBFBD><C5A9>Ʈ <20>Ľ<EFBFBD> <20><><EFBFBD>н<EFBFBD> __ClearEventSetp <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>߻<EFBFBD>
pEventSet->pCurrentTextLine = NULL;
// END_OF_SCRIPT_PARSING_FAILURE_CLEAR_BUG
if (!pEventSet->ScriptGroup.Create(strScript))
{
__ClearEventSetp(pEventSet);
return -1;
}
pEventSet->szFileName[0] = 0;
pEventSet->poEventHandler = NULL;
__InitEventSet(*pEventSet);
// NOTE : <20><><EFBFBD><EFBFBD> <20>ܼ<EFBFBD><DCBC><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20>̺<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> Ŀ<>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
script::TCmd ScriptCommand;
int pEventPosition;
int iEventType;
if (pEventSet->ScriptGroup.ReadCmd(ScriptCommand))
{
if (GetScriptEventIndex(ScriptCommand.name.c_str(), &pEventPosition, &iEventType))
{
if (EVENT_TYPE_RUN_CINEMA == iEventType)
{
std::string strFileName = GetArgument("value", ScriptCommand.argList);
__ClearEventSetp(pEventSet);
return RegisterEventSet(strFileName.c_str());
}
}
}
int iEmptySlotIndex = GetEmptyEventSetSlot();
m_EventSetVector[iEmptySlotIndex] = pEventSet;
return iEmptySlotIndex;
}
void CPythonEventManager::ClearEventSeti(int iIndex)
{
if (!CheckEventSetIndex(iIndex))
return;
__ClearEventSetp(m_EventSetVector[iIndex]);
m_EventSetVector[iIndex] = NULL;
}
void CPythonEventManager::__ClearEventSetp(TEventSet * pEventSet)
{
if (!pEventSet)
return;
for (TScriptTextLineList::iterator itor = pEventSet->ScriptTextLineList.begin(); itor != pEventSet->ScriptTextLineList.end(); ++itor)
{
TTextLine & rkLine = *itor;
rkLine.pInstance->Destroy();
m_ScriptTextLinePool.Free(rkLine.pInstance);
}
pEventSet->ScriptTextLineList.clear();
if (pEventSet->pCurrentTextLine)
{
pEventSet->pCurrentTextLine->Destroy();
m_ScriptTextLinePool.Free(pEventSet->pCurrentTextLine);
}
pEventSet->pCurrentTextLine = NULL;
pEventSet->strCurrentLine = "";
pEventSet->iCurrentLetter = 0;
m_EventSetPool.Free(pEventSet);
}
DWORD CPythonEventManager::GetEmptyEventSetSlot()
{
for (DWORD i = 0; i < m_EventSetVector.size(); ++i)
{
if (NULL == m_EventSetVector[i])
{
return i;
}
}
m_EventSetVector.push_back(NULL);
return m_EventSetVector.size()-1;
}
void CPythonEventManager::SetRestrictedCount(int iIndex, int iCount)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
{
TraceError("CPythonEventManager::SetRestrictedCount m_EventSetVector[iIndex=%d]==NULL", iIndex);
return;
}
pEventSet->iRestrictedCharacterCount = iCount;
}
void CPythonEventManager::SetEventHandler(int iIndex, PyObject * poEventHandler)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
{
TraceError("CPythonEventManager::SetEventHandler m_EventSetVector[iIndex=%d]==NULL", iIndex);
return;
}
pEventSet->poEventHandler = poEventHandler;
}
int CPythonEventManager::GetEventSetLocalYPosition(int iIndex)
{
if (!CheckEventSetIndex(iIndex))
return 0;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
return 0;
return pEventSet->iyLocal;
}
void CPythonEventManager::AddEventSetLocalYPosition(int iIndex, int iAddValue)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
return;
pEventSet->iyLocal += iAddValue;
}
void CPythonEventManager::InsertText(int iIndex, const char * c_szText,int iX_pos)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
return;
pEventSet->strCurrentLine = c_szText;
if (pEventSet->pCurrentTextLine)
{
pEventSet->pCurrentTextLine->SetValue(c_szText);
if (iX_pos == 0)
{
pEventSet->pCurrentTextLine->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
}
}
pEventSet->pCurrentTextLine->Update();
__InsertLine(*pEventSet, FALSE, iX_pos);
}
void CPythonEventManager::UpdateEventSet(int iIndex, int ix, int iy)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
return;
pEventSet->ix = ix;
pEventSet->iy = iy;
RefreshLinePosition(pEventSet);
if (pEventSet->isConfirmWait)
{
int iLeftTime = max(0, pEventSet->iConfirmEndTime - timeGetTime()/1000);
pEventSet->pConfirmTimeTextLine->SetValue(_getf(m_strLeftTimeString.c_str(), iLeftTime));
}
if (pEventSet->isWaitFlag)
return;
///////////////////////////////////////////////////////////////////////////////////////////////
// Process EventSet
long lElapsedTime = CTimer::Instance().GetElapsedMilliecond();
pEventSet->lLastDelayTime = max(0, pEventSet->lLastDelayTime - lElapsedTime);
while (lElapsedTime > 0)
{
pEventSet->lLastDelayTime -= lElapsedTime;
if (pEventSet->lLastDelayTime <= 0)
{
lElapsedTime = -pEventSet->lLastDelayTime;
if (lElapsedTime <= 0)
break;
ProcessEventSet(pEventSet);
if (pEventSet->lLastDelayTime < 0)
{
pEventSet->lLastDelayTime = 0;
break;
}
}
else
break;
}
}
void CPythonEventManager::SetEventSetWidth(int iIndex, int iWidth)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
return;
pEventSet->iWidth = iWidth;
}
void CPythonEventManager::ProcessEventSet(TEventSet * pEventSet)
{
if (pEventSet->isLock)
return;
script::TCmd ScriptCommand;
IAbstractApplication& rApp=IAbstractApplication::GetSingleton();
if (!pEventSet->ScriptGroup.GetCmd(ScriptCommand))
{
pEventSet->isLock = true;
return;
}
int pEventPosition;
int iEventType;
if (!GetScriptEventIndex(ScriptCommand.name.c_str(), &pEventPosition, &iEventType))
return;
switch (iEventType)
{
case EVENT_TYPE_LETTER:
{
const std::string& c_rstValue = GetArgumentString("value", ScriptCommand.argList);
pEventSet->strCurrentLine.append(c_rstValue);
pEventSet->pCurrentTextLine->SetValueString(pEventSet->strCurrentLine);
pEventSet->pCurrentTextLine->SetColor(pEventSet->CurrentColor.r,pEventSet->CurrentColor.g,pEventSet->CurrentColor.b);
pEventSet->iCurrentLetter+=c_rstValue.length();
if (pEventSet->iCurrentLetter >= pEventSet->iRestrictedCharacterCount)
{
__InsertLine(*pEventSet);
}
pEventSet->lLastDelayTime = pEventSet->lWaitingTime;
break;
}
case EVENT_TYPE_DELAY:
{
if (EVENT_POSITION_START == pEventPosition)
pEventSet->lWaitingTime = atoi(GetArgument("value", ScriptCommand.argList));
else
pEventSet->lWaitingTime = c_lNormal_Waiting_Time;
break;
}
case EVENT_TYPE_COLOR:
{
if (EVENT_POSITION_START == pEventPosition)
{
pEventSet->CurrentColor.r = (float)atof(GetArgument("r", ScriptCommand.argList));
pEventSet->CurrentColor.g = (float)atof(GetArgument("g", ScriptCommand.argList));
pEventSet->CurrentColor.b = (float)atof(GetArgument("b", ScriptCommand.argList));
pEventSet->CurrentColor.a = 1.0f;
}
else
{
pEventSet->CurrentColor.r = 1.0f;
pEventSet->CurrentColor.g = 1.0f;
pEventSet->CurrentColor.a = 1.0f;
pEventSet->CurrentColor.b = 1.0f;
}
break;
}
case EVENT_TYPE_COLOR256:
{
if (EVENT_POSITION_START == pEventPosition)
{
pEventSet->CurrentColor.r = float(atof(GetArgument("r", ScriptCommand.argList)) / 255.0f);
pEventSet->CurrentColor.g = float(atof(GetArgument("g", ScriptCommand.argList)) / 255.0f);
pEventSet->CurrentColor.b = float(atof(GetArgument("b", ScriptCommand.argList)) / 255.0f);
pEventSet->CurrentColor.a = 1.0f;
}
else
{
pEventSet->CurrentColor.r = 1.0f;
pEventSet->CurrentColor.g = 1.0f;
pEventSet->CurrentColor.a = 1.0f;
pEventSet->CurrentColor.b = 1.0f;
}
break;
}
case EVENT_TYPE_ENTER:
{
__InsertLine(*pEventSet);
break;
}
case EVENT_TYPE_WAIT:
{
//ijƽ<C4B3><C6BD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEBFA1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>/EVENT_TYPE_WAIT <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>׽<EFBFBD>Ʈ <20>ʿ<EFBFBD>.
pEventSet->iyLocal = 0;
pEventSet->isLock = true;
break;
}
case EVENT_TYPE_NEXT:
{
MakeNextButton(pEventSet, BUTTON_TYPE_NEXT);
pEventSet->iAdjustLine += 2;
break;
}
case EVENT_TYPE_DONE:
{
MakeNextButton(pEventSet, BUTTON_TYPE_DONE);
PyCallClassMemberFunc(pEventSet->poEventHandler, "DoneEvent", Py_BuildValue("()"));
pEventSet->iAdjustLine += 2;
break;
}
case EVENT_TYPE_CLEAR:
{
ClearLine(pEventSet);
break;
}
case EVENT_TYPE_QUESTION:
{
MakeQuestion(pEventSet, ScriptCommand.argList);
break;
}
case EVENT_TYPE_LEFT_IMAGE:
{
PyCallClassMemberFunc(pEventSet->poEventHandler, "OnLeftImage", Py_BuildValue("(s)", GetArgument("src", ScriptCommand.argList)));
break;
}
case EVENT_TYPE_TOP_IMAGE:
{
PyCallClassMemberFunc(pEventSet->poEventHandler, "OnTopImage", Py_BuildValue("(s)", GetArgument("src", ScriptCommand.argList)));
break;
}
case EVENT_TYPE_BACKGROUND_IMAGE:
{
PyCallClassMemberFunc(pEventSet->poEventHandler, "OnBackgroundImage", Py_BuildValue("(s)",GetArgument("src", ScriptCommand.argList)));
break;
}
case EVENT_TYPE_IMAGE:
{
int x = atoi(GetArgument("x", ScriptCommand.argList));
int y = atoi(GetArgument("y", ScriptCommand.argList));
const char * src = GetArgument("src", ScriptCommand.argList);
PyCallClassMemberFunc(pEventSet->poEventHandler, "OnImage", Py_BuildValue("(iis)", x, y, src));
break;
}
case EVENT_TYPE_INSERT_IMAGE:
{
const std::string & imageFile = GetArgumentString("image_name", ScriptCommand.argList);
const char * title = GetArgument("title", ScriptCommand.argList);
const char * desc = GetArgument("desc", ScriptCommand.argList);
int index = atoi(GetArgument("index", ScriptCommand.argList));
int total = atoi(GetArgument("total", ScriptCommand.argList));
if (imageFile.empty())
{
const char * imageType = GetArgument("image_type", ScriptCommand.argList);
int iItemIndex = atoi(GetArgument("idx", ScriptCommand.argList));
PyCallClassMemberFunc(pEventSet->poEventHandler, "OnInsertItemIcon", Py_BuildValue("(sissii)", imageType, iItemIndex, title, desc, index, total));
}
else
{
PyCallClassMemberFunc(pEventSet->poEventHandler, "OnInsertImage", Py_BuildValue("(ssssii)", imageFile.c_str(), title, title, desc, index, total));
}
pEventSet->iAdjustLine += 2;
break;
}
case EVENT_TYPE_ADD_MAP_SIGNAL:
{
float x, y;
x = (float)atof(GetArgument("x",ScriptCommand.argList));
y = (float)atof(GetArgument("y",ScriptCommand.argList));
CPythonMiniMap::Instance().AddSignalPoint(x,y);
CPythonMiniMap::Instance().OpenAtlasWindow();
break;
}
case EVENT_TYPE_CLEAR_MAP_SIGNAL:
{
CPythonMiniMap::Instance().ClearAllSignalPoint();
break;
}
// HIDE_QUEST_LETTER
case EVENT_TYPE_QUEST_BUTTON_CLOSE:
{
PyCallClassMemberFunc(m_poInterface, "BINARY_ClearQuest",
Py_BuildValue("(i)", atoi(GetArgument("idx", ScriptCommand.argList))));
break;
}
// END_OF_HIDE_QUEST_LETTER
case EVENT_TYPE_QUEST_BUTTON:
{
const std::string& c_rstType = GetArgumentString("icon_type", ScriptCommand.argList);
const std::string& c_rstFile = GetArgumentString("icon_name", ScriptCommand.argList);
int idx = atoi(GetArgument("idx", ScriptCommand.argList));
const char * name = GetArgument("name", ScriptCommand.argList);
// <20><><EFBFBD><EFBFBD>Ʈ UI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǹ<EFBFBD> <20>ذ<EFBFBD> <20>ǹǷ<C7B9> <20>ϴ<EFBFBD> <20><>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> by chrislee
if (!strcmp(name, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ȥ<EFBFBD><C8A5>?....")) {
PyCallClassMemberFunc(m_poInterface, "BINARY_RecvQuest", Py_BuildValue("(isss)", idx, name, "highlight", ""));
}
else {
if (c_rstFile.empty())
{
PyCallClassMemberFunc(m_poInterface, "RecvQuest", Py_BuildValue("(is)", idx, name));
}
else
{
PyCallClassMemberFunc(m_poInterface, "BINARY_RecvQuest",
Py_BuildValue("(isss)", idx, name, c_rstType.c_str(), c_rstFile.c_str()));
}
}
break;
}
case EVENT_TYPE_SET_MESSAGE_POSITION:
{
break;
}
case EVENT_TYPE_ADJUST_MESSAGE_POSITION:
{
break;
}
case EVENT_TYPE_SET_CENTER_MAP_POSITION:
{
CPythonMiniMap::Instance().SetAtlasCenterPosition(atoi(GetArgument("x", ScriptCommand.argList)),atoi(GetArgument("y", ScriptCommand.argList)));
break;
}
case EVENT_TYPE_SLEEP:
pEventSet->lLastDelayTime = atoi(GetArgument("value", ScriptCommand.argList));
break;
case EVENT_TYPE_SET_CAMERA:
{
IAbstractApplication::SCameraSetting CameraSetting;
GetCameraSettingFromArgList(ScriptCommand.argList, &CameraSetting);
rApp.SetEventCamera(CameraSetting);
break;
}
case EVENT_TYPE_BLEND_CAMERA:
{
IAbstractApplication::SCameraSetting CameraSetting;
GetCameraSettingFromArgList(ScriptCommand.argList, &CameraSetting);
float fBlendTime = atoi(GetArgument("blendtime", ScriptCommand.argList));
rApp.BlendEventCamera(CameraSetting, fBlendTime);
break;
}
case EVENT_TYPE_RESTORE_CAMERA:
{
rApp.SetDefaultCamera();
break;
}
case EVENT_TYPE_FADE_OUT:
{
float fSpeed = (float)atof(GetArgument("speed", ScriptCommand.argList));
PyCallClassMemberFunc(pEventSet->poEventHandler, "FadeOut", Py_BuildValue("(f)", fSpeed));
pEventSet->isWaitFlag = true;
break;
}
case EVENT_TYPE_FADE_IN:
{
PyCallClassMemberFunc(pEventSet->poEventHandler, "FadeIn", Py_BuildValue("(f)", atof(GetArgument("speed", ScriptCommand.argList))));
pEventSet->isWaitFlag = true;
break;
}
case EVENT_TYPE_WHITE_OUT:
{
PyCallClassMemberFunc(pEventSet->poEventHandler, "WhiteOut", Py_BuildValue("(f)", atof(GetArgument("speed", ScriptCommand.argList))));
pEventSet->isWaitFlag = true;
break;
}
case EVENT_TYPE_WHITE_IN:
{
PyCallClassMemberFunc(pEventSet->poEventHandler, "WhiteIn", Py_BuildValue("(f)", atof(GetArgument("speed", ScriptCommand.argList))));
pEventSet->isWaitFlag = true;
break;
}
case EVENT_TYPE_CLEAR_TEXT:
{
ClearLine(pEventSet);
break;
}
case EVENT_TYPE_TEXT_HORIZONTAL_ALIGN_CENTER:
{
pEventSet->isTextCenterMode = true;
if (pEventSet->pCurrentTextLine)
pEventSet->pCurrentTextLine->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
break;
}
case EVENT_TYPE_TITLE_IMAGE:
{
PyCallClassMemberFunc(pEventSet->poEventHandler, "OnTitleImage", Py_BuildValue("(s)", GetArgument("src", ScriptCommand.argList)));
break;
}
case EVENT_TYPE_DUNGEON_RESULT:
{
int killstone_count = atoi(GetArgument("killstone_count", ScriptCommand.argList));
int killmob_count = atoi(GetArgument("killmob_count", ScriptCommand.argList));
int find_hidden = atoi(GetArgument("find_hidden", ScriptCommand.argList));
int hidden_total = atoi(GetArgument("hidden_total", ScriptCommand.argList));
int use_potion = atoi(GetArgument("use_potion", ScriptCommand.argList));
int is_revived = atoi(GetArgument("is_revived", ScriptCommand.argList));
int killallmob = atoi(GetArgument("killallmob", ScriptCommand.argList));
int total_time = atoi(GetArgument("total_time", ScriptCommand.argList));
int bonus_exp = atoi(GetArgument("bonus_exp", ScriptCommand.argList));
PyCallClassMemberFunc(m_poInterface, "ShowDungeonResult",
Py_BuildValue("(iiiiiiiii)",
killstone_count,
killmob_count,
find_hidden,
hidden_total,
use_potion,
is_revived,
killallmob,
total_time,
bonus_exp));
break;
}
case EVENT_TYPE_ITEM_NAME:
{
int iIndex = atoi(GetArgument("value", ScriptCommand.argList));
CItemData * pItemData;
if (CItemManager::Instance().GetItemDataPointer(iIndex, &pItemData))
{
pEventSet->strCurrentLine.append(pItemData->GetName());
pEventSet->pCurrentTextLine->SetValue(pEventSet->strCurrentLine.c_str());
pEventSet->pCurrentTextLine->SetColor(1.0f, 0.2f, 0.2f);
pEventSet->iCurrentLetter+= strlen(pItemData->GetName());
if (pEventSet->iCurrentLetter >= pEventSet->iRestrictedCharacterCount)
__InsertLine(*pEventSet);
pEventSet->lLastDelayTime = pEventSet->lWaitingTime;
}
break;
}
case EVENT_TYPE_MONSTER_NAME:
{
int iIndex = atoi(GetArgument("value", ScriptCommand.argList));
const char * c_szName;
CPythonNonPlayer& rkNonPlayer=CPythonNonPlayer::Instance();
if (rkNonPlayer.GetName(iIndex, &c_szName))
{
pEventSet->strCurrentLine.append(c_szName);
pEventSet->pCurrentTextLine->SetValue(pEventSet->strCurrentLine.c_str());
pEventSet->iCurrentLetter+= strlen(c_szName);
if (pEventSet->iCurrentLetter >= pEventSet->iRestrictedCharacterCount)
__InsertLine(*pEventSet);
pEventSet->lLastDelayTime = pEventSet->lWaitingTime;
}
break;
}
case EVENT_TYPE_WINDOW_SIZE:
{
int iWidth = atoi(GetArgument("width", ScriptCommand.argList));
int iHeight = atoi(GetArgument("height", ScriptCommand.argList));
PyCallClassMemberFunc(pEventSet->poEventHandler, "OnSize", Py_BuildValue("(ii)", iWidth, iHeight));
break;
}
case EVENT_TYPE_INPUT:
{
__InsertLine(*pEventSet);
PyCallClassMemberFunc(pEventSet->poEventHandler, "OnInput", Py_BuildValue("()"));
break;
}
case EVENT_TYPE_CONFIRM_WAIT:
{
int iTimeOut = atoi(GetArgument("timeout", ScriptCommand.argList));
pEventSet->isConfirmWait = TRUE;
pEventSet->pConfirmTimeTextLine = pEventSet->pCurrentTextLine;
pEventSet->iConfirmEndTime = timeGetTime()/1000 + iTimeOut;
__InsertLine(*pEventSet, TRUE);
MakeNextButton(pEventSet, BUTTON_TYPE_CANCEL);
break;
}
case EVENT_TYPE_END_CONFIRM_WAIT:
{
for (DWORD i = 0; i < m_EventSetVector.size(); ++i)
{
if (NULL == m_EventSetVector[i])
continue;
TEventSet * pSet = m_EventSetVector[i];
if (!pSet->isConfirmWait)
continue;
pSet->isConfirmWait = FALSE;
pSet->pConfirmTimeTextLine = NULL;
pSet->iConfirmEndTime = 0;
PyCallClassMemberFunc(pSet->poEventHandler, "CloseSelf", Py_BuildValue("()"));
}
break;
}
case EVENT_TYPE_SELECT_ITEM:
{
PyCallClassMemberFunc(m_poInterface, "BINARY_OpenSelectItemWindow", Py_BuildValue("()"));
break;
}
}
}
void CPythonEventManager::RenderEventSet(int iIndex)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
return;
int iCount = 0;
for (TScriptTextLineList::iterator itor = pEventSet->ScriptTextLineList.begin(); itor != pEventSet->ScriptTextLineList.end(); ++itor, ++iCount)
{
if (iCount < pEventSet->iVisibleStartLine)
continue;
if (iCount >= pEventSet->iVisibleStartLine + pEventSet->iVisibleLineCount)
continue;
TTextLine & rkLine = *itor;
CGraphicTextInstance * pInstance = rkLine.pInstance;
pInstance->Update();
pInstance->Render();
}
if (iCount >= pEventSet->iVisibleStartLine)
if (iCount < pEventSet->iVisibleStartLine + pEventSet->iVisibleLineCount)
{
pEventSet->pCurrentTextLine->Update();
pEventSet->pCurrentTextLine->Render();
}
}
void CPythonEventManager::Skip(int iIndex)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (true == pEventSet->isLock)
{
pEventSet->lLastDelayTime = 0;
pEventSet->isLock = false;
}
else
{
pEventSet->lLastDelayTime = -1000;
}
}
bool CPythonEventManager::IsWait(int iIndex)
{
if (!CheckEventSetIndex(iIndex))
return false;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
{
return false;
}
return pEventSet->isLock;
}
void CPythonEventManager::EndEventProcess(int iIndex)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (!pEventSet)
{
return;
}
pEventSet->isWaitFlag = false;
}
void CPythonEventManager::MakeNextButton(TEventSet * pEventSet, int iButtonType)
{
__AddSpace(*pEventSet, c_fLine_Temp+5);
PyCallClassMemberFunc(pEventSet->poEventHandler, "MakeNextButton", Py_BuildValue("(i)", iButtonType));
}
void CPythonEventManager::MakeQuestion(TEventSet * pEventSet, script::TArgList & rArgumentList)
{
if (rArgumentList.empty())
return;
PyCallClassMemberFunc(pEventSet->poEventHandler, "MakeQuestion", Py_BuildValue("(i)", rArgumentList.size()));
pEventSet->nAnswer = rArgumentList.size();
int iIndex = 0;
for (script::TArgList::iterator itor=rArgumentList.begin(); itor!=rArgumentList.end(); ++itor)
{
script::TArg & rArgument = *itor;
PyCallClassMemberFunc(pEventSet->poEventHandler, "AppendQuestion", Py_BuildValue("(si)", rArgument.strValue.c_str(), iIndex));
++iIndex;
}
}
void CPythonEventManager::SelectAnswer(int iIndex, int iAnswer)
{
if (!CheckEventSetIndex(iIndex))
return;
//TEventSet * pEventSet = m_EventSetVector[iIndex];
CPythonNetworkStream::Instance().SendScriptAnswerPacket(iAnswer);
}
void CPythonEventManager::SetVisibleStartLine(int iIndex, int iStartLine)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
if (DWORD(iStartLine) > pEventSet->ScriptTextLineList.size())
return;
pEventSet->iVisibleStartLine = iStartLine;
}
void CPythonEventManager::SetVisibleLineCount(int iIndex, int iLineCount)
{
if (!CheckEventSetIndex(iIndex))
return;
TEventSet * pEventSet = m_EventSetVector[iIndex];
pEventSet->iVisibleLineCount = iLineCount;
}
int CPythonEventManager::GetVisibleStartLine(int iIndex)
{
if (!CheckEventSetIndex(iIndex))
return 0;
TEventSet * pEventSet = m_EventSetVector[iIndex];
return pEventSet->iVisibleStartLine;
}
int CPythonEventManager::GetLineCount(int iIndex)
{
if (!CheckEventSetIndex(iIndex))
return 0;
TEventSet * pEventSet = m_EventSetVector[iIndex];
return pEventSet->ScriptTextLineList.size()+pEventSet->iAdjustLine;
}
void CPythonEventManager::ClearLine(TEventSet * pEventSet)
{
if (!pEventSet)
return;
for (TScriptTextLineList::iterator itor = pEventSet->ScriptTextLineList.begin(); itor != pEventSet->ScriptTextLineList.end(); ++itor)
{
TTextLine & rkLine = *itor;
CGraphicTextInstance * pInstance = rkLine.pInstance;
pInstance->Destroy();
pInstance->Update();
}
pEventSet->pCurrentTextLine->Destroy();
pEventSet->pCurrentTextLine->Update();
// clear
pEventSet->pCurrentTextLine = NULL;
pEventSet->ScriptTextLineList.clear();
__InsertLine(*pEventSet);
}
void CPythonEventManager::__InsertLine(TEventSet& rEventSet, BOOL isCenter, int iX_pos)
{
if (rEventSet.pCurrentTextLine)
{
TTextLine kLine;
if (CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER == rEventSet.pCurrentTextLine->GetHorizontalAlign())
{
kLine.ixLocal = rEventSet.iWidth/2;
kLine.iyLocal = rEventSet.iyLocal;
}
else
{
int textWidth;
int textHeight;
rEventSet.pCurrentTextLine->GetTextSize(&textWidth,&textHeight);
if (GetDefaultCodePage() == CP_1256)
{
kLine.ixLocal = rEventSet.iWidth;
if (iX_pos != 0)
{
kLine.ixLocal -= iX_pos - 20;
kLine.ixLocal += textWidth / 2;
}
}
else
{
kLine.ixLocal = 0;
if (iX_pos != 0)
{
kLine.ixLocal += (iX_pos - 20);
kLine.ixLocal -= textWidth / 2;
}
}
kLine.iyLocal = rEventSet.iyLocal;
}
kLine.pInstance = rEventSet.pCurrentTextLine;
rEventSet.ScriptTextLineList.push_back(kLine);
__AddSpace(rEventSet, c_fLine_Temp);
}
// DEFAULT_FONT
//CGraphicText * pText = (CGraphicText*)CResourceManager::Instance().GetTypeResourcePointer(g_strDefaultFontName.c_str());
CGraphicText* pkDefaultFont = static_cast<CGraphicText*>(DefaultFont_GetResource());
if (!pkDefaultFont)
{
TraceError("CPythonEventManager::InsertLine - CANNOT_FIND_DEFAULT_FONT");
return;
}
rEventSet.pCurrentTextLine = m_ScriptTextLinePool.Alloc();
if (!rEventSet.pCurrentTextLine)
{
TraceError("CPythonEventManager::InsertLine - OUT_OF_TEXT_LINE");
return;
}
rEventSet.pCurrentTextLine->SetTextPointer(pkDefaultFont);
// END_OF_DEFAULT_FONT
rEventSet.pCurrentTextLine->SetColor(1.0f, 1.0f, 1.0f);
rEventSet.pCurrentTextLine->SetValue("");
if (rEventSet.isTextCenterMode || isCenter)
{
rEventSet.pCurrentTextLine->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER);
rEventSet.pCurrentTextLine->SetPosition(rEventSet.ix+rEventSet.iWidth/2, rEventSet.iy + rEventSet.iyLocal);
}
else
{
if (GetDefaultCodePage() == CP_1256)
{
rEventSet.pCurrentTextLine->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_LEFT);
rEventSet.pCurrentTextLine->SetPosition(rEventSet.ix + rEventSet.iWidth, rEventSet.iy + rEventSet.iyLocal);
}
else
{
rEventSet.pCurrentTextLine->SetHorizonalAlign(CGraphicTextInstance::HORIZONTAL_ALIGN_LEFT);
rEventSet.pCurrentTextLine->SetPosition(rEventSet.ix, rEventSet.iy + rEventSet.iyLocal);
}
}
rEventSet.iCurrentLetter = 0;
rEventSet.strCurrentLine = "";
}
void CPythonEventManager::RefreshLinePosition(TEventSet * pEventSet)
{
//int iCount = 0;
for (TScriptTextLineList::iterator itor = pEventSet->ScriptTextLineList.begin(); itor != pEventSet->ScriptTextLineList.end(); ++itor)
{
TTextLine & rkLine = *itor;
CGraphicTextInstance * pInstance = rkLine.pInstance;
pInstance->SetPosition(pEventSet->ix + rkLine.ixLocal, pEventSet->iy + rkLine.iyLocal);
}
int ixTextPos;
if (CGraphicTextInstance::HORIZONTAL_ALIGN_CENTER == pEventSet->pCurrentTextLine->GetHorizontalAlign())
{
ixTextPos = pEventSet->ix+pEventSet->iWidth/2;
}
else
{
if (GetDefaultCodePage() == CP_1256)
ixTextPos = pEventSet->ix+pEventSet->iWidth;
else
ixTextPos = pEventSet->ix;
}
pEventSet->pCurrentTextLine->SetPosition(ixTextPos, pEventSet->iy + pEventSet->iyLocal);
}
void CPythonEventManager::__AddSpace(TEventSet& rEventSet, int iSpace)
{
rEventSet.iyLocal += iSpace;
}
bool CPythonEventManager::GetScriptEventIndex(const char * c_szName, int * pEventPosition, int * pEventType)
{
const char * c_szEventName;
if ('/' == c_szName[0])
{
*pEventPosition = EVENT_POSITION_END;
c_szEventName = &c_szName[1];
}
else
{
*pEventPosition = EVENT_POSITION_START;
c_szEventName = &c_szName[0];
}
std::map<std::string,int>::iterator it = EventTypeMap.find(c_szEventName);
if (it == EventTypeMap.end())
{
Tracef(" !! PARSING ERROR - Strange Command : %s\n", c_szEventName);
return false;
}
*pEventType = it->second;
return true;
}
bool CPythonEventManager::CheckEventSetIndex(int iIndex)
{
if (iIndex < 0)
return false;
if ((DWORD) iIndex >= m_EventSetVector.size())
return false;
return true;
}
void CPythonEventManager::Destroy()
{
m_EventSetVector.clear();
m_EventSetPool.Clear();
m_ScriptTextLinePool.Clear();
}
void CPythonEventManager::SetInterfaceWindow(PyObject * poInterface)
{
m_poInterface = poInterface;
}
void CPythonEventManager::SetLeftTimeString(const char * c_szString)
{
m_strLeftTimeString = c_szString;
}
CPythonEventManager::CPythonEventManager()
: m_poInterface(0), m_strLeftTimeString("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD> : %d<><64>")
{
EventTypeMap["LETTER"]=EVENT_TYPE_LETTER;
EventTypeMap["COLOR"]=EVENT_TYPE_COLOR;
EventTypeMap["DELAY"]=EVENT_TYPE_DELAY;
EventTypeMap["ENTER"]=EVENT_TYPE_ENTER;
EventTypeMap["WAIT"]=EVENT_TYPE_WAIT;
EventTypeMap["CLEAR"]=EVENT_TYPE_CLEAR;
EventTypeMap["QUESTION"]=EVENT_TYPE_QUESTION;
EventTypeMap["NEXT"]=EVENT_TYPE_NEXT;
EventTypeMap["DONE"]=EVENT_TYPE_DONE;
EventTypeMap["LEFTIMAGE"]=EVENT_TYPE_LEFT_IMAGE;
EventTypeMap["TOPIMAGE"]=EVENT_TYPE_TOP_IMAGE;
EventTypeMap["BGIMAGE"]=EVENT_TYPE_BACKGROUND_IMAGE;
EventTypeMap["IMAGE"]=EVENT_TYPE_IMAGE;
EventTypeMap["ADDMAPSIGNAL"]=EVENT_TYPE_ADD_MAP_SIGNAL;
EventTypeMap["CLEARMAPSIGNAL"]=EVENT_TYPE_CLEAR_MAP_SIGNAL;
EventTypeMap["SETMSGPOS"]=EVENT_TYPE_SET_MESSAGE_POSITION;
EventTypeMap["ADJMSGPOS"]=EVENT_TYPE_ADJUST_MESSAGE_POSITION;
EventTypeMap["SETCMAPPOS"]=EVENT_TYPE_SET_CENTER_MAP_POSITION;
EventTypeMap["QUESTBUTTON"]=EVENT_TYPE_QUEST_BUTTON;
// HIDE_QUEST_LETTER
EventTypeMap["QUESTBUTTON_CLOSE"]=EVENT_TYPE_QUEST_BUTTON_CLOSE;
// END_OF_HIDE_QUEST_LETTER
EventTypeMap["SLEEP"]=EVENT_TYPE_SLEEP;
EventTypeMap["SET_CAMERA"]=EVENT_TYPE_SET_CAMERA;
EventTypeMap["BLEND_CAMERA"]=EVENT_TYPE_BLEND_CAMERA;
EventTypeMap["RESTORE_CAMERA"]=EVENT_TYPE_RESTORE_CAMERA;
EventTypeMap["FADE_OUT"]=EVENT_TYPE_FADE_OUT;
EventTypeMap["FADE_IN"]=EVENT_TYPE_FADE_IN;
EventTypeMap["WHITE_OUT"]=EVENT_TYPE_WHITE_OUT;
EventTypeMap["WHITE_IN"]=EVENT_TYPE_WHITE_IN;
EventTypeMap["CLEAR_TEXT"]=EVENT_TYPE_CLEAR_TEXT;
EventTypeMap["TEXT_HORIZONTAL_ALIGN_CENTER"]=EVENT_TYPE_TEXT_HORIZONTAL_ALIGN_CENTER;
EventTypeMap["TITLE_IMAGE"]=EVENT_TYPE_TITLE_IMAGE;
EventTypeMap["RUN_CINEMA"]=EVENT_TYPE_RUN_CINEMA;
EventTypeMap["DUNGEON_RESULT"]=EVENT_TYPE_DUNGEON_RESULT;
EventTypeMap["ITEM"]=EVENT_TYPE_ITEM_NAME;
EventTypeMap["MOB"]=EVENT_TYPE_MONSTER_NAME;
EventTypeMap["COLOR256"]=EVENT_TYPE_COLOR256;
EventTypeMap["WINDOW_SIZE"]=EVENT_TYPE_WINDOW_SIZE;
EventTypeMap["INPUT"]=EVENT_TYPE_INPUT;
EventTypeMap["CONFIRM_WAIT"]=EVENT_TYPE_CONFIRM_WAIT;
EventTypeMap["END_CONFIRM_WAIT"]=EVENT_TYPE_END_CONFIRM_WAIT;
EventTypeMap["INSERT_IMAGE"]=EVENT_TYPE_INSERT_IMAGE;
EventTypeMap["SELECT_ITEM"]=EVENT_TYPE_SELECT_ITEM;
}
CPythonEventManager::~CPythonEventManager()
{
}