From Dark and Darker Wiki
m (testing merging min and max when they are equal) |
m (add group name as an id to <tr>) |
||
Line 1: | Line 1: | ||
local enchantments_data = mw.loadJsonData("Data:Enchantments.json") | local enchantments_data = mw.loadJsonData("Data:Enchantments.json") | ||
local utils = require("Module:Utilities") | |||
local p = {} | local p = {} | ||
Line 116: | Line 117: | ||
enchant_row = enchant_row .. "<td>" .. max_total_possible .. "</td>" | enchant_row = enchant_row .. "<td>" .. max_total_possible .. "</td>" | ||
enchant_rows = enchant_rows .. | enchant_rows = enchant_rows .. '<tr id="' .. utils.dash_for_space(enchant_group_name) .. '">' .. enchant_row .. "</tr>" | ||
is_first = false | is_first = false |
Revision as of 23:52, 26 February 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}}
Script error: The function "draw_roll_range_table" does not exist.
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}}
Script error: The function "draw_socket_cost_table" does not exist.
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_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 = ''
-- 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]
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 max_roll = "" end
min_max_cols = min_max_cols .. "<td>" .. min_roll .. "</td>"
min_max_cols = min_max_cols .. "<td>" .. max_roll .. "</td>"
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, "Onehand_Weapon", base_or_gem) + p.get_roll(slots_data, "Onehand_Shield", base_or_gem),
p.get_roll(slots_data, "Onehand_Weapon", base_or_gem)*2,
p.get_roll(slots_data, "Twohand_PhysicalWeapon", base_or_gem),
p.get_roll(slots_data, "Twohand_Shield", base_or_gem),
p.get_roll(slots_data, "Twohand_HybridWeapon", base_or_gem),
p.get_roll(slots_data, "Twohand_MagicOnly", 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
-- Add cells to row
local rowspanned_cell = ''
if is_first then
rowspan = ' rowspan="' .. num_enchants_in_group .. '"'
rowspanned_cell = '<td' .. rowspan .. '>' .. enchant_group_name .. "</td>"
end
enchant_row = '' .. rowspanned_cell
enchant_row = enchant_row .. "<td>" .. enchant_name .. "</td>"
enchant_row = enchant_row .. min_max_cols
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>"
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
return p