Files
SL1900 eafd8f4088 Update - 1.9.0.107
EN: 1.9.0.107
CN: 1.9.0.108
JP: 1.9.0.112
KR: 1.9.0.112
2026-05-14 16:00:00 +09:00

335 lines
11 KiB
Lua

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.RollSpecificCard then
local nCardId = tbParam[nIndex]
if nCardId == nil then
return sError
end
local mapCard = ConfigTable.GetData("PenguinCard", nCardId)
if mapCard then
return mapCard.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