Files
SL1900 80af235e05 Update - 1.12.0.120
EN: 1.12.0.120
CN: 1.12.0.120
JP: 1.12.0.124
KR: 1.12.0.124
2026-06-30 14:30:00 +09:00

1433 lines
44 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local PenguinLevel = class("PenguinLevel")
local PenguinCard = require("Game.UI.Play_PenguinCard.PenguinCard")
local PenguinCardBuff = require("Game.UI.Play_PenguinCard.PenguinCardBuff")
local PenguinCardQuest = require("Game.UI.Play_PenguinCard.PenguinCardQuest")
local TimerManager = require("GameCore.Timer.TimerManager")
local LocalData = require("GameCore.Data.LocalData")
local ConfigData = require("GameCore.Data.ConfigData")
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
function PenguinLevel:Init(nFloorId, nLevelId, nActId, tbStarScore)
self.nFloorId = nFloorId
self.tbStarScore = tbStarScore or {
0,
0,
0
}
self.nLevelId = nLevelId
self.nActId = nActId
self:ParseConfigData()
self:ParseLocalData()
EventManager.Hit(EventId.OpenPanel, PanelId.PenguinCard, self)
end
function PenguinLevel:ParseConfigData()
self.nBaseCardCount = ConfigTable.GetConfigNumber("PenguinCardHandCardCount")
self.nMaxRound = ConfigTable.GetConfigNumber("PenguinCardMaxRound")
self.nMaxSlot = ConfigTable.GetConfigNumber("PenguinCardMaxSlot")
self.nMaxBuyLimit = ConfigTable.GetConfigNumber("PenguinCardHandCardCount")
self.tbRoundUpgradeCost = ConfigTable.GetConfigNumberArray("PenguinCardRoundUpgradeCost")
self.tbSlotUpgradeCost = ConfigTable.GetConfigNumberArray("PenguinCardSlotUpgradeCost")
self.tbBuyLimitUpgradeCost = ConfigTable.GetConfigNumberArray("PenguinCardBuyLimitUpgradeCost")
self.nFireScore = ConfigTable.GetConfigNumber("PenguinCardFeverScore")
self.nPenguinCardRollCount = ConfigTable.GetConfigNumber("PenguinCardRollCount")
self.mapBuyCost = {}
local func_ForEach_Line = function(mapData)
self.mapBuyCost[mapData.Count] = {
Turn = mapData.Turn,
Cost = mapData.Cost
}
end
ForEachTableLine(DataTable.PenguinCardCost, func_ForEach_Line)
self.mapHandRankRule = {}
local func_ForEach_Rank = function(mapData)
self.mapHandRankRule[mapData.Order] = {
Id = mapData.Id,
SuitCount = mapData.SuitCount,
Value = mapData.Value,
Ratio = mapData.Ratio * ConfigData.IntFloatPrecision
}
end
ForEachTableLine(DataTable.PenguinCardHandRank, func_ForEach_Rank)
self.mapTendencyScore = {}
local func_ForEach_Tendency = function(mapData)
if not self.mapTendencyScore[mapData.GroupId] then
self.mapTendencyScore[mapData.GroupId] = {}
end
table.insert(self.mapTendencyScore[mapData.GroupId], mapData.Score)
end
ForEachTableLine(DataTable.PenguinCardTendency, func_ForEach_Tendency)
for _, v in pairs(self.mapTendencyScore) do
table.sort(v)
end
end
function PenguinLevel:ParseLocalData()
local bAuto = LocalData.GetPlayerLocalData("PenguinCardAuto")
self.bAuto = bAuto == true
local nSpeed = LocalData.GetPlayerLocalData("PenguinCardSpeed")
self.nSpeed = nSpeed or 1
end
function PenguinLevel:ParseLevelData(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.nFixedTurnGroupId = mapLevelCfg.FixedTurn
self.sLevelDesc = mapLevelCfg.Floortips
self.bShowWin = mapLevelCfg.ShowWin
self.nQuestTurn = mapLevelCfg.QuestTurn
self.nQuestGroup = mapLevelCfg.QuestGroup
self.nBuyLimit = mapLevelCfg.InitialBuyLimit
self.nWeightGroupId = mapLevelCfg.WeightGroup
local mapPoolCfg = ConfigTable.GetData("PenguinBaseCardPool", mapLevelCfg.PoolId)
if not mapPoolCfg then
return
end
self.mapBaseCardPool = {
tbId = mapPoolCfg.BaseCardId,
tbWeight = mapPoolCfg.Weight
}
end
function PenguinLevel:ClearLevelData()
self.nGameState = nil
self.nCurTurn = 0
self.nCurRound = 0
self.nHp = 3
if self.tbBuffPool == nil then
self.tbBuffPool = {}
end
if self.tbBuff == nil then
self.tbBuff = {}
elseif next(self.tbBuff) ~= nil then
local nCount = #self.tbBuff
for i = nCount, 1, -1 do
self:RecycleBuff(self.tbBuff[i])
table.remove(self.tbBuff, i)
end
end
if self.tbPenguinCardPool == nil then
self.tbPenguinCardPool = {}
end
if self.tbPenguinCard == nil then
self.tbPenguinCard = {}
for i = 1, 6 do
self.tbPenguinCard[i] = 0
end
elseif next(self.tbPenguinCard) ~= nil then
for i = 1, 6 do
local mapCard = self.tbPenguinCard[i]
if mapCard ~= 0 then
self:RecyclePenguinCard(mapCard)
self.tbPenguinCard[i] = 0
end
end
end
if self.tbQuestPool == nil then
self.tbQuestPool = {}
end
self.mapQuest = nil
self.mapLog = {}
self.nTotalRound = 0
self.nBestTurnScore = 0
self.nBestRoundScore = 0
self.mapHandRankHistory = {}
self.mapSuitHistory = {}
self.nGetPenguinCardCount = 0
end
function PenguinLevel:StartGame()
math.randomseed(os.time())
self:ClearLevelData()
self:ParseLevelData(self.nFloorId)
self:SwitchGameState()
end
function PenguinLevel:CompleteGame()
local nNextState = PenguinCardUtils.GameState.Complete
self:SwitchNextGameState(nNextState, {bManual = true})
end
function PenguinLevel:RestartGame()
local nNextState = PenguinCardUtils.GameState.Start
local nWaitTime = self:QuitGameState(nNextState)
if nWaitTime == 0 then
self:StartGame()
else
TimerManager.Add(1, nWaitTime, self, function()
self:StartGame()
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, nWaitTime)
end
end
function PenguinLevel:QuitGame(callback)
local bAct = false
if self.nActId then
local actData = PlayerData.Activity:GetActivityDataById(self.nActId)
if actData then
local bOpen = actData:CheckActivityOpen()
if bOpen then
bAct = true
local nScore = math.floor(self.nScore)
actData:SendActivityPenguinCardSettleReq(self.nLevelId, self.nStar, nScore, callback)
else
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
sContent = ConfigTable.GetUIText("Activity_Invalid_Tip_3")
})
end
end
end
if not bAct then
callback(true)
end
self:QuitGameState()
self:ClearLevelData()
end
function PenguinLevel:SwitchGameState()
local nNextState = self:CheckNextGameState()
self:SwitchNextGameState(nNextState)
end
function PenguinLevel:RunGameState(mapParam)
if self.nGameState == PenguinCardUtils.GameState.Start then
self:RunState_Start()
elseif self.nGameState == PenguinCardUtils.GameState.Prepare then
self:RunState_Prepare()
elseif self.nGameState == PenguinCardUtils.GameState.Dealing then
self:RunState_Dealing()
elseif self.nGameState == PenguinCardUtils.GameState.Flip then
self:RunState_Flip()
elseif self.nGameState == PenguinCardUtils.GameState.Settlement then
self:RunState_Settlement()
elseif self.nGameState == PenguinCardUtils.GameState.Complete then
self:RunState_Complete(mapParam)
elseif self.nGameState == PenguinCardUtils.GameState.Quest then
self:RunState_Quest()
end
end
function PenguinLevel:QuitGameState(nNextState)
local nWaitTime = 0
if self.nGameState == PenguinCardUtils.GameState.Start then
nWaitTime = self:QuitState_Start()
elseif self.nGameState == PenguinCardUtils.GameState.Prepare then
nWaitTime = self:QuitState_Prepare(nNextState)
elseif self.nGameState == PenguinCardUtils.GameState.Dealing then
nWaitTime = self:QuitState_Dealing(nNextState)
elseif self.nGameState == PenguinCardUtils.GameState.Flip then
nWaitTime = self:QuitState_Flip(nNextState)
elseif self.nGameState == PenguinCardUtils.GameState.Settlement then
nWaitTime = self:QuitState_Settlement(nNextState)
elseif self.nGameState == PenguinCardUtils.GameState.Complete then
nWaitTime = self:QuitState_Complete()
elseif self.nGameState == PenguinCardUtils.GameState.Quest then
nWaitTime = self:QuitState_Quest(nNextState)
end
return nWaitTime
end
function PenguinLevel: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:SwitchNextGameState(nNextState, mapParam)
local nWaitTime = self:QuitGameState(nNextState)
if nWaitTime == 0 then
self.nGameState = nNextState
self:RunGameState(mapParam)
else
TimerManager.Add(1, nWaitTime, self, function()
self.nGameState = nNextState
self:RunGameState(mapParam)
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, nWaitTime)
end
end
function PenguinLevel:RunState_Start()
EventManager.Hit("PenguinCard_RunState_Start")
end
function PenguinLevel:QuitState_Start()
EventManager.Hit("PenguinCard_QuitState_Start")
local nWaitTime = 0.167
return nWaitTime
end
function PenguinLevel: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: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: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: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: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: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:CompleteQuest()
local mapData = self:CreateBuff(self.mapQuest.nBuffId)
mapData:ResetAllTrigger()
self:AddBuff(mapData, true)
end
function PenguinLevel:ChangeHp(nChange)
self.nHp = self.nHp + nChange
if NovaAPI.IsEditorPlatform() then
printLog("Hp变化:" .. " " .. nChange .. " 当前:" .. self.nHp)
end
EventManager.Hit("PenguinCard_ChangeHp", nChange)
if self.nHp <= 0 then
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.FatalDamage, {nHpChange = nChange})
end
end
function PenguinLevel:AddBuff(mapBuff, bWaitShow)
if mapBuff.bOnly then
local nBuffCount = #self.tbBuff
for i = nBuffCount, 1, -1 do
if mapBuff.nId == self.tbBuff[i].nId then
self:DeleteBuff(i)
end
end
table.insert(self.tbBuff, mapBuff)
EventManager.Hit("PenguinCard_AddBuff", mapBuff, bWaitShow)
else
local nHasKey = 0
for k, v in pairs(self.tbBuff) do
if v.nId == mapBuff.nId then
nHasKey = k
break
end
end
if 0 < nHasKey then
self.tbBuff[nHasKey]:AddGrowthLayer()
else
table.insert(self.tbBuff, mapBuff)
EventManager.Hit("PenguinCard_AddBuff", mapBuff, bWaitShow)
end
end
if NovaAPI.IsEditorPlatform() then
printLog("获得buff" .. " " .. mapBuff.nId)
end
end
function PenguinLevel:DeleteBuff(i, nDelayTime)
self:RecycleBuff(self.tbBuff[i])
table.remove(self.tbBuff, i)
EventManager.Hit("PenguinCard_DeleteBuff", i, nDelayTime)
end
function PenguinLevel:RecycleBuff(mapBuff)
mapBuff:Clear()
table.insert(self.tbBuffPool, mapBuff)
end
function PenguinLevel:CreateBuff(nId)
local mapBuff
if next(self.tbBuffPool) == nil then
mapBuff = PenguinCardBuff.new(nId)
else
mapBuff = table.remove(self.tbBuffPool, 1)
mapBuff:Init(nId)
end
return mapBuff
end
function PenguinLevel:RecycleQuest(mapQuest)
mapQuest:Clear()
table.insert(self.tbQuestPool, mapQuest)
end
function PenguinLevel: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:RunState_Prepare()
self.nCurTurn = self.nCurTurn + 1
self.nCurRound = 0
self.nTurnBuyCount = 0
self.nTurnScore = 0
self.tbHandRankCount = {}
self.tbSelectablePenguinCard = {}
self.bSelectedPenguinCard = false
self.nUpgradeDiscount = 1
self.nTempAddRound = 0
self.nTempAddRollCount = 0
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:QuitState_Prepare(nNextState)
self:ClearSelectablePenguinCard()
self.nTurnBuyCount = 0
self.tbSelectablePenguinCard = {}
self.bSelectedPenguinCard = false
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:GetRoundLimitInTurn()
return self.nRoundLimit + self.nTempAddRound
end
function PenguinLevel: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: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: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:AfterUpgrade(nUpgradeCost)
self.nUpgradeDiscount = 1
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.AfterUpgrade, {nUpgradeCost = nUpgradeCost})
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.BeforeUpgrade)
end
function PenguinLevel:FreeRollPenguinCard()
local tbId = self:GetRollPenguinCardResult()
if next(tbId) == nil then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_Error_EmptyPenguinCard")
})
return
end
self:ClearSelectablePenguinCard()
for _, nId in ipairs(tbId) do
local mapCard = self:CreatePenguinCard(nId)
table.insert(self.tbSelectablePenguinCard, mapCard)
end
self.bSelectedPenguinCard = false
end
function PenguinLevel:RollPenguinCard()
if self.nTurnBuyCount >= self.nBuyLimit then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_RollMax")
})
return
end
local nCost = self:GetRollPenguinCardCost()
if nCost > self.nScore then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_NotEnoughScoreRoll")
})
return
end
local tbId = self:GetRollPenguinCardResult()
if next(tbId) == nil then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
sSound = "Mode_Card_refresh_falied",
sContent = ConfigTable.GetUIText("PenguinCard_Error_EmptyPenguinCard")
})
return
end
self.nTurnBuyCount = self.nTurnBuyCount + 1
self:ChangeScore(-1 * nCost)
self:ClearSelectablePenguinCard()
for _, nId in ipairs(tbId) do
local mapCard = self:CreatePenguinCard(nId)
table.insert(self.tbSelectablePenguinCard, mapCard)
end
self.bSelectedPenguinCard = false
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.ManualRoll)
EventManager.Hit("PenguinCard_RollPenguinCard")
end
function PenguinLevel:SelectPenguinCard(nIndex)
local mapSelectCard = self.tbSelectablePenguinCard[nIndex]
local bUpgrade, nAimIndex = self:CheckUpgradePenguinCard(mapSelectCard)
if not bUpgrade and self:GetOwnPenguinCardCount() >= self.nSlotCount then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("PenguinCard_SlotMax"))
return
end
if bUpgrade then
local nAddLevel = mapSelectCard.nLevel
self.tbPenguinCard[nAimIndex]:Upgrade(nAddLevel)
else
local mapCard = self:CreatePenguinCard(mapSelectCard.nId)
self.tbPenguinCard[nAimIndex] = mapCard
end
self.tbPenguinCard[nAimIndex]:SetSlotIndex(nAimIndex)
self.tbPenguinCard[nAimIndex]:ResetAllTrigger()
self.bSelectedPenguinCard = true
self.nGetPenguinCardCount = self.nGetPenguinCardCount + 1
self:AfterChangePenguinCard()
EventManager.Hit("PenguinCard_SelectPenguinCard", nAimIndex, bUpgrade)
end
function PenguinLevel:AfterChangePenguinCard()
local nAllLevel = 0
for _, v in ipairs(self.tbPenguinCard) do
if v ~= 0 then
nAllLevel = nAllLevel + v.nLevel
end
end
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.PenguinCardChange, {PenguinCardLevel = nAllLevel})
end
function PenguinLevel:CheckUpgradePenguinCard(mapSelectCard)
local bUpgrade = false
local nFirstEmpty = 0
local nAimIndex = 0
for i, v in ipairs(self.tbPenguinCard) do
if v == 0 and nFirstEmpty == 0 then
nFirstEmpty = i
end
if v ~= 0 and v.nGroupId == mapSelectCard.nGroupId then
bUpgrade = true
nAimIndex = i
break
end
end
if not bUpgrade then
nAimIndex = nFirstEmpty
end
return bUpgrade, nAimIndex
end
function PenguinLevel:SalePenguinCard(nIndex)
self:ChangeScore(self.tbPenguinCard[nIndex].nSoldPrice)
local mapCard = self.tbPenguinCard[nIndex]
local nGroupId = mapCard.nGroupId
self:RecyclePenguinCard(mapCard)
self.tbPenguinCard[nIndex] = 0
self:AfterChangePenguinCard()
EventManager.Hit("PenguinCard_SalePenguinCard", nIndex, nGroupId)
end
function PenguinLevel:GetRollPenguinCardCost()
local findIntervalIndex = function(x, starts)
if not starts or #starts == 0 or x < starts[1] then
return 1
end
local low, high = 1, #starts
local best = 1
while low <= high do
local mid = math.floor((low + high) / 2)
if x >= starts[mid] then
best = mid
low = mid + 1
else
high = mid - 1
end
end
return best
end
local mapData = self.mapBuyCost[self.nTurnBuyCount + 1]
local nIndex = findIntervalIndex(self.nCurTurn, mapData.Turn)
local nCost = mapData.Cost[nIndex]
return nCost
end
function PenguinLevel:ClearSelectablePenguinCard()
if next(self.tbSelectablePenguinCard) ~= nil then
for i = #self.tbSelectablePenguinCard, 1, -1 do
local mapCard = table.remove(self.tbSelectablePenguinCard, i)
self:RecyclePenguinCard(mapCard)
end
end
end
function PenguinLevel:GetRollPenguinCardResult()
local mapWeightCfg = ConfigTable.GetData("PenguinCardWeight", self.nWeightGroupId * 100 + self.nCurTurn)
if not mapWeightCfg then
return {}
end
local tbWeight = clone(mapWeightCfg.Weight)
self:AddPenguinCardWeightByTendency(tbWeight, mapWeightCfg.CardList)
local tbMaxGroupId = self:GetMaxLevelPenguinCard()
local nRoll = self.nPenguinCardRollCount + self.nTempAddRollCount
local tbId = PenguinCardUtils.WeightedRandom(mapWeightCfg.CardList, tbWeight, nRoll, tbMaxGroupId)
return tbId
end
function PenguinLevel:AddPenguinCardWeightByTendency(tbWeight, tbCardList)
local tbCardAdd = {}
local tbTendencyId = self:GetRollPenguinCardTendency()
for _, nTendencyId in pairs(tbTendencyId) do
local mapTendencyCfg = ConfigTable.GetData("PenguinCardTendency", nTendencyId)
if mapTendencyCfg then
local mapAddWeight = {}
for i, v in ipairs(mapTendencyCfg.CardGroup) do
mapAddWeight[v] = mapTendencyCfg.AddWeight[i]
end
for i, v in ipairs(tbCardList) do
local mapCardCfg = ConfigTable.GetData("PenguinCard", v)
if mapCardCfg and mapAddWeight[mapCardCfg.GroupId] then
tbWeight[i] = tbWeight[i] + mapAddWeight[mapCardCfg.GroupId]
if not tbCardAdd[v] then
tbCardAdd[v] = 0
end
tbCardAdd[v] = tbCardAdd[v] + mapAddWeight[mapCardCfg.GroupId]
end
end
end
end
return tbCardAdd
end
function PenguinLevel:GetRollPenguinCardTendency()
local mapTendency = {}
for _, v in ipairs(self.tbPenguinCard) do
if v ~= 0 and 0 < v.nTendencyGroup then
if not mapTendency[v.nTendencyGroup] then
mapTendency[v.nTendencyGroup] = 0
end
mapTendency[v.nTendencyGroup] = mapTendency[v.nTendencyGroup] + v.nTendencyScore
end
end
local tbTendencyId = {}
for nGroup, nScore in pairs(mapTendency) do
local tbScore = self.mapTendencyScore[nGroup]
local nLevel = 0
for k, v in ipairs(tbScore) do
if v <= nScore then
nLevel = k
end
end
if 0 < nLevel then
local nTendencyId = nGroup * 100 + nLevel
table.insert(tbTendencyId, nTendencyId)
end
end
return tbTendencyId
end
function PenguinLevel:GetMaxLevelPenguinCard()
local tbGroupId = {}
for _, v in ipairs(self.tbPenguinCard) do
if v ~= 0 and v.nLevel == v.nMaxLevel then
table.insert(tbGroupId, v.nGroupId)
end
end
return tbGroupId
end
function PenguinLevel:ChangeSpecificCard(tbAimId)
if next(self.tbSelectablePenguinCard) == nil then
return
end
local tbMaxGroupId = self:GetMaxLevelPenguinCard()
for i = #tbAimId, 1, -1 do
local mapCardCfg = ConfigTable.GetData("PenguinCard", tbAimId[i])
if mapCardCfg and table.indexof(tbMaxGroupId, mapCardCfg.GroupId) > 0 then
table.remove(tbAimId, i)
end
end
if next(tbAimId) == nil then
return
end
local nHasIndex = 0
for i, v in ipairs(self.tbSelectablePenguinCard) do
if 0 < table.indexof(tbAimId, v.nId) then
nHasIndex = i
v:SetHighLight(true)
break
end
end
if nHasIndex == 0 then
local nAimId = tbAimId[math.random(#tbAimId)]
local tbAimIndex = {}
for i, v in ipairs(self.tbSelectablePenguinCard) do
if not v.bHighLight then
table.insert(tbAimIndex, i)
end
end
if next(tbAimIndex) == nil then
return
end
local nAimIndex = tbAimIndex[math.random(#tbAimIndex)]
self.tbSelectablePenguinCard[nAimIndex]:Init(nAimId)
self.tbSelectablePenguinCard[nAimIndex]:SetHighLight(true)
end
end
function PenguinLevel:RecyclePenguinCard(mapCard)
mapCard:Clear()
table.insert(self.tbPenguinCardPool, mapCard)
end
function PenguinLevel:CreatePenguinCard(nId)
local mapCard
if next(self.tbPenguinCardPool) == nil then
mapCard = PenguinCard.new(nId)
else
mapCard = table.remove(self.tbPenguinCardPool, 1)
mapCard:Init(nId)
end
return mapCard
end
function PenguinLevel:RunState_Dealing()
self.nCurRound = self.nCurRound + 1
self.nTotalRound = self.nTotalRound + 1
self.tbHandRank = {}
self.nHandRankId = 0
self.mapAllSuit = {}
self.nRoundScore = 0
self.nRoundValue = 0
self.nRoundRatio = 1
self.nRoundMultiRatio = 0
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 = 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: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 = 0.85
elseif nNextState == PenguinCardUtils.GameState.Complete then
nWaitTime = 0.6
end
return nWaitTime
end
function PenguinLevel:ChangeBaseCardWeight(tbChangeWeight)
for k, v in pairs(tbChangeWeight) do
local nIndex = table.indexof(self.mapCalBaseCardPool.tbId, tonumber(k))
self.mapCalBaseCardPool.tbWeight[nIndex] = self.mapCalBaseCardPool.tbWeight[nIndex] + v
end
end
function PenguinLevel:RunState_Flip()
EventManager.Hit("PenguinCard_RunState_Flip")
self:PlayAuto()
end
function PenguinLevel: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:ShowBaseCard(nIndex)
local add = function(i)
if self.tbShowedCard[i] == false then
self.tbShowedCard[i] = true
local nId = self.tbBaseCardId[i]
local mapCfg = ConfigTable.GetData("PenguinBaseCard", nId)
if mapCfg then
if not self.mapAllSuit[mapCfg.Suit1] then
self.mapAllSuit[mapCfg.Suit1] = 0
end
self.mapAllSuit[mapCfg.Suit1] = self.mapAllSuit[mapCfg.Suit1] + mapCfg.SuitCount1
local SuitCards = {}
if 0 < mapCfg.SuitCount1 then
table.insert(SuitCards, mapCfg.Suit1)
end
if 0 < mapCfg.SuitCount2 then
table.insert(SuitCards, mapCfg.Suit2)
end
local SuitCount = {}
if 0 < mapCfg.SuitCount1 then
SuitCount[mapCfg.Suit1] = mapCfg.SuitCount1
end
if 0 < mapCfg.SuitCount2 then
SuitCount[mapCfg.Suit2] = mapCfg.SuitCount2
end
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.Flip, {
SuitCards = SuitCards,
SuitCount = SuitCount,
BaseCard = {nId = nId, nIndex = i}
})
end
local mapAfterCfg = ConfigTable.GetData("PenguinBaseCard", self.tbBaseCardId[i])
if mapAfterCfg then
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.FlipEnd, {
BaseCard = {
nId = self.tbBaseCardId[i],
nIndex = i
}
})
if self.mapQuest ~= nil then
self.mapQuest:AddProgress(GameEnum.PenguinCardQuestType.SuitCount, {
nId = mapAfterCfg.Suit1,
nCount = mapAfterCfg.SuitCount1
})
end
end
end
end
local bAll = nIndex == nil
if bAll then
for i = 1, self.nBaseCardCount do
add(i)
end
else
add(nIndex)
end
local nShowed = self:GetShowedCardCount()
if nShowed == self.nBaseCardCount then
self:CheckHandRank()
self:SwitchGameState()
end
EventManager.Hit("PenguinCard_ShowBaseCard", nIndex)
end
function PenguinLevel:CheckHandRank()
local tbAllSuit = {}
for k, v in pairs(self.mapAllSuit) do
table.insert(tbAllSuit, {nSuit = k, nCount = v})
end
table.sort(tbAllSuit, function(a, b)
return a.nCount > b.nCount
end)
for _, v in ipairs(self.mapHandRankRule) do
self.tbHandRank = {}
local tbCount = v.SuitCount
local nType = #tbCount
local nHasType = #tbAllSuit
local nAble = 0
if nType <= nHasType then
for i = 1, nType do
if tbAllSuit[i].nCount >= tbCount[i] then
nAble = nAble + 1
for _ = 1, tbCount[i] do
table.insert(self.tbHandRank, tbAllSuit[i].nSuit)
end
end
end
end
if nAble == nType then
self.nHandRankId = v.Id
if not self.tbHandRankCount[self.nHandRankId] then
self.tbHandRankCount[self.nHandRankId] = 0
end
self.tbHandRankCount[self.nHandRankId] = self.tbHandRankCount[self.nHandRankId] + 1
self:ChangeRoundScore(v.Value, v.Ratio, 0, true)
if self.mapQuest ~= nil then
self.mapQuest:AddProgress(GameEnum.PenguinCardQuestType.HandRank, {
nId = self.nHandRankId,
nCount = 1
})
end
break
end
end
end
function PenguinLevel:ChangeRoundScore(nAddValue, nAddRatio, nAddMultiRatio, bFromHandRank)
local nBeforeScore = self.nRoundScore
local nBeforeBase = self.nRoundValue
local nBeforeMultiRatio = self.nRoundMultiRatio
local nBeforeRatio = self.nRoundRatio
self.nRoundValue = self.nRoundValue + nAddValue
if 0 < nAddMultiRatio then
if self.nRoundMultiRatio == 0 then
self.nRoundMultiRatio = 1
end
self.nRoundMultiRatio = self.nRoundMultiRatio + (nAddMultiRatio - 1)
end
self.nRoundRatio = self.nRoundRatio + nAddRatio
local nBeforeAllRatio = 0 < nBeforeMultiRatio and nBeforeMultiRatio * nBeforeRatio or nBeforeRatio
local nAfterAllRatio = self.nRoundMultiRatio > 0 and self.nRoundRatio * self.nRoundMultiRatio or self.nRoundRatio
nBeforeAllRatio = math.floor(nBeforeAllRatio * 100) / 100
nAfterAllRatio = math.floor(nAfterAllRatio * 100) / 100
self.nRoundScore = self.nRoundValue * nAfterAllRatio
local nAddScore = self.nRoundScore - nBeforeScore
self.nTurnScore = self.nTurnScore + nAddScore
if self.nTurnScore > self.nBestTurnScore then
self.nBestTurnScore = self.nTurnScore
end
if self.nRoundScore > self.nBestRoundScore then
self.nBestRoundScore = self.nRoundScore
end
EventManager.Hit("PenguinCard_ChangeRoundScore", nBeforeBase, nBeforeAllRatio, nBeforeScore, bFromHandRank)
if NovaAPI.IsEditorPlatform() then
printLog("轮积分变化:" .. nAddScore .. " (" .. nBeforeScore .. " -> " .. self.nRoundScore .. ")")
printLog("基础变化:" .. nAddValue .. " (" .. nBeforeBase .. " -> " .. self.nRoundValue .. ")")
printLog("倍率变化:" .. nAfterAllRatio - nBeforeAllRatio .. " (" .. nBeforeAllRatio .. " -> " .. nAfterAllRatio .. ")")
end
end
function PenguinLevel:GetShowedCardCount()
local nShowed = 0
for _, v in pairs(self.tbShowedCard) do
if v then
nShowed = nShowed + 1
end
end
return nShowed
end
function PenguinLevel:ReplaceBaseCard(nIndex, nBeforeId, nAfterId)
local mapBeforeCfg = ConfigTable.GetData("PenguinBaseCard", nBeforeId)
local mapAfterCfg = ConfigTable.GetData("PenguinBaseCard", nAfterId)
if not mapBeforeCfg or not mapAfterCfg then
return
end
self.mapAllSuit[mapBeforeCfg.Suit1] = self.mapAllSuit[mapBeforeCfg.Suit1] - mapBeforeCfg.SuitCount1
if not self.mapAllSuit[mapAfterCfg.Suit1] then
self.mapAllSuit[mapAfterCfg.Suit1] = 0
end
self.mapAllSuit[mapAfterCfg.Suit1] = self.mapAllSuit[mapAfterCfg.Suit1] + mapAfterCfg.SuitCount1
self.tbBaseCardId[nIndex] = nAfterId
EventManager.Hit("PenguinCard_ReplaceBaseCard", nIndex)
end
function PenguinLevel:RunState_Settlement()
if not self.mapHandRankHistory[self.nHandRankId] then
self.mapHandRankHistory[self.nHandRankId] = 0
end
self.mapHandRankHistory[self.nHandRankId] = self.mapHandRankHistory[self.nHandRankId] + 1
local HandRankSuitCount = {}
for _, v in ipairs(self.tbHandRank) do
if not HandRankSuitCount[v] then
HandRankSuitCount[v] = 0
end
HandRankSuitCount[v] = HandRankSuitCount[v] + 1
if not self.mapSuitHistory[v] then
self.mapSuitHistory[v] = 0
end
self.mapSuitHistory[v] = self.mapSuitHistory[v] + 1
end
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:QuitState_Settlement(nNextState)
self:StopAuto()
self:ChangeScore(self.nRoundScore)
if self.mapQuest ~= nil then
self.mapQuest:AddProgress(GameEnum.PenguinCardQuestType.Score, {
nCount = self.nRoundScore
})
end
if self:GetRoundLimitInTurn() == self.nCurRound then
self:EndTurn()
end
self.tbHandRank = {}
self.nHandRankId = 0
self.mapAllSuit = {}
self.nRoundScore = 0
self.nRoundValue = 0
self.nRoundRatio = 1
self.nRoundMultiRatio = 0
self.mapCalBaseCardPool = {}
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:EndTurn()
local nBuffCount = #self.tbBuff
for i = nBuffCount, 1, -1 do
local bAble = self.tbBuff[i]:AddDuration_Turn()
if not bAble then
self:DeleteBuff(i)
end
end
if self.mapQuest ~= nil then
self.mapQuest:AddTurnCount()
end
end
function PenguinLevel:AddLog()
if not self.mapLog[self.nCurTurn] then
self.mapLog[self.nCurTurn] = {
nTurnScore = 0,
tbRound = {}
}
end
self.mapLog[self.nCurTurn].nTurnScore = self.nTurnScore
if not self.mapLog[self.nCurTurn].tbRound[self.nCurRound] then
self.mapLog[self.nCurTurn].tbRound[self.nCurRound] = {
nRoundScore = 0,
tbHandRank = {}
}
end
self.mapLog[self.nCurTurn].tbRound[self.nCurRound].nRoundScore = self.nRoundScore
self.mapLog[self.nCurTurn].tbRound[self.nCurRound].tbHandRank = clone(self.tbHandRank)
self.mapLog[self.nCurTurn].tbRound[self.nCurRound].nHandRankId = self.nHandRankId
end
function PenguinLevel: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:QuitState_Complete()
self.nStar = 0
EventManager.Hit("PenguinCard_QuitState_Complete")
return 0
end
function PenguinLevel:GetMostHandRank()
local nCount = 0
local nId = 0
for k, v in pairs(self.mapHandRankHistory) do
if v > nCount then
nCount = v
nId = k
end
end
return nId, nCount
end
function PenguinLevel:GetMostSuit()
local nCount = 0
local nId = 0
for k, v in pairs(self.mapSuitHistory) do
if v > nCount then
nCount = v
nId = k
end
end
return nId, nCount
end
function PenguinLevel:GetBestPenguinCard()
local nCount = 0
local mapCard
for _, v in ipairs(self.tbPenguinCard) do
if v ~= 0 and nCount < v.nLevel then
nCount = v.nLevel
mapCard = v
end
end
return mapCard
end
function PenguinLevel:SetAutoState(bAuto)
self.bAuto = bAuto
LocalData.SetPlayerLocalData("PenguinCardAuto", self.bAuto)
end
function PenguinLevel:SetAutoSpeed(nSpeed)
self.nSpeed = nSpeed
LocalData.SetPlayerLocalData("PenguinCardSpeed", self.nSpeed)
if self.sequence then
self:StopAuto()
self:PlayAuto()
end
end
function PenguinLevel:PlayAuto(bClick)
if not self.bAuto or self.bPause then
return
end
if self.nGameState == PenguinCardUtils.GameState.Flip then
self.sequence = DOTween.Sequence()
for j = 1, self.nBaseCardCount do
if self.tbShowedCard[j] == false then
self.sequence:AppendCallback(function()
self:ShowBaseCard(j)
end)
self.sequence:AppendInterval(0.2 / self.nSpeed)
end
end
self.sequence:SetUpdate(true)
elseif self.nGameState == PenguinCardUtils.GameState.Settlement then
local bKeep = not PlayerData.Guide:CheckGuideFinishById(302)
if EditorSettings and EditorSettings.bJumpGuide then
bKeep = false
end
if bKeep then
return
end
self.sequence = DOTween.Sequence()
if not bClick then
self.sequence:AppendInterval((self.nRoundValue >= self.nFireScore and 7 or 5) / self.nSpeed)
end
self.sequence:AppendCallback(function()
EventManager.Hit("PenguinCard_QuitScoreAni")
if self:GetRoundLimitInTurn() == self.nCurRound and self.nCurTurn < self.nMaxTurn then
local callback = function()
self:SwitchGameState()
end
EventManager.Hit("PenguinCard_OpenLog", self.nCurTurn, false, callback)
else
self:SwitchGameState()
end
end)
self.sequence:SetUpdate(true)
end
end
function PenguinLevel:StopAuto()
if self.sequence then
self.sequence:Kill()
self.sequence = nil
end
end
function PenguinLevel:Pause()
self.bPause = true
if self.sequence then
self.sequence:Pause()
end
EventManager.Hit("PenguinCard_Pause")
end
function PenguinLevel:Resume()
self.bPause = false
if self.sequence then
self.sequence:Play()
else
self:PlayAuto()
end
EventManager.Hit("PenguinCard_Resume")
end
function PenguinLevel:ChangeScore(nChange)
if not nChange or nChange == 0 then
return
end
local nBefore = self.nScore
self.nScore = self.nScore + nChange
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_ChangeScore", nBefore, nBeforeStar, nStar)
if NovaAPI.IsEditorPlatform() then
printLog("总积分变化:" .. nChange .. " (" .. nBefore .. " -> " .. self.nScore .. ")")
end
end
function PenguinLevel:GetStar()
local nStar = 0
for i, v in ipairs(self.tbStarScore) do
if v <= self.nScore then
nStar = i
end
end
return nStar
end
function PenguinLevel:GetOwnPenguinCardCount()
local nCount = 0
for i = 1, 6 do
if self.tbPenguinCard[i] ~= 0 then
nCount = nCount + 1
end
end
return nCount
end
function PenguinLevel:ExecuteEffect(nEffectType, mapEffectValue, mapTriggerSource)
if nEffectType == GameEnum.PenguinCardEffectType.AddBaseCardWeight then
self:ChangeBaseCardWeight(mapEffectValue)
elseif nEffectType == GameEnum.PenguinCardEffectType.ReplaceBaseCard then
self:ReplaceBaseCard(mapTriggerSource.BaseCard.nIndex, mapTriggerSource.BaseCard.nId, mapEffectValue[1])
elseif nEffectType == GameEnum.PenguinCardEffectType.IncreaseBasicChips then
self:ChangeRoundScore(mapEffectValue, 0, 0)
elseif nEffectType == GameEnum.PenguinCardEffectType.IncreaseMultiplier then
self:ChangeRoundScore(0, mapEffectValue, 0)
elseif nEffectType == GameEnum.PenguinCardEffectType.MultiMultiplier then
self:ChangeRoundScore(0, 0, mapEffectValue)
elseif nEffectType == GameEnum.PenguinCardEffectType.UpgradeDiscount then
self.nUpgradeDiscount = mapEffectValue / 100
elseif nEffectType == GameEnum.PenguinCardEffectType.AddRound then
self.nTempAddRound = self.nTempAddRound + mapEffectValue
elseif nEffectType == GameEnum.PenguinCardEffectType.AddCardRollCount then
self.nTempAddRollCount = self.nTempAddRollCount + mapEffectValue
elseif nEffectType == GameEnum.PenguinCardEffectType.BlockFatalDamage then
self:ChangeHp(-1 * mapTriggerSource.nHpChange)
EventManager.Hit("PenguinCard_BlockFatalDamage")
elseif nEffectType == GameEnum.PenguinCardEffectType.UpgradeRebate then
self:ChangeScore(mapTriggerSource.nUpgradeCost * mapEffectValue / 100)
elseif nEffectType == GameEnum.PenguinCardEffectType.RollSpecificCard then
self:ChangeSpecificCard(mapEffectValue)
end
end
function PenguinLevel:TriggerEffect(nTriggerPhase, mapTriggerSource)
local callback = function(nEffectType, mapEffectValue)
self:ExecuteEffect(nEffectType, mapEffectValue, mapTriggerSource)
end
local nBuffCount = #self.tbBuff
for i = nBuffCount, 1, -1 do
local bTriggered = self.tbBuff[i]:Trigger(nTriggerPhase, mapTriggerSource, callback)
if bTriggered then
local bAble = self.tbBuff[i]:AddDuration_Count()
if not bAble then
local nDelayTime = self.tbBuff[i]:GetDelayTime()
self:DeleteBuff(i, nDelayTime)
end
end
end
for _, v in ipairs(self.tbPenguinCard) do
if v ~= 0 then
v:Trigger(nTriggerPhase, mapTriggerSource, callback)
v:Growth(nTriggerPhase, mapTriggerSource)
end
end
end
return PenguinLevel