miduo_client/Assets/ManagedResources/~Lua/Modules/Battle/View/DamageResultPanel.lua

479 lines
17 KiB
Lua

require("Modules.Battle.Config.PokemonEffectConfig")
require("Base/BasePanel")
local SpiritAnimal = ConfigManager.GetConfig(ConfigName.SpiritAnimal)
local DamageResultPanel = Inherit(BasePanel)
local this = DamageResultPanel
-- Tab管理器
local TabBox = require("Modules/Common/TabBox")
local _TabFontColor = { default = Color.New(168 / 255, 168 / 255, 167 / 255, 1),
select = Color.New(250 / 255, 227 / 255, 175 / 255, 1) }
local _TabData = {
[1] = { default = "r_hero_xuanze_002", select = "r_hero_xuanze_001", name = Language[10232] },
[2] = { default = "r_hero_xuanze_002", select = "r_hero_xuanze_001", name = Language[10233] },
[3] = { default = "r_hero_xuanze_002", select = "r_hero_xuanze_001", name = Language[11517] },
[4] = { default = "r_hero_xuanze_002", select = "r_hero_xuanze_001", name = Language[10214] },
}
-- 最大层数
local _MaxOrder = 0
-- 最大数值,以最大数值为比计算其他数值的比例
local _MaxDamageValue = 0
local _MaxTreatValue = 0
-- 节点保存
local _LeftItemPool = {}
local _RightItemPool = {}
local LEFT_CAMP = 0
local RIGHT_CAMP = 1
-- 数据重构
local _NormalMonsterList = {}
local _DiffMonsterList = {}
--初始化组件(用于子类重写)
function DamageResultPanel:InitComponent()
this.spLoader = SpriteLoader.New()
this.BtnBack = Util.GetGameObject(this.transform, "btnBack")
this.leftResult = Util.GetGameObject(this.transform, "left/result"):GetComponent("Image")
this.leftName = Util.GetGameObject(this.transform, "left/name"):GetComponent("Text")
this.leftItem = Util.GetGameObject(this.transform, "left/item")
this.leftGrid = Util.GetGameObject(this.transform, "left/scrollRect/grid")
this.rightResult = Util.GetGameObject(this.transform, "right/result"):GetComponent("Image")
this.rightName = Util.GetGameObject(this.transform, "right/name"):GetComponent("Text")
this.rightItem = Util.GetGameObject(this.transform, "right/item")
this.rightGrid = Util.GetGameObject(this.transform, "right/scrollRect/grid")
-- 初始化Tab管理器
this.tabbox = Util.GetGameObject(this.transform, "top")
this.TabCtrl = TabBox.New()
this.TabCtrl:SetTabAdapter(this.TabAdapter)
this.TabCtrl:SetChangeTabCallBack(this.OnTabChange)
end
--绑定事件(用于子类重写)
function DamageResultPanel:BindEvent()
Util.AddClick(this.BtnBack, function()
PlaySoundWithoutClick(SoundConfig.Sound_UICancel)
this:ClosePanel()
end)
end
--添加事件监听(用于子类重写)
function DamageResultPanel:AddListener()
end
--移除事件监听(用于子类重写)
function DamageResultPanel:RemoveListener()
end
--界面打开时调用(用于子类重写)
function DamageResultPanel:OnOpen(result)
this.TabCtrl:Init(this.tabbox, _TabData)
this.leftResult.sprite = this.spLoader:LoadSprite(result == 1 and "UI_effect_JJC_JieSuan_ShengLi_png_zh" or "UI_effect_JJC_JieSuan_ShiBai_png_zh")
this.rightResult.sprite = this.spLoader:LoadSprite(result == 0 and "UI_effect_JJC_JieSuan_ShengLi_png_zh" or "UI_effect_JJC_JieSuan_ShiBai_png_zh")
local nameStr = BattleRecordManager.GetBattleBothNameStr()
if nameStr then
local namelist = string.split(nameStr, "|")
this.leftName.text = namelist[1]
this.rightName.text = namelist[2]
else
this.leftName.text = Language[10234]
this.rightName.text = Language[10235]
end
-- 数据
this.battleRecord = BattleRecordManager.GetBattleRecord()
if not this.battleRecord then return end
-- 计算最大数据
_MaxDamageValue = 0
_MaxTreatValue = 0
if this.battleRecord.data then
for _, role in pairs(this.battleRecord.data) do
-- 计算最大值
if role.damage and role.damage > _MaxDamageValue then _MaxDamageValue = role.damage end
if role.treat and role.treat > _MaxTreatValue then _MaxTreatValue = role.treat end
end
end
-- tab节点管理
if this.TabCtrl then
this.TabCtrl:Init(this.tabbox, _TabData)
end
end
--界面打开或者重新打开后,界面刷新时调用(用于子类重写)
function DamageResultPanel:OnShow()
end
function this.isTabShow(index)
if not this.battleRecord then
return false
end
local list
if index == 1 or index == 2 then
return true
elseif index == 3 then
list = this.battleRecord.data
elseif index == 4 then
list = this.battleRecord.mdata
end
--
if list and table.nums(list) ~= 0 then
for _, role in pairs(list) do
-- 还有除info, damage, treat之外的其他属性
if table.nums(role) > 3 then
return true
end
end
end
return false
end
-- tab节点显示自定义
function this.TabAdapter(tab, index, status)
local tabLab = Util.GetGameObject(tab, "Text")
Util.GetGameObject(tab,"Img"):GetComponent("Image").sprite = this.spLoader:LoadSprite(_TabData[index][status])
tabLab:GetComponent("Text").text = _TabData[index].name
tabLab:GetComponent("Text").color = _TabFontColor[status]
tab.gameObject:SetActive(this.isTabShow(index))
end
-- tab改变回调事件
function this.OnTabChange(index, lastIndex)
local showType = index -- 1 伤害 2 治疗 3 特殊 4 灵兽
-- 关闭显示
for _, item in pairs(_LeftItemPool) do
item:SetActive(false)
end
for _, item in pairs(_RightItemPool) do
item:SetActive(false)
end
-- 数据匹配
if not this.battleRecord then return end
local leftIndex, rightIndex = 0, 0
local function CreateMonsterItem(data)
local pool, item, grid, index
if data.info.camp == LEFT_CAMP then
leftIndex = leftIndex + 1
pool, item, grid, index = _LeftItemPool, this.leftItem, this.leftGrid, leftIndex
elseif data.info.camp == RIGHT_CAMP then
rightIndex = rightIndex + 1
pool, item, grid, index = _RightItemPool, this.rightItem, this.rightGrid, rightIndex
end
if not pool[index] then
pool[index] = newObjToParent(item, grid)
end
pool[index]:SetActive(true)
this.ItemAdapter(pool[index], data, showType)
end
-- 创建
local monster=this.battleRecord.mdata
local showList = this.battleRecord.data
if showType == 4 then
showList={}
--= this.battleRecord.mdata
for key, value in pairs(monster) do
if key~=100 and key~=106 then
--table.remove(showList,key)
table.insert(showList,value)
end
end
else
for key, value in pairs(monster) do
if key==100 or key==106 then
value.info.type=1
showList[key]=value
end
end
end
for _, data in pairs(showList) do
CreateMonsterItem(data)
end
-- 播放动画
this.StartPlayAnim(showType)
end
-- 开始播放动画
function this.StartPlayAnim(showType)
if showType > 2 then
return
end
-- 根据showType播放动画
DoTween.To(
DG.Tweening.Core.DOGetter_float( function () return 0 end),
DG.Tweening.Core.DOSetter_float(
function (progress)
local leftIndex, rightIndex = 0, 0
local function _Play(data)
local pool, index, drt
if data.info.camp == LEFT_CAMP then
leftIndex = leftIndex + 1
pool, index = _LeftItemPool, leftIndex
drt = 1
elseif data.info.camp == RIGHT_CAMP then
rightIndex = rightIndex + 1
pool, index = _RightItemPool, rightIndex
drt = -1
end
if pool[index] then
local _progress = Util.GetGameObject(pool[index], "progress")
local value = 0
if showType == 1 then
if _MaxDamageValue ~= 0 then
value = (data.damage or 0)/_MaxDamageValue
end
else
if _MaxTreatValue ~= 0 then
value = (data.treat or 0)/_MaxTreatValue
end
end
_progress.transform.localScale = Vector3(value * progress * drt, 1, 1)
end
end
-- 创建
for _, data in pairs(this.battleRecord.data) do
_Play(data)
end
end),
1, 1)
:SetEase(Ease.OutQuad)
end
-- 数据匹配
function this.ItemAdapter(item, data, showType)
local head = Util.GetGameObject(item, "headpos/head")
this.HeadAdapter(head, data.info, showType)
local damage = Util.GetGameObject(item, "damage"):GetComponent("Text")
local progress = Util.GetGameObject(item, "progress")
local scroll = Util.GetGameObject(item, "scroll")
local content = Util.GetGameObject(item, "scroll/Viewport/Content"):GetComponent("Text")
-- 显隐
damage.gameObject:SetActive(showType <= 2)
progress.gameObject:SetActive(showType <= 2)
scroll:SetActive(showType > 2)
--
if showType == 1 then
damage.text = data.damage or 0
progress:GetComponent("Image").sprite = this.spLoader:LoadSprite("r_guaji_zhandoutongjitiao_01")
progress.transform.localScale = Vector3(0, 1, 1)
elseif showType == 2 then
damage.text = data.treat or 0
progress:GetComponent("Image").sprite = this.spLoader:LoadSprite("r_guaji_zhandoutongjitiao_02")
progress.transform.localScale = Vector3(0, 1, 1)
elseif showType == 3 or showType == 4 then
local txt = ""
for key, value in pairs(data) do
local s = this.GetSpecialText(key, value)
if s and s ~= "" then
if txt ~= "" then
txt = txt.."\n"
end
txt = txt..s
end
end
-- 没有显示则不显示
if txt == "" then
item.gameObject:SetActive(false)
else
content.text = txt
end
end
end
function this.GetSpecialText(key, value)
if key == "buff" then
local s = ""
for id, v in pairs(value) do
local type = math.floor(id/100)
local subType = id%100
print(id, type, subType)
local config = ConfigManager.TryGetConfigDataByDoubleKey(ConfigName.BuffEffectConfig, "Type", type, "CType", subType)
if config then
if s ~= "" then
s = s.."\n"
end
local color = UIColorStr.RED
if type == BuffName.Shield then
color = UIColorStr.GREEN
end
s = s .. string.format(Language[12158], GetLanguageStrById(config.Describe), color, v)
end
end
return s
elseif key == "addRage" then
return string.format(Language[12159], UIColorStr.GREEN, value)
elseif key == "subRage" then
return string.format(Language[12160], UIColorStr.RED, value)
elseif key == "transRage" then
return string.format(Language[12161], UIColorStr.GREEN, value)
elseif key == "secKill" then
return string.format(Language[12162], UIColorStr.RED, value)
end
end
-- 头像数据匹配
function this.HeadAdapter(head,data,type)
local frame = Util.GetGameObject(head, "frame"):GetComponent("Image")
local icon = Util.GetGameObject(head, "icon"):GetComponent("Image")
local prefess = Util.GetGameObject(head, "pro")
prefess:SetActive(false)
local prefessIcon = Util.GetGameObject(head, "pro/icon"):GetComponent("Image")
local proto = Util.GetGameObject(head, "prott")
local protoIcon = Util.GetGameObject(head, "prott/Image"):GetComponent("Image")
local lv = Util.GetGameObject(head, "lv")
local lvText = Util.GetGameObject(head, "lv/Text"):GetComponent("Text")
local starRoot = Util.GetGameObject(head, "star")
local deadObj = Util.GetGameObject(head, "deadObj")
deadObj:GetComponent("Image").sprite=this.spLoader:LoadSprite("r_zhandou_zhenwang_zh")
local aa=0
local frameStr="r_characterbg_goden"
if data.type == BattleUnitType.Role then
local roleId = data.roleData.monsterId or data.roleData.roleId
local roleLv = data:GetRoleData(RoleDataName.Level)
local skinId = data.roleData.skinId
local star = data.star
-- LogError("id=="..roleId.."star=="..star.." data.roleData.godSoulLv=="..data.roleData.godSoulLv.." ")
local config = {}
if data.position==100 then
config.Quality=4
if data.roleData.sex==ROLE_SEX.BOY then
aa=3201
else
aa=3202
end
config.lv=data.roleData.star
star=0
SetHeroFlyEffect(head,this.spLoader,0,this.sortingOrder+1,0.95)
else
if roleId > 10100 then
local MonsterConfig = ConfigManager.GetConfigData(ConfigName.MonsterConfig, roleId)
config.Quality = MonsterConfig.Quality
config.lv = MonsterConfig.Level
star=MonsterConfig.Star
if MonsterConfig.MonsterId > 10000 then
local heroConfig = ConfigManager.GetConfigData(ConfigName.HeroConfig, MonsterConfig.MonsterId)
config.Icon = heroConfig.Icon
config.Profession = heroConfig.Profession
config.PropertyName = heroConfig.PropertyName
else
local monsterViewInfo = ConfigManager.GetConfigData(ConfigName.MonsterViewConfig, MonsterConfig.MonsterId)
config.Icon = monsterViewInfo.MonsterIcon
end
else
local heroConfig = ConfigManager.GetConfigData(ConfigName.HeroConfig, roleId)
config.Quality = heroConfig.Quality
config.Icon = heroConfig.Icon
config.Profession = heroConfig.Profession
config.PropertyName = heroConfig.PropertyName
config.lv = roleLv
end
aa=config.Icon
frameStr=GetHeroQuantityImageByquality(config.Quality, star)
SetHeroFlyEffect(head,this.spLoader,data.roleData.star,this.sortingOrder+1,0.95)
end
-- 头像
frame.sprite = this.spLoader:LoadSprite(frameStr)
if skinId and skinId>0 then
local skinConfig=ConfigManager.GetConfigDataByKey(ConfigName.HeroSkin,"Type",skinId)
if skinConfig then
aa=skinConfig.Icon
end
end
icon.sprite = this.spLoader:LoadSprite(GetResourcePath(aa))
-- 等级
lv:SetActive(true)
lvText.text = config.lv
-- 星级
local starType = 1
if data.roleData.godSoulLv and data.roleData.godSoulLv > 0 then
star = data.roleData.godSoulLv
starType = 3
end
local starSize=Vector2.New(35,35)
if starType==3 then
starSize=Vector2.New(0.8,-15)
elseif starType==2 then
starSize=Vector2.New(48,48)
end
SetHeroStars(this.spLoader, starRoot, star)
Util.SetParticleSortLayer(starRoot,this.sortingOrder + 1)
-- 职业
prefess:SetActive(false)
-- 属性
proto:SetActive(false)
if config.PropertyName then
protoIcon.sprite = this.spLoader:LoadSprite(GetProStrImageByProNum(data.roleData.element))
proto:SetActive(true)
end
elseif data.type == BattleUnitType.Monster then
local id = data.uid
local roleLv = data:GetRoleData(RoleDataName.Level)
local star = data.star
prefess:SetActive(false)
proto:SetActive(false)
-- 等级
lv:SetActive(true)
lvText.text = roleLv
-- 星级
SetHeroStars(this.spLoader, starRoot, star)
Util.SetParticleSortLayer(starRoot,this.sortingOrder + 1)
-- 头像
frame.sprite = this.spLoader:LoadSprite(GetHeroQuantityImageByquality(SpiritAnimal[id].Quality))
icon:GetComponent("Image").sprite = this.spLoader:LoadSprite(GetResourcePath(SpiritAnimal[id].Icon))
end
if data.isRealDead and (type==1 or type==2 or type==3) then
-- Util.SetGray(icon.gameObject ,true)
-- Util.SetGray(frame.gameObject ,true)
-- Util.SetGray(protoIcon.gameObject ,true)
-- Util.SetGray(starRoot.gameObject ,true)
deadObj:SetActive(true)
Util.SetGray(head.gameObject ,true)
else
-- Util.SetGray(icon.gameObject,false)
-- Util.SetGray(frame.gameObject ,false)
-- Util.SetGray(starRoot.gameObject ,false)
-- Util.SetGray(protoIcon.gameObject ,false)
deadObj:SetActive(false)
Util.SetGray(head.gameObject ,false)
end
end
--界面关闭时调用(用于子类重写)
function DamageResultPanel:OnClose()
end
--界面销毁时调用(用于子类重写)
function DamageResultPanel:OnDestroy()
this.spLoader:Destroy()
_LeftItemPool = {}
_RightItemPool = {}
_MaxDamageValue = 0
_MaxTreatValue = 0
end
return DamageResultPanel