#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_FamilyInvade # # @todo:Õ½Ã˸±±¾ - Òì½çÈëÇÖ(ÊØÎÀÈË»Ê) # @author hxp # @date 2017-01-04 # @version 1.1 # # @change: "2017-03-20 15:00" hxp ¸±±¾¶¨Ê±¾­Ñ鸣ÀûÖ§³Ö³¬¹ý20ÒÚ # # ÏêϸÃèÊö: Õ½Ã˸±±¾ - Òì½çÈëÇÖ # #------------------------------------------------------------------------------- #"""Version = 2017-03-20 15:00""" #------------------------------------------------------------------------------- import FBCommon import IPY_GameWorld import NPCCustomRefresh import PlayerControl import IpyGameDataPY import GameWorld import ChConfig import GameWorldProcess import PyGameData import ShareDefine import EventReport import GameObj import SkillCommon import BuffSkill import PlayerFamily Map_FamilyInvadeFB_FamilyID = "FamilyPartyFB_FamilyID" # ¶ÔÓ¦µÄ¼Ò×åid Map_FamilyInvadeFB_KillNPCCnt = "FamilyInvadeFB_KillNPCCnt" # ÒÑ»÷ɱÊýÁ¿ Map_FamilyInvadeFB_GuardDead = "FamilyInvadeFB_GuardDead" # ÊØÎÀÊÇ·ñËÀÍö GameFBDict_LastEnterFbDay = 'LastEnterFbDay_%s' #ÉϴνøÈë»î¶¯µÄ¿ª·þÌì Map_FamilyInvadeFB_StartTick = "Map_FamilyInvadeFB_StartTick_%s" # ¸±±¾¿ªÊ¼Ê±¼ä FBPlayerDict_TotalExp = 'FBPlayerDict_TotalExp' # »ñµÃµÄ×ܾ­Ñé FBPlayerDict_TotalExpPoint = 'FBPlayerDict_TotalExpPoint' # »ñµÃµÄ×ܾ­Ñéµã Def_Devil_TimeType = IPY_GameWorld.tttLeaveFamilyWar ( Def_Time_MapPrepare, # ×¼±¸Ê±¼ä, Ãë Def_FightTime, # Õ½¶·Ê±¼ä, Ãë Def_Time_Leave, # ½áÊøÊ±¼ä, Ãë Def_FInvade_TDFileName, # TDË¢¹ÖÎļþ±ê¼ÇÃû Def_FInvade_RMarkList, # ³ö¹Ö±êʶµãÁбí Def_FInvade_RMarkTower, # ÈË»Êˢбêʶµã¡¢NPCID Def_FInvade_GuardDict, # ÊØÎÀNPCID {±êʶµã:ÊØ»¤NPCID, ...} ) = range(7) #µ±Ç°¸±±¾µØÍ¼µÄ״̬ ( FB_Step_Open, # µØÍ¼¿ªÆô FB_Step_MapPrepare, # µØÍ¼×¼±¸ FB_Step_Fighting, # Õ½¶·ÖÐ FB_Step_LeaveTime, # ×ÔÓÉʱ¼ä FB_Step_Over, # ¸±±¾¹Ø±Õ ) = range(5) Def_FILoseReason_Timeout = 1 # ʧ°ÜÔ­Òò - ʱ¼äµ½ Def_FILoseReason_TowerBroken = 2 # ʧ°ÜÔ­Òò - Ë®¾§±»ÆÆ»µ Def_FILoseReason_LeaveFB = 3 # ʧ°ÜÔ­Òò - Ö÷¶¯À뿪¸±±¾¹Ø±Õ def GetFamilyInvadeCfg(): return IpyGameDataPY.GetFuncEvalCfg('FamilyInvadeCfg') def GetDefaultMaxAngryNPCIDList(): towerNPCIDList = GetFamilyInvadeCfg()[Def_FInvade_GuardDict].values() towerNPCIDList.append(GetFamilyInvadeCfg()[Def_FInvade_RMarkTower][1]) return towerNPCIDList def OnOpenFB(tick): ##¿ªÆô¸±±¾ FBCommon.SetFBStep(FB_Step_Open, tick) GameWorld.GetGameFB().SetGameFBDict(Map_FamilyInvadeFB_FamilyID, 0) return def OnCloseFB(tick): ##¹Ø±Õ¸±±¾ # # gameFB = GameWorld.GetGameFB() # fbStep = gameFB.GetFBStep() # # # if fbStep == FB_Step_Fighting: # # ¹Ø±Õ¸±±¾Ê±£¬Èç¹ûÊÇÕ½¶·×´Ì¬ÔòÉèÖÃΪ¸±±¾Ê§°Ü½áÊø # __DoInvadeOver(tick, Def_FILoseReason_LeaveFB) return ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë # @param curPlayer Íæ¼ÒʵÀý # @param mapID µØÍ¼ID # @param lineID Ïß·id # @param tick ʱ¼ä´Á # @return ²¼¶ûÖµ def OnEnterFBEvent(curPlayer, mapID, lineID, tick): if not curPlayer.GetFamilyID(): GameWorld.DebugLog("OnEnterFBEvent not family!") return False if curPlayer.GetFamilyLV() < IpyGameDataPY.GetFuncCfg('SWRHFamilyLV'): return # startTick = GameWorld.GetGameWorld().GetGameWorldDictByKey(Map_FamilyInvadeFB_StartTick) # invadeCfg = GetFamilyInvadeCfg() # if tick - startTick > invadeCfg[Def_Time_MapPrepare] * 1000: # openServerDay = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) # isEnter = GameWorld.GetGameWorld().GetGameWorldDictByKey(GameFBDict_LastEnterFbDay % curPlayer.GetID()) == openServerDay + 1 # if isEnter: # PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_676165") # return False return True ## »ñÈ¡È볡Я´øÐÅÏ¢ # @param curPlayer # @param lineId ·ÖÏß # @return ×Ö·ûÐÍ ½øÈëÐéÄâ·ÖÏßID def GetPlayerResetWorldPosFBMsg(curPlayer, lineId): return '[%s,%s]' % (curPlayer.GetPlayerID(), curPlayer.GetFamilyID()) ##²éѯÊÇ·ñ¿ÉÒÔ½øÈëµØÍ¼ # @param ask:ÇëÇó½á¹¹Ìå(IPY_BMChangeMapAsk) # @param tick:ʱ¼ä´Á # @return IPY_GameWorld.cme ö¾Ù def OnChangeMapAsk(ask, tick): playerIDStr = ask.GetMsg() GameWorld.DebugLog("OnChangeMapAsk playerIDStr=%s" % playerIDStr) #Я´øÍæ¼ÒIDÈ볡 if playerIDStr in ['']: return IPY_GameWorld.cmeCustom playerID, familyID = eval(playerIDStr) #¿É½øÈë return IPY_GameWorld.cmeAccept ##Íæ¼Ò½øÈ븱±¾ # @param curPlayer:Íæ¼ÒʵÀý # @param tick:ʱ¼ä´Á # @return ÎÞÒâÒå def DoEnterFB(curPlayer, tick): invadeCfg = GetFamilyInvadeCfg() gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() playerID = curPlayer.GetPlayerID() gameWorld = GameWorld.GetGameWorld() familyID = curPlayer.GetFamilyID() if not gameFB.GetGameFBDictByKey(Map_FamilyInvadeFB_FamilyID): gameFB.SetGameFBDict(Map_FamilyInvadeFB_FamilyID, familyID) GameWorld.DebugLog(' ÏÉÃËID=%s ÓÐÈ˽øÈë,¿ªÊ¼Ë¢¹ÖÁË£¡' % familyID, playerID) # Ë¢ÐÂË®¾§ towerRMark, towerNPCID = invadeCfg[Def_FInvade_RMarkTower] NPCCustomRefresh.SetNPCRefresh(towerRMark, [towerNPCID]) # Ë¢ÊØÎÀ for rmark, npcid in invadeCfg[Def_FInvade_GuardDict].items(): NPCCustomRefresh.SetNPCRefresh(rmark, [npcid]) if fbStep == FB_Step_Open: FBCommon.SetFBStep(FB_Step_MapPrepare, tick) gameWorld.SetGameWorldDict(Map_FamilyInvadeFB_StartTick % familyID, tick) openServerDay = gameWorld.GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ServerDay) if gameWorld.GetGameWorldDictByKey(GameFBDict_LastEnterFbDay % playerID) != openServerDay + 1: gameWorld.SetGameWorldDict(GameFBDict_LastEnterFbDay % playerID, openServerDay + 1) FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_FamilyInvade) EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_FamilyInvade, 0, ChConfig.CME_Log_Start) if familyID in PyGameData.g_swrhPlayerIDDict: if playerID not in PyGameData.g_swrhPlayerIDDict[familyID]: PyGameData.g_swrhPlayerIDDict[familyID].append(playerID) else: PyGameData.g_swrhPlayerIDDict[familyID] = [playerID] fbStep = gameFB.GetFBStep() if fbStep == FB_Step_MapPrepare: #³õʼ»¯²¢Í¨ÖªµÈ´ýµ¹¼ÆÊ± notify_tick = invadeCfg[Def_Time_MapPrepare] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True) elif fbStep == FB_Step_Fighting: #֪ͨ½øÈëʱ¼ä notify_tick = invadeCfg[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, notify_tick, True) __CheckGuardExpBuff(tick) __SortHurtInfo() DoFBHelp(curPlayer, tick) return def OnFamilyInvadeStateChange(state, tick): #»î¶¯×´Ì¬±ä¸ü mapID = GameWorld.GetMap().GetMapID() if mapID != ChConfig.Def_FBMapID_FamilyInvade: return GameWorld.DebugLog(' ÊØÎÀÈ˻ʻ״̬±ä¸ü state=%s' % state) if state == 1: PyGameData.g_swrhPlayerHurtDict = {} return ##¸±±¾Íæ¼Ò½øÈëµã # @param curPlayer Íæ¼ÒʵÀý # @param mapID µØÍ¼ID # @param lineId ·ÖÏßID # @param tick ʱ¼ä´Á # @return ×ø±êÁбí(X,Y) def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick): return ipyEnterPosInfo ##Íæ¼ÒÍ˳ö¸±±¾ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ÎÞÒâÒå def DoExitFB(curPlayer, tick): guardBuffIDList = IpyGameDataPY.GetFuncEvalCfg('FamilyInvadeCfg', 4) if BuffSkill.DelBuffBySkillID(curPlayer, guardBuffIDList[0], tick): playerControl = PlayerControl.PlayerControl(curPlayer) playerControl.RefreshPlayerAttrByBuff() return ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾. # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå def DoPlayerLeaveFB(curPlayer, tick): return def DoFBHelp(curPlayer, tick): npcInfoDict = {} wheelNum = None rMarkList = GetFamilyInvadeCfg()[Def_FInvade_RMarkList] gameFB = GameWorld.GetGameFB() for rMark in rMarkList: npcCnt = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_NPCCnt % rMark) npcBossCnt = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_NPCBossCnt % rMark) npcInfoDict[rMark] = [npcCnt - npcBossCnt, npcBossCnt] if wheelNum == None: wheelNum = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshBigWheelNum % rMark) + 1 playerID = curPlayer.GetPlayerID() exp = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExp) expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExpPoint) killNPCCnt = gameFB.GetGameFBDictByKey(Map_FamilyInvadeFB_KillNPCCnt) #É˺¦ÅÅÐÐÐÅÏ¢ hurtInfo = [] familyID = gameFB.GetGameFBDictByKey(Map_FamilyInvadeFB_FamilyID) playerHurtList = PyGameData.g_swrhPlayerHurtDict.get(familyID, []) #playerHurtList = sorted(playerHurtDict.iteritems(), key=lambda asd:asd[1], reverse=True) syncHurtList = playerHurtList[:5] for i, info in enumerate(syncHurtList, 1): playerName, hurt = info hurtDict = {} hurtDict["rank"] = i hurtDict["playerName"] = playerName hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue hurtInfo.append(hurtDict) myRank = __GetSelfHurtRank(curPlayer, playerHurtList) if myRank and myRank > 5: hurtDict = {} hurtDict["rank"] = myRank info = playerHurtList[myRank - 1] playerName, hurt = info hurtDict["playerName"] = playerName hurtDict["hurt"] = hurt % ChConfig.Def_PerPointValue hurtDict["hurtEx"] = hurt / ChConfig.Def_PerPointValue hurtInfo.append(hurtDict) #¸±±¾°ïÖú(֪ͨ¿Í»§¶ËÏÔʾ) fbHelpDict = { FBCommon.Help_npc:FBCommon.GetJsonNPCHPPerList(__GetNPCHPPerInfo()), FBCommon.Help_wheel:wheelNum, FBCommon.Help_npcTotal:killNPCCnt, FBCommon.Help_exp:exp, FBCommon.Help_expPoint:expPoint, "hurtInfo":hurtInfo } GameWorld.DebugLog("DoFBHelp: %s" % fbHelpDict, curPlayer.GetPlayerID()) FBCommon.Notify_FBHelp(curPlayer, fbHelpDict) return def __GetNPCHPPerInfo(): #»ñÈ¡ÊØÎÀµÄÊ£ÓàѪÁ¿°Ù·Ö±È queryNPCIDList = GetDefaultMaxAngryNPCIDList() gameNPCManager = GameWorld.GetNPCManager() hpPerDict = {} for npcid in queryNPCIDList: hpPerDict[npcid] = 0 for index in range(gameNPCManager.GetNPCCount()): curNPC = gameNPCManager.GetNPCByIndex(index) curID = curNPC.GetID() if curID == 0: continue curNPCID = curNPC.GetNPCID() if curNPCID not in queryNPCIDList: continue curHP = GameObj.GetHP(curNPC) maxHP = GameObj.GetMaxHP(curNPC) hpPer = max(1, curHP * 100 / maxHP) if curHP else 0 hpPerDict[curNPCID] = hpPer return hpPerDict ##¸±±¾¶¨Ê±Æ÷ # @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_LeaveTime: __DoLogic_MapLeave(tick) return def __DoLogic_MapPrepare(tick): invadeCfg = GetFamilyInvadeCfg() if tick - GameWorld.GetGameFB().GetFBStepTick() < invadeCfg[Def_Time_MapPrepare] * 1000: return __OnFBInvadeStart(tick) return def __DoLogic_MapFighting(tick): invadeCfg = GetFamilyInvadeCfg() if tick - GameWorld.GetGameFB().GetFBStepTick() < invadeCfg[Def_FightTime] * 1000: gameFB = GameWorld.GetGameFB() lastTick = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NotifyFBHelpTick) if tick - lastTick < 5000: return gameFB.SetGameFBDict(ChConfig.Def_FB_NotifyFBHelpTick, tick) __SortHurtInfo() playerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not curPlayer: continue DoFBHelp(curPlayer, tick) #FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 2000) return __DoInvadeOver(tick, Def_FILoseReason_Timeout) return def __DoLogic_MapLeave(tick): gameFB = GameWorld.GetGameFB() invadeCfg = GetFamilyInvadeCfg() if tick - gameFB.GetFBStepTick() < invadeCfg[Def_Time_Leave] * 1000: return FBCommon.SetFBStep(FB_Step_Over, tick) familyID = gameFB.GetGameFBDictByKey(Map_FamilyInvadeFB_FamilyID) #¸ø²ÎÓë½±Àø joinPlayerIDList = PyGameData.g_swrhPlayerIDDict.pop(familyID, []) joinAward = FBCommon.GetFBLineReward(ChConfig.Def_FBMapID_FamilyInvade, 0) if joinAward: PlayerControl.SendMailByKey('SwrhReward', joinPlayerIDList, joinAward) PyGameData.g_swrhPlayerHurtDict.pop(familyID, []) # ʱ¼äµ½£¬Ìß³ö»¹ÔÚ¸±±¾µÄÍæ¼ÒµÈ... FBCommon.DoLogic_FBKickAllPlayer() GameWorld.GetGameWorld().SetPropertyID(0) GameWorldProcess.CloseFB(tick) return def __OnFBInvadeStart(tick): FBCommon.SetFBStep(FB_Step_Fighting, tick) invadeCfg = GetFamilyInvadeCfg() tdFileName = invadeCfg[Def_FInvade_TDFileName] rMarkList = invadeCfg[Def_FInvade_RMarkList] for index, rMark in enumerate(rMarkList): FBCommon.OpenTDNPCRefresh(rMark, tdFileName, 0, tick, index == 0) # Õ½ÃËÆµµÀ֪ͨ¿ªÊ¼ FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, invadeCfg[Def_FightTime] * 1000) return def __CheckGuardExpBuff(tick): guardDeadCnt = GameWorld.GetGameFB().GetGameFBDictByKey(Map_FamilyInvadeFB_GuardDead) guardBuffIDList = IpyGameDataPY.GetFuncEvalCfg('FamilyInvadeCfg', 4) playerManager = GameWorld.GetMapCopyPlayerManager() for index in range(0 , playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not curPlayer.GetPlayerID(): continue if guardDeadCnt >= len(guardBuffIDList): #È¥µôBUFF BuffSkill.DelBuffBySkillID(curPlayer, guardBuffIDList[0], tick) continue skillBuffID = guardBuffIDList[0 if guardDeadCnt == 1 else 1] skillBuff = GameWorld.GetGameData().GetSkillBySkillID(skillBuffID) if not skillBuff: GameWorld.Log("FbEncourageBuff ÕÒ²»µ½¼¼ÄÜ%s" % skillBuffID) continue buffType = SkillCommon.GetBuffType(skillBuff) BuffSkill.DoAddBuff(curPlayer, buffType, skillBuff, tick) return ##¸±±¾ÓÐNPCÕÙ³ö # @param curNPC: # @param tick:tick # @return None def DoFBRebornNPC(curNPC, tick): fromRefreshValue = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_FromRefreshValue) # ÈëÇÖ¹Ö if fromRefreshValue == GetFamilyInvadeCfg()[Def_FInvade_TDFileName]: curNPC.SetIsNeedProcess(True) FBCommon.UpdTDNPCCnt(curNPC, 1) return def OnTDCurWheelOver(refreshMark, tick): rMarkList = GetFamilyInvadeCfg()[Def_FInvade_RMarkList] isWheelRefreshOver = FBCommon.IsTDWheelRefreshOver(rMarkList) # ±¾´ó²¨ËùÓеãË¢¹ÖÍê±Ï if isWheelRefreshOver: GameWorld.DebugLog("±¾´ó²¨ËùÓеãË¢Íê, Ç¿ÖÆÍ¬²½Ò»´Î¹ÖÎïÊý") __SortHurtInfo() FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) # Ç¿ÖÆÍ¬²½Ò»´Î return ## ¹ÖÎï¾­ÑéÖµ def OnGetNPCExp(curPlayer, curNPC): baseExp = curNPC.GetExp() reExp = PlayerControl.GetPlayerReExp(curPlayer) add_Exp = eval(IpyGameDataPY.GetFuncCompileCfg("SwrhMonsterExp", 1)) return add_Exp 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_NPCSelfDestruction(curNPC, tick): __DoOnNPCKilled(None, curNPC, tick) return def __DoOnNPCKilled(attacker, curNPC, tick): gameFB = GameWorld.GetGameFB() npcID = curNPC.GetNPCID() towerNPCID = GetFamilyInvadeCfg()[Def_FInvade_RMarkTower][1] if npcID == towerNPCID: #ÈË»ÊËÀÁË __DoInvadeOver(tick, Def_FILoseReason_TowerBroken) return #ÊØÎÀËÀÁË guardNPCIDList = GetFamilyInvadeCfg()[Def_FInvade_GuardDict].values() if npcID in guardNPCIDList: guardDead = gameFB.GetGameFBDictByKey(Map_FamilyInvadeFB_GuardDead) gameFB.SetGameFBDict(Map_FamilyInvadeFB_GuardDead, guardDead + 1) __CheckGuardExpBuff(tick) return fromRefreshValue = curNPC.GetDictByKey(ChConfig.Def_NPC_Dict_FromRefreshValue) # ÈëÇÖ¹Ö if fromRefreshValue == GetFamilyInvadeCfg()[Def_FInvade_TDFileName]: __OnInvadeNPCKilled(curNPC, tick) if attacker and attacker.GetGameObjType() == IPY_GameWorld.gotPlayer: #»÷ɱ¹Ö£¬È«µØÍ¼µÄÈ˶¼ÏíÓо­Ñé baseExp = curNPC.GetExp() copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in xrange(copyMapPlayerManager.GetPlayerCount()): curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) if curPlayer == None or curPlayer.IsEmpty(): continue if curPlayer.GetID() == attacker.GetID(): continue reExp = PlayerControl.GetPlayerReExp(curPlayer) add_Exp = eval(IpyGameDataPY.GetFuncCompileCfg("SwrhMonsterExp", 1)) playerControl = PlayerControl.PlayerControl(curPlayer) playerControl.AddExp(add_Exp, ShareDefine.Def_ViewExpType_KillNPC) return return def __OnInvadeNPCKilled(curNPC, tick): gameFB = GameWorld.GetGameFB() gameFB.SetGameFBDict(Map_FamilyInvadeFB_KillNPCCnt, gameFB.GetGameFBDictByKey(Map_FamilyInvadeFB_KillNPCCnt) + 1) FBCommon.UpdTDNPCCnt(curNPC, -1) # ¹ÖÎïÊý-1 rMarkList = GetFamilyInvadeCfg()[Def_FInvade_RMarkList] isAllRefresh = FBCommon.IsTDNPCRefreshOver(rMarkList) # ËùÓйÖÊÇ·ñÈ«²¿Ë¢Íê isAllKilled = FBCommon.IsTDNPCCurWheelAllKilled(rMarkList) # ±¾²¨¹ÖÊÇ·ñÈ«²¿±»»÷ɱ if isAllRefresh and isAllKilled: GameWorld.DebugLog("È«²¿¹ÖË¢ÐÂÍê±ÏÇÒÒѱ»É±Íê, ´¦Àí½áÊøÂß¼­") __DoInvadeOver(tick) elif isAllKilled: GameWorld.DebugLog("±¾²¨¹ÖÈ«²¿É±Í꣬½øÈëÏÂÒ»²¨£¡") __DoInvadeNextWheelStart(tick) return def __DoInvadeNextWheelStart(tick): GameWorld.DebugLog("ÏÂÒ»´ó²¨¿ªÊ¼Ë¢¹Ö...") passWheel = None gameFB = GameWorld.GetGameFB() rMarkList = GetFamilyInvadeCfg()[Def_FInvade_RMarkList] for index, rMark in enumerate(rMarkList): if passWheel == None: passWheel = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshBigWheelNum % rMark) + 1 #__NotifyDifficultyWheelPass(passWheel) FBCommon.SetEnterTDNextWheel(rMark, tick, index == 0) if index == 0: FBCommon.Sync_TDNextWheelTick(None, rMark, Def_Devil_TimeType, tick) __SortHurtInfo() FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) # ²¨ÊýÇл»Ç¿ÖÆÍ¬²½Ò»´Î return ## »ñµÃ¾­Ñé # @param curPlayer µ±Ç°Íæ¼Ò # @param addExp »ñµÃµÄ¾­Ñé # @param expViewType ¾­ÑéÀàÐÍ # @return True or False def OnGetExp(curPlayer, addExp, expViewType): if expViewType != ShareDefine.Def_ViewExpType_KillNPC: return playerID = curPlayer.GetID() gameFB = GameWorld.GetGameFB() exp = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExp) expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExpPoint) totalExp = expPoint * ChConfig.Def_PerPointValue + exp updTotalExp = totalExp + addExp updExp = updTotalExp % ChConfig.Def_PerPointValue updExpPoint = updTotalExp / ChConfig.Def_PerPointValue gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExp, updExp) gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExpPoint, updExpPoint) GameWorld.DebugLog("OnGetExp() totalExp=%s,addExp=%s,updTotalExp=%s" % (totalExp, addExp, updTotalExp), playerID) return def __DoInvadeOver(tick, loseReason=0): # ¸±±¾½áÊøÂß¼­ gameFB = GameWorld.GetGameFB() isAllPass = not loseReason familyID = gameFB.GetGameFBDictByKey(Map_FamilyInvadeFB_FamilyID) GameWorld.DebugLog("´¦Àí¸±±¾½áÊøÂß¼­, isAllPass=%s,loseReason=%s, familyID=%s" % (isAllPass, loseReason, familyID)) invadeCfg = GetFamilyInvadeCfg() costTime = tick - GameWorld.GetGameFB().GetFBStepTick() FBCommon.SetFBStep(FB_Step_LeaveTime, tick) # Çå¹Ö #towerNPCIDList = GetDefaultMaxAngryNPCIDList() #FBCommon.ClearFBNPC(towerNPCIDList) __SortHurtInfo() FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp, 0) # ¸±±¾½áÊøÇ¿ÖÆÍ¬²½Ò»´Î msgStr = str(familyID) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'SWRHFBOver', msgStr, len(msgStr)) passWheel = 0 # ͨ¹ýµÄ²¨Êý rMarkList = GetFamilyInvadeCfg()[Def_FInvade_RMarkList] # ¹Ø±ÕËùÓÐË¢¹Öµã for rMark in rMarkList: if passWheel == 0: wheelNum = gameFB.GetGameFBDictByKey(ChConfig.Map_TDNPC_RefreshBigWheelNum % rMark) passWheel = wheelNum + 1 if isAllPass else wheelNum FBCommon.CloseTDNPCRefresh(rMark, True) if isAllPass: guardDeadCnt = gameFB.GetGameFBDictByKey(Map_FamilyInvadeFB_GuardDead) if guardDeadCnt == 0: passGrade = 5 #s elif guardDeadCnt == 1: passGrade = 4 #a elif guardDeadCnt == 2: passGrade = 3 #b else: passGrade = 1 #d overMsgDict = {FBCommon.Over_dataMapID:ChConfig.Def_FBMapID_FamilyInvade, FBCommon.Over_isPass:int(isAllPass), FBCommon.Over_grade:passGrade, FBCommon.Over_costTime:costTime} GameWorld.Log("¸±±¾½áËã: familyID=%s, %s" % (familyID, overMsgDict), familyID) leaveTick = invadeCfg[Def_Time_Leave] * 1000 copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() for i in xrange(copyMapPlayerManager.GetPlayerCount()): curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) if curPlayer == None or curPlayer.IsEmpty(): continue curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True) playerID = curPlayer.GetPlayerID() exp = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExp) expPoint = gameFB.GetPlayerGameFBDictByKey(playerID, FBPlayerDict_TotalExpPoint) #ÆÀ·Ö½±Àø myRank = __GetSelfHurtRank(curPlayer) scoreExpNum = __GiveScoreAward(curPlayer, passGrade, passWheel) scoreExpPoint, scoreExp = scoreExpNum / ChConfig.Def_PerPointValue, scoreExpNum % ChConfig.Def_PerPointValue overMsgDict.update({FBCommon.Over_rank:myRank, FBCommon.Over_exp:exp, FBCommon.Over_expPoint:expPoint, "scoreExp":scoreExp, "scoreExpPoint":scoreExpPoint}) FBCommon.Notify_FB_Over(curPlayer, overMsgDict) PlayerFamily.AddFamilyActivity(curPlayer, ShareDefine.FamilyActive_SWRH) return def __GiveScoreAward(curPlayer, star, passWheel): #ÆÀ·Ö½±Àø reExp = PlayerControl.GetPlayerReExp(curPlayer) starPerDict = IpyGameDataPY.GetFuncEvalCfg('FamilyInvadeCfg', 2) starPer = starPerDict.get(star, 0) expFormula = IpyGameDataPY.GetFuncCompileCfg('FamilyInvadeCfg', 3) scoreExp = eval(expFormula) playerControl = PlayerControl.PlayerControl(curPlayer) playerControl.AddExp(scoreExp) return scoreExp def __GetSelfHurtRank(curPlayer, playerHurtList=[]): #»ñÈ¡×Ô¼ºµÄÅÅÃû playerName = curPlayer.GetName() if not playerHurtList: familyID = curPlayer.GetFamilyID() playerHurtList = PyGameData.g_swrhPlayerHurtDict.get(familyID, []) playerHurtList = sorted(playerHurtList, key=lambda asd:asd[1], reverse=True) myRank = 0 for i, info in enumerate(playerHurtList): if playerName == info[0]: myRank = i + 1 break return myRank ## Íæ¼Ò¶ÔNPCÔì³ÉÉ˺¦ # @param curPlayer µ±Ç°Íæ¼Ò # @param curNPC # @param hurtHP # @return None def DoFB_Player_HurtNPC(curPlayer, curNPC, hurtHP): gameFB = GameWorld.GetGameFB() fbStep = GameWorld.GetGameFB().GetFBStep() # ¸±±¾×¼±¸ if fbStep != FB_Step_Fighting: return familyID = gameFB.GetGameFBDictByKey(Map_FamilyInvadeFB_FamilyID) playerName = curPlayer.GetName() playerHurtDict = dict(PyGameData.g_swrhPlayerHurtDict.get(familyID, [])) playerHurtDict[playerName] = playerHurtDict.get(playerName, 0) + hurtHP PyGameData.g_swrhPlayerHurtDict[familyID] = playerHurtDict.items() GameWorld.DebugLog('g_familyPlayerHurtDict=%s' % PyGameData.g_swrhPlayerHurtDict) return def __SortHurtInfo(): #ÅÅÐò familyID = GameWorld.GetGameFB().GetGameFBDictByKey(Map_FamilyInvadeFB_FamilyID) if familyID not in PyGameData.g_swrhPlayerHurtDict: return playerHurtList = PyGameData.g_swrhPlayerHurtDict[familyID] playerHurtList = sorted(playerHurtList, key=lambda asd:asd[1], reverse=True) PyGameData.g_swrhPlayerHurtDict[familyID] = playerHurtList return ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼­ÓÉÍâ²ã¾ö¶¨ # @param attacker ¹¥»÷·½ # @param defender ·ÀÊØ·½ # @return bool def CheckCanAttackTagObjInFB(attacker, defender): gameFB = GameWorld.GetGameFB() if gameFB.GetFBStep() != FB_Step_Fighting: return False return True #def __NotifyDifficultyWheelPass(passWheel): # # µ¥²¨Êý¹ý¹ØÍ¨Öª # # familyID = GameWorld.GetGameWorld().GetPropertyID() # overDict = {"passWheel":passWheel, "difficulty":difficulty} # GameWorld.Log("¸±±¾µ¥²¨½áËã: familyID=%s, %s" % (familyID, overDict), familyID) # # copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager() # for i in xrange(copyMapPlayerManager.GetPlayerCount()): # # curPlayer = copyMapPlayerManager.GetPlayerByIndex(i) # # if curPlayer == None or curPlayer.IsEmpty(): # continue # FBCommon.Notify_FB_Over(curPlayer, overDict) # # return # -------------------------------------------------------------------------------------------------