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

345 lines
12 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.

FunctionSkillSimulate = class("FunctionSkillSimulate")
FunctionSkillSimulate.SimulateSkillPointChange = "FunctionSkillSimulate_SimulateSkillPointChange"
FunctionSkillSimulate.HasNoModifiedSkills = "FunctionSkillSimulate_HasNoModifiedSkills"
function FunctionSkillSimulate.Me()
if nil == FunctionSkillSimulate.me then
FunctionSkillSimulate.me = FunctionSkillSimulate.new()
end
return FunctionSkillSimulate.me
end
function FunctionSkillSimulate:ctor()
self:Reset()
end
function FunctionSkillSimulate:Reset()
self.skillCells = {}
self.professDatas = {}
self.modifiedSkillBySort = {}
self.isIsSimulating = false
self.totalPoints = 0
self.initTotalPoints = 0
end
function FunctionSkillSimulate:CancelSimulate()
self:Reset()
SimulateSkillProxy.Instance:RollBack()
end
function FunctionSkillSimulate:End()
self:Reset()
end
function FunctionSkillSimulate:GetModifiedSkills()
return TableUtil.HashToArray(self.modifiedSkillBySort)
end
function FunctionSkillSimulate:StartSimulate(skillCells,professDatas,totalPoints)
if(self.isIsSimulating) then return end
self.isIsSimulating = true
--初始化虛擬數據
SimulateSkillProxy.Instance:ReInit()
local skill
for i=1,#skillCells do
skill = skillCells[i]
self.skillCells[skill.data.sortID] = skill
end
local profess
if(professDatas) then
for i=1,#professDatas do
profess = professDatas[i]
self.professDatas[profess.data.profession] = profess
end
end
self:SetNewTotalPoints(totalPoints)
self:ScallAllDatas()
end
function FunctionSkillSimulate:SetNewTotalPoints(totalPoints)
if(not self.isIsSimulating) then return end
if(self.initTotalPoints==0) then
self.initTotalPoints = totalPoints
self.totalPoints = totalPoints
else
local delta = totalPoints - self.initTotalPoints
self.totalPoints = self.totalPoints + delta
self.initTotalPoints = totalPoints
end
end
--模擬器升級邏輯
function FunctionSkillSimulate:Upgrade(cell)
local breakEnable = SkillProxy.Instance:GetSkillCanBreak()
local simuateBreakEnable = SimulateSkillProxy.Instance:GetSkillCanBreak()
local canUsePoints = self.totalPoints
if(not breakEnable and simuateBreakEnable) then
canUsePoints = 0
MsgManager.ShowMsgByIDTable(3432)
return false
end
local simulate = SimulateSkillProxy.Instance:GetSimulateSkill(cell.data.sortID)
local fitCost = simulate:FitNextSkillPointCost(canUsePoints)
if(fitCost) then
local myJobLevel = MyselfProxy.Instance:JobLevel()
local fitJobLv,needJobLv = simulate:FitNextJobLevel(myJobLevel)
if(fitJobLv) then
local upgradeSuccess,points = SimulateSkillProxy.Instance:UpgradeSkillBySortID(cell.data.sortID)
if(upgradeSuccess) then
self.totalPoints = self.totalPoints - points
cell:ShowDowngrade(true)
self:UpdateLevel(cell,simulate)
self.modifiedSkillBySort[simulate.sortID] = simulate.id
end
self:CheckCellState(cell,simulate)
self:UpdateProfess(cell.data.profession)
self:ScallAllDatas()
return true
else
--所需job等級不足
MsgManager.ShowMsgByIDTable(603,{Table_Class[simulate.profession].NameZh,Occupation.GetFixedJobLevel(needJobLv,simulate.profession)})
end
else
--所剩技能點不足
MsgManager.ShowMsgByIDTable(604)
end
return false
end
function FunctionSkillSimulate:CheckCellState(cell,simulate)
simulate = simulate or SimulateSkillProxy.Instance:GetSimulateSkill(cell.data.sortID)
cell:EnableGray(not simulate.data.learned)
end
function FunctionSkillSimulate:UpdateProfess(pro)
local profess = SimulateSkillProxy.Instance:GetSimulateProfess(pro)
if(profess) then
local data = self.professDatas[pro]
data.points = profess.points
-- cell:SetPoints(profess.points)
-- local nextProfess = SimulateSkillProxy.Instance:GetSimulateProfessNext(pro)
-- if(nextProfess) then
-- local nextCell = self.professCells[nextProfess.id]
-- if(nextCell) then
-- nextCell:ShowEnable(nextProfess.active)
-- end
-- end
end
end
function FunctionSkillSimulate:HasModifiedSkill()
for k,v in pairs(self.modifiedSkillBySort) do
return true
end
return false
end
--截止到profess所用的技能點數
function FunctionSkillSimulate:_GetSkillPointsUptoProfess(profess)
local point = 0
local proxy = SimulateSkillProxy.Instance
local count = 0
while(profess and count<=5) do
count = count + 1
point = point + profess.points
profess = proxy:GetSimulateProfessPrevious(profess.id)
end
return point
end
--模擬器降級邏輯
function FunctionSkillSimulate:Downgrade(cell)
local proxy = SimulateSkillProxy.Instance
local simulate = proxy:GetSimulateSkill(cell.data.sortID)
--檢查是否有後續技能,有的話,則保證等級大於等於它需要的
if(simulate.unlockSimulateData and simulate.unlockSimulateData.learned) then
if(simulate.id==simulate.unlockSimulateData.sourceSkill.requiredSkillID) then
MsgManager.ShowMsgByIDTable(607,{simulate.unlockSimulateData.data.staticData.NameZh})
return false
end
end
--下個職業的技能已加點的話本職業點數必須至少40點
local profess = proxy:GetSimulateProfess(cell.data.profession)
if(profess) then
local nextProfess = proxy:GetSimulateProfessNext(cell.data.profession)
if(nextProfess) then
--找到第一個不滿足的後續職業技能
local foundNotFitPointsProfess
local uptoSkillPoints = self:_GetSkillPointsUptoProfess(profess)
local unlockPoints = SkillProxy.UNLOCKPROSKILLPOINTS
local count = 0
local _UnlockExtraSkillPoints = GameConfig.Peak.UnlockExtraSkillPoints
while(foundNotFitPointsProfess == nil and nextProfess~=nil and count<=5) do
count = count + 1
local extraPoints = _UnlockExtraSkillPoints[nextProfess.index-1] or 0
if(nextProfess.active and nextProfess.points>0 and uptoSkillPoints <= (nextProfess.index-1)*unlockPoints + extraPoints) then
foundNotFitPointsProfess = proxy:GetSimulateProfessPrevious(nextProfess.id)
else
uptoSkillPoints = uptoSkillPoints + nextProfess.points
nextProfess = proxy:GetSimulateProfessNext(nextProfess.id)
end
end
if(foundNotFitPointsProfess) then
local professName = "[EBECA7]"
while nextProfess and nextProfess.points > 0 do
professName = professName..Table_Class[nextProfess.id].NameZh
nextProfess = proxy:GetSimulateProfessNext(nextProfess.id)
if(nextProfess and nextProfess.points>0) then
professName = professName..","
end
end
professName = professName.."[-]"
MsgManager.ConfirmMsgByID( 606,function ()
self:ResetWholeSkillsAfterProfess(foundNotFitPointsProfess.id)
self:Downgrade(cell)
GameFacade.Instance:sendNotification(FunctionSkillSimulate.SimulateSkillPointChange)
end,nil,nil,professName)
return false
end
end
end
local downgradeSuccess,points = proxy:DowngradeSkillBySortID(cell.data.sortID)
if(downgradeSuccess) then
self.totalPoints = self.totalPoints - points
self.modifiedSkillBySort[simulate.sortID] = simulate.id
end
self:UpdateLevel(cell,simulate)
if(not proxy:HasPreviousSimulateSkillData(cell.data.sortID)) then
self.modifiedSkillBySort[simulate.sortID] = nil
cell:ShowDowngrade(false)
end
self:UpdateProfess(cell.data.profession)
self:CheckCellState(cell,simulate)
self:ScallAllDatas()
if(self:HasModifiedSkill()==false) then
GameFacade.Instance:sendNotification(FunctionSkillSimulate.HasNoModifiedSkills)
end
return true
end
function FunctionSkillSimulate:ResetWholeSkillsAfterProfess(pro)
local skillProxy = SkillProxy.Instance
local simulateSkillProxy = SimulateSkillProxy.Instance
local nextProfess = simulateSkillProxy:GetSimulateProfessNext(pro)
local simulate
local professSkills
local skill
local cell
local downgradeSuccess,downgradeLevel
while nextProfess~=nil and nextProfess.points >0 do
professSkills = skillProxy:FindProfessSkill(nextProfess.id).skills
-- print("嘗試清除",nextProfess.id)
for i=1,#professSkills do
skill = professSkills[i]
if(self.modifiedSkillBySort[skill.sortID]~=nil) then
cell = self.skillCells[skill.sortID]
simulate = simulateSkillProxy:GetSimulateSkill(cell.data.sortID)
if(cell) then
downgradeSuccess,downgradeLevel = SimulateSkillProxy.Instance:DowngradeSkillBySortID(cell.data.sortID,10000)
if(downgradeSuccess) then
-- print(cell.data.id,downgradeLevel)
self.totalPoints = self.totalPoints - downgradeLevel
self.modifiedSkillBySort[simulate.sortID] = nil
cell:ShowDowngrade(false)
end
self:UpdateLevel(cell,simulate)
self:CheckCellState(cell,simulate)
end
end
end
self:UpdateProfess(nextProfess.id)
nextProfess = simulateSkillProxy:GetSimulateProfessNext(nextProfess.id)
end
self:ScallAllDatas()
GameFacade.Instance:sendNotification(FunctionSkillSimulate.SimulateSkillPointChange)
end
function FunctionSkillSimulate:UpdateLevel(cell,simulate,breakEnable)
if(simulate.id ~= simulate.sourceSkill.id or simulate.learned~=simulate.sourceSkill.learned) then
cell:SetLevel(Table_Skill[simulate.id].Level,"54B30A",breakEnable)
cell:SetDragEnable(true)
else
if(simulate.learned) then
cell:SetDragEnable(true)
cell:SetLevel(Table_Skill[simulate.id].Level,nil,breakEnable)
else
cell:SetDragEnable(false)
cell:SetLevel(0,nil,breakEnable)
end
end
end
--條件有4個。1滿足job等級2滿足前置技能的解鎖條件3滿足技能點數4滿足前置職業40點需求
function FunctionSkillSimulate:ScallAllDatas()
local myJobLevel = MyselfProxy.Instance:JobLevel()
local professes = SkillProxy.Instance.professionSkills
local simulateProfesses = SimulateSkillProxy.Instance.simulateProfessSkillTab
local simulateSkills = SimulateSkillProxy.Instance.simulateSkillID
local cell = nil
local p
local fitJob,fitRequiredSkill,hasPoint,pActive
local realSimulate = self.totalPoints~=self.initTotalPoints
local canUsePoints = self.totalPoints
local breakEnable = SkillProxy.Instance:GetSkillCanBreak()
local newBreakEnable = MyselfProxy.Instance:HasJobNewBreak()
local simuateBreakEnable = SimulateSkillProxy.Instance:GetSkillCanBreak()
if(not breakEnable and simuateBreakEnable) then
canUsePoints = 0
end
for i=1,#professes do
p = simulateProfesses[professes[i].profession]
if(p.skills) then
-- print("技能個數",#p.skills)
pActive = p.active
for k,skill in pairs(p.skills) do
cell = self.skillCells[skill.data.sortID]
if(cell) then
fitJob = skill:FitNextJobLevel(myJobLevel)
fitRequiredSkill = skill:FitRequiredSkill()
hasPoint = skill:FitNextSkillPointCost(canUsePoints)
if(cell.data.breakMaxLevel>0)then
self:UpdateLevel(cell,skill,breakEnable or simuateBreakEnable)
end
if cell.data.breakNewMaxLevel > 0 then
self:UpdateLevel(cell,skill,newBreakEnable or self.isIsSimulating)
end
if(skill.learned) then
cell:EnableGray(false)
if(not breakEnable and simuateBreakEnable and skill.data.staticData.NextBreakID) then
cell:ShowPreview(true)
else
cell:ShowPreview(false)
cell:ShowUpgrade(skill:HasNextLevel())
end
if(not hasPoint or not fitJob or not skill:HasNextLevel()) then
if(realSimulate) then
cell:SetUpgradeEnable(false,breakEnable)
else
cell:SetNameBgEnable(false)
cell:ShowUpgrade(false)
end
else
cell:SetUpgradeEnable(true,breakEnable)
cell:SetNameBgEnable(true)
end
else
--未學習
if(fitJob and fitRequiredSkill and hasPoint and pActive) then
--全滿足,可學習
cell:ShowUpgrade(true)
cell:SetUpgradeEnable(true,breakEnable)
cell:EnableGray(false)
else
cell:ShowUpgrade(false)
cell:EnableGray(true)
end
end
--畫解鎖線
if(cell.requiredCell) then
cell.requiredCell:LinkUnlock(fitRequiredSkill)
end
end
end
end
end
end