Files
Dota-Zombie-Invasion/scripts/vscripts/equipment/roll.lua
T
2026-05-29 15:11:31 +07:00

108 lines
3.6 KiB
Lua

local ____lualib = require("lualib_bundle")
local __TS__ArraySplice = ____lualib.__TS__ArraySplice
local __TS__ArrayMap = ____lualib.__TS__ArrayMap
local Set = ____lualib.Set
local __TS__New = ____lualib.__TS__New
local __TS__ArrayFilter = ____lualib.__TS__ArrayFilter
local ____exports = {}
local ____constants = require("equipment.constants")
local EQUIPMENT_SLOTS = ____constants.EQUIPMENT_SLOTS
local EQUIPMENT_STAT_POOL = ____constants.EQUIPMENT_STAT_POOL
local ____balance = require("equipment.balance")
local getDifficultyBaseRarity = ____balance.getDifficultyBaseRarity
local getRarityBaseStatCount = ____balance.getRarityBaseStatCount
local maybeUpgradeRarityAtDrop = ____balance.maybeUpgradeRarityAtDrop
local function rollSlot(self)
return EQUIPMENT_SLOTS[RandomInt(0, #EQUIPMENT_SLOTS - 1) + 1]
end
local function rollStatValuePct(self, rarity)
repeat
local ____switch4 = rarity
local ____cond4 = ____switch4 == "uncommon"
if ____cond4 then
return RandomInt(1, 5)
end
____cond4 = ____cond4 or ____switch4 == "rare"
if ____cond4 then
return RandomInt(3, 8)
end
____cond4 = ____cond4 or ____switch4 == "epic"
if ____cond4 then
return RandomInt(6, 12)
end
____cond4 = ____cond4 or ____switch4 == "legendary"
if ____cond4 then
return RandomInt(10, 16)
end
do
return RandomInt(1, 5)
end
until true
end
local function pickUniqueStatKeys(self, count)
local pool = {unpack(EQUIPMENT_STAT_POOL)}
local result = {}
local capped = math.max(
1,
math.min(count, #pool)
)
while #result < capped and #pool > 0 do
local idx = RandomInt(0, #pool - 1)
local picked = unpack(__TS__ArraySplice(pool, idx, 1))
result[#result + 1] = picked
end
return result
end
function ____exports.rollInitialStatsByRarity(self, rarity)
local statCount = getRarityBaseStatCount(nil, rarity)
return __TS__ArrayMap(
pickUniqueStatKeys(nil, statCount),
function(____, statKey) return {
statKey = statKey,
valuePct = rollStatValuePct(nil, rarity)
} end
)
end
function ____exports.rollRandomUpgradeDeltaPct(self)
return RandomInt(1, 3)
end
function ____exports.rollAdditionalStatForStageFive(self, existingStats, rarity)
local used = __TS__New(
Set,
__TS__ArrayMap(
existingStats,
function(____, x) return x.statKey end
)
)
local available = __TS__ArrayFilter(
EQUIPMENT_STAT_POOL,
function(____, k) return not used:has(k) end
)
if #available <= 0 then
return nil
end
local picked = available[RandomInt(0, #available - 1) + 1]
return {
statKey = picked,
valuePct = rollStatValuePct(nil, rarity)
}
end
function ____exports.rollPostMatchItem(self, playerId, difficultyKey)
local steamId = PlayerResource:GetSteamAccountID(playerId)
local baseRarity = getDifficultyBaseRarity(nil, difficultyKey)
local rarity = maybeUpgradeRarityAtDrop(nil, baseRarity, difficultyKey)
local slotType = rollSlot(nil)
local now = math.floor(GameRules:GetGameTime() * 1000)
local instanceId = (((tostring(steamId) .. "_") .. tostring(now)) .. "_") .. tostring(RandomInt(1000, 9999))
return {
instanceId = instanceId,
templateId = (("equip_" .. slotType) .. "_") .. rarity,
slotType = slotType,
rarity = rarity,
upgradeStage = 0,
stats = ____exports.rollInitialStatsByRarity(nil, rarity),
createdAt = now
}
end
return ____exports