client/UserInterface/PythonQuest.cpp

271 lines
7.4 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 "PythonQuest.h"
void CPythonQuest::RegisterQuestInstance(const SQuestInstance & c_rQuestInstance)
{
DeleteQuestInstance(c_rQuestInstance.dwIndex);
m_QuestInstanceContainer.push_back(c_rQuestInstance);
/////
SQuestInstance & rQuestInstance = *m_QuestInstanceContainer.rbegin();
rQuestInstance.iStartTime = int(CTimer::Instance().GetCurrentSecond());
}
struct FQuestInstanceCompare
{
DWORD dwSearchIndex;
FQuestInstanceCompare(DWORD dwIndex) : dwSearchIndex(dwIndex) {}
bool operator () (const CPythonQuest::SQuestInstance & rQuestInstance)
{
return dwSearchIndex == rQuestInstance.dwIndex;
}
};
void CPythonQuest::DeleteQuestInstance(DWORD dwIndex)
{
TQuestInstanceContainer::iterator itor = std::find_if(m_QuestInstanceContainer.begin(), m_QuestInstanceContainer.end(), FQuestInstanceCompare(dwIndex));
if (itor == m_QuestInstanceContainer.end())
return;
m_QuestInstanceContainer.erase(itor);
}
bool CPythonQuest::IsQuest(DWORD dwIndex)
{
TQuestInstanceContainer::iterator itor = std::find_if(m_QuestInstanceContainer.begin(), m_QuestInstanceContainer.end(), FQuestInstanceCompare(dwIndex));
return itor != m_QuestInstanceContainer.end();
}
void CPythonQuest::MakeQuest(DWORD dwIndex)
{
DeleteQuestInstance(dwIndex);
m_QuestInstanceContainer.push_back(SQuestInstance());
/////
SQuestInstance & rQuestInstance = *m_QuestInstanceContainer.rbegin();
rQuestInstance.dwIndex = dwIndex;
rQuestInstance.iStartTime = int(CTimer::Instance().GetCurrentSecond());
}
void CPythonQuest::SetQuestTitle(DWORD dwIndex, const char * c_szTitle)
{
SQuestInstance * pQuestInstance;
if (!__GetQuestInstancePtr(dwIndex, &pQuestInstance))
return;
pQuestInstance->strTitle = c_szTitle;
}
void CPythonQuest::SetQuestClockName(DWORD dwIndex, const char * c_szClockName)
{
SQuestInstance * pQuestInstance;
if (!__GetQuestInstancePtr(dwIndex, &pQuestInstance))
return;
pQuestInstance->strClockName = c_szClockName;
}
void CPythonQuest::SetQuestCounterName(DWORD dwIndex, const char * c_szCounterName)
{
SQuestInstance * pQuestInstance;
if (!__GetQuestInstancePtr(dwIndex, &pQuestInstance))
return;
pQuestInstance->strCounterName = c_szCounterName;
}
void CPythonQuest::SetQuestClockValue(DWORD dwIndex, int iClockValue)
{
SQuestInstance * pQuestInstance;
if (!__GetQuestInstancePtr(dwIndex, &pQuestInstance))
return;
pQuestInstance->iClockValue = iClockValue;
pQuestInstance->iStartTime = int(CTimer::Instance().GetCurrentSecond());
}
void CPythonQuest::SetQuestCounterValue(DWORD dwIndex, int iCounterValue)
{
SQuestInstance * pQuestInstance;
if (!__GetQuestInstancePtr(dwIndex, &pQuestInstance))
return;
pQuestInstance->iCounterValue = iCounterValue;
}
void CPythonQuest::SetQuestIconFileName(DWORD dwIndex, const char * c_szIconFileName)
{
SQuestInstance * pQuestInstance;
if (!__GetQuestInstancePtr(dwIndex, &pQuestInstance))
return;
pQuestInstance->strIconFileName = c_szIconFileName;
}
int CPythonQuest::GetQuestCount()
{
return m_QuestInstanceContainer.size();
}
bool CPythonQuest::GetQuestInstancePtr(DWORD dwArrayIndex, SQuestInstance ** ppQuestInstance)
{
if (dwArrayIndex >= m_QuestInstanceContainer.size())
return false;
*ppQuestInstance = &m_QuestInstanceContainer[dwArrayIndex];
return true;
}
bool CPythonQuest::__GetQuestInstancePtr(DWORD dwQuestIndex, SQuestInstance ** ppQuestInstance)
{
TQuestInstanceContainer::iterator itor = std::find_if(m_QuestInstanceContainer.begin(), m_QuestInstanceContainer.end(), FQuestInstanceCompare(dwQuestIndex));
if (itor == m_QuestInstanceContainer.end())
return false;
*ppQuestInstance = &(*itor);
return true;
}
void CPythonQuest::__Initialize()
{
/*
#ifdef _DEBUG
for (int i = 0; i < 7; ++i)
{
SQuestInstance test;
test.dwIndex = i;
test.strIconFileName = "";
test.strTitle = _getf("test%d", i);
test.strClockName = "<22><><EFBFBD><EFBFBD> <20>ð<EFBFBD>";
test.strCounterName = "<22><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
test.iClockValue = 1000;
test.iCounterValue = 1000;
test.iStartTime = 0;
RegisterQuestInstance(test);
}
#endif
*/
}
void CPythonQuest::Clear()
{
m_QuestInstanceContainer.clear();
}
CPythonQuest::CPythonQuest()
{
__Initialize();
}
CPythonQuest::~CPythonQuest()
{
Clear();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
PyObject * questGetQuestCount(PyObject * poSelf, PyObject * poArgs)
{
return Py_BuildValue("i", CPythonQuest::Instance().GetQuestCount());
}
PyObject * questGetQuestData(PyObject * poSelf, PyObject * poArgs)
{
int iIndex;
if (!PyTuple_GetInteger(poArgs, 0, &iIndex))
return Py_BadArgument();
CPythonQuest::SQuestInstance * pQuestInstance;
if (!CPythonQuest::Instance().GetQuestInstancePtr(iIndex, &pQuestInstance))
return Py_BuildException("Failed to find quest by index %d", iIndex);
CGraphicImage * pImage = NULL;
if (!pQuestInstance->strIconFileName.empty())
{
std::string strIconFileName;
strIconFileName = "d:/ymir work/ui/game/quest/questicon/";
strIconFileName += pQuestInstance->strIconFileName.c_str();
pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strIconFileName.c_str());
}
else
{
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20>̹<EFBFBD><CCB9><EFBFBD><EFBFBD><EFBFBD> <20>ִ´<D6B4>.
std::string strIconFileName = "season1/icon/scroll_open.tga";
pImage = (CGraphicImage *)CResourceManager::Instance().GetResourcePointer(strIconFileName.c_str());
}
}
return Py_BuildValue("sisi", pQuestInstance->strTitle.c_str(),
pImage,
pQuestInstance->strCounterName.c_str(),
pQuestInstance->iCounterValue);
}
PyObject * questGetQuestIndex(PyObject * poSelf, PyObject * poArgs)
{
int iIndex;
if (!PyTuple_GetInteger(poArgs, 0, &iIndex))
return Py_BadArgument();
CPythonQuest::SQuestInstance * pQuestInstance;
if (!CPythonQuest::Instance().GetQuestInstancePtr(iIndex, &pQuestInstance))
return Py_BuildException("Failed to find quest by index %d", iIndex);
return Py_BuildValue("i", pQuestInstance->dwIndex);
}
PyObject * questGetQuestLastTime(PyObject * poSelf, PyObject * poArgs)
{
int iIndex;
if (!PyTuple_GetInteger(poArgs, 0, &iIndex))
return Py_BadArgument();
CPythonQuest::SQuestInstance * pQuestInstance;
if (!CPythonQuest::Instance().GetQuestInstancePtr(iIndex, &pQuestInstance))
return Py_BuildException("Failed to find quest by index %d", iIndex);
int iLastTime = 0;
if (pQuestInstance->iClockValue >= 0)
{
iLastTime = (pQuestInstance->iStartTime + pQuestInstance->iClockValue) - int(CTimer::Instance().GetCurrentSecond());
}
// <20>ð<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3> <20>ڵ<EFBFBD>
// else
// {
// iLastTime = int(CTimer::Instance().GetCurrentSecond()) - pQuestInstance->iStartTime;
// }
return Py_BuildValue("si", pQuestInstance->strClockName.c_str(), iLastTime);
}
PyObject * questClear(PyObject * poSelf, PyObject * poArgs)
{
CPythonQuest::Instance().Clear();
return Py_BuildNone();
}
void initquest()
{
static PyMethodDef s_methods[] =
{
{ "GetQuestCount", questGetQuestCount, METH_VARARGS },
{ "GetQuestData", questGetQuestData, METH_VARARGS },
{ "GetQuestIndex", questGetQuestIndex, METH_VARARGS },
{ "GetQuestLastTime", questGetQuestLastTime, METH_VARARGS },
{ "Clear", questClear, METH_VARARGS },
{ NULL, NULL, NULL },
};
PyObject * poModule = Py_InitModule("quest", s_methods);
PyModule_AddIntConstant(poModule, "QUEST_MAX_NUM", 5);
}