10345 【英文】推金币优化(改为同步抽中位置编号)
| | |
| | |
|
| | | class tagMCTuijinbiInfo(Structure):
|
| | | Head = tagHead()
|
| | | DrawType = 0 #(BYTE DrawType)// 本次抽奖奖励类型,为0时表示非抽奖同步;1-金币;2-仙玉币;3-红包;4-超级奖励
|
| | | DrawCount = 0 #(DWORD DrawCount)// 本次抽奖奖励数量
|
| | | DrawNum = 0 #(BYTE DrawNum)// 本次抽中位置,为0时表示非抽奖同步
|
| | | PoolPrizeCnt = 0 #(BYTE PoolPrizeCnt)
|
| | | PoolPrizeList = list() #(vector<tagMCTuijinbiPool> PoolPrizeList)// 台面奖池信息列表,每次都完整通知
|
| | | data = None
|
| | |
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.DrawType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.DrawCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.DrawNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.PoolPrizeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.PoolPrizeCnt):
|
| | | temPoolPrizeList = tagMCTuijinbiPool()
|
| | |
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xAA
|
| | | self.Head.SubCmd = 0x05
|
| | | self.DrawType = 0
|
| | | self.DrawCount = 0
|
| | | self.DrawNum = 0
|
| | | self.PoolPrizeCnt = 0
|
| | | self.PoolPrizeList = list()
|
| | | return
|
| | |
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | for i in range(self.PoolPrizeCnt):
|
| | | length += self.PoolPrizeList[i].GetLength()
|
| | |
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.DrawType)
|
| | | data = CommFunc.WriteDWORD(data, self.DrawCount)
|
| | | data = CommFunc.WriteBYTE(data, self.DrawNum)
|
| | | data = CommFunc.WriteBYTE(data, self.PoolPrizeCnt)
|
| | | for i in range(self.PoolPrizeCnt):
|
| | | data = CommFunc.WriteString(data, self.PoolPrizeList[i].GetLength(), self.PoolPrizeList[i].GetBuffer())
|
| | |
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | DrawType:%d,
|
| | | DrawCount:%d,
|
| | | DrawNum:%d,
|
| | | PoolPrizeCnt:%d,
|
| | | PoolPrizeList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.DrawType,
|
| | | self.DrawCount,
|
| | | self.DrawNum,
|
| | | self.PoolPrizeCnt,
|
| | | "..."
|
| | | )
|
| | |
| | |
|
| | | class tagMCTuijinbiInfo(Structure):
|
| | | Head = tagHead()
|
| | | DrawType = 0 #(BYTE DrawType)// 本次抽奖奖励类型,为0时表示非抽奖同步;1-金币;2-仙玉币;3-红包;4-超级奖励
|
| | | DrawCount = 0 #(DWORD DrawCount)// 本次抽奖奖励数量
|
| | | DrawNum = 0 #(BYTE DrawNum)// 本次抽中位置,为0时表示非抽奖同步
|
| | | PoolPrizeCnt = 0 #(BYTE PoolPrizeCnt)
|
| | | PoolPrizeList = list() #(vector<tagMCTuijinbiPool> PoolPrizeList)// 台面奖池信息列表,每次都完整通知
|
| | | data = None
|
| | |
| | | def ReadData(self, _lpData, _pos=0, _Len=0):
|
| | | self.Clear()
|
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.DrawType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.DrawCount,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.DrawNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.PoolPrizeCnt,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.PoolPrizeCnt):
|
| | | temPoolPrizeList = tagMCTuijinbiPool()
|
| | |
| | | self.Head.Clear()
|
| | | self.Head.Cmd = 0xAA
|
| | | self.Head.SubCmd = 0x05
|
| | | self.DrawType = 0
|
| | | self.DrawCount = 0
|
| | | self.DrawNum = 0
|
| | | self.PoolPrizeCnt = 0
|
| | | self.PoolPrizeList = list()
|
| | | return
|
| | |
| | | length = 0
|
| | | length += self.Head.GetLength()
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | for i in range(self.PoolPrizeCnt):
|
| | | length += self.PoolPrizeList[i].GetLength()
|
| | |
| | | def GetBuffer(self):
|
| | | data = ''
|
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteBYTE(data, self.DrawType)
|
| | | data = CommFunc.WriteDWORD(data, self.DrawCount)
|
| | | data = CommFunc.WriteBYTE(data, self.DrawNum)
|
| | | data = CommFunc.WriteBYTE(data, self.PoolPrizeCnt)
|
| | | for i in range(self.PoolPrizeCnt):
|
| | | data = CommFunc.WriteString(data, self.PoolPrizeList[i].GetLength(), self.PoolPrizeList[i].GetBuffer())
|
| | |
| | | def OutputString(self):
|
| | | DumpString = '''
|
| | | Head:%s,
|
| | | DrawType:%d,
|
| | | DrawCount:%d,
|
| | | DrawNum:%d,
|
| | | PoolPrizeCnt:%d,
|
| | | PoolPrizeList:%s
|
| | | '''\
|
| | | %(
|
| | | self.Head.OutputString(),
|
| | | self.DrawType,
|
| | | self.DrawCount,
|
| | | self.DrawNum,
|
| | | self.PoolPrizeCnt,
|
| | | "..."
|
| | | )
|
| | |
| | | return plusPieList
|
| | |
|
| | | ## 从列表中产生物品,[[几率,object], ....],万分率
|
| | | # @param itemList 待选列表
|
| | | # @return 抽中索引, 抽中元素 索引-1代表没有抽中
|
| | | def GetResultIndexByRandomList(randList):
|
| | | if not randList:
|
| | | return -1, None
|
| | | randRate = random.randint(0, randList[-1][0])
|
| | | for index in range(0, len(randList)):
|
| | | element = randList[index]
|
| | | if not element:
|
| | | continue
|
| | | |
| | | cmpRate = element[0]
|
| | | if randRate > cmpRate:
|
| | | continue
|
| | | |
| | | return index, element[1]
|
| | | |
| | | return -1, None
|
| | |
|
| | | ## 从列表中产生物品,[[几率,object], ....],万分率
|
| | | # @param itemList 待选列表
|
| | | # @return object
|
| | | def GetResultByRandomList(randList, defValue=None):
|
| | |
| | | GameWorld.DebugLog("推金币抽奖: playerSign=%s,tuijinbiCnt=%s,prizeRateList=%s" % (playerSign, tuijinbiCnt, prizeRateList), playerID)
|
| | |
|
| | | addPoolPrizeInfo = {} # 增加台面奖池信息
|
| | | drawInfo = GameWorld.GetResultByRandomList(prizeRateList)
|
| | | drawIndex, drawInfo = GameWorld.GetResultIndexByRandomList(prizeRateList)
|
| | | if playerSign == Sign_NewVerPlayer and not tuijinbiCnt: # 新版本玩家首次推
|
| | | for _ in range(100):
|
| | | if drawInfo and drawInfo[0] in [PrizeType_Gold, PrizeType_Xianyu]: # 首次只能产出金币或仙玉币
|
| | | break
|
| | | drawInfo = GameWorld.GetResultByRandomList(prizeRateList)
|
| | | drawIndex, drawInfo = GameWorld.GetResultIndexByRandomList(prizeRateList)
|
| | |
|
| | | # 首次附加默认初始奖励
|
| | | initPrizeList = IpyGameDataPY.GetFuncEvalCfg("EnSuperDiscount", 5)
|
| | |
| | | if not drawInfo or len(drawInfo) != 2:
|
| | | return
|
| | | drawType, drawCount = drawInfo
|
| | | GameWorld.DebugLog("抽到: drawIndex=%s,drawInfo=%s,drawType=%s,drawCount=%s" % (drawIndex, drawInfo, drawType, drawCount), playerID)
|
| | | PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Tuijinbi, 1, isNotify=False)
|
| | |
|
| | | # 红包,直接给奖励
|
| | | if drawType == PrizeType_Redpack:
|
| | | randMoneyList = IpyGameDataPY.GetFuncEvalCfg("PushCoin", 3)
|
| | | randMoney = random.choice(randMoneyList)
|
| | | GameWorld.DebugLog("抽到红包直接给: %s" % str(randMoney), playerID)
|
| | | GameWorld.DebugLog("红包直接给: %s" % str(randMoney), playerID)
|
| | | if randMoney and len(randMoney) == 2:
|
| | | __GiveMoney(curPlayer, randMoney[0], randMoney[1], True)
|
| | |
|
| | |
| | | elif drawType == PrizeType_Super:
|
| | | randPrizeList = IpyGameDataPY.GetFuncEvalCfg("PushCoin", 2)
|
| | | randPrize = random.choice(randPrizeList)
|
| | | GameWorld.DebugLog("抽到超级奖励: %s" % str(randPrize), playerID)
|
| | | GameWorld.DebugLog("超级奖励: %s" % str(randPrize), playerID)
|
| | | if randPrize and len(randPrize) == 2:
|
| | | randPrizeType, randValue = randPrize
|
| | | addPoolPrizeInfo[randPrizeType] = addPoolPrizeInfo.get(randPrizeType, 0) + randValue
|
| | | else:
|
| | | GameWorld.DebugLog("抽到: drawType=%s,drawCount=%s" % (drawType, drawCount), playerID)
|
| | | GameWorld.DebugLog("添加奖池: drawType=%s,drawCount=%s" % (drawType, drawCount), playerID)
|
| | | addPoolPrizeInfo[drawType] = addPoolPrizeInfo.get(drawType, 0) + drawCount
|
| | |
|
| | | for prizeType, addCnt in addPoolPrizeInfo.items():
|
| | |
| | | tuijinbiCnt += 1
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TuiJinbiCnt, tuijinbiCnt)
|
| | | GameWorld.DebugLog("更新累计推金币次数: %s" % (tuijinbiCnt), playerID)
|
| | | SyncTuijinbiInfo(curPlayer, drawType, drawCount)
|
| | | SyncTuijinbiInfo(curPlayer, drawIndex + 1)
|
| | | return
|
| | |
|
| | | def __DoGivePrize(curPlayer, prizeType, prizeCount):
|
| | |
| | | ItemControler.NotifyGiveAwardInfo(curPlayer, [], "Tuijinbi", moneyInfo={moneyType:moneyValue})
|
| | | return
|
| | |
|
| | | def SyncTuijinbiInfo(curPlayer, drawType=0, drawCount=0):
|
| | | def SyncTuijinbiInfo(curPlayer, drawNum=0):
|
| | | poolPrizeList = [] # 台面信息
|
| | | for prizeType in [PrizeType_Gold, PrizeType_Xianyu]:
|
| | | prizeCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TuiJinbiPool % prizeType)
|
| | |
| | | poolPrizeList.append(poolInfo)
|
| | |
|
| | | clientPack = ChPyNetSendPack.tagMCTuijinbiInfo()
|
| | | clientPack.DrawType = drawType
|
| | | clientPack.DrawCount = drawCount
|
| | | clientPack.DrawNum = drawNum
|
| | | clientPack.PoolPrizeList = poolPrizeList
|
| | | clientPack.PoolPrizeCnt = len(clientPack.PoolPrizeList)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|