Update - 1.9.0.103

EN: 1.9.0.103
CN: 1.9.0.104
JP: 1.9.0.106
KR: 1.9.0.108
This commit is contained in:
SL1900
2026-04-18 00:15:00 +09:00
parent 35fe1f046d
commit e0549005e1
1150 changed files with 941124 additions and 19847 deletions
+69 -135
View File
@@ -1,9 +1,5 @@
local PenguinCard = class("PenguinCard")
local SuitName = {
[GameEnum.PenguinBaseCardSuit.Blue] = "<sprite name=\"icon_PengCard_Water_small\">",
[GameEnum.PenguinBaseCardSuit.Red] = "<sprite name=\"icon_PengCard_Fire_small\">",
[GameEnum.PenguinBaseCardSuit.Green] = "<sprite name=\"icon_PengCard_Wind_small\">"
}
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
function PenguinCard:ctor(nId)
self:Clear()
self:Init(nId)
@@ -12,8 +8,12 @@ function PenguinCard:Upgrade(nAddLevel)
local nAfter = self.nLevel + nAddLevel
nAfter = nAfter > self.nMaxLevel and self.nMaxLevel or nAfter
local nId = self:GetIdByLevel(self.nGroupId, nAfter)
local nCacheGrowthLayer = 0
if self.nGrowthType ~= GameEnum.PenguinCardGrowthType.None and not self.bUpgradeResetGrowth then
nCacheGrowthLayer = self.nGrowthLayer
end
self:Clear()
self:Init(nId)
self:Init(nId, nCacheGrowthLayer)
end
function PenguinCard:Clear()
self.nId = nil
@@ -33,11 +33,18 @@ function PenguinCard:Clear()
self.nTriggerLimitParam = nil
self.nEffectType = nil
self.tbEffectParam = nil
self.sDesc = nil
self.nGrowthType = nil
self.bUpgradeResetGrowth = nil
self.nGrowthTriggerPhase = nil
self.nGrowthTriggerType = nil
self.tbGrowthTriggerParam = nil
self.tbGrowthEffectParam = nil
self.nTriggerCount = nil
self.nGrowthLayer = nil
end
function PenguinCard:Init(nId)
function PenguinCard:Init(nId, nGrowthLayer)
self.nId = nId
self.nGrowthLayer = nGrowthLayer or 0
self:ParseConfigData(nId)
end
function PenguinCard:ParseConfigData(nId)
@@ -60,98 +67,27 @@ function PenguinCard:ParseConfigData(nId)
self.nTriggerLimitParam = mapCfg.TriggerLimitParam
self.nEffectType = mapCfg.EffectType
self.tbEffectParam = decodeJson(mapCfg.EffectParam)
self.sDesc = self:SetDesc(mapCfg)
self.nGrowthType = mapCfg.GrowthType
self.bUpgradeResetGrowth = mapCfg.UpgradeResetGrowth
self.nGrowthTriggerPhase = mapCfg.GrowthTriggerPhase
self.nGrowthTriggerType = mapCfg.GrowthTriggerType
self.tbGrowthTriggerParam = decodeJson(mapCfg.GrowthTriggerParam)
self.tbGrowthEffectParam = decodeJson(mapCfg.GrowthEffectParam)
end
function PenguinCard:SetSlotIndex(nSlotIndex)
self.nSlotIndex = nSlotIndex
end
function PenguinCard:SetDesc(mapCfg)
local ParseTriggerParam = function(tbParam, nIndex)
if self.nTriggerType == GameEnum.PenguinCardTriggerType.SuitCards then
local nSuit = tbParam[nIndex]
return SuitName[nSuit]
elseif self.nTriggerType == GameEnum.PenguinCardTriggerType.BaseCardId then
local nBaseCardId = tbParam[nIndex]
local mapBase = ConfigTable.GetData("PenguinBaseCard", nBaseCardId)
if mapBase then
return mapBase.Title
end
elseif self.nTriggerType == GameEnum.PenguinCardTriggerType.SuitCount or self.nTriggerType == GameEnum.PenguinCardTriggerType.HandRankSuitCount then
local mapSuit = {}
for k, v in pairs(tbParam) do
local nSuit = tonumber(k)
if nSuit then
mapSuit[nSuit] = v
end
end
local i = 1
for nSuit, v in ipairsSorted(mapSuit) do
if i == nIndex then
local sName = ""
for _ = 1, v do
sName = sName .. SuitName[nSuit]
end
return sName
end
i = i + 1
end
end
function PenguinCard:GetDesc()
local mapCfg = ConfigTable.GetData("PenguinCard", self.nId)
if nil == mapCfg then
return ""
end
local ParseEffectParam = function(tbParam, nIndex)
if self.nEffectType == GameEnum.PenguinCardEffectType.AddBaseCardWeight then
local tbId = {}
for k, _ in pairs(tbParam) do
local nId = tonumber(k)
if nId then
table.insert(tbId, nId)
end
end
table.sort(tbId, function(a, b)
return a < b
end)
local nBaseCardId = tbId[nIndex]
local mapBase = ConfigTable.GetData("PenguinBaseCard", nBaseCardId)
if mapBase then
return mapBase.Title
end
elseif self.nEffectType == GameEnum.PenguinCardEffectType.ReplaceBaseCard then
local nBaseCardId = tbParam[nIndex]
local mapBase = ConfigTable.GetData("PenguinBaseCard", nBaseCardId)
if mapBase then
return mapBase.Title
end
elseif self.nEffectType == GameEnum.PenguinCardEffectType.IncreaseBasicChips or self.nEffectType == GameEnum.PenguinCardEffectType.IncreaseMultiplier or self.nEffectType == GameEnum.PenguinCardEffectType.MultiMultiplier then
return tbParam[nIndex]
end
end
local result = string.gsub(mapCfg.Desc, "%b{}", function(token)
local content = string.match(token, "^{(.-)}$")
local sParameterKey, lang, langIdx = ParseLanguageParam(content)
if lang ~= nil then
token = string.format("{%s}", sParameterKey)
end
if token == "{TriggerProbability}" then
return mapCfg.TriggerProbability
elseif token == "{TriggerLimitParam}" then
return mapCfg.TriggerLimitParam
end
local trigIdx = string.match(token, "^{TriggerParam_(%d+)}$")
if trigIdx then
local idx = tonumber(trigIdx)
local str = ParseTriggerParam(decodeJson(mapCfg.TriggerParam), idx)
str = LanguagePost(lang, langIdx, str)
return str
end
local effectIdx = string.match(token, "^{EffectParam_(%d+)}$")
if effectIdx then
local idx = tonumber(effectIdx)
local str = ParseEffectParam(decodeJson(mapCfg.EffectParam), idx)
str = LanguagePost(lang, langIdx, str)
return str
end
return token
end)
return result
return PenguinCardUtils.SetEffectDesc(mapCfg, self.nGrowthLayer)
end
function PenguinCard:ResetAllTrigger()
self:ResetGameTrigger()
self:ResetRoundTrigger()
self:ResetTurnTrigger()
end
function PenguinCard:ResetGameTrigger()
if self.nTriggerLimit == GameEnum.PenguinCardTriggerLimit.Game then
@@ -167,6 +103,9 @@ function PenguinCard:ResetTurnTrigger()
if self.nTriggerLimit == GameEnum.PenguinCardTriggerLimit.Turn then
self.nTriggerCount = 0
end
if self.nGrowthType == GameEnum.PenguinCardGrowthType.CurTurn then
self.nGrowthLayer = 0
end
end
function PenguinCard:Trigger(nTriggerPhase, mapTriggerSource, callback)
if self.nTriggerLimit ~= GameEnum.PenguinCardTriggerLimit.None and self.nTriggerCount >= self.nTriggerLimitParam then
@@ -175,59 +114,54 @@ function PenguinCard:Trigger(nTriggerPhase, mapTriggerSource, callback)
if nTriggerPhase ~= self.nTriggerPhase then
return
end
local bAble = self:CheckTriggerAble(mapTriggerSource)
local bAble = PenguinCardUtils.CheckTriggerAble(self.nTriggerType, self.tbTriggerParam, self.nTriggerProbability, mapTriggerSource)
if not bAble then
return
end
local mapEffectValue
if self.nEffectType == GameEnum.PenguinCardEffectType.IncreaseBasicChips or self.nEffectType == GameEnum.PenguinCardEffectType.IncreaseMultiplier or self.nEffectType == GameEnum.PenguinCardEffectType.MultiMultiplier or self.nEffectType == GameEnum.PenguinCardEffectType.UpgradeDiscount or self.nEffectType == GameEnum.PenguinCardEffectType.AddRound or self.nEffectType == GameEnum.PenguinCardEffectType.UpgradeRebate then
if self.nGrowthType == GameEnum.PenguinCardGrowthType.None then
mapEffectValue = self.tbEffectParam[1]
else
mapEffectValue = self.tbEffectParam[1] + self.nGrowthLayer * self.tbGrowthEffectParam[1]
if mapEffectValue < 0 then
mapEffectValue = 0
end
end
else
mapEffectValue = self.tbEffectParam
end
if type(mapEffectValue) == "number" and mapEffectValue == 0 then
return
end
if self.nTriggerLimit ~= GameEnum.PenguinCardTriggerLimit.None then
self.nTriggerCount = self.nTriggerCount + 1
end
if callback then
if NovaAPI.IsEditorPlatform() then
printLog("企鹅牌触发:" .. " " .. self.sName .. " " .. self.sDesc)
printLog("企鹅牌触发:" .. " " .. self.sName .. " " .. self:GetDesc())
end
callback(self.nEffectType, self.tbEffectParam)
callback(self.nEffectType, mapEffectValue)
end
EventManager.Hit("PenguinCardTriggered", self.nSlotIndex)
end
function PenguinCard:CheckTriggerAble(mapTriggerSource)
local bAble = false
if self.nTriggerType == GameEnum.PenguinCardTriggerType.None then
bAble = true
elseif mapTriggerSource then
if self.nTriggerType == GameEnum.PenguinCardTriggerType.SuitCards and mapTriggerSource.SuitCards then
local nAimCount = #self.tbTriggerParam
local nHasCount = 0
for _, nAimSuit in ipairs(self.tbTriggerParam) do
for _, nHasSuit in ipairs(mapTriggerSource.SuitCards) do
if nAimSuit == nHasSuit then
nHasCount = nHasCount + 1
end
end
end
if nAimCount <= nHasCount then
bAble = true
end
elseif self.nTriggerType == GameEnum.PenguinCardTriggerType.SuitCount and mapTriggerSource.SuitCount then
for k, nAimCount in pairs(self.tbTriggerParam) do
if not mapTriggerSource.SuitCount[tonumber(k)] or nAimCount > mapTriggerSource.SuitCount[tonumber(k)] then
return false
end
end
bAble = true
elseif self.nTriggerType == GameEnum.PenguinCardTriggerType.HandRankSuitCount and mapTriggerSource.HandRankSuitCount then
for k, nAimCount in pairs(self.tbTriggerParam) do
if not mapTriggerSource.HandRankSuitCount[tonumber(k)] or nAimCount > mapTriggerSource.HandRankSuitCount[tonumber(k)] then
return false
end
end
bAble = true
elseif self.nTriggerType == GameEnum.PenguinCardTriggerType.BaseCardId and mapTriggerSource.BaseCard then
bAble = mapTriggerSource.BaseCard.nId == self.tbTriggerParam[1]
end
function PenguinCard:Growth(nTriggerPhase, mapTriggerSource)
if self.nGrowthType == GameEnum.PenguinCardGrowthType.None then
return
end
local randomValue = math.random(0, 100)
return bAble and randomValue <= self.nTriggerProbability
if nTriggerPhase ~= self.nGrowthTriggerPhase then
return
end
local nAdd = PenguinCardUtils.CheckGrowthLayer(self.nGrowthTriggerType, self.tbGrowthTriggerParam, mapTriggerSource)
if nAdd == 0 then
return
end
if self.nGrowthTriggerType == GameEnum.PenguinCardGrowthTriggerType.LevelCount then
self.nGrowthLayer = nAdd
else
self.nGrowthLayer = self.nGrowthLayer + nAdd
end
EventManager.Hit("PenguinCardGrowth", self.nSlotIndex)
end
function PenguinCard:GetIdByLevel(nGroupId, nLevel)
return nGroupId * 100 + nLevel
@@ -0,0 +1,143 @@
local PenguinCardBuff = class("PenguinCardBuff")
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
function PenguinCardBuff:ctor(nId)
self:Clear()
self:Init(nId)
end
function PenguinCardBuff:Clear()
self.nId = nil
self.bOnly = nil
self.sName = nil
self.sIcon = nil
self.nTriggerPhase = nil
self.nTriggerType = nil
self.tbTriggerParam = nil
self.nTriggerProbability = nil
self.nTriggerLimit = nil
self.nTriggerLimitParam = nil
self.nEffectType = nil
self.tbEffectParam = nil
self.tbGrowthEffectParam = nil
self.nDurationType = nil
self.nDurationParam = nil
self.nTriggerCount = nil
self.nDurationCount = nil
self.nGrowthLayer = nil
end
function PenguinCardBuff:Init(nId)
self.nId = nId
self:ParseConfigData(nId)
end
function PenguinCardBuff:ParseConfigData(nId)
local mapCfg = ConfigTable.GetData("PenguinCardBuff", nId)
if nil == mapCfg then
return
end
self.bOnly = mapCfg.ForcedReplacement or mapCfg.Duration ~= GameEnum.PenguinCardBuffDuration.FullGame
self.sName = mapCfg.Title
self.sIcon = mapCfg.Icon
self.nTriggerPhase = mapCfg.TriggerPhase
self.nTriggerType = mapCfg.TriggerType
self.tbTriggerParam = decodeJson(mapCfg.TriggerParam)
self.nTriggerProbability = mapCfg.TriggerProbability
self.nTriggerLimit = mapCfg.TriggerLimit
self.nTriggerLimitParam = mapCfg.TriggerLimitParam
self.nEffectType = mapCfg.EffectType
self.tbEffectParam = decodeJson(mapCfg.EffectParam)
self.tbGrowthEffectParam = decodeJson(mapCfg.GrowthEffectParam)
self.nDurationType = mapCfg.Duration
self.nDurationParam = mapCfg.DurationParam
self.nDurationCount = 0
self.nGrowthLayer = 0
end
function PenguinCardBuff:GetDesc()
local mapCfg = ConfigTable.GetData("PenguinCardBuff", self.nId)
if nil == mapCfg then
return ""
end
return PenguinCardUtils.SetEffectDesc(mapCfg, self.nGrowthLayer)
end
function PenguinCardBuff:GetDelayTime()
if self.nEffectType == GameEnum.PenguinCardEffectType.BlockFatalDamage then
return 0.7
end
return 0
end
function PenguinCardBuff:AddDuration_Count()
if self.nDurationType == GameEnum.PenguinCardBuffDuration.Count then
self.nDurationCount = self.nDurationCount + 1
if self.nDurationCount >= self.nDurationParam then
return false
end
end
return true
end
function PenguinCardBuff:AddDuration_Turn()
if self.nDurationType == GameEnum.PenguinCardBuffDuration.Turn then
self.nDurationCount = self.nDurationCount + 1
if self.nDurationCount >= self.nDurationParam then
return false
end
end
return true
end
function PenguinCardBuff:AddGrowthLayer()
self.nGrowthLayer = self.nGrowthLayer + 1
end
function PenguinCardBuff:ResetAllTrigger()
self:ResetGameTrigger()
self:ResetRoundTrigger()
self:ResetTurnTrigger()
end
function PenguinCardBuff:ResetGameTrigger()
if self.nTriggerLimit == GameEnum.PenguinCardTriggerLimit.Game then
self.nTriggerCount = 0
end
end
function PenguinCardBuff:ResetRoundTrigger()
if self.nTriggerLimit == GameEnum.PenguinCardTriggerLimit.Round then
self.nTriggerCount = 0
end
end
function PenguinCardBuff:ResetTurnTrigger()
if self.nTriggerLimit == GameEnum.PenguinCardTriggerLimit.Turn then
self.nTriggerCount = 0
end
end
function PenguinCardBuff:Trigger(nTriggerPhase, mapTriggerSource, callback)
if self.nTriggerLimit ~= GameEnum.PenguinCardTriggerLimit.None and self.nTriggerCount >= self.nTriggerLimitParam then
return false
end
if nTriggerPhase ~= self.nTriggerPhase then
return false
end
local bAble = PenguinCardUtils.CheckTriggerAble(self.nTriggerType, self.tbTriggerParam, self.nTriggerProbability, mapTriggerSource)
if not bAble then
return false
end
local mapEffectValue
if self.nEffectType == GameEnum.PenguinCardEffectType.IncreaseBasicChips or self.nEffectType == GameEnum.PenguinCardEffectType.IncreaseMultiplier or self.nEffectType == GameEnum.PenguinCardEffectType.MultiMultiplier or self.nEffectType == GameEnum.PenguinCardEffectType.UpgradeDiscount or self.nEffectType == GameEnum.PenguinCardEffectType.AddRound or self.nEffectType == GameEnum.PenguinCardEffectType.UpgradeRebate then
if self.bOnly == true then
mapEffectValue = self.tbEffectParam[1]
else
mapEffectValue = self.tbEffectParam[1] + self.nGrowthLayer * self.tbGrowthEffectParam[1]
end
else
mapEffectValue = self.tbEffectParam
end
if type(mapEffectValue) == "number" and mapEffectValue == 0 then
return
end
if self.nTriggerLimit ~= GameEnum.PenguinCardTriggerLimit.None then
self.nTriggerCount = self.nTriggerCount + 1
end
if callback then
if NovaAPI.IsEditorPlatform() then
printLog("任务奖励触发:" .. " " .. self.sName .. " " .. self:GetDesc())
end
callback(self.nEffectType, mapEffectValue)
end
EventManager.Hit("PenguinCardBuffTriggered", self.nId)
return true
end
return PenguinCardBuff
@@ -0,0 +1,55 @@
local PenguinCardBuffTipsCtrl = class("PenguinCardBuffTipsCtrl", BaseCtrl)
local WwiseManger = CS.WwiseAudioManager.Instance
PenguinCardBuffTipsCtrl._mapNodeConfig = {
btnClose = {
sComponentName = "UIButton",
callback = "OnBtnClick_Close"
},
imgIcon = {sComponentName = "Image"},
txtName = {sComponentName = "TMP_Text"},
txtDesc = {sComponentName = "TMP_Text"}
}
PenguinCardBuffTipsCtrl._mapEventConfig = {PenguinCard_OpenBuffTips = "Open"}
function PenguinCardBuffTipsCtrl:Open(mapBuff, callback)
self._panel.mapLevel:Pause()
self.callback = callback
self:Refresh(mapBuff)
self:PlayInAni()
end
function PenguinCardBuffTipsCtrl:Refresh(mapBuff)
local sSuffix = ""
if mapBuff.nDurationType == GameEnum.PenguinCardBuffDuration.Count then
sSuffix = orderedFormat(ConfigTable.GetUIText("PenguinCard_BuffDescSuffix_Count"), mapBuff.nDurationParam - mapBuff.nDurationCount)
elseif mapBuff.nDurationType == GameEnum.PenguinCardBuffDuration.Turn then
sSuffix = orderedFormat(ConfigTable.GetUIText("PenguinCard_BuffDescSuffix_Turn"), mapBuff.nDurationParam - mapBuff.nDurationCount)
end
NovaAPI.SetTMPText(self._mapNode.txtDesc, mapBuff:GetDesc() .. sSuffix)
NovaAPI.SetTMPText(self._mapNode.txtName, mapBuff.sName)
self:SetSprite(self._mapNode.imgIcon, "UI/Play_PenguinCard/SpriteAtlas/Sprite/" .. mapBuff.sIcon)
end
function PenguinCardBuffTipsCtrl:PlayInAni()
self.gameObject:SetActive(true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function PenguinCardBuffTipsCtrl:Close()
if self.callback then
self.callback()
end
self.animator:Play("PengUinCard_BuffTips_out")
self:AddTimer(1, 0.333, function()
self.gameObject:SetActive(false)
self._panel.mapLevel:Resume()
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.333)
end
function PenguinCardBuffTipsCtrl:Awake()
self.animator = self.gameObject:GetComponent("Animator")
end
function PenguinCardBuffTipsCtrl:OnEnable()
end
function PenguinCardBuffTipsCtrl:OnDisable()
end
function PenguinCardBuffTipsCtrl:OnBtnClick_Close()
self:Close()
end
return PenguinCardBuffTipsCtrl
+142 -18
View File
@@ -1,11 +1,20 @@
local PenguinCardCtrl = class("PenguinCardCtrl", BaseCtrl)
local WwiseManger = CS.WwiseAudioManager.Instance
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
PenguinCardCtrl._mapNodeConfig = {
btnPause = {
nCount = 2,
sComponentName = "UIButton",
callback = "OnBtnClick_Pause"
},
btnOpenQuest = {
nCount = 2,
sComponentName = "UIButton",
callback = "OnBtnClick_OpenQuest"
},
Start = {
sNodeName = "---Start---",
sCtrlName = "Game.UI.Play_PenguinCard.PenguinCardStartCtrl"
},
Prepare = {
sNodeName = "---Prepare---",
sCtrlName = "Game.UI.Play_PenguinCard.PenguinCardPrepareCtrl"
@@ -41,6 +50,20 @@ PenguinCardCtrl._mapNodeConfig = {
Confirm = {
sNodeName = "---Confirm---",
sCtrlName = "Game.UI.Play_PenguinCard.PenguinCardConfirmCtrl"
},
Quest = {
sNodeName = "---Quest---",
sCtrlName = "Game.UI.Play_PenguinCard.PenguinCardQuestSelectCtrl"
},
BuffTips = {
sNodeName = "---BuffTips---",
sCtrlName = "Game.UI.Play_PenguinCard.PenguinCardBuffTipsCtrl"
},
goCurBuff = {},
rtBuff = {sNodeName = "---Buff---", sComponentName = "Transform"},
cgBuff = {
sNodeName = "---Buff---",
sComponentName = "CanvasGroup"
}
}
PenguinCardCtrl._mapEventConfig = {
@@ -50,31 +73,38 @@ PenguinCardCtrl._mapEventConfig = {
PenguinCard_RunState_Flip = "RunState_Flip",
PenguinCard_RunState_Settlement = "RunState_Settlement",
PenguinCard_RunState_Complete = "RunState_Complete",
PenguinCard_RunState_Quest = "RunState_Quest",
PenguinCard_QuitState_Start = "QuitState_Start",
PenguinCard_QuitState_Prepare = "QuitState_Prepare",
PenguinCard_QuitState_Dealing = "QuitState_Dealing",
PenguinCard_QuitState_Flip = "QuitState_Flip",
PenguinCard_QuitState_Settlement = "QuitState_Settlement",
PenguinCard_QuitState_Complete = "QuitState_Complete",
PenguinCard_QuitState_Quest = "QuitState_Quest",
PenguinCard_AddBuff = "OnEvent_AddBuff",
PenguinCard_DeleteBuff = "OnEvent_DeleteBuff",
PenguinCard_OpenPause = "OnBtnClick_Pause",
PenguinCard_QuestSelectOpen = "OnEvent_QuestSelectOpen",
PenguinCard_Change = "OnEvent_Change"
}
function PenguinCardCtrl:RunState_Start()
self:CloseAll()
self:ClearBuffItem()
self._mapNode.Start.gameObject:SetActive(true)
self._mapNode.Start:Refresh()
end
function PenguinCardCtrl:QuitState_Start()
self._mapNode.Start:PlayOutAni()
end
function PenguinCardCtrl:RunState_Prepare()
self._mapNode.Start.gameObject:SetActive(false)
self._mapNode.Prepare.gameObject:SetActive(true)
self._mapNode.Slot.gameObject:SetActive(true)
self._mapNode.Result.gameObject:SetActive(false)
self._mapNode.Flip.gameObject:SetActive(false)
self._mapNode.Prepare:Refresh()
self._mapNode.Slot:Refresh()
if self.bIn then
self.bIn = false
else
WwiseManger:PostEvent("Mode_Card_nextround")
end
WwiseManger:PostEvent("Mode_Card_nextround")
EventManager.Hit("Guide_PassiveCheck_Msg", "Guide_PenguinCard_301")
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
@@ -83,17 +113,19 @@ function PenguinCardCtrl:RunState_Prepare()
cs_coroutine.start(wait)
end
function PenguinCardCtrl:QuitState_Prepare(nNextState)
if nNextState == 0 then
if nNextState == PenguinCardUtils.GameState.Start then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Prepare:PlayOutAni()
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
elseif nNextState == 2 then
elseif nNextState == PenguinCardUtils.GameState.Dealing then
self._mapNode.Prepare:PlayOutAni()
WwiseManger:PostEvent("Mode_Card_dissolve")
elseif nNextState == 5 then
elseif nNextState == PenguinCardUtils.GameState.Complete then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Prepare:PlayOutAni()
self.animator:Play("PengUinCard_Bg_Result")
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
end
end
@@ -104,14 +136,16 @@ function PenguinCardCtrl:RunState_Dealing()
EventManager.Hit("Guide_PassiveCheck_Msg", "Guide_PenguinCard_302")
end
function PenguinCardCtrl:QuitState_Dealing(nNextState)
if nNextState == 0 then
if nNextState == PenguinCardUtils.GameState.Start then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Flip:PlayOutAni()
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
elseif nNextState == 5 then
elseif nNextState == PenguinCardUtils.GameState.Complete then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Flip:PlayOutAni()
self.animator:Play("PengUinCard_Bg_Result")
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
end
end
@@ -120,14 +154,16 @@ function PenguinCardCtrl:RunState_Flip()
end
function PenguinCardCtrl:QuitState_Flip(nNextState)
self._mapNode.Flip:StopShowAllOn()
if nNextState == 0 then
if nNextState == PenguinCardUtils.GameState.Start then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Flip:PlayOutAni()
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
elseif nNextState == 5 then
elseif nNextState == PenguinCardUtils.GameState.Complete then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Flip:PlayOutAni()
self.animator:Play("PengUinCard_Bg_Result")
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
end
end
@@ -135,19 +171,21 @@ function PenguinCardCtrl:RunState_Settlement()
self._mapNode.Flip:Refresh_Settlement()
end
function PenguinCardCtrl:QuitState_Settlement(nNextState)
if nNextState == 0 then
if nNextState == PenguinCardUtils.GameState.Start then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Flip:PlayOutAni()
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
elseif nNextState == 1 then
elseif nNextState == PenguinCardUtils.GameState.Prepare then
self._mapNode.Flip:PlayOutAni()
WwiseManger:PostEvent("Mode_Card_dissolve")
elseif nNextState == 2 then
elseif nNextState == PenguinCardUtils.GameState.Dealing then
self._mapNode.Flip:PlayRoundAni()
elseif nNextState == 5 then
elseif nNextState == PenguinCardUtils.GameState.Complete then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Flip:PlayOutAni()
self.animator:Play("PengUinCard_Bg_Result")
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
end
end
@@ -156,10 +194,35 @@ function PenguinCardCtrl:RunState_Complete()
end
function PenguinCardCtrl:QuitState_Complete()
end
function PenguinCardCtrl:RunState_Quest(bSkip)
if bSkip then
return
end
self._mapNode.Quest:Open()
end
function PenguinCardCtrl:QuitState_Quest(nNextState)
if nNextState == PenguinCardUtils.GameState.Start then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Flip:PlayOutAni()
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
elseif nNextState == PenguinCardUtils.GameState.Prepare then
self._mapNode.Flip:PlayOutAni()
WwiseManger:PostEvent("Mode_Card_dissolve")
elseif nNextState == PenguinCardUtils.GameState.Complete then
self._mapNode.Slot:PlayOutAni()
self._mapNode.Flip:PlayOutAni()
self.animator:Play("PengUinCard_Bg_Result")
self:ClearBuffItem()
WwiseManger:PostEvent("Mode_Card_dissolve")
end
end
function PenguinCardCtrl:CloseAll()
self._mapNode.Start.gameObject:SetActive(false)
self._mapNode.Prepare.gameObject:SetActive(false)
self._mapNode.Slot.gameObject:SetActive(false)
self._mapNode.Flip.gameObject:SetActive(false)
self._mapNode.Quest.gameObject:SetActive(false)
self._mapNode.CardInfo.gameObject:SetActive(false)
self._mapNode.Pause.gameObject:SetActive(false)
self._mapNode.HandRank.gameObject:SetActive(false)
@@ -167,8 +230,12 @@ function PenguinCardCtrl:CloseAll()
self._mapNode.Log.gameObject:SetActive(false)
self._mapNode.Confirm.gameObject:SetActive(false)
end
function PenguinCardCtrl:ClearBuffItem()
delChildren(self._mapNode.rtBuff)
self.tbBuffItem = {}
self._mapNode.Quest:ClearBuffItem()
end
function PenguinCardCtrl:Awake()
self.bIn = true
self.animator = self.gameObject:GetComponent("Animator")
self:CloseAll()
end
@@ -182,6 +249,63 @@ end
function PenguinCardCtrl:OnBtnClick_Pause(btn)
self._mapNode.Pause:Open()
end
function PenguinCardCtrl:OnBtnClick_OpenQuest(btn)
if self._panel.mapLevel.mapQuest == nil then
EventManager.Hit(EventId.OpenMessageBox, ConfigTable.GetUIText("PenguinCard_Tip_NoneQuest"))
return
end
self._mapNode.Quest:Open(true)
end
function PenguinCardCtrl:OnEvent_AddBuff(mapBuff)
if not self.tbBuffItem then
self.tbBuffItem = {}
end
local goItemObj = instantiate(self._mapNode.goCurBuff, self._mapNode.rtBuff)
goItemObj:SetActive(true)
table.insert(self.tbBuffItem, goItemObj)
local btn = goItemObj.transform:Find("btnOpenInfo"):GetComponent("UIButton")
local imgSelect = goItemObj.transform:Find("btnOpenInfo/AnimRoot/imgSelect").gameObject
local imgIcon = goItemObj.transform:Find("btnOpenInfo/AnimRoot/imgIcon"):GetComponent("Image")
local ani = goItemObj.transform:Find("btnOpenInfo/AnimRoot"):GetComponent("Animator")
self:SetSprite(imgIcon, "UI/Play_PenguinCard/SpriteAtlas/Sprite/" .. mapBuff.sIcon)
ani:Play("PenguinCardBuff_in", 0, 0)
local click = function()
imgSelect:SetActive(true)
EventManager.Hit("PenguinCard_OpenBuffTips", mapBuff, function()
imgSelect:SetActive(false)
end)
end
btn.onClick:AddListener(click)
end
function PenguinCardCtrl:OnEvent_DeleteBuff(nIndex, nDelayTime)
if not self.tbBuffItem or next(self.tbBuffItem) == nil then
return
end
local goBuff = self.tbBuffItem[nIndex]
table.remove(self.tbBuffItem, nIndex)
local play = function()
local ani = goBuff.transform:Find("btnOpenInfo/AnimRoot"):GetComponent("Animator")
ani:Play("PenguinCardBuff_out", 0, 0)
self:AddTimer(1, 0.4, function()
destroy(goBuff)
end, true, true, true)
end
if goBuff:IsNull() == false then
if nDelayTime and 0 < nDelayTime then
self:AddTimer(1, nDelayTime, play, true, true, true)
else
play()
end
end
end
function PenguinCardCtrl:OnEvent_QuestSelectOpen()
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgBuff, 0)
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
NovaAPI.SetCanvasGroupAlpha(self._mapNode.cgBuff, 1)
end
cs_coroutine.start(wait)
end
function PenguinCardCtrl:OnEvent_Change(callback)
callback(self, self._panel.mapLevel)
end
@@ -1,10 +1,12 @@
local PenguinCardFlipCtrl = class("PenguinCardFlipCtrl", BaseCtrl)
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
local WwiseManger = CS.WwiseAudioManager.Instance
local LoopType = CS.DG.Tweening.LoopType
local ScaleUpTime = 0.3
local ScaleDownTime = 0.12
local _, BtnOn = ColorUtility.TryParseHtmlString("#b48339")
local _, BtnOff = ColorUtility.TryParseHtmlString("#3E3C5B")
local QuestPos = 172
PenguinCardFlipCtrl._mapNodeConfig = {
aniHandRankBg = {
sNodeName = "imgHandRankBg",
@@ -98,6 +100,21 @@ PenguinCardFlipCtrl._mapNodeConfig = {
aniRoundScoreRatioBg = {
sNodeName = "imgRoundScoreRatioBg",
sComponentName = "Animator"
},
txtScore = {sComponentName = "TMP_Text"},
imgHpOnBg = {},
imgHpOffBg = {},
txtMenuHp = {sComponentName = "TMP_Text"},
imgQuestOnBg = {},
imgQuestOffBg = {},
imgQuestIcon = {sComponentName = "Image"},
imgQuestComplete = {},
imgQuestProgress = {
sComponentName = "RectTransform"
},
aniQuestOnBg = {
sNodeName = "imgQuestOnBg",
sComponentName = "Animator"
}
}
PenguinCardFlipCtrl._mapEventConfig = {
@@ -106,7 +123,11 @@ PenguinCardFlipCtrl._mapEventConfig = {
PenguinCard_ShowBaseCard = "OnEvent_ShowBaseCard",
PenguinCard_Pause = "OnEvent_Pause",
PenguinCard_Resume = "OnEvent_Resume",
PenguinCard_QuitScoreAni = "QuitScoreAni"
PenguinCard_QuitScoreAni = "QuitScoreAni",
PenguinCard_ChangeHp = "OnEvent_ChangeHp",
PenguinCard_ChangeQuestProcess = "OnEvent_ChangeQuestProcess",
PenguinCard_SelectQuest = "OnEvent_SelectQuest",
PenguinCard_ChangeScore = "OnEvent_ChangeScore"
}
function PenguinCardFlipCtrl:Refresh_Dealing()
self._mapNode.imgNextRound:SetActive(false)
@@ -117,6 +138,7 @@ function PenguinCardFlipCtrl:Refresh_Dealing()
self._mapNode.btnShowAll.interactable = false
self._mapNode.goShowAllOn:SetActive(false)
self:RefreshRoundScore()
self:RefreshQuest()
self._mapNode.aniRoundScoreBaseBg.gameObject:SetActive(false)
self._mapNode.aniRoundScoreBaseBg.gameObject:SetActive(true)
self._mapNode.aniRoundScoreRatioBg.gameObject:SetActive(false)
@@ -148,7 +170,7 @@ function PenguinCardFlipCtrl:Refresh_Flip()
self.mapHandRankScore = {}
end
function PenguinCardFlipCtrl:Refresh_Settlement()
if self._panel.mapLevel.nRoundLimit > self._panel.mapLevel.nCurRound then
if self._panel.mapLevel:GetRoundLimitInTurn() > self._panel.mapLevel.nCurRound then
self._mapNode.imgNextRound:SetActive(true)
end
self._mapNode.btnNextRound.gameObject:SetActive(true)
@@ -168,8 +190,8 @@ function PenguinCardFlipCtrl:Refresh_Settlement()
self:PlayScoreAni()
end
function PenguinCardFlipCtrl:RefreshRoundCount()
NovaAPI.SetTMPText(self._mapNode.txtRound, orderedFormat(ConfigTable.GetUIText("PenguinCard_LeftRound"), self._panel.mapLevel.nRoundLimit - self._panel.mapLevel.nCurRound))
if self._panel.mapLevel.nRoundLimit == self._panel.mapLevel.nCurRound then
NovaAPI.SetTMPText(self._mapNode.txtRound, orderedFormat(ConfigTable.GetUIText("PenguinCard_LeftRound"), self._panel.mapLevel:GetRoundLimitInTurn() - self._panel.mapLevel.nCurRound))
if self._panel.mapLevel:GetRoundLimitInTurn() == self._panel.mapLevel.nCurRound then
NovaAPI.SetTMPText(self._mapNode.txtBtnNextRound, ConfigTable.GetUIText("PenguinCard_Btn_EndTurn"))
NovaAPI.SetTMPText(self._mapNode.txtRoundTip, ConfigTable.GetUIText("PenguinCard_EndTurnTip"))
else
@@ -192,10 +214,42 @@ function PenguinCardFlipCtrl:RefreshHandRank()
end
end
function PenguinCardFlipCtrl:RefreshRoundScore()
NovaAPI.SetTMPText(self._mapNode.txtRoundScore, self:ThousandsNumber(clearFloat(self._panel.mapLevel.nRoundScore)))
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreBase, self:ThousandsNumber(clearFloat(self._panel.mapLevel.nRoundValue)))
local nScore = math.floor(self._panel.mapLevel.nScore + 0.5 + 1.0E-9)
local nRoundScore = math.floor(self._panel.mapLevel.nRoundScore + 0.5 + 1.0E-9)
local nRoundValue = math.floor(self._panel.mapLevel.nRoundValue + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(nScore))
NovaAPI.SetTMPText(self._mapNode.txtRoundScore, self:ThousandsNumber(nRoundScore))
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreBase, self:ThousandsNumber(nRoundValue))
local nRatio = self._panel.mapLevel.nRoundMultiRatio > 0 and self._panel.mapLevel.nRoundRatio * self._panel.mapLevel.nRoundMultiRatio or self._panel.mapLevel.nRoundRatio
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, math.floor(nRatio * 10 + 0.5 + 1.0E-9) / 10)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, math.floor(nRatio * 100 + 0.5 + 1.0E-9) / 100)
end
function PenguinCardFlipCtrl:RefreshQuest()
if self._panel.mapLevel.nQuestTurn < 0 then
self._mapNode.imgQuestOnBg:SetActive(false)
self._mapNode.imgQuestOffBg:SetActive(true)
self._mapNode.imgHpOnBg:SetActive(false)
self._mapNode.imgHpOffBg:SetActive(true)
else
self._mapNode.imgHpOnBg:SetActive(true)
self._mapNode.imgHpOffBg:SetActive(false)
self._mapNode.imgQuestOnBg:SetActive(self._panel.mapLevel.mapQuest ~= nil)
self._mapNode.imgQuestOffBg:SetActive(self._panel.mapLevel.mapQuest == nil)
NovaAPI.SetTMPText(self._mapNode.txtMenuHp, self._panel.mapLevel.nHp)
if self._panel.mapLevel.mapQuest ~= nil then
if self._panel.mapLevel.mapQuest.nLevel == 1 then
self:SetSprite(self._mapNode.imgQuestIcon, "UI/Play_PenguinCard/SpriteAtlas/Sprite/zs_penguincard_task_01")
elseif self._panel.mapLevel.mapQuest.nLevel == 2 then
self:SetSprite(self._mapNode.imgQuestIcon, "UI/Play_PenguinCard/SpriteAtlas/Sprite/zs_penguincard_task_02")
end
self._mapNode.imgQuestComplete:SetActive(self._panel.mapLevel.mapQuest:CheckComplete())
local nP = self._panel.mapLevel.mapQuest.nAimCount / self._panel.mapLevel.mapQuest.nMaxAim
if 1 < nP then
nP = 1
end
local nPos = nP * QuestPos
self._mapNode.imgQuestProgress.sizeDelta = Vector2(nPos, 24)
end
end
end
function PenguinCardFlipCtrl:RefreshButton()
self:RefreshAuto()
@@ -252,8 +306,9 @@ function PenguinCardFlipCtrl:QuitScoreAni()
if not self.bEndScore and self._panel.mapLevel.nRoundMultiRatio and self._panel.mapLevel.nRoundRatio and self._panel.mapLevel.nRoundValue and self._panel.mapLevel.nRoundScore then
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreBase, self:ThousandsNumber(math.floor(self._panel.mapLevel.nRoundValue)))
local nRatio = self._panel.mapLevel.nRoundMultiRatio > 0 and self._panel.mapLevel.nRoundRatio * self._panel.mapLevel.nRoundMultiRatio or self._panel.mapLevel.nRoundRatio
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, string.format("%.1f", nRatio))
NovaAPI.SetTMPText(self._mapNode.txtRoundScore, self:ThousandsNumber(math.floor(self._panel.mapLevel.nRoundScore)))
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, math.floor(nRatio * 100 + 0.5 + 1.0E-9) / 100)
local nRoundScore = math.floor(self._panel.mapLevel.nRoundScore + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtRoundScore, self:ThousandsNumber(nRoundScore))
end
end
if self.timerNextRoundOn then
@@ -271,7 +326,8 @@ function PenguinCardFlipCtrl:PlayScoreAni()
local tw1 = DOTween.To(function()
return self.mapHandRankScore.nBeforeValue
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreBase, self:ThousandsNumber(math.floor(v)))
local nScore = math.floor(v + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreBase, self:ThousandsNumber(nScore))
end, self.mapHandRankScore.nAfterValue, nTextTime)
local tw2 = self._mapNode.trRoundScoreBase:DOScale(1.2, ScaleUpTime / self._panel.mapLevel.nSpeed):SetEase(Ease.OutQuart)
local tw3 = self._mapNode.trRoundScoreBase:DOScale(1, ScaleDownTime / self._panel.mapLevel.nSpeed):SetEase(Ease.InQuad)
@@ -292,7 +348,7 @@ function PenguinCardFlipCtrl:PlayScoreAni()
local tw1 = DOTween.To(function()
return self.mapHandRankScore.nBeforeRatio
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, string.format("%.1f", v))
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, string.format("%.2f", v))
end, self.mapHandRankScore.nAfterRatio, nTextTime)
local tw2 = self._mapNode.trRoundScoreRatio:DOScale(1.2, ScaleUpTime / self._panel.mapLevel.nSpeed):SetEase(Ease.OutQuart)
local tw3 = self._mapNode.trRoundScoreRatio:DOScale(1, ScaleDownTime / self._panel.mapLevel.nSpeed):SetEase(Ease.InQuad)
@@ -316,7 +372,8 @@ function PenguinCardFlipCtrl:PlayScoreAni()
local tw1 = DOTween.To(function()
return self.mapHandRankScore.nAfterValue
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreBase, self:ThousandsNumber(math.floor(v)))
local nScore = math.floor(v + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreBase, self:ThousandsNumber(nScore))
end, self._panel.mapLevel.nRoundValue, nTextTime)
local tw2 = self._mapNode.trRoundScoreBase:DOScale(1.2, ScaleUpTime / self._panel.mapLevel.nSpeed):SetEase(Ease.OutQuart)
local tw3 = self._mapNode.trRoundScoreBase:DOScale(1, ScaleDownTime / self._panel.mapLevel.nSpeed):SetEase(Ease.InQuad)
@@ -334,11 +391,12 @@ function PenguinCardFlipCtrl:PlayScoreAni()
self.sequence:Append(tw3)
end
local nRatio = self._panel.mapLevel.nRoundMultiRatio > 0 and self._panel.mapLevel.nRoundRatio * self._panel.mapLevel.nRoundMultiRatio or self._panel.mapLevel.nRoundRatio
nRatio = math.floor(nRatio * 100 + 0.5 + 1.0E-9) / 100
if self.mapHandRankScore and self.mapHandRankScore.nAfterRatio ~= nRatio then
local tw1 = DOTween.To(function()
return self.mapHandRankScore.nAfterRatio
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, string.format("%.1f", v))
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, string.format("%.2f", v))
end, nRatio, nTextTime)
local tw2 = self._mapNode.trRoundScoreRatio:DOScale(1.2, ScaleUpTime / self._panel.mapLevel.nSpeed):SetEase(Ease.OutQuart)
local tw3 = self._mapNode.trRoundScoreRatio:DOScale(1, ScaleDownTime / self._panel.mapLevel.nSpeed):SetEase(Ease.InQuad)
@@ -361,7 +419,8 @@ function PenguinCardFlipCtrl:PlayScoreAni()
local tw1 = DOTween.To(function()
return 0
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtRoundScore, self:ThousandsNumber(math.floor(v)))
local nScore = math.floor(v + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtRoundScore, self:ThousandsNumber(nScore))
end, self._panel.mapLevel.nRoundScore, nTextTime):OnComplete(callback)
local tw2 = self._mapNode.trRoundScore:DOScale(1.1, ScaleUpTime / self._panel.mapLevel.nSpeed):SetEase(Ease.OutQuart)
local tw3 = self._mapNode.trRoundScore:DOScale(1, ScaleDownTime / self._panel.mapLevel.nSpeed):SetEase(Ease.InQuad)
@@ -417,7 +476,7 @@ end
function PenguinCardFlipCtrl:OnBtnClick_NextRound(btn)
self._panel.mapLevel:StopAuto()
self:QuitScoreAni()
if self._panel.mapLevel.nRoundLimit == self._panel.mapLevel.nCurRound and self._panel.mapLevel.nCurTurn < self._panel.mapLevel.nMaxTurn then
if self._panel.mapLevel:GetRoundLimitInTurn() == self._panel.mapLevel.nCurRound and self._panel.mapLevel.nCurTurn < self._panel.mapLevel.nMaxTurn then
local callback = function()
self._panel.mapLevel:SwitchGameState()
end
@@ -443,15 +502,17 @@ function PenguinCardFlipCtrl:OnBtnClick_Speed(btn)
end
function PenguinCardFlipCtrl:OnEvent_ChangeRoundScore(nBeforeValue, nBeforeRatio, nBeforeScore, bFromHandRank)
if bFromHandRank then
local nRatio = self._panel.mapLevel.nRoundMultiRatio > 0 and self._panel.mapLevel.nRoundRatio * self._panel.mapLevel.nRoundMultiRatio or self._panel.mapLevel.nRoundRatio
nRatio = math.floor(nRatio * 100 + 0.5 + 1.0E-9) / 100
self.mapHandRankScore = {
nBeforeValue = nBeforeValue,
nAfterValue = self._panel.mapLevel.nRoundValue,
nBeforeRatio = nBeforeRatio,
nAfterRatio = self._panel.mapLevel.nRoundMultiRatio > 0 and self._panel.mapLevel.nRoundRatio * self._panel.mapLevel.nRoundMultiRatio or self._panel.mapLevel.nRoundRatio
nAfterRatio = nRatio
}
return
end
if self._panel.mapLevel.nGameState == 4 then
if self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Settlement then
return
end
local bFire = self._panel.mapLevel.nRoundValue >= self.nFireScore
@@ -464,7 +525,8 @@ function PenguinCardFlipCtrl:OnEvent_ChangeRoundScore(nBeforeValue, nBeforeRatio
DOTween.To(function()
return nBeforeValue
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreBase, self:ThousandsNumber(math.floor(v)))
local nScore = math.floor(v + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreBase, self:ThousandsNumber(nScore))
end, self._panel.mapLevel.nRoundValue, nTextTime)
local callback = dotween_callback_handler(self, function()
self._mapNode.trRoundScoreBase:DOScale(1, ScaleDownTime / self._panel.mapLevel.nSpeed):SetEase(Ease.InQuad):SetUpdate(true)
@@ -472,12 +534,13 @@ function PenguinCardFlipCtrl:OnEvent_ChangeRoundScore(nBeforeValue, nBeforeRatio
self._mapNode.trRoundScoreBase:DOScale(1.2, ScaleUpTime / self._panel.mapLevel.nSpeed):SetEase(Ease.OutQuart):SetUpdate(true):OnComplete(callback)
end
local nRatio = 0 < self._panel.mapLevel.nRoundMultiRatio and self._panel.mapLevel.nRoundRatio * self._panel.mapLevel.nRoundMultiRatio or self._panel.mapLevel.nRoundRatio
nRatio = math.floor(nRatio * 100 + 0.5 + 1.0E-9) / 100
if nBeforeRatio ~= nRatio then
WwiseManger:PostEvent("Mode_Card_integral")
DOTween.To(function()
return nBeforeRatio
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, string.format("%.1f", v))
NovaAPI.SetTMPText(self._mapNode.txtRoundScoreRatio, string.format("%.2f", v))
end, nRatio, nTextTime)
local callback = dotween_callback_handler(self, function()
self._mapNode.trRoundScoreRatio:DOScale(1, ScaleDownTime / self._panel.mapLevel.nSpeed):SetEase(Ease.InQuad):SetUpdate(true)
@@ -502,6 +565,41 @@ function PenguinCardFlipCtrl:OnEvent_ReplaceBaseCard(nIndex)
self._mapNode.PenguinBaseCard[nIndex]:PlayReplaceAni()
self._mapNode.btnShow[nIndex].interactable = false
end
function PenguinCardFlipCtrl:OnEvent_ChangeHp(nChange)
NovaAPI.SetTMPText(self._mapNode.txtMenuHp, self._panel.mapLevel.nHp)
end
function PenguinCardFlipCtrl:OnEvent_ChangeQuestProcess(nChange)
local bComplete = self._panel.mapLevel.mapQuest:CheckComplete()
if bComplete and self._mapNode.imgQuestOnBg.activeInHierarchy == true and self._mapNode.imgQuestComplete.activeSelf == false then
self._mapNode.aniQuestOnBg:Play("PengUinCard_Prepare_Info_QuestComplete", 0, 0)
end
self._mapNode.imgQuestComplete:SetActive(bComplete)
local nP = self._panel.mapLevel.mapQuest.nAimCount / self._panel.mapLevel.mapQuest.nMaxAim
if 1 < nP then
nP = 1
end
local nPos = nP * QuestPos
self._mapNode.imgQuestProgress:DOSizeDelta(Vector2(nPos, 24), 0.5):SetEase(Ease.OutQuad)
end
function PenguinCardFlipCtrl:OnEvent_SelectQuest()
self:RefreshQuest()
end
function PenguinCardFlipCtrl:OnEvent_ChangeScore(nBefore, nBeforeStar, nStar)
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Settlement then
WwiseManger:PostEvent("Mode_Card_coin")
end
local callback = dotween_callback_handler(self, function()
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Settlement then
WwiseManger:PostEvent("Mode_Card_coin_stop")
end
end)
DOTween.To(function()
return nBefore
end, function(v)
local nScore = math.floor(v + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(nScore))
end, self._panel.mapLevel.nScore, 0.5):OnComplete(callback)
end
function PenguinCardFlipCtrl:OnEvent_Pause()
if self.sequence then
self.sequence:Pause()
@@ -1,4 +1,5 @@
local PenguinCardInfoCtrl = class("PenguinCardInfoCtrl", BaseCtrl)
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
local _, NotMaxLevel = ColorUtility.TryParseHtmlString("#FFF7EA")
local _, MaxLevel = ColorUtility.TryParseHtmlString("#ffe075")
PenguinCardInfoCtrl._mapNodeConfig = {
@@ -15,6 +16,7 @@ PenguinCardInfoCtrl._mapNodeConfig = {
txtName = {sComponentName = "TMP_Text"},
imgUp = {},
txtDesc = {sComponentName = "TMP_Text"},
srDesc = {sComponentName = "ScrollRect"},
aniInfo = {sNodeName = "goInfo", sComponentName = "Animator"},
btnRight = {
sComponentName = "UIButton",
@@ -45,7 +47,7 @@ PenguinCardInfoCtrl._mapNodeConfig = {
PenguinCardInfoCtrl._mapEventConfig = {
PenguinCard_OpenInfo = "Open",
PenguinCard_SelectPenguinCard = "OnEvent_Select",
PenguinCard_SalePenguinCard = "Close"
PenguinCard_SalePenguinCard = "OnEvent_Sale"
}
function PenguinCardInfoCtrl:Open(mapCard, nSelectIndex)
self._panel.mapLevel:Pause()
@@ -69,7 +71,7 @@ function PenguinCardInfoCtrl:Open(mapCard, nSelectIndex)
local nMax = #self.tbHasIndex
self._mapNode.btnRight.gameObject:SetActive(1 < nMax)
self._mapNode.btnLeft.gameObject:SetActive(1 < nMax)
self._mapNode.btnSale.gameObject:SetActive(self._panel.mapLevel.nGameState == 1)
self._mapNode.btnSale.gameObject:SetActive(self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Prepare)
self._mapNode.btnSelect.gameObject:SetActive(false)
self._mapNode.imgUp:SetActive(false)
end
@@ -92,7 +94,12 @@ function PenguinCardInfoCtrl:Refresh()
local nId = mapUpgradeCard:GetIdByLevel(mapUpgradeCard.nGroupId, nAfter)
local mapCfg = ConfigTable.GetData("PenguinCard", nId)
if mapCfg then
local sDesc = mapUpgradeCard:SetDesc(mapCfg)
local sDesc = ""
if mapCfg.UpgradeResetGrowth then
sDesc = PenguinCardUtils.SetEffectDesc(mapCfg)
else
sDesc = PenguinCardUtils.SetEffectDesc(mapCfg, mapUpgradeCard.nGrowthLayer)
end
NovaAPI.SetTMPText(self._mapNode.txtDesc, sDesc)
end
NovaAPI.SetTMPText(self._mapNode.txtBtnSelect, ConfigTable.GetUIText("PenguinCard_Btn_Upgrade"))
@@ -100,14 +107,15 @@ function PenguinCardInfoCtrl:Refresh()
self._mapNode.imgUp:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtLevel, orderedFormat(ConfigTable.GetUIText("PenguinCard_CardLevel"), self.mapCard.nLevel))
NovaAPI.SetTMPColor(self._mapNode.txtLevel, self.mapCard.nLevel == self.mapCard.nMaxLevel and MaxLevel or NotMaxLevel)
NovaAPI.SetTMPText(self._mapNode.txtDesc, self.mapCard.sDesc)
NovaAPI.SetTMPText(self._mapNode.txtDesc, self.mapCard:GetDesc())
NovaAPI.SetTMPText(self._mapNode.txtBtnSelect, ConfigTable.GetUIText("PenguinCard_Btn_Select"))
end
else
NovaAPI.SetTMPText(self._mapNode.txtLevel, orderedFormat(ConfigTable.GetUIText("PenguinCard_CardLevel"), self.mapCard.nLevel))
NovaAPI.SetTMPColor(self._mapNode.txtLevel, self.mapCard.nLevel == self.mapCard.nMaxLevel and MaxLevel or NotMaxLevel)
NovaAPI.SetTMPText(self._mapNode.txtDesc, self.mapCard.sDesc)
NovaAPI.SetTMPText(self._mapNode.txtDesc, self.mapCard:GetDesc())
end
NovaAPI.SetVerticalNormalizedPosition(self._mapNode.srDesc, 1)
end
function PenguinCardInfoCtrl:PlayInAni()
self.gameObject:SetActive(true)
@@ -114,12 +114,10 @@ function PenguinCardItemCtrl:PlayTriggerAni()
self:PlayEffectAni()
return
end
if not self.bTriggerCd then
self.bTriggerCd = true
self:AddTimer(1, 1.433, function()
self.bTriggerCd = false
end, true, true, true)
end
self.bTriggerCd = true
self:AddTimer(1, 1.433, function()
self.bTriggerCd = false
end, true, true, true)
self._mapNode.AnimRoot:Play("PengUinCard_Bd_Open", 0, 0)
self._mapNode.AnimRoot.speed = self._panel.mapLevel.nSpeed
WwiseManger:PostEvent("Mode_Card_cast")
@@ -132,13 +130,25 @@ function PenguinCardItemCtrl:PlayEffectAni()
end
local sDesc = ""
if self.mapCard.nEffectType == GameEnum.PenguinCardEffectType.IncreaseBasicChips then
self.nEffectCount = self.nEffectCount + self.mapCard.tbEffectParam[1]
local nValue = self.mapCard.tbEffectParam[1]
if self.mapCard.nGrowthType ~= GameEnum.PenguinCardGrowthType.None then
nValue = nValue + self.mapCard.nGrowthLayer * self.mapCard.tbGrowthEffectParam[1]
end
self.nEffectCount = self.nEffectCount + nValue
sDesc = orderedFormat(ConfigTable.GetUIText("PenguinCard_Trigger_AddScore"), self.nEffectCount)
elseif self.mapCard.nEffectType == GameEnum.PenguinCardEffectType.IncreaseMultiplier then
self.nEffectCount = self.nEffectCount + self.mapCard.tbEffectParam[1]
local nValue = self.mapCard.tbEffectParam[1]
if self.mapCard.nGrowthType ~= GameEnum.PenguinCardGrowthType.None then
nValue = nValue + self.mapCard.nGrowthLayer * self.mapCard.tbGrowthEffectParam[1]
end
self.nEffectCount = self.nEffectCount + nValue
sDesc = orderedFormat(ConfigTable.GetUIText("PenguinCard_Trigger_AddRatio"), self.nEffectCount)
elseif self.mapCard.nEffectType == GameEnum.PenguinCardEffectType.MultiMultiplier then
self.nEffectCount = self.nEffectCount + self.mapCard.tbEffectParam[1]
local nValue = self.mapCard.tbEffectParam[1]
if self.mapCard.nGrowthType ~= GameEnum.PenguinCardGrowthType.None then
nValue = nValue + self.mapCard.nGrowthLayer * self.mapCard.tbGrowthEffectParam[1]
end
self.nEffectCount = self.nEffectCount + nValue
sDesc = orderedFormat(ConfigTable.GetUIText("PenguinCard_Trigger_MultiRatio"), self.nEffectCount)
end
self._mapNode.goTrigger:SetActive(sDesc ~= "")
@@ -54,7 +54,7 @@ function PenguinCardLevelGridCtrl:Refresh(nLevelId, mapLevel)
self._mapNode.goStarOff[i]:SetActive(i > mapLevel.nStar)
end
self:RefreshLock(nLevelId)
self._mapNode.imgComplete:SetActive(mapLevel.nStar == 3)
self._mapNode.imgComplete:SetActive(mapLevel.nStar > 0)
end
function PenguinCardLevelGridCtrl:GetLock()
return self.bLock
@@ -55,7 +55,8 @@ end
function PenguinCardLogCtrl:Refresh()
local mapTurn = self._panel.mapLevel.mapLog[self.nTurn]
NovaAPI.SetTMPText(self._mapNode.txtTurn, orderedFormat(ConfigTable.GetUIText("PenguinCard_Log_TurnCount"), self.nTurn))
NovaAPI.SetTMPText(self._mapNode.txtTurnScore, self:ThousandsNumber(clearFloat(mapTurn.nTurnScore)))
local nTurnScore = math.floor(mapTurn.nTurnScore + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtTurnScore, self:ThousandsNumber(nTurnScore))
self.tbRound = mapTurn.tbRound
local nCount = #self.tbRound
self._mapNode.sv.gameObject:SetActive(0 < nCount)
@@ -74,7 +75,8 @@ function PenguinCardLogCtrl:OnGridRefresh(goGrid, gridIndex)
if mapCfg then
NovaAPI.SetTMPText(txtHandRank, mapCfg.Title)
end
NovaAPI.SetTMPText(txtRoundScore, self:ThousandsNumber(clearFloat(mapRound.nRoundScore)))
local nRoundScore = math.floor(mapRound.nRoundScore + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(txtRoundScore, self:ThousandsNumber(nRoundScore))
local nAll = #mapRound.tbHandRank
for i = 1, 6 do
local imgSuit = rtGrid.transform:Find("goSuit/imgSuitCount" .. i):GetComponent("Image")
@@ -1,4 +1,5 @@
local PenguinCardPauseCtrl = class("PenguinCardPauseCtrl", BaseCtrl)
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
PenguinCardPauseCtrl._mapNodeConfig = {
blur = {
sNodeName = "t_fullscreen_blur_blue"
@@ -36,6 +37,7 @@ PenguinCardPauseCtrl._mapNodeConfig = {
imgStarOff = {nCount = 3},
imgStarOn = {nCount = 3},
txtTarget = {nCount = 3, sComponentName = "TMP_Text"},
txtGameTarget = {sComponentName = "TMP_Text"},
btnGiveup = {
sComponentName = "UIButton",
callback = "OnBtnClick_Giveup"
@@ -60,7 +62,7 @@ function PenguinCardPauseCtrl:Open()
self:Refresh()
end
function PenguinCardPauseCtrl:Refresh()
if self._panel.mapLevel.nGameState == 1 then
if self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Prepare then
local nLeft = self._panel.mapLevel.nMaxTurn - self._panel.mapLevel.nCurTurn + 1
NovaAPI.SetTMPText(self._mapNode.txtLeftTurn, orderedFormat(ConfigTable.GetUIText("PenguinCard_Pause_LeftTurn"), nLeft))
NovaAPI.SetTMPText(self._mapNode.txtTurnCount, orderedFormat(ConfigTable.GetUIText("PenguinCard_Pause_TurnCount"), self._panel.mapLevel.nCurTurn - 1))
@@ -74,6 +76,7 @@ function PenguinCardPauseCtrl:Refresh()
self._mapNode.imgStarOn[i]:SetActive(v <= self._panel.mapLevel.nScore)
NovaAPI.SetTMPText(self._mapNode.txtTarget[i], orderedFormat(ConfigTable.GetUIText("PenguinCard_Pause_StarDesc"), self:ThousandsNumber(v)))
end
NovaAPI.SetTMPText(self._mapNode.txtGameTarget, orderedFormat(ConfigTable.GetUIText("PenguinCard_Pause_StarDesc"), self:ThousandsNumber(self._panel.mapLevel.tbStarScore[1])))
end
function PenguinCardPauseCtrl:PlayInAni()
self.gameObject:SetActive(true)
@@ -108,12 +111,14 @@ function PenguinCardPauseCtrl:OnBtnClick_Close()
end
function PenguinCardPauseCtrl:OnBtnClick_Giveup()
self:Close()
EventManager.Hit("PenguinCard_Pause_SwitchGame")
self:AddTimer(1, 0.2, function()
self._panel.mapLevel:CompleteGame()
end, true, true, true)
end
function PenguinCardPauseCtrl:OnBtnClick_Restart()
self:Close()
EventManager.Hit("PenguinCard_Pause_SwitchGame")
self:AddTimer(1, 0.2, function()
self._panel.mapLevel:RestartGame()
end, true, true, true)
@@ -1,18 +1,22 @@
local PenguinCardPrepareCtrl = class("PenguinCardPrepareCtrl", BaseCtrl)
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
local WwiseManger = CS.WwiseAudioManager.Instance
local _, Black = ColorUtility.TryParseHtmlString("#3E3C5B")
local _, Red = ColorUtility.TryParseHtmlString("#ef3d5c")
local _, Green = ColorUtility.TryParseHtmlString("#649c57")
local _, LineOff = ColorUtility.TryParseHtmlString("#8C8296")
local _, LineOn = ColorUtility.TryParseHtmlString("#756980")
local StarPos1 = 144
local StarPos2 = 218
local StarPos3 = 277
local QuestPos = 172
PenguinCardPrepareCtrl._mapNodeConfig = {
txtAddMax = {
nCount = 3,
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_AddBtnMax"
},
imgDiscount = {nCount = 3},
btnAddRound = {
sComponentName = "UIButton",
callback = "OnBtnClick_AddRound"
@@ -88,7 +92,21 @@ PenguinCardPrepareCtrl._mapNodeConfig = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_WinTip"
},
aniWin = {sNodeName = "--Info--", sComponentName = "Animator"}
aniWin = {sNodeName = "--Info--", sComponentName = "Animator"},
imgHpOnBg = {},
imgHpOffBg = {},
txtMenuHp = {sComponentName = "TMP_Text"},
imgQuestOnBg = {},
imgQuestOffBg = {},
imgQuestIcon = {sComponentName = "Image"},
imgQuestComplete = {},
imgQuestProgress = {
sComponentName = "RectTransform"
},
aniQuestOnBg = {
sNodeName = "imgQuestOnBg",
sComponentName = "Animator"
}
}
PenguinCardPrepareCtrl._mapEventConfig = {
PenguinCard_AddRound = "OnEvent_AddRound",
@@ -97,7 +115,10 @@ PenguinCardPrepareCtrl._mapEventConfig = {
PenguinCard_ChangeScore = "OnEvent_ChangeScore",
PenguinCard_RollPenguinCard = "OnEvent_RollPenguinCard",
PenguinCard_SelectPenguinCard = "OnEvent_SelectPenguinCard",
PenguinCard_SalePenguinCard = "OnEvent_SalePenguinCard"
PenguinCard_SalePenguinCard = "OnEvent_SalePenguinCard",
PenguinCard_ChangeHp = "OnEvent_ChangeHp",
PenguinCard_ChangeQuestProcess = "OnEvent_ChangeQuestProcess",
PenguinCard_SelectQuest = "OnEvent_SelectQuest"
}
function PenguinCardPrepareCtrl:Refresh()
self:RefreshAddRound()
@@ -107,11 +128,13 @@ function PenguinCardPrepareCtrl:Refresh()
self:RefreshLeftTurn()
self:RefreshRoll()
self:RefreshWin()
self:RefreshQuest()
end
function PenguinCardPrepareCtrl:RefreshAddRound()
local bMax = self._panel.mapLevel.nRoundLimit >= self._panel.mapLevel.nMaxRound
self._mapNode.goAddRoundOn:SetActive(not bMax)
self._mapNode.goAddRoundOff:SetActive(bMax)
self._mapNode.imgDiscount[1]:SetActive(false)
if not bMax then
self:RefreshAddRoundCost()
end
@@ -120,14 +143,23 @@ function PenguinCardPrepareCtrl:RefreshAddRoundCost()
if self._panel.mapLevel.nRoundLimit >= self._panel.mapLevel.nMaxRound then
return
end
local nCost = self._panel.mapLevel.tbRoundUpgradeCost[self._panel.mapLevel.nRoundLimit + 1]
local nCost = self._panel.mapLevel.tbRoundUpgradeCost[self._panel.mapLevel.nRoundLimit + 1] * self._panel.mapLevel.nUpgradeDiscount
nCost = math.ceil(nCost)
NovaAPI.SetTMPText(self._mapNode.txtAddRoundCost, self:ThousandsNumber(nCost))
NovaAPI.SetTMPColor(self._mapNode.txtAddRoundCost, nCost > self._panel.mapLevel.nScore and Red_Unable or Black)
if nCost > self._panel.mapLevel.nScore then
NovaAPI.SetTMPColor(self._mapNode.txtAddRoundCost, Red_Unable)
elseif 1 > self._panel.mapLevel.nUpgradeDiscount then
NovaAPI.SetTMPColor(self._mapNode.txtAddRoundCost, Green)
self._mapNode.imgDiscount[1]:SetActive(true)
else
NovaAPI.SetTMPColor(self._mapNode.txtAddRoundCost, Black)
end
end
function PenguinCardPrepareCtrl:RefreshAddSlot()
local bMax = self._panel.mapLevel.nSlotCount >= self._panel.mapLevel.nMaxSlot
self._mapNode.goAddSlotOn:SetActive(not bMax)
self._mapNode.goAddSlotOff:SetActive(bMax)
self._mapNode.imgDiscount[2]:SetActive(false)
if not bMax then
self:RefreshAddSlotCost()
end
@@ -136,14 +168,23 @@ function PenguinCardPrepareCtrl:RefreshAddSlotCost()
if self._panel.mapLevel.nSlotCount >= self._panel.mapLevel.nMaxSlot then
return
end
local nCost = self._panel.mapLevel.tbSlotUpgradeCost[self._panel.mapLevel.nSlotCount + 1]
local nCost = self._panel.mapLevel.tbSlotUpgradeCost[self._panel.mapLevel.nSlotCount + 1] * self._panel.mapLevel.nUpgradeDiscount
nCost = math.ceil(nCost)
NovaAPI.SetTMPText(self._mapNode.txtAddSlotCost, self:ThousandsNumber(nCost))
NovaAPI.SetTMPColor(self._mapNode.txtAddSlotCost, nCost > self._panel.mapLevel.nScore and Red_Unable or Black)
if nCost > self._panel.mapLevel.nScore then
NovaAPI.SetTMPColor(self._mapNode.txtAddSlotCost, Red_Unable)
elseif 1 > self._panel.mapLevel.nUpgradeDiscount then
NovaAPI.SetTMPColor(self._mapNode.txtAddSlotCost, Green)
self._mapNode.imgDiscount[2]:SetActive(true)
else
NovaAPI.SetTMPColor(self._mapNode.txtAddSlotCost, Black)
end
end
function PenguinCardPrepareCtrl:RefreshAddRoll()
local bMax = self._panel.mapLevel.nBuyLimit >= self._panel.mapLevel.nMaxBuyLimit
self._mapNode.goAddRollOn:SetActive(not bMax)
self._mapNode.goAddRollOff:SetActive(bMax)
self._mapNode.imgDiscount[3]:SetActive(false)
if not bMax then
self:RefreshAddRollCost()
end
@@ -152,12 +193,21 @@ function PenguinCardPrepareCtrl:RefreshAddRollCost()
if self._panel.mapLevel.nBuyLimit >= self._panel.mapLevel.nMaxBuyLimit then
return
end
local nCost = self._panel.mapLevel.tbBuyLimitUpgradeCost[self._panel.mapLevel.nBuyLimit + 1]
local nCost = self._panel.mapLevel.tbBuyLimitUpgradeCost[self._panel.mapLevel.nBuyLimit + 1] * self._panel.mapLevel.nUpgradeDiscount
nCost = math.ceil(nCost)
NovaAPI.SetTMPText(self._mapNode.txtAddRollCost, self:ThousandsNumber(nCost))
NovaAPI.SetTMPColor(self._mapNode.txtAddRollCost, nCost > self._panel.mapLevel.nScore and Red_Unable or Black)
if nCost > self._panel.mapLevel.nScore then
NovaAPI.SetTMPColor(self._mapNode.txtAddRollCost, Red_Unable)
elseif 1 > self._panel.mapLevel.nUpgradeDiscount then
NovaAPI.SetTMPColor(self._mapNode.txtAddRollCost, Green)
self._mapNode.imgDiscount[3]:SetActive(true)
else
NovaAPI.SetTMPColor(self._mapNode.txtAddRollCost, Black)
end
end
function PenguinCardPrepareCtrl:RefreshScore()
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(clearFloat(self._panel.mapLevel.nScore)))
local nScore = math.floor(self._panel.mapLevel.nScore + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(nScore))
if self._panel.mapLevel.tbStarScore[3] > 0 then
local nStar = self._panel.mapLevel:GetStar()
local nPos = self:GetStarPos(nStar, self._panel.mapLevel.nScore)
@@ -212,6 +262,34 @@ function PenguinCardPrepareCtrl:RefreshLeftTurn()
local nLeft = self._panel.mapLevel.nMaxTurn - self._panel.mapLevel.nCurTurn + 1
NovaAPI.SetTMPText(self._mapNode.txtLeftTurn, orderedFormat(ConfigTable.GetUIText("PenguinCard_LeftTurn"), nLeft))
end
function PenguinCardPrepareCtrl:RefreshQuest()
if self._panel.mapLevel.nQuestTurn < 0 then
self._mapNode.imgQuestOnBg:SetActive(false)
self._mapNode.imgQuestOffBg:SetActive(true)
self._mapNode.imgHpOnBg:SetActive(false)
self._mapNode.imgHpOffBg:SetActive(true)
else
self._mapNode.imgHpOnBg:SetActive(true)
self._mapNode.imgHpOffBg:SetActive(false)
self._mapNode.imgQuestOnBg:SetActive(self._panel.mapLevel.mapQuest ~= nil)
self._mapNode.imgQuestOffBg:SetActive(self._panel.mapLevel.mapQuest == nil)
NovaAPI.SetTMPText(self._mapNode.txtMenuHp, self._panel.mapLevel.nHp)
if self._panel.mapLevel.mapQuest ~= nil then
if self._panel.mapLevel.mapQuest.nLevel == 1 then
self:SetSprite(self._mapNode.imgQuestIcon, "UI/Play_PenguinCard/SpriteAtlas/Sprite/zs_penguincard_task_01")
elseif self._panel.mapLevel.mapQuest.nLevel == 2 then
self:SetSprite(self._mapNode.imgQuestIcon, "UI/Play_PenguinCard/SpriteAtlas/Sprite/zs_penguincard_task_02")
end
self._mapNode.imgQuestComplete:SetActive(self._panel.mapLevel.mapQuest:CheckComplete())
local nP = self._panel.mapLevel.mapQuest.nAimCount / self._panel.mapLevel.mapQuest.nMaxAim
if 1 < nP then
nP = 1
end
local nPos = nP * QuestPos
self._mapNode.imgQuestProgress.sizeDelta = Vector2(nPos, 24)
end
end
end
function PenguinCardPrepareCtrl:RefreshRoll(bRoll)
self:RefreshRollCard(bRoll)
self:RefreshRollDesc()
@@ -264,9 +342,9 @@ function PenguinCardPrepareCtrl:RefreshWin()
self._mapNode.btnWin.gameObject:SetActive(false)
self._mapNode.txtWinTip.gameObject:SetActive(false)
self:AddTimer(1, 0.7, function()
self._mapNode.btnWin.gameObject:SetActive(true)
self._mapNode.btnWin.gameObject:SetActive(self._panel.mapLevel.bShowWin)
self._mapNode.txtWinTip.gameObject:SetActive(true)
self._mapNode.btnWin.interactable = true
self._mapNode.btnWin.interactable = self._panel.mapLevel.bShowWin
self._mapNode.imgStarOff[3]:SetActive(false)
self._mapNode.imgStarOn[3]:SetActive(true)
self._mapNode.aniWin:Play("PengUinCard_Prepare_Info_Win")
@@ -274,11 +352,11 @@ function PenguinCardPrepareCtrl:RefreshWin()
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.7)
else
self._mapNode.btnWin.gameObject:SetActive(nStar == 3)
self._mapNode.txtWinTip.gameObject:SetActive(nStar == 3)
self._mapNode.btnWin.interactable = nStar == 3
self._mapNode.btnWin.gameObject:SetActive(0 < nStar and self._panel.mapLevel.bShowWin)
self._mapNode.txtWinTip.gameObject:SetActive(0 < nStar)
self._mapNode.btnWin.interactable = 0 < nStar and self._panel.mapLevel.bShowWin
end
NovaAPI.SetTMPText(self._mapNode.txtBtnStartTurn, nStar == 3 and ConfigTable.GetUIText("PenguinCard_Btn_ContinueTurn") or ConfigTable.GetUIText("PenguinCard_Btn_NextTurn"))
NovaAPI.SetTMPText(self._mapNode.txtBtnStartTurn, 0 < nStar and ConfigTable.GetUIText("PenguinCard_Btn_ContinueTurn") or ConfigTable.GetUIText("PenguinCard_Btn_NextTurn"))
end
function PenguinCardPrepareCtrl:PlayOutAni()
self.animator:Play("PengUinCard_Prepare_out", 0, 0)
@@ -333,15 +411,21 @@ function PenguinCardPrepareCtrl:OnBtnClick_StartTurn(btn)
end
function PenguinCardPrepareCtrl:OnEvent_AddRoll()
self:RefreshAddRoll()
self:RefreshAddSlot()
self:RefreshAddRound()
self:RefreshRollDesc()
self:RefreshRollCost()
local ani = self._mapNode.trBtnRoll:Find("AnimRoot"):GetComponent("Animator")
ani:Play("PengUinCard_Prepare_Roll_Add", 0, 0)
end
function PenguinCardPrepareCtrl:OnEvent_AddSlot()
self:RefreshAddRoll()
self:RefreshAddSlot()
self:RefreshAddRound()
end
function PenguinCardPrepareCtrl:OnEvent_AddRound()
self:RefreshAddRoll()
self:RefreshAddSlot()
self:RefreshAddRound()
end
function PenguinCardPrepareCtrl:OnEvent_ChangeScore(nBefore, nBeforeStar, nStar)
@@ -349,18 +433,19 @@ function PenguinCardPrepareCtrl:OnEvent_ChangeScore(nBefore, nBeforeStar, nStar)
self:RefreshAddSlotCost()
self:RefreshAddRollCost()
self:RefreshRollCost()
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == 1 then
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Prepare then
WwiseManger:PostEvent("Mode_Card_coin")
end
local callback = dotween_callback_handler(self, function()
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == 1 then
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Prepare then
WwiseManger:PostEvent("Mode_Card_coin_stop")
end
end)
DOTween.To(function()
return nBefore
end, function(v)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(math.floor(v)))
local nScore = math.floor(v + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(nScore))
end, self._panel.mapLevel.nScore, 0.5):OnComplete(callback)
if self._panel.mapLevel.tbStarScore[3] > 0 then
local nPos = self:GetStarPos(nStar, self._panel.mapLevel.nScore)
@@ -373,8 +458,8 @@ function PenguinCardPrepareCtrl:OnEvent_ChangeScore(nBefore, nBeforeStar, nStar)
NovaAPI.SetImageColor(self._mapNode.imgLine[i], v > self._panel.mapLevel.nScore and LineOff or LineOn)
end
end
if self._panel.mapLevel.nGameState == 1 then
if nBeforeStar == 3 and nStar < 3 then
if self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Prepare then
if 0 < nBeforeStar and nStar == 0 then
self._mapNode.btnWin.interactable = false
self._mapNode.aniWin:Play("PengUinCard_Prepare_Info_Nowin")
WwiseManger:PostEvent("Mode_Card_level_wingo")
@@ -382,14 +467,14 @@ function PenguinCardPrepareCtrl:OnEvent_ChangeScore(nBefore, nBeforeStar, nStar)
self._mapNode.btnWin.gameObject:SetActive(false)
self._mapNode.txtWinTip.gameObject:SetActive(false)
end, true, true, true)
elseif nBeforeStar < 3 and nStar == 3 then
self._mapNode.btnWin.gameObject:SetActive(true)
elseif nBeforeStar == 0 and 0 < nStar then
self._mapNode.btnWin.gameObject:SetActive(self._panel.mapLevel.bShowWin)
self._mapNode.txtWinTip.gameObject:SetActive(true)
self._mapNode.btnWin.interactable = false
self._mapNode.aniWin:Play("PengUinCard_Prepare_Info_Win")
WwiseManger:PostEvent("Mode_Card_level_win")
self:AddTimer(1, 1, function()
self._mapNode.btnWin.interactable = true
self._mapNode.btnWin.interactable = self._panel.mapLevel.bShowWin
end, true, true, true)
end
end
@@ -413,4 +498,23 @@ function PenguinCardPrepareCtrl:OnEvent_SalePenguinCard(_, nGroupId)
end
end
end
function PenguinCardPrepareCtrl:OnEvent_ChangeHp(nChange)
NovaAPI.SetTMPText(self._mapNode.txtMenuHp, self._panel.mapLevel.nHp)
end
function PenguinCardPrepareCtrl:OnEvent_ChangeQuestProcess(nChange)
local bComplete = self._panel.mapLevel.mapQuest:CheckComplete()
if bComplete and self._mapNode.imgQuestOnBg.activeInHierarchy == true and self._mapNode.imgQuestComplete.activeSelf == false then
self._mapNode.aniQuestOnBg:Play("PengUinCard_Prepare_Info_QuestComplete", 0, 0)
end
self._mapNode.imgQuestComplete:SetActive(bComplete)
local nP = self._panel.mapLevel.mapQuest.nAimCount / self._panel.mapLevel.mapQuest.nMaxAim
if 1 < nP then
nP = 1
end
local nPos = nP * QuestPos
self._mapNode.imgQuestProgress:DOSizeDelta(Vector2(nPos, 24), 0.5):SetEase(Ease.OutQuad)
end
function PenguinCardPrepareCtrl:OnEvent_SelectQuest()
self:RefreshQuest()
end
return PenguinCardPrepareCtrl
@@ -0,0 +1,119 @@
local PenguinCardQuest = class("PenguinCardQuest")
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
function PenguinCardQuest:ctor(nId)
self:Clear()
self:Init(nId)
end
function PenguinCardQuest:Clear()
self.nId = nil
self.nLevel = nil
self.nTurnLimit = nil
self.nBuffGroup = nil
self.nType = nil
self.tbParam = nil
self.sDesc = nil
self.nTurnCount = nil
self.nAimCount = nil
self.nMaxAim = nil
self.nBuffId = nil
end
function PenguinCardQuest:Init(nId)
self.nId = nId
self:ParseConfigData(nId)
end
function PenguinCardQuest:ParseConfigData(nId)
local mapCfg = ConfigTable.GetData("PenguinCardQuest", nId)
if nil == mapCfg then
return
end
self.nLevel = mapCfg.Level
self.nTurnLimit = mapCfg.TurnLimit
self.nBuffGroup = mapCfg.BuffGroup
self.nType = mapCfg.Type
self.tbParam = {}
for i = 1, 4 do
table.insert(self.tbParam, mapCfg["Param" .. i])
end
self.sDesc = self:SetDesc(mapCfg)
self.nTurnCount = 0
self.nAimCount = 0
self.nMaxAim = self.tbParam[1]
self:CreateBuffId()
end
function PenguinCardQuest:SetDesc(mapCfg)
local ParseParam = function(tbParam, nIndex)
if nIndex == 0 then
return self.nTurnLimit
end
local nParam = tbParam[nIndex]
if self.nType == GameEnum.PenguinCardQuestType.SuitCount and nIndex == 2 then
return PenguinCardUtils.SuitName[nParam]
elseif self.nType == GameEnum.PenguinCardQuestType.HandRank and nIndex == 2 then
local mapHandRankCfg = ConfigTable.GetData("PenguinCardHandRank", nParam)
if mapHandRankCfg then
return mapHandRankCfg.Title
end
end
return nParam
end
local result = string.gsub(mapCfg.Desc, "%b{}", function(token)
local content = string.match(token, "^{(.-)}$")
local sParameterKey, lang, langIdx = ParseLanguageParam(content)
if lang ~= nil then
token = string.format("{%s}", sParameterKey)
end
local trigIdx = string.match(token, "^{(%d+)}$")
if trigIdx then
local idx = tonumber(trigIdx)
local str = ParseParam(self.tbParam, idx)
str = LanguagePost(lang, langIdx, str)
return str
end
return token
end)
return result
end
function PenguinCardQuest:CreateBuffId()
local mapCfg = ConfigTable.GetData("PenguinCardBuffWeight", self.nBuffGroup)
if not mapCfg then
return
end
local tbBuffId = PenguinCardUtils.WeightedRandom(mapCfg.BuffList, mapCfg.Weight, 1)
self.nBuffId = tbBuffId[1]
end
function PenguinCardQuest:AddTurnCount()
self.nTurnCount = self.nTurnCount + 1
end
function PenguinCardQuest:AddProgress(nType, mapData)
if nType ~= self.nType then
return
end
if self.nType == GameEnum.PenguinCardQuestType.Score then
self:ChangeAimCount(mapData.nCount)
elseif self.nType == GameEnum.PenguinCardQuestType.HandRank then
local nAimId = self.tbParam[2]
if mapData.nId == nAimId then
self:ChangeAimCount(mapData.nCount)
end
elseif self.nType == GameEnum.PenguinCardQuestType.SuitCount then
local nAimId = self.tbParam[2]
if mapData.nId == nAimId then
self:ChangeAimCount(mapData.nCount)
end
end
end
function PenguinCardQuest:ChangeAimCount(nChange)
local nBefore = self.nAimCount
self.nAimCount = self.nAimCount + nChange
if NovaAPI.IsEditorPlatform() and nBefore ~= self.nAimCount then
printLog("任务进度变化:" .. " " .. self.nAimCount .. "/" .. self.nMaxAim)
end
EventManager.Hit("PenguinCard_ChangeQuestProcess", nChange)
end
function PenguinCardQuest:CheckExpired()
return self.nTurnCount >= self.nTurnLimit
end
function PenguinCardQuest:CheckComplete()
return self.nAimCount >= self.nMaxAim
end
return PenguinCardQuest
@@ -73,7 +73,7 @@ function PenguinCardQuestCtrl:OnDisable()
end
self.tbQuestGridCtrl = {}
end
function PenguinCardQuestCtrl:OnDestory()
function PenguinCardQuestCtrl:OnDestroy()
end
function PenguinCardQuestCtrl:PlayAnim_In()
self._mapNode.animator:Play("t_window_04_t_in")
@@ -0,0 +1,140 @@
local PenguinCardQuestItemCtrl = class("PenguinCardQuestItemCtrl", BaseCtrl)
local WwiseManger = CS.WwiseAudioManager.Instance
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
local _, NotMaxLevel = ColorUtility.TryParseHtmlString("#FFF7EA")
local _, MaxLevel = ColorUtility.TryParseHtmlString("#ffe075")
PenguinCardQuestItemCtrl._mapNodeConfig = {
AnimRoot = {sComponentName = "Animator"},
MoveRoot = {sComponentName = "Animator"},
imgSelect = {},
imgIcon = {sComponentName = "Image"},
goProgress = {},
txtName = {nCount = 2, sComponentName = "TMP_Text"},
txtProgress = {nCount = 2, sComponentName = "TMP_Text"},
txtTurn = {sComponentName = "TMP_Text"},
goSuc = {},
txtSuc = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Quest_Success"
},
goBuff = {},
txtBuffTitle = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Quest_BuffTitle"
},
imgBuff = {sComponentName = "Image"},
txtBuffDesc = {sComponentName = "TMP_Text"},
goFail = {},
txtFail = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Quest_Fail"
},
txtProgressFail = {nCount = 2, sComponentName = "TMP_Text"},
txtHp = {sComponentName = "TMP_Text"}
}
PenguinCardQuestItemCtrl._mapEventConfig = {}
function PenguinCardQuestItemCtrl:Refresh(mapQuest)
self.mapQuest = mapQuest
self:RefreshCommon()
self._mapNode.goProgress:SetActive(true)
self._mapNode.goSuc:SetActive(false)
self._mapNode.goBuff:SetActive(true)
self._mapNode.goFail:SetActive(false)
NovaAPI.SetTMPText(self._mapNode.txtName[1], mapQuest.sDesc)
if mapQuest.nType == GameEnum.PenguinCardQuestType.Score then
self._mapNode.txtProgress[1].gameObject:SetActive(true)
self._mapNode.txtProgress[2].gameObject:SetActive(false)
local nAimCount = math.floor(mapQuest.nAimCount + 0.5 + 1.0E-9)
local sAim = "<color=#b7d65d>" .. self:ThousandsNumber(nAimCount) .. "</color>"
NovaAPI.SetTMPText(self._mapNode.txtProgress[1], sAim .. "/" .. self:ThousandsNumber(math.floor(mapQuest.nMaxAim)))
else
self._mapNode.txtProgress[1].gameObject:SetActive(false)
self._mapNode.txtProgress[2].gameObject:SetActive(true)
local nAimCount = math.floor(mapQuest.nAimCount + 0.5 + 1.0E-9)
local sAim = "<color=#b7d65d>" .. self:ThousandsNumber(nAimCount) .. "</color>"
NovaAPI.SetTMPText(self._mapNode.txtProgress[2], sAim .. "/" .. self:ThousandsNumber(math.floor(mapQuest.nMaxAim)))
end
local nLeftTurn = mapQuest.nTurnLimit - mapQuest.nTurnCount
NovaAPI.SetTMPText(self._mapNode.txtTurn, orderedFormat(ConfigTable.GetUIText("PenguinCard_Quest_LeftTurn"), nLeftTurn))
local mapCfg = ConfigTable.GetData("PenguinCardBuff", mapQuest.nBuffId)
if mapCfg then
self:SetSprite(self._mapNode.imgBuff, "UI/Play_PenguinCard/SpriteAtlas/Sprite/" .. mapCfg.Icon)
NovaAPI.SetTMPText(self._mapNode.txtBuffDesc, PenguinCardUtils.SetEffectDesc(mapCfg))
end
end
function PenguinCardQuestItemCtrl:SetSelect(bSelect)
self._mapNode.imgSelect:SetActive(bSelect)
end
function PenguinCardQuestItemCtrl:RefreshCommon()
self._mapNode.imgSelect:SetActive(false)
end
function PenguinCardQuestItemCtrl:RefreshSuc(mapQuest)
self.mapQuest = mapQuest
self:RefreshCommon()
self._mapNode.goProgress:SetActive(false)
self._mapNode.goSuc:SetActive(true)
self._mapNode.goBuff:SetActive(true)
self._mapNode.goFail:SetActive(false)
local mapCfg = ConfigTable.GetData("PenguinCardBuff", mapQuest.nBuffId)
if mapCfg then
self:SetSprite(self._mapNode.imgBuff, "UI/Play_PenguinCard/SpriteAtlas/Sprite/" .. mapCfg.Icon)
NovaAPI.SetTMPText(self._mapNode.txtBuffDesc, PenguinCardUtils.SetEffectDesc(mapCfg))
end
end
function PenguinCardQuestItemCtrl:RefreshFail(mapQuest)
self.mapQuest = mapQuest
self:RefreshCommon()
self._mapNode.goProgress:SetActive(false)
self._mapNode.goSuc:SetActive(false)
self._mapNode.goBuff:SetActive(false)
self._mapNode.goFail:SetActive(true)
NovaAPI.SetTMPText(self._mapNode.txtName[2], mapQuest.sDesc)
if mapQuest.nType == GameEnum.PenguinCardQuestType.Score then
self._mapNode.txtProgressFail[1].gameObject:SetActive(true)
self._mapNode.txtProgressFail[2].gameObject:SetActive(false)
local nAimCount = math.floor(mapQuest.nAimCount + 0.5 + 1.0E-9)
local sAim = "<color=#b7d65d>" .. self:ThousandsNumber(nAimCount) .. "</color>"
NovaAPI.SetTMPText(self._mapNode.txtProgressFail[1], sAim .. "/" .. self:ThousandsNumber(math.floor(mapQuest.nMaxAim)))
else
self._mapNode.txtProgressFail[1].gameObject:SetActive(false)
self._mapNode.txtProgressFail[2].gameObject:SetActive(true)
local nAimCount = math.floor(mapQuest.nAimCount + 0.5 + 1.0E-9)
local sAim = "<color=#b7d65d>" .. self:ThousandsNumber(nAimCount) .. "</color>"
NovaAPI.SetTMPText(self._mapNode.txtProgressFail[2], sAim .. "/" .. self:ThousandsNumber(math.floor(mapQuest.nMaxAim)))
end
end
function PenguinCardQuestItemCtrl:PlaySelectAni(bSelect)
if bSelect then
self._mapNode.MoveRoot:Play("tc_newperk_card_switch_up", 0, 0)
else
self._mapNode.MoveRoot:Play("tc_newperk_card_switch_down", 0, 0)
end
end
function PenguinCardQuestItemCtrl:PlayInAni()
if self.mapQuest.nLevel == 1 then
self._mapNode.AnimRoot:Play("PenguinCardQuest_Blue_in", 0, 0)
elseif self.mapQuest.nLevel == 2 then
self._mapNode.AnimRoot:Play("PenguinCardQuest_Red_in", 0, 0)
end
end
function PenguinCardQuestItemCtrl:PlayOutAni()
if self.mapQuest.nLevel == 1 then
self._mapNode.AnimRoot:Play("PenguinCardQuest_Blue_Out", 0, 0)
elseif self.mapQuest.nLevel == 2 then
self._mapNode.AnimRoot:Play("PenguinCardQuest_Red_Out", 0, 0)
end
end
function PenguinCardQuestItemCtrl:PlaySelectOutAni()
if self.mapQuest.nLevel == 1 then
self._mapNode.AnimRoot:Play("PenguinCardQuest_Blue_Select", 0, 0)
elseif self.mapQuest.nLevel == 2 then
self._mapNode.AnimRoot:Play("PenguinCardQuest_Red_Select", 0, 0)
end
end
function PenguinCardQuestItemCtrl:Awake()
end
function PenguinCardQuestItemCtrl:OnEnable()
end
function PenguinCardQuestItemCtrl:OnDisable()
end
return PenguinCardQuestItemCtrl
@@ -0,0 +1,392 @@
local PenguinCardQuestSelectCtrl = class("PenguinCardQuestSelectCtrl", BaseCtrl)
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
local _, NotMaxLevel = ColorUtility.TryParseHtmlString("#FFF7EA")
local _, MaxLevel = ColorUtility.TryParseHtmlString("#ffe075")
local WwiseManger = CS.WwiseAudioManager.Instance
PenguinCardQuestSelectCtrl._mapNodeConfig = {
blur = {
sNodeName = "t_fullscreen_blur_blue"
},
aniBlur = {
sNodeName = "t_fullscreen_blur_blue",
sComponentName = "Animator"
},
Select = {sNodeName = "--Select--"},
txtQuestTitle = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Quest_SelectTitle"
},
btnConfirm = {
sComponentName = "UIButton",
callback = "OnBtnClick_Confirm"
},
txtBtnConfirm = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Btn_SelectQuest"
},
rtBtnConfirm = {
sNodeName = "btnConfirm",
sComponentName = "RectTransform"
},
goSelectQuest = {
nCount = 3,
sCtrlName = "Game.UI.Play_PenguinCard.PenguinCardQuestItemCtrl"
},
btnQuest = {
sComponentName = "UIButton",
nCount = 3,
callback = "OnBtnClick_Quest"
},
btnBack = {
sComponentName = "UIButton",
callback = "OnBtnClick_Back"
},
btnNext = {
sComponentName = "UIButton",
callback = "OnBtnClick_Next"
},
Count = {sNodeName = "--Count--"},
goQuest = {
sCtrlName = "Game.UI.Play_PenguinCard.PenguinCardQuestItemCtrl"
},
txtScore = {sComponentName = "TMP_Text"},
goQuestBuff = {},
rtQuestBuff = {sComponentName = "Transform"},
Hp = {sNodeName = "--Hp--"},
goHp = {nCount = 3, sComponentName = "Animator"},
txtHpTip = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Quest_FailDesc"
},
goInfo = {}
}
PenguinCardQuestSelectCtrl._mapEventConfig = {
PenguinCard_AddBuff = "OnEvent_AddBuff",
PenguinCard_DeleteBuff = "OnEvent_DeleteBuff",
PenguinCard_ChangeScore = "OnEvent_ChangeScore",
PenguinCard_ChangeHp = "OnEvent_ChangeHp",
PenguinCard_Pause_SwitchGame = "FastClose",
PenguinCard_BlockFatalDamage = "OnEvent_BlockFatalDamage"
}
function PenguinCardQuestSelectCtrl:Open(bCur)
self._panel.mapLevel:Pause()
local nScore = math.floor(self._panel.mapLevel.nScore + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(nScore))
self.bCur = bCur
self:PlayInAni()
local wait = function()
coroutine.yield(CS.UnityEngine.WaitForEndOfFrame())
self._mapNode.goInfo:SetActive(true)
if bCur then
self:RefreshCur()
else
self:RefreshPhase()
end
end
cs_coroutine.start(wait)
end
function PenguinCardQuestSelectCtrl:RefreshCur()
self._mapNode.Select:SetActive(false)
self._mapNode.Count:SetActive(true)
self._mapNode.Hp:SetActive(true)
self._mapNode.btnNext.gameObject:SetActive(false)
self._mapNode.goQuest:Refresh(self._panel.mapLevel.mapQuest)
self:RefreshHp()
WwiseManger:PostEvent("Mode_Card_mission")
self._mapNode.goQuest:PlayInAni()
end
function PenguinCardQuestSelectCtrl:RefreshPhase()
self._mapNode.btnNext.gameObject:SetActive(false)
self.callbackNext = nil
local bPlayHpAni = false
local bEmptySelect = next(self._panel.mapLevel.tbSelectableQuest) == nil
local next_select = function()
self:TryShowBuff()
self._mapNode.goQuest:PlayOutAni()
if bEmptySelect then
self:Close()
self:AddTimer(1, 0.4, function()
self._panel.mapLevel:SwitchGameState()
end, true, true, true)
else
self:AddTimer(1, 0.2, function()
self:RefreshSelect()
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
end
if self._panel.mapLevel.mapQuestForShow then
local bComplete = self._panel.mapLevel.mapQuestForShow:CheckComplete()
if bComplete then
self:RefreshCount(true)
self:AddTimer(1, 0.5, function()
self:TryShowBuff()
end, true, true, true)
self.callbackNext = next_select
self._mapNode.btnNext.gameObject:SetActive(true)
else
local bExpired = self._panel.mapLevel.mapQuestForShow:CheckExpired()
if bExpired then
bPlayHpAni = true
if self._panel.mapLevel.nHp > 0 then
self:RefreshCount(false)
self.callbackNext = next_select
self._mapNode.btnNext.gameObject:SetActive(true)
else
self:RefreshCount(false)
function self.callbackNext()
self:FastClose()
self:AddTimer(1, 0.2, function()
self._panel.mapLevel:SwitchGameState()
end, true, true, true)
end
self._mapNode.btnNext.gameObject:SetActive(true)
end
end
end
else
self:RefreshSelect()
end
if bPlayHpAni then
if self.bBlockFatalDamage then
self.bBlockFatalDamage = false
for i = 2, 3 do
self._mapNode.goHp[i]:Play("PenguinCardHp_Null", 0, 0)
end
self:AddTimer(1, 0.5, function()
self._mapNode.goHp[1]:Play("PenguinCardHp_Del", 0, 0)
WwiseManger:PostEvent("Mode_Card_hurt")
self:AddTimer(1, 1, function()
self._mapNode.goHp[1]:Play("PenguinCardHp_Add")
WwiseManger:PostEvent("Mode_Card_heal")
end, true, true, true)
end, true, true, true)
else
local nIndex = self._panel.mapLevel.nHp + 1
for i = 1, 3 do
if i > nIndex then
self._mapNode.goHp[i]:Play("PenguinCardHp_Null", 0, 0)
end
end
self:AddTimer(1, 0.5, function()
self._mapNode.goHp[nIndex]:Play("PenguinCardHp_Del", 0, 0)
WwiseManger:PostEvent("Mode_Card_hurt")
end, true, true, true)
end
end
end
function PenguinCardQuestSelectCtrl:RefreshSelect()
self._mapNode.Select:SetActive(true)
self._mapNode.Count:SetActive(false)
self._mapNode.Hp:SetActive(true)
self.nSelectIndex = 0
self._mapNode.btnConfirm.gameObject:SetActive(false)
local nMax = #self._panel.mapLevel.tbSelectableQuest
for i = 1, 3 do
self._mapNode.goSelectQuest[i].gameObject:SetActive(i <= nMax)
if i <= nMax then
self._mapNode.goSelectQuest[i]:Refresh(self._panel.mapLevel.tbSelectableQuest[i])
self._mapNode.goSelectQuest[i]:PlayInAni()
end
end
self:RefreshHp()
WwiseManger:PostEvent("Mode_Card_mission")
end
function PenguinCardQuestSelectCtrl:MoveConfirmButton(nIndex)
local rtBtn = self._mapNode.goSelectQuest[nIndex].gameObject.transform:GetComponent("RectTransform")
self._mapNode.rtBtnConfirm.localPosition = Vector3(rtBtn.localPosition.x, self.btnConfirmPosY, 0)
if self._mapNode.btnConfirm.gameObject.activeSelf == false then
self._mapNode.btnConfirm.gameObject:SetActive(true)
else
local animCtrl = self._mapNode.btnConfirm.transform:Find("AnimRoot/Show"):GetComponent("Animator")
animCtrl:Play("btnConfirm_in", 0, 0)
end
end
function PenguinCardQuestSelectCtrl:RefreshCount(bSuc)
self._mapNode.Select:SetActive(false)
self._mapNode.Count:SetActive(true)
if bSuc == true then
self._mapNode.Hp:SetActive(false)
self._mapNode.goQuest:RefreshSuc(self._panel.mapLevel.mapQuestForShow)
WwiseManger:PostEvent("Mode_Card_mission_com")
elseif bSuc == false then
self._mapNode.Hp:SetActive(true)
self._mapNode.goQuest:RefreshFail(self._panel.mapLevel.mapQuestForShow)
WwiseManger:PostEvent("Mode_Card_mission")
end
self._mapNode.goQuest:PlayInAni()
end
function PenguinCardQuestSelectCtrl:RefreshHp()
for i = 1, 3 do
if i > self._panel.mapLevel.nHp then
self._mapNode.goHp[i]:Play("PenguinCardHp_Null", 0, 0)
end
end
end
function PenguinCardQuestSelectCtrl:ClearBuffItem()
delChildren(self._mapNode.rtQuestBuff)
self.tbBuffItem = {}
self.tbWaitShowBuff = {}
end
function PenguinCardQuestSelectCtrl:PlayInAni()
self.gameObject:SetActive(true)
self._mapNode.blur:SetActive(true)
EventManager.Hit("PenguinCard_QuestSelectOpen")
EventManager.Hit(EventId.TemporaryBlockInput, 0.3)
end
function PenguinCardQuestSelectCtrl:Close()
self.animator:Play("PengUinCard_Quest_out", 0, 0)
self._mapNode.aniBlur:SetTrigger("tOut")
self._mapNode.btnConfirm.gameObject:SetActive(false)
self:AddTimer(1, 0.4, function()
self._panel.mapLevel:Resume()
self._mapNode.goInfo:SetActive(false)
self.gameObject:SetActive(false)
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.4)
end
function PenguinCardQuestSelectCtrl:FastClose()
if self.gameObject.activeSelf == false then
return
end
self.animator:Play("PengUinCard_Quest_out_fast", 0, 0)
self._mapNode.aniBlur:SetTrigger("tOut")
self._mapNode.btnConfirm.gameObject:SetActive(false)
self:AddTimer(1, 0.2, function()
self._panel.mapLevel:Resume()
self._mapNode.goInfo:SetActive(false)
self.gameObject:SetActive(false)
end, true, true, true)
EventManager.Hit(EventId.TemporaryBlockInput, 0.2)
end
function PenguinCardQuestSelectCtrl:TryShowBuff()
if next(self.tbWaitShowBuff) == nil then
return
end
local nAll = #self.tbWaitShowBuff
for i = nAll, 1, -1 do
local mapBuff = self.tbWaitShowBuff[i]
table.remove(self.tbWaitShowBuff, i)
self:AddBuff(mapBuff)
end
end
function PenguinCardQuestSelectCtrl:AddBuff(mapBuff)
if not self.tbBuffItem then
self.tbBuffItem = {}
end
local goItemObj = instantiate(self._mapNode.goQuestBuff, self._mapNode.rtQuestBuff)
goItemObj:SetActive(true)
table.insert(self.tbBuffItem, goItemObj)
local btn = goItemObj.transform:Find("btnOpenInfo"):GetComponent("UIButton")
local imgSelect = goItemObj.transform:Find("btnOpenInfo/AnimRoot/imgSelect").gameObject
local imgIcon = goItemObj.transform:Find("btnOpenInfo/AnimRoot/imgIcon"):GetComponent("Image")
local ani = goItemObj.transform:Find("btnOpenInfo/AnimRoot"):GetComponent("Animator")
self:SetSprite(imgIcon, "UI/Play_PenguinCard/SpriteAtlas/Sprite/" .. mapBuff.sIcon)
ani:Play("PenguinCardBuff_in", 0, 0)
local click = function()
imgSelect:SetActive(true)
EventManager.Hit("PenguinCard_OpenBuffTips", mapBuff, function()
imgSelect:SetActive(false)
end)
end
btn.onClick:AddListener(click)
end
function PenguinCardQuestSelectCtrl:Awake()
self._mapNode.goInfo:SetActive(false)
self.animator = self.gameObject:GetComponent("Animator")
self.btnConfirmPosY = self._mapNode.rtBtnConfirm.localPosition.y
self.tbWaitShowBuff = {}
end
function PenguinCardQuestSelectCtrl:OnEnable()
end
function PenguinCardQuestSelectCtrl:OnDisable()
end
function PenguinCardQuestSelectCtrl:OnBtnClick_Quest(btn, nIndex)
if self.nSelectIndex == nIndex then
return
end
self:MoveConfirmButton(nIndex)
if self.nSelectIndex ~= 0 then
self._mapNode.goSelectQuest[self.nSelectIndex]:SetSelect(false)
self._mapNode.goSelectQuest[self.nSelectIndex]:PlaySelectAni(false)
end
self._mapNode.goSelectQuest[nIndex]:SetSelect(true)
self._mapNode.goSelectQuest[nIndex]:PlaySelectAni(true)
self.nSelectIndex = nIndex
end
function PenguinCardQuestSelectCtrl:OnBtnClick_Confirm()
if not self.nSelectIndex or self.nSelectIndex == 0 then
return
end
local nMax = #self._panel.mapLevel.tbSelectableQuest
for i = 1, nMax do
if i == self.nSelectIndex then
self._mapNode.goSelectQuest[i]:PlaySelectOutAni()
self._mapNode.goSelectQuest[i]:SetSelect(false)
else
self._mapNode.goSelectQuest[i]:PlayOutAni()
end
end
self._panel.mapLevel:SelectQuest(self.nSelectIndex)
self:Close()
self:AddTimer(1, 0.4, function()
self._panel.mapLevel:SwitchGameState()
end, true, true, true)
end
function PenguinCardQuestSelectCtrl:OnBtnClick_Back()
if self.bCur then
self._mapNode.goQuest:PlayOutAni()
self:Close()
else
EventManager.Hit("PenguinCard_OpenPause")
end
end
function PenguinCardQuestSelectCtrl:OnBtnClick_Next()
if self.callbackNext then
self.callbackNext()
end
self._mapNode.btnNext.gameObject:SetActive(false)
end
function PenguinCardQuestSelectCtrl:OnEvent_AddBuff(mapBuff, bWaitShow)
if bWaitShow then
table.insert(self.tbWaitShowBuff, mapBuff)
else
self:AddBuff(mapBuff)
end
end
function PenguinCardQuestSelectCtrl:OnEvent_DeleteBuff(nIndex)
if not self.tbBuffItem or next(self.tbBuffItem) == nil then
return
end
local goBuff = self.tbBuffItem[nIndex]
table.remove(self.tbBuffItem, nIndex)
if goBuff:IsNull() == false then
local ani = goBuff.transform:Find("btnOpenInfo/AnimRoot"):GetComponent("Animator")
ani:Play("PenguinCardBuff_out", 0, 0)
self:AddTimer(1, 0.4, function()
destroy(goBuff)
end, true, true, true)
end
end
function PenguinCardQuestSelectCtrl:OnEvent_ChangeScore(nBefore, nBeforeStar, nStar)
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Quest then
WwiseManger:PostEvent("Mode_Card_coin")
end
local callback = dotween_callback_handler(self, function()
if nBefore < self._panel.mapLevel.nScore and self._panel.mapLevel.nGameState == PenguinCardUtils.GameState.Quest then
WwiseManger:PostEvent("Mode_Card_coin_stop")
end
end)
DOTween.To(function()
return nBefore
end, function(v)
local nScore = math.floor(v + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(nScore))
end, self._panel.mapLevel.nScore, 0.5):OnComplete(callback)
end
function PenguinCardQuestSelectCtrl:OnEvent_ChangeHp(nChange)
end
function PenguinCardQuestSelectCtrl:OnEvent_BlockFatalDamage()
self.bBlockFatalDamage = true
end
return PenguinCardQuestSelectCtrl
@@ -107,11 +107,12 @@ function PenguinCardResultCtrl:RefreshState()
self._mapNode.goBgOff:SetActive(not self.bWin)
self._mapNode.goTitleOn:SetActive(self.bWin)
self._mapNode.goTitleOff:SetActive(not self.bWin)
self._mapNode.txtNeedCount.gameObject:SetActive(self._panel.mapLevel.nStar < 3)
if self._panel.mapLevel.nStar < 3 then
local nMax = self._panel.mapLevel.tbStarScore[self._panel.mapLevel.nStar + 1]
self._mapNode.txtNeedCount.gameObject:SetActive(not self.bWin)
if not self.bWin then
local nMax = self._panel.mapLevel.tbStarScore[1]
local nNeed = nMax - self._panel.mapLevel.nScore
NovaAPI.SetTMPText(self._mapNode.txtNeedCount, orderedFormat(ConfigTable.GetUIText("PenguinCard_Result_NeedScore"), self:ThousandsNumber(clearFloat(nNeed))))
nNeed = math.floor(nNeed + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtNeedCount, orderedFormat(ConfigTable.GetUIText("PenguinCard_Result_NeedScore"), self:ThousandsNumber(nNeed)))
end
end
function PenguinCardResultCtrl:RefreshTitle()
@@ -119,7 +120,8 @@ function PenguinCardResultCtrl:RefreshTitle()
self._mapNode.imgStarOff[i]:SetActive(i > self._panel.mapLevel.nStar)
self._mapNode.imgStarOn[i]:SetActive(i <= self._panel.mapLevel.nStar)
end
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(clearFloat(self._panel.mapLevel.nScore)))
local nScore = math.floor(self._panel.mapLevel.nScore + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtScore, self:ThousandsNumber(nScore))
end
function PenguinCardResultCtrl:RefreshCard()
local nCount = self._panel.mapLevel:GetOwnPenguinCardCount()
@@ -137,8 +139,10 @@ end
function PenguinCardResultCtrl:RefreshStatistics()
NovaAPI.SetTMPText(self._mapNode.txtTotalTurn, self._panel.mapLevel.nCurTurn)
NovaAPI.SetTMPText(self._mapNode.txtTotalRound, self._panel.mapLevel.nTotalRound)
NovaAPI.SetTMPText(self._mapNode.txtBestTurn, self:ThousandsNumber(clearFloat(self._panel.mapLevel.nBestTurnScore)))
NovaAPI.SetTMPText(self._mapNode.txtBestRound, self:ThousandsNumber(clearFloat(self._panel.mapLevel.nBestRoundScore)))
local nBestTurnScore = math.floor(self._panel.mapLevel.nBestTurnScore + 0.5 + 1.0E-9)
local nBestRoundScore = math.floor(self._panel.mapLevel.nBestRoundScore + 0.5 + 1.0E-9)
NovaAPI.SetTMPText(self._mapNode.txtBestTurn, self:ThousandsNumber(nBestTurnScore))
NovaAPI.SetTMPText(self._mapNode.txtBestRound, self:ThousandsNumber(nBestRoundScore))
local nHandRankId, nHandRankCount = self._panel.mapLevel:GetMostHandRank()
if 0 < nHandRankId then
local mapHandRankCfg = ConfigTable.GetData("PenguinCardHandRank", nHandRankId)
@@ -27,11 +27,7 @@ PenguinCardSelectCtrl._mapEventConfig = {
PenguinCard_ClickLevel = "OnEvent_Click",
PenguinCard_EnterLevel = "OnEvent_Enter"
}
PenguinCardSelectCtrl._mapRedDotConfig = {
[RedDotDefine.Activity_PenguinCard_AllQuest] = {
sNodeName = "reddotQuest"
}
}
PenguinCardSelectCtrl._mapRedDotConfig = {}
function PenguinCardSelectCtrl:Refresh()
self.goFirstLock = nil
self.tbLevel = self.actData:GetLevelList()
@@ -92,6 +88,27 @@ function PenguinCardSelectCtrl:Awake()
end
function PenguinCardSelectCtrl:OnEnable()
self:Refresh()
local mapActivityData = ConfigTable.GetData("Activity", self.nActId)
if mapActivityData ~= nil then
local nGroupId = mapActivityData.MidGroupId
local mapGroupData = PlayerData.Activity:GetActivityGroupDataById(nGroupId)
if mapGroupData ~= nil then
local actData = mapGroupData:GetActivityDataByIndex(AllEnum.ActivityThemeFuncIndex.Task)
if actData ~= nil then
RedDotManager.RegisterNode(RedDotDefine.Activity_Group_Task_Group, {
nGroupId,
actData.ActivityId,
mapActivityData.MiniGameRedDot
}, self._mapNode.reddotQuest)
else
self._mapNode.reddotQuest:SetActive(false)
end
else
self._mapNode.reddotQuest:SetActive(false)
end
else
self._mapNode.reddotQuest:SetActive(false)
end
end
function PenguinCardSelectCtrl:OnDisable()
for k, v in pairs(self.tbGridCtrl) do
@@ -105,7 +122,17 @@ end
function PenguinCardSelectCtrl:OnDestroy()
end
function PenguinCardSelectCtrl:OnBtnClick_Quest()
EventManager.Hit(EventId.OpenPanel, PanelId.PenguinCardQuest, self.nActId)
local mapActivityData = ConfigTable.GetData("Activity", self.nActId)
if mapActivityData ~= nil then
local nGroupId = mapActivityData.MidGroupId
local mapGroupData = PlayerData.Activity:GetActivityGroupDataById(nGroupId)
if mapGroupData ~= nil then
local actData = mapGroupData:GetActivityDataByIndex(AllEnum.ActivityThemeFuncIndex.Task)
if actData ~= nil then
EventManager.Hit(EventId.OpenPanel, PanelId.Task_20102, actData.ActivityId, 5)
end
end
end
end
function PenguinCardSelectCtrl:OnEvent_Click(go)
self._mapNode.sc:ScrollToClick(go)
@@ -0,0 +1,40 @@
local PenguinCardStartCtrl = class("PenguinCardStartCtrl", BaseCtrl)
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
local WwiseManger = CS.WwiseAudioManager.Instance
PenguinCardStartCtrl._mapNodeConfig = {
txtLevelDesc = {sComponentName = "TMP_Text"},
txtStartTitle = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Start_Title"
},
txtAim = {sComponentName = "TMP_Text"},
txtTurnLimit = {sComponentName = "TMP_Text"},
btnStart = {
sComponentName = "UIButton",
callback = "OnBtnClick_Start"
},
txtBtnStart = {
sComponentName = "TMP_Text",
sLanguageId = "PenguinCard_Btn_Start"
}
}
PenguinCardStartCtrl._mapEventConfig = {}
function PenguinCardStartCtrl:Refresh()
NovaAPI.SetTMPText(self._mapNode.txtAim, self:ThousandsNumber(self._panel.mapLevel.tbStarScore[1]))
NovaAPI.SetTMPText(self._mapNode.txtTurnLimit, orderedFormat(ConfigTable.GetUIText("PenguinCard_Start_Turn"), self._panel.mapLevel.nMaxTurn))
NovaAPI.SetTMPText(self._mapNode.txtLevelDesc, self._panel.mapLevel.sLevelDesc)
end
function PenguinCardStartCtrl:PlayOutAni()
self.animator:Play("PengUinCard_Start_out", 0, 0)
end
function PenguinCardStartCtrl:Awake()
self.animator = self.gameObject:GetComponent("Animator")
end
function PenguinCardStartCtrl:OnEnable()
end
function PenguinCardStartCtrl:OnDisable()
end
function PenguinCardStartCtrl:OnBtnClick_Start(btn)
self._panel.mapLevel:SwitchGameState()
end
return PenguinCardStartCtrl
@@ -0,0 +1,325 @@
local PenguinCardUtils = {}
PenguinCardUtils.GameState = {
Start = 0,
Prepare = 1,
Dealing = 2,
Flip = 3,
Settlement = 4,
Complete = 5,
Quest = 6
}
PenguinCardUtils.SuitName = {
[GameEnum.PenguinBaseCardSuit.Blue] = "<sprite name=\"icon_PengCard_Water_small\">",
[GameEnum.PenguinBaseCardSuit.Red] = "<sprite name=\"icon_PengCard_Fire_small\">",
[GameEnum.PenguinBaseCardSuit.Green] = "<sprite name=\"icon_PengCard_Wind_small\">"
}
function PenguinCardUtils.CheckTriggerAble(nTriggerType, tbTriggerParam, nTriggerProbability, mapTriggerSource)
local bAble = false
if nTriggerType == GameEnum.PenguinCardTriggerType.None then
bAble = true
elseif mapTriggerSource then
if nTriggerType == GameEnum.PenguinCardTriggerType.SuitCards and mapTriggerSource.SuitCards then
local nAimCount = #tbTriggerParam
local nHasCount = 0
for _, nAimSuit in ipairs(tbTriggerParam) do
for _, nHasSuit in ipairs(mapTriggerSource.SuitCards) do
if nAimSuit == nHasSuit then
nHasCount = nHasCount + 1
end
end
end
if nAimCount <= nHasCount then
bAble = true
end
elseif nTriggerType == GameEnum.PenguinCardTriggerType.SuitCount and mapTriggerSource.SuitCount then
for k, nAimCount in pairs(tbTriggerParam) do
if not mapTriggerSource.SuitCount[tonumber(k)] or nAimCount > mapTriggerSource.SuitCount[tonumber(k)] then
return false
end
end
bAble = true
elseif nTriggerType == GameEnum.PenguinCardTriggerType.HandRankSuitCount and mapTriggerSource.HandRankSuitCount then
for k, nAimCount in pairs(tbTriggerParam) do
if not mapTriggerSource.HandRankSuitCount[tonumber(k)] or nAimCount > mapTriggerSource.HandRankSuitCount[tonumber(k)] then
return false
end
end
bAble = true
elseif nTriggerType == GameEnum.PenguinCardTriggerType.BaseCardId and mapTriggerSource.BaseCard then
bAble = mapTriggerSource.BaseCard.nId == tbTriggerParam[1]
elseif nTriggerType == GameEnum.PenguinCardTriggerType.RepeatHandRank and mapTriggerSource.HandRankCount and mapTriggerSource.HandRank then
bAble = false
for id, count in pairs(mapTriggerSource.HandRankCount) do
if mapTriggerSource.HandRank == id and 2 <= count then
bAble = true
break
end
end
elseif nTriggerType == GameEnum.PenguinCardTriggerType.HandRank and mapTriggerSource.HandRank then
for _, v in ipairs(tbTriggerParam) do
if mapTriggerSource.HandRank == v then
bAble = true
break
end
end
end
end
local randomValue = math.random(0, 100)
return bAble and nTriggerProbability >= randomValue
end
function PenguinCardUtils.CheckGrowthLayer(nGrowthTriggerType, tbGrowthTriggerParam, mapTriggerSource)
local nAdd = 0
if nGrowthTriggerType == GameEnum.PenguinCardGrowthTriggerType.None then
nAdd = 1
elseif nGrowthTriggerType == GameEnum.PenguinCardGrowthTriggerType.HandRank and mapTriggerSource.HandRank then
for _, v in ipairs(tbGrowthTriggerParam) do
if mapTriggerSource.HandRank == v then
nAdd = 1
break
end
end
elseif nGrowthTriggerType == GameEnum.PenguinCardGrowthTriggerType.LevelCount and mapTriggerSource.PenguinCardLevel then
nAdd = mapTriggerSource.PenguinCardLevel
elseif nGrowthTriggerType == GameEnum.PenguinCardGrowthTriggerType.SuitCountInCard and mapTriggerSource.BaseCard then
local nAimSuit = tbGrowthTriggerParam[1]
local mapCfg = ConfigTable.GetData("PenguinBaseCard", mapTriggerSource.BaseCard.nId)
if mapCfg and nAimSuit == mapCfg.Suit1 then
nAdd = mapCfg.SuitCount1
end
end
return nAdd
end
function PenguinCardUtils.SetEffectDesc(mapCfg, nGrowthLayer)
local nTriggerType = mapCfg.TriggerType
local nEffectType = mapCfg.EffectType
local nGrowthTriggerType = mapCfg.GrowthTriggerType
nGrowthLayer = nGrowthLayer or 0
local sError = "<color=#BD3059>Error:Parameter mismatch</color>"
local ParseTriggerParam = function(tbParam, nIndex)
if nTriggerType == GameEnum.PenguinCardTriggerType.SuitCards then
local nSuit = tbParam[nIndex]
if nSuit == nil then
return sError
end
return PenguinCardUtils.SuitName[nSuit]
elseif nTriggerType == GameEnum.PenguinCardTriggerType.BaseCardId then
local nBaseCardId = tbParam[nIndex]
if nBaseCardId == nil then
return sError
end
local mapBase = ConfigTable.GetData("PenguinBaseCard", nBaseCardId)
if mapBase then
return mapBase.Title
end
elseif nTriggerType == GameEnum.PenguinCardTriggerType.SuitCount or nTriggerType == GameEnum.PenguinCardTriggerType.HandRankSuitCount then
local mapSuit = {}
for k, v in pairs(tbParam) do
local nSuit = tonumber(k)
if nSuit then
mapSuit[nSuit] = v
end
end
local i = 1
for nSuit, v in ipairsSorted(mapSuit) do
if i == nIndex then
local sName = ""
for _ = 1, v do
sName = sName .. PenguinCardUtils.SuitName[nSuit]
end
return sName
end
i = i + 1
end
elseif nTriggerType == GameEnum.PenguinCardTriggerType.HandRank then
if tbParam[nIndex] == nil then
return sError
end
local mapHandRank = ConfigTable.GetData("PenguinCardHandRank", tbParam[nIndex])
if mapHandRank then
return mapHandRank.Title
end
end
end
local ParseEffectParam = function(tbParam, nIndex)
if nEffectType == GameEnum.PenguinCardEffectType.AddBaseCardWeight then
local tbId = {}
for k, _ in pairs(tbParam) do
local nId = tonumber(k)
if nId then
table.insert(tbId, nId)
end
end
table.sort(tbId, function(a, b)
return a < b
end)
local nBaseCardId = tbId[nIndex]
if nBaseCardId == nil then
return sError
end
local mapBase = ConfigTable.GetData("PenguinBaseCard", nBaseCardId)
if mapBase then
return mapBase.Title
end
elseif nEffectType == GameEnum.PenguinCardEffectType.ReplaceBaseCard then
local nBaseCardId = tbParam[nIndex]
if nBaseCardId == nil then
return sError
end
local mapBase = ConfigTable.GetData("PenguinBaseCard", nBaseCardId)
if mapBase then
return mapBase.Title
end
elseif nEffectType == GameEnum.PenguinCardEffectType.IncreaseBasicChips or nEffectType == GameEnum.PenguinCardEffectType.IncreaseMultiplier or nEffectType == GameEnum.PenguinCardEffectType.MultiMultiplier or nEffectType == GameEnum.PenguinCardEffectType.UpgradeDiscount or nEffectType == GameEnum.PenguinCardEffectType.AddRound or nEffectType == GameEnum.PenguinCardEffectType.BlockFatalDamage or nEffectType == GameEnum.PenguinCardEffectType.UpgradeRebate then
if tbParam[nIndex] == nil then
return sError
end
return math.abs(tbParam[nIndex])
end
end
local ParseGrowthTriggerParam = function(tbParam, nIndex)
if nGrowthTriggerType == GameEnum.PenguinCardGrowthTriggerType.SuitCountInCard then
if tbParam[nIndex] == nil then
return sError
end
return PenguinCardUtils.SuitName[tbParam[nIndex]]
elseif nGrowthTriggerType == GameEnum.PenguinCardGrowthTriggerType.HandRank then
if tbParam[nIndex] == nil then
return sError
end
local mapHandRank = ConfigTable.GetData("PenguinCardHandRank", tbParam[nIndex])
if mapHandRank then
return mapHandRank.Title
end
end
end
local ParseTotalEffectParam = function(tbEffectParam, tbGrowthParam, nIndex)
if nEffectType == GameEnum.PenguinCardEffectType.IncreaseBasicChips or nEffectType == GameEnum.PenguinCardEffectType.IncreaseMultiplier or nEffectType == GameEnum.PenguinCardEffectType.MultiMultiplier or nEffectType == GameEnum.PenguinCardEffectType.UpgradeDiscount or nEffectType == GameEnum.PenguinCardEffectType.AddRound or nEffectType == GameEnum.PenguinCardEffectType.UpgradeRebate then
if tbEffectParam[nIndex] == nil or tbGrowthParam[nIndex] == nil then
return sError
end
local nValue = tbEffectParam[nIndex] + nGrowthLayer * tbGrowthParam[nIndex]
if nValue < 0 then
nValue = 0
end
return nValue
end
end
local result = string.gsub(mapCfg.Desc, "%b{}", function(token)
local content = string.match(token, "^{(.-)}$")
local sParameterKey, lang, langIdx = ParseLanguageParam(content)
if lang ~= nil then
token = string.format("{%s}", sParameterKey)
end
if token == "{TriggerProbability}" then
return mapCfg.TriggerProbability
elseif token == "{TriggerLimitParam}" then
return mapCfg.TriggerLimitParam
elseif token == "{DurationParam}" then
return mapCfg.DurationParam
end
local trigIdx = string.match(token, "^{TriggerParam_(%d+)}$")
if trigIdx then
local idx = tonumber(trigIdx)
local str = ParseTriggerParam(decodeJson(mapCfg.TriggerParam), idx)
str = LanguagePost(lang, langIdx, str)
return str
end
local effectIdx = string.match(token, "^{EffectParam_(%d+)}$")
if effectIdx then
local idx = tonumber(effectIdx)
local str = ParseEffectParam(decodeJson(mapCfg.EffectParam), idx)
str = LanguagePost(lang, langIdx, str)
return str
end
local trigGrowthIdx = string.match(token, "^{GrowthTriggerParam_(%d+)}$")
if trigGrowthIdx then
local idx = tonumber(trigGrowthIdx)
local str = ParseGrowthTriggerParam(decodeJson(mapCfg.GrowthTriggerParam), idx)
str = LanguagePost(lang, langIdx, str)
return str
end
local effectGrowthIdx = string.match(token, "^{GrowthEffectParam_(%d+)}$")
if effectGrowthIdx then
local idx = tonumber(effectGrowthIdx)
local str = ParseEffectParam(decodeJson(mapCfg.GrowthEffectParam), idx)
str = LanguagePost(lang, langIdx, str)
return str
end
local effectTotalIdx = string.match(token, "^{TotalEffectParam_(%d+)}$")
if effectTotalIdx then
local idx = tonumber(effectTotalIdx)
local str = ParseTotalEffectParam(decodeJson(mapCfg.EffectParam), decodeJson(mapCfg.GrowthEffectParam), idx)
str = LanguagePost(lang, langIdx, str)
return str
end
return token
end)
return result
end
function PenguinCardUtils.WeightedRandom(tbId, tbWeight, n, tbExcludeGroupId, bDuplicate)
if #tbId ~= #tbWeight then
printError("tbId 和 tbWeight 长度必须相同")
end
tbExcludeGroupId = tbExcludeGroupId or {}
local tbExcludeSet = {}
for _, v in ipairs(tbExcludeGroupId) do
tbExcludeSet[v] = true
end
local tbCandidates = {}
for i = 1, #tbId do
local id = tbId[i]
local w = tbWeight[i]
if next(tbExcludeSet) == nil then
table.insert(tbCandidates, {id = id, weight = w})
else
local mapCfg = ConfigTable.GetData("PenguinCard", id)
if mapCfg and not tbExcludeSet[mapCfg.GroupId] then
table.insert(tbCandidates, {id = id, weight = w})
end
end
end
if #tbCandidates == 0 then
return {}
end
local result = {}
if bDuplicate then
local totalWeight = 0
for _, item in ipairs(tbCandidates) do
totalWeight = totalWeight + item.weight
end
for _ = 1, n do
local r = math.random() * totalWeight
local cum = 0
for _, item in ipairs(tbCandidates) do
cum = cum + item.weight
if r < cum then
table.insert(result, item.id)
break
end
end
end
else
local actualN = math.min(n, #tbCandidates)
for _ = 1, actualN do
local totalWeight = 0
for _, item in ipairs(tbCandidates) do
totalWeight = totalWeight + item.weight
end
if totalWeight <= 0 then
break
end
local r = math.random() * totalWeight
local cum = 0
for i, item in ipairs(tbCandidates) do
cum = cum + item.weight
if r < cum then
table.insert(result, item.id)
table.remove(tbCandidates, i)
break
end
end
end
end
return result
end
return PenguinCardUtils
+414 -171
View File
@@ -1,16 +1,11 @@
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 GameState = {
Start = 0,
Prepare = 1,
Dealing = 2,
Flip = 3,
Settlement = 4,
Complete = 5
}
local PenguinCardUtils = require("Game.UI.Play_PenguinCard.PenguinCardUtils")
function PenguinLevel:Init(nFloorId, nLevelId, nActId, tbStarScore)
self.nFloorId = nFloorId
self.tbStarScore = tbStarScore or {
@@ -71,6 +66,9 @@ function PenguinLevel:ParseLevelData(nFloorId)
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)
@@ -86,6 +84,19 @@ 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
@@ -103,6 +114,10 @@ function PenguinLevel:ClearLevelData()
end
end
end
if self.tbQuestPool == nil then
self.tbQuestPool = {}
end
self.mapQuest = nil
self.mapLog = {}
self.nTotalRound = 0
self.nBestTurnScore = 0
@@ -118,11 +133,11 @@ function PenguinLevel:StartGame()
self:SwitchGameState()
end
function PenguinLevel:CompleteGame()
local nNextState = GameState.Complete
local nNextState = PenguinCardUtils.GameState.Complete
self:SwitchNextGameState(nNextState, {bManual = true})
end
function PenguinLevel:RestartGame()
local nNextState = GameState.Start
local nNextState = PenguinCardUtils.GameState.Start
local nWaitTime = self:QuitGameState(nNextState)
if nWaitTime == 0 then
self:StartGame()
@@ -141,7 +156,8 @@ function PenguinLevel:QuitGame(callback)
local bOpen = actData:CheckActivityOpen()
if bOpen then
bAct = true
actData:SendActivityPenguinCardSettleReq(self.nLevelId, self.nStar, self.nScore, callback)
local nScore = math.floor(self.nScore + 0.5 + 1.0E-9)
actData:SendActivityPenguinCardSettleReq(self.nLevelId, self.nStar, nScore, callback)
else
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Alert,
@@ -161,57 +177,75 @@ function PenguinLevel:SwitchGameState()
self:SwitchNextGameState(nNextState)
end
function PenguinLevel:RunGameState(mapParam)
if self.nGameState == GameState.Start then
if self.nGameState == PenguinCardUtils.GameState.Start then
self:RunState_Start()
elseif self.nGameState == GameState.Prepare then
elseif self.nGameState == PenguinCardUtils.GameState.Prepare then
self:RunState_Prepare()
elseif self.nGameState == GameState.Dealing then
elseif self.nGameState == PenguinCardUtils.GameState.Dealing then
self:RunState_Dealing()
elseif self.nGameState == GameState.Flip then
elseif self.nGameState == PenguinCardUtils.GameState.Flip then
self:RunState_Flip()
elseif self.nGameState == GameState.Settlement then
elseif self.nGameState == PenguinCardUtils.GameState.Settlement then
self:RunState_Settlement()
elseif self.nGameState == GameState.Complete then
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 == GameState.Start then
if self.nGameState == PenguinCardUtils.GameState.Start then
nWaitTime = self:QuitState_Start()
elseif self.nGameState == GameState.Prepare then
elseif self.nGameState == PenguinCardUtils.GameState.Prepare then
nWaitTime = self:QuitState_Prepare(nNextState)
elseif self.nGameState == GameState.Dealing then
elseif self.nGameState == PenguinCardUtils.GameState.Dealing then
nWaitTime = self:QuitState_Dealing(nNextState)
elseif self.nGameState == GameState.Flip then
elseif self.nGameState == PenguinCardUtils.GameState.Flip then
nWaitTime = self:QuitState_Flip(nNextState)
elseif self.nGameState == GameState.Settlement then
elseif self.nGameState == PenguinCardUtils.GameState.Settlement then
nWaitTime = self:QuitState_Settlement(nNextState)
elseif self.nGameState == GameState.Complete then
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 GameState.Start
elseif self.nGameState == GameState.Start then
return GameState.Prepare
elseif self.nGameState == GameState.Prepare then
return GameState.Dealing
elseif self.nGameState == GameState.Dealing then
return GameState.Flip
elseif self.nGameState == GameState.Flip then
return GameState.Settlement
elseif self.nGameState == GameState.Settlement then
if self.nCurRound >= self.nRoundLimit then
if self.nCurTurn >= self.nMaxTurn then
return GameState.Complete
else
return GameState.Prepare
end
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 GameState.Dealing
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
@@ -230,28 +264,200 @@ function PenguinLevel:SwitchNextGameState(nNextState, mapParam)
end
function PenguinLevel:RunState_Start()
EventManager.Hit("PenguinCard_RunState_Start")
self:SwitchGameState()
end
function PenguinLevel:QuitState_Start()
EventManager.Hit("PenguinCard_QuitState_Start")
return 0
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:FreeRollPenguinCard()
EventManager.Hit("PenguinCard_RunState_Prepare")
end
function PenguinLevel:QuitState_Prepare(nNextState)
self.nUpgradeDiscount = 1
self.nTempAddRound = 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 = {}
@@ -259,15 +465,18 @@ function PenguinLevel:QuitState_Prepare(nNextState)
self.bPreTurnWin = false
EventManager.Hit("PenguinCard_QuitState_Prepare", nNextState)
local nWaitTime = 0
if nNextState == GameState.Start then
if nNextState == PenguinCardUtils.GameState.Start then
nWaitTime = 0.6
elseif nNextState == GameState.Dealing then
elseif nNextState == PenguinCardUtils.GameState.Dealing then
nWaitTime = 0.45
elseif nNextState == GameState.Complete then
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, {
@@ -277,7 +486,7 @@ function PenguinLevel:AddRound()
})
return
end
local nCost = self.tbRoundUpgradeCost[self.nRoundLimit + 1]
local nCost = self.tbRoundUpgradeCost[self.nRoundLimit + 1] * self.nUpgradeDiscount
if nCost > self.nScore then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
@@ -293,6 +502,7 @@ function PenguinLevel:AddRound()
sSound = "Mode_Card_buy",
sContent = orderedFormat(ConfigTable.GetUIText("PenguinCard_AddRoundSuccess"), self.nRoundLimit)
})
self:AfterUpgrade(nCost)
EventManager.Hit("PenguinCard_AddRound")
end
function PenguinLevel:AddSlot()
@@ -304,7 +514,7 @@ function PenguinLevel:AddSlot()
})
return
end
local nCost = self.tbSlotUpgradeCost[self.nSlotCount + 1]
local nCost = self.tbSlotUpgradeCost[self.nSlotCount + 1] * self.nUpgradeDiscount
if nCost > self.nScore then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
@@ -320,6 +530,7 @@ function PenguinLevel:AddSlot()
sSound = "Mode_Card_buy",
sContent = orderedFormat(ConfigTable.GetUIText("PenguinCard_AddSlotSuccess"), self.nSlotCount)
})
self:AfterUpgrade(nCost)
EventManager.Hit("PenguinCard_AddSlot")
end
function PenguinLevel:AddRoll()
@@ -331,7 +542,7 @@ function PenguinLevel:AddRoll()
})
return
end
local nCost = self.tbBuyLimitUpgradeCost[self.nBuyLimit + 1]
local nCost = self.tbBuyLimitUpgradeCost[self.nBuyLimit + 1] * self.nUpgradeDiscount
if nCost > self.nScore then
EventManager.Hit(EventId.OpenMessageBox, {
nType = AllEnum.MessageBox.Tips,
@@ -347,8 +558,14 @@ function PenguinLevel:AddRoll()
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
@@ -418,11 +635,21 @@ function PenguinLevel:SelectPenguinCard(nIndex)
self.tbPenguinCard[nAimIndex] = mapCard
end
self.tbPenguinCard[nAimIndex]:SetSlotIndex(nAimIndex)
self.tbPenguinCard[nAimIndex]:ResetGameTrigger()
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
@@ -448,6 +675,7 @@ function PenguinLevel:SalePenguinCard(nIndex)
local nGroupId = mapCard.nGroupId
self:RecyclePenguinCard(mapCard)
self.tbPenguinCard[nIndex] = 0
self:AfterChangePenguinCard()
EventManager.Hit("PenguinCard_SalePenguinCard", nIndex, nGroupId)
end
function PenguinLevel:GetRollPenguinCardCost()
@@ -487,7 +715,7 @@ function PenguinLevel:GetRollPenguinCardResult()
return {}
end
local tbMaxGroupId = self:GetMaxLevelPenguinCard()
local tbId = self:WeightedRandom(mapWeightCfg.CardList, mapWeightCfg.Weight, 3, tbMaxGroupId)
local tbId = PenguinCardUtils.WeightedRandom(mapWeightCfg.CardList, mapWeightCfg.Weight, 3, tbMaxGroupId)
return tbId
end
function PenguinLevel:GetMaxLevelPenguinCard()
@@ -524,13 +752,16 @@ function PenguinLevel:RunState_Dealing()
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:TriggerPenguinCard(GameEnum.PenguinCardTriggerPhase.Dealing)
self.tbBaseCardId = self:WeightedRandom(self.mapCalBaseCardPool.tbId, self.mapCalBaseCardPool.tbWeight, self.nBaseCardCount, {}, true)
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)
@@ -548,15 +779,21 @@ end
function PenguinLevel:QuitState_Dealing(nNextState)
EventManager.Hit("PenguinCard_QuitState_Dealing", nNextState)
local nWaitTime = 0
if nNextState == GameState.Start then
if nNextState == PenguinCardUtils.GameState.Start then
nWaitTime = 0.6
elseif nNextState == GameState.Flip then
elseif nNextState == PenguinCardUtils.GameState.Flip then
nWaitTime = 0.85
elseif nNextState == GameState.Complete then
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()
@@ -565,11 +802,11 @@ function PenguinLevel:QuitState_Flip(nNextState)
self:StopAuto()
EventManager.Hit("PenguinCard_QuitState_Flip", nNextState)
local nWaitTime = 0
if nNextState == GameState.Start then
if nNextState == PenguinCardUtils.GameState.Start then
nWaitTime = 0.6
elseif nNextState == GameState.Settlement then
elseif nNextState == PenguinCardUtils.GameState.Settlement then
nWaitTime = 1
elseif nNextState == GameState.Complete then
elseif nNextState == PenguinCardUtils.GameState.Complete then
nWaitTime = 0.6
end
return nWaitTime
@@ -599,12 +836,27 @@ function PenguinLevel:ShowBaseCard(nIndex)
if 0 < mapCfg.SuitCount2 then
SuitCount[mapCfg.Suit2] = mapCfg.SuitCount2
end
self:TriggerPenguinCard(GameEnum.PenguinCardTriggerPhase.Flip, {
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
@@ -648,7 +900,17 @@ function PenguinLevel:CheckHandRank()
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
@@ -659,12 +921,17 @@ function PenguinLevel:ChangeRoundScore(nAddValue, nAddRatio, nAddMultiRatio, bFr
local nBeforeMultiRatio = self.nRoundMultiRatio
local nBeforeRatio = self.nRoundRatio
self.nRoundValue = self.nRoundValue + nAddValue
self.nRoundMultiRatio = self.nRoundMultiRatio + nAddMultiRatio
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 * 10 + 0.5 + 1.0E-9) / 10
nAfterAllRatio = math.floor(nAfterAllRatio * 10 + 0.5 + 1.0E-9) / 10
nBeforeAllRatio = math.floor(nBeforeAllRatio * 100 + 0.5 + 1.0E-9) / 100
nAfterAllRatio = math.floor(nAfterAllRatio * 100 + 0.5 + 1.0E-9) / 100
self.nRoundScore = self.nRoundValue * nAfterAllRatio
local nAddScore = self.nRoundScore - nBeforeScore
self.nTurnScore = self.nTurnScore + nAddScore
@@ -690,6 +957,20 @@ function PenguinLevel:GetShowedCardCount()
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
@@ -706,9 +987,11 @@ function PenguinLevel:RunState_Settlement()
end
self.mapSuitHistory[v] = self.mapSuitHistory[v] + 1
end
self:TriggerPenguinCard(GameEnum.PenguinCardTriggerPhase.Settlement, {
self:TriggerEffect(GameEnum.PenguinCardTriggerPhase.Settlement, {
HandRankSuitCount = HandRankSuitCount,
SuitCount = self.mapAllSuit
SuitCount = self.mapAllSuit,
HandRank = self.nHandRankId,
HandRankCount = self.tbHandRankCount
})
self:AddLog()
EventManager.Hit("PenguinCard_RunState_Settlement")
@@ -717,6 +1000,14 @@ 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 = {}
@@ -727,17 +1018,29 @@ function PenguinLevel:QuitState_Settlement(nNextState)
self.mapCalBaseCardPool = {}
EventManager.Hit("PenguinCard_QuitState_Settlement", nNextState)
local nWaitTime = 0
if nNextState == GameState.Start then
if nNextState == PenguinCardUtils.GameState.Start then
nWaitTime = 0.6
elseif nNextState == GameState.Dealing then
elseif nNextState == PenguinCardUtils.GameState.Dealing then
nWaitTime = 0.57
elseif nNextState == GameState.Prepare then
elseif nNextState == PenguinCardUtils.GameState.Prepare then
nWaitTime = 0.57
elseif nNextState == GameState.Complete then
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] = {
@@ -874,7 +1177,7 @@ function PenguinLevel:PlayAuto(bClick)
if not self.bAuto or self.bPause then
return
end
if self.nGameState == GameState.Flip then
if self.nGameState == PenguinCardUtils.GameState.Flip then
self.sequence = DOTween.Sequence()
for j = 1, self.nBaseCardCount do
if self.tbShowedCard[j] == false then
@@ -885,7 +1188,7 @@ function PenguinLevel:PlayAuto(bClick)
end
end
self.sequence:SetUpdate(true)
elseif self.nGameState == GameState.Settlement then
elseif self.nGameState == PenguinCardUtils.GameState.Settlement then
local bKeep = not PlayerData.Guide:CheckGuideFinishById(302)
if EditorSettings and EditorSettings.bJumpGuide then
bKeep = false
@@ -899,7 +1202,7 @@ function PenguinLevel:PlayAuto(bClick)
end
self.sequence:AppendCallback(function()
EventManager.Hit("PenguinCard_QuitScoreAni")
if self.nRoundLimit == self.nCurRound and self.nCurTurn < self.nMaxTurn then
if self:GetRoundLimitInTurn() == self.nCurRound and self.nCurTurn < self.nMaxTurn then
local callback = function()
self:SwitchGameState()
end
@@ -948,7 +1251,7 @@ function PenguinLevel:ChangeScore(nChange)
nStar = i
end
end
if nBeforeStar < 3 and nStar == 3 and self.nGameState == GameState.Settlement then
if nBeforeStar == 0 and nStar == 1 and self.nGameState == PenguinCardUtils.GameState.Settlement then
self.bPreTurnWin = true
end
EventManager.Hit("PenguinCard_ChangeScore", nBefore, nBeforeStar, nStar)
@@ -965,72 +1268,6 @@ function PenguinLevel:GetStar()
end
return nStar
end
function PenguinLevel:WeightedRandom(tbId, tbWeight, n, tbExcludeGroupId, bDuplicate)
if #tbId ~= #tbWeight then
printError("tbId 和 tbWeight 长度必须相同")
end
tbExcludeGroupId = tbExcludeGroupId or {}
local tbExcludeSet = {}
for _, v in ipairs(tbExcludeGroupId) do
tbExcludeSet[v] = true
end
local tbCandidates = {}
for i = 1, #tbId do
local id = tbId[i]
local w = tbWeight[i]
if next(tbExcludeSet) == nil then
table.insert(tbCandidates, {id = id, weight = w})
else
local mapCfg = ConfigTable.GetData("PenguinCard", id)
if mapCfg and not tbExcludeSet[mapCfg.GroupId] then
table.insert(tbCandidates, {id = id, weight = w})
end
end
end
if #tbCandidates == 0 then
return {}
end
local result = {}
if bDuplicate then
local totalWeight = 0
for _, item in ipairs(tbCandidates) do
totalWeight = totalWeight + item.weight
end
for _ = 1, n do
local r = math.random() * totalWeight
local cum = 0
for _, item in ipairs(tbCandidates) do
cum = cum + item.weight
if r < cum then
table.insert(result, item.id)
break
end
end
end
else
local actualN = math.min(n, #tbCandidates)
for _ = 1, actualN do
local totalWeight = 0
for _, item in ipairs(tbCandidates) do
totalWeight = totalWeight + item.weight
end
if totalWeight <= 0 then
break
end
local r = math.random() * totalWeight
local cum = 0
for i, item in ipairs(tbCandidates) do
cum = cum + item.weight
if r < cum then
table.insert(result, item.id)
table.remove(tbCandidates, i)
break
end
end
end
end
return result
end
function PenguinLevel:SetWarning(bAble)
self.bWarning = bAble
end
@@ -1043,41 +1280,47 @@ function PenguinLevel:GetOwnPenguinCardCount()
end
return nCount
end
function PenguinLevel:TriggerPenguinCard(nTriggerPhase, mapTriggerSource)
local callback = function(nEffectType, tbEffectParam)
if nEffectType == GameEnum.PenguinCardEffectType.AddBaseCardWeight then
for k, v in pairs(tbEffectParam) do
local nIndex = table.indexof(self.mapCalBaseCardPool.tbId, tonumber(k))
self.mapCalBaseCardPool.tbWeight[nIndex] = self.mapCalBaseCardPool.tbWeight[nIndex] + v
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.BlockFatalDamage then
self:ChangeHp(-1 * mapTriggerSource.nHpChange)
EventManager.Hit("PenguinCard_BlockFatalDamage")
elseif nEffectType == GameEnum.PenguinCardEffectType.UpgradeRebate then
self:ChangeScore(mapTriggerSource.nUpgradeCost * mapEffectValue / 100)
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
elseif nEffectType == GameEnum.PenguinCardEffectType.ReplaceBaseCard then
local nAfterId = tbEffectParam[1]
local nBeforeId = mapTriggerSource.BaseCard.nId
local nIndex = mapTriggerSource.BaseCard.nIndex
local mapBeforeCfg = ConfigTable.GetData("PenguinBaseCard", nBeforeId)
if mapBeforeCfg then
self.mapAllSuit[mapBeforeCfg.Suit1] = self.mapAllSuit[mapBeforeCfg.Suit1] - mapBeforeCfg.SuitCount1
end
self.tbBaseCardId[nIndex] = nAfterId
local mapAfterCfg = ConfigTable.GetData("PenguinBaseCard", nAfterId)
if mapAfterCfg then
if not self.mapAllSuit[mapAfterCfg.Suit1] then
self.mapAllSuit[mapAfterCfg.Suit1] = 0
end
self.mapAllSuit[mapAfterCfg.Suit1] = self.mapAllSuit[mapAfterCfg.Suit1] + mapAfterCfg.SuitCount1
end
EventManager.Hit("PenguinCard_ReplaceBaseCard", nIndex)
elseif nEffectType == GameEnum.PenguinCardEffectType.IncreaseBasicChips then
self:ChangeRoundScore(tbEffectParam[1], 0, 0)
elseif nEffectType == GameEnum.PenguinCardEffectType.IncreaseMultiplier then
self:ChangeRoundScore(0, tbEffectParam[1], 0)
elseif nEffectType == GameEnum.PenguinCardEffectType.MultiMultiplier then
self:ChangeRoundScore(0, 0, tbEffectParam[1])
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