345 lines
12 KiB
Plaintext
345 lines
12 KiB
Plaintext
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 |