From Dark and Darker Wiki

m (revert previous attempts)
Tag: Manual revert
(Updating column strings.)
 
(32 intermediate revisions by 2 users not shown)
Line 29: Line 29:
end
end


function p.draw_table(base_or_gem)
function p.draw_roll_range_table(base_or_gem)
-- Handle based on how it was called
-- Handle based on how it was called
if type(base_or_gem) == "table" and base_or_gem.args then -- if called via wikitext instead of lua
if type(base_or_gem) == "table" and base_or_gem.args then -- if called via wikitext instead of lua
Line 41: Line 41:
local slot_headers = '<th rowspan="2" colspan="2">Enchantments</th>'
local slot_headers = '<th rowspan="2" colspan="2">Enchantments</th>'
local min_max_headers = ''
local min_max_headers = ''
-- Add required gem col header
if base_or_gem == 'gem' then
slot_headers = slot_headers .. '<th rowspan="2">Required Gem</th>'
end


-- Create enchant_name_headers (row1) and min/max (row2)
-- Create enchant_name_headers (row1) and min/max (row2)
Line 66: Line 71:
for i, enchant_name in ipairs(enchants_in_group) do
for i, enchant_name in ipairs(enchants_in_group) do
-- Get that enchant's data
-- Get that enchant's data
local slots_data = enchantments_data["enchant_rolls"][enchant_name]
local slots_data = enchantments_data["enchant_rolls"][enchant_name]["slots"]
if slots_data == nil then return "Error: " .. enchant_name .. " not found in \"enchant_rolls\"" end
if slots_data == nil then return "Error: " .. enchant_name .. " not found in \"enchant_rolls\"" end
Line 88: Line 93:
--Max Total Possible = MAX(1H Shield + 1H Weapon, 2 * 1H Weapon, 2H Physical, 2H Magical, 2H Hybrid) + Head + Chest + Legs + Hands + Foot + Cloak + Necklace) + 2*Ring
--Max Total Possible = MAX(1H Shield + 1H Weapon, 2 * 1H Weapon, 2H Physical, 2H Magical, 2H Hybrid) + Head + Chest + Legs + Hands + Foot + Cloak + Necklace) + 2*Ring
local weapons = math.max(
local weapons = math.max(
p.get_roll(slots_data, "Onehand_Weapon", base_or_gem) + p.get_roll(slots_data, "Onehand_Shield", base_or_gem),
p.get_roll(slots_data, "1H", base_or_gem) + p.get_roll(slots_data, "1H Shield", base_or_gem),
p.get_roll(slots_data, "Onehand_Weapon", base_or_gem)*2,
p.get_roll(slots_data, "1H", base_or_gem)*2,
p.get_roll(slots_data, "Twohand_PhysicalWeapon", base_or_gem),
p.get_roll(slots_data, "2H Shield", base_or_gem),
p.get_roll(slots_data, "Twohand_Shield", base_or_gem),
p.get_roll(slots_data, "2H Physical", base_or_gem),
p.get_roll(slots_data, "Twohand_HybridWeapon", base_or_gem),
p.get_roll(slots_data, "2H Hybrid", base_or_gem),
p.get_roll(slots_data, "Twohand_MagicOnly", base_or_gem)
p.get_roll(slots_data, "2H Magical", base_or_gem)
)
)
Line 107: Line 112:
)
)
local max_total_possible = weapons + armor
local max_total_possible = weapons + armor
-- Get the required gem
local required_gem_td = ''
if base_or_gem == 'gem' then
required_gem = enchantments_data["enchant_rolls"][enchant_name]["required_gem"]
if required_gem == nil then
required_gem = ""
else
required_gem = "<div class=\"iconbox\" style=\"margin:0px;\"><div class=\"rounded relative\">[[File:" .. required_gem .. ".png|x35px|link=" .. required_gem .. "]]</div></div>"
end
required_gem_td = '<td id="gem" style=\"padding:0px;\">' .. required_gem .. '</td>'
end
-- Add cells to row
-- Add cells to row
local rowspanned_cell = ''
local rowspanned_cell = ''
local row_id = ' id="' .. utils.dash_for_space(enchant_group_name) .. '"'
if is_first then
if is_first then
rowspan = ' rowspan="' .. num_enchants_in_group .. '"'
rowspan = ' rowspan="' .. num_enchants_in_group+1 .. '"'
rowspanned_cell = '<td' .. rowspan .. '>' .. enchant_group_name .. "</td>"
rowspanned_cell = '<td' .. rowspan .. '>' .. enchant_group_name .. '</td></tr><tr' .. row_id .. '>'
end
end
enchant_row = '' .. rowspanned_cell            
enchant_row = '' .. rowspanned_cell
enchant_row = enchant_row .. "<td>" .. enchant_name .. "</td>"
enchant_row = enchant_row .. "<td>" .. enchant_name .. "</td>"
enchant_row = enchant_row .. required_gem_td
enchant_row = enchant_row .. min_max_cols
enchant_row = enchant_row .. min_max_cols
enchant_row = enchant_row .. "<td>" .. max_total_possible .. "</td>"
enchant_row = enchant_row .. "<td>" .. max_total_possible .. "</td>"
enchant_rows = enchant_rows .. '<tr id="' .. utils.dash_for_space(enchant_group_name) .. '">' .. enchant_row .. "</tr>"
enchant_rows = enchant_rows .. '<tr' .. row_id .. '>' .. enchant_row .. "</tr>"
is_first = false
is_first = false
Line 132: Line 151:
local table_str = '<table class="enchantmenttable">' .. slot_headers .. min_max_headers .. enchant_rows .. "</table>"
local table_str = '<table class="enchantmenttable">' .. slot_headers .. min_max_headers .. enchant_rows .. "</table>"
return table_str
return table_str
end
function p.draw_socket_cost_table(frame)
local output_str = ""
local data_rows = ""
local header_row = "<tr>" .. "<th>Rarity</td>" .. "<th>Cost</th>" .. "</tr>"
local row
local i = 1 --display rarity_nums starting at i=1 (Poor), skipping Junk
local ending_i = 7 --end with Unique=7
-- this is O(n^2), but since theres only 8 elements, its inconsequential
-- Iterate costs in data first
local rarity_num
while i <= ending_i do
for rarity_name, cost in pairs(enchantments_data["enchant_costs"]) do
-- Determine the rarity_num
rarity_num = utils.rarity_name_to_num(rarity_name)
if i == rarity_num then
-- This is the next rarity that should be displayed
row = "<td>" .. "<span class=\"colorrarity" .. i .. "\">" .. rarity_name .. "</span>" .. "</td>" .. "<td>" .. cost .. "</td>"
data_rows = data_rows .. "<tr>" ..  row .. "</tr>"
i = i+1 -- look for the next rarity
break -- end the current rarity-search
end
end
end
return "<table class=\"wikitable\" style=\"border-collapse:collapse;\">" .. header_row .. data_rows .. "</table>"
end
end


