Toggle menu
505
2.3K
828
21.8K
Deadlock Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:SoulUnlock: Difference between revisions

From Deadlock Wiki
Sur (talk | contribs)
accumulate() initial
 
Sur (talk | contribs)
m translate Individual and Accumulative in write_table
 
(10 intermediate revisions by the same user not shown)
Line 1: Line 1:
local p = {}
local p = {}
local util_module = require('Module:Utilities')
local dictionary_module = require('Module:Dictionary')
local soul_unlocks_data = mw.loadJsonData("Data:SoulUnlockData.json")
local soul_unlocks_data = mw.loadJsonData("Data:SoulUnlockData.json")
local localization_map = {
["RequiredSouls"] = "Citadel_Hero_Stats_Souls",
["AbilityUnlocks"] = "Citadel_Player_Level_AbilityUnlock",
["AbilityPoints"] = "guide_upgrades_killing_guardians_header",
["PowerIncrease"] = "Citadel_Player_Level_PowerIncreases"
}
local lang_module = require('Module:Lang')


-- Accumulate the data from a list of entries of unlocks, AP, and PI's, to a hash with the # of each
-- Accumulate the data from a list of entries of unlocks, AP, and PI's, to a hash with the # of each
local function accumulate()  
local function accumulate()  
local accumulated_data = {} --holds the sum at each gold count
local accumulated_data = {} --holds the sum at each gold count
local sum_req_gold = 0
local sums = {} --holds only the current sums
local sums = {} --holds only the current sums
for i, su_data in ipairs(soul_unlocks_data) do
for i, su_data in ipairs(soul_unlocks_data) do
sum_req_gold = sum_req_gold + su_data["RequiredGold"]
for key, value in pairs(su_data) do
for key, value in pairs(su_data) do
if key == "RequiredGold" then break end
-- Determine how many to increase sum by
-- Determine how many to increase sum by
local num
local num
Line 24: Line 29:
num = value  
num = value  
else
else
return "Module:SoulUnlockaccumulate() error, invalid value type"
return "Module:SoulUnlock.accumulate() error, invalid value type"
end
end
-- Increase the sum
sums[key] = sums[key] + num
-- Start at 0
if sums[key] == nil then sums[key] = 0 end
-- Sum the value, but not for gold because its already summed
if key == 'RequiredSouls' then
sums[key] = num
else
sums[key] = sums[key] + num
end
end
end
-- Add the current sum to accumulated_data
-- Add the current sum to accumulated_data
accumulated_data[key] = sums
table.insert(accumulated_data, util_module.deep_copy(sums))
end
return accumulated_data
end
 
local accumulated_data = accumulate()
 
function p.localize(soul_unlock_key)
-- If called internally (direct Lua call), args will be passed directly.
    -- If called from wikitext, `soul_unlock_key` will be the `frame` object, and we get args from `frame.args`.
 
    -- Handle the case where it's called via #invoke (i.e., from wikitext)
    if type(soul_unlock_key) == "table" and soul_unlock_key.args then
        local frame = soul_unlock_key
        soul_unlock_key = frame.args[1]
    end
localization_key = localization_map[soul_unlock_key]
if localization_key == nil then
return string.format("soul_unlock_key %s not in localization_map", soul_unlock_key)
end
-- Localize, nil for lang override, english string for fallback
return lang_module.get_string(localization_key, nil, 'en')
end
 
function p.write_accumulated()
ret = ""
for i, data in pairs(accumulated_data) do
ret = ret .. "Index" .. i .. ": "
for key, value in pairs(data) do
ret = ret .. string.format("  %s:%s, ", p.localize(key), value)
end
ret = ret .. '<br>'
end
return ret
--return accumulated_data['0']['AbilityUnlocks']
end
 
-- Retrieve a certain stat's value at max souls
function p.get_max(soul_unlock_key)
-- If called internally (direct Lua call), args will be passed directly.
    -- If called from wikitext, `soul_unlock_key` will be the `frame` object, and we get args from `frame.args`.
 
    -- Handle the case where it's called via #invoke (i.e., from wikitext)
    if type(soul_unlock_key) == "table" and soul_unlock_key.args then
        local frame = soul_unlock_key
        soul_unlock_key = frame.args[1]
    end
last_index = #accumulated_data
last_value = accumulated_data[last_index][soul_unlock_key]
return last_value
end
 
function to_tick(bool)
if bool == nil or not bool then
return ''
else
return '{{Tick}}'
end
end
 
function p.write_table(frame)
local debug_mode = frame.args['debug_mode']
if debug_mode == nil then debug_mode = false end
local ret = ''
-- Add header categories
local tr = ''
tr = tr .. '<th>' .. '' .. '</th>'
tr = tr .. '<th colspan="3">' .. dictionary_module.translate('Individual') .. '</th>'
tr = tr .. '<th colspan="3">' .. dictionary_module.translate('Accumulative') .. '</th>'
ret = ret .. '<tr>' .. tr .. '</tr>'
-- Add header record, will be soul + each other record twice
local required_souls_header = '<th>' .. p.localize('RequiredSouls') .. '</th>'
local non_souls_tr = ''
for su_key, lang_key in pairs(localization_map) do
if su_key ~= 'RequiredSouls' then
non_souls_tr = non_souls_tr .. '<th>' .. p.localize(su_key) .. '</th>'
end
end
local tr = '<tr>' .. required_souls_header .. non_souls_tr .. non_souls_tr .. '</tr>'
ret = ret .. tr
-- Add data agg_records
for i, agg_record in ipairs(accumulated_data) do
local tr = ''
-- Retrieve souls agg_record
local required_souls = agg_record['RequiredSouls']
local souls_str = '{{Souls|' .. required_souls .. '}}'
tr = tr .. '<td>' .. souls_str .. '</td>'
-- Retrieve non-aggregate agg_record
local non_agg_record = soul_unlocks_data[i]
for su_key, lang_key in pairs(localization_map) do
if su_key ~= 'RequiredSouls' then
local value = to_tick(non_agg_record[su_key])
td = '<td>' .. value .. '</td>'
tr = tr .. td
end
end
-- Retrieve aggregate agg_record
for su_key, lang_key in pairs(localization_map) do
if su_key ~= 'RequiredSouls' then
local value = agg_record[su_key]
-- Display blank instead of nil if missing
if value == nil then value = '' end
td = '<td>' .. value .. '</td>'
tr = tr .. td
end
end
ret = ret .. '<tr>' .. tr .. '</tr>'
end
ret = '<table class="wikitable defaultcenter" style="text-align:center">' .. ret .. '</table>'
if debug_mode then
return ret
else
return frame:preprocess(ret)
end
end
end
end


return p
return p