Module:SoulUnlock

From Deadlock Wiki
Jump to navigation Jump to search

Overview[edit source]

Data for what is unlocked at each increment of Souls. Data is stored and loaded from Data:SoulUnlockData.json.

The data is accumulated into another format that is used by the currently written functions.

Functions[edit source]

get_max[edit source]

Retrieve's maximum value for a given key in the accumulated data

Examples[edit source]

{{#invoke:SoulUnlock|get_max|RequiredSouls}} 47000
{{#invoke:SoulUnlock|get_max|PowerIncrease}} 15
{{#invoke:SoulUnlock|get_max|AbilityUnlocks}} 4
{{#invoke:SoulUnlock|get_max|AbilityPoints}} 32

localize[edit source]

Localize a key as its stored to the current language using Module:Lang.

Examples[edit source]

{{#invoke:SoulUnlock|localize|RequiredSouls}} Souls
{{#invoke:SoulUnlock|localize|PowerIncrease}} Power Increases
{{#invoke:SoulUnlock|localize|AbilityUnlocks}} Ability Unlock
{{#invoke:SoulUnlock|localize|AbilityPoints}} Ability Points

write_accumulated[edit source]

Writes the accumulated data to wikitext. Not a format that is ready to be displayed on a wiki page yet. Used for debugging for any lua editors working off of the accumulated data as opposed to the original data.

Note: the keys outputted are localized to english. See the localization map at the top of the Module source.

Example[edit source]

{{#invoke:SoulUnlock|write_accumulated}}
Index1: Souls:0, Ability Unlock:1,
Index2: Souls:400, Ability Unlock:2, Ability Points:1,
Index3: Souls:800, Ability Unlock:2, Ability Points:2,
Index4: Ability Unlock:2, Power Increases:1, Souls:1200, Ability Points:2,
Index5: Ability Unlock:3, Power Increases:1, Souls:1500, Ability Points:2,
Index6: Ability Unlock:3, Power Increases:2, Souls:2200, Ability Points:3,
Index7: Ability Unlock:4, Power Increases:2, Souls:3000, Ability Points:3,
Index8: Ability Unlock:4, Power Increases:2, Souls:3500, Ability Points:4,
Index9: Ability Unlock:4, Power Increases:3, Souls:4500, Ability Points:5,
Index10: Ability Unlock:4, Power Increases:3, Souls:5200, Ability Points:6,
Index11: Ability Unlock:4, Power Increases:4, Souls:6000, Ability Points:7,
Index12: Ability Unlock:4, Power Increases:5, Souls:7500, Ability Points:8,
Index13: Ability Unlock:4, Power Increases:5, Souls:8000, Ability Points:9,
Index14: Ability Unlock:4, Power Increases:6, Souls:9000, Ability Points:10,
Index15: Ability Unlock:4, Power Increases:6, Souls:9700, Ability Points:11,
Index16: Ability Unlock:4, Power Increases:7, Souls:10500, Ability Points:12,
Index17: Ability Unlock:4, Power Increases:8, Souls:11500, Ability Points:13,
Index18: Ability Unlock:4, Power Increases:9, Souls:12500, Ability Points:14,
Index19: Ability Unlock:4, Power Increases:10, Souls:14000, Ability Points:15,
Index20: Ability Unlock:4, Power Increases:11, Souls:15000, Ability Points:15,
Index21: Ability Unlock:4, Power Increases:12, Souls:16000, Ability Points:16,
Index22: Ability Unlock:4, Power Increases:13, Souls:17000, Ability Points:17,
Index23: Ability Unlock:4, Power Increases:14, Souls:18000, Ability Points:18,
Index24: Ability Unlock:4, Power Increases:15, Souls:19000, Ability Points:19,
Index25: Ability Unlock:4, Power Increases:15, Souls:21500, Ability Points:20,
Index26: Ability Unlock:4, Power Increases:15, Souls:23500, Ability Points:21,
Index27: Ability Unlock:4, Power Increases:15, Souls:25500, Ability Points:22,
Index28: Ability Unlock:4, Power Increases:15, Souls:27500, Ability Points:23,
Index29: Ability Unlock:4, Power Increases:15, Souls:30000, Ability Points:24,
Index30: Ability Unlock:4, Power Increases:15, Souls:33000, Ability Points:25,
Index31: Ability Unlock:4, Power Increases:15, Souls:35000, Ability Points:26,
Index32: Ability Unlock:4, Power Increases:15, Souls:37000, Ability Points:27,
Index33: Ability Unlock:4, Power Increases:15, Souls:39000, Ability Points:28,
Index34: Ability Unlock:4, Power Increases:15, Souls:41000, Ability Points:29,
Index35: Ability Unlock:4, Power Increases:15, Souls:43000, Ability Points:30,
Index36: Ability Unlock:4, Power Increases:15, Souls:45000, Ability Points:31,
Index37: Ability Unlock:4, Power Increases:15, Souls:47000, Ability Points:32,

write_table[edit source]

Example[edit source]

IndividualAccumulative
SoulsPower IncreasesAbility UnlockAbility PointsPower IncreasesAbility UnlockAbility Points
{{Souls|0}}{{Tick}}1
{{Souls|400}}{{Tick}}{{Tick}}21
{{Souls|800}}{{Tick}}22
{{Souls|1200}}{{Tick}}122
{{Souls|1500}}{{Tick}}132
{{Souls|2200}}{{Tick}}{{Tick}}233
{{Souls|3000}}{{Tick}}243
{{Souls|3500}}{{Tick}}244
{{Souls|4500}}{{Tick}}{{Tick}}345
{{Souls|5200}}{{Tick}}346
{{Souls|6000}}{{Tick}}{{Tick}}447
{{Souls|7500}}{{Tick}}{{Tick}}548
{{Souls|8000}}{{Tick}}549
{{Souls|9000}}{{Tick}}{{Tick}}6410
{{Souls|9700}}{{Tick}}6411
{{Souls|10500}}{{Tick}}{{Tick}}7412
{{Souls|11500}}{{Tick}}{{Tick}}8413
{{Souls|12500}}{{Tick}}{{Tick}}9414
{{Souls|14000}}{{Tick}}{{Tick}}10415
{{Souls|15000}}{{Tick}}11415
{{Souls|16000}}{{Tick}}{{Tick}}12416
{{Souls|17000}}{{Tick}}{{Tick}}13417
{{Souls|18000}}{{Tick}}{{Tick}}14418
{{Souls|19000}}{{Tick}}{{Tick}}15419
{{Souls|21500}}{{Tick}}15420
{{Souls|23500}}{{Tick}}15421
{{Souls|25500}}{{Tick}}15422
{{Souls|27500}}{{Tick}}15423
{{Souls|30000}}{{Tick}}15424
{{Souls|33000}}{{Tick}}15425
{{Souls|35000}}{{Tick}}15426
{{Souls|37000}}{{Tick}}15427
{{Souls|39000}}{{Tick}}15428
{{Souls|41000}}{{Tick}}15429
{{Souls|43000}}{{Tick}}15430
{{Souls|45000}}{{Tick}}15431
{{Souls|47000}}{{Tick}}15432
IndividualAccumulative
SoulsPower IncreasesAbility UnlockAbility PointsPower IncreasesAbility UnlockAbility Points
Souls0Yes1
Souls400YesYes21
Souls800Yes22
Souls1200Yes122
Souls1500Yes132
Souls2200YesYes233
Souls3000Yes243
Souls3500Yes244
Souls4500YesYes345
Souls5200Yes346
Souls6000YesYes447
Souls7500YesYes548
Souls8000Yes549
Souls9000YesYes6410
Souls9700Yes6411
Souls10500YesYes7412
Souls11500YesYes8413
Souls12500YesYes9414
Souls14000YesYes10415
Souls15000Yes11415
Souls16000YesYes12416
Souls17000YesYes13417
Souls18000YesYes14418
Souls19000YesYes15419
Souls21500Yes15420
Souls23500Yes15421
Souls25500Yes15422
Souls27500Yes15423
Souls30000Yes15424
Souls33000Yes15425
Souls35000Yes15426
Souls37000Yes15427
Souls39000Yes15428
Souls41000Yes15429
Souls43000Yes15430
Souls45000Yes15431
Souls47000Yes15432

local p = {}
local util_module = require('Module:Utilities')
local dictionary_module = require('Module:Dictionary')
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
local function accumulate() 
	local accumulated_data = {} --holds the sum at each gold count
	local sums = {} --holds only the current sums
	
	for i, su_data in ipairs(soul_unlocks_data) do
		for key, value in pairs(su_data) do
			-- Determine how many to increase sum by
			local num
			if type(value) == 'boolean' then 
				if value == true then
					num = 1
				else
					num = 0
				end
			elseif type(value) == 'number' then 
				num = value 
			else
				return "Module:SoulUnlock.accumulate() error, invalid value type"
			end
			
			
			-- 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
		
		-- Add the current sum to accumulated_data
		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

return p