10033 【后端】砍树(回合战斗副本支持任务类型4副本过关、类型12挑战副本;回合副本可重复挑战奖励及首通奖励支持;修复回合战斗NPC不存在时报错bug;)
| | |
| | | RecoverCnt = 0 #(WORD RecoverCnt)//找回次数
|
| | | ItemAddCnt = 0 #(WORD ItemAddCnt)//物品增加次数
|
| | | PassGradeCnt = 0 #(BYTE PassGradeCnt)//星级值对应个数, 每个key存9个lineID
|
| | | PassGrade = list() #(vector<DWORD> PassGrade)//副本线路对应星级值列表
|
| | | PassGrade = list() #(vector<DWORD> PassGrade)//副本线路对应星级值列表,一般仅线路有星级设定的才有
|
| | | EnterCntTotal = 0 #(DWORD EnterCntTotal)//累计进入次数
|
| | | PassLineID = 0 #(DWORD PassLineID)//已过关到的lineID
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | |
| | | value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
|
| | | self.PassGrade.append(value)
|
| | | self.EnterCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.PassLineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | |
| | | self.PassGradeCnt = 0
|
| | | self.PassGrade = list()
|
| | | self.EnterCntTotal = 0
|
| | | self.PassLineID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | length += 2
|
| | | length += 1
|
| | | length += 4 * self.PassGradeCnt
|
| | | length += 4
|
| | | length += 4
|
| | |
|
| | | return length
|
| | |
| | | for i in range(self.PassGradeCnt):
|
| | | data = CommFunc.WriteDWORD(data, self.PassGrade[i])
|
| | | data = CommFunc.WriteDWORD(data, self.EnterCntTotal)
|
| | | data = CommFunc.WriteDWORD(data, self.PassLineID)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | |
| | | ItemAddCnt:%d,
|
| | | PassGradeCnt:%d,
|
| | | PassGrade:%s,
|
| | | EnterCntTotal:%d
|
| | | EnterCntTotal:%d,
|
| | | PassLineID:%d
|
| | | '''\
|
| | | %(
|
| | | self.FBID,
|
| | |
| | | self.ItemAddCnt,
|
| | | self.PassGradeCnt,
|
| | | "...",
|
| | | self.EnterCntTotal
|
| | | self.EnterCntTotal,
|
| | | self.PassLineID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | | import ItemControler |
| | | import PassiveBuffEffMng |
| | | import FBLogic |
| | | import ShareDefine |
| | | import PlayerTask |
| | | |
| | | # 回合战斗流程状态 |
| | | ( |
| | |
| | | if tagPlayerID: |
| | | if playerID == tagPlayerID: |
| | | GameWorld.DebugLog("不能打自己!", playerID) |
| | | return |
| | | |
| | | fbIpyData = FBCommon.GetFBIpyData(mapID) |
| | | fbLineIpyData = FBCommon.GetFBLineIpyData(mapID, funcLineID) |
| | | if fbIpyData or fbLineIpyData: |
| | | if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, funcLineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK: |
| | | return |
| | | |
| | | if not FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList): |
| | |
| | | if overRet != None: |
| | | needSendGameServer, awardItemList, awardWay = overRet |
| | | |
| | | if isWin and ipyData: |
| | | 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() |
| | | awardItemList = ipyData.GetAwardItemListFirst() if isFirstPass else ipyData.GetAwardItemList() |
| | | |
| | | if awardItemList == None: |
| | | awardItemList = [] |
| | | |
| | | GameWorld.DebugLog("奖励物品: %s" % awardItemList) |
| | | GameWorld.DebugLog("奖励物品: %s, isFirstPass=%s" % (awardItemList, isFirstPass)) |
| | | if awardWay == 1 and awardItemList: |
| | | ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}]) |
| | | |
| | |
| | | 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) |
| | | return |
| | | |
| | | def GetPlayerFactionInfoByCache(playerID): |
| | |
| | | factionA, factionB, mainRolePlace = 1, 2, 1 |
| | | objRetA = __SummonFactionObjs(factionA, mainRolePlace, factionInfoA, sightLevel, posX, posY) |
| | | objRetB = __SummonFactionObjs(factionB, mainRolePlace, factionInfoB, sightLevel, posX, posY) |
| | | objA, petObjListA, factionSyncInfoA = objRetA if objRetA else (None, []) |
| | | objB, petObjListB, factionSyncInfoB = objRetB if objRetB else (None, []) |
| | | objA, petObjListA, factionSyncInfoA = objRetA if objRetA else (None, [], {}) |
| | | objB, petObjListB, factionSyncInfoB = objRetB if objRetB else (None, [], {}) |
| | | if not objA or not objB: |
| | | fightObjList = petObjListA + [objA] + petObjListB + [objB] |
| | | for gameObj in fightObjList: |
| | | TurnFightObjOverReset(gameObj, tick) |
| | | return |
| | | playerIDA = objA.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # 可能为0,非玩家镜像时为0 |
| | | playerIDB = objB.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # 可能为0,非玩家镜像时为0 |
| | |
| | | Def_Player_Dict_ReqFBMissionType = "ReqFBMissionType" # 请求进入副本的任务类型
|
| | | Def_Player_Dict_PlayerFBStar_MapId = "FBStar_%s_%s" # 副本星级星级信息, 参数为[mapID, key编号], 按位存储每个lineID对应的星级
|
| | | Def_Player_Dict_CustomMapStep = "CustomMapStep_%s_%s" # 前端自定义场景阶段, 参数(mapID, lineID),对应 CustomMapStep_Fight ...
|
| | | Def_Player_Dict_FBPassLineID = "FBPassLineID_%s" # 副本已过关到的lineID, 参数为副本ID
|
| | | Def_Player_Dict_EnterFbCntTotal = "EnterFbCntTotal_%s" # 进入副本总累计次数, 参数为副本ID
|
| | | Def_Player_Dict_EnterFbCntDay = "EnterFbCntDay_%s" # 今日进入副本次数, 参数为副本ID
|
| | | Def_Player_Dict_BuyFbCntDay = "BuyFbCntDay_%s" # 今日购买副本进入次数, 参数为副本ID
|
| | |
| | | RecoverCnt = 0 #(WORD RecoverCnt)//找回次数
|
| | | ItemAddCnt = 0 #(WORD ItemAddCnt)//物品增加次数
|
| | | PassGradeCnt = 0 #(BYTE PassGradeCnt)//星级值对应个数, 每个key存9个lineID
|
| | | PassGrade = list() #(vector<DWORD> PassGrade)//副本线路对应星级值列表
|
| | | PassGrade = list() #(vector<DWORD> PassGrade)//副本线路对应星级值列表,一般仅线路有星级设定的才有
|
| | | EnterCntTotal = 0 #(DWORD EnterCntTotal)//累计进入次数
|
| | | PassLineID = 0 #(DWORD PassLineID)//已过关到的lineID
|
| | | data = None
|
| | |
|
| | | def __init__(self):
|
| | |
| | | value,_pos=CommFunc.ReadDWORD(_lpData,_pos)
|
| | | self.PassGrade.append(value)
|
| | | self.EnterCntTotal,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | self.PassLineID,_pos = CommFunc.ReadDWORD(_lpData, _pos)
|
| | | return _pos
|
| | |
|
| | | def Clear(self):
|
| | |
| | | self.PassGradeCnt = 0
|
| | | self.PassGrade = list()
|
| | | self.EnterCntTotal = 0
|
| | | self.PassLineID = 0
|
| | | return
|
| | |
|
| | | def GetLength(self):
|
| | |
| | | length += 2
|
| | | length += 1
|
| | | length += 4 * self.PassGradeCnt
|
| | | length += 4
|
| | | length += 4
|
| | |
|
| | | return length
|
| | |
| | | for i in range(self.PassGradeCnt):
|
| | | data = CommFunc.WriteDWORD(data, self.PassGrade[i])
|
| | | data = CommFunc.WriteDWORD(data, self.EnterCntTotal)
|
| | | data = CommFunc.WriteDWORD(data, self.PassLineID)
|
| | | return data
|
| | |
|
| | | def OutputString(self):
|
| | |
| | | ItemAddCnt:%d,
|
| | | PassGradeCnt:%d,
|
| | | PassGrade:%s,
|
| | | EnterCntTotal:%d
|
| | | EnterCntTotal:%d,
|
| | | PassLineID:%d
|
| | | '''\
|
| | | %(
|
| | | self.FBID,
|
| | |
| | | self.ItemAddCnt,
|
| | | self.PassGradeCnt,
|
| | | "...",
|
| | | self.EnterCntTotal
|
| | | self.EnterCntTotal,
|
| | | self.PassLineID
|
| | | )
|
| | | return DumpString
|
| | |
|
| | |
| | |
|
| | | if len(paramList) == 0:
|
| | | GameWorld.DebugAnswer(curPlayer, "重置主线: Task 0")
|
| | | GameWorld.DebugAnswer(curPlayer, "输出任务: Task 1")
|
| | | GameWorld.DebugAnswer(curPlayer, "设置任务: Task 任务ID 进度")
|
| | | __ShowTask(curPlayer)
|
| | | return
|
| | |
|
| | | taskID = paramList[0]
|
| | |
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskValue % taskGroup, 0)
|
| | | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TaskState % taskGroup, 0)
|
| | | PlayerTask.__giveNewTask(curPlayer, taskGroup)
|
| | | return
|
| | | |
| | | if len(paramList) == 1 and paramList[0] == 1:
|
| | | __ShowTask(curPlayer)
|
| | | return
|
| | |
|
| | | taskValue = paramList[1] if len(paramList) > 1 else 0
|
| | |
| | | if not fbLineIpyData and isDefaultLine:
|
| | | #GameWorld.DebugLog("没有指定功能线路的则默认取0,再没有的话就是不需要的mapID=%s, lineID=%s" % (mapID, lineID))
|
| | | fbLineIpyData = IpyGameDataPY.GetIpyGameDataNotLog("FBLine", mapID, 0)
|
| | | if not fbLineIpyData:
|
| | | fbLineIpyData = IpyGameDataPY.GetIpyGameDataNotLog("FBLine", mapID, 1) # 有些从1开始,如爬塔类
|
| | | return fbLineIpyData
|
| | |
|
| | | def GetFBLineEnterPosInfo(mapID, lineID, fbLineIpyData=None):
|
| | |
| | | mapInfo.EnterCntTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntTotal % mID)
|
| | | mapInfo.RecoverCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_RecoverFbCnt % mID)
|
| | | mapInfo.ItemAddCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ItemAddFbCnt % mID)
|
| | | mapInfo.PassLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mID)
|
| | |
|
| | | for keyNum in range(ChConfig.Def_FBStar_MaxKeyCnt):
|
| | | gradeValue = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_PlayerFBStar_MapId % (mID, keyNum))
|
| | |
| | | if len(conds) != 2:
|
| | | return 0
|
| | | mapID, lineID = conds
|
| | | grade = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
|
| | | taskValue = 1 if grade > 0 else 0
|
| | | passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID)
|
| | | taskValue = 1 if passLineID >= lineID else 0
|
| | |
|
| | | elif taskType == ChConfig.TaskType_EquipColorItem:
|
| | | if not conds:
|
| | |
| | | ## 检查任务条件是否满足
|
| | | taskType = ipyData.GetTaskType()
|
| | |
|
| | | # 副本xxx过关
|
| | | if taskType == ChConfig.TaskType_FBPass:
|
| | | taskConds = ipyData.GetTaskConds()
|
| | | if not conds or len(conds) != len(taskConds) or len(conds) < 2:
|
| | | return
|
| | | if conds[0] != taskConds[0]:
|
| | | return
|
| | | if conds[1] < taskConds[1]:
|
| | | return
|
| | | |
| | | # 副本xxx挑战
|
| | | elif taskType == ChConfig.TaskType_FBChallenge:
|
| | | if taskType == ChConfig.TaskType_FBChallenge:
|
| | | taskConds = ipyData.GetTaskConds()
|
| | | if not conds or len(conds) != len(taskConds) or len(conds) < 1:
|
| | | return
|