434 lines
12 KiB
C++
434 lines
12 KiB
C++
#include "stdafx.h"
|
|
#include "PythonShop.h"
|
|
|
|
#include "PythonNetworkStream.h"
|
|
|
|
//BOOL CPythonShop::GetSlotItemID(DWORD dwSlotPos, DWORD* pdwItemID)
|
|
//{
|
|
// if (!CheckSlotIndex(dwSlotPos))
|
|
// return FALSE;
|
|
// const TShopItemData * itemData;
|
|
// if (!GetItemData(dwSlotPos, &itemData))
|
|
// return FALSE;
|
|
// *pdwItemID=itemData->vnum;
|
|
// return TRUE;
|
|
//}
|
|
void CPythonShop::SetTabCoinType(BYTE tabIdx, BYTE coinType)
|
|
{
|
|
if (tabIdx >= m_bTabCount)
|
|
{
|
|
TraceError("Out of Index. tabIdx(%d) must be less than %d.", tabIdx, SHOP_TAB_COUNT_MAX);
|
|
return;
|
|
}
|
|
m_aShoptabs[tabIdx].coinType = coinType;
|
|
}
|
|
|
|
BYTE CPythonShop::GetTabCoinType(BYTE tabIdx)
|
|
{
|
|
if (tabIdx >= m_bTabCount)
|
|
{
|
|
TraceError("Out of Index. tabIdx(%d) must be less than %d.", tabIdx, SHOP_TAB_COUNT_MAX);
|
|
return 0xff;
|
|
}
|
|
return m_aShoptabs[tabIdx].coinType;
|
|
}
|
|
|
|
void CPythonShop::SetTabName(BYTE tabIdx, const char* name)
|
|
{
|
|
if (tabIdx >= m_bTabCount)
|
|
{
|
|
TraceError("Out of Index. tabIdx(%d) must be less than %d.", tabIdx, SHOP_TAB_COUNT_MAX);
|
|
return;
|
|
}
|
|
m_aShoptabs[tabIdx].name = name;
|
|
}
|
|
|
|
const char* CPythonShop::GetTabName(BYTE tabIdx)
|
|
{
|
|
if (tabIdx >= m_bTabCount)
|
|
{
|
|
TraceError("Out of Index. tabIdx(%d) must be less than %d.", tabIdx, SHOP_TAB_COUNT_MAX);
|
|
return NULL;
|
|
}
|
|
|
|
return m_aShoptabs[tabIdx].name.c_str();
|
|
}
|
|
|
|
void CPythonShop::SetItemData(DWORD dwIndex, const TShopItemData & c_rShopItemData)
|
|
{
|
|
BYTE tabIdx = dwIndex / SHOP_HOST_ITEM_MAX_NUM;
|
|
DWORD dwSlotPos = dwIndex % SHOP_HOST_ITEM_MAX_NUM;
|
|
|
|
SetItemData(tabIdx, dwSlotPos, c_rShopItemData);
|
|
}
|
|
|
|
BOOL CPythonShop::GetItemData(DWORD dwIndex, const TShopItemData ** c_ppItemData)
|
|
{
|
|
BYTE tabIdx = dwIndex / SHOP_HOST_ITEM_MAX_NUM;
|
|
DWORD dwSlotPos = dwIndex % SHOP_HOST_ITEM_MAX_NUM;
|
|
|
|
return GetItemData(tabIdx, dwSlotPos, c_ppItemData);
|
|
}
|
|
|
|
void CPythonShop::SetItemData(BYTE tabIdx, DWORD dwSlotPos, const TShopItemData & c_rShopItemData)
|
|
{
|
|
if (tabIdx >= SHOP_TAB_COUNT_MAX || dwSlotPos >= SHOP_HOST_ITEM_MAX_NUM)
|
|
{
|
|
TraceError("Out of Index. tabIdx(%d) must be less than %d. dwSlotPos(%d) must be less than %d", tabIdx, SHOP_TAB_COUNT_MAX, dwSlotPos, SHOP_HOST_ITEM_MAX_NUM);
|
|
return;
|
|
}
|
|
|
|
m_aShoptabs[tabIdx].items[dwSlotPos] = c_rShopItemData;
|
|
}
|
|
|
|
BOOL CPythonShop::GetItemData(BYTE tabIdx, DWORD dwSlotPos, const TShopItemData ** c_ppItemData)
|
|
{
|
|
if (tabIdx >= SHOP_TAB_COUNT_MAX || dwSlotPos >= SHOP_HOST_ITEM_MAX_NUM)
|
|
{
|
|
TraceError("Out of Index. tabIdx(%d) must be less than %d. dwSlotPos(%d) must be less than %d", tabIdx, SHOP_TAB_COUNT_MAX, dwSlotPos, SHOP_HOST_ITEM_MAX_NUM);
|
|
return FALSE;
|
|
}
|
|
|
|
*c_ppItemData = &m_aShoptabs[tabIdx].items[dwSlotPos];
|
|
|
|
return TRUE;
|
|
}
|
|
//
|
|
//BOOL CPythonShop::CheckSlotIndex(DWORD dwSlotPos)
|
|
//{
|
|
// if (dwSlotPos >= SHOP_HOST_ITEM_MAX_NUM * SHOP_TAB_COUNT_MAX)
|
|
// return FALSE;
|
|
//
|
|
// return TRUE;
|
|
//}
|
|
|
|
void CPythonShop::ClearPrivateShopStock()
|
|
{
|
|
m_PrivateShopItemStock.clear();
|
|
}
|
|
void CPythonShop::AddPrivateShopItemStock(TItemPos ItemPos, BYTE dwDisplayPos, DWORD dwPrice)
|
|
{
|
|
DelPrivateShopItemStock(ItemPos);
|
|
|
|
TShopItemTable SellingItem;
|
|
SellingItem.vnum = 0;
|
|
SellingItem.count = 0;
|
|
SellingItem.pos = ItemPos;
|
|
SellingItem.price = dwPrice;
|
|
SellingItem.display_pos = dwDisplayPos;
|
|
m_PrivateShopItemStock.insert(std::make_pair(ItemPos, SellingItem));
|
|
}
|
|
void CPythonShop::DelPrivateShopItemStock(TItemPos ItemPos)
|
|
{
|
|
if (m_PrivateShopItemStock.end() == m_PrivateShopItemStock.find(ItemPos))
|
|
return;
|
|
|
|
m_PrivateShopItemStock.erase(ItemPos);
|
|
}
|
|
int CPythonShop::GetPrivateShopItemPrice(TItemPos ItemPos)
|
|
{
|
|
TPrivateShopItemStock::iterator itor = m_PrivateShopItemStock.find(ItemPos);
|
|
|
|
if (m_PrivateShopItemStock.end() == itor)
|
|
return 0;
|
|
|
|
TShopItemTable & rShopItemTable = itor->second;
|
|
return rShopItemTable.price;
|
|
}
|
|
struct ItemStockSortFunc
|
|
{
|
|
bool operator() (TShopItemTable & rkLeft, TShopItemTable & rkRight)
|
|
{
|
|
return rkLeft.display_pos < rkRight.display_pos;
|
|
}
|
|
};
|
|
void CPythonShop::BuildPrivateShop(const char * c_szName)
|
|
{
|
|
std::vector<TShopItemTable> ItemStock;
|
|
ItemStock.reserve(m_PrivateShopItemStock.size());
|
|
|
|
TPrivateShopItemStock::iterator itor = m_PrivateShopItemStock.begin();
|
|
for (; itor != m_PrivateShopItemStock.end(); ++itor)
|
|
{
|
|
ItemStock.push_back(itor->second);
|
|
}
|
|
|
|
std::sort(ItemStock.begin(), ItemStock.end(), ItemStockSortFunc());
|
|
|
|
CPythonNetworkStream::Instance().SendBuildPrivateShopPacket(c_szName, ItemStock);
|
|
}
|
|
|
|
void CPythonShop::Open(BOOL isPrivateShop, BOOL isMainPrivateShop)
|
|
{
|
|
m_isShoping = TRUE;
|
|
m_isPrivateShop = isPrivateShop;
|
|
m_isMainPlayerPrivateShop = isMainPrivateShop;
|
|
}
|
|
|
|
void CPythonShop::Close()
|
|
{
|
|
m_isShoping = FALSE;
|
|
m_isPrivateShop = FALSE;
|
|
m_isMainPlayerPrivateShop = FALSE;
|
|
}
|
|
|
|
BOOL CPythonShop::IsOpen()
|
|
{
|
|
return m_isShoping;
|
|
}
|
|
|
|
BOOL CPythonShop::IsPrivateShop()
|
|
{
|
|
return m_isPrivateShop;
|
|
}
|
|
|
|
BOOL CPythonShop::IsMainPlayerPrivateShop()
|
|
{
|
|
return m_isMainPlayerPrivateShop;
|
|
}
|
|
|
|
void CPythonShop::Clear()
|
|
{
|
|
m_isShoping = FALSE;
|
|
m_isPrivateShop = FALSE;
|
|
m_isMainPlayerPrivateShop = FALSE;
|
|
ClearPrivateShopStock();
|
|
m_bTabCount = 1;
|
|
|
|
for (int i = 0; i < SHOP_TAB_COUNT_MAX; i++)
|
|
memset (m_aShoptabs[i].items, 0, sizeof(TShopItemData) * SHOP_HOST_ITEM_MAX_NUM);
|
|
}
|
|
|
|
CPythonShop::CPythonShop(void)
|
|
{
|
|
Clear();
|
|
}
|
|
|
|
CPythonShop::~CPythonShop(void)
|
|
{
|
|
}
|
|
|
|
PyObject * shopOpen(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
int isPrivateShop = false;
|
|
PyTuple_GetInteger(poArgs, 0, &isPrivateShop);
|
|
int isMainPrivateShop = false;
|
|
PyTuple_GetInteger(poArgs, 1, &isMainPrivateShop);
|
|
|
|
CPythonShop& rkShop=CPythonShop::Instance();
|
|
rkShop.Open(isPrivateShop, isMainPrivateShop);
|
|
return Py_BuildNone();
|
|
}
|
|
|
|
PyObject * shopClose(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
CPythonShop& rkShop=CPythonShop::Instance();
|
|
rkShop.Close();
|
|
return Py_BuildNone();
|
|
}
|
|
|
|
PyObject * shopIsOpen(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
CPythonShop& rkShop=CPythonShop::Instance();
|
|
return Py_BuildValue("i", rkShop.IsOpen());
|
|
}
|
|
|
|
PyObject * shopIsPrviateShop(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
CPythonShop& rkShop=CPythonShop::Instance();
|
|
return Py_BuildValue("i", rkShop.IsPrivateShop());
|
|
}
|
|
|
|
PyObject * shopIsMainPlayerPrivateShop(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
CPythonShop& rkShop=CPythonShop::Instance();
|
|
return Py_BuildValue("i", rkShop.IsMainPlayerPrivateShop());
|
|
}
|
|
|
|
PyObject * shopGetItemID(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
int nPos;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &nPos))
|
|
return Py_BuildException();
|
|
|
|
const TShopItemData * c_pItemData;
|
|
if (CPythonShop::Instance().GetItemData(nPos, &c_pItemData))
|
|
return Py_BuildValue("i", c_pItemData->vnum);
|
|
|
|
return Py_BuildValue("i", 0);
|
|
}
|
|
|
|
PyObject * shopGetItemCount(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
int iIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &iIndex))
|
|
return Py_BuildException();
|
|
|
|
const TShopItemData * c_pItemData;
|
|
if (CPythonShop::Instance().GetItemData(iIndex, &c_pItemData))
|
|
return Py_BuildValue("i", c_pItemData->count);
|
|
|
|
return Py_BuildValue("i", 0);
|
|
}
|
|
|
|
PyObject * shopGetItemPrice(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
int iIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &iIndex))
|
|
return Py_BuildException();
|
|
|
|
const TShopItemData * c_pItemData;
|
|
if (CPythonShop::Instance().GetItemData(iIndex, &c_pItemData))
|
|
return Py_BuildValue("i", c_pItemData->price);
|
|
|
|
return Py_BuildValue("i", 0);
|
|
}
|
|
|
|
PyObject * shopGetItemMetinSocket(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
int iIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &iIndex))
|
|
return Py_BuildException();
|
|
int iMetinSocketIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 1, &iMetinSocketIndex))
|
|
return Py_BuildException();
|
|
|
|
const TShopItemData * c_pItemData;
|
|
if (CPythonShop::Instance().GetItemData(iIndex, &c_pItemData))
|
|
return Py_BuildValue("i", c_pItemData->alSockets[iMetinSocketIndex]);
|
|
|
|
return Py_BuildValue("i", 0);
|
|
}
|
|
|
|
PyObject * shopGetItemAttribute(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
int iIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &iIndex))
|
|
return Py_BuildException();
|
|
int iAttrSlotIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 1, &iAttrSlotIndex))
|
|
return Py_BuildException();
|
|
|
|
if (iAttrSlotIndex >= 0 && iAttrSlotIndex < ITEM_ATTRIBUTE_SLOT_MAX_NUM)
|
|
{
|
|
const TShopItemData * c_pItemData;
|
|
if (CPythonShop::Instance().GetItemData(iIndex, &c_pItemData))
|
|
return Py_BuildValue("ii", c_pItemData->aAttr[iAttrSlotIndex].bType, c_pItemData->aAttr[iAttrSlotIndex].sValue);
|
|
}
|
|
|
|
return Py_BuildValue("ii", 0, 0);
|
|
}
|
|
|
|
PyObject * shopClearPrivateShopStock(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
CPythonShop::Instance().ClearPrivateShopStock();
|
|
return Py_BuildNone();
|
|
}
|
|
PyObject * shopAddPrivateShopItemStock(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
BYTE bItemWindowType;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &bItemWindowType))
|
|
return Py_BuildException();
|
|
WORD wItemSlotIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 1, &wItemSlotIndex))
|
|
return Py_BuildException();
|
|
int iDisplaySlotIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 2, &iDisplaySlotIndex))
|
|
return Py_BuildException();
|
|
int iPrice;
|
|
if (!PyTuple_GetInteger(poArgs, 3, &iPrice))
|
|
return Py_BuildException();
|
|
|
|
CPythonShop::Instance().AddPrivateShopItemStock(TItemPos(bItemWindowType, wItemSlotIndex), iDisplaySlotIndex, iPrice);
|
|
return Py_BuildNone();
|
|
}
|
|
PyObject * shopDelPrivateShopItemStock(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
BYTE bItemWindowType;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &bItemWindowType))
|
|
return Py_BuildException();
|
|
WORD wItemSlotIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 1, &wItemSlotIndex))
|
|
return Py_BuildException();
|
|
|
|
CPythonShop::Instance().DelPrivateShopItemStock(TItemPos(bItemWindowType, wItemSlotIndex));
|
|
return Py_BuildNone();
|
|
}
|
|
PyObject * shopGetPrivateShopItemPrice(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
BYTE bItemWindowType;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &bItemWindowType))
|
|
return Py_BuildException();
|
|
WORD wItemSlotIndex;
|
|
if (!PyTuple_GetInteger(poArgs, 1, &wItemSlotIndex))
|
|
return Py_BuildException();
|
|
|
|
int iValue = CPythonShop::Instance().GetPrivateShopItemPrice(TItemPos(bItemWindowType, wItemSlotIndex));
|
|
return Py_BuildValue("i", iValue);
|
|
}
|
|
PyObject * shopBuildPrivateShop(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
char * szName;
|
|
if (!PyTuple_GetString(poArgs, 0, &szName))
|
|
return Py_BuildException();
|
|
|
|
CPythonShop::Instance().BuildPrivateShop(szName);
|
|
return Py_BuildNone();
|
|
}
|
|
|
|
PyObject * shopGetTabCount(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
return Py_BuildValue("i", CPythonShop::instance().GetTabCount());
|
|
}
|
|
|
|
PyObject * shopGetTabName(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
BYTE bTabIdx;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &bTabIdx))
|
|
return Py_BuildException();
|
|
|
|
return Py_BuildValue("s", CPythonShop::instance().GetTabName(bTabIdx));
|
|
}
|
|
|
|
PyObject * shopGetTabCoinType(PyObject * poSelf, PyObject * poArgs)
|
|
{
|
|
BYTE bTabIdx;
|
|
if (!PyTuple_GetInteger(poArgs, 0, &bTabIdx))
|
|
return Py_BuildException();
|
|
|
|
return Py_BuildValue("i", CPythonShop::instance().GetTabCoinType(bTabIdx));
|
|
}
|
|
|
|
void initshop()
|
|
{
|
|
static PyMethodDef s_methods[] =
|
|
{
|
|
// Shop
|
|
{ "Open", shopOpen, METH_VARARGS },
|
|
{ "Close", shopClose, METH_VARARGS },
|
|
{ "IsOpen", shopIsOpen, METH_VARARGS },
|
|
{ "IsPrivateShop", shopIsPrviateShop, METH_VARARGS },
|
|
{ "IsMainPlayerPrivateShop", shopIsMainPlayerPrivateShop, METH_VARARGS },
|
|
{ "GetItemID", shopGetItemID, METH_VARARGS },
|
|
{ "GetItemCount", shopGetItemCount, METH_VARARGS },
|
|
{ "GetItemPrice", shopGetItemPrice, METH_VARARGS },
|
|
{ "GetItemMetinSocket", shopGetItemMetinSocket, METH_VARARGS },
|
|
{ "GetItemAttribute", shopGetItemAttribute, METH_VARARGS },
|
|
{ "GetTabCount", shopGetTabCount, METH_VARARGS },
|
|
{ "GetTabName", shopGetTabName, METH_VARARGS },
|
|
{ "GetTabCoinType", shopGetTabCoinType, METH_VARARGS },
|
|
|
|
// Private Shop
|
|
{ "ClearPrivateShopStock", shopClearPrivateShopStock, METH_VARARGS },
|
|
{ "AddPrivateShopItemStock", shopAddPrivateShopItemStock, METH_VARARGS },
|
|
{ "DelPrivateShopItemStock", shopDelPrivateShopItemStock, METH_VARARGS },
|
|
{ "GetPrivateShopItemPrice", shopGetPrivateShopItemPrice, METH_VARARGS },
|
|
{ "BuildPrivateShop", shopBuildPrivateShop, METH_VARARGS },
|
|
{ NULL, NULL, NULL },
|
|
};
|
|
PyObject * poModule = Py_InitModule("shop", s_methods);
|
|
|
|
PyModule_AddIntConstant(poModule, "SHOP_SLOT_COUNT", SHOP_HOST_ITEM_MAX_NUM);
|
|
PyModule_AddIntConstant(poModule, "SHOP_COIN_TYPE_GOLD", SHOP_COIN_TYPE_GOLD);
|
|
PyModule_AddIntConstant(poModule, "SHOP_COIN_TYPE_SECONDARY_COIN", SHOP_COIN_TYPE_SECONDARY_COIN);
|
|
} |