2025-06-04 05:02:57 +08:00

1136 lines
33 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

autoImport("BaseTip");
autoImport("SkillSpecialCell");
SkillTip = class("SkillTip" ,BaseTip)
SkillTip.MinHeight = 250
SkillTip.MaxHeight = 512
local tmpPos = LuaVector3(0,0,0)
local sb = LuaStringBuilder.new()
function SkillTip:Init()
self.calPropAffect = true
self:FindObjs();
self.closecomp = self.gameObject:GetComponent(CustomTouchUpCall);
self.closecomp.call = function (go)
self:CloseSelf();
end
end
function SkillTip:SetCheckClick(func)
if(self.closecomp) then
self.closecomp.check = function ()
return func~=nil and func() or false
end
end
end
function SkillTip:GetCreature()
return Game.Myself
end
function SkillTip:FindObjs()
self.topAnchor = self:FindGO("Top"):GetComponent(UIWidget)
self.centerBg = self:FindGO("CenterBg"):GetComponent(UIWidget)
self.scrollView = self:FindGO("ScrollView"):GetComponent(UIPanel)
self.scroll = self:FindGO("ScrollView"):GetComponent(UIScrollView)
self:AddToUpdateAnchors(self:FindGO("TopBound"):GetComponent(UIWidget))
self:AddToUpdateAnchors(self:FindGO("BottomBound"):GetComponent(UIWidget))
self:AddToUpdateAnchors(self.topAnchor)
self:AddToUpdateAnchors(self.centerBg)
self:AddToUpdateAnchors(self.scrollView)
self:FindTitleUI()
self:FindCurrentUI()
self:FindNextUI()
self:FindFunc()
end
function SkillTip:AddToUpdateAnchors(uirect)
if(self.anchors ==nil) then
self.anchors = {}
end
self.anchors[#self.anchors+1] = uirect
end
function SkillTip:UpdateAnchors()
if(self.anchors) then
for i=1,#self.anchors do
self.anchors[i]:ResetAndUpdateAnchors()
end
end
end
function SkillTip:FindTitleUI()
self.container = self:FindGO("Container")
self.bg = self:FindGO("Bg"):GetComponent(UISprite)
self.labelContainer = self:FindGO("Labels")
self.icon = self:FindGO("SkillIcon"):GetComponent(UISprite)
self.skillName = self:FindGO("SkillName"):GetComponent(UILabel)
self.skillLevel = self:FindGO("SkillLevel"):GetComponent(UILabel)
self.skillType = self:FindGO("SkillType"):GetComponent(UILabel)
end
function SkillTip:FindCurrentUI()
self.currentInfo = self:FindGO("CurrentInfo"):GetComponent(UILabel)
local specialInfoGO = self:FindGO("SpecialInfo")
if(specialInfoGO) then
self.specialInfo = specialInfoGO:GetComponent(UILabel)
end
self.currentCD = self:FindGO("CurrentCD"):GetComponent(UILabel)
self.useCount = self:FindGO("UsedCount"):GetComponent(UILabel)
self.labels = self.labels or {}
local padding = 15
self.labels[#self.labels+1] = {label=self.currentInfo,paddingY = padding}
if(self.specialInfo) then
self.labels[#self.labels+1] = {label=self.specialInfo,paddingY = padding}
end
self.labels[#self.labels+1] = {label=self.useCount,paddingY = 0}
self.labels[#self.labels+1] = {label=self.currentCD,paddingY = padding}
end
function SkillTip:FindNextUI()
self.sperator = self:FindGO("Sperate"):GetComponent(UILabel)
self.condition = self:FindGO("Condition"):GetComponent(UILabel)
self.nextInfo = self:FindGO("NextInfo"):GetComponent(UILabel)
self.nextCD = self:FindGO("NextCD"):GetComponent(UILabel)
self.labels = self.labels or {}
local padding = 15
self.labels[#self.labels+1] = {label=self.sperator,paddingY = 0}
self.labels[#self.labels+1] = {label=self.condition,paddingY = padding}
self.labels[#self.labels+1] = {label=self.nextInfo,paddingY = padding}
self.labels[#self.labels+1] = {label=self.nextCD,paddingY = 0}
end
function SkillTip:FindFunc()
self.funcGO = self:FindGO("Func")
if(self.funcGO) then
self.downBg = self:FindGO("DownBg"):GetComponent(UISprite)
self.funcWidget = self.funcGO:GetComponent(UIWidget)
self:AddToUpdateAnchors(self.funcWidget)
self.funcLable = self:FindGO("FuncLabel",self.funcGO):GetComponent(UILabel)
self.funcCheck = self:FindGO("FuncCheckMark",self.funcGO)
self:AddButtonEvent("FuncCheck",function ()
if not SkillProxy.Instance:IsMultiSave() then
self.funcCheck:SetActive(not self.funcCheck.activeSelf)
end
end)
self.specialBg = self:FindGO("DownBg2"):GetComponent(UISprite)
self.specialLabel = self:FindGO("RuneSpecialTitle",self.funcGO):GetComponent(UILabel)
self.specialLabel.text = ZhString.SkillTip_RuneSpecialEnabelTitle
self.specialCheck = self:FindGO("SpecialCheckMark",self.funcGO)
self:AddButtonEvent("SpecialCheck",function ()
if not SkillProxy.Instance:IsMultiSave() then
self.specialCheck:SetActive(not self.specialCheck.activeSelf)
self:_HandleSpecialCellsEnable()
self:_HandleSpecials()
end
end)
self.specialGrid = self:FindGO("Specials"):GetComponent(UIGrid)
self.specialList = ListCtrl.new(self.specialGrid,SkillSpecialCell,"SkillSpecialCell")
self.specialList:AddEventListener(MouseEvent.MouseClick,self.ClickSpecialEffect,self)
self.optionBg = self:FindGO("DownBg3"):GetComponent(UISprite)
self.optionGrid = self:FindGO("Options"):GetComponent(UIGrid)
self.optionList = ListCtrl.new(self.optionGrid,SkillSpecialCell,"SkillSpecialCell")
self.optionList:AddEventListener(MouseEvent.MouseClick,self.ClickSelectOption,self)
--備戰精英
self.beizhanOptionBg = self:FindGO("DownBg4"):GetComponent(UISprite)
self.BeizhanOptionGrid = self:FindGO("beizhanOptions"):GetComponent(UIGrid)
self.beizhanOptionList = ListCtrl.new(self.BeizhanOptionGrid,SkillSpecialCell,"SkillSpecialCell")
self.beizhanOptionList:AddEventListener(MouseEvent.MouseClick,self.ClickSelectOption,self)
end
end
-- function SkillTip:NormalSkillOptionChangeHandler()
-- if(self.funcCheck) then
-- self.funcCheck:SetActive(MyselfProxy.Instance.selectAutoNormalAtk)
-- end
-- end
function SkillTip:_HandleSpecialCellsEnable()
local enabled = self.specialCheck.activeSelf
local cells = self.specialList:GetCells()
if(cells) then
for i=1,#cells do
cells[i]:SetEnable(enabled)
end
end
end
function SkillTip:_GetSelectedSpecialCell(id)
return self:_GetSelectedCell(self.specialList,id)
end
function SkillTip:_GetSelectedOptionCell(id)
return self:_GetSelectedCell(self.optionList,id)
end
function SkillTip:_GetSelectedCell(list,id)
local cells = list:GetCells()
if(cells) then
if(self.data.staticData.id == 50066001) then
if(id == nil) then
local multiCells = {}
for i=1,#cells do
if(cells[i]:IsSelect()) then
multiCells[i] = cells[i]
else
cells[i].data.id = 0
multiCells[i] = cells[i]
end
end
return multiCells
else
for i=1,#cells do
if(id == cells[i].data.id) then
return cells[i]
end
end
end
else
for i=1,#cells do
if(cells[i]:IsSelect() or id == cells[i].data.id) then
return cells[i]
end
end
end
end
return nil
end
function SkillTip:ClickSpecialEffect(cell)
local previousSelect = self:_GetSelectedSpecialCell()
if(previousSelect==nil or cell.data.id~=previousSelect.data.id) then
if(previousSelect) then
previousSelect:UnSelect()
end
cell:Select()
self:_HandleSpecials()
end
end
function SkillTip:ClickSelectOption(cell)
if(self.data.staticData.id == 50066001) then
if(cell:IsSelect()) then
cell:UnSelect();
return
end
local cells = self.optionList:GetCells();
local count = 0;
if(cells) then
for i=1,#cells do
if(cells[i]:IsSelect()) then
count = count+1;
end
end
if(count < 7) then
cell:Select();
end
end
else
local previousSelect = self:_GetSelectedOptionCell()
if(previousSelect==nil or cell.data.id~=previousSelect.data.id) then
if(previousSelect) then
previousSelect:UnSelect()
end
cell:Select()
end
end
end
function SkillTip:_HandleSpecials()
local specialText = self:HandleRunSpecials()
if(specialText==nil) then
self:Hide(self.specialInfo.gameObject)
else
self:Show(self.specialInfo.gameObject)
self.specialInfo.text = specialText
end
end
function SkillTip:CloseSelf()
TimeTickManager.Me():ClearTick(self)
TipsView.Me():HideCurrent();
end
function SkillTip:GetCondition(skillData,nextID)
return ConditionUtil.GetSkillConditionStr(not self.data.learned and skillData or Table_Skill[nextID],true)
end
function SkillTip:SetData(data)
if(self.data~=nil) then
self:_CheckSpecialModified()
end
self.data = data.data
local skillData = self.data:GetExtraStaticData() or self.data.staticData
self:UpdateCurrentInfo(skillData)
self:ShowHideFunc()
local _MyselfProxy = MyselfProxy.Instance
local nextID = self.data:GetNextID(_MyselfProxy:HasJobBreak(), skillData, _MyselfProxy:HasJobNewBreak())
if(nextID and self.data.profession ~= 1 or not self.data.learned) then
self:Show(self.condition.gameObject)
if(self.data.learned) then
self.sperator.text = ZhString.SkillTip_NextLevelSperator
self:Show(self.sperator.gameObject)
self:Show(self.nextInfo.gameObject)
self:Show(self.nextCD.gameObject)
local nextData = Table_Skill[nextID]
self.nextInfo.text = self:GetDesc(nextData)
self.nextCD.text = self:GetCD(nextData)
else
self:Hide(self.nextInfo.gameObject)
self:Hide(self.nextCD.gameObject)
self:Hide(self.sperator.gameObject)
end
self.condition.text = self:GetCondition(skillData,nextID)
else
self:Hide(self.sperator.gameObject)
self:Hide(self.nextInfo.gameObject)
self:Hide(self.nextCD.gameObject)
self:Show(self.condition.gameObject)
if(skillData.Cost==0 or self.data.profession == 1) then
self.condition.text = ZhString.SkillTip_CannotLevelUpSperator
else
self.condition.text = ZhString.SkillTip_LevelMaxSperator
end
end
if(self.condition.text=="" or self.condition.text ==nil) then
-- self:Hide(self.condition.gameObject)
end
local layoutHeight = self:Layout()
local height = math.max(math.min(layoutHeight+190,SkillTip.MaxHeight),SkillTip.MinHeight)
self.bg.height = height
self:UpdateAnchors()
self.scroll:ResetPosition()
self.skillInfo = nil
self.closecomp.enabled = false
self.closecomp.enabled = true
end
function SkillTip:ShowHideFunc()
local bg1Height = self:_ShowHideNormalFunc()
bg1Height = self:_ShowHideOptions(bg1Height)
--bg1Height = self:_ShowHideBeizhanOptions(bg1Height)
self:_ShowHideRuneFunc(bg1Height)
end
local none_opt = 0
local normalAtkCheck_opt = 1
local skillautoQueue_opt = 2
function SkillTip:_ShowHideNormalFunc()
local bg1Height = 0
local func = self.downBg
--TODO
self.funcCheck_opt = none_opt
if(self.data) then
if(self.data.id == Game.Myself.data:GetAttackSkillIDAndLevel()) then
self.funcCheck_opt = normalAtkCheck_opt
if(self.funcLable) then
self.funcLable.text = ZhString.SkillTip_NormalAtkLabel
end
elseif(GameConfig.SkillAutoQueueID and self.data.id == GameConfig.SkillAutoQueueID[1]) then
self.funcCheck_opt = skillautoQueue_opt
if(self.funcLable) then
self.funcLable.text = GameConfig.SkillAutoQueueID[2]
end
end
end
if self.data:CheckFuncOpen(SkillItemData.FuncType.Normal) then
if(func) then
bg1Height = 55
func.gameObject:SetActive(true)
end
else
if(func) then
func.gameObject:SetActive(false)
end
end
if(self.funcCheck) then
if(self.funcCheck_opt == normalAtkCheck_opt) then
self.funcCheck:SetActive(MyselfProxy.Instance.selectAutoNormalAtk)
elseif(self.funcCheck_opt == skillautoQueue_opt)then
self.funcCheck:SetActive(Game.SkillOptionManager:GetSkillOption_AutoQueue() == 0)
end
end
return bg1Height
end
function SkillTip:_ShowHideOptions(bg1Height)
if(self.data) then
-- summon beings
local downBg3 = self.optionBg
if self.data:CheckFuncOpen(SkillItemData.FuncType.Option) then
local datas
local logicParam = self.data.staticData.Logic_Param
local _OptionEnum = SkillOptionManager.OptionEnum
-- 生命體
local being = logicParam.being_ids
if being then
self.funcOptions_opt = _OptionEnum.SummonBeing
datas = {}
for i=1,#being do
local data = {id=being[i]}
data.RuneName = string.format(ZhString.SkillTip_OptionSummon,Table_Being[data.id].Name)
datas[#datas+1] = data
end
end
-- 技能
--備戰精英填充技能
local skill = logicParam.skill_opt_ids
if(self.data.staticData.id == 50066001) then
skill = SkillProxy.Instance:GetProfessSkills();
end
if skill then
self.funcOptions_opt = logicParam.skill_opt_type
datas = {}
for i=1,#skill do
if(self.data.staticData.id == 50066001) then
local skillData = skill[i];
local skillId = math.floor(skillData.id/1000)
local data = {id = skillId}
local spCost = 0;
if (skillData.SkillCost ~= nil and skillData.SkillCost.sp ~= nil) then
spCost = skillData.SkillCost.sp;
end
data.RuneName = "Lv."..skillData.Level.." "..skillData.NameZh.." SP消耗: "..spCost;
datas[#datas+1] = data
else
local data = {id = skill[i]}
local skillData = Table_Skill[data.id*1000+1]
data.RuneName = "Lv."..skillData.Level.." "..skillData.NameZh
datas[#datas+1] = data
end
end
end
-- 元素
local element = logicParam.element_ids
if element then
self.funcOptions_opt = _OptionEnum.SummonElement
datas = {}
for i=1,#element do
local data = {id = element[i]}
data.RuneName = string.format(ZhString.SkillTip_OptionSummon, Table_Monster[data.id].NameZh)
datas[#datas+1] = data
end
end
if(downBg3) then
downBg3.gameObject:SetActive(true)
end
local height = 53
height = height + (#datas * 40)
downBg3.height = height
tmpPos:Set(0,(height+bg1Height)/2-20,0)
self.container.transform.localPosition = tmpPos
--備戰精英修改部分
if(self.data.staticData.id == 50066001) then
tmpPos:Set(0,0,0)
self.container.transform.localPosition = tmpPos
local x,y,z = LuaGameObject.GetLocalPosition(self.beizhanOptionBg.transform)
tmpPos:Set(x,505 - bg1Height,z)
else
local x,y,z = LuaGameObject.GetLocalPosition(downBg3.transform)
tmpPos:Set(x,35 - bg1Height,z)
end
downBg3.transform.localPosition = tmpPos
self.optionList:ResetDatas(datas);
--初始化選中
if(self.data.staticData.id == 50066001) then
for i=0,6 do --備戰精英,設定技能選擇列表的數量
local selectID = Game.SkillOptionManager:GetSkillOption(self.funcOptions_opt+i)
local cell = self:_GetSelectedOptionCell(selectID)
if(cell) then
cell:Select();
end
end
else
local selectID = Game.SkillOptionManager:GetSkillOption(self.funcOptions_opt)
if selectID == 0 then
selectID = datas[1].id
end
local cell = self:_GetSelectedOptionCell(selectID)
if(cell) then
cell:Select()
end
end
else
if(downBg3) then
downBg3.gameObject:SetActive(false)
end
end
end
return bg1Height
end
function SkillTip:_ShowHideRuneFunc(bg1Height)
if(self.data) then
local downBg2 = self.specialBg
if self.data:CheckFuncOpen(SkillItemData.FuncType.Rune) then
if(self.specialCheck) then
self.specialCheck:SetActive(self.data:GetEnableSpecialEffect())
end
if(downBg2) then
downBg2.gameObject:SetActive(true)
end
local height = 93
local selectSpecials = self.data:GetRuneSelectSpecials()
height = height + (#selectSpecials * 40)
downBg2.height = height
tmpPos:Set(0,(height+bg1Height)/2-20,0)
self.container.transform.localPosition = tmpPos
local x,y,z = LuaGameObject.GetLocalPosition(downBg2.transform)
tmpPos:Set(x,35 - bg1Height,z)
downBg2.transform.localPosition = tmpPos
self.specialList:ResetDatas(selectSpecials)
--初始化選中
local cell = self:_GetSelectedSpecialCell(self.data:GetSpecialID())
if(cell) then
cell:Select()
end
self:_HandleSpecialCellsEnable()
else
if(downBg2) then
downBg2.gameObject:SetActive(false)
end
end
self:_HandleSpecials()
end
end
function SkillTip:UpdateCurrentInfo(skillData)
skillData = skillData or self.data.staticData
IconManager:SetSkillIconByProfess(skillData.Icon, self.icon,MyselfProxy.Instance:GetMyProfessionType(),true)
self.skillName.text = skillData.NameZh
UIUtil.WrapLabel(self.skillName)
local infoData = skillData
sb:Clear()
if(self.data and skillData.SkillType == SkillType.Function and self.data:GetReplaceID() and self.data:GetReplaceID()>0) then
infoData = Table_Skill[self.data:GetReplaceID()]
sb:Append(infoData.NameZh)
sb:Append(" Lv.")
sb:AppendLine(infoData.Level)
end
sb:Append(self:GetDesc(infoData))
self.currentInfo.text = sb:ToString()
self.currentCD.text = self:GetCD(infoData)
if(self.data.learned) then
if(self.data:GetExtraLevel()==0) then
self.skillLevel.text = "Lv."..skillData.Level
else
self.skillLevel.text = string.format(ZhString.SkillView_LevelExtra,self.data.level, self.data:GetExtraLevel())
end
else
if(self.data:GetExtraLevel()==0) then
self.skillLevel.text = "Lv.1"
else
self.skillLevel.text = string.format(ZhString.SkillView_LevelExtra,1, self.data:GetExtraLevel())
end
end
self.skillLevel:UpdateAnchors()
if(self.data.maxTimes and self.data.maxTimes>0) then
self:Show(self.useCount.gameObject)
self:UpdateUseTimes()
if(self.data.leftTimes<self.data.maxTimes) then
TimeTickManager.Me():CreateTick(0,1000,self.UpdateUseTimes,self)
else
TimeTickManager.Me():ClearTick(self)
end
else
TimeTickManager.Me():ClearTick(self)
self:Hide(self.useCount.gameObject)
end
self.skillType.text = GameConfig.SkillType[skillData.SkillType].name
end
function SkillTip:UpdateUseTimes()
local deltaTime = ServerTime.ServerDeltaSecondTime(self.data.timeRecoveryStamp)
if(deltaTime>0 and self.data.leftTimes< self.data.maxTimes) then
self.useCount.text = string.format(ZhString.SkillTip_LeftValuesRefresh,self.data.leftTimes,self.data.maxTimes,DateUtil.ParseHHMMSSBySeconds(deltaTime).."秒")
else
self.useCount.text = string.format(ZhString.SkillTip_LeftValues,self.data.leftTimes,self.data.maxTimes)
end
end
function SkillTip:GetCD(skillData)
self.skillInfo = Game.LogicManager_Skill:GetSkillInfo(skillData.id)
local strArr = {}
local str = ""
local range = self:GetSkillParam(skillData,"Launch_Range",nil,self.skillInfo.GetLaunchRange,ZhString.SkillTip_LaunchRange)
if(range) then
strArr[#strArr+1] = range
end
strArr[#strArr+1] = self:GetCastTime(skillData)
--CD時間
local realcd = self.skillInfo:GetCD(self:GetCreature())
if(realcd) then
if(skillData.Logic_Param and skillData.Logic_Param.real_cd) then
strArr[#strArr+1] = self:GetSkillParam(skillData,"Logic_Param","real_cd",self.skillInfo.GetLogicRealCD,ZhString.SkillTip_CDTime)
else
strArr[#strArr+1] = self:GetSkillParam(skillData,"CD",nil,self.skillInfo.GetCD,ZhString.SkillTip_CDTime)
end
end
--公共延遲
local realDelayCD = self.skillInfo:GetDelayCD(self:GetCreature())
if(realDelayCD) then
strArr[#strArr+1] = self:GetSkillParam(skillData,"DelayCD",nil,self.skillInfo.GetDelayCD,ZhString.SkillTip_DelayCDTime,nil)
end
local cost = self:GetCost(skillData)
if(cost~="") then
strArr[#strArr+1] = cost
end
for i=1,#strArr do
str = str..strArr[i]..(i~=#strArr and "\n" or "")
end
return str
end
function SkillTip:GetDynamicSkillInfo(id)
return self:GetCreature().data:GetDynamicSkillInfo(id)
end
local itemCostTmp = {}
function SkillTip:GetCost(skillData)
sb:Clear()
self.skillInfo = Game.LogicManager_Skill:GetSkillInfo(skillData.id)
local costStr
local spcost,hpcost
--sp
local realSp = self.skillInfo:GetSP(self:GetCreature())
if(realSp) then
spcost = self:GetSkillParam(skillData,"SkillCost","sp",self.skillInfo.GetSP,ZhString.SkillTip_SPCost,0)
end
if(spcost) then
sb:AppendLine(spcost)
end
--hp
local realHp = self.skillInfo:GetHP(self:GetCreature())
if(realHp) then
hpcost = self:GetSkillParam(skillData,"SkillCost","hp",self.skillInfo.GetHP,ZhString.SkillTip_HPCost,0)
end
if(hpcost) then
sb:AppendLine(hpcost)
end
local dynamicSkillInfo = self:GetDynamicSkillInfo(skillData.id)
local dynamicAllSkillInfo = SkillProxy.Instance:GetDynamicAllSkillInfo()
local isNoItem = dynamicAllSkillInfo ~= nil and dynamicAllSkillInfo:GetIsNoItem()
local costs = skillData.SkillCost
local needItem = ""
TableUtility.TableClear(itemCostTmp)
if(#costs>0) then
local item,buff
local specialCost
for i=1,#costs do
specialCost = costs[i]
if(specialCost.itemID) then
itemCostTmp[specialCost.itemID] = 1
needItem = self:_FormatItemCostDesc(needItem,specialCost.itemID,dynamicSkillInfo,specialCost.num,isNoItem)
end
if(specialCost.buffID) then
buff = Table_Buffer[specialCost.buffID]
if(buff) then
local msg
msg = string.format(ZhString.SkillTip_BuffCost.normal,buff.BuffName,specialCost.num)
if(needItem=="") then
needItem = msg
else
needItem = needItem..ZhString.SkillTip_NeedSpecialSplit..msg
end
end
end
end
if(dynamicSkillInfo~=nil) then
if(dynamicSkillInfo:HasItemCostChange()) then
for k,v in pairs(dynamicSkillInfo.costs) do
if(itemCostTmp[k]==nil) then
needItem = self:_FormatItemCostDesc(needItem,k,dynamicSkillInfo,0,isNoItem)
end
end
end
end
sb:AppendLine(string.format(ZhString.SkillTip_NeedSpecialCost,needItem))
elseif(dynamicSkillInfo~=nil) then
if(dynamicSkillInfo:HasItemCostChange()) then
local handled = false
for k,v in pairs(dynamicSkillInfo.costs) do
if(itemCostTmp[k]==nil) then
handled = true
needItem = self:_FormatItemCostDesc(needItem,k,dynamicSkillInfo,0,isNoItem)
end
end
if(handled) then
sb:AppendLine(string.format(ZhString.SkillTip_NeedSpecialCost,needItem))
end
end
end
sb:RemoveLast()
costStr = sb:ToString()
sb:Clear()
return costStr
end
function SkillTip:_FormatItemCostDesc(str,itemID,dynamicSkillInfo,originNum,isNoItem)
local item = Table_Item[itemID]
if(item) then
local changed = originNum
if isNoItem then
changed = 0
elseif dynamicSkillInfo then
changed = dynamicSkillInfo:GetItemNewCost(item.id,changed)
end
local msg
if(changed == originNum) then
msg = string.format(ZhString.SkillTip_ItemCost.normal,item.NameZh,originNum)
else
local delta = changed- originNum
if(delta<0) then
msg = ZhString.SkillTip_ItemCost.buff
else
msg = ZhString.SkillTip_ItemCost.debuff
delta = "+"..tostring(delta)
end
msg = string.format(msg,item.NameZh,originNum,delta)
end
if(str=="") then
str = msg
else
str = str..ZhString.SkillTip_NeedSpecialSplit..msg
end
end
return str
end
local roundOff = function (num, n)
if n > 0 then
local scale = math.pow(10, n-1)
return math.floor(num / scale + 0.5) * scale
elseif n < 0 then
local scale = math.pow(10, n)
return math.floor(num / scale + 0.5) * scale
elseif n == 0 then
return num
end
end
local fact = 1000
function SkillTip:_Float1(value,_fact)
-- helplog("_Float1",value)
local res = math.abs(value)
res = roundOff(res,1)/_fact
res = math.floor( res * 100 )/100
-- helplog("_Float1",res)
if(value<0) then
return -res
end
return res
end
--skillData:技能靜態數據Table_Skill ,orignParam:技能數據中得欄位名 ,fixFunc:計算公式函式要求兩個參數第一個為RoleAgent第二個為技能數據
--originZhString 預設數值的字串 , fixedZhString有修正數據的字串,floatX幾位小數預設1位小數
function SkillTip:GetSkillParam(skillData,orignParam1,orignParam2,fixFunc,originZhString,floatX)
local originValue = skillData[orignParam1]
if(floatX==nil) then
floatX = 1
end
local aroundZero = 1/(math.pow(10,floatX))
if(orignParam2 and originValue) then
originValue = originValue[orignParam2]
end
local realValue
if(fixFunc~=nil and self.calPropAffect) then
realValue = fixFunc(self.skillInfo,self:GetCreature())
else
realValue = originValue
end
if(originValue or realValue) then
originValue = originValue or 0
if(realValue>0 or originValue>0) then
if(floatX >0) then
originValue = roundOff(originValue,-3)
realValue = roundOff(realValue,-3)
end
local fixed = realValue-originValue
-- helplog(realValue,originValue,fixed)
if(originValue==realValue or math.abs(fixed)<aroundZero) then
return string.format(originZhString.normal,originValue)
else
fixed = realValue*fact-originValue*fact
local signal = ""
local msg = originZhString.buff
if(fixed<0 and (fixed/fact + originValue)<0) then
msg = originZhString.buff
--如果算出來的修正值為負數,並且修正值的絕對值比原值大,則修正值如下處理
fixed = -originValue
elseif(fixed>0) then
msg = originZhString.debuff
signal = "+"
end
return string.format(msg,originValue,signal, self:_Float1(fixed,fact))
end
end
end
return nil
end
function SkillTip:GetCastTime(skillData)
--吟唱時間(法系)
self.skillInfo = Game.LogicManager_Skill:GetSkillInfo(skillData.id)
local leadType = skillData.Lead_Type
if(leadType and leadType.type and leadType.type ==SkillCastType.Magic) then
local castTime = leadType.CCT + leadType.FCT
local realCastTime = self.skillInfo:GetCastInfo(self:GetCreature())
if(not self.calPropAffect) then
realCastTime = castTime
end
castTime = roundOff(castTime,-3)
realCastTime = roundOff(realCastTime,-3)
local delta = realCastTime-castTime
if(realCastTime==castTime or math.abs(delta)<0.1) then
return string.format(ZhString.SkillTip_CastTime.normal,castTime)
else
local signal = ""
local msg
delta = realCastTime*fact-castTime*fact
if(delta>0) then
msg = ZhString.SkillTip_CastTime.debuff
signal = "+"
else
msg = ZhString.SkillTip_CastTime.buff
end
return string.format(msg,castTime,signal,self:_Float1(delta,fact))
end
end
end
function SkillTip:Layout()
local label,lastLabel
lastLabel = self.labels[1]
local height = lastLabel.label.height
local pos
local labelHeight = height
local lastLabelHeight
for i=2,#self.labels do
if(self.labels[i-1].label.gameObject.activeSelf) then
lastLabel = self.labels[i-1]
pos = lastLabel.label.transform.localPosition
lastLabelHeight = labelHeight
end
label = self.labels[i]
if(label.label.gameObject.activeSelf) then
label.label.transform.localPosition = Vector3(pos.x,pos.y - lastLabelHeight - lastLabel.paddingY,pos.z)
labelHeight = label.label.height
if(label.label.text == "" or label.label.text == nil) then
labelHeight = 0
end
height = height + labelHeight + lastLabel.paddingY
end
end
return height
end
function SkillTip:OnEnter()
-- LeanTween.cancel(self.gameObject);
-- local colliders = GameObjectUtil.Instance:GetAllComponentsInChildren(self.gameObject, BoxCollider, true);
-- for k,v in pairs(colliders) do
-- v.enabled = false;
-- end
-- self.closecomp.enabled = false;
-- LeanTween.delayedCall (self.gameObject, 0.3, function ()
-- self.closecomp.enabled = true;
-- for k,v in pairs(colliders) do
-- v.enabled = true;
-- end
-- end):setDestroyOnComplete(true);
end
function SkillTip:OnExit()
self:_CheckSpecialModified()
-- LeanTween.cancel(self.gameObject);
return true;
end
function SkillTip:_CheckSpecialModified()
if(self.funcGO and self.funcGO.activeSelf) then
local _SkillOptionManager = Game.SkillOptionManager
if(self.funcCheck_opt == normalAtkCheck_opt) then
if(MyselfProxy.Instance.selectAutoNormalAtk~= self.funcCheck.activeSelf) then
if(self.funcCheck.activeSelf) then
ServiceNUserProxy.Instance:CallSetNormalSkillOptionUserCmd(1)
else
ServiceNUserProxy.Instance:CallSetNormalSkillOptionUserCmd(0)
end
end
elseif(self.funcCheck_opt == skillautoQueue_opt) then
local nowQueue = _SkillOptionManager:GetSkillOption_AutoQueue() == 0
if(nowQueue ~= self.funcCheck.activeSelf) then
if(self.funcCheck.activeSelf) then
_SkillOptionManager:SetSkillOption_AutoQueue(true)
else
_SkillOptionManager:SetSkillOption_AutoQueue(false)
end
end
end
if(self.data:GetEnableSpecialEffect()~=self.specialCheck.activeSelf) then
local currentBeingData = CreatureSkillProxy.Instance:GetSelectSkillBeingData()
ServiceSkillProxy.Instance:CallSelectRuneSkillCmd(self.data.id,0,self.specialCheck.activeSelf,currentBeingData and currentBeingData.id or 0)
end
if(self.data.staticData.id ~= 50066001) then
local cell = self:_GetSelectedSpecialCell()
if(cell and cell.data.id ~= self.data:GetSpecialID()) then
local currentBeingData = CreatureSkillProxy.Instance:GetSelectSkillBeingData()
ServiceSkillProxy.Instance:CallSelectRuneSkillCmd(self.data.id,cell.data.id,self.specialCheck.activeSelf,currentBeingData and currentBeingData.id or 0)
end
end
local cell = self:_GetSelectedOptionCell()
if(self.data.staticData.id == 50066001) then
if #cell>0 then
local index = 0
for i=0,6 do
_SkillOptionManager:SetSkillOption(self.funcOptions_opt+i, 0)
end
for i=1,#cell do
local id = cell[i].data.id
if(id > 0) then
_SkillOptionManager:SetSkillOption(self.funcOptions_opt+index, id)
index = index + 1
end
end
end
else
if cell and cell.data then
local id = cell.data.id
if id ~= _SkillOptionManager:GetSkillOption(self.funcOptions_opt) then
_SkillOptionManager:SetSkillOption(self.funcOptions_opt, id)
end
end
end
end
end
-- function SkillTip:SetPos(pos)
-- SkillTip.super.SetPos(self, pos);
-- self.grid:Reposition();
-- end
function SkillTip:DestroySelf()
GameObject.DestroyImmediate(self.gameObject)
end
function SkillTip:GetDesc(data)
local desc = ""
local config
for i=1,#data.Desc do
config = data.Desc[i]
if(Table_SkillDesc[config.id] and Table_SkillDesc[config.id].Desc)then
if(config.params) then
desc = desc..string.format(Table_SkillDesc[config.id].Desc,unpack(config.params))..(i~=#data.Desc and "\n" or "")
else
desc = desc..Table_SkillDesc[config.id].Desc..(i~=#data.Desc and "\n" or "")
end
end
end
return desc
end
local groupSpecials = {}
local debug = false
function SkillTip:HandleRunSpecials(selectID)
local ReusableTable = ReusableTable
-- helplog("sortID",self.data.sortID)
local sb
local specials = AstrolabeProxy.Instance:GetSkill_SpecialEffect(self.data.sortID)
if(specials) then
local config
local selectEnable
if(self.specialCheck) then
selectEnable = self.specialCheck.activeSelf
else
selectEnable = self.data:GetEnableSpecialEffect()
end
if(selectID==nil) then
local selectCell = self:_GetSelectedSpecialCell()
if(selectCell) then
selectID = selectCell.data.id
end
end
TableUtility.TableClear(groupSpecials)
local sameGrp
local notselect
for k,v in pairs(specials) do
config = Table_RuneSpecial[k]
if(config) then
if(config.Type~=3) then
notselect = not selectEnable or selectID~=k
if(sb==nil) then
sb = LuaStringBuilder.CreateAsTable()
end
if(config.Group==nil or config.Type == 2) then
self:_HandleSameSpecialEffect(sb,config,v,notselect)
else
sameGrp = groupSpecials[config.Group]
if(sameGrp==nil) then
sameGrp = ReusableTable.CreateArray()
groupSpecials[config.Group] = sameGrp
sameGrp[1] = config
sameGrp[2] = ReusableTable.CreateArray()
TableUtility.ArrayShallowCopy(sameGrp[2], config.SkillTipParm)
local params = sameGrp[2]
for i=1,#params do
params[i] = params[i] * v
end
else
local params = sameGrp[2]
for i=1,#params do
params[i] = params[i] + config.SkillTipParm[i] * v
end
end
end
end
end
end
for k,v in pairs(groupSpecials) do
if(sb==nil) then
sb = LuaStringBuilder.CreateAsTable()
end
self:_HandleSameGroupSpecialEffect(sb,v[1],v[2],notselect)
ReusableTable.DestroyArray(v[2])
ReusableTable.DestroyArray(v)
groupSpecials[k] = nil
end
if(debug) then
if(sb) then
sb:AppendLine("\n下面是舊的\n")
end
for k,v in pairs(specials) do
config = Table_RuneSpecial[k]
local Runetip = config.Runetip
if(Table_RuneSpecialDesc) then
Runetip = Table_RuneSpecialDesc[Runetip].Text
end
if(config) then
-- helplog(k,v)
if(sb==nil) then
sb = LuaStringBuilder.CreateAsTable()
end
if(config.Type==1) then
--永久
sb:AppendLine(config.RuneName.."")
sb:AppendLine(self:_GetRuneSpecialDes(Runetip,config.SkillTipParm,v))
elseif(config.Type == 2) then
--攜帶
if(not selectEnable or selectID~=k) then
sb:Append("[c][b2b2b2]")
end
sb:AppendLine(config.RuneName.."")
sb:AppendLine(self:_GetRuneSpecialDes(Runetip,config.SkillTipParm,v))
if(not selectEnable or selectID~=k) then
sb:Append("[-][/c]")
end
end
end
end
end
end
if(sb) then
sb:RemoveLast()
local str = sb:ToString()
-- helplog(str)
sb:Destroy()
return str
end
return nil
end
function SkillTip:_HandleSameSpecialEffect(sb,config,count,notselect)
local Runetip = config.Runetip
if(Table_RuneSpecialDesc) then
Runetip = Table_RuneSpecialDesc[Runetip].Text
end
if(config.Type==1) then
--永久
sb:AppendLine(config.RuneName.."")
sb:AppendLine(self:_GetRuneSpecialDes(Runetip,config.SkillTipParm,count))
elseif(config.Type == 2) then
--攜帶
if(notselect) then
sb:Append("[c][b2b2b2]")
end
sb:AppendLine(config.RuneName.."")
sb:AppendLine(self:_GetRuneSpecialDes(Runetip,config.SkillTipParm,count))
if(notselect) then
sb:Append("[-][/c]")
end
end
end
function SkillTip:_HandleSameGroupSpecialEffect(sb,config,params,notselect)
local Runetip = config.Runetip
if(Table_RuneSpecialDesc) then
Runetip = Table_RuneSpecialDesc[Runetip].Text
end
if(config.Type==1) then
--永久
sb:AppendLine(config.RuneName.."")
sb:AppendLine(string.format(Runetip,unpack(params)))
elseif(config.Type == 2) then
--攜帶
if(notselect) then
sb:Append("[c][b2b2b2]")
end
sb:AppendLine(config.RuneName.."")
sb:AppendLine(string.format(Runetip,unpack(params)))
if(notselect) then
sb:Append("[-][/c]")
end
end
end
local tmpParamArray = {}
function SkillTip:_GetRuneSpecialDes(str,param,count)
if(param) then
if(count==nil) then
count = 1
end
for i=1,#param do
tmpParamArray[i] = param[i] * count
end
str = string.format(str,unpack(tmpParamArray))
TableUtility.ArrayClear(tmpParamArray)
end
return str
end