#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_Tianzi # # @todo:Ìì×Ó¿¼Ñé # @author hxp # @date 2025-09-30 # @version 1.0 # # ÏêϸÃèÊö: Ìì×Ó¿¼Ñé # #------------------------------------------------------------------------------- #"""Version = 2025-09-30 19:30""" #------------------------------------------------------------------------------- import ChConfig import FBCommon import GameWorld import ItemControler import PlayerControl import PlayerSuccess import PlayerBillboard import ChPyNetSendPack import NetPackCommon import IpyGameDataPY import ShareDefine import PlayerTask import PlayerMail import DBDataMgr import TurnSkill import ObjPool def OnDay(): ## ½áËã×òÈÕ½±Àø __DoGiveTianziDayAward() return def OnFBPlayerOnDay(curPlayer): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziTodayHurt, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziTodayHurtEx, 0) SyncTianziInfo(curPlayer) return def OnFBPlayerOnLogin(curPlayer): SyncTianziInfo(curPlayer) return def GetTianziTodayInfo(curPlayer): ## »ñÈ¡½ñÈÕÌì×Ó¿¼ÑéÐÅÏ¢ # @return: lineID, bossID lineList = [] for lineID in range(10): ipyData = IpyGameDataPY.GetIpyGameDataNotLog("FBLine", ChConfig.Def_FBMapID_Tianzi, lineID) if ipyData: lineList.append(ipyData) elif lineID > 0: break if not lineList: return 0, 0 ServerDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) todayIpyData = lineList[ServerDay % len(lineList)] lineID = todayIpyData.GetLineID() bossID = 0 for lineupID in todayIpyData.GetLineupIDList(): lineupIpyData = IpyGameDataPY.GetIpyGameData("NPCLineup", lineupID) if not lineupIpyData: continue bossID = lineupIpyData.GetBossID() if bossID: break return lineID, bossID def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList): ## »ØºÏÕ½¶·ÇëÇó lineID, bossID = GetTianziTodayInfo(curPlayer) if funcLineID != lineID: GameWorld.DebugLog("·Ç½ñÈÕÌì×Ó¿¼Ñé! mapID=%s,funcLineID=%s != %s,bossID=%s" % (mapID, funcLineID, lineID, bossID)) return return True, funcLineID def GetFBNPCInitAttr(turnFight, npcObj): ## »ñÈ¡¸±±¾Ö¸¶¨NPC³õʼ»¯ÊôÐÔ bossID = npcObj.GetNPCID() ipyDataList = IpyGameDataPY.GetIpyGameDataList("Tianzi", bossID) if not ipyDataList: return {} return __getBossAttrDict(ipyDataList[0]) def OnFBNPCKilledBefore(turnFight, gameObj, killer=None, useSkill=None): ## ¸±±¾NPC±»»÷ɱǰ´¦Àí£¬Ò»°ãÓÃÓÚ´¦ÀíһЩ²»±»»÷ɱµÄ¸±±¾NPCÂß¼­ # @return: ¿É·ñ±»Õý³£»÷ɱ # ±¾¸±±¾²»¿É±»»÷ɱ£¬Ö±µ½ËùÓÐѪÌõµÖ¿ÛÍê bossID = gameObj.GetNPCID() ipyDataList = IpyGameDataPY.GetIpyGameDataList("Tianzi", bossID) if not ipyDataList: return True statDefValueTotal = gameObj.GetStatDefValue() # µ±Ç°×ܳÐÉË hpNum = 1 totalHPMax = 0 ipyDataNow = None for ipyData in ipyDataList: hpNum = ipyData.GetHPNum() maxHP = ipyData.GetMaxHP() ipyDataNow = ipyData totalHPMax += maxHP if statDefValueTotal < totalHPMax: break if not ipyDataNow: return True hp = max(0, totalHPMax - statDefValueTotal) if hp <= 0: GameWorld.Log("Ìì×Ó¿¼ÑéÈ«²¿ÑªÌõ±»»÷ɱ! totalHPMax=%s,statDefValueTotal=%s" % (totalHPMax, statDefValueTotal)) return True gameObj.SetMaxHP(ipyDataNow.GetMaxHP(), False) gameObj.SetHP(hp, False) GameWorld.DebugLog("¸üÐÂNPCѪÌõ: hpNum=%s,hp=%s/%s, statDefValueTotal=%s" % (hpNum, gameObj.GetHP(), gameObj.GetMaxHP(), statDefValueTotal)) TurnSkill.Sync_HPRefresh(turnFight, gameObj) turnFight.SetDict("hpNum", hpNum) #turnFight.syncHelp({"hpNum":hpNum}) gameObj.UpdInitBatAttr(__getBossAttrDict(ipyDataNow)) return False def __getBossAttrDict(ipyData): attrDict = {ChConfig.AttrID_Atk:ipyData.GetAtk(), ChConfig.AttrID_Def:ipyData.GetDef(), ChConfig.AttrID_MaxHP:ipyData.GetMaxHP(), } attrDict.update(ipyData.GetOtherAttrDict()) return attrDict def OnTurnFightOver(turnFight, mapID, funcLineID, overMsg): ## »ØºÏÕ½¶·½áÊø hpNum = turnFight.GetDictByKey("hpNum") batFaction = turnFight.getBatFaction(ChConfig.Def_FactionA) totalHurt = batFaction.getTotalHurt() overMsg.update({"hpNum":hpNum, "totalHurt":totalHurt}) return def OnTurnFightAward(curPlayer, guid, mapID, funcLineID, winFaction, statMsg, dateStr, reqData, awardDict): ## »ØºÏÕ½¶·½áËã½±Àø if not curPlayer: return lineID, bossID = GetTianziTodayInfo(curPlayer) if lineID != funcLineID: GameWorld.ErrLog("½áËãʱ·Ç½ñÈÕÌì×Ó¿¼Ñé! mapID=%s,funcLineID=%s != %s,bossID=%s" % (mapID, funcLineID, lineID, bossID)) return hpNum = statMsg.get("hpNum", 0) totalHurt = statMsg.get("totalHurt", 0) historyHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziHisHurt % bossID) historyHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziHisHurtEx % bossID) historyHurtTotal = historyHurtEx * ChConfig.Def_PerPointValue + historyHurt todayHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurt) todayHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurtEx) todayHurtTotal = todayHurtEx * ChConfig.Def_PerPointValue + todayHurt GameWorld.DebugLog("Ìì×Ó¿¼Ñé½áËã: lineID=%s,bossID=%s,hpNum=%s,totalHurt=%s,todayHurtTotal=%s,historyHurtTotal=%s" % (lineID, bossID, hpNum, totalHurt, todayHurtTotal, historyHurtTotal)) if totalHurt > historyHurtTotal: historyHurtTotal = totalHurt historyHurt = historyHurtTotal % ChConfig.Def_PerPointValue historyHurtEx = historyHurtTotal / ChConfig.Def_PerPointValue PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziHisHurt % bossID, historyHurt) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziHisHurtEx % bossID, historyHurtEx) GameWorld.DebugLog("¸üÐÂÀúÊ·×î¸ßÉ˺¦: %s" % historyHurtTotal) if totalHurt > todayHurtTotal: todayHurtTotal = totalHurt todayHurt = todayHurtTotal % ChConfig.Def_PerPointValue todayHurtEx = todayHurtTotal / ChConfig.Def_PerPointValue PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziTodayHurt, todayHurt) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TianziTodayHurtEx, todayHurtEx) GameWorld.DebugLog("¸üнñÈÕ×î¸ßÉ˺¦: %s" % todayHurtTotal) #¸üаñµ¥ PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_Tianzi, todayHurtEx, todayHurt) itemList = __getTianziAwardList(totalHurt, bossID) awardDict.update({FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(itemList), "totalHurt":totalHurt, "todayHurtTotal":todayHurtTotal}) FBCommon.AddEnterFBCount(curPlayer, mapID) ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["Tianzi", False, {}], isNotifyAward=False) SyncTianziInfo(curPlayer, lineID, bossID) __onFBTianzi(curPlayer) return def __getTianziAwardList(todayHurt, bossID, sweepCnt=1): ## »ñÈ¡½áËã½±Àø GameWorld.DebugLog("Ìì×Ó¿¼Ñé½áËã½±Àø: hurtValue=%s,bossID=%s" % (todayHurt, bossID)) ipyDataList = IpyGameDataPY.GetIpyGameDataList("Tianzi", bossID) if not ipyDataList: return [] awardDict = {} totalHPMax = 0 for ipyData in ipyDataList: hpNum = ipyData.GetHPNum() maxHP = ipyData.GetMaxHP() totalHPMax += maxHP if todayHurt < totalHPMax: break randWeightItemList = ipyData.GetRandWeightItemList() randItemInfo = GameWorld.GetResultByWeightList(randWeightItemList) if not randItemInfo or len(randItemInfo) < 2: continue itemID = randItemInfo[0] itemCount = randItemInfo[1] awardDict[itemID] = awardDict.get(itemID, 0) + itemCount * sweepCnt GameWorld.DebugLog("ѪÌõ±àºÅ: %s,itemID=%s,itemID=%s,%s" % (hpNum, itemID, itemCount, awardDict)) itemList = [[itemID, itemCount] for itemID, itemCount in awardDict.items()] GameWorld.DebugLog("×îÖÕ½±Àø: %s" % itemList) return itemList def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, sweepCnt, dataEx): ## ¿É·ñɨµ´ _, bossID = GetTianziTodayInfo(curPlayer) todayHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurt) todayHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurtEx) todayHurtTotal = todayHurtEx * ChConfig.Def_PerPointValue + todayHurt if not bossID or not todayHurtTotal: GameWorld.DebugLog("Ìì×Ó¿¼Ñé½ñÈÕ»¹Ã»ÓÐÉ˺¦ÎÞ·¨É¨µ´!") return return bossID, todayHurtTotal def OnPlayerFBSweepResult(curPlayer, mapID, lineID, sweepCnt, dataEx, askRet): ## ɨµ´½á¹û£¬´ÎÊýÏûºÄÒÑÔÚÍâ²ã´¦Àí¿Û³ý bossID, todayHurtTotal = askRet GameWorld.DebugLog("Ìì×Ó¿¼Ñéɨµ´: mapID=%s,lineID=%s,sweepCnt=%s,todayHurtTotal=%s,bossID=%s" % (mapID, lineID, sweepCnt, todayHurtTotal, bossID)) itemList = __getTianziAwardList(todayHurtTotal, bossID, sweepCnt) ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["Tianzi", False, {}], isNotifyAward=False) isPass = 1 overDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(itemList), FBCommon.Over_isSweep:1, "totalHurt":todayHurtTotal, "todayHurtTotal":todayHurtTotal} FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict) __onFBTianzi(curPlayer) return True def __onFBTianzi(curPlayer): PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBTianzi) PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAFBTianzi, 1) return def SyncTianziInfo(curPlayer, lineID=None, bossID=None): if lineID == None: lineID, bossID = GetTianziTodayInfo(curPlayer) clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCTianziKYInfo) clientPack.LineID = lineID clientPack.HistoryHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziHisHurt % bossID) clientPack.HistoryHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziHisHurtEx % bossID) clientPack.TodayHurt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurt) clientPack.TodayHurtEx = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TianziTodayHurtEx) NetPackCommon.SendFakePack(curPlayer, clientPack) return def __DoGiveTianziDayAward(): GameWorld.Log("=== Ìì×Ó¿¼Ñé½áËãÅÅÐн±Àø! ===") billboardMgr = DBDataMgr.GetBillboardMgr() billBoard = billboardMgr.GetBillboard(ShareDefine.Def_BT_Tianzi) if not billBoard: return billBoard.SortDelayDo() billboradAwardDict = IpyGameDataPY.GetFuncEvalCfg("TianziBillboradAward", 1, {}) orderList = [int(orderStr) for orderStr in billboradAwardDict.keys()] orderList.sort() GameWorld.Log(" ½±ÀøÃû´ÎÁбí: %s" % orderList) awardOrder = orderList[0] orderPlayerIDDict = {} billboardCount, billboardMaxCount = billBoard.GetCount(), billBoard.GetMaxCount() GameWorld.Log(" °ñµ¥Êý¾ÝÊý! billboardCount=%s,billboardMaxCount=%s" % (billboardCount, billboardMaxCount)) for index in xrange(billboardCount): billBoardData = billBoard.At(index) if not billBoardData: continue order = index + 1 if order > awardOrder: nextOrderIndex = orderList.index(awardOrder) + 1 if nextOrderIndex >= len(orderList): break awardOrder = orderList[nextOrderIndex] playerID = billBoardData.GetID() if playerID < ShareDefine.RealPlayerIDStart: # ·ÇÕæÈ˲»´¦Àí continue orderPlayerIDDict[playerID] = [order, awardOrder] paramList = [order] awardList = billboradAwardDict[str(awardOrder)] PlayerMail.SendMailByKey("TianziBillboardAward", playerID, awardList, paramList) GameWorld.Log(" ½±ÀøÍæ¼ÒÃû´ÎÐÅÏ¢: %s" % orderPlayerIDDict) return