#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_Love # # @todo:ÇéÔµ¸±±¾ # @author hxp # @date 2021-11-24 # @version 1.0 # # ÏêϸÃèÊö: ÇéÔµ¸±±¾ # #------------------------------------------------------------------------------- #"""Version = 2021-11-24 16:30""" #------------------------------------------------------------------------------- import FBCommon import NPCCommon import ReadChConfig import IPY_GameWorld import PlayerControl import GameWorldProcess import ItemControler import IpyGameDataPY import PyGameData import GameWorld import ChConfig import PlayerTongTianLing ( Def_Time_MapPrepare, # ×¼±¸Ê±¼ä, Ãë Def_Time_Fight, # Õ½¶·Ê±¼ä, Ãë Def_Time_PickupItem, # ʰȡÎïÆ·Ê±¼ä, Ãë Def_Time_Leave, # ½áÊøÊ±¼ä, Ãë ) = range(4) #µ±Ç°¸±±¾µØÍ¼µÄ״̬ ( FB_Step_Open, # µØÍ¼¿ªÆô FB_Step_MapPrepare, # µØÍ¼×¼±¸ FB_Step_Fighting, # Õ½¶·ÖÐ FB_Step_PickupItem, # ʰȡÎïÆ· FB_Step_LeaveTime, # ×ÔÓÉÍ˳öʱ¼ä FB_Step_Over, # ¸±±¾¹Ø±Õ ) = range(6) FB_CostTime = 'FB_CostTime' # ¹ý¹ØºÄʱ FBPlayerDict_EnterState = "FBPlayerDict_EnterState" # ÒѽøÈëµÄÍæ¼Ò£¬²ÎÊý TDRefreshNPCFileNum = ChConfig.Def_FBMapID_Love Def_Devil_TimeType = IPY_GameWorld.tttLeaveFamilyWar def OnOpenFB(tick): ##¿ªÆô¸±±¾ return def OnCloseFB(tick): ##¹Ø±Õ¸±±¾ return def OnEnterFBEvent(curPlayer, mapID, lineID, tick): onlyDoubleTeam = IpyGameDataPY.GetFuncCfg("LoveFB", 1) if onlyDoubleTeam: if not curPlayer.GetTeamID(): PlayerControl.NotifyCode(curPlayer, "OnlyTwoMemTeamCanEnter", [mapID]) return False return True def GetPlayerResetWorldPosFBMsg(curPlayer, lineId): ## »ñÈ¡È볡Я´øÐÅÏ¢ return "" def OnChangeMapAsk(ask, tick): ##²éѯÊÇ·ñ¿ÉÒÔ½øÈëµØÍ¼ return IPY_GameWorld.cmeAccept def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick): ##¸±±¾Íæ¼Ò½øÈëµã return ipyEnterPosInfo def DoEnterFB(curPlayer, tick): gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() playerID = curPlayer.GetPlayerID() GameWorld.Log("DoEnterFB...", playerID) hadDelTicket = FBCommon.GetHadDelTicket(curPlayer) if not hadDelTicket: mapID = GameWorld.GetGameWorld().GetMapID() delResult = FBCommon.DelFBEnterTicket(curPlayer, mapID) isOK = delResult[0] #hasBind = delResult[1] if not isOK: PlayerControl.PlayerLeaveFB(curPlayer) return FBCommon.SetHadDelTicket(curPlayer) FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_Love) PyGameData.g_fbPickUpItemDict.pop(playerID, 0) gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_EnterState, 1) PlayerTongTianLing.AddTongTianTaskValue(curPlayer, ChConfig.TTLTaskType_LoveFB, 1) if fbStep == FB_Step_Open: FBCommon.SetFBStep(FB_Step_MapPrepare, tick) if fbStep <= FB_Step_MapPrepare: mapID = GameWorld.GetMap().GetMapID() notify_tick = FBCommon.GetFBLineStepTime(mapID)[Def_Time_MapPrepare] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttAddUpTime, 0, max(notify_tick, 0), True) curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True) elif fbStep == FB_Step_Fighting: mapID = GameWorld.GetMap().GetMapID() notify_tick = FBCommon.GetFBLineStepTime(mapID)[Def_Time_Fight] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True) DoFBHelp(curPlayer, tick) return def DoExitFB(curPlayer, tick): ##Íæ¼ÒÍ˳ö¸±±¾ return def DoPlayerLeaveFB(curPlayer, tick): ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾. return def DoFBHelp(curPlayer, tick): wheelNum = None movePointDict = ReadChConfig.GetEvalChConfig('TD_%s_Move' % TDRefreshNPCFileNum) rMarkList = movePointDict.keys() gameFB = GameWorld.GetGameFB() for rMark in rMarkList: if wheelNum == None: wheelNum = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshBigWheelNum % rMark) + 1 #¸±±¾°ïÖú(֪ͨ¿Í»§¶ËÏÔʾ) wheelTotal = len(ReadChConfig.GetEvalChConfig('TD_%s_Cfg' % TDRefreshNPCFileNum)) fbHelpDict = {FBCommon.Help_wheel:wheelNum, FBCommon.Help_wheelTotal:wheelTotal} GameWorld.DebugLog("DoFBHelp: %s" % fbHelpDict, curPlayer.GetPlayerID()) FBCommon.Notify_FBHelp(curPlayer, fbHelpDict) return ##¸±±¾¶¨Ê±Æ÷ # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks ¸±±¾¶¨Ê±Æ÷ def OnProcess(tick): fbStep = GameWorld.GetGameFB().GetFBStep() if fbStep == FB_Step_MapPrepare: __DoLogic_MapPrepare(tick) elif fbStep == FB_Step_Fighting: __DoLogic_MapFighting(tick) elif fbStep == FB_Step_PickupItem: __DoLogic_PickupItem(tick) elif fbStep == FB_Step_LeaveTime: __DoLogic_MapLeave(tick) return def __DoLogic_MapPrepare(tick): mapID = GameWorld.GetMap().GetMapID() timeInfo = FBCommon.GetFBLineStepTime(mapID) if tick - GameWorld.GetGameFB().GetFBStepTick() < timeInfo[Def_Time_MapPrepare] * 1000: return FBCommon.SetFBStep(FB_Step_Fighting, tick) movePointDict = ReadChConfig.GetEvalChConfig('TD_%s_Move' % TDRefreshNPCFileNum) rMarkList = movePointDict.keys() isNotify = True for rMark in rMarkList: FBCommon.OpenTDNPCRefresh(rMark, TDRefreshNPCFileNum, 0, tick, isNotify) if isNotify: isNotify = False FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) # Ç¿ÖÆÍ¬²½Ò»´Î # ֪ͨ¿ªÊ¼ FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, timeInfo[Def_Time_Fight] * 1000) return def __DoLogic_MapFighting(tick): mapID = GameWorld.GetMap().GetMapID() timeInfo = FBCommon.GetFBLineStepTime(mapID) # ¼ä¸ôδµ½ if tick - GameWorld.GetGameFB().GetFBStepTick() < timeInfo[Def_Time_Fight] * 1000: #FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 5000) return __DoOver(tick) return def __DoLogic_PickupItem(tick): mapItemCount = GameWorld.GetMapItemManager().GetMapItemCount() mapID = GameWorld.GetMap().GetMapID() timeInfo = FBCommon.GetFBLineStepTime(mapID) if mapItemCount and tick - GameWorld.GetGameFB().GetFBStepTick() < timeInfo[Def_Time_PickupItem] * 1000: return FBCommon.SetFBStep(FB_Step_LeaveTime, tick) copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in xrange(copyMapPlayerManager.GetPlayerCount()): curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) if curPlayer == None or curPlayer.IsEmpty(): continue DoOverToLeave(curPlayer, tick) return def __DoLogic_MapLeave(tick): mapID = GameWorld.GetMap().GetMapID() timeInfo = FBCommon.GetFBLineStepTime(mapID) if tick - GameWorld.GetGameFB().GetFBStepTick() < timeInfo[Def_Time_Leave] * 1000: return FBCommon.SetFBStep(FB_Step_Over, tick) # ʱ¼äµ½£¬Ìß³ö»¹ÔÚ¸±±¾µÄÍæ¼ÒµÈ... FBCommon.DoLogic_FBKickAllPlayer() #GameWorld.GetGameWorld().SetPropertyID(0) GameWorldProcess.CloseFB(tick) return def DoFBRebornNPC(curNPC, tick): ##¸±±¾ÓÐNPCÕÙ³ö fromRefreshValue = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_FromRefreshValue) if fromRefreshValue == TDRefreshNPCFileNum: curNPC.SetIsNeedProcess(True) FBCommon.UpdTDNPCCnt(curNPC, 1) return def OnTDCurWheelOver(refreshMark, tick): movePointDict = ReadChConfig.GetEvalChConfig('TD_%s_Move' % TDRefreshNPCFileNum) rMarkList = movePointDict.keys() isWheelRefreshOver = FBCommon.IsTDWheelRefreshOver(rMarkList) # ±¾´ó²¨ËùÓеãË¢¹ÖÍê±Ï if isWheelRefreshOver: GameWorld.DebugLog("±¾´ó²¨ËùÓеãË¢Íê, Ç¿ÖÆÍ¬²½Ò»´Î¹ÖÎïÊý") FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) # Ç¿ÖÆÍ¬²½Ò»´Î return def OnTDNPCReachTheGoal(curNPC, tick): #GameWorld.DebugLog("µ½´ïÖÕµã...") curNPC.SetVisible(False) NPCCommon.SetDeadEx(curNPC) return def GetFBEveryoneDropInfo(curNPC): ## »ñÈ¡¸±±¾Ã¿È˵ôÂäÉèÖÃÐÅÏ¢ # @return: None or [ownerPlayerList, isOnlySelfSee] isOnlySelfSee = True ownerPlayerList = [] playerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not curPlayer: continue ownerPlayerList.append(curPlayer) return ownerPlayerList, isOnlySelfSee #def DoFB_Npc_KillNPC(attacker, curNPC, tick): # __DoOnNPCKilled(attacker, curNPC, tick) # return # #def DoFB_Player_KillNPC(curPlayer, curNPC, tick): # __DoOnNPCKilled(curPlayer, curNPC, tick) # return def DoFB_NPCDead(curNPC): fbStep = GameWorld.GetGameFB().GetFBStep() if fbStep != FB_Step_Fighting: return fromRefreshValue = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_FromRefreshValue) # ÈëÇÖ¹Ö if fromRefreshValue != TDRefreshNPCFileNum: return FBCommon.UpdTDNPCCnt(curNPC, -1) # ¹ÖÎïÊý-1 tick = GameWorld.GetGameWorld().GetTick() movePointDict = ReadChConfig.GetEvalChConfig('TD_%s_Move' % TDRefreshNPCFileNum) rMarkList = movePointDict.keys() isAllRefresh = FBCommon.IsTDNPCRefreshOver(rMarkList) # ËùÓйÖÊÇ·ñÈ«²¿Ë¢Íê isAllKilled = FBCommon.IsTDNPCCurWheelAllKilled(rMarkList) # ±¾²¨¹ÖÊÇ·ñÈ«²¿±»»÷ɱ if isAllRefresh and isAllKilled: GameWorld.DebugLog("È«²¿¹ÖË¢ÐÂÍê±ÏÇÒÒѱ»É±Íê, ´¦Àí½áÊøÂß¼­") __DoOver(tick) elif isAllKilled: GameWorld.DebugLog("±¾²¨¹ÖÈ«²¿É±Í꣬½øÈëÏÂÒ»²¨£¡") for index, rMark in enumerate(rMarkList): FBCommon.SetEnterTDNextWheel(rMark, tick, index == 0) #if index == 0: # FBCommon.Sync_TDNextWheelTick(None, rMark, Def_Devil_TimeType, tick) FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) # ²¨ÊýÇл»Ç¿ÖÆÍ¬²½Ò»´Î return def __DoOver(tick): # ¸±±¾½áÊøÂß¼­ GameWorld.DebugLog("´¦Àí¸±±¾½áÊøÂß¼­") costTime = tick - GameWorld.GetGameFB().GetFBStepTick() gameFB = GameWorld.GetGameFB() gameFB.SetGameFBDict(FB_CostTime, costTime) FBCommon.SetFBStep(FB_Step_PickupItem, tick) # Çå¹Ö FBCommon.ClearFBNPC() FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) # ¸±±¾½áÊøÇ¿ÖÆÍ¬²½Ò»´Î movePointDict = ReadChConfig.GetEvalChConfig('TD_%s_Move' % TDRefreshNPCFileNum) rMarkList = movePointDict.keys() # ¹Ø±ÕËùÓÐË¢¹Öµã for rMark in rMarkList: FBCommon.CloseTDNPCRefresh(rMark, True) return def OnPickUpItem(curPlayer, curItem, tick): FBCommon.OnPickUpItem(curPlayer, curItem, tick, None) return def DoOverToLeave(curPlayer, tick): isPass = 1 playerID = curPlayer.GetPlayerID() mapID = GameWorld.GetMap().GetMapID() gameFB = GameWorld.GetGameFB() leaveTick = FBCommon.GetFBLineStepTime(mapID)[Def_Time_Leave] * 1000 curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True) costTime = gameFB.GetGameFBDictByKey(FB_CostTime) pickupItemList = PyGameData.g_fbPickUpItemDict.get(playerID, []) coupleID = PlayerControl.GetCoupleID(curPlayer) coupleEnterState = gameFB.GetPlayerGameFBDictByKey(coupleID, FBPlayerDict_EnterState) if coupleID else 0 if coupleEnterState: coupleAwardListEx = IpyGameDataPY.GetFuncEvalCfg("LoveFB", 2) ItemControler.GivePlayerItemOrMail(curPlayer, coupleAwardListEx) pickupItemList.extend(coupleAwardListEx) overDict = {FBCommon.Over_dataMapID:mapID, FBCommon.Over_isPass:isPass, FBCommon.Over_costTime:costTime, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(pickupItemList)} FBCommon.Notify_FB_Over(curPlayer, overDict) GameWorld.Log("½áËã: coupleID=%s,coupleEnterState=%s,overDict=%s" % (coupleID, coupleEnterState, overDict), playerID) return ## ¿É·ñɨµ´ def OnPlayerFBSweepAsk(curPlayer, mapID, lineID, sweepCnt, isFinish, dataEx): return True ## ɨµ´½á¹û def OnPlayerFBSweepResult(curPlayer, mapID, lineID, sweepCnt, isFinish, dataEx): npcCountDict = FBCommon.GetTDCfgNPCCntInfo(TDRefreshNPCFileNum) if sweepCnt > 1: for npcID, npcCount in npcCountDict.items(): npcCountDict[npcID] = npcCount * sweepCnt jsonItemList, totalExp, totalMoney = NPCCommon.GiveKillNPCDropPrize(curPlayer, mapID, npcCountDict) isPass = 1 overDict = {FBCommon.Over_itemInfo:jsonItemList, FBCommon.Over_isSweep:1} FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict) GameWorld.DebugLog("ɨµ´½±Àø: ´ÎÊý=%s,jsonItemList=%s,totalExp=%s,totalMoney=%s,npcCountDict=%s" % (sweepCnt, jsonItemList, totalExp, totalMoney, npcCountDict)) return True