790 lines
20 KiB
C++
790 lines
20 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "GameStore.h"
|
|||
|
|
#include "../base/Container.hpp"
|
|||
|
|
using namespace wylib::stream;
|
|||
|
|
|
|||
|
|
CGameStore::CGameStore()
|
|||
|
|
:Inherited()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CGameStore::~CGameStore()
|
|||
|
|
{
|
|||
|
|
m_Merchands.empty();
|
|||
|
|
m_refreshConfig.empty();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CGameStore::LoadGameStore(LPCTSTR sFilePath)
|
|||
|
|
{
|
|||
|
|
bool result = false;
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
//定义一个临时的商品表,将商品读取到此临时表。如果最终读取完成则拷贝到商品表中
|
|||
|
|
CVector<Merchandise> merchandList;
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//加载商城配置文件
|
|||
|
|
if (ms.loadFromFile(sFilePath) <= 0)
|
|||
|
|
{
|
|||
|
|
showErrorFormat(_T("unable to load GameStore config %s "), sFilePath);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
//对配置文件进行预处理
|
|||
|
|
GetLogicServer()->GetVSPDefine().RegisteToPreprocessor(pp);
|
|||
|
|
LPCTSTR sText = pp.parse((LPCTSTR)ms.getMemory(), sFilePath);
|
|||
|
|
//设置配置脚本
|
|||
|
|
if ( !sText || !setScript(sText) )
|
|||
|
|
{
|
|||
|
|
showError(_T("parse config error"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
//读取配置
|
|||
|
|
result = ReadShopConfig();//ReadConfig(merchandList);
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load GameStore config"));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//如果读取配置成功则将临时商品表中的商品添加到我的商品列表中
|
|||
|
|
if (result)
|
|||
|
|
{
|
|||
|
|
m_Merchands.clear();
|
|||
|
|
m_Merchands.addList(merchandList);
|
|||
|
|
merchandList.empty();
|
|||
|
|
}
|
|||
|
|
//清空脚本内存
|
|||
|
|
setScript(NULL);
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CGameStore::LoadGameRefresh(LPCTSTR sFilePath)
|
|||
|
|
{
|
|||
|
|
bool result = false;
|
|||
|
|
CMemoryStream ms;
|
|||
|
|
CCustomLuaPreProcessor pp;
|
|||
|
|
|
|||
|
|
//定义一个临时的商品表,将商品读取到此临时表。如果最终读取完成则拷贝到商品表中
|
|||
|
|
CVector<MerchanRefresh> refreshList; //商品的刷新
|
|||
|
|
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
//加载商城配置文件
|
|||
|
|
if (ms.loadFromFile(sFilePath) <= 0)
|
|||
|
|
{
|
|||
|
|
showErrorFormat(_T("unable to load GameRfreshStore config %s "), sFilePath);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
//对配置文件进行预处理
|
|||
|
|
GetLogicServer()->GetVSPDefine().RegisteToPreprocessor(pp);
|
|||
|
|
LPCTSTR sText = pp.parse((LPCTSTR)ms.getMemory(), sFilePath);
|
|||
|
|
//设置配置脚本
|
|||
|
|
if ( !sText || !setScript(sText) )
|
|||
|
|
{
|
|||
|
|
showError(_T("parse config error"));
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
//读取配置
|
|||
|
|
result = ReadRefreshConfig(refreshList);
|
|||
|
|
}
|
|||
|
|
catch (RefString &s)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, s.rawStr());
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected error on load GameRefresh config"));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//如果读取配置成功则将临时商品表中的商品添加到我的商品列表中
|
|||
|
|
if (result)
|
|||
|
|
{
|
|||
|
|
m_refreshConfig.clear();
|
|||
|
|
m_refreshConfig.addList(refreshList);
|
|||
|
|
refreshList.empty();
|
|||
|
|
}
|
|||
|
|
//清空脚本内存
|
|||
|
|
setScript(NULL);
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CGameStore::ReadRefreshConfig(CBaseList<MerchanRefresh> &refreshList)
|
|||
|
|
{
|
|||
|
|
if (!openGlobalTable("RefreshStore"))
|
|||
|
|
return false;
|
|||
|
|
//遍历刷新的列表
|
|||
|
|
|
|||
|
|
m_labelCount.clear();
|
|||
|
|
INT_PTR nLabelId=0;
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
MerchanRefresh md;
|
|||
|
|
|
|||
|
|
int nDef =-1;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
nLabelId ++;
|
|||
|
|
int nCountLimit = getFieldInt("count");
|
|||
|
|
m_labelCount.add(nCountLimit);
|
|||
|
|
|
|||
|
|
if ( openFieldTable("items") )
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
md.nMerchandiseId = getFieldInt("id");
|
|||
|
|
|
|||
|
|
if(GetMerchandise(md.nMerchandiseId) ==NULL)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("store refresh data, id=%d is invalid"),md.nMerchandiseId );
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
md.nCount = getFieldInt("count");
|
|||
|
|
|
|||
|
|
nDef =-1;
|
|||
|
|
md.nWeekDay = (BYTE)getFieldInt("weekDay",&nDef);
|
|||
|
|
|
|||
|
|
md.bMonth = (BYTE)getFieldInt("month",&nDef);
|
|||
|
|
|
|||
|
|
md.bDay = (BYTE)getFieldInt("day",&nDef);
|
|||
|
|
|
|||
|
|
|
|||
|
|
nDef = 0;
|
|||
|
|
md.nPercent = getFieldInt("percent",&nDef);
|
|||
|
|
|
|||
|
|
md.nOpenServerDay = (BYTE)getFieldInt("openServerDay",&nDef);
|
|||
|
|
|
|||
|
|
md.nMergeServerDay= (BYTE)getFieldInt("mergeServerDay",&nDef);
|
|||
|
|
|
|||
|
|
md.nBeforeMergeDay= (BYTE)getFieldInt("beforeMergeDay",&nDef);
|
|||
|
|
|
|||
|
|
md.nLabelId = (BYTE)nLabelId;
|
|||
|
|
|
|||
|
|
|
|||
|
|
refreshList.add(md);
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
} while (enumTableNext());
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const CGameStore::PMERCHANDISE CGameStore::GetMerchandise(const INT_PTR nId)const
|
|||
|
|
{
|
|||
|
|
INT_PTR i;
|
|||
|
|
for (i=m_Merchands.count()-1; i>-1; --i)
|
|||
|
|
{
|
|||
|
|
if (m_Merchands[i].nId == nId)
|
|||
|
|
{
|
|||
|
|
return &m_Merchands[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
const CGameStore::PMERCHANDISE CGameStore::GetShopItem( WORD wItemId) const
|
|||
|
|
{
|
|||
|
|
INT_PTR i;
|
|||
|
|
for (i=m_Merchands.count()-1; i>-1; --i)
|
|||
|
|
{
|
|||
|
|
if (m_Merchands[i].wItemId == wItemId)
|
|||
|
|
{
|
|||
|
|
return &m_Merchands[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CGameStore::ReadConfig(CBaseList<Merchandise> &merchandList)
|
|||
|
|
{
|
|||
|
|
//打开商城配置表
|
|||
|
|
if( !openGlobalTable("GameStore") )
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
LPCSTR sSPID = GetLogicServer()->GetVSPDefine().GetDefinition(CVSPDefinition::SPID);
|
|||
|
|
//遍历商城分类表
|
|||
|
|
if( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
Merchandise md;
|
|||
|
|
//获取当前的SPID
|
|||
|
|
|
|||
|
|
int nDefault=0;
|
|||
|
|
|
|||
|
|
m_Merchands.clear();
|
|||
|
|
|
|||
|
|
int nDef =0;
|
|||
|
|
int nCountDef = 1; //缺省每次购买1个物品
|
|||
|
|
int nJobDef = 0; //无职业要求
|
|||
|
|
int nSexDef = -1; //无性别要求
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
//标签的id
|
|||
|
|
int labelId = getFieldInt("labelId",&nDefault); //分类的id
|
|||
|
|
int nTotalCount = getFieldInt("totalBuyLimit",&nDefault); //最大能够购买的数目
|
|||
|
|
bool bDefault = false;
|
|||
|
|
|
|||
|
|
//是否是动态添加的
|
|||
|
|
bool bDynamicAdd = getFieldBoolean("dynamicAdd",&bDefault);
|
|||
|
|
|
|||
|
|
//打开商品分类中的商品表
|
|||
|
|
if ( openFieldTable("items") )
|
|||
|
|
{
|
|||
|
|
//遍历单个商品分类中的所有商品
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
nDef =0;
|
|||
|
|
md.nId = getFieldInt("id"); //销售ID,商城中的任意商品必须都不一样
|
|||
|
|
md.wItemId = getFieldInt("item");
|
|||
|
|
md.wItemCount = getFieldInt("count", &nCountDef);
|
|||
|
|
md.bQuality = (BYTE)getFieldInt("quality",&nDef);
|
|||
|
|
md.wQualityDataIndex = (WORD)getFieldInt("qualityDataIndex",&nDef);
|
|||
|
|
md.bStrong = (BYTE)getFieldInt("strong",&nDef);
|
|||
|
|
md.bLabelId = (BYTE) labelId; //分类的ID
|
|||
|
|
md.wLabelBuyLimit = (WORD) nTotalCount; //整个分类能买多少个
|
|||
|
|
md.bSaleLevel = (BYTE)getFieldInt("saleLevel",&nDef);
|
|||
|
|
md.nJob = (int)getFieldInt("job",&nJobDef); //职业要求
|
|||
|
|
md.nSex = (int)getFieldInt("sex",&nSexDef); //性别要求
|
|||
|
|
md.bUse = (BYTE)getFieldInt("use",&nDef); // 立即使用要求
|
|||
|
|
md.bDynamicAdd = bDynamicAdd; //是否是动态添加的
|
|||
|
|
int nSingleBuyLimit = getFieldInt("singleBuyLimit",&nDefault); //单个商品每天购买的数目
|
|||
|
|
|
|||
|
|
|
|||
|
|
md.bSingleBuyLimit = (WORD)nSingleBuyLimit; //单个商品的数目限制
|
|||
|
|
|
|||
|
|
md.dFreshBuyLimit = (WORD)getFieldInt("freshBuyLimit",&nDefault);
|
|||
|
|
|
|||
|
|
//读取物品的价格,如果价格有效则添加到商品表中
|
|||
|
|
if( ReadMerchandisePrice(sSPID, md) && md.dwPrice >= 0 )
|
|||
|
|
{
|
|||
|
|
//如果已经存在同ID的物品则报错
|
|||
|
|
for(int i=0; i < merchandList.count(); ++i)
|
|||
|
|
{
|
|||
|
|
if( merchandList[i].nId == md.nId )
|
|||
|
|
{
|
|||
|
|
showErrorFormat(_T("store id %d already exists"), md.nId);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
merchandList.add(md);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("store id =%d, price error"),md.nId );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CGameStore::ReadMerchandisePrice(LPCSTR sCurrSPID, Merchandise &merchandise)
|
|||
|
|
{
|
|||
|
|
//如果价格配置表不存在则返回false
|
|||
|
|
if ( !feildTableExists("price") )
|
|||
|
|
return false;
|
|||
|
|
//打开价格配置表
|
|||
|
|
if ( openFieldTable("price") )
|
|||
|
|
{
|
|||
|
|
LPCSTR sSPID;
|
|||
|
|
UINT dwPrice; //原价
|
|||
|
|
|
|||
|
|
//遍历价格配置表
|
|||
|
|
if (enumTableFirst())
|
|||
|
|
{
|
|||
|
|
merchandise.dwPrice = 0; //将价格标记为0以便不出售
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
sSPID = getFieldString("spid"); //运营商ID,不同的运营商,可能商品价格不同
|
|||
|
|
if ( *(PWORD)sSPID == '*' || !strcmp(sSPID, sCurrSPID) )
|
|||
|
|
{
|
|||
|
|
merchandise.btDealGoldType = getFieldInt("type"); //货币类型(0-金币,2-绑定元宝,3-元宝)
|
|||
|
|
//验证交易币种类型配置是否有效,如果无效则报错(这里从原货币类型改为奖励类型)
|
|||
|
|
if( merchandise.btDealGoldType < qatEquipment || merchandise.btDealGoldType >= qatAwardTypeCount )
|
|||
|
|
showErrorFormat(_T("invalid dealType value %d of merchandise %d"), merchandise.btDealGoldType, merchandise.nId);
|
|||
|
|
dwPrice = getFieldInt("price"); //原价
|
|||
|
|
if( *(PWORD)sSPID != '*' || merchandise.dwPrice == 0 )
|
|||
|
|
{
|
|||
|
|
merchandise.dwPrice = dwPrice;
|
|||
|
|
merchandise.boBind = getFieldBoolean("bind");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
while (enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CGameStore::showError(LPCTSTR sError)
|
|||
|
|
{
|
|||
|
|
m_sLastErrDesc = sError;
|
|||
|
|
RefString s = _T("[GameStore]");
|
|||
|
|
s += sError;
|
|||
|
|
throw s;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CGameStore::LoadDynamicData()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
m_dynamicMerchands.LoadFromFile("./data/runtime/store/dynamicMerchans.rtd"); //动态的商品
|
|||
|
|
m_consumerMerchands.LoadFromFile("./data/runtime/store/consumeMerchans.rtd"); //玩家消耗的商品
|
|||
|
|
m_refreshTime.LoadFromFile("./data/runtime/store/refreshTime.rtd"); //刷新时间
|
|||
|
|
|
|||
|
|
m_YBConsumeRank.LoadTodayConsumeRankFile();
|
|||
|
|
m_YBConsumeRank.LoadYesterdayConsumeRank();
|
|||
|
|
|
|||
|
|
//如果保存的时间过期了,那么就需要刷新
|
|||
|
|
unsigned int nCurrentTime = CMiniDateTime::now();
|
|||
|
|
for(INT i=1;i <= m_labelCount.count(); i++)
|
|||
|
|
{
|
|||
|
|
unsigned int nLastRefTime=(unsigned int) GetRefreshTime(i);
|
|||
|
|
if(nLastRefTime + REFRESH_TIME_INTERVAL <= nCurrentTime ) //这里表示已经过期,可以继续刷新了
|
|||
|
|
{
|
|||
|
|
ResetDynamicMerchadise(i);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CGameStore::SaveDynamicData()
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmTip,_T("Saving Store dynamic data"));
|
|||
|
|
m_dynamicMerchands.SaveToFile("./data/runtime/store/dynamicMerchans.rtd"); //动态的商品
|
|||
|
|
m_consumerMerchands.SaveToFile("./data/runtime/store/consumeMerchans.rtd"); //玩家消耗的商品
|
|||
|
|
m_refreshTime.SaveToFile("./data/runtime/store/refreshTime.rtd"); //刷新时间
|
|||
|
|
//m_YBConsumeRank.SaveTodayConsumeRankToFile();
|
|||
|
|
//m_YBConsumeRank.SaveYesterdayConsumeRankToFile();
|
|||
|
|
|
|||
|
|
OutputMsg(rmTip,_T("Save Store dynamic data finish"));
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CGameStore::ResetLabelConfigData(INT nLabelID)
|
|||
|
|
{
|
|||
|
|
if(nLabelID <=0 || nLabelID > m_labelCount.count())
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError,_T("%s,invalid labelid=%d"),__FUNCTION__,nLabelID);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
INT_PTR nCountLimit = m_labelCount[nLabelID-1]; //该分类的数目的限制
|
|||
|
|
if(nCountLimit <=0 ) return ;
|
|||
|
|
//这里首先判断是开服以来的第几天
|
|||
|
|
int nDays= GetLogicServer()->GetDaysSinceOpenServer(); //开服以来的第几天
|
|||
|
|
if(nDays ==0 )
|
|||
|
|
{
|
|||
|
|
nDays =1;
|
|||
|
|
}
|
|||
|
|
//是合服以来的第几天
|
|||
|
|
int nMergeServerDay =GetLogicServer()->GetDaysSinceCombineServer();
|
|||
|
|
//是合服前第几天
|
|||
|
|
int nBeforeMergeDay = GetGlobalLogicEngine()->GetMiscMgr().GetDaysBeforeCombineServer();
|
|||
|
|
if(nBeforeMergeDay <=0)
|
|||
|
|
{
|
|||
|
|
nBeforeMergeDay =-2;
|
|||
|
|
}
|
|||
|
|
SYSTEMTIME sysTime;
|
|||
|
|
GetLocalTime(&sysTime); //获取当前的时间
|
|||
|
|
BYTE nCurrentMonth=(BYTE) sysTime.wMonth ; //月份
|
|||
|
|
BYTE nCurrentDay = (BYTE) sysTime.wDay ; //天
|
|||
|
|
|
|||
|
|
INT_PTR nFindCount=0; //已经找到的数目
|
|||
|
|
CVector<MerchanRefresh> data;
|
|||
|
|
INT_PTR nOpenServerCount=0; // 开服第几天的数目为0
|
|||
|
|
|
|||
|
|
//优先满足开服,然后满足日期,最后按星期筛选
|
|||
|
|
for( INT_PTR i=0; i < m_refreshConfig.count() ; i++)
|
|||
|
|
{
|
|||
|
|
if( m_refreshConfig[i].nLabelId == nLabelID) //如果称号
|
|||
|
|
{
|
|||
|
|
//openServerDay 开服的第几天 ,1表示开服第1天,2第2天,0表示不做开服的限制
|
|||
|
|
BYTE bValue= m_refreshConfig[i].nOpenServerDay; //开服以来的第几天
|
|||
|
|
if( bValue != (BYTE)0) //这里优先开服的天数
|
|||
|
|
{
|
|||
|
|
if( bValue == nDays )
|
|||
|
|
{
|
|||
|
|
data.insert(0,m_refreshConfig[i]);
|
|||
|
|
nOpenServerCount ++;
|
|||
|
|
}
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
BYTE bMonth = m_refreshConfig[i].bMonth; //月
|
|||
|
|
BYTE bDay = m_refreshConfig[i].bDay;//日
|
|||
|
|
|
|||
|
|
//有月份或者日的的限制的
|
|||
|
|
if( bMonth != BYTE(-1) || bDay != (BYTE)-1 )
|
|||
|
|
{
|
|||
|
|
//满足了日期了
|
|||
|
|
if( (bMonth == nCurrentMonth || bMonth == BYTE(-1)) &&
|
|||
|
|
(bDay == nCurrentDay || bDay == BYTE(-1))
|
|||
|
|
)
|
|||
|
|
{
|
|||
|
|
data.insert(nOpenServerCount,m_refreshConfig[i]); //在后面添加
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//weekDay表示星期几, -1表示不限制星期几,0表示周日,1表示周1 ,...6表示周6
|
|||
|
|
|
|||
|
|
if(m_refreshConfig[i].nMergeServerDay !=0)
|
|||
|
|
{
|
|||
|
|
if(nMergeServerDay == m_refreshConfig[i].nMergeServerDay)
|
|||
|
|
{
|
|||
|
|
data.add(m_refreshConfig[i]); //在后面添加
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if( m_refreshConfig[i].nBeforeMergeDay !=0)
|
|||
|
|
{
|
|||
|
|
if (nBeforeMergeDay > 0 && (m_refreshConfig[i].nBeforeMergeDay == BYTE(-1) || nBeforeMergeDay == m_refreshConfig[i].nBeforeMergeDay))
|
|||
|
|
{
|
|||
|
|
data.add(m_refreshConfig[i]); //在后面添加
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
bValue = m_refreshConfig[i].nWeekDay ;
|
|||
|
|
if(bValue == BYTE(-1) || bValue == sysTime.wDayOfWeek)
|
|||
|
|
{
|
|||
|
|
data.add(m_refreshConfig[i]); //在后面添加
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
INT_PTR nCount =0;
|
|||
|
|
for(INT_PTR i=0; i < data.count(); i ++ )
|
|||
|
|
{
|
|||
|
|
unsigned int nRandom = GetGlobalLogicEngine()->GetRandValue(10000) + 1;
|
|||
|
|
if (((unsigned)data[i].nPercent) == 0 || nRandom <= ((unsigned)data[i].nPercent))
|
|||
|
|
{
|
|||
|
|
AddDynamicMerchadise(data[i].nMerchandiseId, data[i].nCount);//添加道具进去
|
|||
|
|
OutputMsg(rmTip,_T("Store add dynamic merchandise,id=%d,count=%d"),data[i].nMerchandiseId,data[i].nCount);
|
|||
|
|
|
|||
|
|
nCount++;
|
|||
|
|
if(nCount >= nCountLimit)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
void CGameStore::ResetDynamicMerchadise(INT nLabel,bool bNeedBroadcast)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
CGameStore& store= GetLogicServer()->GetDataProvider()->GetGameStore();
|
|||
|
|
|
|||
|
|
CGameStore::PMERCHANDISE pMerchandise ;
|
|||
|
|
INT_PTR nCount = m_dynamicMerchands.RankCount();
|
|||
|
|
//将动态物品列表里该分类的数据全部删除
|
|||
|
|
for( INT_PTR i= nCount-1; i >=0; i--)
|
|||
|
|
{
|
|||
|
|
CGameStoreRank::PSALADATA pData = &m_dynamicMerchands[i];
|
|||
|
|
|
|||
|
|
//获得商品的指针
|
|||
|
|
pMerchandise= store.GetMerchandise(pData->nId);
|
|||
|
|
if(pMerchandise)
|
|||
|
|
{
|
|||
|
|
if(pMerchandise->bLabelId == (BYTE)nLabel )
|
|||
|
|
{
|
|||
|
|
m_dynamicMerchands.RemoveIndex(i);
|
|||
|
|
m_dynamicMerchands.SetDataChange();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else //如果这个道具已经失效了,直接删除
|
|||
|
|
{
|
|||
|
|
m_dynamicMerchands.RemoveIndex(i);
|
|||
|
|
m_dynamicMerchands.SetDataChange();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//删除玩家购买列表里这个分类的数据
|
|||
|
|
nCount = m_consumerMerchands.RankCount();
|
|||
|
|
for( INT_PTR i= nCount-1; i >=0; i--)
|
|||
|
|
{
|
|||
|
|
CGameStoreRank::PSALADATA pData = &m_consumerMerchands[i];
|
|||
|
|
pMerchandise= store.GetMerchandise(pData->nId);
|
|||
|
|
if(pMerchandise)
|
|||
|
|
{
|
|||
|
|
if(pMerchandise->bLabelId == (BYTE)nLabel )
|
|||
|
|
{
|
|||
|
|
m_consumerMerchands.RemoveIndex(i);
|
|||
|
|
m_consumerMerchands.SetDataChange();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else //如果这个道具已经失效了,直接删除
|
|||
|
|
{
|
|||
|
|
m_consumerMerchands.RemoveIndex(i);
|
|||
|
|
m_consumerMerchands.SetDataChange();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//更新刷新的时间
|
|||
|
|
UpdateRefreshTime(nLabel);
|
|||
|
|
|
|||
|
|
//重置该分类的数据
|
|||
|
|
ResetLabelConfigData (nLabel);
|
|||
|
|
|
|||
|
|
// //如果需要广播的话,广播一个分类的数据发生了改变
|
|||
|
|
// if(bNeedBroadcast)
|
|||
|
|
// {
|
|||
|
|
// CGameStoreBuySystem::BroadLabelRefresh(nLabel);
|
|||
|
|
// }
|
|||
|
|
}
|
|||
|
|
void CGameStore::UpdateRefreshTime(INT nLabelId)
|
|||
|
|
{
|
|||
|
|
bool isExist;
|
|||
|
|
UINT nTime=(UINT) m_refreshTime.GetIdCount(nLabelId,isExist); //时间
|
|||
|
|
unsigned int nCurrentTime= CMiniDateTime::now();
|
|||
|
|
if(isExist) //存在这个分类
|
|||
|
|
{
|
|||
|
|
m_refreshTime.UpdateSelaCount(nLabelId,(INT)nCurrentTime);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if(nTime > nCurrentTime)
|
|||
|
|
{
|
|||
|
|
m_refreshTime.UpdateSelaCount(nLabelId,(INT)(nTime - nCurrentTime));
|
|||
|
|
}
|
|||
|
|
else if(nTime <= nCurrentTime)
|
|||
|
|
{
|
|||
|
|
m_refreshTime.UpdateSelaCount(nLabelId,(INT)(nCurrentTime - nTime));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
unsigned int CGameStore::GetRefreshTime(INT nLableId)
|
|||
|
|
{
|
|||
|
|
bool isExist;
|
|||
|
|
|
|||
|
|
INT nValue= m_refreshTime.GetIdCount(nLableId,isExist);
|
|||
|
|
if(isExist)
|
|||
|
|
{
|
|||
|
|
return (unsigned int)nValue;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//获取角色的消费数据
|
|||
|
|
CVector<CGameStoreRank::SaleData>& CGameStore::GetActcorConsumeData(INT nActorId)
|
|||
|
|
{
|
|||
|
|
m_actorConsumeList.clear();
|
|||
|
|
|
|||
|
|
for(INT_PTR i=0;i < m_consumerMerchands.RankCount(); i++)
|
|||
|
|
{
|
|||
|
|
CGameStoreRank::SaleData * pSale =& m_consumerMerchands[i];
|
|||
|
|
if(pSale->nActorId ==nActorId)
|
|||
|
|
{
|
|||
|
|
m_actorConsumeList.add(*pSale);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return m_actorConsumeList;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
bool CGameStore::ReadShopConfig()
|
|||
|
|
{
|
|||
|
|
//打开商城配置表
|
|||
|
|
m_shops.clear();
|
|||
|
|
if( !openGlobalTable("ShopConfig") )
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
//遍历商城分类表
|
|||
|
|
if( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
int nDef =0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
if( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
if( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
//标签的id
|
|||
|
|
int shoptype = getFieldInt("shoptype"); //分类的id
|
|||
|
|
int nTabshop = getFieldInt("Tabshop",&nDef); //
|
|||
|
|
ShopConfig shop;
|
|||
|
|
shop.nShopId= getFieldInt("shopid",&nDef); //
|
|||
|
|
shop.nLimitLv= getFieldInt("levellimit",&nDef); //
|
|||
|
|
shop.nReincarnationlimit= getFieldInt("reincarnationlimit",&nDef); //
|
|||
|
|
shop.nFlag= getFieldInt("flag",&nDef); //
|
|||
|
|
shop.nDaylimit= getFieldInt("daylimit",&nDef); //
|
|||
|
|
shop.nStaticType= getFieldInt("statictype",&nDef); //
|
|||
|
|
shop.nGuildLevelLimit = getFieldInt("guildLevel",&nDef);
|
|||
|
|
|
|||
|
|
// 购买商品广播消息
|
|||
|
|
if(isExistString("tips"))
|
|||
|
|
{
|
|||
|
|
getFieldStringBuffer("tips", shop.tips, ArrayCount(shop.tips) );
|
|||
|
|
} else {
|
|||
|
|
ZeroMemory( shop.tips, sizeof(shop.tips) );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//打开商品分类中的商品表
|
|||
|
|
if ( feildTableExists("shop") && openFieldTable("shop"))
|
|||
|
|
{
|
|||
|
|
shop.shop.nType = getFieldInt("type", &nDef);
|
|||
|
|
shop.shop.nItemId = getFieldInt("id", &nDef);
|
|||
|
|
shop.shop.nCount = getFieldInt("count", &nDef);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//打开商品分类中的商品表
|
|||
|
|
if ( feildTableExists("npc") && openFieldTable("npc"))
|
|||
|
|
{
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
int npcId = (int)getFieldInt(NULL);
|
|||
|
|
shop.nNpc.push_back(npcId);
|
|||
|
|
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( feildTableExists("price") && openFieldTable("price"))
|
|||
|
|
{
|
|||
|
|
shop.price.nType = getFieldInt("type", &nDef);
|
|||
|
|
shop.price.nId = getFieldInt("id", &nDef);
|
|||
|
|
shop.price.nCount = getFieldInt("count", &nDef);
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
shop.buyLimit.clear();
|
|||
|
|
if( feildTableExists("buytype") && openFieldTable("buytype"))
|
|||
|
|
{
|
|||
|
|
if ( enumTableFirst() )
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ShopBuyType buyCfg;
|
|||
|
|
buyCfg.nType = getFieldInt("type", &nDef);
|
|||
|
|
buyCfg.limits.clear();
|
|||
|
|
if(feildTableExists("limit") && openFieldTable("limit"))
|
|||
|
|
{
|
|||
|
|
if(enumTableFirst())
|
|||
|
|
{
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
int nValue = getFieldInt("value",&nDef );
|
|||
|
|
int nTimes = getFieldInt("times",&nDef );
|
|||
|
|
buyCfg.limits[nValue] = nTimes;
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
shop.buyLimit.push_back(buyCfg);
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
}
|
|||
|
|
m_shops[shoptype][nTabshop].push_back(shop);
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}while(enumTableNext());
|
|||
|
|
}
|
|||
|
|
closeTable();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CGameStore::getLimitTimes(std::vector<ShopBuyType>&buyLimit, CActor* pActor, int nOpenDay)
|
|||
|
|
{
|
|||
|
|
int times = -1;
|
|||
|
|
if(buyLimit.size() <= 0)
|
|||
|
|
return 0;
|
|||
|
|
std::vector<ShopBuyType>::iterator it = buyLimit.begin();
|
|||
|
|
|
|||
|
|
for(;it != buyLimit.end(); it++)
|
|||
|
|
{
|
|||
|
|
ShopBuyType& infoCfg = *it;
|
|||
|
|
int nValue = 0;
|
|||
|
|
switch (infoCfg.nType)
|
|||
|
|
{
|
|||
|
|
case BuyShopLimitLevel:
|
|||
|
|
if(pActor)
|
|||
|
|
{
|
|||
|
|
nValue = pActor->GetLevel();
|
|||
|
|
}
|
|||
|
|
/* code */
|
|||
|
|
break;
|
|||
|
|
case BuyShopLimitCircle:
|
|||
|
|
if(pActor)
|
|||
|
|
{
|
|||
|
|
nValue = pActor->GetCircleLevel();
|
|||
|
|
}
|
|||
|
|
/* code */
|
|||
|
|
break;
|
|||
|
|
case BuyShopLimitOpenServerDay:
|
|||
|
|
nValue = nOpenDay;
|
|||
|
|
/* code */
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if(infoCfg.limits.size() <= 0)
|
|||
|
|
continue;
|
|||
|
|
std::map<int, int>::iterator ot = infoCfg.limits.begin();
|
|||
|
|
for(; ot != infoCfg.limits.end(); ot++)
|
|||
|
|
{
|
|||
|
|
if(nValue >= ot->first /*&& ot->second > times */)
|
|||
|
|
{
|
|||
|
|
times = ot->second;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
return times;
|
|||
|
|
}
|