#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_SkyTower # # @todo:ÌìÐÇËþ # @author xdh # @date 2019-05-09 # @version 1.0 # ÏêϸÃèÊö: ÌìÐÇËþ # #--------------------------------------------------------------------- #"""Version = 2019-05-09 11:00""" #--------------------------------------------------------------------- import FBCommon import GameWorld import IPY_GameWorld import PlayerControl import NPCCustomRefresh import ChPyNetSendPack import ItemControler import EventShell import NetPackCommon import ShareDefine import IpyGameDataPY import ChConfig import ChPlayer import PlayerActivity import PlayerBillboard g_runeTypeDict = {} FBDict_Level = 'FBDict_Level' # ¸±±¾¹Ø¿¨ # ¸±±¾Í¨ÓÃÅäÖà ( Def_PrepareTime, # ÿ¹Ø×¼±¸Ê±¼ä£¬Ãë Def_FightTime, # ÿ¹ØÕ½¶·Ê±¼ä£¬Ãë Def_ExitTime, # Í˳öʱ¼ä, Ãë Def_DayPrizeMaxCnt, #ÿÈÕ½±Àø×î¶àÀÛ»ý¼¸Ì죨Åä0ÔòÎÞÏÞ£© ) = range(4) # ¸±±¾×´Ì¬ ( FB_State_Open, # ¸±±¾¿ªÆô FB_State_FightPrepare, # Õ½¶·×¼±¸Ê±¼ä FB_State_Fighting, # Õ½¶· FB_State_FreeTime, # »î¶¯½áÊø×¼±¸£¨Ê¤Àû/ʧ°Ü£© FB_State_Close, # ¹Ø±Õ¸±±¾ ) = range(5) ## ÌìÐÇËþÅäÖà def __GetTrialCfg(): return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_SkyTower) def GetTowerIpyData(floor): return IpyGameDataPY.GetIpyGameData('SkyTower', floor) def OnFBPlayerOnLogin(curPlayer): SyncSkyTowerInfo(curPlayer) return ## ͬ²½ÌìÐÇËþ¹Ø¿¨ÐÅÏ¢ # @floorID Ϊ0ʱĬÈÏÈ«²¿Í¬²½£¬> 0ʱ½öͬ²½¸Ã¹Ø¿¨ def SyncSkyTowerInfo(curPlayer): ttInfo = ChPyNetSendPack.tagMCSkyTowerInfo() ttInfo.Clear() ttInfo.Floor = __GetSkyTowerCurFloor(curPlayer) ttInfo.ServerRewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord) NetPackCommon.SendFakePack(curPlayer, ttInfo) return ## »ñÈ¡µ±Ç°ÒÑͨ¹Ø¹Ø¿¨ def __GetSkyTowerCurFloor(curPlayer): return curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerFloor) ## ¸üе±Ç°ÒÑͨ¹Ø¹Ø¿¨ def SetSkyTowerCurfloorID(curPlayer, floorID): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerFloor, floorID) #ÈÎÎñ EventShell.EventRespons_SkyTowerCnt(curPlayer, floorID) GameWorld.DebugLog(' ¸üÐÂÌìÐÇËþÒÑͨ¹ØÊý %s' % floorID) return ## ÊÇ·ñ¿É½øÈë # @param curPlayer # @param mapID µØÍ¼ID # @param lineId ·ÖÏßID # @param tick # @return ÊÇ·ñ¿É½øÈë def OnEnterFBEvent(curPlayer, mapID, lineId, tick): return True ## ¼ì²é¿É·ñ½øÐÐÌôÕ½ def __CheckCanChallenge(curPlayer, floorID): playerID = curPlayer.GetPlayerID() ipyData = GetTowerIpyData(floorID) if not ipyData: GameWorld.ErrLog("ÌìÐÇËþ¹Ø¿¨(%s)²»´æÔÚ" % (floorID), playerID) return False # ÊÇ·ñÒѹý¹Ø if floorID <= __GetSkyTowerCurFloor(curPlayer): GameWorld.DebugLog("ÌìÐÇËþ±¾¹Ø(%s)Òѹý¹Ø, ÎÞ·¨ÌôÕ½!" % floorID, playerID) return False if curPlayer.GetLV() < ipyData.GetNeedLV(): GameWorld.DebugLog("ÌìÐÇËþ±¾¹Ø µÈ¼¶²»×ã%s, ÎÞ·¨ÌôÕ½!" % ipyData.GetNeedLV(), playerID) return False return True ##¸±±¾Íæ¼Ò½øÈëµã # @param curPlayer Íæ¼ÒʵÀý # @param mapID µØÍ¼ID # @param lineId ·ÖÏßID # @param ipyEnterPosInfo ¹¦ÄÜÏß·IPYÅäÖÃ×ø±êÐÅÏ¢ # @param tick ʱ¼ä´Á # @return posX, posY, Ëæ»ú°ë¾¶(¿ÉÑ¡) def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick): return ipyEnterPosInfo ## ÊÇ·ñ¿ÉÒÔ½øÈë # @param ask ÇëÇóÐÅÏ¢ # @param tick # @return »Ø¸´ÊÇ·ñͨ¹ýÇëÇó def OnChangeMapAsk(ask, tick): return IPY_GameWorld.cmeAccept ## ½ø¸±±¾ # @param curPlayer # @param tick # @return None def DoEnterFB(curPlayer, tick): gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() if fbStep == FB_State_FightPrepare: notify_tick = __GetTrialCfg()[Def_PrepareTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True) elif fbStep == FB_State_Fighting: notify_tick = __GetTrialCfg()[Def_FightTime] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True) elif fbStep > FB_State_Fighting: PlayerControl.PlayerLeaveFB(curPlayer) return # ²»×ö´¦Àí£¬Óи±±¾ÐÐΪ¿Í»§¶Ë·¢°üÑ¡ÔñÌôÕ½¹Ø¿¨ #EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_SkyTower, 0, ChConfig.CME_Log_Start) return ## ¸±±¾Ê±¼äµ½¹Ø±Õ # @param tick µ±Ç°Ê±¼ä # @return None # @remarks º¯ÊýÏêϸ˵Ã÷. def OnCloseFB(tick): return ##Íæ¼ÒÍ˳ö¸±±¾. # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾. def DoExitFB(curPlayer, tick): # Íæ¼ÒÍ˳öĬÈϹرո±±¾ #GameWorldProcess.CloseFB(tick) return ##¸±±¾×ÜÂß¼­¼ÆÊ±Æ÷ # @param tick ʱ¼ä´Á # @return ÎÞÒâÒå # @remarks ¸±±¾×ÜÂß¼­¼ÆÊ±Æ÷ def OnProcess(tick): gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() if fbStep == FB_State_FightPrepare: __DoLogic_FightPrepare(tick) elif fbStep == FB_State_Fighting: __DoLogic_Fighting(tick) elif fbStep == FB_State_FreeTime: __DoLogic_FreeTime(tick) elif fbStep == FB_State_Close: pass return ## »ñÈ¡BossID def __GetSkyTowerBossID(floorID= -1): gameFB = GameWorld.GetGameFB() if floorID == -1: floorID = gameFB.GetGameFBDictByKey(FBDict_Level) ipyData = GetTowerIpyData(floorID) if not ipyData: GameWorld.ErrLog("__GetSkyTowerBossID() can not find %s in SkyTowerNPC.txt" % floorID) return 0 return ipyData.GetBossID() ##Õ½¶·×¼±¸Ê±¼ä # @param tick ʱÖÓ # @return ÎÞÒâÒå def __DoLogic_FightPrepare(tick): gameFB = GameWorld.GetGameFB() trialCfg = __GetTrialCfg() if tick - gameFB.GetFBStepTick() < trialCfg[Def_PrepareTime] * 1000: return bossID = __GetSkyTowerBossID() if not bossID: FBCommon.DoLogic_FBKickAllPlayer() return FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, trialCfg[Def_FightTime] * 1000) NPCCustomRefresh.SetNPCRefresh(FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_SkyTower, 0), [bossID]) #תÈëÕ½¶· FBCommon.SetFBStep(FB_State_Fighting, tick) return ## ¿ªÊ¼¸±±¾¹Ø¿¨ def StartfloorID(curPlayer, floorID, tick): if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie: GameWorld.DebugLog("¸´»îÍæ¼Ò...", curPlayer.GetPlayerID()) ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_City, tick) curPlayer.SetHP(curPlayer.GetMaxHP()) FBCommon.ClearFBNPC() gameFB = GameWorld.GetGameFB() gameFB.SetGameFBDict(FBDict_Level, floorID) prepareTick = __GetTrialCfg()[Def_PrepareTime] * 1000 FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick) FBCommon.SetFBStep(FB_State_FightPrepare, tick) helpDict = {FBCommon.Help_wheel:floorID} FBCommon.Notify_FBHelp(curPlayer, helpDict) GameWorld.DebugLog("StartfloorID, floorID=%s, helpDict=%s" % (floorID, str(helpDict)), curPlayer.GetPlayerID()) return ##Õ½¶·Ê±¼ä # @param tick ʱÖÓ # @return ÎÞÒâÒå def __DoLogic_Fighting(tick): gameFB = GameWorld.GetGameFB() #ÅжÏʱ¼ä½áÊø if tick - gameFB.GetFBStepTick() < __GetTrialCfg()[Def_FightTime] * 1000: return floorID = gameFB.GetGameFBDictByKey(FBDict_Level) playerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not curPlayer: continue __SendSkyTowerOverInfo(curPlayer, floorID, False) #ÓÎÏ·½áÊø __SetFBToFreeTime(tick) return ##ÉèÖø±±¾½øÈëÀ뿪״̬ # @param tick ʱÖÓ # @return ÎÞÒâÒå def __SetFBToFreeTime(tick): FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttLeaveMap, __GetTrialCfg()[Def_ExitTime] * 1000) FBCommon.SetFBStep(FB_State_FreeTime, tick) return ##±ÈÈü½áÊøµÄ¿ÕÏÐʱ¼ä # @param tick ʱÖÓ # @return ÎÞÒâÒå # @remarks ±ÈÈü½áÊøµÄ¿ÕÏÐʱ¼ä def __DoLogic_FreeTime(tick): if tick - GameWorld.GetGameFB().GetFBStepTick() < __GetTrialCfg()[Def_ExitTime] * 1000: return #FBCommon.DoLogic_FBKickAllPlayer() return ## ɱ¹Ö # @param curPlayer # @param curNPC ±»É±µÄ¹Ö # @param tick # @return None def DoFB_Player_KillNPC(curPlayer, curNPC, tick): gameFB = GameWorld.GetGameFB() if gameFB.GetFBStep() != FB_State_Fighting: return bossID = __GetSkyTowerBossID() if bossID != curNPC.GetNPCID(): return floorID = gameFB.GetGameFBDictByKey(FBDict_Level) # ¹ý¹ØÈ«·þ¹ã²¥ ipyData = GetTowerIpyData(floorID) if not ipyData: return if ipyData.GetIsNotify(): #IPY_Data = IpyGameDataPY.IPY_Data() #maxLevel = IPY_Data.GetRuneTowerByIndex(IPY_Data.GetRuneTowerCount()-1).GetID() sysMark = 'KillGodTowerInfo_1'# if floorID == maxLevel else 'GeRen_liubo_471172' PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetPlayerName(), floorID]) #¸üйؿ¨ SetSkyTowerCurfloorID(curPlayer, floorID) # ¸ø¹ý¹Ø½±Àø prizeDict = __GiveFBPassPrize(curPlayer, ipyData) # ¹ý¹ØÊ±¼ä costTime = tick - GameWorld.GetGameFB().GetFBStepTick() prizeDict[FBCommon.Over_costTime] = costTime __SendSkyTowerOverInfo(curPlayer, floorID, True, prizeDict) PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_SkyTower) SyncSkyTowerInfo(curPlayer) # ͬ²½×îйؿ¨ÐÅÏ¢ __SetFBToFreeTime(tick) if floorID >= 10: PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_SkyTower, floorID) # È«·þÄ¿±ê ipyDataServer = IpyGameDataPY.GetIpyGameDataNotLog("SkyTowerServerChallenge", floorID) if ipyDataServer: playerID = curPlayer.GetPlayerID() playerName = curPlayer.GetPlayerName() job = curPlayer.GetJob() playerLV = curPlayer.GetLV() realmLV = curPlayer.GetOfficialRank() msgInfo = str(["ServerChallengePass", [floorID, playerID, playerName, job, playerLV, realmLV]]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo)) return ## ¸ø¹ý¹Ø½±Àø def __GiveFBPassPrize(curPlayer, ipyData): giveItemDict = ipyData.GetReward() giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in giveItemDict.items()] event = ["SKYTower", False, {}] ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event) prizeDict = {FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(giveItemList)} return prizeDict ## ·¢ËÍÌôÕ½½á¹ûÐÅÏ¢ def __SendSkyTowerOverInfo(curPlayer, floorID, isPass, overDict={}): overDict[FBCommon.Over_dataMapID] = ChConfig.Def_FBMapID_SkyTower overDict[FBCommon.Over_wheel] = floorID overDict[FBCommon.Over_isPass] = int(isPass) GameWorld.DebugLog("__SendSkyTowerOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID()) FBCommon.Notify_FB_Over(curPlayer, overDict) return ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼­ÓÉÍâ²ã¾ö¶¨ # @param attacker ¹¥»÷·½ # @param defender ·ÀÊØ·½ # @return bool def CheckCanAttackTagObjInFB(attacker, defender): gameFB = GameWorld.GetGameFB() if gameFB.GetFBStep() != FB_State_Fighting: return False return True ##Íæ¼ÒËÀÍö. # @param curPlayer:ËÀÍöµÄÍæ¼Ò # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾. def DoPlayerDead(curPlayer): gameFB = GameWorld.GetGameFB() floorID = gameFB.GetGameFBDictByKey(FBDict_Level) __SendSkyTowerOverInfo(curPlayer, floorID, False) tick = GameWorld.GetGameWorld().GetTick() #ÓÎÏ·½áÊø __SetFBToFreeTime(tick) return ## ÊÇ·ñ¸±±¾¸´»î # @param None # @return ÊÇ·ñ¸±±¾¸´»î def OnPlayerReborn(): return True ## ¸±±¾ÐÐΪ # @param curPlayer Íæ¼Ò # @param actionType ÐÐΪÀàÐÍ # @param actionInfo ÐÐΪÐÅÏ¢ # @param tick µ±Ç°Ê±¼ä # @return None def DoFBAction(curPlayer, actionType, actionInfo, tick): # ĬÈÏΪѡÔñ¹Ø¿¨£¬Óɿͻ§¶Ë¾ö¶¨£¬½ø³¡¼°¸±±¾Ñ¡¹ØÍ¨ÓôËÐÐΪ if actionInfo <= 0: return gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() if fbStep in [FB_State_FightPrepare, FB_State_Fighting]: GameWorld.DebugLog("×¼±¸»òÕ½¶·ÖÐ, ÎÞ·¨±ä¸ü¹Ø¿¨!") return floorID = actionInfo if not __CheckCanChallenge(curPlayer, floorID): FBCommon.DoLogic_FBKickAllPlayer() return StartfloorID(curPlayer, floorID, tick) return def OnGetSkyTowerServerChallengeReward(curPlayer, floorID): ## Áìȡȫ·þÌôÕ½²ã½±Àø playerID = curPlayer.GetPlayerID() ipyData = IpyGameDataPY.GetIpyGameData("SkyTowerServerChallenge", floorID) if not ipyData: return recordIndex = ipyData.GetRewardRecordIndex() rewardInfo = ipyData.GetReward() rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord) if rewardRecord & pow(2, recordIndex): GameWorld.DebugLog("ÌìÐÇËþÈ«·þÌôÕ½²ãÒÑÁì½±!floorID=%s,recordIndex=%s,rewardRecord=%s" % (floorID, recordIndex, rewardRecord)) return ipyData.GetRewardRecordIndex() msgInfo = str(["ServerChallengeReward", [floorID, recordIndex, rewardInfo]]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "SkyTower", msgInfo, len(msgInfo)) return def GameServer_SkyTowerInfo(curPlayer, resultList): ## GameServer ·µ»ØÐÅÏ¢ msgType, msgData = resultList[:2] if msgType == "ServerChallengeReward": isPass = resultList[2] floorID, recordIndex, rewardInfo = msgData if not isPass: return rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord) if rewardRecord & pow(2, recordIndex): GameWorld.DebugLog("·µ»ØÊ±ÌìÐÇËþÈ«·þÌôÕ½²ãÒÑÁì½±!floorID=%s,recordIndex=%s,rewardRecord=%s" % (floorID, recordIndex, rewardRecord)) return updRewardRecord = rewardRecord | pow(2, recordIndex) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_SkyTowerChallengeRewardRecord, updRewardRecord) SyncSkyTowerInfo(curPlayer) giveItemList = [[itemID, itemCnt, 0] for itemID, itemCnt in rewardInfo.items()] event = ["SKYTowerServerChallengeReward", False, {"floorID":floorID}] ItemControler.GivePlayerItemOrMail(curPlayer, giveItemList, None, event) return