Files
SL1900 00cf81046d Hotfix - 2.0.1.145
EN: 2.0.1.145
CN: 2.0.1.144
JP: 2.0.1.147
KR: 2.0.1.152
2026-10-30 12:30:00 +09:00

2872 lines
89 KiB
Lua

local SoldierLevelData = class("SoldierLevelData")
local SoldierAttrData = require("GameCore.Data.DataClass.Soldier.SoldierAttrData")
local FightPos = GameEnum.SoldierPositionType.FightPosition
local SupPos = GameEnum.SoldierPositionType.SupportPosition
local SPT = AllEnum.SoldierPositionType
local SlotToPosIndex = function(nSlot)
if nSlot == nil or nSlot == 0 then
return SPT.Other, 0
end
if 1 <= nSlot and nSlot <= 3 then
return SPT.Fight, nSlot
end
if 4 <= nSlot and nSlot <= 9 then
return SPT.Support, nSlot - 3
end
if 10 <= nSlot and nSlot <= 18 then
return SPT.Waiting, nSlot - 9
end
return SPT.Other, 0
end
local PosIndexToSlot = function(nPosType, nIndex)
if nPosType == SPT.Fight then
return nIndex
elseif nPosType == SPT.Support then
return nIndex + 3
elseif nPosType == SPT.Waiting then
return nIndex + 9
end
return 0
end
local SoldierEffectStatus = {InActive = "InActive", Active = "Active"}
local SoldierBuffAction = {
Sync = "Sync",
Add = "Add",
Remove = "Remove"
}
local SoldierBuffType = {
UnknownBuff = "UnknownBuff",
CardBuff = "CardBuff",
PartnerBuff = "PartnerBuff",
TechNodeBuff = "TechNodeBuff",
AbilityBuff = "AbilityBuff"
}
local SoldierBuffProgressType = {
UnknownProgress = "UnknownProgress",
StateProgress = "StateProgress",
CondProgress = "CondProgress"
}
local PRINT_CHESS_LOG = true
local CaseEnum = {
SelectCard = 1,
Shop = 2,
Fight = 3,
Battle = 4,
EventSettlementOfDispute = 6,
EventSettlementOfDisputeBattle = 7,
SelectBossAbility = 8,
CheckStage = 9,
StoryEventOfPersonality = 10,
StoryEventOfCostly = 11,
DeployOpt = 14,
ClientEvent = 15
}
local ClientCase = {
BattleResult = 1,
Settle = 2,
StageChange = 3,
CheckStagePanel = 4,
Ending = 5,
DiceResult = 6
}
local OpenSandTableServerCase = {
CaseEnum.SelectCard,
CaseEnum.Battle,
CaseEnum.EventSettlementOfDispute,
CaseEnum.EventSettlementOfDisputeBattle,
CaseEnum.SelectBossAbility,
CaseEnum.StoryEventOfCostly,
CaseEnum.StoryEventOfPersonality
}
local OpenSandTableClientCase = {
ClientCase.DiceResult
}
local mapEventConfig = {}
local SANDTABLE_SCENES = {
[1] = "Soldier_Sandtable_UI_01",
[2] = "Soldier_Sandtable_UI_02",
[3] = "Soldier_Sandtable_UI_03"
}
function SoldierLevelData:ctor()
self:BindEvent()
self:Clear()
end
function SoldierLevelData:Clear()
self.parent = nil
self.mapCases = {}
self.mapClientCases = {}
self.tbPendingRewards = {}
self.nLevelId = 0
self.nHp = 0
self.nBossTemplateId = 0
self.nGradeChallengeId = 0
self.nStageId = 0
self.nNodeId = 0
self.nNodeType = 0
self.tbNodeList = {}
self.tbDeployChess = {}
self.tbWaitingChess = {}
self.tbOtherChess = {}
self.nDeployVersion = 0
self.mapChessByUid = {}
self.mapSlotToUid = {}
self.tbOtherUids = {}
self.mapItems = {}
self.mapAllChess = {}
self.mapBuffs = {}
self.mapBuffProgress = {}
self.tbStrategyCards = nil
self.nLevel = 0
self.nMaxLevel = 0
self.nExp = 0
self.curBattle = nil
self.nWiningStreak = 0
self.nLosingStreak = 0
self.tbPartnerTrace = {}
self.tbServerPartner = {}
self.tbActivePartner = {}
self.mapExtraPartnerTag = {}
self.mapEffects = {}
self.tbClientEffects = {}
self.mapExtraEffectState = {
nHarvest = 0,
nInterestLimit = 0,
nCardReRoll = 0
}
self.tbDiscAddEffect = {}
self.bOpenSandTable = true
self.sSandtableSceneName = nil
self.bSuppressEnterAnim = false
self.bReconnectInBattle = false
self.fnPanelReadyOnce = nil
self.sLastTimelineScene = nil
end
function SoldierLevelData:BindEvent()
if type(mapEventConfig) ~= "table" then
return
end
for nEventId, sCallbackName in pairs(mapEventConfig) do
local callback = self[sCallbackName]
if type(callback) == "function" then
EventManager.Add(nEventId, self, callback)
end
end
end
function SoldierLevelData:UnBindEvent()
if type(mapEventConfig) ~= "table" then
return
end
for nEventId, sCallbackName in pairs(mapEventConfig) do
local callback = self[sCallbackName]
if type(callback) == "function" then
EventManager.Remove(nEventId, self, callback)
end
end
end
function SoldierLevelData:_RebuildFromNewDeploy(deploy)
self.mapChessByUid = {}
self.mapSlotToUid = {}
self.tbOtherUids = {}
if deploy == nil then
self.nDeployVersion = 0
return
end
self.nDeployVersion = deploy.Version or 0
if deploy.Chess == nil then
return
end
for _, chess in ipairs(deploy.Chess) do
local nUid = chess.UID
local nSlot = chess.Slot or 0
self.mapChessByUid[nUid] = {
nTid = chess.Tid,
nStar = chess.Star,
nSlot = nSlot
}
if nSlot == 0 then
table.insert(self.tbOtherUids, nUid)
else
self.mapSlotToUid[nSlot] = nUid
end
end
end
function SoldierLevelData:_DeriveDeployView()
local tbView = {}
for nSlot = 1, 9 do
local nPosType, nIndex = SlotToPosIndex(nSlot)
local nUid = self.mapSlotToUid[nSlot]
local entry = {
nPositionType = nPosType,
nIndex = nIndex,
nUid = 0,
nId = 0,
nStar = 0
}
if nUid ~= nil then
local chess = self.mapChessByUid[nUid]
if chess ~= nil then
entry.nUid = nUid
entry.nId = chess.nTid
entry.nStar = chess.nStar
end
end
table.insert(tbView, entry)
end
return tbView
end
function SoldierLevelData:_DeriveWaitingView()
local tbView = {}
for nSlot = 10, 18 do
local _, nIndex = SlotToPosIndex(nSlot)
local nUid = self.mapSlotToUid[nSlot]
local entry = {
nIndex = nIndex,
nUid = 0,
nId = 0,
nStar = 0
}
if nUid ~= nil then
local chess = self.mapChessByUid[nUid]
if chess ~= nil then
entry.nUid = nUid
entry.nId = chess.nTid
entry.nStar = chess.nStar
end
end
table.insert(tbView, entry)
end
return tbView
end
function SoldierLevelData:_DeriveOtherView()
local tbView = {}
local mapAgg = {}
for _, nUid in ipairs(self.tbOtherUids) do
local chess = self.mapChessByUid[nUid]
if chess ~= nil then
local sKey = tostring(chess.nTid) .. "_" .. tostring(chess.nStar)
local agg = mapAgg[sKey]
if agg == nil then
agg = {
nId = chess.nTid,
nStar = chess.nStar,
nCount = 0
}
mapAgg[sKey] = agg
table.insert(tbView, agg)
end
agg.nCount = agg.nCount + 1
end
end
return tbView
end
function SoldierLevelData:_DeriveAllChessView()
local tbView = {}
local mapAgg = {}
for _, chess in pairs(self.mapChessByUid) do
local sKey = tostring(chess.nTid) .. "_" .. tostring(chess.nStar)
local agg = mapAgg[sKey]
if agg == nil then
agg = {
nId = chess.nTid,
nStar = chess.nStar,
nCount = 0
}
mapAgg[sKey] = agg
table.insert(tbView, agg)
end
agg.nCount = agg.nCount + 1
end
return tbView
end
function SoldierLevelData:_BuildHarvestEvent(nHarvest)
local tbEvents = {}
if 0 < nHarvest then
tbEvents = {
List = {
{
Id = GameEnum.soldierBuffEffect.ClientEffectHarvest,
Data = {nHarvest}
}
}
}
end
return tbEvents
end
function SoldierLevelData:Init(parent, mapSoldierInfo, mapChange, bFreshStart)
self:Clear()
self.parent = parent
if mapSoldierInfo == nil or mapSoldierInfo.Meta == nil then
printError("[Soldier] 服务器下发的SoldierInfo为空!!!")
return
end
self.nLevelId = mapSoldierInfo.Meta.Id
self.nHp = mapSoldierInfo.Meta.Hp
self.nWiningStreak = mapSoldierInfo.Meta.WinningStreak
self.nLosingStreak = mapSoldierInfo.Meta.LosingStreak
self.nLevel = mapSoldierInfo.Meta.ShopLevel
self.nExp = mapSoldierInfo.Meta.ShopExp
self.tbPartnerTrace = mapSoldierInfo.Meta.TracePartnerTypes
self.nBossTemplateId = 0
if mapSoldierInfo.Node == nil then
printError("[Soldier] 服务器下发的 SoldierNode 为空!!!")
return
end
local mapData = self.parent:GetCurChallengeData()
if mapData ~= nil then
self.nGradeChallengeId = mapData.nGradeChallengeId
end
if self.nMaxLevel == 0 then
local foreachShopLevel = function(mapData)
if self.nMaxLevel < mapData.Level then
self.nMaxLevel = mapData.Level
end
end
ForEachTableLine(ConfigTable.Get("SoldierShopLevel"), foreachShopLevel)
end
self:UpdateNodeInfo(mapSoldierInfo.Node.Data, nil, not bFreshStart)
self:ClearServerCase()
if mapSoldierInfo.Cases ~= nil then
for _, v in ipairs(mapSoldierInfo.Cases) do
self:DispatchServerCase(v)
end
end
local tbChange = {}
if mapChange ~= nil then
self:UpdateChangeInfo(mapChange, tbChange, nil)
end
local tbSteps = tbChange.tbChessChangeStep
local nCoin = tbChange.itemChange and tbChange.itemChange[AllEnum.CoinItemId.SoldierCurrency] or nil
local bHasSteps = tbSteps ~= nil and 0 < #tbSteps
local bHasCoin = nCoin ~= nil and nCoin ~= 0
if mapChange == nil and mapSoldierInfo.Node.Data.NodeId == 0 then
local tbObtain = {}
local mapBag = mapSoldierInfo.Bag
if mapBag ~= nil and mapBag.Deploy ~= nil and mapBag.Deploy.Chess ~= nil then
for _, ch in ipairs(mapBag.Deploy.Chess) do
local nSlot = ch.Slot or 0
local nPos, nIndex = SlotToPosIndex(nSlot)
table.insert(tbObtain, {
nUid = ch.UID,
nSlot = nSlot,
nTid = ch.Tid,
nStar = ch.Star,
nId = ch.Tid,
nTargetType = nPos,
nIndex = nIndex
})
end
end
if 0 < #tbObtain then
tbSteps = {
{
tbConsume = {},
tbObtain = tbObtain,
tbUpdate = {}
}
}
bHasSteps = true
end
if mapBag ~= nil and mapBag.Res ~= nil then
for _, v in ipairs(mapBag.Res) do
if v.Tid == AllEnum.CoinItemId.SoldierCurrency and v.Qty ~= nil and v.Qty ~= 0 then
nCoin = v.Qty
bHasCoin = true
break
end
end
end
end
if (bHasSteps or bHasCoin) and self.mapCases[CaseEnum.Fight] == nil then
if bHasSteps then
tbSteps = self:_MergeApplyObtainSteps(tbSteps)
end
table.insert(self.tbPendingRewards, {
nType = AllEnum.SoldierRewardSource.Apply,
data = bHasCoin and {nCoin = nCoin} or {},
tbSteps = bHasSteps and tbSteps or {}
})
end
self:_RebuildFromNewDeploy(mapSoldierInfo.Bag.Deploy)
self.tbDeployChess = self:_DeriveDeployView()
self.tbWaitingChess = self:_DeriveWaitingView()
self.tbOtherChess = self:_DeriveOtherView()
self.mapAllChess = self:_DeriveAllChessView()
self:UpdatePartner(true)
self.mapItems = {}
if mapSoldierInfo.Bag.Res ~= nil then
for k, v in ipairs(mapSoldierInfo.Bag.Res) do
self.mapItems[v.Tid] = v.Qty
end
end
if mapSoldierInfo.Bag.Buffs ~= nil then
for _, v in ipairs(mapSoldierInfo.Bag.Buffs) do
self:UpdateBuff(v)
end
end
local bInitNodeList = false
if mapSoldierInfo.Effects ~= nil then
for _, v in ipairs(mapSoldierInfo.Effects) do
self:EffectPartnerAdditional(v.PartnerAdditional)
self:EffectPartnerActivateAdditional(v.PartnerActivateAdditional)
self:EffectNodeTypeModify(v.NodeTypeModify)
self:EffectClientAttr(v.ClientAttr)
self:EffectClientHarvest(v.ClientHarvest)
self:EffectInterest(v.Interest)
self:EffectCardReRoll(v.CardReRoll)
self:EffectDiceAddPoint(v.DiceAddPoint)
self:EffectTempFree(v.TempFree)
if v.NodeTypeModify ~= nil then
bInitNodeList = true
end
end
end
if not bInitNodeList then
self:UpdateNodeList()
end
if mapSoldierInfo.Progress ~= nil then
self:UpdateBuffProgress(mapSoldierInfo.Progress)
end
self.mapClientData = {
nLen = mapSoldierInfo.Meta.DataLen,
sData = mapSoldierInfo.Meta.ClientData,
nVersion = mapSoldierInfo.Meta.DataVersion
}
self:EnterSoldier()
return tbChange
end
function SoldierLevelData:GetSandtableSceneName()
return self.sSandtableSceneName
end
function SoldierLevelData:PreloadSandtableScene(callback)
local nStage = PlayerData.SoldierData:GetCurChallengeState()
local sScene = SANDTABLE_SCENES[nStage]
if sScene == nil then
printError("自走棋沙盘场景找不到!!!stage = " .. tostring(nStage))
self.sSandtableSceneName = nil
self.bSandtableSceneLoaded = false
if callback ~= nil then
callback()
end
return
end
if self.sSandtableSceneName == sScene and self.bSandtableSceneLoaded then
if callback ~= nil then
callback(true)
end
return
end
if self.sSandtableSceneName == sScene and not self.bSandtableSceneLoaded then
if callback ~= nil then
self.tbSandtableLoadCallbacks = self.tbSandtableLoadCallbacks or {}
table.insert(self.tbSandtableLoadCallbacks, callback)
end
return
end
self.sSandtableSceneName = sScene
self.bSandtableSceneLoaded = false
self.tbSandtableLoadCallbacks = {}
if callback ~= nil then
table.insert(self.tbSandtableLoadCallbacks, callback)
end
EventManager.Hit(EventId.BlockInput, true)
CS.MainMenuModuleHelper.GetActiveScene(sScene, function(bSuccess)
EventManager.Hit(EventId.BlockInput, false)
if self.sSandtableSceneName ~= sScene then
return
end
self.bSandtableSceneLoaded = true
local tbCbs = self.tbSandtableLoadCallbacks or {}
self.tbSandtableLoadCallbacks = {}
for _, cb in ipairs(tbCbs) do
cb(bSuccess)
end
end)
end
function SoldierLevelData:IsSandtableSceneLoaded()
return self.bSandtableSceneLoaded == true
end
function SoldierLevelData:UnloadSandtableScene()
if self.sSandtableSceneName == nil then
return
end
local sScene = self.sSandtableSceneName
self.sSandtableSceneName = nil
self.bSandtableSceneLoaded = false
self.tbSandtableLoadCallbacks = {}
CS.MainMenuModuleHelper.DeActiveScene(sScene, function()
end)
end
function SoldierLevelData:EnterSoldier()
local bFirstIn = self.nNodeId == 0
local bEnterBattle = self.mapCases[CaseEnum.Battle] ~= nil or self.mapCases[CaseEnum.EventSettlementOfDisputeBattle] ~= nil
if not bEnterBattle then
local func = function()
self:PreloadSandtableScene(function()
function self.fnPanelReadyOnce()
self:StartSoldierLevel()
end
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierSandtable, bFirstIn)
end)
end
EventManager.Hit(EventId.SetTransition, 54, func, self.nGradeChallengeId)
else
self:PreloadSandtableScene(function()
function self.fnPanelReadyOnce()
self:StartSoldierLevel()
end
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierSandtable, bFirstIn)
end)
end
end
function SoldierLevelData:Exit()
self:UnBindEvent()
if self.curBattle then
self.curBattle:Exit()
end
self:UnloadSandtableScene()
self:Clear()
end
function SoldierLevelData:ClearServerCase()
self.mapCases = {}
end
function SoldierLevelData:DispatchServerCase(case)
if case == nil then
return
end
if case.SelectCard then
self.mapCases[CaseEnum.SelectCard] = {}
self.mapCases[CaseEnum.SelectCard].nId = case.Id
self.mapCases[CaseEnum.SelectCard].tbCards = case.SelectCard.Ids
self.mapCases[CaseEnum.SelectCard].nRoll = case.SelectCard.ReRoll
elseif case.ShopCase then
self.mapCases[CaseEnum.Shop] = {}
self.mapCases[CaseEnum.Shop].nId = case.Id
self:_UpdateShopCaseData(case.ShopCase)
elseif case.FightCase then
self.mapCases[CaseEnum.Fight] = {}
self.mapCases[CaseEnum.Fight].nId = case.Id
elseif case.BattleCase then
self.mapCases[CaseEnum.Battle] = {}
self.mapCases[CaseEnum.Battle].nId = case.Id
self.mapCases[CaseEnum.Battle].nFloorId = case.BattleCase.FloorId
elseif case.EventSettlementOfDispute then
self.mapCases[CaseEnum.EventSettlementOfDispute] = {}
self.mapCases[CaseEnum.EventSettlementOfDispute].nId = case.Id
self.mapCases[CaseEnum.EventSettlementOfDispute].tbIds = case.EventSettlementOfDispute.Ids
elseif case.EventSettlementOfDisputeBattle then
self.mapCases[CaseEnum.EventSettlementOfDisputeBattle] = {}
self.mapCases[CaseEnum.EventSettlementOfDisputeBattle].nId = case.Id
self.mapCases[CaseEnum.EventSettlementOfDisputeBattle].nFloorId = case.EventSettlementOfDisputeBattle.FloorId
self.mapCases[CaseEnum.EventSettlementOfDisputeBattle].nEventId = case.EventSettlementOfDisputeBattle.BattleId
elseif case.SelectBossAbilityCase then
self.mapCases[CaseEnum.SelectBossAbility] = {}
self.mapCases[CaseEnum.SelectBossAbility].nId = case.Id
elseif case.CheckStageCase then
self.mapCases[CaseEnum.CheckStage] = {}
self.mapCases[CaseEnum.CheckStage].nId = case.Id
self.mapCases[CaseEnum.CheckStage].nFloorId = case.CheckStageCase.FloorId
self.mapClientCases[ClientCase.CheckStagePanel] = {}
elseif case.StoryEventOfPersonalityCase then
local mapCase = case.StoryEventOfPersonalityCase
local tbOptions = mapCase.Options and mapCase.Options.Options or {}
self.mapCases[CaseEnum.StoryEventOfPersonality] = {
nId = case.Id,
nPersonalityStoryId = mapCase.PersonalityStoryId,
tbOptions = tbOptions,
nIndex = mapCase.Index or 0,
nDicePoint = mapCase.DicePoint or 0,
bTwoDice = mapCase.TwoDice or false,
nPreOptionId = mapCase.PreOptionId or 0
}
elseif case.StoryEventOfCostlyCase then
local mapCase = case.StoryEventOfCostlyCase
local tbOptions = mapCase.Options and mapCase.Options.Options or {}
self.mapCases[CaseEnum.StoryEventOfCostly] = {
nId = case.Id,
nPersonalityStoryId = mapCase.PersonalityStoryId,
tbOptions = tbOptions,
nPreOptionId = mapCase.PreOptionId or 0
}
elseif case.DeployOptCase then
self.mapCases[CaseEnum.DeployOpt] = {}
self.mapCases[CaseEnum.DeployOpt].nId = case.Id
elseif case.ClientEventCase then
self.mapCases[CaseEnum.ClientEvent] = {}
self.mapCases[CaseEnum.ClientEvent].nId = case.Id
end
end
function SoldierLevelData:UpdatePartnerTrace(nPartnerType, bTrace)
local nIndex = table.indexof(self.tbPartnerTrace, nPartnerType)
if bTrace then
if nIndex == 0 then
table.insert(self.tbPartnerTrace, nPartnerType)
end
elseif 0 < nIndex then
table.remove(self.tbPartnerTrace, nIndex)
end
EventManager.Hit("SoldierPartnerTrace")
end
function SoldierLevelData:UpdateNodeList(nFromNodeType, nToNodeType)
nFromNodeType = nFromNodeType or 0
nToNodeType = nToNodeType or 0
local nStageId = self.nStageId == 0 and 1 or self.nStageId
self.tbNodeList = {}
local mapChallengeCfg = ConfigTable.GetData("SoldierGradeChallenge", self.nGradeChallengeId)
if mapChallengeCfg ~= nil then
local tbAllNodeList = CacheTable.GetData("_SoldierNodePlan", mapChallengeCfg.NodeGroupId)
if tbAllNodeList ~= nil then
for _, v in ipairs(tbAllNodeList) do
if v.Stage == nStageId then
local nNodeType = v.NodeType
local bNodeChange = false
if nNodeType == nFromNodeType then
bNodeChange = true
nNodeType = nToNodeType
end
table.insert(self.tbNodeList, {
nNodeId = v.Id,
nIndex = v.Index,
nNodeType = nNodeType,
bTypeChange = bNodeChange
})
end
end
table.sort(self.tbNodeList, function(a, b)
return a.nIndex < b.nIndex
end)
end
end
end
function SoldierLevelData:UpdateBuff(mapBuff)
if mapBuff == nil then
return
end
local nAction = mapBuff.Action
local nType = mapBuff.Type
local nBindId = mapBuff.BindId or 0
local nEffectGroup = mapBuff.EffectGroup or 0
local tbBuffUids = mapBuff.BuffIds or {}
if nAction == SoldierBuffAction.Add or nAction == SoldierBuffAction.Sync then
for nIdx, nBuffUid in ipairs(tbBuffUids) do
self.mapBuffs[nBuffUid] = {
nType = nType,
nBindId = nBindId,
nEffectGroup = nEffectGroup
}
end
if nType == SoldierBuffType.AbilityBuff then
self.nBossTemplateId = nBindId
end
elseif nAction == SoldierBuffAction.Remove then
for _, nBuffUid in ipairs(tbBuffUids) do
self.mapBuffs[nBuffUid] = nil
self.mapBuffProgress[nBuffUid] = nil
for nEid, info in pairs(self.mapEffects) do
if info.nBuffUid == nBuffUid then
self.mapEffects[nEid] = nil
self.tbClientEffects[nEid] = nil
end
end
end
if nType == SoldierBuffType.AbilityBuff then
self.nBossTemplateId = 0
end
end
if nType == SoldierBuffType.CardBuff then
self.tbStrategyCards = nil
EventManager.Hit("SoldierBuffCardChange")
end
end
function SoldierLevelData:UpdateBuffProgress(tbProgress)
if tbProgress == nil or #tbProgress == 0 then
return
end
for _, v in ipairs(tbProgress) do
local nBuffUid = v.BuffId
if v.Removed then
self.mapBuffProgress[nBuffUid] = nil
else
self.mapBuffProgress[nBuffUid] = {
nType = v.Type,
nCur = v.Cur or 0,
nMax = v.Max or 0
}
end
end
EventManager.Hit("SoldierBuffProgressUpdate")
end
function SoldierLevelData:GetShopWeight(tbRarityUp)
local tbWeightList = {}
local mapShopCfg = ConfigTable.GetData("SoldierShopLevel", self.nLevel)
if mapShopCfg ~= nil then
for i = 1, 5 do
local nWeight = mapShopCfg["Rarity" .. i]
local bDouble = false
if tbRarityUp ~= nil and 0 < tbRarityUp[i] then
nWeight = nWeight * 2
bDouble = true
end
table.insert(tbWeightList, {nWeight = nWeight, bDouble = bDouble})
end
end
return tbWeightList
end
function SoldierLevelData:_UpdateShopCaseData(mapShopData)
if mapShopData == nil then
return
end
self.nLevel = mapShopData.Level
self.nExp = mapShopData.Exp
if self.mapCases[CaseEnum.Shop] ~= nil then
local mapShop = {}
mapShop.tbGoods = mapShopData.Goods
mapShop.tbWeightList = self:GetShopWeight(mapShopData.RarityUp)
mapShop.bLock = mapShopData.Lock
mapShop.nFreeCount = mapShopData.Free + mapShopData.TempFree
mapShop.nReRollPrice = mapShopData.ReRollPrice
mapShop.bDisableRefresh = mapShopData.DisableRefresh
mapShop.bDisablePurchase = mapShopData.DisablePurchase
mapShop.nPurchaseExpPrice = mapShopData.PurchaseExpPrice
self.mapCases[CaseEnum.Shop].mapShop = mapShop
end
end
function SoldierLevelData:_UpdateServerPartnerLevel(nStatus, nType, nLevel)
if nStatus == SoldierEffectStatus.InActive then
if self.tbServerPartner[nType] ~= nil then
self.tbServerPartner[nType] = self.tbServerPartner[nType] - nLevel
end
elseif nStatus == SoldierEffectStatus.Active then
if self.tbServerPartner[nType] == nil then
self.tbServerPartner[nType] = 0
end
self.tbServerPartner[nType] = self.tbServerPartner[nType] + nLevel
end
if self.tbServerPartner[nType] ~= nil and self.tbServerPartner[nType] <= 0 then
self.tbServerPartner[nType] = nil
end
EventManager.Hit("SoldierPartnerUpdate")
end
function SoldierLevelData:EffectPartnerAdditional(mapMsgData)
if mapMsgData == nil then
return
end
self:_UpdateServerPartnerLevel(mapMsgData.Status, mapMsgData.PartnerType, mapMsgData.Additional)
end
function SoldierLevelData:EffectPartnerActivateAdditional(mapMsgData)
if mapMsgData == nil then
return
end
local tbAllPartner = SoldierAttrData.CalcActivePartners(self.tbDeployChess)
for _, info in ipairs(tbAllPartner) do
local mapCfg = ConfigTable.GetData("SoldierPartner", info.nId)
if mapCfg ~= nil then
local nPartnerType = mapCfg.PartnerType
self:_UpdateServerPartnerLevel(mapMsgData.Status, nPartnerType, mapMsgData.Additional)
end
end
end
function SoldierLevelData:EffectNodeTypeModify(mapMsgData)
if mapMsgData == nil then
return
end
local nFromNodeType = mapMsgData.FromNodeType
local nToNodeType = mapMsgData.ToNodeType
self:UpdateNodeList(nFromNodeType, nToNodeType)
end
function SoldierLevelData:EffectClientAttr(mapMsgData)
if mapMsgData == nil then
return
end
if mapMsgData.Status == SoldierEffectStatus.Active then
self.tbClientEffects[mapMsgData.Source.Id] = {
nTid = mapMsgData.Source.Tid,
nBuffUId = mapMsgData.Source.BuffId,
tbValues = mapMsgData.Values
}
elseif mapMsgData.Status == SoldierEffectStatus.InActive then
self.tbClientEffects[mapMsgData.Source.Id] = nil
end
end
function SoldierLevelData:EffectClientHarvest(mapMsgData)
if mapMsgData == nil then
return
end
local nDelta = mapMsgData.Count or 0
if mapMsgData.Status == SoldierEffectStatus.Active then
self.mapExtraEffectState.nHarvest = self.mapExtraEffectState.nHarvest + nDelta
elseif mapMsgData.Status == SoldierEffectStatus.InActive then
self.mapExtraEffectState.nHarvest = self.mapExtraEffectState.nHarvest - nDelta
end
end
function SoldierLevelData:EffectInterest(mapMsgData)
if mapMsgData == nil then
return
end
local nDelta = mapMsgData.Limit or 0
if mapMsgData.Status == SoldierEffectStatus.Active then
self.mapExtraEffectState.nInterestLimit = self.mapExtraEffectState.nInterestLimit + nDelta
elseif mapMsgData.Status == SoldierEffectStatus.InActive then
self.mapExtraEffectState.nInterestLimit = self.mapExtraEffectState.nInterestLimit - nDelta
end
end
function SoldierLevelData:EffectCardReRoll(mapMsgData)
if mapMsgData == nil then
return
end
local nDelta = mapMsgData.Count or 0
if mapMsgData.Status == SoldierEffectStatus.Active then
self.mapExtraEffectState.nCardReRoll = self.mapExtraEffectState.nCardReRoll + nDelta
elseif mapMsgData.Status == SoldierEffectStatus.InActive then
self.mapExtraEffectState.nCardReRoll = self.mapExtraEffectState.nCardReRoll - nDelta
end
end
function SoldierLevelData:EffectDiceAddPoint(mapMsgData)
if mapMsgData == nil then
return
end
if mapMsgData.Status == SoldierEffectStatus.Active then
self.tbDiscAddEffect[mapMsgData.Source.Id] = {
nTid = mapMsgData.Source.Tid,
nBuffUId = mapMsgData.Source.BuffId,
nPoint = mapMsgData.Point
}
elseif mapMsgData.Status == SoldierEffectStatus.InActive then
self.tbDiscAddEffect[mapMsgData.Source.Id] = nil
end
end
function SoldierLevelData:EffectTempFree(mapMsgData)
if mapMsgData == nil then
return
end
if self.mapCases[CaseEnum.Shop] ~= nil then
if mapMsgData.Status == SoldierEffectStatus.InActive then
self.mapCases[CaseEnum.Shop].mapShop.nFreeCount = self.mapCases[CaseEnum.Shop].mapShop.nFreeCount - mapMsgData.Free
elseif mapMsgData.Status == SoldierEffectStatus.Active then
self.mapCases[CaseEnum.Shop].mapShop.nFreeCount = self.mapCases[CaseEnum.Shop].mapShop.nFreeCount + mapMsgData.Free
end
end
end
function SoldierLevelData:EffectShopRefreshState(mapMsgData)
if mapMsgData == nil then
return
end
if self.mapCases[CaseEnum.Shop] ~= nil then
self.mapCases[CaseEnum.Shop].mapShop.bDisableRefresh = mapMsgData.DisableRefresh
end
end
function SoldierLevelData:EffectShopPurchaseState(mapMsgData)
if mapMsgData == nil then
return
end
if self.mapCases[CaseEnum.Shop] ~= nil then
self.mapCases[CaseEnum.Shop].mapShop.bDisablePurchase = mapMsgData.DisablePurchase
end
end
function SoldierLevelData:EffectShopFreeState(mapMsgData)
if mapMsgData == nil then
return
end
if self.mapCases[CaseEnum.Shop] ~= nil then
if mapMsgData.Status == SoldierEffectStatus.InActive then
self.mapCases[CaseEnum.Shop].mapShop.nFreeCount = self.mapCases[CaseEnum.Shop].mapShop.nFreeCount - mapMsgData.Free
elseif mapMsgData.Status == SoldierEffectStatus.Active then
self.mapCases[CaseEnum.Shop].mapShop.nFreeCount = self.mapCases[CaseEnum.Shop].mapShop.nFreeCount + mapMsgData.Free
end
end
end
function SoldierLevelData:EffectShopRarity(mapMsgData)
if mapMsgData == nil then
return
end
if self.mapCases[CaseEnum.Shop] ~= nil then
local tbWeightList = self.mapCases[CaseEnum.Shop].mapShop.tbWeightList
for k, v in ipairs(tbWeightList) do
if k == mapMsgData.Rarity then
if mapMsgData.Status == SoldierEffectStatus.Active then
if not v.bDouble then
v.bDouble = true
v.nWeight = v.nWeight * 2
end
elseif mapMsgData.Status == SoldierEffectStatus.InActive and v.bDouble then
v.bDouble = false
v.nWeight = v.nWeight * 0.5
end
end
end
end
end
function SoldierLevelData:EffectShopPurchaseExpDiscount(mapMsgData)
if mapMsgData == nil then
return
end
if self.mapCases[CaseEnum.Shop] ~= nil then
if mapMsgData.Status == SoldierEffectStatus.InActive then
self.mapCases[CaseEnum.Shop].mapShop.nPurchaseExpPrice = self.mapCases[CaseEnum.Shop].mapShop.nPurchaseExpPrice - mapMsgData.Discount
elseif mapMsgData.Status == SoldierEffectStatus.Active then
self.mapCases[CaseEnum.Shop].mapShop.nPurchaseExpPrice = self.mapCases[CaseEnum.Shop].mapShop.nPurchaseExpPrice + mapMsgData.Discount
end
end
end
function SoldierLevelData:EffectShowChess(mapMsgData)
if mapMsgData == nil then
return
end
if mapMsgData.Chess ~= nil and #mapMsgData.Chess > 0 then
self:CacheReward(AllEnum.SoldierRewardSource.EventBattle, {
tbChess = mapMsgData.Chess
})
end
end
function SoldierLevelData:EffectLeftmostChange(mapMsgData, tbChange)
if mapMsgData == nil then
return
end
local cached = self.mapChessByUid[mapMsgData.UID]
local nPosType = SPT.Other
if cached ~= nil then
nPosType = SlotToPosIndex(cached.nSlot)
end
local tbChess = {}
table.insert(tbChess, mapMsgData.Chess)
self:CacheReward(AllEnum.SoldierRewardSource.EventBattle, {tbChess = tbChess})
EventManager.Hit("SoldierLeftmostWaitingChessChange", nPosType, mapMsgData.Chess)
end
function SoldierLevelData:EffectBecomeAnother(mapMsgData, tbChange)
if mapMsgData == nil then
return
end
local nGoodsIndex = mapMsgData.GoodsIdx
local mapGoods = mapMsgData.Goods
if tbChange ~= nil then
tbChange.shopBecomeAnother = {nGoodsIndex = nGoodsIndex, mapGoods = mapGoods}
end
end
function SoldierLevelData:DisposalChessDeploy(mapTrans, param)
if mapTrans == nil then
return {}
end
local step = {
tbConsume = {},
tbObtain = {},
tbUpdate = {}
}
if mapTrans.Consume ~= nil then
for _, ch in ipairs(mapTrans.Consume) do
local nUid = ch.UID
local cached = self.mapChessByUid[nUid]
if cached ~= nil then
local nSlot = cached.nSlot
self.mapChessByUid[nUid] = nil
if nSlot == 0 then
for i, uid in ipairs(self.tbOtherUids) do
if uid == nUid then
table.remove(self.tbOtherUids, i)
break
end
end
else
self.mapSlotToUid[nSlot] = nil
end
local nPos, nIndex = SlotToPosIndex(nSlot)
table.insert(step.tbConsume, {
nUid = nUid,
nSlot = nSlot,
nTid = ch.Tid,
nStar = ch.Star,
nId = ch.Tid,
nSourceType = nPos,
nIndex = nIndex
})
else
self:PrintSoldier(string.format("[Soldier][Warn] Consume UID=%s 本地无记录", tostring(nUid)))
end
end
end
if mapTrans.Obtain ~= nil then
for _, ch in ipairs(mapTrans.Obtain) do
local nUid = ch.UID
local nSlot = ch.Slot or 0
self.mapChessByUid[nUid] = {
nTid = ch.Tid,
nStar = ch.Star,
nSlot = nSlot
}
if nSlot == 0 then
table.insert(self.tbOtherUids, nUid)
else
self.mapSlotToUid[nSlot] = nUid
end
local nPos, nIndex = SlotToPosIndex(nSlot)
table.insert(step.tbObtain, {
nUid = nUid,
nSlot = nSlot,
nTid = ch.Tid,
nStar = ch.Star,
nId = ch.Tid,
nTargetType = nPos,
nIndex = nIndex
})
end
end
if mapTrans.Update ~= nil then
for _, ch in ipairs(mapTrans.Update) do
local nUid = ch.UID
local nToSlot = ch.Slot or 0
local cached = self.mapChessByUid[nUid]
if cached ~= nil then
local nFromSlot = cached.nSlot
if nFromSlot == 0 then
for i, uid in ipairs(self.tbOtherUids) do
if uid == nUid then
table.remove(self.tbOtherUids, i)
break
end
end
elseif self.mapSlotToUid[nFromSlot] == nUid then
self.mapSlotToUid[nFromSlot] = nil
end
cached.nSlot = nToSlot
cached.nStar = ch.Star or cached.nStar
cached.nTid = ch.Tid or cached.nTid
if nToSlot == 0 then
table.insert(self.tbOtherUids, nUid)
else
self.mapSlotToUid[nToSlot] = nUid
end
local nFromPos, nFromIdx = SlotToPosIndex(nFromSlot)
local nToPos, nToIdx = SlotToPosIndex(nToSlot)
table.insert(step.tbUpdate, {
nUid = nUid,
nFromSlot = nFromSlot,
nToSlot = nToSlot,
nTid = cached.nTid,
nStar = cached.nStar,
nId = cached.nTid,
nSourceType = nFromPos,
nSourceIndex = nFromIdx,
nTargetType = nToPos,
nTargetIndex = nToIdx
})
else
self:PrintSoldier(string.format("[Soldier][Warn] Update UID=%s 本地无记录", tostring(nUid)))
end
end
end
return {step}
end
function SoldierLevelData:UpdatePartner(bInit)
local tbChangePartnerType = {}
local tbActivePartner = {}
local tbAllPartner = SoldierAttrData.CalcActivePartners(self.tbDeployChess, nil, self.tbServerPartner)
for _, info in ipairs(tbAllPartner) do
local nId = info.nId
local mapCfg = ConfigTable.GetData("SoldierPartner", nId)
if mapCfg ~= nil then
local nType = mapCfg.PartnerType
tbActivePartner[nType] = {
nId = nId,
nLevel = mapCfg.Level,
tbSoldiers = info.tbSoldiers or {}
}
if not bInit and (self.tbActivePartner[nType] == nil or self.tbActivePartner[nType] ~= nil and self.tbActivePartner[nType].nLevel < mapCfg.Level) then
tbChangePartnerType[nType] = {
nId = nId,
nLevel = mapCfg.Level
}
end
end
end
local bSetChanged = next(tbChangePartnerType) ~= nil
if not bInit and not bSetChanged and self.tbActivePartner ~= nil then
for nType, prevInfo in pairs(self.tbActivePartner) do
local curInfo = tbActivePartner[nType]
if curInfo == nil or curInfo.nId ~= prevInfo.nId or curInfo.nLevel ~= prevInfo.nLevel then
bSetChanged = true
break
end
end
end
self.tbActivePartner = tbActivePartner
if next(tbChangePartnerType) ~= nil then
self._tbPendingNewPartner = tbChangePartnerType
EventManager.Hit("SoldierPartnerNewActive", tbChangePartnerType)
end
if bSetChanged then
self._bPartnerSetChanged = true
end
self:UpdateExtraPartnerTag(tbAllPartner)
end
function SoldierLevelData:GetPendingNewPartner()
return self._tbPendingNewPartner
end
function SoldierLevelData:ClearPendingNewPartner()
self._tbPendingNewPartner = nil
end
function SoldierLevelData:HasPartnerSetChanged()
return self._bPartnerSetChanged == true
end
function SoldierLevelData:ClearPartnerSetChangedFlag()
self._bPartnerSetChanged = nil
end
function SoldierLevelData:UpdateExtraPartnerTag(tbAllPartner)
if tbAllPartner == nil then
tbAllPartner = {}
for _, info in pairs(self.tbActivePartner or {}) do
if info and info.nId then
table.insert(tbAllPartner, {
nId = info.nId,
tbSoldiers = info.tbSoldiers or {}
})
end
end
end
local mapByTid = SoldierAttrData.CalcExtraPartnerTags(self.tbDeployChess, tbAllPartner) or {}
local mapNew = {}
for _, entry in ipairs(self.tbDeployChess) do
if entry.nUid ~= 0 then
local tagInfo = mapByTid[entry.nId]
if tagInfo ~= nil and tagInfo.nPositionType == entry.nPositionType and tagInfo.nIndex == entry.nIndex then
mapNew[entry.nUid] = tagInfo
end
end
end
local bChanged = false
local mapOld = self.mapExtraPartnerTag or {}
for nUid, tbNew in pairs(mapNew) do
local tbOld = mapOld[nUid]
local tbNewTypes = tbNew.tbTypes or {}
if tbOld == nil or tbOld.nPositionType ~= tbNew.nPositionType or tbOld.nIndex ~= tbNew.nIndex or #(tbOld.tbTypes or {}) ~= #tbNewTypes then
bChanged = true
break
end
for i, nType in ipairs(tbNewTypes) do
if tbOld.tbTypes[i] ~= nType then
bChanged = true
break
end
end
if bChanged then
break
end
end
if not bChanged then
for nUid in pairs(mapOld) do
if mapNew[nUid] == nil then
bChanged = true
break
end
end
end
self.mapExtraPartnerTag = mapNew
if bChanged then
EventManager.Hit("SoldierExtraPartnerTagChange")
end
end
function SoldierLevelData:GetExtraPartnerTags(nUid)
if self.mapExtraPartnerTag == nil then
return nil
end
local info = self.mapExtraPartnerTag[nUid]
if info == nil then
return nil
end
return info.tbTypes
end
function SoldierLevelData:PrintSoldier(str)
if not NovaAPI.IsEditorPlatform() then
return
end
if not PRINT_CHESS_LOG then
return
end
if str then
print(str)
end
end
function SoldierLevelData:PrintChess(sTag)
if not NovaAPI.IsEditorPlatform() then
return
end
if not PRINT_CHESS_LOG then
return
end
sTag = sTag or ""
local COLOR_TITLE = "#FFFFFF"
local COLOR_ALL = "#FFD700"
local COLOR_DEPLOY = "#00FFFF"
local COLOR_WAITING = "#7CFC00"
local COLOR_OTHER = "#FF66FF"
local colorLine = function(sColor, sText)
return string.format("<color=%s>%s</color>", sColor, sText)
end
local getName = function(nId)
if nId == nil or nId == 0 then
return ""
end
local cfg = ConfigTable.GetData("SoldierCharacter", nId)
return cfg ~= nil and cfg.Name or "?"
end
local fmtSlot = function(nId, nStar)
if nId == 0 then
return "_"
end
return string.format("%s-%s星[%s]", tostring(nId), tostring(nStar), getName(nId))
end
local fmtStack = function(nId, nStar, nCount)
return string.format("%s-%s星[%s]-%s", tostring(nId), tostring(nStar), getName(nId), tostring(nCount))
end
print(colorLine(COLOR_TITLE, string.format("[Soldier][%s] ===== 棋子阵容 =====", sTag)))
local nFightCount = 0
for _, v in ipairs(self.tbDeployChess) do
if v.nPositionType == FightPos then
if 0 < v.nId then
nFightCount = nFightCount + 1
end
print(colorLine(COLOR_DEPLOY, string.format("[Soldier] 出战席-主控位[%s]: %s", tostring(v.nIndex), fmtSlot(v.nId, v.nStar))))
end
end
print(colorLine(COLOR_DEPLOY, string.format("[Soldier] 出战席-主控位 (总数=%d)", nFightCount)))
local nSupCount = 0
for _, v in ipairs(self.tbDeployChess) do
if v.nPositionType == SupPos then
if 0 < v.nId then
nSupCount = nSupCount + 1
end
print(colorLine(COLOR_DEPLOY, string.format("[Soldier] 出战席-支援位[%s]: %s", tostring(v.nIndex), fmtSlot(v.nId, v.nStar))))
end
end
print(colorLine(COLOR_DEPLOY, string.format("[Soldier] 出战席-支援位 (总数=%d)", nSupCount)))
local nWaitingCount = 0
for _, v in ipairs(self.tbWaitingChess) do
if 0 < v.nId then
nWaitingCount = nWaitingCount + 1
end
print(colorLine(COLOR_WAITING, string.format("[Soldier] 备战席[%s]: %s", tostring(v.nIndex), fmtSlot(v.nId, v.nStar))))
end
print(colorLine(COLOR_WAITING, string.format("[Soldier] 备战席 (总数=%d)", nWaitingCount)))
local nAllCount = 0
for i, v in ipairs(self.mapAllChess) do
nAllCount = nAllCount + v.nCount
print(colorLine(COLOR_ALL, string.format("[Soldier] 背包[%d]: %s", i, fmtStack(v.nId, v.nStar, v.nCount))))
end
print(colorLine(COLOR_ALL, string.format("[Soldier] 背包 (总数=%d)", nAllCount)))
local nOtherCount = 0
for i, v in ipairs(self.tbOtherChess) do
nOtherCount = nOtherCount + v.nCount
print(colorLine(COLOR_OTHER, string.format("[Soldier] Other[%d]: %s", i, fmtStack(v.nId, v.nStar, v.nCount))))
end
print(colorLine(COLOR_OTHER, string.format("[Soldier] Other (总数=%d)", nOtherCount)))
end
function SoldierLevelData:HandleCase()
for _, v in ipairs(OpenSandTableServerCase) do
if self.mapCases[v] ~= nil then
self.bOpenSandTable = true
break
end
end
for _, v in ipairs(OpenSandTableClientCase) do
if self.mapClientCases[v] ~= nil then
self.bOpenSandTable = true
break
end
end
if self.mapClientCases[ClientCase.DiceResult] ~= nil then
self:OpenDiceResult()
return
end
if self.mapClientCases[ClientCase.BattleResult] ~= nil then
self:BattleResult()
self.mapClientCases[ClientCase.BattleResult] = nil
return
end
if self.mapClientCases[ClientCase.Ending] ~= nil then
self:OpenSoldierEnding()
return
end
if self.mapClientCases[ClientCase.Settle] ~= nil then
self:SoldierSettle()
return
end
if self.mapClientCases[ClientCase.StageChange] ~= nil then
self:OpenStageChange()
return
end
if self.mapClientCases[ClientCase.CheckStagePanel] ~= nil then
self:OpenCheckStage()
return
end
if self.mapCases[CaseEnum.CheckStage] ~= nil then
self:EnterCheckStageCase()
return
end
if self.mapCases[CaseEnum.SelectBossAbility] ~= nil then
self:OpenBossAbilitySelect()
return
end
if self.mapCases[CaseEnum.SelectCard] ~= nil then
self:OpenStrategyCardSelect()
return
end
if self.mapCases[CaseEnum.Fight] ~= nil then
self:OpenSandTable()
return
end
if self.mapCases[CaseEnum.Battle] ~= nil then
self:EnterBattleCase()
return
end
if self.mapCases[CaseEnum.EventSettlementOfDispute] ~= nil then
self:OpenEventSelect()
return
end
if self.mapCases[CaseEnum.EventSettlementOfDisputeBattle] ~= nil then
self:EventSettlementOfDispute()
return
end
if self.mapCases[CaseEnum.StoryEventOfPersonality] ~= nil then
self:OpenStoryEventOfPersonality()
return
end
if self.mapCases[CaseEnum.StoryEventOfCostly] ~= nil then
self:OpenStoryEventOfCostly()
return
end
if self.mapCases[CaseEnum.ClientEvent] ~= nil then
return
end
end
function SoldierLevelData:StartSoldierLevel()
EventManager.Hit(EventId.SetTransition)
EventManager.Hit(EventId.BlockInput, true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
EventManager.Hit(EventId.BlockInput, false)
self:HandleCase()
end
cs_coroutine.start(wait)
end
function SoldierLevelData:OpenStrategyCardSelect()
self:PreloadSandtableScene(function()
EventManager.Hit("SoldierSandtableSceneReady")
end)
local mapCase = self:_GetCaseDataByType(CaseEnum.SelectCard)
if mapCase ~= nil then
if not PanelManager.CheckPanelOpen(PanelId.SoldierBattleEventPanel) then
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierBattleEventPanel, true)
end
EventManager.Hit("EnterCardSelect")
end
end
function SoldierLevelData:OpenEventSelect()
self:PreloadSandtableScene(function()
EventManager.Hit("SoldierSandtableSceneReady")
end)
local mapCase = self:_GetCaseDataByType(CaseEnum.EventSettlementOfDispute)
if mapCase ~= nil then
if not PanelManager.CheckPanelOpen(PanelId.SoldierBattleEventPanel) then
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierBattleEventPanel)
end
EventManager.Hit("EnterEventSelect")
end
end
function SoldierLevelData:_OpenSoldierStagePanel(bIsChallenge, data)
self:PreloadSandtableScene(function()
EventManager.Hit("SoldierSandtableSceneReady")
end)
local callback = function()
self:HandleCase()
end
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierStagePanel, bIsChallenge, data.nStageId, data.nCurNodeId, callback)
end
function SoldierLevelData:OpenStageChange()
local data = self.mapClientCases[ClientCase.StageChange]
self.mapClientCases[ClientCase.StageChange] = nil
self:_OpenSoldierStagePanel(false, data)
end
function SoldierLevelData:OpenDiceResult()
local data = self.mapClientCases[ClientCase.DiceResult]
self.mapClientCases[ClientCase.DiceResult] = nil
local fnOnClose = function()
self:HandleCase()
end
EventManager.Hit("SoldierPlayDiceResult", data, fnOnClose)
end
function SoldierLevelData:OpenCheckStage()
self.mapClientCases[ClientCase.CheckStagePanel] = nil
local data = {
nStageId = self.nStageId,
nCurNodeId = self.nNodeId
}
self:_OpenSoldierStagePanel(true, data)
end
function SoldierLevelData:EnterCheckStageCase()
local mapCase = self:_GetCaseDataByType(CaseEnum.CheckStage)
if mapCase == nil then
return
end
self:_EnterBattle(mapCase.nFloorId)
end
function SoldierLevelData:OpenBossAbilitySelect()
local fnConfirm = function(nAbilityId)
self:SendSelectBossAbility(nAbilityId)
end
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierBossTemplateSelect, fnConfirm)
end
function SoldierLevelData:OpenSandTable()
if self.bOpenSandTable then
self:PreloadSandtableScene(function()
EventManager.Hit("EnterStandTable")
end)
end
self.bOpenSandTable = false
end
function SoldierLevelData:BattleResult()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierPartnerTips)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharCardTips)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharSkillDetail)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharPontentialDetailPanel)
local nType = self.mapClientCases[ClientCase.BattleResult].nType
local tbDamage = self.mapClientCases[ClientCase.BattleResult].tbDamage
local tbChange = self.mapClientCases[ClientCase.BattleResult].tbChange
local tbCoinReward = self.mapClientCases[ClientCase.BattleResult].tbCoinReward
local bEventBattle = self.mapClientCases[ClientCase.BattleResult].bEventBattle
local mapData = {
tbDamage = tbDamage,
tbChange = tbChange,
tbCoinReward = tbCoinReward,
bEventBattle = bEventBattle
}
local callback = function()
EventManager.Hit(EventId.BlockInput, true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
EventManager.Hit(EventId.BlockInput, false)
self:HandleCase()
end
cs_coroutine.start(wait)
end
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierBattleResult, nType, mapData, callback)
if self.curBattle ~= nil then
self.curBattle:Exit()
self.curBattle = nil
end
end
function SoldierLevelData:OpenSoldierEnding()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierPartnerTips)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharCardTips)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharSkillDetail)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharPontentialDetailPanel)
local endingData = self.mapClientCases[ClientCase.Ending].data
self.mapClientCases[ClientCase.Ending] = nil
local callback = function()
EventManager.Hit(EventId.BlockInput, true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
EventManager.Hit(EventId.BlockInput, false)
self:HandleCase()
end
cs_coroutine.start(wait)
end
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierBattleEnding, endingData, callback)
end
function SoldierLevelData:SoldierSettle()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierPartnerTips)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharCardTips)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharSkillDetail)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierCharPontentialDetailPanel)
local settleData = self.mapClientCases[ClientCase.Settle]
local nType = settleData.nType
local mapData = {
tbSettle = settleData.tbSettle,
tbChess = settleData.tbChess,
tbDamage = settleData.tbDamage,
nBossTemplateId = settleData.nBossTemplateId,
nHp = settleData.nHp,
nCoin = settleData.nCoin,
tbCard = settleData.tbCard,
nGradeChallengeId = settleData.nGradeChallengeId
}
if PanelManager.CheckPanelOpen(PanelId.SoldierBattleResult) then
EventManager.Hit("SoldierChallengeEnd", nType, mapData)
else
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierBattleResult, nType, mapData)
end
EventManager.Hit(EventId.BlockInput, true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierSandtable)
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierBattleEventPanel)
EventManager.Hit(EventId.BlockInput, false)
end
cs_coroutine.start(wait)
if self.curBattle ~= nil then
self.curBattle:Exit()
self.curBattle = nil
end
if nType == AllEnum.SoldierResultType.ChallengeSuccess then
PlayerData.SoldierData:SetHighestChallengeId(self.nGradeChallengeId)
end
self.parent:SoldierLevelEnd(true)
end
function SoldierLevelData:GiveUp(netMsgData)
self.mapClientCases[ClientCase.Settle] = {
nType = AllEnum.SoldierResultType.ChallengeFail,
tbSettle = {
nPassedNode = netMsgData.PassedNode,
nRemainingHp = netMsgData.RemainingHp,
nCheckStageDps = netMsgData.CheckStageDps,
nCheckStageTime = netMsgData.CheckStageTime,
nChessTotalCost = netMsgData.ChessTotalCost,
nGetSchedule = netMsgData.GetSchedule,
nGetTechPoint = netMsgData.GetTechPoint,
nGetGradeExp = netMsgData.GetGradeExp,
nCurGradeChallengeId = netMsgData.CurGradeChallengeId,
nCurGradeExp = netMsgData.CurGradeExp,
nEndingId = netMsgData.EndingId,
nTotalCoinQty = netMsgData.TotalCoinQty
},
tbChess = self.tbDeployChess or {},
tbDamage = self.tbLastBattleDamage or {},
nBossTemplateId = self.nBossTemplateId or 0,
nHp = self:GetHp() or 0,
nCoin = self:GetItem(AllEnum.CoinItemId.SoldierCurrency) or 0,
tbCard = self:GetCardData() or {},
nGradeChallengeId = self.nGradeChallengeId or 0
}
self:HandleCase()
end
function SoldierLevelData:StepOut()
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierSandtable)
if self.curBattle ~= nil then
self.curBattle:Exit()
self.curBattle = nil
end
self.parent:SoldierLevelEnd(false)
end
function SoldierLevelData:_EnterBattle(nFloorId, nEventId)
self:UnloadSandtableScene()
if self.curBattle == nil then
self.curBattle = require("Game.Adventure.Soldier.SoldierBattle").new()
end
local nTemplateId = 0
local nAdjustmentGrade = 0
local mapChallengeCfg = ConfigTable.GetData("SoldierGradeChallenge", self.nGradeChallengeId)
if mapChallengeCfg ~= nil then
nTemplateId = nTemplateId + mapChallengeCfg.DiffcultyTemplateLv
nAdjustmentGrade = mapChallengeCfg.AdjustmentGrade
end
local tbCards = self:GetCardData()
local tbAddition = {}
local sConfig = ConfigTable.GetConfigValue("SoldierCardQualityAdjustGradeAdd")
if sConfig ~= nil then
local tbConfig = decodeJson(sConfig)
for k, v in pairs(tbConfig) do
tbAddition[tonumber(k)] = tonumber(v)
end
end
for _, v in ipairs(tbCards) do
local cfg = ConfigTable.GetData("SoldierStrategyCard", v.nId)
if cfg ~= nil and tbAddition[cfg.Rarity] ~= nil then
nAdjustmentGrade = nAdjustmentGrade + tbAddition[cfg.Rarity]
end
end
local mapNodeCfg = ConfigTable.GetData("SoldierNodePlan", self.nNodeId)
if mapNodeCfg ~= nil then
nTemplateId = nTemplateId + mapNodeCfg.DifficultyLevelAdd
end
if nEventId ~= nil and nEventId ~= 0 then
local mapEventPoolCfg = ConfigTable.GetData("SoldierEventBattlePool", nEventId)
if mapEventPoolCfg ~= nil then
nTemplateId = nTemplateId + mapEventPoolCfg.AddDifficult
end
end
self.curBattle:Init(self, self.tbDeployChess, nFloorId, self.nStageId, nTemplateId, nAdjustmentGrade, self.nBossTemplateId)
end
function SoldierLevelData:EnterBattleCase()
local mapBattleCase = self:_GetCaseDataByType(CaseEnum.Battle)
if mapBattleCase == nil then
return
end
self:_EnterBattle(mapBattleCase.nFloorId)
end
function SoldierLevelData:EventSettlementOfDispute()
local mapBattleCase = self:_GetCaseDataByType(CaseEnum.EventSettlementOfDisputeBattle)
if mapBattleCase == nil then
return
end
self:_EnterBattle(mapBattleCase.nFloorId, mapBattleCase.nEventId)
end
function SoldierLevelData:OpenStoryEventOfPersonality()
local mapCase = self:_GetCaseDataByType(CaseEnum.StoryEventOfPersonality)
if mapCase == nil then
return
end
self:PreloadSandtableScene(function()
EventManager.Hit("SoldierSandtableSceneReady")
end)
if mapCase.nIndex == 0 then
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierEventPanel)
else
local nIndex = mapCase.nIndex
local tbOptions = mapCase.tbOptions
local nSelectOptionId = tbOptions[nIndex].PersonalityOptionId
local mapPersonalityOption = ConfigTable.GetData("SoldierStoryPersonalityOption", nSelectOptionId)
if mapPersonalityOption ~= nil and mapPersonalityOption.CheckDimension ~= nil and 0 < mapPersonalityOption.CheckDimension and mapPersonalityOption.CheckDifficulty ~= nil and 0 < mapPersonalityOption.CheckDifficulty then
local nCheckDimension = mapPersonalityOption.CheckDimension
local nCheckDifficulty = mapPersonalityOption.CheckDifficulty
local mapBossCfg = ConfigTable.GetData("SoldierBossTemplate", self.nBossTemplateId or 0)
local tbPersonalityGrade = {}
if mapBossCfg ~= nil then
tbPersonalityGrade[GameEnum.SoldierRolePersonality.Personality_Intuition] = mapBossCfg.Personality_Intuition
tbPersonalityGrade[GameEnum.SoldierRolePersonality.Personality_Analysis] = mapBossCfg.Personality_Analysis
tbPersonalityGrade[GameEnum.SoldierRolePersonality.Personality_Chaos] = mapBossCfg.Personality_Chaos
end
local sPersonalityGrade = tbPersonalityGrade[nCheckDimension]
local nDimensionDifficulty = mapPersonalityOption.CheckDifficulty
local pram = {
nPersonalityType = nCheckDimension,
nDimensionLevel = nCheckDifficulty,
sPersonalityGrade = sPersonalityGrade,
nDimensionDifficulty = nDimensionDifficulty
}
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierResolveadisputePanel, pram)
end
end
EventManager.Hit("EnterEventSelect")
end
function SoldierLevelData:OpenStoryEventOfCostly()
local mapCase = self:_GetCaseDataByType(CaseEnum.StoryEventOfCostly)
if mapCase == nil then
return
end
self:PreloadSandtableScene(function()
EventManager.Hit("SoldierSandtableSceneReady")
end)
if PanelManager.CheckPanelOpen(PanelId.SoldierEventPanel) then
EventManager.Hit("RefreshStoryEventOfCostly")
else
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierEventPanel)
end
EventManager.Hit("EnterEventSelect")
end
function SoldierLevelData:BattleEnd(bResult, tbParam)
if self.mapCases[CaseEnum.Battle] == nil and self.mapCases[CaseEnum.EventSettlementOfDisputeBattle] == nil and self.mapCases[CaseEnum.CheckStage] == nil then
local nType = bResult and AllEnum.SoldierResultType.NodeSuccess or AllEnum.SoldierResultType.NodeFail
EventManager.Hit(EventId.OpenPanel, PanelId.SoldierBattleResult, nType, {
tbChange = {nHpChange = 0, nLevelChange = 0},
bEventBattle = false
})
self.curBattle:Exit()
self:Exit()
return
end
local nBattleTime = tbParam.nTime or 0
local tbDamage = tbParam.tbDamage or {}
local nCoin = tbParam.nCoin or 0
local nHarvest = tbParam.nHarvest or 0
local nAllDamage = tbParam.nAllDamage or 0
self.tbLastBattleDamage = tbDamage
if self.mapCases[CaseEnum.Battle] ~= nil then
if bResult then
self:SendBattleVictory(nBattleTime, tbDamage, nCoin, nHarvest)
else
self:SendBattleDefeat(tbDamage, nCoin, nHarvest)
end
elseif self.mapCases[CaseEnum.EventSettlementOfDisputeBattle] ~= nil then
if bResult then
self:SendEventSettlementOfDisputeBattleVictory(nBattleTime, tbDamage, nCoin, nHarvest)
else
self:SendEventSettlementOfDisputeBattleDefeat(tbDamage, nCoin, nHarvest)
end
elseif self.mapCases[CaseEnum.CheckStage] ~= nil then
local nDpsId, nTimeId = self.parent:GetCheckStageAddScoreId(nAllDamage, nBattleTime)
self:SendCheckStageSettle(nDpsId, nTimeId)
end
end
function SoldierLevelData:_MergeApplyObtainSteps(tbSteps)
if tbSteps == nil or #tbSteps <= 1 then
return tbSteps
end
local tbMerged = {}
local curMerge
local isPureObtain = function(step)
return (step.tbConsume == nil or #step.tbConsume == 0) and (step.tbUpdate == nil or #step.tbUpdate == 0) and step.tbObtain ~= nil and 0 < #step.tbObtain
end
for _, step in ipairs(tbSteps) do
if isPureObtain(step) then
if curMerge == nil then
curMerge = {
tbConsume = {},
tbObtain = {},
tbUpdate = {}
}
end
for _, ch in ipairs(step.tbObtain) do
table.insert(curMerge.tbObtain, ch)
end
else
if curMerge ~= nil then
table.insert(tbMerged, curMerge)
curMerge = nil
end
table.insert(tbMerged, step)
end
end
if curMerge ~= nil then
table.insert(tbMerged, curMerge)
end
return tbMerged
end
function SoldierLevelData:CacheReward(nType, data)
if data == nil or next(data) == nil then
return
end
if self.mapCases[CaseEnum.Fight] ~= nil then
return
end
local nTargetIdx
for i, v in ipairs(self.tbPendingRewards) do
if v.nType == nType then
v.data = v.data or {}
if data.tbChess ~= nil then
v.data.tbChess = v.data.tbChess or {}
for _, c in ipairs(data.tbChess) do
table.insert(v.data.tbChess, c)
end
end
if data.nCoin ~= nil then
v.data.nCoin = (v.data.nCoin or 0) + data.nCoin
end
nTargetIdx = i
break
end
end
if nTargetIdx == nil then
local newData = {}
if data.tbChess ~= nil and #data.tbChess > 0 then
newData.tbChess = {}
for _, c in ipairs(data.tbChess) do
table.insert(newData.tbChess, c)
end
end
if data.nCoin ~= nil then
newData.nCoin = data.nCoin
end
if next(newData) ~= nil then
table.insert(self.tbPendingRewards, {
nType = nType,
data = newData,
tbSteps = {}
})
nTargetIdx = #self.tbPendingRewards
end
end
if nTargetIdx ~= nil and self._tbTouchedRewardIdxes ~= nil then
local bExist = false
for _, idx in ipairs(self._tbTouchedRewardIdxes) do
if idx == nTargetIdx then
bExist = true
break
end
end
if not bExist then
table.insert(self._tbTouchedRewardIdxes, nTargetIdx)
end
end
return nTargetIdx
end
function SoldierLevelData:GetPendingReward()
local cache = clone(self.tbPendingRewards)
self.tbPendingRewards = {}
for _, entry in ipairs(cache) do
if entry.tbSteps ~= nil and #entry.tbSteps > 1 then
entry.tbSteps = self:_MergeApplyObtainSteps(entry.tbSteps)
end
end
return cache
end
function SoldierLevelData:_CheckBatchWipeContext(param, tbTransforms)
if tbTransforms == nil or #tbTransforms == 0 then
return false
end
if type(param) ~= "table" or not param.bFromCardSelect then
return false
end
for _, mapTrans in ipairs(tbTransforms) do
if mapTrans.Obtain ~= nil and 0 < #mapTrans.Obtain then
return false
end
end
return true
end
function SoldierLevelData:_NetOutPendingRewards(tbBatchConsume)
if tbBatchConsume == nil or #tbBatchConsume == 0 then
return
end
for _, c in ipairs(tbBatchConsume) do
local nUid = c.nUid
for i = #self.tbPendingRewards, 1, -1 do
local entry = self.tbPendingRewards[i]
local bRemoved = false
if entry.data ~= nil and entry.data.tbChess ~= nil then
for j, ch in ipairs(entry.data.tbChess) do
if ch.UID == nUid then
table.remove(entry.data.tbChess, j)
bRemoved = true
break
end
end
end
if bRemoved and entry.tbSteps ~= nil then
for stepIdx = #entry.tbSteps, 1, -1 do
local step = entry.tbSteps[stepIdx]
local bStepHit = false
if step.tbObtain ~= nil then
for k, o in ipairs(step.tbObtain) do
if o.nUid == nUid then
table.remove(step.tbObtain, k)
bStepHit = true
break
end
end
end
if bStepHit and (step.tbConsume == nil or #step.tbConsume == 0) and (step.tbObtain == nil or #step.tbObtain == 0) and (step.tbUpdate == nil or #step.tbUpdate == 0) then
table.remove(entry.tbSteps, stepIdx)
end
if bStepHit then
break
end
end
end
if bRemoved then
break
end
end
end
for i = #self.tbPendingRewards, 1, -1 do
local entry = self.tbPendingRewards[i]
local bDataEmpty = entry.data == nil or (entry.data.tbChess == nil or #entry.data.tbChess == 0) and (entry.data.nCoin == nil or entry.data.nCoin == 0)
local bNoSteps = entry.tbSteps == nil or #entry.tbSteps == 0
if bDataEmpty and bNoSteps then
table.remove(self.tbPendingRewards, i)
end
end
end
function SoldierLevelData:_GetCaseIdByType(nCaseType)
local mapCase = self:_GetCaseDataByType(nCaseType)
if mapCase ~= nil then
return mapCase.nId
end
end
function SoldierLevelData:_GetCaseDataByType(nCaseType)
local mapCase = self.mapCases[nCaseType]
if mapCase == nil then
traceback("[Soldier] Case为空!!! caseType = " .. tostring(nCaseType))
return nil
end
return mapCase
end
function SoldierLevelData:_SendInteract(mapMsgData, param, callback)
if mapMsgData == nil then
printError("[Soldier] _SendInteract 缺少 mapMsgData")
return
end
if mapMsgData.Id == nil or mapMsgData.Id == 0 then
printError("[Soldier] _SendInteract 缺少有效 Case Id")
return
end
local netCallback = function(_, netMsgData)
self:_OnInteract(netMsgData, param, callback)
end
HttpNetHandler.SendMsg(NetMsgId.Id.soldier_interact_req, mapMsgData, nil, netCallback)
end
function SoldierLevelData:SendMove(nUid, nSlot, callback)
if nUid == nil or self.mapChessByUid[nUid] == nil then
printError("[Soldier] SendMove 无效 UID: " .. tostring(nUid))
return
end
self:PrintSoldier(string.format("[Soldier]移动棋子 UID=%s -> Slot=%s", nUid, nSlot))
local nCaseId = self:_GetCaseIdByType(CaseEnum.DeployOpt)
self:_SendInteract({
Id = nCaseId,
DeploySyncReq = {
DeployVersion = self.nDeployVersion,
Move = {UID = nUid, Slot = nSlot}
}
}, nil, callback)
end
function SoldierLevelData:SendShopPurchase(nGoodsIndex, callback)
self:PrintSoldier("[Soldier]购买商品 -- " .. nGoodsIndex)
local nCaseId = self:_GetCaseIdByType(CaseEnum.Shop)
self:_SendInteract({
Id = nCaseId,
ShopReq = {Purchase = nGoodsIndex}
}, nil, callback)
end
function SoldierLevelData:SendShopSell(chessData, callback)
if chessData == nil then
return
end
local nUid = chessData.nUid
if (nUid == nil or nUid == 0) and chessData.nId ~= nil then
for _, nOtherUid in ipairs(self.tbOtherUids) do
local chess = self.mapChessByUid[nOtherUid]
if chess ~= nil and chess.nTid == chessData.nId and chess.nStar == chessData.nStar then
nUid = nOtherUid
break
end
end
end
if nUid == nil or nUid == 0 then
printError("[Soldier] SendShopSell 找不到棋子 UID")
return
end
local chess = self.mapChessByUid[nUid]
if chess == nil then
printError("[Soldier] SendShopSell UID 无对应棋子: " .. tostring(nUid))
return
end
self:PrintSoldier(string.format("[Soldier]出售棋子 -- UID=%s Tid=%s Star=%s Slot=%s", nUid, chess.nTid, chess.nStar, chess.nSlot))
local nCaseId = self:_GetCaseIdByType(CaseEnum.Shop)
local mapChess = {
UID = nUid,
Tid = chess.nTid,
Star = chess.nStar,
Slot = chess.nSlot
}
self:_SendInteract({
Id = nCaseId,
ShopReq = {Sell = mapChess}
}, {nUid = nUid}, callback)
end
function SoldierLevelData:SendShopRefresh(callback)
self:PrintSoldier("[Soldier]商店刷新")
local nCaseId = self:_GetCaseIdByType(CaseEnum.Shop)
self:_SendInteract({
Id = nCaseId,
ShopReq = {Refresh = true}
}, nil, callback)
end
function SoldierLevelData:SendShopBuyExp(callback)
self:PrintSoldier("[Soldier]购买经验")
local nCaseId = self:_GetCaseIdByType(CaseEnum.Shop)
self:_SendInteract({
Id = nCaseId,
ShopReq = {Upgrade = true}
}, nil, callback)
end
function SoldierLevelData:SendShopLock(bLock, callback)
self:PrintSoldier("[Soldier]商店锁定")
local nCaseId = self:_GetCaseIdByType(CaseEnum.Shop)
self:_SendInteract({
Id = nCaseId,
ShopReq = {Lock = bLock}
}, nil, callback)
end
function SoldierLevelData:SendFight(callback)
self:PrintSoldier("[Soldier]备战界面点出发")
local nCaseId = self:_GetCaseIdByType(CaseEnum.Fight)
self:_SendInteract({
Id = nCaseId,
FightReq = {}
}, nil, callback)
end
function SoldierLevelData:SendBattleVictory(nBattleTime, tbDamage, nCoin, nHarvest, callback)
self:PrintSoldier("[Soldier]节点胜利结算, 本场战斗获得金币数:" .. nCoin)
local nCaseId = self:_GetCaseIdByType(CaseEnum.Battle)
local tbEvents = self:_BuildHarvestEvent(nHarvest)
local tbVictoryData = {
DataLen = 1,
ClientData = "",
DataVersion = 1,
ChessSkillAddGold = nCoin,
Events = tbEvents,
Victory = {Time = nBattleTime}
}
local tbParam = {
nResultType = AllEnum.SoldierResultType.NodeSuccess,
tbDamage = tbDamage
}
self:_SendInteract({Id = nCaseId, BattleReq = tbVictoryData}, tbParam, callback)
end
function SoldierLevelData:SendBattleDefeat(tbDamage, nCoin, nHarvest, callback)
self:PrintSoldier("[Soldier]节点失败结算, 本场战斗获得金币数:" .. nCoin)
local nCaseId = self:_GetCaseIdByType(CaseEnum.Battle)
local tbEvents = self:_BuildHarvestEvent(nHarvest)
local tbDefeatData = {
DataLen = 1,
ClientData = "",
DataVersion = 1,
ChessSkillAddGold = nCoin,
Events = tbEvents,
Defeat = true
}
local tbParam = {
nResultType = AllEnum.SoldierResultType.NodeFail,
tbDamage = tbDamage
}
self:_SendInteract({Id = nCaseId, BattleReq = tbDefeatData}, tbParam, callback)
end
function SoldierLevelData:SendEventBattleChoose(nIndex, callback)
self:PrintSoldier("[Soldier]事件争端选择奖励 -- " .. nIndex)
local nCaseId = self:_GetCaseIdByType(CaseEnum.EventSettlementOfDispute)
self:_SendInteract({
Id = nCaseId,
EventSettlementOfDisputeReq = {Index = nIndex}
}, nil, callback)
end
function SoldierLevelData:SendEventSettlementOfDisputeBattleVictory(nBattleTime, tbDamage, nCoin, nHarvest, callback)
self:PrintSoldier("[Soldier]事件争端战斗胜利, 本场战斗获得金币数:" .. nCoin)
local nCaseId = self:_GetCaseIdByType(CaseEnum.EventSettlementOfDisputeBattle)
local tbEvents = self:_BuildHarvestEvent(nHarvest)
local tbVictoryData = {
DataLen = 1,
ClientData = "",
DataVersion = 1,
ChessSkillAddGold = nCoin,
Events = tbEvents,
Victory = {Time = nBattleTime}
}
local tbParam = {
nResultType = AllEnum.SoldierResultType.NodeSuccess,
tbDamage = tbDamage
}
self:_SendInteract({Id = nCaseId, EventSettlementOfDisputeBattleReq = tbVictoryData}, tbParam, callback)
end
function SoldierLevelData:SendEventSettlementOfDisputeBattleDefeat(tbDamage, nCoin, nHarvest, callback)
self:PrintSoldier("[Soldier]事件争端战斗失败, 本场战斗获得金币数:" .. nCoin)
local nCaseId = self:_GetCaseIdByType(CaseEnum.EventSettlementOfDisputeBattle)
local tbEvents = self:_BuildHarvestEvent(nHarvest)
local tbDefeatData = {
DataLen = 1,
ClientData = "",
DataVersion = 1,
ChessSkillAddGold = nCoin,
Events = tbEvents,
Defeat = true
}
local tbParam = {
nResultType = AllEnum.SoldierResultType.NodeFail,
tbDamage = tbDamage
}
self:_SendInteract({Id = nCaseId, EventSettlementOfDisputeBattleReq = tbDefeatData}, tbParam, callback)
end
function SoldierLevelData:SendCardSelect(nIndex, callback)
local mapCase = self.mapCases[CaseEnum.SelectCard]
if mapCase ~= nil then
local nCaseId = mapCase.nId
self:PrintSoldier("[Soldier]buff卡三选一 -- " .. nIndex)
self:_SendInteract({
Id = nCaseId,
SelectReq = {Index = nIndex}
}, {bFromCardSelect = true}, callback)
return
end
mapCase = self.mapCases[CaseEnum.StoryEventOfCostly]
if mapCase ~= nil then
local nCaseId = mapCase.nId
self:PrintSoldier("[Soldier]代价剧情三选一 -- " .. nIndex)
self:_SendInteract({
Id = nCaseId,
SelectReq = {Index = nIndex}
}, nil, callback)
end
end
function SoldierLevelData:SendCardSelectReRoll(callback)
self:PrintSoldier("[Soldier]开局buff卡重随")
local nCaseId = self:_GetCaseIdByType(CaseEnum.SelectCard)
self:_SendInteract({
Id = nCaseId,
SelectReq = {ReRoll = true}
}, nil, callback)
end
function SoldierLevelData:SendClientEvent(sClientData, nDataVersion)
local nCaseId = self:_GetCaseIdByType(CaseEnum.ClientEvent)
self:_SendInteract({
Id = nCaseId,
ClientEventReq = {
DataLen = #sClientData,
ClientData = sClientData,
DataVersion = nDataVersion
}
})
end
function SoldierLevelData:SendSelectBossAbility(nAbilityId, callback)
self:PrintSoldier("[Soldier]选择魔王能力 -- " .. tostring(nAbilityId))
local nCaseId = self:_GetCaseIdByType(CaseEnum.SelectBossAbility)
self:_SendInteract({
Id = nCaseId,
SelectBossAbilityReq = {AbilityId = nAbilityId}
}, nil, function(tbChange)
self.nBossTemplateId = nAbilityId
if callback then
callback(tbChange)
end
end)
end
function SoldierLevelData:SendCheckStageSettle(nDpsId, nTimeId, callback)
self:PrintSoldier(string.format("[Soldier]木桩关结算 DpsId=%s TimeId=%s", tostring(nDpsId), tostring(nTimeId)))
local nCaseId = self:_GetCaseIdByType(CaseEnum.CheckStage)
self:_SendInteract({
Id = nCaseId,
CheckStageSettleReq = {DpsId = nDpsId, TimeId = nTimeId}
}, nil, callback)
end
function SoldierLevelData:SendPartnerTrace(nPartnerType, bTrace, callback)
local netCallback = function(_, netMsgData)
self:UpdatePartnerTrace(nPartnerType, bTrace)
if callback then
callback()
end
end
local mapMsgData = {PartnerType = nPartnerType, Trace = bTrace}
HttpNetHandler.SendMsg(NetMsgId.Id.soldier_partner_trace_req, mapMsgData, nil, netCallback)
end
function SoldierLevelData:SendStoryEventSelect(nIndex, callback)
if self.mapCases[CaseEnum.StoryEventOfPersonality] ~= nil then
self:SendStoryEventOfPersonalityIndex(nIndex, callback)
return
end
if self.mapCases[CaseEnum.StoryEventOfCostly] ~= nil then
self:SendCardSelect(nIndex, callback)
return
end
end
function SoldierLevelData:SendStoryEventOfPersonalityIndex(nIndex, callback)
self:PrintSoldier("[Soldier]性格剧情选择选项 -- " .. tostring(nIndex))
local nCaseId = self:_GetCaseIdByType(CaseEnum.StoryEventOfPersonality)
self:_SendInteract({
Id = nCaseId,
StoryEventOfPersonalitySelectReq = {Index = nIndex}
}, nil, callback)
end
function SoldierLevelData:SendStoryEventOfPersonalityThrowDice(callback)
self:PrintSoldier("[Soldier]性格剧情掷骰子")
local nCaseId = self:_GetCaseIdByType(CaseEnum.StoryEventOfPersonality)
self:_SendInteract({
Id = nCaseId,
StoryEventOfPersonalitySelectReq = {ThrowDice = true}
}, nil, callback)
end
function SoldierLevelData:UpdateNodeInfo(nodeData, tbChange, bSuppressStageChangeCase)
if nodeData == nil then
return
end
local tbNodeChange = {}
local bNodeChange = false
local bStageChange = false
if nodeData.NodeId ~= self.nNodeId then
bNodeChange = true
end
if nodeData.StageId ~= self.nStageId then
bStageChange = true
end
tbNodeChange.bNodeChange = bNodeChange
tbNodeChange.nLastStageId = self.nStageId
tbNodeChange.nLastNodeId = self.nNodeId
tbNodeChange.nLastNodeType = self.nNodeType
self.nStageId = nodeData.StageId
self.nNodeType = nodeData.Type
self.nNodeId = nodeData.NodeId
if self.nNodeId ~= 0 then
local mapCfg = ConfigTable.GetData("SoldierNodePlan", self.nNodeId)
if mapCfg ~= nil then
self.parent:SetCurGradeChallengeData(self.nGradeChallengeId, self.nStageId, mapCfg.Index)
end
end
if tbChange then
tbChange.tbNodeChange = tbNodeChange
end
if bStageChange then
self:UpdateNodeList()
if not bSuppressStageChangeCase then
self.mapClientCases[ClientCase.StageChange] = {
nStageId = self.nStageId,
nCurNodeId = self.nNodeId
}
end
end
end
function SoldierLevelData:UpdateBaseInfo(baseData, tbChange)
if baseData == nil then
return
end
if tbChange ~= nil then
tbChange.nHpChange = baseData.Hp - self.nHp
tbChange.nLevelChange = baseData.Level - self.nLevel
end
self.nHp = baseData.Hp
self.nLevel = baseData.Level
self.nExp = baseData.Exp
self.nWiningStreak = baseData.WinningStreak
self.nLosingStreak = baseData.LosingStreak
EventManager.Hit("SoldierHpChange")
end
function SoldierLevelData:UpdateGMSoldierHp(nHp)
if nHp == nil then
return
end
self.nHp = nHp
EventManager.Hit("SoldierHpChange")
end
function SoldierLevelData:UpdateChangeInfo(mapChangeInfo, tbChange, param)
local tbSteps = {}
local mapDecodeInfo = UTILS.DecodeChangeInfo(mapChangeInfo)
if mapDecodeInfo["proto.SoldierRes"] ~= nil then
local itemChange = {}
for _, mapItemInfo in ipairs(mapDecodeInfo["proto.SoldierRes"]) do
if self.mapItems[mapItemInfo.Tid] == nil then
self.mapItems[mapItemInfo.Tid] = 0
end
itemChange[mapItemInfo.Tid] = mapItemInfo.Qty
self.mapItems[mapItemInfo.Tid] = self.mapItems[mapItemInfo.Tid] + mapItemInfo.Qty
end
if tbChange ~= nil then
tbChange.itemChange = itemChange
end
EventManager.Hit("SoldierItemChange", itemChange)
end
if mapDecodeInfo["proto.SoldierChessChange"] ~= nil then
for _, change in ipairs(mapDecodeInfo["proto.SoldierChessChange"]) do
if change.BaseVersion ~= self.nDeployVersion then
printError(string.format("[Soldier] SoldierChessChange 版本号不匹配 base=%s local=%s next=%s, 丢弃; 等 DeploySyncResp.Deploy 兜底", tostring(change.BaseVersion), tostring(self.nDeployVersion), tostring(change.NextVersion)))
else
local tbTransforms = change.Transforms or {}
local bBatchWipeContext = self:_CheckBatchWipeContext(param, tbTransforms)
local tbBatchConsume = bBatchWipeContext and {} or nil
for _, mapTrans in ipairs(tbTransforms) do
if PRINT_CHESS_LOG then
if mapTrans.Consume ~= nil and 0 < #mapTrans.Consume then
for _, consume in ipairs(mapTrans.Consume) do
local sName = ""
local mapCfg = ConfigTable.GetData("SoldierCharacter", consume.Tid)
if mapCfg ~= nil then
sName = mapCfg.Name
end
self:PrintSoldier(string.format("<color='#CF584E'>[[Soldier]失去棋子 UID=%s %s-%s星[%s]</color>", consume.UID, consume.Tid, consume.Star, sName))
end
end
if mapTrans.Obtain ~= nil and 0 < #mapTrans.Obtain then
for _, obtain in ipairs(mapTrans.Obtain) do
local sName = ""
local mapCfg = ConfigTable.GetData("SoldierCharacter", obtain.Tid)
if mapCfg ~= nil then
sName = mapCfg.Name
end
self:PrintSoldier(string.format("<color='#4DC382'>[[Soldier]获得棋子 UID=%s %s-%s星[%s] Slot=%s</color>", obtain.UID, obtain.Tid, obtain.Star, sName, obtain.Slot or 0))
end
end
if mapTrans.Update ~= nil and 0 < #mapTrans.Update then
for _, upd in ipairs(mapTrans.Update) do
self:PrintSoldier(string.format("[Soldier]移动棋子 UID=%s -> Slot=%s", upd.UID, upd.Slot or 0))
end
end
end
local steps = self:DisposalChessDeploy(mapTrans, param)
if steps ~= nil then
if tbBatchConsume ~= nil then
for _, s in ipairs(steps) do
if s.tbConsume ~= nil then
for _, c in ipairs(s.tbConsume) do
table.insert(tbBatchConsume, c)
end
end
end
else
for _, s in ipairs(steps) do
table.insert(tbSteps, s)
end
end
end
end
self.nDeployVersion = change.NextVersion or self.nDeployVersion
self.tbDeployChess = self:_DeriveDeployView()
self.tbWaitingChess = self:_DeriveWaitingView()
self.tbOtherChess = self:_DeriveOtherView()
self.mapAllChess = self:_DeriveAllChessView()
self:UpdatePartner()
if tbBatchConsume ~= nil and 0 < #tbBatchConsume then
self:_NetOutPendingRewards(tbBatchConsume)
local atomicStep = {
tbConsume = tbBatchConsume,
tbObtain = {},
tbUpdate = {},
sSpecial = "CardWipeAll"
}
local wipeSteps = {atomicStep}
for _, s in ipairs(tbSteps) do
table.insert(wipeSteps, s)
end
local wipeEntry = {
nType = AllEnum.SoldierRewardSource.CardWipe,
data = {},
tbSteps = wipeSteps
}
table.insert(self.tbPendingRewards, wipeEntry)
elseif tbChange ~= nil and 0 < #tbSteps then
tbChange.tbChessChangeStep = tbSteps
end
end
end
end
if mapDecodeInfo["proto.SoldierBuff"] ~= nil then
for _, mapBuff in ipairs(mapDecodeInfo["proto.SoldierBuff"]) do
self:UpdateBuff(mapBuff)
end
end
EventManager.Hit("RefreshSoldierRes")
end
function SoldierLevelData:UpdateSoldierEffectNotify(mapMsgData)
if mapMsgData == nil or mapMsgData.Effects == nil then
return
end
self:UpdateEffect(mapMsgData.Effects)
EventManager.Hit("SoldierEffectChange")
end
function SoldierLevelData:UpdateShopDataNotify(mapShopData)
if mapShopData == nil then
return
end
self:_UpdateShopCaseData(mapShopData)
EventManager.Hit("SoldierShopLevelChange")
end
function SoldierLevelData:UpdateEffect(mapEffect, tbChange)
if mapEffect == nil or #mapEffect == 0 then
return
end
for _, v in ipairs(mapEffect) do
local nBuffUid = v.BuffId or 0
if v.Id ~= nil and v.Id ~= 0 and nBuffUid ~= 0 and self.mapBuffs[nBuffUid] ~= nil then
self.mapEffects[v.Id] = {
nBuffUid = nBuffUid,
nTid = v.Tid
}
end
self:EffectLeftmostChange(v.LeftmostChange, tbChange)
self:EffectBecomeAnother(v.BecomeAnother, tbChange)
self:EffectPartnerAdditional(v.PartnerAdditional)
self:EffectPartnerActivateAdditional(v.PartnerActivateAdditional)
self:EffectNodeTypeModify(v.NodeTypeModify)
self:EffectClientAttr(v.ClientAttr)
self:EffectShopRefreshState(v.RefreshState)
self:EffectShopPurchaseState(v.PurchaseState)
self:EffectShopFreeState(v.FreeState)
self:EffectShopRarity(v.Rarity)
self:EffectShopPurchaseExpDiscount(v.PurchaseExpDiscount)
self:EffectShowChess(v.ShowChess)
self:EffectClientHarvest(v.ClientHarvest)
self:EffectInterest(v.Interest)
self:EffectCardReRoll(v.CardReRoll)
self:EffectDiceAddPoint(v.DiceAddPoint)
end
end
function SoldierLevelData:InteractShop(shopMsg)
if shopMsg == nil then
return
end
if shopMsg.Goods ~= nil then
elseif shopMsg.ShopData ~= nil then
self:_UpdateShopCaseData(shopMsg.ShopData)
EventManager.Hit("SoldierShopLevelChange")
elseif shopMsg.Upgrade ~= nil then
self.nLevel = shopMsg.Upgrade.Level
self.nExp = shopMsg.Upgrade.Exp
if self.mapCases[CaseEnum.Shop] ~= nil and self.mapCases[CaseEnum.Shop].mapShop ~= nil then
self.mapCases[CaseEnum.Shop].mapShop.tbWeightList = self:GetShopWeight(shopMsg.Upgrade.RarityUp)
end
EventManager.Hit("SoldierShopLevelChange")
elseif shopMsg.Res ~= nil then
EventManager.Hit("SoldierShopSell", shopMsg.Res)
elseif shopMsg.Succeed ~= nil then
local bLock = shopMsg.Succeed
if self.mapCases[CaseEnum.Shop] ~= nil and self.mapCases[CaseEnum.Shop].mapShop ~= nil then
self.mapCases[CaseEnum.Shop].mapShop.bLock = shopMsg.Succeed
end
EventManager.Hit("SoldierShopLock", bLock)
end
end
function SoldierLevelData:InteractBattle(battleMsg, param, tbChange)
if battleMsg == nil then
return
end
local nAllCoinChange = 0
local tbItemChange = tbChange.itemChange
if tbItemChange ~= nil then
nAllCoinChange = tbItemChange[AllEnum.CoinItemId.SoldierCurrency]
end
local tbCoinReward = {
base = battleMsg.BaseReward,
interest = battleMsg.Interest,
winningStreak = battleMsg.WinningStreak,
losingStreak = battleMsg.LosingStreak,
other = nAllCoinChange - battleMsg.BaseReward - battleMsg.Interest - battleMsg.WinningStreak - battleMsg.LosingStreak
}
if type(param) == "table" then
local nType = param.nResultType
local tbDamage = param.tbDamage
self.mapClientCases[ClientCase.BattleResult] = {}
self.mapClientCases[ClientCase.BattleResult].nType = nType
self.mapClientCases[ClientCase.BattleResult].tbDamage = tbDamage
self.mapClientCases[ClientCase.BattleResult].tbChange = tbChange
self.mapClientCases[ClientCase.BattleResult].tbCoinReward = tbCoinReward
self.mapClientCases[ClientCase.BattleResult].bEventBattle = false
end
end
function SoldierLevelData:InteractEventSettlementOfDisputeBattle(battleMsg, param, tbChange)
if battleMsg == nil then
return
end
local nAllCoinChange = 0
local tbItemChange = tbChange.itemChange
if tbItemChange ~= nil then
nAllCoinChange = tbItemChange[AllEnum.CoinItemId.SoldierCurrency]
end
local tbCoinReward = {
base = battleMsg.BaseReward,
interest = battleMsg.Interest,
winningStreak = 0,
losingStreak = 0,
other = nAllCoinChange - battleMsg.BaseReward - battleMsg.Interest
}
if type(param) == "table" then
local nType = param.nResultType
local tbDamage = param.tbDamage
self.mapClientCases[ClientCase.BattleResult] = {}
self.mapClientCases[ClientCase.BattleResult].nType = nType
self.mapClientCases[ClientCase.BattleResult].tbDamage = tbDamage
self.mapClientCases[ClientCase.BattleResult].tbChange = tbChange
self.mapClientCases[ClientCase.BattleResult].tbCoinReward = tbCoinReward
self.mapClientCases[ClientCase.BattleResult].bEventBattle = true
end
self:CacheReward(AllEnum.SoldierRewardSource.EventBattle, {
tbChess = battleMsg.Chess,
nCoin = battleMsg.Coin
})
end
function SoldierLevelData:InteractCheckStageSettle(settleMsg)
if settleMsg == nil then
return
end
self:CacheReward(AllEnum.SoldierRewardSource.Battle, {
nCheckStageDps = settleMsg.DpsScore,
nCheckStageTime = settleMsg.TimeScore
})
end
function SoldierLevelData:InteractSelect(selectMsg)
if selectMsg == nil then
return
end
if selectMsg.Resp ~= nil then
elseif selectMsg.SelectCard ~= nil and self.mapCases[CaseEnum.SelectCard] ~= nil then
self.mapCases[CaseEnum.SelectCard].tbCards = selectMsg.SelectCard.Ids
self.mapCases[CaseEnum.SelectCard].nRoll = selectMsg.SelectCard.ReRoll
end
end
function SoldierLevelData:_ParseStoryEventRewards(tbRewards)
if tbRewards == nil or #tbRewards == 0 then
return nil
end
local RT = AllEnum.SoldierEventEffectRewardType
local data = {}
for _, r in ipairs(tbRewards) do
local eType = r.RewardType
if eType == RT.Chess then
if r.ChessList ~= nil and r.ChessList.ChessList ~= nil then
data.tbChess = data.tbChess or {}
for _, ch in ipairs(r.ChessList.ChessList) do
table.insert(data.tbChess, ch)
end
end
elseif (eType == RT.GainCoin or eType == RT.LossCoin) and r.Res ~= nil and r.Res.ResRewards ~= nil then
for _, res in ipairs(r.Res.ResRewards) do
if res.Tid == AllEnum.CoinItemId.SoldierCurrency then
data.nCoin = (data.nCoin or 0) + (res.Qty or 0)
end
end
end
end
if next(data) == nil then
return nil
end
return data
end
function SoldierLevelData:InteractStoryEventOfPersonalitySelect(respMsg)
if respMsg == nil then
return
end
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierEventPanel)
if respMsg.Success ~= nil then
return
end
if respMsg.Reward == nil then
return
end
local data = self:_ParseStoryEventRewards(respMsg.Reward.Rewards)
if data ~= nil then
self:CacheReward(AllEnum.SoldierRewardSource.EventBattle, data)
end
if respMsg.Reward.Point > 0 then
self.mapClientCases[ClientCase.DiceResult] = {
bSuccess = respMsg.Reward.Result,
nPoint = respMsg.Reward.Point,
tbTwoDicePoint = respMsg.Reward.TwoDicePoint
}
end
end
function SoldierLevelData:InteractStoryEventOfCostlySelect(respMsg)
if respMsg == nil then
return
end
local data = self:_ParseStoryEventRewards(respMsg.Rewards)
if data ~= nil then
self:CacheReward(AllEnum.SoldierRewardSource.EventBattle, data)
end
local bHaveNext = false
for _, v in ipairs(respMsg.Rewards) do
if v.RewardType == AllEnum.SoldierEventEffectRewardType.Next then
bHaveNext = true
break
end
end
if not bHaveNext then
EventManager.Hit(EventId.ClosePanel, PanelId.SoldierEventPanel)
end
end
function SoldierLevelData:InteractSettle(settleMsg)
if settleMsg == nil then
return
end
local nType = AllEnum.SoldierResultType.ChallengeFail
if settleMsg.Result == 1 then
nType = AllEnum.SoldierResultType.ChallengeSuccess
end
if settleMsg.EndingId ~= nil and settleMsg.EndingId ~= 0 then
self.mapClientCases[ClientCase.Ending] = {
data = settleMsg.EndingId
}
end
self.mapClientCases[ClientCase.Settle] = {
nType = nType,
tbSettle = {
nPassedNode = settleMsg.PassedNode,
nRemainingHp = settleMsg.RemainingHp,
nCheckStageDps = settleMsg.CheckStageDps,
nCheckStageTime = settleMsg.CheckStageTime,
nChessTotalCost = settleMsg.ChessTotalCost,
nGetSchedule = settleMsg.GetSchedule,
nGetTechPoint = settleMsg.GetTechPoint,
nGetGradeExp = settleMsg.GetGradeExp,
nCurGradeChallengeId = settleMsg.CurGradeChallengeId,
nCurGradeExp = settleMsg.CurGradeExp,
nEndingId = settleMsg.EndingId,
nTotalCoinQty = settleMsg.TotalCoinQty
},
tbChess = self.tbDeployChess or {},
tbDamage = self.tbLastBattleDamage or {},
nBossTemplateId = self.nBossTemplateId or 0,
nHp = self:GetHp() or 0,
nCoin = self:GetItem(AllEnum.CoinItemId.SoldierCurrency) or 0,
tbCard = self:GetCardData() or {},
nGradeChallengeId = self.nGradeChallengeId or 0
}
if settleMsg.Change ~= nil then
local mapDecodedChangeInfo = UTILS.DecodeChangeInfo(settleMsg.Change)
HttpNetHandler.ProcChangeInfo(mapDecodedChangeInfo)
end
self.parent:RefreshRedDot()
end
function SoldierLevelData:InteractDeploySync(deploySyncResp)
if deploySyncResp == nil then
return
end
if deploySyncResp.Deploy ~= nil then
self:_RebuildFromNewDeploy(deploySyncResp.Deploy)
self.tbDeployChess = self:_DeriveDeployView()
self.tbWaitingChess = self:_DeriveWaitingView()
self.tbOtherChess = self:_DeriveOtherView()
self.mapAllChess = self:_DeriveAllChessView()
self:UpdatePartner()
EventManager.Hit("SoldierDeployFullRebuild")
end
end
function SoldierLevelData:_OnInteract(netMsgData, param, callback)
if netMsgData == nil then
return
end
self._tbTouchedRewardIdxes = {}
self._tbPendingNewPartner = nil
self._bPartnerSetChanged = nil
local tbChange = {}
self:UpdateNodeInfo(netMsgData.Node, tbChange)
self:UpdateBaseInfo(netMsgData.SyncData, tbChange)
self:UpdateChangeInfo(netMsgData.Change, tbChange, param)
self:UpdateEffect(netMsgData.Effects, tbChange)
self:UpdateBuffProgress(netMsgData.Progress)
self:InteractShop(netMsgData.ShopResp)
self:InteractBattle(netMsgData.BattleResp, param, tbChange)
self:InteractEventSettlementOfDisputeBattle(netMsgData.EventSettlementOfDisputeBattleResp, param, tbChange)
self:InteractSelect(netMsgData.SelectResp)
self:InteractStoryEventOfPersonalitySelect(netMsgData.StoryEventOfPersonalitySelectResp)
self:InteractStoryEventOfCostlySelect(netMsgData.StoryEventOfCostlySelectResp)
self:InteractCheckStageSettle(netMsgData.CheckStageSettleResp)
self:InteractSettle(netMsgData.Settle)
self:InteractDeploySync(netMsgData.DeploySyncResp)
self:ClearServerCase()
for _, v in ipairs(netMsgData.Cases) do
self:DispatchServerCase(v)
end
if #self._tbTouchedRewardIdxes > 0 and tbChange.tbChessChangeStep ~= nil and 0 < #tbChange.tbChessChangeStep then
local nIdx = self._tbTouchedRewardIdxes[1]
self.tbPendingRewards[nIdx].tbSteps = self.tbPendingRewards[nIdx].tbSteps or {}
for _, s in ipairs(tbChange.tbChessChangeStep) do
table.insert(self.tbPendingRewards[nIdx].tbSteps, s)
end
end
self._tbTouchedRewardIdxes = nil
if tbChange.tbNodeChange ~= nil and tbChange.tbNodeChange.bNodeChange then
EventManager.Hit("SoldierNodeChange")
end
EventManager.Hit(EventId.BlockInput, true)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
EventManager.Hit(EventId.BlockInput, false)
self:HandleCase()
if callback ~= nil then
callback(tbChange)
end
end
cs_coroutine.start(wait)
end
function SoldierLevelData:GetBossTemplateId()
return self.nBossTemplateId
end
function SoldierLevelData:GetNodeId()
return self.nNodeId
end
function SoldierLevelData:GetNodeList()
return self.tbNodeList
end
function SoldierLevelData:GetNodeIndex()
for _, v in ipairs(self.tbNodeList) do
if v.nNodeId == self.nNodeId then
return v.nIndex
end
end
return 0
end
function SoldierLevelData:IsFirstStageFirstNode()
if self.nStageId ~= 1 then
return false
end
if self.tbNodeList == nil or self.tbNodeList[1] == nil then
return false
end
return self.tbNodeList[1].nNodeId == self.nNodeId
end
function SoldierLevelData:GetHp()
return self.nHp
end
function SoldierLevelData:GetShopLevel()
return self.nLevel, self.nMaxLevel
end
function SoldierLevelData:GetExp()
return self.nExp
end
function SoldierLevelData:GetStreakCount()
return self.nWiningStreak, self.nLosingStreak
end
function SoldierLevelData:GetItem(nItemId)
return self.mapItems[nItemId] or 0
end
function SoldierLevelData:GetDeploy()
return self.tbDeployChess, self.tbWaitingChess, self.tbOtherChess
end
function SoldierLevelData:GetAllChess()
return self.mapAllChess
end
function SoldierLevelData:PosIndexToSlot(nPosType, nIndex)
return PosIndexToSlot(nPosType, nIndex)
end
function SoldierLevelData:GetShopData()
local mapShopCase = self.mapCases[CaseEnum.Shop]
if mapShopCase ~= nil then
return mapShopCase.mapShop
end
end
function SoldierLevelData:GetEventBattleData()
return self:_GetCaseDataByType(CaseEnum.EventSettlementOfDispute)
end
function SoldierLevelData:CheckInSelectCard()
return self.mapCases[CaseEnum.SelectCard] ~= nil
end
function SoldierLevelData:GetSelectCardData()
local mapCase = self:_GetCaseDataByType(CaseEnum.SelectCard)
if mapCase ~= nil then
return mapCase.tbCards, mapCase.nRoll
end
end
function SoldierLevelData:GetCardData()
if self.tbStrategyCards == nil then
local tb = {}
for k, buffInfo in pairs(self.mapBuffs) do
if buffInfo.nType == SoldierBuffType.CardBuff and tb[buffInfo.nBindId] == nil then
tb[buffInfo.nBindId] = k
end
end
self.tbStrategyCards = {}
for nId, nIndex in pairs(tb) do
table.insert(self.tbStrategyCards, {nId = nId, nIndex = nIndex})
end
table.sort(self.tbStrategyCards, function(a, b)
return a.nIndex < b.nIndex
end)
end
return self.tbStrategyCards
end
function SoldierLevelData:CheckSandTableDisable()
local bDisable = false
if self.mapCases[CaseEnum.SelectCard] ~= nil then
bDisable = true
elseif self.mapCases[CaseEnum.EventSettlementOfDispute] ~= nil then
bDisable = true
elseif self.mapCases[CaseEnum.StoryEventOfPersonality] ~= nil then
bDisable = true
elseif self.mapCases[CaseEnum.StoryEventOfCostly] ~= nil then
bDisable = true
end
return bDisable
end
function SoldierLevelData:CheckSoldierCombine(nId, nStar)
local COMBINE_NEED = 3
local nMaxStar = 0
local cfgChess = ConfigTable.GetData("SoldierCharacter", nId)
if cfgChess ~= nil and cfgChess.MaxStar ~= nil and 0 < cfgChess.MaxStar then
nMaxStar = cfgChess.MaxStar
end
local _getCount = function(nQueryStar)
local n = 0
for _, v in ipairs(self.mapAllChess) do
if v.nId == nId and v.nStar == nQueryStar then
n = n + (v.nCount or 0)
end
end
return n
end
local mapSimCount = {}
local _simGet = function(s)
if mapSimCount[s] == nil then
mapSimCount[s] = _getCount(s)
end
return mapSimCount[s]
end
mapSimCount[nStar] = _simGet(nStar) + 1
local nNextStar = nStar
local bCombine = false
while nMaxStar > nNextStar and COMBINE_NEED <= _simGet(nNextStar) do
mapSimCount[nNextStar] = mapSimCount[nNextStar] - COMBINE_NEED
nNextStar = nNextStar + 1
mapSimCount[nNextStar] = _simGet(nNextStar) + 1
bCombine = true
end
if not bCombine then
nNextStar = 0
end
return bCombine, nNextStar
end
function SoldierLevelData:SetPartnerTrace(nPartnerType, bTrace, callback)
self:SendPartnerTrace(nPartnerType, bTrace, callback)
end
function SoldierLevelData:CheckPartnerTrace(nPartnerType)
return table.indexof(self.tbPartnerTrace, nPartnerType) > 0
end
function SoldierLevelData:CheckChessTrace(nId)
local bTrace = false
local mapCharCfg = ConfigTable.GetData("SoldierCharacter", nId)
if mapCharCfg ~= nil then
local tbPartner = mapCharCfg.PartnerType
for _, v in ipairs(tbPartner) do
if table.indexof(self.tbPartnerTrace, v) > 0 then
bTrace = true
break
end
end
end
return bTrace
end
function SoldierLevelData:GetServerPartner()
return self.tbServerPartner
end
function SoldierLevelData:CheckInBattle()
return self.curBattle ~= nil
end
function SoldierLevelData:GetClientBuffList()
local tbBuffList = {}
for nEffectId, v in pairs(self.tbClientEffects) do
local buffList = v.tbValues
if buffList ~= nil then
for _, buffId in ipairs(buffList) do
table.insert(tbBuffList, tonumber(buffId))
end
end
end
return tbBuffList
end
function SoldierLevelData:GetCheckStage()
local mapCase = self:_GetCaseDataByType(CaseEnum.CheckStage)
if mapCase ~= nil then
return true
end
return false
end
function SoldierLevelData:GetClientHarvestCount()
if self.mapExtraEffectState ~= nil then
return self.mapExtraEffectState.nHarvest or 0
end
end
function SoldierLevelData:GetStoryEventData()
local mapCaseData = self.mapCases[CaseEnum.StoryEventOfPersonality]
if mapCaseData ~= nil then
return mapCaseData
end
mapCaseData = self.mapCases[CaseEnum.StoryEventOfCostly]
if mapCaseData ~= nil then
return mapCaseData
end
end
function SoldierLevelData:CheckInSandtable()
return self.mapCases[CaseEnum.Fight] ~= nil
end
function SoldierLevelData:GetDiceAddPointList()
local tbDiscAdd = {}
for nEUId, v in pairs(self.tbDiscAddEffect) do
local buff = self.mapBuffs[v.nBuffUId]
if buff ~= nil then
local nType = 0
if buff.nType == SoldierBuffType.CardBuff then
nType = AllEnum.SoldierDiscAddType.BuffCard
elseif buff.nType == SoldierBuffType.TechNodeBuff then
nType = AllEnum.SoldierDiscAddType.TechNode
end
table.insert(tbDiscAdd, {
nType = nType,
nId = buff.nBindId,
nPoint = v.nPoint
})
end
end
return tbDiscAdd
end
function SoldierLevelData:GetInterestLimit()
if self.mapExtraEffectState ~= nil then
return self.mapExtraEffectState.nInterestLimit
end
return 0
end
function SoldierLevelData:GMEnterBattle(tbDeployChess)
if self.curBattle == nil then
self.curBattle = require("Game.Adventure.Soldier.SoldierBattle").new()
end
self.curBattle:Init(self, tbDeployChess, 1, 1, 1, 1, 101)
end
return SoldierLevelData