return p
return p

Latest revision as of 21:44, 3 March 2025

Overview

Functions for Enchantments. Data comes from Data:Enchantments.json.

Functions

draw_roll_range_table

Create's a table of enchants for the Enchantments page

Parameters

  • base_or_gem - List 'base' (traditional) or 'gem' enchant roll ranges?

Examples

{{#invoke:Enchantments|draw_roll_range_table|gem}}


EnchantmentsRequired Gem1H1H Shield2H Shield2H Physical2H Hybrid2H MagicalChestLegsFootHeadHandsCloakNecklaceRingMax Total Possible
MinMaxMinMaxMinMaxMinMaxMinMaxMinMaxMinMaxMinMaxMinMaxMinMaxMinMaxMinMaxMinMaxMinMax
Attributes
All Attributes0
Strength
Diamond.png
121212121210
Vigor
Diamond.png
121212121210
Agility
Diamond.png
121212121210
Dexterity
Diamond.png
121212121210
Will
Diamond.png
121212121210
Knowledge
Diamond.png
121212121210
Resourcefulness
Diamond.png
121212121210
Physical Damage
Physical Power Bonus
Ruby.png
11.811.822.722.722.722.711.811.811.814.4
Physical Power
Ruby.png
112121212111112114
Physical Gear Weapon Damage
Ruby.png
11112
Physical Damage Add
Ruby.png
11115
True Physical Damage
Ruby.png
11115
Armor Penetration
Ruby.png
2.5346.546.522.522.52.532.5311.821.1
Magical Damage
Magical Power Bonus
Ruby.png
11.822.722.722.722.711.811.811.814.4
Magical Power
Blue Sapphire.png
112121212111112114
Magical Damage Add
Blue Sapphire.png
11115
True Magical Damage
Blue Sapphire.png
11115
Magical Penetration0
Reductions
Armor Rating Add
Emerald.png
10122025585834343434583473
Physical Damage Reduction
Emerald.png
22.544.51.51.81.51.811.211.211.211.21.51.811.217.1
Projectile Damage Reduction
Emerald.png
22.544.51.51.81.51.811.211.211.211.21.51.811.217.1
Magical Damage Reduction
Blue Sapphire.png
22.544.51.51.81.51.811.211.211.211.21.51.811.217.1
Magical Resistance
Blue Sapphire.png
10122025585834343434583473
Actions
Action Speed
Blue Sapphire.png
11.211.21.51.81.51.81.51.81.51.81.51.811.211.21.51.81.51.811.214.4
Spell Casting Speed
Blue Sapphire.png
1.51.81.51.811.211.21.51.81.51.811.212
Move Speed Add
Blue Sapphire.png
344
Move Speed Bonus
Blue Sapphire.png
11.21.2
Health
Max Health Add
Emerald.png
121234343434343412121212341228
Max Health Bonus
Emerald.png
11.211.21.52.51.52.51.52.51.52.51.51.81.51.811.211.211.211.21.51.811.215.1
Healing
Outgoing Physical Healing Add
Emerald.png
121216
Outgoing Magical Healing Add
Emerald.png
111212121218
Statuses
Buff Duration Bonus
Emerald.png
34.534.559595959595934.534.534.534.55934.563
Debuff Duration Bonus
Emerald.png
12.512.524.524.524.524.524.524.512.512.512.512.524.512.533.5
Memory
Memory Capacity Add
Emerald.png
1111212111112114
Memory Capacity Bonus
Emerald.png
24.55959595924.524.524.524.55924.563
Misc
Luck
Blue Sapphire.png
2545254515221522152225451522245

draw_socket_cost_table

Create's a table of socket's cost per rarity for the Enchantments page

Parameters

none

Examples

{{#invoke:Enchantments|draw_socket_cost_table}}


RarityCost
Poor10
Common20
Uncommon30
Rare50
Epic100
Legend150
Unique200

local enchantments_data = mw.loadJsonData("Data:Enchantments.json")
local utils = require("Module:Utilities")
local p = {}

function p.get_roll(slots_data, slot_name, base_or_gem, min_or_max, if_not_exist)
	if min_or_max ~= "min" and min_or_max ~= "max" then
		min_or_max = "max"
	end
	
	if if_not_exist == nil then
		if_not_exist = 0
	end
	
	slot_data = slots_data[slot_name]
	if slot_data == nil then
		return if_not_exist
	end
	roll_data = slot_data[base_or_gem]
	if roll_data == nil then
		return if_not_exist
	end
	
	roll = roll_data[min_or_max]
	if roll == nil then
		return if_not_exist
	end
	
	return roll
end

function p.draw_roll_range_table(base_or_gem)
	-- Handle based on how it was called
	if type(base_or_gem) == "table" and base_or_gem.args then -- if called via wikitext instead of lua
        local frame = base_or_gem
        base_or_gem = frame.args[1]
	end
	
	-- Validate
	if base_or_gem ~= "base" and base_or_gem ~= "gem" then return "1st parameter 'base_or_gem' must be either 'base' or 'gem'." end
	
	local slot_headers = '<th rowspan="2" colspan="2">Enchantments</th>'
	local min_max_headers = ''
	
	-- Add required gem col header
	if base_or_gem == 'gem' then
		slot_headers = slot_headers .. '<th rowspan="2">Required Gem</th>'
	end

	-- Create enchant_name_headers (row1) and min/max (row2)
	-- Iterate enchant groups
	for i, slot_name in ipairs(enchantments_data["slottype_order"]) do
		slot_headers = slot_headers .. '<th colspan="2">' .. slot_name .. '</th>'
		min_max_headers = min_max_headers .. '<th>Min</th>' .. '<th>Max</th>'
	end
	
	-- Add body rows
	local enchant_rows = ""
	local enchant_row
	for i, enchant_group_name in ipairs(enchantments_data["enchant_group_order"]) do
		local enchants_in_group = enchantments_data["enchant_order"][enchant_group_name]
		if enchants_in_group == nil then return "Error: " .. enchant_group_name .. " not found in \"enchant_order\"" end
		
		-- Iterate enchants in the group
		-- First just determine how many enchants are in the group to get the proper rowspan
		local num_enchants_in_group = 0
		for i, enchant_name in ipairs(enchants_in_group) do
			num_enchants_in_group = num_enchants_in_group + 1
		end
		
		local is_first = true
		for i, enchant_name in ipairs(enchants_in_group) do
			-- Get that enchant's data
			local slots_data = enchantments_data["enchant_rolls"][enchant_name]["slots"]
			if slots_data == nil then return "Error: " .. enchant_name .. " not found in \"enchant_rolls\"" end
			
			-- Iterate slottypes
			local min_max_cols = ""
			for i, slot_type in ipairs(enchantments_data["slottype_order"]) do
				-- Get rolls, default to blank if missing
				local min_roll = p.get_roll(slots_data, slot_type, base_or_gem, "min", "")
				local max_roll = p.get_roll(slots_data, slot_type, base_or_gem, "max", "")
				if min_roll == 0 then min_roll = "" end
				if max_roll == 0 then max_roll = "" end
				
				if min_roll == max_roll then
					min_max_cols = min_max_cols .. "<td colspan=\"2\">" .. min_roll .. "</td>"
				else
					min_max_cols = min_max_cols .. "<td>" .. min_roll .. "</td><td>" .. max_roll .. "</td>"
				end
			end
			
			-- Calc max
			--Max Total Possible = MAX(1H Shield + 1H Weapon, 2 * 1H Weapon, 2H Physical, 2H Magical, 2H Hybrid) + Head + Chest + Legs + Hands + Foot + Cloak + Necklace) + 2*Ring
			local weapons = math.max(
				p.get_roll(slots_data, "1H", base_or_gem) + p.get_roll(slots_data, "1H Shield", base_or_gem),
				p.get_roll(slots_data, "1H", base_or_gem)*2,
				p.get_roll(slots_data, "2H Shield", base_or_gem),
				p.get_roll(slots_data, "2H Physical", base_or_gem),
				p.get_roll(slots_data, "2H Hybrid", base_or_gem),
				p.get_roll(slots_data, "2H Magical", base_or_gem)
				)
			
			local armor = (
				p.get_roll(slots_data, "Head", base_or_gem) +
				p.get_roll(slots_data, "Chest", base_or_gem) + 
				p.get_roll(slots_data, "Legs", base_or_gem) + 
				p.get_roll(slots_data, "Hands", base_or_gem) + 
				p.get_roll(slots_data, "Foot", base_or_gem) + 
				p.get_roll(slots_data, "Cloak", base_or_gem) + 
				p.get_roll(slots_data, "Necklace", base_or_gem) + 
				p.get_roll(slots_data, "Ring", base_or_gem)*2 
				)
			local max_total_possible = weapons + armor
			
			-- Get the required gem
			local required_gem_td = ''
			if base_or_gem == 'gem' then
				required_gem = enchantments_data["enchant_rolls"][enchant_name]["required_gem"]
				if required_gem == nil then
					required_gem = ""
				else
					required_gem = "<div class=\"iconbox\" style=\"margin:0px;\"><div class=\"rounded relative\">[[File:" .. required_gem .. ".png|x35px|link=" .. required_gem .. "]]</div></div>"
				end
				required_gem_td = '<td id="gem" style=\"padding:0px;\">' .. required_gem .. '</td>'
			end
			
			-- Add cells to row
			local rowspanned_cell = ''
			local row_id = ' id="' .. utils.dash_for_space(enchant_group_name) .. '"'
			if is_first then
				rowspan = ' rowspan="' .. num_enchants_in_group+1 .. '"'
				rowspanned_cell = '<td' .. rowspan .. '>' .. enchant_group_name .. '</td></tr><tr' .. row_id .. '>'
			end
			enchant_row = '' .. rowspanned_cell
			enchant_row = enchant_row .. "<td>" .. enchant_name .. "</td>"
			enchant_row = enchant_row .. required_gem_td
			enchant_row = enchant_row .. min_max_cols
			enchant_row = enchant_row .. "<td>" .. max_total_possible .. "</td>"
			
			enchant_rows = enchant_rows .. '<tr' .. row_id .. '>' .. enchant_row .. "</tr>"
			
			is_first = false
		end
	end
	
	
	
	local slot_headers = '<tr>' .. slot_headers .. '<th rowspan="2">Max Total Possible</th>' .. '</tr>'
	local min_max_headers = '<tr>' .. min_max_headers .. '</tr>'
	
	local table_str = '<table class="enchantmenttable">' .. slot_headers .. min_max_headers .. enchant_rows .. "</table>"
	return table_str
end

function p.draw_socket_cost_table(frame)
	local output_str = ""
	local data_rows = ""
	local header_row = "<tr>" .. "<th>Rarity</td>" .. "<th>Cost</th>" .. "</tr>"
	local row
	local i = 1 --display rarity_nums starting at i=1 (Poor), skipping Junk
	local ending_i = 7 --end with Unique=7
	
	-- this is O(n^2), but since theres only 8 elements, its inconsequential
	-- Iterate costs in data first
	local rarity_num
	while i <= ending_i do
		for rarity_name, cost in pairs(enchantments_data["enchant_costs"]) do
			-- Determine the rarity_num
			rarity_num = utils.rarity_name_to_num(rarity_name)
			
			if i == rarity_num then
				-- This is the next rarity that should be displayed
				row = "<td>" .. "<span class=\"colorrarity" .. i .. "\">" .. rarity_name .. "</span>" .. "</td>" .. "<td>" .. cost .. "</td>" 
				data_rows = data_rows .. "<tr>" ..  row .. "</tr>"
				
				i = i+1 -- look for the next rarity
				break -- end the current rarity-search
			end
		end
	end
	
	return "<table class=\"wikitable\" style=\"border-collapse:collapse;\">" .. header_row .. data_rows .. "</table>"
end

return p