|  |  |  | 
|---|
|  |  |  | import random | 
|---|
|  |  |  | import math | 
|---|
|  |  |  | import time | 
|---|
|  |  |  |  | 
|---|
|  |  |  | g_mysticalShopDict = {} #神秘商店{等级范围:[等级段,{金钱类型:库}]} | 
|---|
|  |  |  | #--------------------------------------------------------------------- | 
|---|
|  |  |  | ##开始交易 | 
|---|
|  |  |  | # @param curPlayer 玩家实例 | 
|---|
|  |  |  | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_SuperGiftHasOpen, 1) | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | SyncMysticalShopInfo(curPlayer) | 
|---|
|  |  |  | SyncMysticalLimitShopInfo(curPlayer) | 
|---|
|  |  |  | SyncShopItemTodayBuyCount(curPlayer) | 
|---|
|  |  |  | SyncSuperGiftInfo(curPlayer) | 
|---|
|  |  |  | SyncMysticalShopInfo(curPlayer) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ##商店物品OnDay | 
|---|
|  |  |  | 
|---|
|  |  |  | UpdataSuperGiftTime(curPlayer, True) | 
|---|
|  |  |  | OSSaleOpenMail(curPlayer) | 
|---|
|  |  |  | refreshType = [3] | 
|---|
|  |  |  | #神秘商店刷新次数重置 | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, 0) | 
|---|
|  |  |  | SyncMysticalShopInfo(curPlayer) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | elif onEventType == ShareDefine.Def_OnEventTypeEx: | 
|---|
|  |  |  | refreshType = [4] | 
|---|
|  |  |  | openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) | 
|---|
|  |  |  | 
|---|
|  |  |  | SyncShopItemTodayBuyCount(curPlayer, syncIndexList, True) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def MysticalShopOpen(curPlayer, befLV, aftLV): | 
|---|
|  |  |  | def MysticalLimitShopOpen(curPlayer, befLV, aftLV): | 
|---|
|  |  |  | ##神秘限购开启 | 
|---|
|  |  |  | ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('Store', {'ShopType':16}, True) | 
|---|
|  |  |  | if not ipyDataList: | 
|---|
|  |  |  | 
|---|
|  |  |  | syncGoodsList.append(goodsID) | 
|---|
|  |  |  | GameWorld.DebugLog('神秘限购商品%s 开卖'%goodsID, curPlayer.GetID()) | 
|---|
|  |  |  | if syncGoodsList: | 
|---|
|  |  |  | SyncMysticalShopInfo(curPlayer) | 
|---|
|  |  |  | SyncMysticalLimitShopInfo(curPlayer) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SyncMysticalShopInfo(curPlayer): | 
|---|
|  |  |  | def SyncMysticalLimitShopInfo(curPlayer): | 
|---|
|  |  |  | ##神秘限购通知 | 
|---|
|  |  |  | packData = ChPyNetSendPack.tagMCMysticalShopTimeInfo() | 
|---|
|  |  |  | packData.ShopTimeList = [] | 
|---|
|  |  |  | 
|---|
|  |  |  | NetPackCommon.SendFakePack(curPlayer, packData) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def CheckMysticalShopRefresh(curPlayer, tick): | 
|---|
|  |  |  | ##神秘商店刷新 | 
|---|
|  |  |  | createRoleTime = curPlayer.GetCreateRoleTime() | 
|---|
|  |  |  | diffTime = GameWorld.GetCurrentTime() - GameWorld.GetDateTimeByStr(createRoleTime, ChConfig.TYPE_Time_Format) | 
|---|
|  |  |  | pastSeconds = diffTime.days*24*60*60 + diffTime.seconds | 
|---|
|  |  |  | refreshTime = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 4) | 
|---|
|  |  |  | if pastSeconds % refreshTime == 0: | 
|---|
|  |  |  | __DoMysticalShopRefresh(curPlayer, True, tick) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | #// A2 32 神秘商店刷新 #tagCMRefreshMysticalShop | 
|---|
|  |  |  | #struct    tagCMRefreshMysticalShop | 
|---|
|  |  |  | #{ | 
|---|
|  |  |  | #    tagHead        Head; | 
|---|
|  |  |  | #}; | 
|---|
|  |  |  | def OnMysticalShopRefresh(index, clientData, tick): | 
|---|
|  |  |  | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) | 
|---|
|  |  |  | __DoMysticalShopRefresh(curPlayer, False, tick) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def __DoMysticalShopRefresh(curPlayer, isFree, tick): | 
|---|
|  |  |  | global g_mysticalShopDict #{等级范围:[等级段,{金钱类型:库}]} | 
|---|
|  |  |  |  | 
|---|
|  |  |  | lastTime = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_MysticalShopLastTime) | 
|---|
|  |  |  | if lastTime and tick - lastTime < 1000: | 
|---|
|  |  |  | #GameWorld.DebugLog('神秘商店刷新,过于频繁!') | 
|---|
|  |  |  | return | 
|---|
|  |  |  | curPlayer.SetDict(ChConfig.Def_PlayerKey_MysticalShopLastTime, tick) | 
|---|
|  |  |  | if not g_mysticalShopDict: | 
|---|
|  |  |  | ipyMgr= IpyGameDataPY.IPY_Data() | 
|---|
|  |  |  | for i in xrange(ipyMgr.GetMysteryShopCount()): | 
|---|
|  |  |  | ipyData = ipyMgr.GetMysteryShopByIndex(i) | 
|---|
|  |  |  | lvRange = ipyData.GetLVRange() | 
|---|
|  |  |  | goodsID = ipyData.GetGoodsID() | 
|---|
|  |  |  | goodsIpyData = IpyGameDataPY.GetIpyGameData('Store', goodsID) | 
|---|
|  |  |  | moneyType = goodsIpyData.GetMoneyType() | 
|---|
|  |  |  | weight = goodsIpyData.GetLimitValue() | 
|---|
|  |  |  | lvkey = tuple(lvRange) | 
|---|
|  |  |  | if lvkey not in g_mysticalShopDict: | 
|---|
|  |  |  | g_mysticalShopDict[lvkey] = [lvkey[0], {}] | 
|---|
|  |  |  | weightDict = {} | 
|---|
|  |  |  | if moneyType not in g_mysticalShopDict[lvkey][1]: | 
|---|
|  |  |  | g_mysticalShopDict[lvkey][1][moneyType] = [] | 
|---|
|  |  |  | weightDict[moneyType] = weightDict.get(moneyType, 0) + weight | 
|---|
|  |  |  | g_mysticalShopDict[lvkey][1][moneyType].append([weightDict[moneyType], goodsID]) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | playerLV = curPlayer.GetLV() | 
|---|
|  |  |  | curLVDan, shopDict = GameWorld.GetDictValueByRangeKey(g_mysticalShopDict, playerLV) | 
|---|
|  |  |  | if not shopDict: | 
|---|
|  |  |  | return | 
|---|
|  |  |  | maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1) | 
|---|
|  |  |  | goldGoodsCnt =GameWorld.GetResultByRandomList(IpyGameDataPY.GetFuncEvalCfg('MysteryShopGoods', 2)) | 
|---|
|  |  |  | if not goldGoodsCnt: | 
|---|
|  |  |  | return | 
|---|
|  |  |  | specialGoodsID = 0 #必出的商品ID | 
|---|
|  |  |  | if not isFree: | 
|---|
|  |  |  | #优先道具,再仙玉 | 
|---|
|  |  |  | itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) | 
|---|
|  |  |  | costItemID = IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 1) | 
|---|
|  |  |  | costItemCntDict = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 2) | 
|---|
|  |  |  | curRefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt) | 
|---|
|  |  |  | cntList = [int(cnt) for cnt in costItemCntDict.keys()] | 
|---|
|  |  |  | cntList.sort() | 
|---|
|  |  |  | costItemCnt = costItemCntDict[str(cntList[-1])] | 
|---|
|  |  |  | for cnt in cntList: | 
|---|
|  |  |  | if curRefreshCnt <= cnt: | 
|---|
|  |  |  | costItemCnt = costItemCntDict[str(cnt)] | 
|---|
|  |  |  | break | 
|---|
|  |  |  | enough, indexList, hasBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(costItemID, itemPack, costItemCnt) | 
|---|
|  |  |  | costGold = 0 | 
|---|
|  |  |  | if not enough: | 
|---|
|  |  |  | costGold = lackCnt * IpyGameDataPY.GetFuncCfg('MysteryShopRefresh', 3) | 
|---|
|  |  |  | if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, costGold, ChConfig.Def_Cost_MysteryShopRefresh): | 
|---|
|  |  |  | return | 
|---|
|  |  |  | ItemCommon.ReduceItem(curPlayer, itemPack, indexList, costItemCnt, False, "MysteryShopRefresh") | 
|---|
|  |  |  | curLVRefreshData = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopLVRefreshCnt) | 
|---|
|  |  |  | curLVRefreshCnt, lvDan = curLVRefreshData / 10000, curLVRefreshData % 10000 | 
|---|
|  |  |  | updLVRefreshCnt = 1 if curLVDan != lvDan else curLVRefreshCnt + 1 #等级段变更,重置该等级段的刷新次数 | 
|---|
|  |  |  | updLVRefreshData = min(updLVRefreshCnt * 10000+curLVDan, ChConfig.Def_UpperLimit_DWord) | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopLVRefreshCnt, updLVRefreshData) | 
|---|
|  |  |  | specialRefreshCfg = IpyGameDataPY.GetFuncEvalCfg('MysteryShopRefresh', 5) | 
|---|
|  |  |  | if curLVDan in specialRefreshCfg and updLVRefreshCnt == specialRefreshCfg[curLVDan][0]: | 
|---|
|  |  |  | specialGoodsID = specialRefreshCfg[curLVDan][1] | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopRefreshCnt, curRefreshCnt+1) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | goldGoodsCnt = min(goldGoodsCnt, maxCnt) | 
|---|
|  |  |  | sliverGoodsCnt = maxCnt - goldGoodsCnt | 
|---|
|  |  |  | goodsResultList = [] | 
|---|
|  |  |  | if goldGoodsCnt: | 
|---|
|  |  |  | goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Gold_Money, []), goldGoodsCnt, []) | 
|---|
|  |  |  | if sliverGoodsCnt: | 
|---|
|  |  |  | goodsResultList += GameWorld.GetResultByRandomListEx(shopDict.get(IPY_GameWorld.TYPE_Price_Silver_Money, []), sliverGoodsCnt, []) | 
|---|
|  |  |  | if specialGoodsID and specialGoodsID not in goodsResultList: | 
|---|
|  |  |  | goodsResultList[0] = specialGoodsID | 
|---|
|  |  |  | GameWorld.DebugLog('神秘商店刷新特殊规则,等级段:%s,updLVRefreshCnt=%s,specialGoodsID=%s'%(curLVDan, updLVRefreshCnt, specialGoodsID)) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog('神秘商店刷新isFree=%s,goldGoodsCnt=%s,sliverGoodsCnt=%s,goodsResultList=%s'%(isFree, goldGoodsCnt, sliverGoodsCnt, goodsResultList)) | 
|---|
|  |  |  | for i in xrange(maxCnt): | 
|---|
|  |  |  | goodsID = goodsResultList[i] if i < len(goodsResultList) else 0 | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MysticalShopGoods % i, goodsID) | 
|---|
|  |  |  | #֪ͨ | 
|---|
|  |  |  | SyncMysticalShopInfo(curPlayer) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SyncMysticalShopInfo(curPlayer): | 
|---|
|  |  |  | ##神秘商店通知 | 
|---|
|  |  |  | packData = ChPyNetSendPack.tagMCMysticalShopInfo() | 
|---|
|  |  |  | packData.RefreshCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopRefreshCnt) | 
|---|
|  |  |  | packData.GoodsList = [] | 
|---|
|  |  |  | maxCnt = IpyGameDataPY.GetFuncCfg('MysteryShopGoods', 1) | 
|---|
|  |  |  | for i in xrange(maxCnt): | 
|---|
|  |  |  | goodsID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MysticalShopGoods % i) | 
|---|
|  |  |  | goodsInfo = ChPyNetSendPack.tagMCMysticalShopGoods() | 
|---|
|  |  |  | goodsInfo.GoodsID = goodsID | 
|---|
|  |  |  | packData.GoodsList.append(goodsInfo) | 
|---|
|  |  |  | packData.Count = len(packData.GoodsList) | 
|---|
|  |  |  | NetPackCommon.SendFakePack(curPlayer, packData) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ## 回购物品 | 
|---|
|  |  |  | #  @param None | 
|---|
|  |  |  | #  @return None | 
|---|