| Latest revision |
Your text |
| 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 = { | | local accumulated_data = accumulate() |
| ["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 29: |
Line 25: |
| num = value | | num = value |
| else | | else |
| return "Module:SoulUnlock.accumulate() error, invalid value type" | | return "Module:SoulUnlockaccumulate() error, invalid value type" |
| end | | end |
| | | |
|
| | -- Increase the sum |
| -- Start at 0
| | sums[key] = sums[key] + num |
| 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 |
| table.insert(accumulated_data, util_module.deep_copy(sums)) | | accumulated_data[key] = sums |
| end | | end |
| | | |
| return accumulated_data | | 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
| |
| local display_value = value
| |
| --Add 600
| |
| if key == "RequiredSouls" then
| |
| display_value = display_value + 600
| |
| end
| |
| ret = ret .. string.format(" %s:%s, ", p.localize(key), display_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]
| |
| --Add 600
| |
| if soul_unlock_key == "RequiredSouls" then
| |
| return last_value + 600
| |
| else
| |
| return last_value
| |
| end
| |
| 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']
| |
| --Add 600
| |
| local souls_str = '{{Souls|' .. (required_souls + 600) .. '}}'
| |
| 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 |
|
| |
|
| return p | | return p |