local UIBattleMissionPanel = UIViewClass() local SPRITE_NAME_MISSIONPOINT = "zd_zs_04" local SPRITE_NAME_MISSIONFINISH = "zd_zs_06" local LevelConditionType = LuaConst.LevelConditionType local GetLocalizedTxt = UIUtils.GetLocalizedTxt local Const_IDS = Const_IDS local string_format = string.format local BeginSoundEvent = "SFX_fight" local CompleteSoundEvent = "SFX_complete_cheer" local MinCount = 10 function UIBattleMissionPanel:OnCreated() self.canAutoFight = false self.playBeginSound = false self.playCompleteSound = false --上方的进度 self.obj_NormalProgressBar = self.obj_NormalProgressBar.gameObject self.obj_MissionProgress = self.obj_MissionProgress.gameObject self.obj_TimerProgress = self.obj_TimerProgress.gameObject self.obj_NormalProgress = self.obj_NormalProgress.gameObject self.obj_ArriveProgress = self.obj_ArriveProgress.gameObject self.obj_ArriveStartPoint = self.obj_ArriveStartPoint.gameObject self.obj_ArriveEndPoint = self.obj_ArriveEndPoint.gameObject self.obj_WaveTip = self.obj_WaveTip.gameObject self.obj_DialogueRef = self.obj_DialogueRef.gameObject --左侧任务栏 self.obj_MissionMain = self.obj_MissionMain.gameObject self.list_MissionAim = {} for i = 1, 3 do self:AddSubMission(i) end end function UIBattleMissionPanel:AddSubMission(index) local missionAim = {} missionAim.sprite_MissionPoint = self["sprite_MissionPoint" .. index] missionAim.labLocal_MissionDesc = self["UIScrollText" .. index] self.list_MissionAim[index] = missionAim end function UIBattleMissionPanel:OnOpened() self:InitMissionShow() self:RegistSystemEvent(EventID.UIBattle_Mission_StartMission, self.StartMission) self:RegistSystemEvent(EventID.UIBattle_Mission_StartMissionByItemID, self.StartMissionByItemID) self:RegistSystemEvent(EventID.UIBattle_Mission_UpdateAim, self.UpdateAim) self:RegistSystemEvent(EventID.UIBattle_Mission_CompleteAim, self.CompleteAim) --TODO: 现在在两个不同的界面使用相同的逻辑,需要统一,使用 CTL 和 MDL 控制界面的寻路逻辑 --TODO:线上求稳,单独解决此界面 local levelInfo = BattleDataGetter.GetLevelInfoData() if levelInfo then self.canAutoFight = levelInfo.AutoBattle self.isPass = (not levelInfo.AutoBattleFirstPass) and true or MDL.Level.GetLevelPassDataById(levelInfo.LevelID) end self.canAutoFight = self.canAutoFight and MDL.Unlock.IsUnlock(MDL.Unlock.FunctionType.AutoFight) self.canAutoFight = self.canAutoFight and self.isPass self._fakeAimList = {} local missionItem = BattleDataGetter.GetLevelMainMission(self._fakeAimList) if missionItem then self:StartMission(missionItem, self._fakeAimList) end end --region **************Init************** function UIBattleMissionPanel:InitMissionShow() UIUtils.SetActive(self.obj_MissionMain, false) UIUtils.SetActive(self.obj_MissionProgress, false) UIUtils.SetActive(self.obj_WaveTip, false) end --endregion Init --region **************Event************** function UIBattleMissionPanel:StartMission(missionItem, fakeMissionAimList) UIUtils.SetActive(self.obj_MissionMain, true) UIUtils.SetActive(self.obj_WaveTip, false) local aimList local aimCount if fakeMissionAimList and #fakeMissionAimList > 0 then aimList = fakeMissionAimList aimCount = #fakeMissionAimList else aimList = missionItem.AimList aimCount = missionItem:GetAimCount() end self.labLocal_MissionMain.text = string_format("%s", GetLocalizedTxt(Const_IDS[missionItem.ItemData.Title])) for i, v in ipairs(aimList) do local aimInfo = self.list_MissionAim[i] local isShow = self:RefreshMissionAimShow(aimInfo, v, v.Completed, false) if isShow then -- 有字符串才显示,无字符串不显示 UIUtils.SetActive(aimInfo.sprite_MissionPoint.gameObject, true) if v.Completed then self:SetDetailProgressByType(v, true) UTL.Item.SetAtlasSprite(aimInfo.sprite_MissionPoint, "UI_Battle", SPRITE_NAME_MISSIONFINISH) else self:SetDetailProgressByType(v, false) UTL.Item.SetAtlasSprite(aimInfo.sprite_MissionPoint, "UI_Battle", SPRITE_NAME_MISSIONPOINT) end else UIUtils.SetActive(aimInfo.sprite_MissionPoint.gameObject, false) --logging.error(LTAG.ERROR, " sprite_MissionPoint.gameObject, false ") end end for i = aimCount + 1, #self.list_MissionAim do UIUtils.SetActive(self.list_MissionAim[i].sprite_MissionPoint.gameObject, false) end self.playBeginSound = missionItem.ItemData.PlayBeginSound self.playCompleteSound = missionItem.ItemData.PlayCompleteSound end function UIBattleMissionPanel:StartMissionByItemID(target, levelItemID) if target == BattleDataGetter.GetCurEntity() then local missionLevelItem = LevelItemManager.GetItemByID(levelItemID, LuaConst.LevelItemType.Mission) if missionLevelItem then table.clearArray(self._fakeAimList) missionLevelItem:GetFakeAimList(self._fakeAimList) self:StartMission(missionLevelItem, self._fakeAimList) else logging.error(LTAG.ERROR, "HYW : missionLevelItem nil Warning @UIBattleMissionPanel:StartMissionByItemID levelItemID : ", levelItemID) end end end function UIBattleMissionPanel:UpdateAim(missionAim) if #self._fakeAimList == 0 then local aimInfo = self.list_MissionAim[missionAim.Index] self:RefreshMissionAimShow(aimInfo, missionAim, false, true) self:SetDetailProgressByType(missionAim, false) self:MissionPlayBeginSound(missionAim) end end function UIBattleMissionPanel:CompleteAim(missionAim, complete) if #self._fakeAimList == 0 then local aimInfo = self.list_MissionAim[missionAim.Index] self:RefreshMissionAimShow(aimInfo, missionAim, complete, false) UTL.Item.SetAtlasSprite(aimInfo.sprite_MissionPoint, "UI_Battle", complete and SPRITE_NAME_MISSIONFINISH or SPRITE_NAME_MISSIONPOINT) self:MissionPlayCompleteSound(missionAim) self:RefreshMissionTextScroll() end end -- 返回是否任务字符串为空 function UIBattleMissionPanel:RefreshMissionAimShow(aimInfo, missionAim, complete, isUpdateMission) local aimData = missionAim.Data local text = nil if aimData.Describe then text = string_format(GetLocalizedTxt(Const_IDS[aimData.Describe]), aimData.Param1) else local showFunc = CTL.Level.GetMissionShowFun(aimData.Type) text = showFunc(missionAim, complete) end if string.isNilOrEmpty(text) then aimInfo.labLocal_MissionDesc:SetText(nil) return false else if complete then text = UTL.Color.FormatTextByColor("00ea33",text) else text = UTL.Color.FormatWhiteColor(text) end if GameAppInfo.IsVersionGreaterThan111000() then aimInfo.labLocal_MissionDesc:SetText(text, true, not isUpdateMission) elseif GameAppInfo.IsVersionGreaterThan110000() then if not GameAppInfo.IsChinesePackage() then aimInfo.labLocal_MissionDesc:SetText(text, true, not isUpdateMission) else aimInfo.labLocal_MissionDesc:SetText(text, not isUpdateMission) end else aimInfo.labLocal_MissionDesc:SetText(text, not isUpdateMission) end return true end end function UIBattleMissionPanel:RefreshMissionTextScroll() for __, missionAim in ipairs(self.list_MissionAim) do missionAim.labLocal_MissionDesc:RefreshScrollData() end end function UIBattleMissionPanel:OnButtonClicked(comp) if comp == self.sprite_MissionBg then self:OnClickAutoFightButton() end end function UIBattleMissionPanel:OnClickAutoFightButton() if not self.isPass then CTL.Tips.AddTipsMsg(Const_IDS["IDS_Autofight_WrongHint"]) return end if self.canAutoFight then LuaInputManager.SetSpecialCommand(LuaConst.SpecialCommandType.AutoFight) if not BattleDataGetter.IsSyncLevel() then --这里是反的,因为还没有调用switchAutoFight,所以必须得是反的 CTL.Level.SetAutoFight(BattleDataGetter.GetCurLevelType(), BattleDataGetter.GetAutoFightState() and -1 or 1) end end end --endregion Event function UIBattleMissionPanel:SetDetailProgressByType(missionAim, complete) local aimData = missionAim.Data local type = aimData.Type if type == LevelConditionType.Mission_WaveReach then if complete then UIUtils.SetActive(self.obj_WaveTip, false) else UIUtils.SetActive(self.obj_WaveTip, true) local progress = missionAim.value or 0 UIUtils.SetLabel(self.labLocal_Wave, string_format("%d/%d", progress, aimData.Param1)) end end end function UIBattleMissionPanel:MissionPlayBeginSound(missionAim) if self.playBeginSound and missionAim.value and missionAim.value > 0 then local aimData = missionAim.Data if aimData.ParamID then local monsterData = DataSheetManager.MonsterData:GetDataByID(aimData.ParamID) if monsterData and monsterData.Speed > FP.Const.Zero then self.playBeginSound = false CTL.Sound.PlayGameSound(BeginSoundEvent) end else self.playBeginSound = false CTL.Sound.PlayGameSound(BeginSoundEvent) end end end function UIBattleMissionPanel:MissionPlayCompleteSound(missionAim) if self.playCompleteSound then local aimData = missionAim.Data if aimData.ParamID then local monsterData = DataSheetManager.MonsterData:GetDataByID(aimData.ParamID) if type(aimData.Param1) == "number" and aimData.Param1 > MinCount and monsterData and monsterData.Speed > FP.Const.Zero then -- 护送任务的 Param1 是 table self.playBeginSound = false CTL.Sound.PlayGameSound(CompleteSoundEvent) end else if type(aimData.Param1) == "number" and aimData.Param1 > MinCount then self.playBeginSound = false CTL.Sound.PlayGameSound(CompleteSoundEvent) end end end end return UIBattleMissionPanel