10019 【砍树】回合战斗(回合战斗NPC相关属性统一调整到NPC扩展表;去除副本回合制表,新增冒险关卡表;)
| | |
| | | DWORD AtkBackDefRate; //抗反击概率
|
| | | DWORD SuckHPPer; //吸血比率
|
| | | DWORD SuckHPDefPer; //抗吸血比率
|
| | | dict SpecAttrInfo; //特殊属性信息 {"属性ID":值, ...}
|
| | | list PetNPCIDList; //回合战斗灵宠NPCID列表
|
| | | list ElfSkillIDList; //回合战斗精怪技能ID列表
|
| | | list STSkillIDList; //回合战斗神通技能ID列表
|
| | | };
|
| | |
|
| | | //成长型境界怪物表
|
| | |
| | | dict SweepGoodDrop; //扫荡珍稀符印
|
| | | };
|
| | |
|
| | | //冒险关卡表
|
| | |
|
| | | struct tagAdventure
|
| | | {
|
| | | WORD _LineID; //功能线路ID
|
| | | DWORD NPCID; //NPCID
|
| | | list AwardItemList; //过关奖励列表[[物品ID,个数,是否拍品], ...]
|
| | | };
|
| | |
|
| | | //地图表格
|
| | |
|
| | | struct tagChinMap
|
| | |
| | | eval RefreshNPC; //标试点刷怪配置
|
| | | eval GradeInfo; //评级规则
|
| | | eval RewardInfo; //奖励信息
|
| | | };
|
| | |
|
| | | //副本回合制表
|
| | |
|
| | | struct tagFBTurn
|
| | | {
|
| | | DWORD _DataMapID; //数据地图ID
|
| | | WORD _LineID; //功能线路ID
|
| | | DWORD NPCID; //NPCID
|
| | | list PetNPCIDList; //灵宠NPCID列表
|
| | | list ElfSkillIDList; //精怪技能ID列表
|
| | | list STSkillIDList; //神通技能ID列表
|
| | | list AwardItemListFirst; //首次过关奖励列表[[物品ID,个数,是否拍品], ...]
|
| | | list AwardItemList; //再次过关奖励列表[[物品ID,个数,是否拍品], ...]
|
| | | };
|
| | |
|
| | | //副本助战表
|
| | |
| | | Def_FBMapID_Love = 31300
|
| | |
|
| | | #回合战斗自定义地图ID
|
| | | TurnFightMapIDList = (
|
| | | Def_TFMapID_MineArea, # 福地 1
|
| | | ) = range(1, 1 + 1)
|
| | | Def_TFMapID_MineArea = 1 # 福地 1
|
| | |
|
| | | #需要刷世界BOSS的副本
|
| | | WorldBossFBMapIDList = [Def_FBMapID_SealDemon, Def_FBMapID_ZhuXianBoss, Def_FBMapID_DemonKing]
|
| | |
| | | Head = tagHead()
|
| | | MapID = 0 #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | FuncLineID = 0 #(WORD FuncLineID)
|
| | | PlayerID = 0 #(DWORD PlayerID)// 战斗目标玩家ID,可为0,某些功能可能有用,如竞技场
|
| | | TagType = 0 #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
|
| | | TagID = 0 #(DWORD TagID)// 战斗目标类型对应的ID
|
| | | ValueCount = 0 #(BYTE ValueCount)
|
| | | ValueList = list() #(vector<DWORD> ValueList)// 附加值列表,可选,具体含义由MapID决定
|
| | | data = None
|
| | |
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.ValueCount):
|
| | | value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
|
| | |
| | | self.Head.SubCmd = 0x10
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.PlayerID = 0
|
| | | self.TagType = 0
|
| | | self.TagID = 0
|
| | | self.ValueCount = 0
|
| | | self.ValueList = list()
|
| | | return
|
| | |
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 4 * self.ValueCount
|
| | |
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.MapID)
|
| | | data = CommFunc.WriteWORD(data, self.FuncLineID)
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteBYTE(data, self.TagType)
|
| | | data = CommFunc.WriteDWORD(data, self.TagID)
|
| | | data = CommFunc.WriteBYTE(data, self.ValueCount)
|
| | | for i in range(self.ValueCount):
|
| | | data = CommFunc.WriteDWORD(data, self.ValueList[i])
|
| | |
| | | Head:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | PlayerID:%d,
|
| | | TagType:%d,
|
| | | TagID:%d,
|
| | | ValueCount:%d,
|
| | | ValueList:%s
|
| | | '''\
|
| | |
| | | self.Head.OutputString(),
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.PlayerID,
|
| | | self.TagType,
|
| | | self.TagID,
|
| | | self.ValueCount,
|
| | | "..."
|
| | | )
|
| | |
| | | Head = tagHead()
|
| | | MapID = 0 #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | FuncLineID = 0 #(WORD FuncLineID)
|
| | | PlayerID = 0 #(DWORD PlayerID)// 对应玩家ID,可为0,某些功能可能有用,如竞技场
|
| | | TagType = 0 #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
|
| | | TagID = 0 #(DWORD TagID)// 战斗目标类型对应的ID
|
| | | State = 0 #(BYTE State)// 0-起始状态标记;1-准备完毕;2-战斗中;3-战斗结束;4-结算奖励;5-结束状态标记
|
| | | TurnNum = 0 #(BYTE TurnNum)// 当前轮次
|
| | | TurnMax = 0 #(BYTE TurnMax)// 最大轮次
|
| | |
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TurnNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TurnMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | |
| | | self.Head.SubCmd = 0x20
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.PlayerID = 0
|
| | | self.TagType = 0
|
| | | self.TagID = 0
|
| | | self.State = 0
|
| | | self.TurnNum = 0
|
| | | self.TurnMax = 0
|
| | |
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 1
|
| | |
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.MapID)
|
| | | data = CommFunc.WriteWORD(data, self.FuncLineID)
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteBYTE(data, self.TagType)
|
| | | data = CommFunc.WriteDWORD(data, self.TagID)
|
| | | data = CommFunc.WriteBYTE(data, self.State)
|
| | | data = CommFunc.WriteBYTE(data, self.TurnNum)
|
| | | data = CommFunc.WriteBYTE(data, self.TurnMax)
|
| | |
| | | Head:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | PlayerID:%d,
|
| | | TagType:%d,
|
| | | TagID:%d,
|
| | | State:%d,
|
| | | TurnNum:%d,
|
| | | TurnMax:%d,
|
| | |
| | | self.Head.OutputString(),
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.PlayerID,
|
| | | self.TagType,
|
| | | self.TagID,
|
| | | self.State,
|
| | | self.TurnNum,
|
| | | self.TurnMax,
|
| | |
| | | ## 回合战斗请求
|
| | | # @return: None-不允许战斗;非None-允许战斗,具体返回内容功能自己决定
|
| | |
|
| | | mapID, funcLineID, tagPlayerID, valueList = dataMsg
|
| | | mapID, funcLineID, tagType, tagID, valueList = dataMsg
|
| | | if mapID == ChConfig.Def_TFMapID_MineArea:
|
| | | return GameWorldMineArea.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList)
|
| | | return GameWorldMineArea.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagID, valueList)
|
| | |
|
| | | return
|
| | |
|
| | | def __OnTurnFightOver(curPlayer, dataMsg):
|
| | | ## 回合战斗结束
|
| | |
|
| | | mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList = dataMsg
|
| | | mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList = dataMsg
|
| | |
|
| | | if mapID == ChConfig.Def_TFMapID_MineArea:
|
| | | return GameWorldMineArea.OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList)
|
| | | return GameWorldMineArea.OnTurnFightOver(curPlayer, mapID, funcLineID, tagID, valueList, fightRet, awardItemList)
|
| | |
|
| | | return
|
| | |
|
| | |
| | | import SkillShell |
| | | import BuffSkill |
| | | import FBCommon |
| | | import ItemControler |
| | | import PassiveBuffEffMng |
| | | import FBLogic |
| | | import ShareDefine |
| | | import PlayerTask |
| | | |
| | | # 回合战斗流程状态 |
| | | ( |
| | |
| | | # tagHead Head; |
| | | # DWORD MapID; // 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等) |
| | | # WORD FuncLineID; |
| | | # DWORD PlayerID; // 战斗目标玩家ID,可为0,某些功能可能有用,如竞技场 |
| | | # BYTE TagType; // 战斗目标类型,0-NPC,1-玩家,2-队伍 |
| | | # DWORD TagID; // 战斗目标类型对应的ID |
| | | # BYTE ValueCount; |
| | | # DWORD ValueList[ValueCount]; // 附加值列表,可选,具体含义由MapID决定 |
| | | #}; |
| | |
| | | curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) |
| | | mapID = clientData.MapID |
| | | funcLineID = clientData.FuncLineID |
| | | tagPlayerID = clientData.PlayerID |
| | | tagType = clientData.TagType |
| | | tagID = clientData.TagID |
| | | valueList = clientData.ValueList |
| | | |
| | | playerID = curPlayer.GetPlayerID() |
| | | if tagPlayerID: |
| | | if playerID == tagPlayerID: |
| | | if tagType == ChConfig.TurnBattle_TagType_Player: |
| | | if tagID == playerID: |
| | | GameWorld.DebugLog("不能打自己!", playerID) |
| | | return |
| | | |
| | |
| | | if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, funcLineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK: |
| | | return |
| | | |
| | | if not FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList): |
| | | reqRet = FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList) |
| | | if not reqRet: |
| | | return |
| | | |
| | | # 需要发送到GameServer验证 |
| | | if mapID in ChConfig.Def_TFMapID_SendToGameServer: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagPlayerID, valueList]) |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagType, tagID, valueList]) |
| | | return |
| | | |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | return |
| | | |
| | | def SendToGameServer_TurnFight(curPlayer, msgType, dataMsg=""): |
| | |
| | | return |
| | | |
| | | if msgType == "TurnFightRequest": |
| | | mapID, funcLineID, tagPlayerID, valueList = dataMsg |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | mapID, funcLineID, tagType, tagID, valueList = dataMsg |
| | | DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | |
| | | elif msgType == "TurnFightOver": |
| | | mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList = dataMsg |
| | | FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret) |
| | | mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList = dataMsg |
| | | FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret) |
| | | |
| | | return |
| | | |
| | | def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick): |
| | | def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick): |
| | | ## 执行回合制战斗的完整流程 |
| | | |
| | | if curPlayer.GetSightLevel() != curPlayer.GetID(): |
| | | PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Start) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Start) |
| | | |
| | | if tagPlayerID: |
| | | PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagPlayerID, DoTrunFightVSPlayer, [mapID, funcLineID, valueList], True) |
| | | if tagType == ChConfig.TurnBattle_TagType_Player: |
| | | PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagID, DoTrunFightVSPlayer, [mapID, funcLineID, valueList], True) |
| | | return |
| | | |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) |
| | | return |
| | | |
| | | def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, PropDict): |
| | | tagType = ChConfig.TurnBattle_TagType_Player |
| | | tagID = tagPlayerID |
| | | mapID, funcLineID, valueList = callData |
| | | if PropDict and curPlayer.GetPlayerID() != tagPlayerID: |
| | | tick = GameWorld.GetGameWorld().GetTick() |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) |
| | | DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) |
| | | return |
| | | |
| | | def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick): |
| | | def DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick): |
| | | if not tagID: |
| | | return |
| | | playerID = curPlayer.GetPlayerID() |
| | | factionInfoA = GetPlayerFactionInfoByCache(playerID) |
| | | ipyData = None |
| | | if tagPlayerID: |
| | | factionInfoB = GetPlayerFactionInfoByCache(tagPlayerID) |
| | | else: |
| | | ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID) |
| | | if not ipyData: |
| | | return |
| | | npcID = ipyData.GetNPCID() |
| | | if not npcID: |
| | | return |
| | | petNPCIDList = ipyData.GetPetNPCIDList() |
| | | if tagType == ChConfig.TurnBattle_TagType_Player: |
| | | factionInfoB = GetPlayerFactionInfoByCache(tagID) |
| | | elif tagType == ChConfig.TurnBattle_TagType_NPC: |
| | | npcID = tagID |
| | | npcDataEx = NPCCommon.GetNPCDataEx(npcID) |
| | | petNPCIDList = npcDataEx.GetPetNPCIDList() |
| | | petCacheInfo = [] # 从配表中读取组合,技能默认取NPC表配置的 |
| | | for state, petNPCID in enumerate(petNPCIDList, 1): |
| | | petCacheInfo.append({"npcID":petNPCID, "state":state, "quality":0}) |
| | | skillIDExList = [] # NPC为附加技能,因为NPC表本身可能有配置技能 |
| | | skillIDExList.extend(ipyData.GetElfSkillIDList()) |
| | | skillIDExList.extend(ipyData.GetSTSkillIDList()) |
| | | skillIDExList.extend(npcDataEx.GetElfSkillIDList()) |
| | | skillIDExList.extend(npcDataEx.GetSTSkillIDList()) |
| | | factionInfoB = {"npcID":npcID, "pet":petCacheInfo, "skillIDExList":skillIDExList} |
| | | else: |
| | | return |
| | | |
| | | fightRet = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer) |
| | | fightRet = ProcessAutoTurnFight(mapID, funcLineID, tagType, tagID, factionInfoA, factionInfoB, tick, curPlayer) |
| | | if not fightRet: |
| | | return |
| | | isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = fightRet |
| | | |
| | | # 结算奖励, awardWay-发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑) |
| | | needSendGameServer, awardItemList, awardWay = False, [], 1 |
| | | overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet) |
| | | needSendGameServer, awardItemList = False, [] |
| | | overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet) |
| | | if overRet != None: |
| | | needSendGameServer, awardItemList, awardWay = overRet |
| | | |
| | | isFirstPass = None |
| | | if isWin and ipyData: |
| | | passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID) |
| | | if funcLineID == passLineID + 1: |
| | | isFirstPass = True |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID) |
| | | FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID) |
| | | else: |
| | | isFirstPass = False |
| | | |
| | | if awardWay == 1 and not awardItemList: |
| | | # 山寨测试先默认都是首次奖励,正式后需删除 |
| | | awardItemList = ipyData.GetAwardItemListFirst() if isFirstPass else ipyData.GetAwardItemList() |
| | | |
| | | if awardItemList == None: |
| | | awardItemList = [] |
| | | |
| | | GameWorld.DebugLog("奖励物品: %s, isFirstPass=%s" % (awardItemList, isFirstPass)) |
| | | if awardWay == 1 and awardItemList: |
| | | ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}]) |
| | | needSendGameServer, awardItemList = overRet |
| | | |
| | | if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList]) |
| | | SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList]) |
| | | |
| | | overMsg = {"isWin":isWin, "itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)} |
| | | playbackID and overMsg.update({"playbackID":playbackID}) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Award, turnNum, turnMax, overMsg) |
| | | |
| | | # 其他... |
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID]) |
| | | if isWin: |
| | | PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass) |
| | | SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg) |
| | | return |
| | | |
| | | def GetPlayerFactionInfoByCache(playerID): |
| | |
| | | skillIDList.append(skillID) |
| | | return {"playerID":playerID, "pet":PlusDict.get("Pet"), "skillIDList":skillIDList} |
| | | |
| | | def ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False): |
| | | def ProcessAutoTurnFight(mapID, funcLineID, tagType, tagID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False): |
| | | ''' 处理自动回合战斗过程,仅做战斗流程处理,不做及其他功能逻辑 |
| | | @param mapID: 可视为功能ID |
| | | @param funcLineID: 对功能ID的扩展 |
| | |
| | | for factionObjList in atkFactionList: |
| | | fightObjList.append(factionObjList[i]) |
| | | |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) |
| | | |
| | | isWin = None |
| | | for turnNum in range(1, turnMax + 1): |
| | | GameWorld.DebugLog("【----- 回合制战斗轮次: %s -----】" % turnNum) |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_Fighting, turnNum, turnMax) |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_Fighting, turnNum, turnMax) |
| | | |
| | | # 回合开始: 做一些每回合重置逻辑或者某些根据回合触发的效果等 |
| | | for gameObj in fightObjList: |
| | |
| | | GameWorld.DebugLog("A剩余血量: %s / %s" % (GameObj.GetHP(objA), GameObj.GetMaxHP(objA))) |
| | | GameWorld.DebugLog("B剩余血量: %s / %s" % (GameObj.GetHP(objB), GameObj.GetMaxHP(objB))) |
| | | |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_FightEnd, turnNum, turnMax) |
| | | SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_FightEnd, turnNum, turnMax) |
| | | |
| | | for gameObj in fightObjList: |
| | | TurnFightObjOverReset(gameObj, tick) |
| | |
| | | GameWorld.DebugLog(" 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) |
| | | return useSkillResult |
| | | |
| | | def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0, msg=""): |
| | | def SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, state, turnNum=0, turnMax=0, msg=""): |
| | | if not curPlayer: |
| | | return |
| | | clientPack = ChPyNetSendPack.tagMCTurnFightState() |
| | | clientPack.Clear() |
| | | clientPack.MapID = mapID |
| | | clientPack.FuncLineID = funcLineID |
| | | clientPack.PlayerID = tagPlayerID |
| | | clientPack.TagType = tagType |
| | | clientPack.TagID = tagID |
| | | clientPack.State = state |
| | | clientPack.TurnNum = turnNum |
| | | clientPack.TurnMax = turnMax |
| | |
| | | Def_FBMapID_Love = 31300
|
| | |
|
| | | #回合战斗自定义地图ID
|
| | | TurnFightMapIDList = (
|
| | | Def_TFMapID_MineArea, # 福地 1
|
| | | ) = range(1, 1 + 1)
|
| | | Def_TFMapID_MineArea = 1 # 福地 1
|
| | | Def_TFMapID_Adventure = 5000 # 冒险
|
| | |
|
| | | #回合战斗自定义地图需要发送GameServer的列表
|
| | | Def_TFMapID_SendToGameServer = [Def_TFMapID_MineArea]
|
| | |
| | | 'Love':[Def_FBMapID_Love],#情缘副本
|
| | | 'CrossBattlefield':[Def_FBMapID_CrossBattlefield], #跨服战场
|
| | | 'MineArea':[Def_TFMapID_MineArea], #福地
|
| | | 'Adventure':[Def_TFMapID_Adventure], #冒险
|
| | | }
|
| | |
|
| | | #特殊副本ID, 由系统分配, 进入时候不验证IsMapCopyFull
|
| | |
| | |
|
| | | Def_PerTurnTick = 1000 # 每回合等同于常规tick时长
|
| | |
|
| | | # 回合战斗目标类型
|
| | | TurnBattle_TagType_NPC = 0
|
| | | TurnBattle_TagType_Player = 1
|
| | | TurnBattle_TagType_Team = 2
|
| | |
|
| | | #---Obj字典-------
|
| | | Def_Obj_Dict_Faction = 'Faction' # 所属阵营
|
| | | Def_Obj_Dict_TurnFightID = 'TurnFightID' # 回合制战斗所属玩家ID
|
| | |
| | | Head = tagHead()
|
| | | MapID = 0 #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | FuncLineID = 0 #(WORD FuncLineID)
|
| | | PlayerID = 0 #(DWORD PlayerID)// 战斗目标玩家ID,可为0,某些功能可能有用,如竞技场
|
| | | TagType = 0 #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
|
| | | TagID = 0 #(DWORD TagID)// 战斗目标类型对应的ID
|
| | | ValueCount = 0 #(BYTE ValueCount)
|
| | | ValueList = list() #(vector<DWORD> ValueList)// 附加值列表,可选,具体含义由MapID决定
|
| | | data = None
|
| | |
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.ValueCount,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | for i in range(self.ValueCount):
|
| | | value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
|
| | |
| | | self.Head.SubCmd = 0x10
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.PlayerID = 0
|
| | | self.TagType = 0
|
| | | self.TagID = 0
|
| | | self.ValueCount = 0
|
| | | self.ValueList = list()
|
| | | return
|
| | |
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 4 * self.ValueCount
|
| | |
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.MapID)
|
| | | data = CommFunc.WriteWORD(data, self.FuncLineID)
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteBYTE(data, self.TagType)
|
| | | data = CommFunc.WriteDWORD(data, self.TagID)
|
| | | data = CommFunc.WriteBYTE(data, self.ValueCount)
|
| | | for i in range(self.ValueCount):
|
| | | data = CommFunc.WriteDWORD(data, self.ValueList[i])
|
| | |
| | | Head:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | PlayerID:%d,
|
| | | TagType:%d,
|
| | | TagID:%d,
|
| | | ValueCount:%d,
|
| | | ValueList:%s
|
| | | '''\
|
| | |
| | | self.Head.OutputString(),
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.PlayerID,
|
| | | self.TagType,
|
| | | self.TagID,
|
| | | self.ValueCount,
|
| | | "..."
|
| | | )
|
| | |
| | | Head = tagHead()
|
| | | MapID = 0 #(DWORD MapID)// 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等)
|
| | | FuncLineID = 0 #(WORD FuncLineID)
|
| | | PlayerID = 0 #(DWORD PlayerID)// 对应玩家ID,可为0,某些功能可能有用,如竞技场
|
| | | TagType = 0 #(BYTE TagType)// 战斗目标类型,0-NPC,1-玩家,2-队伍
|
| | | TagID = 0 #(DWORD TagID)// 战斗目标类型对应的ID
|
| | | State = 0 #(BYTE State)// 0-起始状态标记;1-准备完毕;2-战斗中;3-战斗结束;4-结算奖励;5-结束状态标记
|
| | | TurnNum = 0 #(BYTE TurnNum)// 当前轮次
|
| | | TurnMax = 0 #(BYTE TurnMax)// 最大轮次
|
| | |
| | | _pos = self.Head.ReadData(_lpData, _pos)
|
| | | self.MapID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.FuncLineID,_pos = CommFunc.ReadWORD(_lpData, _pos)
|
| | | self.PlayerID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.TagType,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TagID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.State,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TurnNum,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | | self.TurnMax,_pos = CommFunc.ReadBYTE(_lpData, _pos)
|
| | |
| | | self.Head.SubCmd = 0x20
|
| | | self.MapID = 0
|
| | | self.FuncLineID = 0
|
| | | self.PlayerID = 0
|
| | | self.TagType = 0
|
| | | self.TagID = 0
|
| | | self.State = 0
|
| | | self.TurnNum = 0
|
| | | self.TurnMax = 0
|
| | |
| | | length += self.Head.GetLength()
|
| | | length += 4
|
| | | length += 2
|
| | | length += 1
|
| | | length += 4
|
| | | length += 1
|
| | | length += 1
|
| | |
| | | data = CommFunc.WriteString(data, self.Head.GetLength(), self.Head.GetBuffer())
|
| | | data = CommFunc.WriteDWORD(data, self.MapID)
|
| | | data = CommFunc.WriteWORD(data, self.FuncLineID)
|
| | | data = CommFunc.WriteDWORD(data, self.PlayerID)
|
| | | data = CommFunc.WriteBYTE(data, self.TagType)
|
| | | data = CommFunc.WriteDWORD(data, self.TagID)
|
| | | data = CommFunc.WriteBYTE(data, self.State)
|
| | | data = CommFunc.WriteBYTE(data, self.TurnNum)
|
| | | data = CommFunc.WriteBYTE(data, self.TurnMax)
|
| | |
| | | Head:%s,
|
| | | MapID:%d,
|
| | | FuncLineID:%d,
|
| | | PlayerID:%d,
|
| | | TagType:%d,
|
| | | TagID:%d,
|
| | | State:%d,
|
| | | TurnNum:%d,
|
| | | TurnMax:%d,
|
| | |
| | | self.Head.OutputString(),
|
| | | self.MapID,
|
| | | self.FuncLineID,
|
| | | self.PlayerID,
|
| | | self.TagType,
|
| | | self.TagID,
|
| | | self.State,
|
| | | self.TurnNum,
|
| | | self.TurnMax,
|
| | |
| | | return False
|
| | | return callFunc(curPlayer)
|
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求 - 地图验证
|
| | | # @return: 是否允许
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
| | | # 默认不限制
|
| | | return True
|
| | |
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagPlayerID, valueList)
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagType, tagID, valueList)
|
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet):
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
|
| | | # @return: None - 无结算逻辑,可走TurnAttack模块通用逻辑
|
| | | # @return: 是否需要同步GameServer, 奖励列表
|
| | |
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
|
| | |
| | | if callFunc == None:
|
| | | return
|
| | |
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet)
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet)
|
| | |
|
| | | def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret):
|
| | | def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret):
|
| | | ## 回合战斗结束 - GameServer处理完毕返回
|
| | |
|
| | | do_FBLogic_ID = __GetFBLogic_MapID(mapID)
|
| | |
| | | if callFunc == None:
|
| | | return
|
| | |
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret)
|
| | | return callFunc(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret)
|
| | |
|
| | | |
| | |
| | | import ItemControler
|
| | | import PlayerSuccess
|
| | | import GameFuncComm
|
| | | import PlayerTask
|
| | | import PyGameData
|
| | | import PlayerVip
|
| | | import GameObj
|
| | |
| | | NotifyFBCntRegainInfo(curPlayer, [mapID])
|
| | | return
|
| | |
|
| | | def OnFBOver(curPlayer, mapID, funcLineID, isWin, awardItemList):
|
| | | ## 副本结束通用逻辑
|
| | | |
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID])
|
| | | if not isWin:
|
| | | return
|
| | | |
| | | PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass)
|
| | | |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID)
|
| | | Sync_FBPlayerFBInfoData(curPlayer, mapID)
|
| | | |
| | | GameWorld.DebugLog("奖励物品: %s" % awardItemList)
|
| | | if awardItemList:
|
| | | ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FBPass_%s" % mapID, False, {"mapID":mapID, "funcLineID":funcLineID}])
|
| | | return
|
| | |
|
| | | def RegainFBCntProcess(curPlayer):
|
| | | ## 按时间恢复副本次数
|
| | |
|
New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package GameWorldLogic.FBProcess.GameLogic_Adventure
|
| | | #
|
| | | # @todo:冒险关卡
|
| | | # @author hxp
|
| | | # @date 2024-05-10
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 冒险关卡
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2024-05-10 17:00"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import IpyGameDataPY
|
| | | import GameWorld
|
| | | import FBCommon
|
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求 - 地图验证
|
| | | |
| | | # 只能一关关挑战
|
| | | passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
|
| | | if funcLineID != passLineID + 1:
|
| | | GameWorld.ErrLog("冒险关卡只能挑战下一关! funcLineID=%s,passLineID=%s,nextLineID=%s" |
| | | % (funcLineID, passLineID, passLineID + 1), curPlayer.GetPlayerID())
|
| | | return
|
| | | |
| | | ipyData = IpyGameDataPY.GetIpyGameData("Adventure", funcLineID)
|
| | | if not ipyData:
|
| | | return
|
| | | |
| | | bossID = ipyData.GetNPCID()
|
| | | if tagID != bossID or tagType != ChConfig.TurnBattle_TagType_NPC:
|
| | | GameWorld.ErrLog("冒险关卡目标bossID错误,无法挑战! funcLineID=%s,bossID=%s,tagType=%s,tagID=%s" |
| | | % (funcLineID, bossID, tagType, tagID), curPlayer.GetPlayerID())
|
| | | return
|
| | | |
| | | return True
|
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表
|
| | | needSendGameServer = False
|
| | | awardItemList = []
|
| | | isWin = fightRet[0]
|
| | | |
| | | GameWorld.DebugLog("冒险关卡结算: funcLineID=%s,isWin=%s" % (funcLineID, isWin))
|
| | | |
| | | ipyData = IpyGameDataPY.GetIpyGameData("Adventure", funcLineID)
|
| | | if not ipyData:
|
| | | return needSendGameServer, awardItemList
|
| | | |
| | | if isWin:
|
| | | awardItemList = ipyData.GetAwardItemList()
|
| | | |
| | | FBCommon.OnFBOver(curPlayer, mapID, funcLineID, isWin, awardItemList)
|
| | | return needSendGameServer, awardItemList
|
| | |
| | | import PlayerControl
|
| | | import GameWorld
|
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList):
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求 - 地图验证
|
| | | |
| | | if tagType != ChConfig.TurnBattle_TagType_Player:
|
| | | GameWorld.DebugLog("请求回合战斗目标异常! mapID=%s,tagType=%s,tagID=%s" % (mapID, tagType, tagID), curPlayer.GetPlayerID())
|
| | | return
|
| | |
|
| | | # 摇人帮助
|
| | | if funcLineID == 0:
|
| | | if not tagPlayerID:
|
| | | if not tagID:
|
| | | return
|
| | | awardCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MineHelpAwardCount)
|
| | | awardCountMax = IpyGameDataPY.GetFuncCfg("MineAreaHelp", 1)
|
| | |
| | |
|
| | | return True
|
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet):
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
|
| | | # @return: 是否需要同步GameServer, 奖励列表
|
| | | needSendGameServer = True
|
| | | awardItemList = []
|
| | |
|
| | | # 摇人帮助
|
| | | if funcLineID == 0:
|
| | | # 无论胜负都要同步GameServer汇报结果
|
| | | isWin = fightRet[0]
|
| | | if not isWin:
|
| | | return True, [], 0
|
| | | return needSendGameServer, awardItemList
|
| | |
|
| | | awardItemList = IpyGameDataPY.GetFuncEvalCfg("MineAreaHelp", 2)
|
| | | return True, awardItemList, 2
|
| | | return needSendGameServer, awardItemList
|
| | |
|
| | | # 自己驱赶
|
| | | elif funcLineID == 1:
|
| | | return True, [], 0
|
| | | return needSendGameServer, awardItemList
|
| | |
|
| | | return
|
| | |
|
| | | def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret):
|
| | | def OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret):
|
| | | ## 回合战斗结束 - GameServer处理完毕返回
|
| | |
|
| | | # 摇人帮助
|
| | |
| | | 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])
|
| | | #更新关卡
|
| | |
| | | import math
|
| | |
|
| | | 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_TrialTower)
|
| | |
|
| | | def GetTowerIpyData(level):
|
| | | return IpyGameDataPY.GetIpyGameData('RuneTower', level)
|
| | |
| | | GameWorld.DebugLog(' 更新符印塔已通关数 %s' % passlv)
|
| | | return
|
| | |
|
| | | ## 是否可进入
|
| | | # @param curPlayer
|
| | | # @param mapID 地图ID
|
| | | # @param lineId 分线ID
|
| | | # @param tick
|
| | | # @return 是否可进入
|
| | | def OnEnterFBEvent(curPlayer, mapID, lineId, tick): |
| | | return True
|
| | |
|
| | |
|
| | | ## 检查可否进行挑战
|
| | | def __CheckCanChallenge(curPlayer, fbLevel):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | ipyData = GetTowerIpyData(fbLevel)
|
| | | |
| | | if not ipyData:
|
| | | GameWorld.ErrLog("符印塔关卡(%s)不存在" % (fbLevel), playerID)
|
| | | return False
|
| | | |
| | | # 是否已过关
|
| | | if fbLevel <= __GetTrialLevelCurPassLV(curPlayer):
|
| | | GameWorld.DebugLog("符印塔本关(%s)已过关, 无法挑战!" % fbLevel, 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):
|
| | | # 不做处理,有副本行为客户端发包选择挑战关卡
|
| | | EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_TrialTower, 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 __GetTrialBossID(fbLevel= -1):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | |
| | | return 0
|
| | | return ipyData.GetNPCID()
|
| | |
|
| | | ##战斗准备时间
|
| | | # @param tick 时钟
|
| | | # @return 无意义
|
| | | def __DoLogic_FightPrepare(tick):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | |
| | | trialCfg = __GetTrialCfg()
|
| | | if tick - gameFB.GetFBStepTick() < trialCfg[Def_PrepareTime] * 1000:
|
| | | return
|
| | | |
| | | bossID = __GetTrialBossID()
|
| | | 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_TrialTower, 0), [bossID])
|
| | | |
| | | #转入战斗
|
| | | FBCommon.SetFBStep(FB_State_Fighting, tick)
|
| | | return
|
| | |
|
| | | ## 开始副本关卡
|
| | | def StartFBLevel(curPlayer, fbLevel, tick):
|
| | | |
| | | if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie:
|
| | | GameWorld.DebugLog("复活玩家...", curPlayer.GetPlayerID())
|
| | | ChPlayer.PlayerRebornByType(curPlayer, ChConfig.rebornType_City, tick)
|
| | | GameObj.SetHPFull(curPlayer)
|
| | | FBCommon.ClearFBNPC()
|
| | | |
| | | gameFB = GameWorld.GetGameFB()
|
| | | gameFB.SetGameFBDict(FBDict_Level, fbLevel)
|
| | | |
| | | prepareTick = __GetTrialCfg()[Def_PrepareTime] * 1000
|
| | | FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttAddUpTime, prepareTick)
|
| | | FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttWaitStart, prepareTick)
|
| | | FBCommon.SetFBStep(FB_State_FightPrepare, tick)
|
| | | helpDict = {FBCommon.Help_wheel:fbLevel}
|
| | | FBCommon.Notify_FBHelp(curPlayer, helpDict)
|
| | | GameWorld.DebugLog("StartFBLevel, fbLevel=%s, helpDict=%s" |
| | | % (fbLevel, str(helpDict)), curPlayer.GetPlayerID())
|
| | | return
|
| | |
|
| | |
|
| | | ##战斗时间
|
| | | # @param tick 时钟
|
| | | # @return 无意义
|
| | | def __DoLogic_Fighting(tick):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | |
| | | #判断时间结束
|
| | | if tick - gameFB.GetFBStepTick() < __GetTrialCfg()[Def_FightTime] * 1000:
|
| | | return
|
| | | |
| | | fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
|
| | | playerManager = GameWorld.GetMapCopyPlayerManager()
|
| | | for index in xrange(playerManager.GetPlayerCount()):
|
| | | curPlayer = playerManager.GetPlayerByIndex(index)
|
| | | if not curPlayer:
|
| | | continue
|
| | | __SendTrialTowerOverInfo(curPlayer, fbLevel, 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
|
| | |
| | | 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()
|
| | | fbLevel = gameFB.GetGameFBDictByKey(FBDict_Level)
|
| | | __SendTrialTowerOverInfo(curPlayer, fbLevel, 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
|
| | | |
| | | fbLevel = actionInfo
|
| | | if not __CheckCanChallenge(curPlayer, fbLevel):
|
| | | FBCommon.DoLogic_FBKickAllPlayer()
|
| | | return
|
| | | |
| | | StartFBLevel(curPlayer, fbLevel, tick)
|
| | | return
|
| | |
|
| | |
|
| | | def GetRuneTypeByTowerLV(towerLV):
|
| | | #获取关卡可掉落符印类型
|
| | | towerRuneTypeDict = IpyGameDataPY.GetFuncEvalCfg('TowerRuneType')
|
| | |
| | | #BOSS复活活动
|
| | | PlayerBossReborn.AddBossRebornActionCnt(curPlayer, ChConfig.Def_BRAct_TowerSweep, 1)
|
| | | PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_TowerSweep, 1)
|
| | | return True |
| | | return True
|
| | |
|
| | |
|
| | | def OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList):
|
| | | ## 回合战斗请求 - 地图验证
|
| | | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | ipyData = GetTowerIpyData(funcLineID)
|
| | | |
| | | if not ipyData:
|
| | | GameWorld.ErrLog("符印塔关卡不存在: funcLineID=%s" % (funcLineID), playerID)
|
| | | return False
|
| | | |
| | | # 是否已过关
|
| | | if funcLineID <= __GetTrialLevelCurPassLV(curPlayer):
|
| | | GameWorld.DebugLog("符印塔本关已过关, 无法挑战! funcLineID=%s" % funcLineID, playerID)
|
| | | return False
|
| | | |
| | | return True
|
| | |
|
| | | def OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet):
|
| | | ## 回合战斗结束
|
| | | # @return: 是否需要同步GameServer, 奖励列表, 发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑)
|
| | | |
| | | needSendGameServer = False
|
| | | awardItemList = []
|
| | | awardWay = 2
|
| | | |
| | | isWin = fightRet[0]
|
| | | if not isWin:
|
| | | return needSendGameServer, awardItemList, awardWay
|
| | | |
| | | return needSendGameServer, awardItemList, awardWay
|
| | |
|
| | | |
| | | return
|
| | |
|
| | |
| | | ("DWORD", "AtkBackDefRate", 0),
|
| | | ("DWORD", "SuckHPPer", 0),
|
| | | ("DWORD", "SuckHPDefPer", 0),
|
| | | ("dict", "SpecAttrInfo", 0),
|
| | | ("list", "PetNPCIDList", 0),
|
| | | ("list", "ElfSkillIDList", 0),
|
| | | ("list", "STSkillIDList", 0),
|
| | | ),
|
| | |
|
| | | "NPCRealmStrengthen":(
|
| | |
| | | ("dict", "SweepGoodDrop", 0),
|
| | | ),
|
| | |
|
| | | "Adventure":(
|
| | | ("WORD", "LineID", 1),
|
| | | ("DWORD", "NPCID", 0),
|
| | | ("list", "AwardItemList", 0),
|
| | | ),
|
| | |
|
| | | "ChinMap":(
|
| | | ("DWORD", "MapID", 1),
|
| | | ("BYTE", "CanRide", 0),
|
| | |
| | | ("eval", "RefreshNPC", 0),
|
| | | ("eval", "GradeInfo", 0),
|
| | | ("eval", "RewardInfo", 0),
|
| | | ),
|
| | |
|
| | | "FBTurn":(
|
| | | ("DWORD", "DataMapID", 1),
|
| | | ("WORD", "LineID", 1),
|
| | | ("DWORD", "NPCID", 0),
|
| | | ("list", "PetNPCIDList", 0),
|
| | | ("list", "ElfSkillIDList", 0),
|
| | | ("list", "STSkillIDList", 0),
|
| | | ("list", "AwardItemListFirst", 0),
|
| | | ("list", "AwardItemList", 0),
|
| | | ),
|
| | |
|
| | | "FBHelpBattle":(
|
| | |
| | | def GetAtkBackRate(self): return self.attrTuple[16] # 反击概率 DWORD
|
| | | def GetAtkBackDefRate(self): return self.attrTuple[17] # 抗反击概率 DWORD
|
| | | def GetSuckHPPer(self): return self.attrTuple[18] # 吸血比率 DWORD
|
| | | def GetSuckHPDefPer(self): return self.attrTuple[19] # 抗吸血比率 DWORD |
| | | def GetSuckHPDefPer(self): return self.attrTuple[19] # 抗吸血比率 DWORD
|
| | | def GetSpecAttrInfo(self): return self.attrTuple[20] # 特殊属性信息 {"属性ID":值, ...} dict
|
| | | def GetPetNPCIDList(self): return self.attrTuple[21] # 回合战斗灵宠NPCID列表 list
|
| | | def GetElfSkillIDList(self): return self.attrTuple[22] # 回合战斗精怪技能ID列表 list
|
| | | def GetSTSkillIDList(self): return self.attrTuple[23] # 回合战斗神通技能ID列表 list |
| | | |
| | | # 成长型境界怪物表 |
| | | class IPY_NPCRealmStrengthen(): |
| | |
| | | def GetSweepYsog(self): return self.attrTuple[8] # 扫荡魔精 DWORD
|
| | | def GetSweepGoodDrop(self): return self.attrTuple[9] # 扫荡珍稀符印 dict |
| | | |
| | | # 冒险关卡表 |
| | | class IPY_Adventure(): |
| | | |
| | | def __init__(self): |
| | | self.attrTuple = None |
| | | return |
| | | |
| | | def GetLineID(self): return self.attrTuple[0] # 功能线路ID WORD
|
| | | def GetNPCID(self): return self.attrTuple[1] # NPCID DWORD
|
| | | def GetAwardItemList(self): return self.attrTuple[2] # 过关奖励列表[[物品ID,个数,是否拍品], ...] list |
| | | |
| | | # 地图表格 |
| | | class IPY_ChinMap(): |
| | | |
| | |
| | | def GetRefreshNPC(self): return self.attrTuple[13] # 标试点刷怪配置 eval
|
| | | def GetGradeInfo(self): return self.attrTuple[14] # 评级规则 eval
|
| | | def GetRewardInfo(self): return self.attrTuple[15] # 奖励信息 eval |
| | | |
| | | # 副本回合制表 |
| | | class IPY_FBTurn(): |
| | | |
| | | def __init__(self): |
| | | self.attrTuple = None |
| | | return |
| | | |
| | | def GetDataMapID(self): return self.attrTuple[0] # 数据地图ID DWORD
|
| | | def GetLineID(self): return self.attrTuple[1] # 功能线路ID WORD
|
| | | def GetNPCID(self): return self.attrTuple[2] # NPCID DWORD
|
| | | def GetPetNPCIDList(self): return self.attrTuple[3] # 灵宠NPCID列表 list
|
| | | def GetElfSkillIDList(self): return self.attrTuple[4] # 精怪技能ID列表 list
|
| | | def GetSTSkillIDList(self): return self.attrTuple[5] # 神通技能ID列表 list
|
| | | def GetAwardItemListFirst(self): return self.attrTuple[6] # 首次过关奖励列表[[物品ID,个数,是否拍品], ...] list
|
| | | def GetAwardItemList(self): return self.attrTuple[7] # 再次过关奖励列表[[物品ID,个数,是否拍品], ...] list |
| | | |
| | | # 副本助战表 |
| | | class IPY_FBHelpBattle(): |
| | |
| | | self.__LoadFileData("FightPowerParam", onlyCheck)
|
| | | self.__LoadFileData("NPCDropItem", onlyCheck)
|
| | | self.__LoadFileData("RuneTower", onlyCheck)
|
| | | self.__LoadFileData("Adventure", onlyCheck)
|
| | | self.__LoadFileData("ChinMap", onlyCheck)
|
| | | self.__LoadFileData("FBFunc", onlyCheck)
|
| | | self.__LoadFileData("FBLine", onlyCheck)
|
| | | self.__LoadFileData("FBTurn", onlyCheck)
|
| | | self.__LoadFileData("FBHelpBattle", onlyCheck)
|
| | | self.__LoadFileData("NPCCustomRefresh", onlyCheck)
|
| | | self.__LoadFileData("DailyAction", onlyCheck)
|
| | |
| | | self.CheckLoadData("RuneTower") |
| | | return self.ipyRuneTowerCache[index]
|
| | | |
| | | def GetAdventureCount(self): |
| | | self.CheckLoadData("Adventure") |
| | | return self.ipyAdventureLen
|
| | | def GetAdventureByIndex(self, index): |
| | | self.CheckLoadData("Adventure") |
| | | return self.ipyAdventureCache[index]
|
| | | |
| | | def GetChinMapCount(self): |
| | | self.CheckLoadData("ChinMap") |
| | | return self.ipyChinMapLen
|
| | |
| | | def GetFBLineByIndex(self, index): |
| | | self.CheckLoadData("FBLine") |
| | | return self.ipyFBLineCache[index]
|
| | | |
| | | def GetFBTurnCount(self): |
| | | self.CheckLoadData("FBTurn") |
| | | return self.ipyFBTurnLen
|
| | | def GetFBTurnByIndex(self, index): |
| | | self.CheckLoadData("FBTurn") |
| | | return self.ipyFBTurnCache[index]
|
| | | |
| | | def GetFBHelpBattleCount(self): |
| | | self.CheckLoadData("FBHelpBattle") |