Update - 1.13.0.124

EN: 1.13.0.124
CN: 1.13.0.124
JP: 1.13.0.128
KR: 1.13.0.130
This commit is contained in:
SL1900
2026-07-21 12:30:00 +09:00
parent a12087abad
commit 8c4bd41668
1334 changed files with 873026 additions and 95164 deletions
@@ -0,0 +1,614 @@
local PenguinLevel = require("Game.UI.Play_PenguinCard.PenguinLevel")
local PenguinLevel_Normal = class("PenguinLevel_Normal", PenguinLevel)
local PenguinCardQuest = require("Game.UI.Play_PenguinCard.PenguinCardQuest")
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
local mapEventConfig = {
PenguinCard_ChangeScore = "OnEvent_ChangeScore"
}
function PenguinLevel_Normal:Init(nFloorId, nLevelId, nActId, tbStarScore)
self:ParseServerData(nFloorId, nLevelId, nActId, tbStarScore)
self:ParseConfigData()
self:ParseLocalData()
self:BindEvent()
EventManager.Hit(EventId.OpenPanel, PanelId.PenguinCard, self)
end
function PenguinLevel_Normal:Exit()
self:UnBindEvent()
end
function PenguinLevel_Normal:ParseModeConfigData()
self.nMaxRound = ConfigTable.GetConfigNumber("PenguinCardMaxRound")
self.nMaxSlot = ConfigTable.GetConfigNumber("PenguinCardMaxSlot")
self.nMaxBuyLimit = ConfigTable.GetConfigNumber("PenguinCardHandCardCount")
self.nMaxCheckRound = ConfigTable.GetConfigNumber("PenguinCardMaxCheckRound")
self.tbRoundUpgradeCost = ConfigTable.GetConfigNumberArray("PenguinCardRoundUpgradeCost")
self.tbSlotUpgradeCost = ConfigTable.GetConfigNumberArray("PenguinCardSlotUpgradeCost")
self.tbBuyLimitUpgradeCost = ConfigTable.GetConfigNumberArray("PenguinCardBuyLimitUpgradeCost")
self.tbCheckRoundUpgradeCost = ConfigTable.GetConfigNumberArray("PenguinCardCheckRoundUpgradeCost")
end
function PenguinLevel_Normal:ParseModeLevelData(nFloorId)
local mapLevelCfg = ConfigTable.GetData("PenguinCardFloor", nFloorId)
if not mapLevelCfg then
return
end
self.nMaxTurn = mapLevelCfg.MaxTurn
self.nScore = mapLevelCfg.InitialScore
self.nTotalScore = mapLevelCfg.InitialScore
self.nSlotCount = mapLevelCfg.InitialSlot
self.nRoundLimit = mapLevelCfg.InitialRound
self.nCheckRoundLimit = mapLevelCfg.InitialCheckRound
self.nBuyLimit = mapLevelCfg.InitialBuyLimit
self.nWeightGroupId = mapLevelCfg.WeightGroup
self.nFixedTurnGroupId = mapLevelCfg.FixedTurn
self.sLevelDesc = mapLevelCfg.Floortips
self.bShowWin = mapLevelCfg.ShowWin
self.nQuestTurn = mapLevelCfg.QuestTurn
self.nQuestGroup = mapLevelCfg.QuestGroup
local mapPoolCfg = ConfigTable.GetData("PenguinBaseCardPool", mapLevelCfg.PoolId)
if not mapPoolCfg then
return
end
self.mapBaseCardPool = {
tbId = mapPoolCfg.BaseCardId,
tbWeight = mapPoolCfg.Weight
}
end
function PenguinLevel_Normal:ClearModeLevelData()
self.bPreTurnWin = false
if self.tbQuestPool == nil then
self.tbQuestPool = {}
end
self.mapQuest = nil
end
function PenguinLevel_Normal:CheckNextGameState()
if self.nGameState == nil then
return PenguinCardUtils.GameState.Start
elseif self.nGameState == PenguinCardUtils.GameState.Start then
if self.nQuestTurn >= 0 and self.nCurTurn >= self.nQuestTurn then
return PenguinCardUtils.GameState.Quest
else
return PenguinCardUtils.GameState.Prepare
end
elseif self.nGameState == PenguinCardUtils.GameState.Prepare then
return PenguinCardUtils.GameState.Dealing
elseif self.nGameState == PenguinCardUtils.GameState.Dealing then
return PenguinCardUtils.GameState.Flip
elseif self.nGameState == PenguinCardUtils.GameState.Flip then
return PenguinCardUtils.GameState.Settlement
elseif self.nGameState == PenguinCardUtils.GameState.Settlement then
if self.nCurRound < self:GetRoundLimitInTurn() then
return PenguinCardUtils.GameState.Dealing
end
if self.nCurTurn >= self.nMaxTurn then
return PenguinCardUtils.GameState.Complete
end
if self.mapQuest ~= nil then
return PenguinCardUtils.GameState.Quest
elseif self.nQuestTurn >= 0 and self.nCurTurn >= self.nQuestTurn then
return PenguinCardUtils.GameState.Quest
else
return PenguinCardUtils.GameState.Prepare
end
elseif self.nGameState == PenguinCardUtils.GameState.Quest then
if self.nCurTurn >= self.nMaxTurn or 0 >= self.nHp then
return PenguinCardUtils.GameState.Complete
else
return PenguinCardUtils.GameState.Prepare
end
end
end
function PenguinLevel_Normal:RunState_Start()
EventManager.Hit("PenguinCard_RunState_Start")
end
function PenguinLevel_Normal:QuitState_Start()
EventManager.Hit("PenguinCard_QuitState_Start")
local nWaitTime = 0.167
return nWaitTime
end
function PenguinLevel_Normal:RunState_Quest()
self.tbSelectableQuest = {}
self.bSkipQuestShow = false
self.mapQuestForShow = nil
if self.mapQuest ~= nil then
self.mapQuestForShow = clone(self.mapQuest)
local bComplete = self.mapQuest:CheckComplete()
if bComplete then
self:CompleteQuest()
self:RollQuest()
else
local bExpired = self.mapQuest:CheckExpired()
if bExpired then
self:ChangeHp(-1)
if self.nHp > 0 then
self:RollQuest()
end
else
self.bSkipQuestShow = true
end
end
else
self:RollQuest()
if next(self.tbSelectableQuest) == nil then
self.bSkipQuestShow = true
end
end
EventManager.Hit("PenguinCard_RunState_Quest", self.bSkipQuestShow)
if self.bSkipQuestShow then
self:SwitchGameState()
end
end
function PenguinLevel_Normal:QuitState_Quest(nNextState)
self.tbSelectableQuest = {}
self.bSkipQuestShow = false
self.mapQuestForShow = nil
EventManager.Hit("PenguinCard_QuitState_Quest", nNextState)
local nWaitTime = 0
if nNextState == PenguinCardUtils.GameState.Start then
nWaitTime = 0.6
elseif nNextState == PenguinCardUtils.GameState.Prepare then
nWaitTime = 0.57
elseif nNextState == PenguinCardUtils.GameState.Complete then
nWaitTime = 0.6
end
return nWaitTime
end
function PenguinLevel_Normal:RollQuest()
local tbId = self:GetRollQuestResult()
self:ClearSelectableQuest()
for _, nId in ipairs(tbId) do
local mapCard = self:CreateQuest(nId)
table.insert(self.tbSelectableQuest, mapCard)
end
self.mapQuest = nil
end
function PenguinLevel_Normal:GetRollQuestResult()
local mapWeightCfg = ConfigTable.GetData("PenguinCardQuestWeight", self.nQuestGroup * 100 + self.nCurTurn)
if not mapWeightCfg then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_Error_EmptyQuest")
})
return {}
end
local tbId = PenguinCardUtils.WeightedRandom(mapWeightCfg.QuestList, mapWeightCfg.Weight, 3)
return tbId
end
function PenguinLevel_Normal:ClearSelectableQuest()
if next(self.tbSelectableQuest) ~= nil then
for i = #self.tbSelectableQuest, 1, -1 do
local mapCard = table.remove(self.tbSelectableQuest, i)
self:RecycleQuest(mapCard)
end
end
end
function PenguinLevel_Normal:SelectQuest(nIndex)
self.mapQuest = nil
self.mapQuest = self.tbSelectableQuest[nIndex]
table.remove(self.tbSelectableQuest, nIndex)
self:ClearSelectableQuest()
EventManager.Hit("PenguinCard_SelectQuest")
if NovaAPI.IsEditorPlatform() then
printLog("领取任务:" .. " " .. self.mapQuest.nId)
end
end
function PenguinLevel_Normal:CompleteQuest()
local mapData = self:CreateBuff(self.mapQuest.nBuffId)
mapData:ResetAllTrigger()
self:AddBuff(mapData, true)
end
function PenguinLevel_Normal:RecycleQuest(mapQuest)
mapQuest:Clear()
table.insert(self.tbQuestPool, mapQuest)
end
function PenguinLevel_Normal:CreateQuest(nId)
local mapQuest
if next(self.tbQuestPool) == nil then
mapQuest = PenguinCardQuest.new(nId)
else
mapQuest = table.remove(self.tbQuestPool, 1)
mapQuest:Init(nId)
end
return mapQuest
end
function PenguinLevel_Normal:RunState_Prepare()
self.nCurTurn = self.nCurTurn + 1
self.nCurRound = 0
self:ClearStateData_Prepare()
self:ClearTurnData()
for _, v in ipairs(self.tbBuff) do
v:ResetTurnTrigger()
end
for _, v in ipairs(self.tbPenguinCard) do
if v ~= 0 then
v:ResetTurnTrigger()
end
end
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.Prepare)
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.BeforeUpgrade)
self:FreeRollPenguinCard()
EventManager.Hit("PenguinCard_RunState_Prepare")
end
function PenguinLevel_Normal:QuitState_Prepare(nNextState)
self:ClearSelectablePenguinCard()
self:ClearStateData_Prepare()
self.bPreTurnWin = false
EventManager.Hit("PenguinCard_QuitState_Prepare", nNextState)
local nWaitTime = 0
if nNextState == PenguinCardUtils.GameState.Start then
nWaitTime = 0.6
elseif nNextState == PenguinCardUtils.GameState.Dealing then
nWaitTime = 0.45
elseif nNextState == PenguinCardUtils.GameState.Complete then
nWaitTime = 0.6
end
return nWaitTime
end
function PenguinLevel_Normal:AddRound()
if self.nRoundLimit == self.nMaxRound then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_AddBtnMaxLevel")
})
return
end
local nCost = self.tbRoundUpgradeCost[self.nRoundLimit + 1] * self.nUpgradeDiscount
if nCost > self.nScore then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_NotEnoughScoreUpgrade")
})
return
end
self.nRoundLimit = self.nRoundLimit + 1
self:ChangeScore(-1 * nCost)
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_buy",
sContent = orderedFormat(ConfigTable.GetUIText("PenguinCard_AddRoundSuccess"), self.nRoundLimit)
})
self:AfterUpgrade(nCost)
EventManager.Hit("PenguinCard_AddRound")
end
function PenguinLevel_Normal:AddSlot()
if self.nSlotCount == self.nMaxSlot then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_AddBtnMaxLevel")
})
return
end
local nCost = self.tbSlotUpgradeCost[self.nSlotCount + 1] * self.nUpgradeDiscount
if nCost > self.nScore then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_NotEnoughScoreUpgrade")
})
return
end
self.nSlotCount = self.nSlotCount + 1
self:ChangeScore(-1 * nCost)
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_buy",
sContent = orderedFormat(ConfigTable.GetUIText("PenguinCard_AddSlotSuccess"), self.nSlotCount)
})
self:AfterUpgrade(nCost)
EventManager.Hit("PenguinCard_AddSlot")
end
function PenguinLevel_Normal:AddRoll()
if self.nBuyLimit == self.nMaxBuyLimit then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_AddBtnMaxLevel")
})
return
end
local nCost = self.tbBuyLimitUpgradeCost[self.nBuyLimit + 1] * self.nUpgradeDiscount
if nCost > self.nScore then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_NotEnoughScoreUpgrade")
})
return
end
self.nBuyLimit = self.nBuyLimit + 1
self:ChangeScore(-1 * nCost)
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_buy",
sContent = orderedFormat(ConfigTable.GetUIText("PenguinCard_AddRollSuccess"), self.nBuyLimit)
})
self:AfterUpgrade(nCost)
EventManager.Hit("PenguinCard_AddRoll")
end
function PenguinLevel_Normal:AddCheckRound()
if self.nCheckRoundLimit == self.nMaxCheckRound then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_AddBtnMaxLevel")
})
return
end
local nCost = self.tbCheckRoundUpgradeCost[self.nCheckRoundLimit + 1] * self.nUpgradeDiscount
if nCost > self.nScore then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_NotEnoughScoreUpgrade")
})
return
end
self.nCheckRoundLimit = self.nCheckRoundLimit + 1
self:ChangeScore(-1 * nCost)
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_buy",
sContent = orderedFormat(ConfigTable.GetUIText("PenguinCard_AddCheckRoundSuccess"), self.nRoundLimit)
})
self:AfterUpgrade(nCost)
EventManager.Hit("PenguinCard_AddCheckRound")
end
function PenguinLevel_Normal:GetPenguinCardWeightLevel()
return self.nCurTurn
end
function PenguinLevel_Normal:RunState_Dealing()
self:SaveSnapshot()
self.bCheckRound = self:GetSnapshotState()
self:AddCheckRoundBuff()
self.nCurRound = self.nCurRound + 1
self.nTotalRound = self.nTotalRound + 1
self:ClearRoundData()
self.mapCalBaseCardPool = clone(self.mapBaseCardPool)
for _, v in ipairs(self.tbBuff) do
v:ResetRoundTrigger()
end
for _, v in ipairs(self.tbPenguinCard) do
if v ~= 0 then
v:ResetRoundTrigger()
end
end
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.Dealing)
self.tbBaseCardId = PenguinCardUtils.WeightedRandom(self.mapCalBaseCardPool.tbId, self.mapCalBaseCardPool.tbWeight, self.nBaseCardCount, {}, true)
if 0 < self.nFixedTurnGroupId then
local nFixedId = self.nFixedTurnGroupId * 10000 + self.nCurTurn * 100 + self.nCurRound
local mapFixedCfg = ConfigTable.GetData("PenguinCardFixedTurn", nFixedId, true)
if mapFixedCfg then
self.tbBaseCardId = clone(mapFixedCfg.BaseCardId)
end
end
self.tbShowedCard = {}
for i = 1, self.nBaseCardCount do
self.tbShowedCard[i] = false
end
EventManager.Hit("PenguinCard_RunState_Dealing")
self:SwitchGameState()
end
function PenguinLevel_Normal:QuitState_Dealing(nNextState)
EventManager.Hit("PenguinCard_QuitState_Dealing", nNextState)
local nWaitTime = 0
if nNextState == PenguinCardUtils.GameState.Start then
nWaitTime = 0.6
elseif nNextState == PenguinCardUtils.GameState.Flip then
nWaitTime = self.bCheckRound and 1.87 or 0.85
elseif nNextState == PenguinCardUtils.GameState.Complete then
nWaitTime = 0.6
end
return nWaitTime
end
function PenguinLevel_Normal:AddCheckRoundBuff()
if not self.bCheckRound then
return
end
local nBuffId = ConfigTable.GetConfigNumber("PenguinCardCheckRoundBuffId")
local mapData = self:CreateBuff(nBuffId)
mapData:ResetAllTrigger()
self:AddBuff(mapData)
end
function PenguinLevel_Normal:RunState_Flip()
EventManager.Hit("PenguinCard_RunState_Flip")
self:PlayAuto()
end
function PenguinLevel_Normal:QuitState_Flip(nNextState)
self:StopAuto()
EventManager.Hit("PenguinCard_QuitState_Flip", nNextState)
local nWaitTime = 0
if nNextState == PenguinCardUtils.GameState.Start then
nWaitTime = 0.6
elseif nNextState == PenguinCardUtils.GameState.Settlement then
nWaitTime = 1
elseif nNextState == PenguinCardUtils.GameState.Complete then
nWaitTime = 0.6
end
return nWaitTime
end
function PenguinLevel_Normal:AfterShowBaseCard(mapCfg)
if self.mapQuest ~= nil then
for j = 1, 3 do
local nSuit = mapCfg["Suit" .. j]
local nCount = mapCfg["SuitCount" .. j]
if 0 < nSuit and 0 < nCount then
self.mapQuest:AddProgress(GameEnum.PenguinCardQuestType.SuitCount, {nId = nSuit, nCount = nCount})
end
end
end
end
function PenguinLevel_Normal:AfterCheckHandRank()
if self.mapQuest ~= nil then
self.mapQuest:AddProgress(GameEnum.PenguinCardQuestType.HandRank, {
nId = self.nHandRankId,
nCount = 1
})
end
end
function PenguinLevel_Normal:RunState_Settlement()
local HandRankSuitCount = self:AddSettlementHistory()
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.Settlement, {
HandRankSuitCount = HandRankSuitCount,
SuitCount = self.mapAllSuit,
HandRank = self.nHandRankId,
HandRankCount = self.tbHandRankCount
})
self:AddLog()
EventManager.Hit("PenguinCard_RunState_Settlement")
self:PlayAuto()
end
function PenguinLevel_Normal:QuitState_Settlement(nNextState)
self:StopAuto()
self:ChangeScore(self.nRoundScore)
if self.mapQuest ~= nil then
self.mapQuest:AddProgress(GameEnum.PenguinCardQuestType.Score, {
nCount = self.nRoundScore
})
end
self:EndRound()
if self:GetRoundLimitInTurn() == self.nCurRound then
self:EndTurn()
if self.mapQuest ~= nil then
self.mapQuest:AddTurnCount()
end
end
self.bCheckRound = false
self:ClearRoundData()
EventManager.Hit("PenguinCard_QuitState_Settlement", nNextState)
local nWaitTime = 0
if nNextState == PenguinCardUtils.GameState.Start then
nWaitTime = 0.6
elseif nNextState == PenguinCardUtils.GameState.Dealing then
nWaitTime = 0.57
elseif nNextState == PenguinCardUtils.GameState.Prepare then
nWaitTime = 0.57
elseif nNextState == PenguinCardUtils.GameState.Complete then
nWaitTime = 0.6
end
return nWaitTime
end
function PenguinLevel_Normal:RunState_Complete(mapParam)
self.nStar = self:GetStar()
EventManager.Hit("PenguinCard_RunState_Complete")
if self.nActId then
local tab = {}
table.insert(tab, {
"role_id",
tostring(PlayerData.Base._nPlayerId)
})
table.insert(tab, {
"activity_id",
tostring(self.nActId)
})
table.insert(tab, {
"battle_id",
tostring(self.nLevelId)
})
table.insert(tab, {
"round",
tostring(self.nCurTurn)
})
table.insert(tab, {
"result",
tostring(self.nStar == 0 and 2 or 1)
})
local nEnd = mapParam and mapParam.bManual == true and 2 or 1
table.insert(tab, {
"end_type",
tostring(nEnd)
})
table.insert(tab, {
"score",
tostring(self.nScore)
})
table.insert(tab, {
"star",
tostring(self.nStar)
})
local sId = ""
for i = 1, 6 do
if self.tbPenguinCard[i] ~= 0 then
if sId == "" then
sId = sId .. self.tbPenguinCard[i].nId
else
sId = sId .. "," .. self.tbPenguinCard[i].nId
end
end
end
table.insert(tab, {"card_list", sId})
table.insert(tab, {
"skill_1",
tostring(self.nRoundLimit)
})
table.insert(tab, {
"skill_2",
tostring(self.nSlotCount)
})
table.insert(tab, {
"skill_3",
tostring(self.nBuyLimit)
})
NovaAPI.UserEventUpload("minigame_PenguinCard", tab)
end
end
function PenguinLevel_Normal:QuitState_Complete()
self.nStar = 0
EventManager.Hit("PenguinCard_QuitState_Complete")
return 0
end
function PenguinLevel_Normal:OnEvent_ChangeScore(nBefore)
local nBeforeStar, nStar = 0, 0
for i, v in ipairs(self.tbStarScore) do
if v <= nBefore then
nBeforeStar = i
end
if v <= self.nScore then
nStar = i
end
end
if nBeforeStar == 0 and nStar == 1 and self.nGameState == PenguinCardUtils.GameState.Settlement then
self.bPreTurnWin = true
end
EventManager.Hit("PenguinCard_ChangeStar", nBeforeStar, nStar)
end
function PenguinLevel_Normal: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 PenguinLevel_Normal: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 PenguinLevel_Normal:SaveModeSnapshot(mapSnapshot)
mapSnapshot.bPreTurnWin = self.bPreTurnWin
local mapQuest = self.mapQuest
if mapQuest ~= nil then
mapSnapshot.mapQuest = mapQuest:Serialize()
end
end
function PenguinLevel_Normal:RestoreModeSnapshot(mapSnapshot)
self.bPreTurnWin = mapSnapshot.bPreTurnWin
self.mapQuest = nil
if mapSnapshot.mapQuest ~= nil then
local mapQuest = self:CreateQuest(mapSnapshot.mapQuest.nId)
mapQuest:Deserialize(mapSnapshot.mapQuest)
self.mapQuest = mapQuest
end
end
return PenguinLevel_Normal