Module:Apt
Documentation for this module may be created at Module:Apt/doc
local p = {} local data = mw.loadData('Module:Table of species') local function name_arg(frame) local name = frame.args[1] if not name or name == "" then name = mw.title.getCurrentTitle().text end return name end local function is_colored_draconian(species) return species:match(" Draconian$") end local function is_obsolete(species) return data[species].Obsolete or false end local function is_obsolete_sk(skill) return skill == "Charms" or skill == "Slings" or skill == "Bows" or skill == "Crossbows" or skill == "Stabbing" or skill == "Traps" end local function species_sorted() local species = {} for sp in pairs(data) do if not (is_colored_draconian(sp) or is_obsolete(sp)) then table.insert(species, sp) end end table.sort(species) return species end local function species_sorted_all() local species = {} for sp in pairs(data) do if not is_colored_draconian(sp) then table.insert(species, sp) end end table.sort(species) return species end function p.aptitude(frame) local sp = frame.args[1] local sk = frame.args[2] if not sp or not sk then return "" end return data[sp].Aptitudes[sk] or "N/A" end function p.skill_table(frame) local skill = name_arg(frame) local headers = {} local species = {} if is_obsolete_sk(skill) then species = species_sorted_all() else species = species_sorted() end for _, sp in ipairs(species) do local header = ("'''[[%s|%s]]'''"):format(sp, data[sp].Abbrev) table.insert(headers, header) end local result = [[{| class="wikitable" border="1" |- |]] result = result .. table.concat(headers, "\n|") result = result .. "\n|-\n" for _, sp in ipairs(species) do result = result .. "| " .. (data[sp].Aptitudes[skill] or "N/A") .. "\n" end result = result .. "|}" return result end function p.skill_draconian_exceptions(frame) local skill = name_arg(frame) local normal = data['Draconian'].Aptitudes[skill] local result = '' for name, species in pairs(data) do if is_colored_draconian(name) and (not is_obsolete(name)) and species.Aptitudes[skill] ~= normal then local col = name:match("^%a*") result = result .. '* [[Draconian#' .. col .. '|' .. col .. ' draconian]]s get ' .. species.Aptitudes[skill] .. '.\n' end end return result end function p.skill_average(frame) local skill = name_arg(frame) local count = 0 local sum = 0 for name, sp in pairs(data) do if sp.Aptitudes[skill] and not is_colored_draconian(name) then count = count + 1 sum = sum + sp.Aptitudes[skill] end end return string.format("%.3f", sum / count) end local function aptitude_chart(skills, header) local result = header -- constants used by sort_key local a_ord = string.byte('a') local z_ord = string.byte('z') local aa_ord = string.byte('A') -- generates the table keys local function sort_key(i) local result if i > z_ord - a_ord then i = i - (z_ord - a_ord) - 1 result = '!' .. string.char(aa_ord + i) else result = '"' .. string.char(a_ord + i) end return result end local i = 0 for _, sp in ipairs(species_sorted()) do result = result .. '|<span style="display:none;">' .. sort_key(i) .. '</span>' .. sp .. "\n" for _, sk in ipairs(skills) do result = result .. "||" .. (data[sp].Aptitudes[sk] or "N/A") .. "\n" end result = result .. "|-\n" i = i + 1 end result = result .. "|}" return result end function p.aptitude_chart_general(frame) local skills = {'Armour', 'Dodging', 'Stealth', 'Shields', 'Invocations', 'Evocations', 'Hit Points', 'Magic Points', 'Experience'} local header = [=[ {| class="wikitable sortable" style="font-size:75%" border=1 ! scope="col" | [[Species]] ! scope="col" | [[Armour (skill)|Arm]] ! scope="col" | [[Dodging|Ddg]] ! scope="col" | [[Stealth|Sth]] ! scope="col" | [[Shields (skill)|Shd]] ! scope="col" | [[Invocations|Inv]] ! scope="col" | [[Evocations|Evo]] ! scope="col" | [[HP]] ! scope="col" | [[MP]] ! scope="col" | [[Exp]] |- ]=] return aptitude_chart(skills, header) end function p.aptitude_chart_combat(frame) local skills = {'Fighting', 'Short Blades', 'Long Blades', 'Maces & Flails', 'Axes', 'Polearms', 'Staves', 'Unarmed Combat', 'Throwing', 'Ranged Weapons'} local header = [=[ {| class="wikitable sortable" style="font-size:75%" border=1 ! scope="col" | [[Species]] ! scope="col" | [[Fighting|Fgt]] ! scope="col" | [[Short Blades|SBl]] ! scope="col" | [[Long Blades|LBl]] ! scope="col" | [[Maces & Flails|M&F]] ! scope="col" | [[Axes|Axs]] ! scope="col" | [[Polearms|Pla]] ! scope="col" | [[Staves|Stv]] ! scope="col" | [[Unarmed Combat|UC]] ! scope="col" | [[Throwing|Thr]] ! scope="col" | [[Ranged Weapons|RW]] |- ]=] return aptitude_chart(skills, header) end function p.aptitude_chart_magic(frame) local skills = {'Spellcasting', 'Conjurations', 'Hexes', 'Summonings', 'Necromancy', 'Translocations', 'Transmutations', 'Fire Magic', 'Ice Magic', 'Air Magic', 'Earth Magic', 'Poison Magic'} local header = [=[ {| class="wikitable sortable" style="font-size:75%" border=1 ! scope="col" | [[Species]] ! scope="col" | [[Spellcasting|Spc]] ! scope="col" | [[Conjurations|Coj]] ! scope="col" | [[Hexes|Hex]] ! scope="col" | [[Summonings|Sum]] ! scope="col" | [[Necromancy|Nec]] ! scope="col" | [[Translocations|Trl]] ! scope="col" | [[Transmutations|Trm]] ! scope="col" | [[Fire Magic|Fir]] ! scope="col" | [[Ice Magic|Ice]] ! scope="col" | [[Air Magic|Air]] ! scope="col" | [[Earth Magic|Ear]] ! scope="col" | [[Poison Magic|Poi]] |- ]=] return aptitude_chart(skills, header) end return p