529 lines
19 KiB
Lua
529 lines
19 KiB
Lua
require("Base/BasePanel")
|
|
require("Base/Stack")
|
|
require("Modules.Battle.Config.PokemonEffectConfig")
|
|
local BattleView = require("Modules/Battle/View/BattleView")
|
|
BattlePanel = Inherit(BasePanel)
|
|
|
|
local this = BattlePanel
|
|
local battleTimeScaleKey = "battleTimeScaleKey"
|
|
|
|
local timeCount
|
|
local endFunc
|
|
local isBack = false --是否为战斗回放
|
|
local fightType -- 1关卡 2副本 3限时怪, 5兽潮, 6新关卡, 7公会boss
|
|
local orginLayer
|
|
|
|
-- 显示跳过战斗使用
|
|
local hadCounted = 0
|
|
|
|
--初始化组件(用于子类重写)
|
|
function this:InitComponent()
|
|
BattleView:InitComponent(self)
|
|
orginLayer = 0
|
|
|
|
this.BG = Util.GetGameObject(self.gameObject, "BG")
|
|
this.UpRoot = Util.GetGameObject(self.gameObject, "UpRoot")
|
|
|
|
this.Option = Util.GetGameObject(this.UpRoot, "option")
|
|
this.DownRoot = Util.GetGameObject(self.gameObject, "DownRoot")
|
|
|
|
this.roundText = Util.GetGameObject(this.Option, "timeCount"):GetComponent("Text")
|
|
|
|
this.orderText = Util.GetGameObject(this.Option, "order/text"):GetComponent("Text")
|
|
|
|
this.BtnTimeScale = Util.GetGameObject(this.DownRoot, "option/BtnTimeScale")
|
|
this.BtnExit = Util.GetGameObject(this.DownRoot, "option/BtnExit")
|
|
this.ButtonLock = Util.GetGameObject(this.DownRoot, "option/Button/lock")
|
|
this.BtnGM = Util.GetGameObject(this.DownRoot, "option/Button")
|
|
this.submit = Util.GetGameObject(this.DownRoot, "bg")
|
|
|
|
|
|
this.DefResult = Util.GetGameObject(this.UpRoot, "result")
|
|
this.AtkResult = Util.GetGameObject(this.DownRoot, "result")
|
|
|
|
|
|
|
|
this.damagePanel = Util.GetGameObject(this.UpRoot, "damage")
|
|
this.damageBoxBg = Util.GetGameObject(this.damagePanel, "bg")
|
|
this.damageBoxIcon = Util.GetGameObject(this.damagePanel, "bg/iconRoot/icon"):GetComponent("Image")
|
|
this.damageBoxLevel = Util.GetGameObject(this.damagePanel, "lv"):GetComponent("Text")
|
|
this.damageProgress = Util.GetGameObject(this.damagePanel, "progress/Fill")
|
|
this.damageText = Util.GetGameObject(this.damagePanel, "progress/Text"):GetComponent("Text")
|
|
end
|
|
|
|
--绑定事件(用于子类重写)
|
|
function this:BindEvent()
|
|
|
|
Util.AddLongPressClick(this.submit, function()
|
|
BattleRecordManager.SubmitBattleRecord()
|
|
end, 0.5)
|
|
|
|
|
|
Util.AddClick(this.BtnTimeScale, function ()
|
|
if not BattleManager.IsCanOperate() then
|
|
return
|
|
end
|
|
if not BattleManager.IsUnlockBattleSpeed() then
|
|
PopupTipPanel.ShowTip(PrivilegeManager.GetPrivilegeOpenTip(PRIVILEGE_TYPE.DoubleTimesFight))
|
|
return
|
|
end
|
|
local scale = BattleManager.GetTimeScale()
|
|
scale = math.floor(scale*10 + 0.5)/10
|
|
if scale == BATTLE_TIME_SCALE_ONE then
|
|
BattleManager.SetTimeScale(BATTLE_TIME_SCALE_TWO)
|
|
elseif scale == BATTLE_TIME_SCALE_TWO then
|
|
BattleManager.SetTimeScale(BATTLE_TIME_SCALE_ONE)
|
|
end
|
|
end)
|
|
|
|
Util.AddClick(this.ButtonLock, function ()
|
|
PopupTipPanel.ShowTip(Language[12246])
|
|
end)
|
|
|
|
local pauseTime = 31
|
|
Util.AddClick(this.BtnExit, function ()
|
|
if not BattleManager.IsUnlockBattlePass() then
|
|
PopupTipPanel.ShowTip(PrivilegeManager.GetPrivilegeOpenTip(isBack and PRIVILEGE_TYPE.SkipFight or PRIVILEGE_TYPE.ExitFight ))
|
|
return
|
|
end
|
|
if BattleLogic.IsEnd or not BattleManager.IsCanOperate() then
|
|
return
|
|
end
|
|
-- 战斗暂停
|
|
BattleManager.PauseBattle()
|
|
|
|
local count = 0
|
|
local timer = Timer.New(function ()
|
|
if not UIManager.IsOpen(UIName.MsgPanel) then
|
|
return
|
|
end
|
|
count = count + 1
|
|
if isBack then
|
|
MsgPanel.tipLabel.text = string.format(Language[10255], pauseTime - count)
|
|
else
|
|
MsgPanel.tipLabel.text = string.format(Language[10256], pauseTime - count)
|
|
end
|
|
if count == pauseTime then
|
|
MsgPanel.OnRightBtnClick()
|
|
return
|
|
end
|
|
end, 1, pauseTime, true)
|
|
local cancelFunc = function ()
|
|
this.CastingPass = MsgPanel._toggle.isOn
|
|
BattleManager.ResumeBattle()
|
|
timer:Stop()
|
|
end
|
|
local sureFunc = function()
|
|
this.CastingPass = MsgPanel._toggle.isOn
|
|
BattleLogic.IsEnd = true
|
|
BattleView.Clear()
|
|
timer:Stop()
|
|
|
|
-- 事先初始化
|
|
this.lastBattleResult = {
|
|
result = 0,
|
|
lastPos = 0,
|
|
}
|
|
if isBack then --战斗回放直接跳过
|
|
if not this.fightResult then
|
|
LogError(Language[10257])
|
|
end
|
|
BattleView.EndBattle(this.fightResult or 0)
|
|
return
|
|
end
|
|
|
|
if fightType == BATTLE_TYPE.MAP_FIGHT then
|
|
-- 必输的操作
|
|
NetManager.MapFightResultRequest(1, "", "", fightType, function (msg)
|
|
this.lastBattleResult.result = msg.result
|
|
if msg.lastXY then
|
|
this.lastBattleResult.lastPos = msg.lastXY
|
|
else
|
|
this.lastBattleResult.lastPos = 0
|
|
end
|
|
|
|
this.ShowBattleResult(msg.result)
|
|
end)
|
|
|
|
elseif fightType == BATTLE_TYPE.GUILD_BOSS and fightType == BATTLE_TYPE.GUILD_CAR_DELAY then
|
|
this.lastBattleResult.result = -1
|
|
this:ClosePanel()
|
|
else
|
|
this.ShowBattleResult(0)
|
|
end
|
|
end
|
|
MsgPanel.ShowTwo(Language[10258], sureFunc, cancelFunc, Language[10259], Language[10260],nil, false, Language[10261])
|
|
MsgPanel._toggle.isOn = this.CastingPass
|
|
timer:Start()
|
|
end)
|
|
|
|
|
|
Util.AddClick(this.BtnGM, function ()
|
|
if BattleManager.IsCanOperate() and not BattleLogic.IsEnd then
|
|
BattleView.EndBattle()
|
|
BattleLogic.IsEnd = true
|
|
end
|
|
end)
|
|
|
|
end
|
|
|
|
function this:LoseJump(id)
|
|
if not MapManager.isInMap then
|
|
if JumpManager.CheckJump(id) then
|
|
this:ClosePanel()
|
|
JumpManager.GoJumpWithoutTip(id)
|
|
end
|
|
else
|
|
PopupTipPanel.ShowTip(Language[10250])
|
|
end
|
|
end
|
|
|
|
--添加事件监听(用于子类重写)
|
|
function this:AddListener()
|
|
Game.GlobalEvent:AddEvent(GameEvent.Battle.OnTimeScaleChanged, this.SwitchTimeScale)
|
|
end
|
|
|
|
--移除事件监听(用于子类重写)
|
|
function this:RemoveListener()
|
|
Game.GlobalEvent:RemoveEvent(GameEvent.Battle.OnTimeScaleChanged, this.SwitchTimeScale)
|
|
end
|
|
|
|
function this:OnSortingOrderChange()
|
|
Util.AddParticleSortLayer(this.gameObject, this.sortingOrder - orginLayer)
|
|
orginLayer = this.sortingOrder
|
|
|
|
BattleView:OnSortingOrderChange(this.sortingOrder)
|
|
end
|
|
|
|
--界面打开时调用(用于子类重写)
|
|
function this:OnOpen(_fightData, _fightType, _endFunc)
|
|
BattleView:OnOpen(_fightData)
|
|
|
|
endFunc = _endFunc
|
|
fightType = _fightType --判定战斗类型
|
|
isBack = _fightType == BATTLE_TYPE.BACK --判定是否是战斗回放
|
|
hadCounted = 0
|
|
-- LogPink(fightType)
|
|
this.BG:GetComponent("Image").sprite = Util.LoadSprite(BattleManager.GetBattleBg(fightType))
|
|
|
|
-- this.BtnGM:SetActive(AppConst.isOpenGM)
|
|
this.BtnExit:SetActive(false)--FightPointPassManager.GetStopBtnState())
|
|
|
|
|
|
SoundManager.PlayMusic(SoundConfig.BGM_Battle_1, true, function()
|
|
SoundManager.PlayMusic(SoundConfig.BGM_Battle_2, false)
|
|
end)
|
|
|
|
this.fightResult = nil
|
|
|
|
-- 清空名字数据
|
|
BattleView:SetNameStr(nil)
|
|
this.DefResult:SetActive(false)
|
|
this.AtkResult:SetActive(false)
|
|
|
|
-- 开始战斗
|
|
BattleView:StartBattle()
|
|
|
|
|
|
this.InitPanelData()
|
|
end
|
|
|
|
-- 设置战斗结果
|
|
function this:SetResult(result)
|
|
this.fightResult = result
|
|
end
|
|
|
|
-- 外部调用
|
|
function this:ShowNameShow(result, str)
|
|
if true then return end
|
|
this.fightResult = result
|
|
if str then
|
|
local nameList = string.split(str, "|")
|
|
BattleView:SetNameStr(str)
|
|
this.DefResult:SetActive(true)
|
|
this.AtkResult:SetActive(true)
|
|
|
|
Util.GetGameObject(this.AtkResult, "win"):SetActive(result == 1)
|
|
Util.GetGameObject(this.AtkResult, "lose"):SetActive(result == 0)
|
|
Util.GetGameObject(this.DefResult, "win"):SetActive(result == 0)
|
|
Util.GetGameObject(this.DefResult, "lose"):SetActive(result == 1)
|
|
|
|
Util.GetGameObject(this.AtkResult, "win/Text"):GetComponent("Text").text = nameList[1]
|
|
Util.GetGameObject(this.AtkResult, "lose/Text"):GetComponent("Text").text = nameList[1]
|
|
Util.GetGameObject(this.DefResult, "win/Text"):GetComponent("Text").text = nameList[2]
|
|
Util.GetGameObject(this.DefResult, "lose/Text"):GetComponent("Text").text = nameList[2]
|
|
else
|
|
this.DefResult:SetActive(false)
|
|
this.AtkResult:SetActive(false)
|
|
end
|
|
end
|
|
|
|
-- 初始化
|
|
function this.InitPanelData()
|
|
if fightType == BATTLE_TYPE.GUILD_BOSS and fightType == BATTLE_TYPE.GUILD_CAR_DELAY then
|
|
this.myDamage = 0
|
|
this.myDamageLevel = 0
|
|
this.RefreshMyDamageShow()
|
|
local list = RoleManager.Query(function (r) return r.camp == 1 end)
|
|
if list[1] then
|
|
list[1].Event:AddEvent(BattleEventName.RoleBeDamaged, function (atkRole, damage, bCrit, finalDmg, damageType, dotType)
|
|
--Log("damage:"..damage)
|
|
this.myDamage = this.myDamage + damage
|
|
this.RefreshMyDamageShow()
|
|
end)
|
|
end
|
|
end
|
|
|
|
this.InitOption()
|
|
end
|
|
|
|
function this.InitOption()
|
|
--显示倒计时
|
|
local curRound, maxRound = BattleLogic.GetCurRound()
|
|
this.roundText.text = string.format(Language[10252], curRound, maxRound)
|
|
hadCounted = 0
|
|
|
|
this.Option:SetActive(true)
|
|
Util.GetGameObject(this.BtnTimeScale, "lock"):SetActive(not BattleManager.IsUnlockBattleSpeed())
|
|
local IsUnLockBattlePass = BattleManager.IsUnlockBattlePass() or (fightType == BATTLE_TYPE.BACK)--or AppConst.isOpenGM
|
|
Util.GetGameObject(this.BtnExit, "lock"):SetActive(not IsUnLockBattlePass)
|
|
if AppConst.isOpenGM then
|
|
Util.GetGameObject(this.BtnGM, "lock"):SetActive(false)
|
|
else
|
|
Util.GetGameObject(this.BtnGM, "lock"):SetActive(not IsUnLockBattlePass)
|
|
this.BtnGM:GetComponent("Button").interactable = IsUnLockBattlePass
|
|
end
|
|
|
|
|
|
|
|
-- 初始化战斗时间,刷新前端显示
|
|
BattleManager.InitTimeScale()
|
|
this.SwitchTimeScale()
|
|
end
|
|
|
|
function this.SwitchTimeScale()
|
|
local _scale = BattleManager.GetTimeScale()
|
|
local child = this.BtnTimeScale.transform.childCount - 3 -- 3倍速时-2
|
|
local s = "x".. math.floor(_scale)
|
|
for i=1, child do
|
|
local g = this.BtnTimeScale.transform:GetChild(i-1).gameObject
|
|
g:SetActive(g.name == s)
|
|
end
|
|
end
|
|
|
|
function this.BattleEnd(result)
|
|
BattleManager.PauseBattle()
|
|
-- 强制停止倍速
|
|
Time.timeScale = 1
|
|
-- 设置音效播放的速度
|
|
SoundManager.SetAudioSpeed(1)
|
|
--用一个变量接收最近的战斗结果
|
|
this.lastBattleResult = {
|
|
result = result,
|
|
hpList = {},
|
|
drop = {},
|
|
}
|
|
|
|
-- 需要和服务器确认结果
|
|
if fightType == BATTLE_TYPE.MAP_FIGHT
|
|
or fightType == BATTLE_TYPE.MONSTER_CAMP
|
|
or fightType == BATTLE_TYPE.STORY_FIGHT
|
|
or fightType == BATTLE_TYPE.GUILD_BOSS then
|
|
local levelId = FightPointPassManager.GetCurFightId()
|
|
NetManager.MapFightResultRequest(10000, "", levelId, fightType, function (msg)
|
|
for i=1, #msg.remainHpList do
|
|
Log(Language[10262]..msg.remainHpList[i])
|
|
this.lastBattleResult.hpList[i] = msg.remainHpList[i]
|
|
end
|
|
|
|
this.lastBattleResult.drop = msg.enventDrop
|
|
this.lastBattleResult.missionDrop = msg.missionDrop
|
|
this.lastBattleResult.result = msg.result
|
|
this.lastBattleResult.mission = msg.mission
|
|
this.lastBattleResult.eventId = msg.eventId
|
|
this.lastBattleResult.lastTowerTime = msg.lastTowerTime
|
|
if msg.lastXY then
|
|
this.lastBattleResult.lastPos = msg.lastXY
|
|
else
|
|
this.lastBattleResult.lastPos = 0
|
|
end
|
|
this.ShowBattleResult(msg.result, msg)
|
|
end)
|
|
elseif fightType == BATTLE_TYPE.EXECUTE_FIGHT then--远征处理
|
|
if ExpeditionManager.ExpeditionState == 1 then
|
|
local GetCurNodeInfo = ExpeditionManager.curAttackNodeInfo
|
|
NetManager.EndExpeditionBattleRequest(GetCurNodeInfo.sortId, "", function (msg)
|
|
this.lastBattleResult.result = msg.result
|
|
this.lastBattleResult.drop = msg.drop
|
|
--ExpeditionManager.UpdateHeroHpValue(msg.heroInfo)
|
|
--ExpeditionManager.UpdateNodeValue(msg) --nodeInfo
|
|
this.ShowBattleResult(msg.result, msg)
|
|
end)
|
|
else
|
|
this:ClosePanel()
|
|
ExpeditionManager.RefreshPanelShowByState()
|
|
end
|
|
else
|
|
-- 直接显示结果
|
|
this.ShowBattleResult(result)
|
|
end
|
|
end
|
|
|
|
function this.ShowBattleResult(result, msg)
|
|
SoundManager.StopMusic()
|
|
-- 战斗结束时,如果元素光环面板还开着,则先关闭
|
|
if UIManager.IsOpen(UIName.ElementPopup) then
|
|
UIManager.ClosePanel(UIName.ElementPopup)
|
|
end
|
|
-- 回放直接关闭界面
|
|
if fightType == BATTLE_TYPE.BACK then
|
|
this:ClosePanel()
|
|
return
|
|
end
|
|
-- 播放结算音效
|
|
if result == 0 then
|
|
this.resultSoundAudio = SoundManager.PlaySound(SoundConfig.Sound_BattleLose)
|
|
else
|
|
this.resultSoundAudio = SoundManager.PlaySound(SoundConfig.Sound_BattleWin)
|
|
end
|
|
|
|
-- 公会boss结算界面
|
|
if fightType == BATTLE_TYPE.GUILD_BOSS then
|
|
UIManager.OpenPanel(UIName.GuildBossFightResultPopup, msg.enventDrop, msg.missionDrop, msg.essenceValue, function()
|
|
this:ClosePanel()
|
|
end)
|
|
-- 车迟斗法结算界面特殊显示
|
|
elseif fightType == BATTLE_TYPE.GUILD_CAR_DELAY and GuildCarDelayManager.progress == 1 then
|
|
-- 延时执行避免事件冲突
|
|
Timer.New(function()
|
|
local bestData, allDamage= BattleRecordManager.GetBattleBestData()
|
|
if bestData then
|
|
-- 胜利显示本场比赛的表现最好的英雄
|
|
UIManager.OpenPanel(UIName.BattleBestPopup, bestData.roleId, bestData.damage, allDamage, function(_BattleBestPopup)
|
|
-- 打开关卡奖励界面
|
|
UIManager.OpenPanel(UIName.RewardItemPopup,nil, 1,function()
|
|
--车迟挑战cd计时
|
|
GuildCarDelayManager.SetCdTime(GuildCarDelayProType.Challenge)
|
|
if _BattleBestPopup then
|
|
_BattleBestPopup:ClosePanel()
|
|
end
|
|
this:ClosePanel()
|
|
end, 3,true,true)
|
|
end)
|
|
end
|
|
end, 0.1):Start()
|
|
-- 十绝阵结算界面特殊显示
|
|
elseif fightType == BATTLE_TYPE.DEATH_POS then
|
|
-- 延时执行避免事件冲突
|
|
Timer.New(function()
|
|
local bestData, allDamage= BattleRecordManager.GetBattleBestData()
|
|
if bestData then
|
|
-- 胜利显示本场比赛的表现最好的英雄
|
|
UIManager.OpenPanel(UIName.BattleBestPopup, bestData.roleId, bestData.damage, allDamage, function(_BattleBestPopup)
|
|
-- 打开关卡奖励界面
|
|
UIManager.OpenPanel(UIName.RewardItemPopup, DeathPosManager.drop, 1,function()
|
|
if _BattleBestPopup then
|
|
_BattleBestPopup:ClosePanel()
|
|
end
|
|
this:ClosePanel()
|
|
end, 4,true,true)
|
|
end)
|
|
end
|
|
end, 0.1):Start()
|
|
else
|
|
if result == 0 then -- 失败
|
|
local haveRecord = BattleRecordManager.isHaveRecord()
|
|
UIManager.OpenPanel(UIName.BattleFailPopup, this, haveRecord,nil,fightType)
|
|
else -- 胜利
|
|
UIManager.OpenPanel(UIName.BattleWinPopup, this, isBack, fightType, this.lastBattleResult)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- 战斗波次变化回调
|
|
function this.OnOrderChanged(order)
|
|
-- body
|
|
--显示波次
|
|
this.orderText.text = string.format("%d/%d", order, BattleLogic.TotalOrder)
|
|
end
|
|
|
|
-- 战斗回合变化回调
|
|
function this.OnRoundChanged(round)
|
|
-- body
|
|
--显示波次
|
|
local curRound, maxRound = BattleLogic.GetCurRound()
|
|
this.roundText.text = string.format(Language[10252], curRound, maxRound)
|
|
|
|
end
|
|
|
|
-- 由BattleView驱动
|
|
function this.OnUpdate()
|
|
|
|
end
|
|
|
|
-- 刷新我的伤害显示
|
|
function this.RefreshMyDamageShow()
|
|
if fightType == 7 or fightType == 10 then
|
|
local myDamage = this.myDamage-- *10
|
|
local bossRewardConfig = ConfigManager.GetConfig(ConfigName.GuildBossRewardConfig)
|
|
local curLevel, curLevelData, nextLevelData
|
|
for level, data in ConfigPairs(bossRewardConfig) do
|
|
if data.Damage > myDamage then
|
|
nextLevelData = data
|
|
break
|
|
end
|
|
curLevel = level
|
|
curLevelData = data
|
|
end
|
|
if not nextLevelData then
|
|
nextLevelData = curLevelData
|
|
end
|
|
-- 有等级变化
|
|
if curLevel ~= this.myDamageLevel then
|
|
this.myDamageLevel = curLevel
|
|
-- 播放升级特效
|
|
this.damageBoxBg:SetActive(false)
|
|
this.damageBoxBg:SetActive(true)
|
|
end
|
|
|
|
this.damageBoxLevel.text = curLevel or 0
|
|
this.damageBoxIcon.sprite = GuildBossManager.GetBoxSpriteByLevel(curLevel or 0)
|
|
-- this.damageText.text = myDamage.."/"..nextLevelData.Damage -- 显示总伤害
|
|
|
|
local curLevelDamage = not curLevelData and 0 or curLevelData.Damage
|
|
local deltaDamage = nextLevelData.Damage - curLevelDamage
|
|
local myDeltaDamage = myDamage - curLevelDamage
|
|
local rate = deltaDamage == 0 and 1 or myDeltaDamage/deltaDamage
|
|
this.damageText.text = myDeltaDamage.."/"..deltaDamage -- 显示当前等级伤害
|
|
|
|
|
|
this.damageProgress.transform.localScale = Vector3.New(rate, 1, 1)
|
|
end
|
|
end
|
|
|
|
--界面关闭时调用(用于子类重写)
|
|
function this:OnClose()
|
|
BattleView:OnClose()
|
|
-- 停止音效
|
|
--if this.resultSoundAudio then
|
|
-- SoundManager.StopSound(this.resultSoundAudio)
|
|
--end
|
|
--
|
|
-- BattleManager.SetTimeScale(1)
|
|
-- 真正生效的敌方
|
|
Time.timeScale = 1
|
|
-- 设置音效播放的速度
|
|
SoundManager.SetAudioSpeed(1)
|
|
if endFunc then
|
|
endFunc(this.lastBattleResult)
|
|
end
|
|
--检测是否需要弹每日任务飘窗
|
|
TaskManager.RefreshShowDailyMissionTipPanel()
|
|
end
|
|
|
|
--界面销毁时调用(用于子类重写)
|
|
function this:OnDestroy()
|
|
BattleView:OnDestroy()
|
|
end
|
|
|
|
return BattlePanel |