Module:Creatures: Difference between revisions
Jump to navigation
Jump to search
TheGmaster (talk | contribs) No edit summary |
TheGmaster (talk | contribs) mNo edit summary |
||
| (481 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
function | function p.singleCreature(frame) | ||
local creatureName = frame.args["name"] | |||
local creatureType = frame.args["type"] | |||
local imageOverride = frame.args["image"] | |||
local section = frame.args["section"] | |||
local namespace = frame.args["namespace"] | |||
local iconImage = "" | |||
local creatureArray = mw.loadData("Module:WildCreatureData") -- Array containing wild creature data from another module | |||
local shipsArray = mw.loadData("Module:ShipCreatureData") | |||
local strangelandsArray = mw.loadData("Module:StrangelandsCreatureData") | |||
local wikiTable = "" | |||
local array | |||
-- Change the array being pulled from if a valid creatureType is provided, also formats the creatureType to be used in Err messages and sets an iconImage | |||
if string.find(string.lower(creatureType), "strangeland") then | |||
array = strangelandsArray | |||
creatureType = " " .. creatureType .. "" | |||
iconImage = "[[File:icon-strangelands.png|right|50px|link=Strangelands#Strangelands_Creatures|Strangeland Creature]]" | |||
elseif string.find(string.lower(creatureType), "ship") then | |||
array = shipsArray | |||
creatureType = " " .. creatureType .. "" | |||
iconImage = "[[File:shipdeed.png|right|30px|link=Ships|Ship Creature]]" | |||
else | |||
array = creatureArray | |||
creatureType = " wild " | |||
end | end | ||
local | |||
local creature = array[creatureName] | |||
table. | |||
if creature then | |||
local formmatedName = string.gsub(string.lower(creatureName), "%s+", "") | |||
local imageName = string.gsub(formmatedName, "%p+", "") .. ".jpg" | |||
if section and section ~= "" then | |||
wikiTable = wikiTable .. "\n== " .. section .. " ==\n" | |||
end | |||
if imageOverride and imageOverride ~= "" then | |||
imageName = imageOverride | |||
elseif mw.title.new(imageName, 'File').exists == false then | |||
imageName = string.gsub(formmatedName, "%p+", "") .. ".png" | |||
if mw.title.new(imageName, 'File').exists == false then | |||
imageName = string.gsub(formmatedName, "%p+", "") .. ".gif" | |||
end | |||
end | |||
-- Automaticly add categories | |||
if namespace == "" or namespace == nil then | |||
wikiTable = wikiTable .. "[[Category:Creatures]]" | |||
wikiTable = wikiTable .. "[[Category:" .. creature.slayer .. " Creatures]]" | |||
if creature.locationtable then | |||
for i, location in ipairs(creature.locationtable) do | |||
wikiTable = wikiTable .. "[[Category:" .. string.gsub(location, "%p+", "") .. "]]" | |||
end | |||
elseif creature.location and creature.location ~= "?" then | |||
wikiTable = wikiTable .. "[[Category:" .. string.gsub(creature.location, "%p+", "") .. "]]" | |||
end | |||
if creature.bosstype ~= "" and creature.bosstype ~= "Boss Summon" then | |||
if creature.bosstype ~= "Undermountain Boss" then | |||
wikiTable = wikiTable .. "[[Category:" .. creature.bosstype .. "es]]" | |||
end | |||
wikiTable = wikiTable .. "[[Category:Bosses]]" | |||
end | |||
end | |||
wikiTable = wikiTable .. [=[__NOTOC__ | |||
<table class="wikitable" style="text-align:center"> | |||
<th style="border-right:none; border-bottom:none; width:110px"> | |||
<th colspan="7" style="border-width: 1px 0px 0px; height:100px; vertical-align:bottom;"> [[File:]=] .. | |||
imageName .. [=[|link=]] | |||
<th style="vertical-align:top; border-left:none; border-bottom:none; margin-left: 15px; width:110px>]=] .. | |||
iconImage .. [=[ | |||
<tr> | |||
<th style="border-top:none" colspan="9">[[]=] .. creatureName .. [=[]] | |||
<tr> | |||
<th>Slayer | |||
<th>Difficulty | |||
<th>Gold Value | |||
<th>Hits | |||
<th colspan="2">Melee Damage | |||
<th>Wrestling | |||
<th>Armor | |||
<th>Magic Resist | |||
<tr> | |||
<td>]=] .. creature.slayer .. [=[ | |||
<td>]=] .. creature.difficulty .. [=[ | |||
<td>]=] .. creature.goldvalue .. [=[ | |||
<td>]=] .. creature.hits .. [=[ | |||
<td colspan="2">]=] .. creature.minmeleedmg .. creature.maxmeleedmg .. [=[ | |||
<td>]=] .. creature.wrestling .. [=[ | |||
<td>]=] .. creature.armor .. creature.armormin .. [=[ | |||
<td>]=] .. creature.magicresist .. creature.magicresistmin .. [=[ | |||
<tr> | |||
<th>Parry | |||
<th>Attack Speed | |||
<th>Magery | |||
<th colspan="2">Spell Damage | |||
<th>Poison | |||
<th>Poison Resist | |||
<th>Stealth | |||
<th>AI | |||
<tr> | |||
<td>]=] .. creature.parry .. [=[ | |||
<td>]=] .. creature.atkspd .. [=[ | |||
<td>]=] .. creature.magery .. [=[ | |||
<td colspan="2">]=] .. creature.minspelldmg .. creature.maxspelldmg .. [=[ | |||
<td>]=] .. creature.poisontype .. [=[ | |||
<td>]=] .. creature.poisonresist .. creature.poisonresistmin .. [=[ | |||
<td>]=] .. creature.stealth .. [=[ | |||
<td>]=] .. creature.ai | |||
if array == creatureArray then | |||
wikiTable = wikiTable .. [[ | |||
<tr><td colspan="9"> | |||
<tr> | |||
<td colspan="9">'''Location: ''']] .. creature.location | |||
end | |||
wikiTable = wikiTable .. "</table>" | |||
return wikiTable | |||
elseif creatureArray[creatureName] == nil and shipsArray[creatureName] == nil and strangelandsArray[creatureName] == nil and namespace == "" then | |||
-- Rule out summons that aren't wild | |||
if mw.loadData("Module:SummonableCreatureData")[creatureName] == nil then | |||
return "[[Category:Incomplete Pages]]" | |||
end | |||
end | end | ||
end | end | ||
function | function p.singleFollower(frame) | ||
local | local creatureArray = mw.loadData("Module:WildCreatureData") | ||
local | local tameableArray = mw.loadData("Module:TameableCreatureData") | ||
local summonArray = mw.loadData("Module:SummonableCreatureData") | |||
-- Parameters passed when the function is invoked | |||
local followerName = frame.args["name"] -- Sun Wyrm | |||
local followerType = frame.args["type"] -- tame/summon | |||
local imageOverride = frame.args["image"] -- sunwyrm.png | |||
local section = frame.args["section"] | |||
local namespace = frame.args["namespace"] -- {{NAMESPACE}} | |||
local mountIcon = "" | |||
local wikiTable = "" | |||
local creature = creatureArray[followerName] | |||
local tameable = tameableArray[followerName] | |||
local summon = summonArray[followerName] | |||
if not string.find(string.lower(followerType), "summon") and tameable then | |||
local formmatedName = string.gsub(string.lower(followerName), "%s+", "") | |||
local imageName = string.gsub(formmatedName, "%p+", "") .. ".jpg" | |||
if section and section ~= "" then | |||
wikiTable = wikiTable .. "\n== " .. section .. " ==\n" | |||
end | |||
if imageOverride and imageOverride ~= "" then | |||
imageName = imageOverride | |||
end | |||
-- Automaticlly add categories | |||
if namespace == "" or namespace == nil then | |||
wikiTable = wikiTable .. "[[Category:Tameable Creatures]]" | |||
end | |||
if tameable.mount == true then | |||
mountIcon = "[[File:horse1891.png|40px|link=Mounts|This creature is a mount and can be ridden]]" | |||
end | |||
wikiTable = wikiTable .. [=[__NOTOC__ | |||
<table class="wikitable" style="text-align:center"> | |||
<th style="border-right:none; border-bottom:none; width:110px; text-align:left; vertical-align:top;margin-right: 15px;">]=] .. | |||
mountIcon .. [=[ | |||
<th colspan="6" style="border-width: 1px 0px 0px; height:100px; vertical-align:bottom;"> [[File:]=] .. | |||
imageName .. [=[|link=]] | |||
<th style="vertical-align:top; border-left:none; border-bottom:none; margin-left: 15px; width:110px>[[File:icon-]=] .. | |||
string.lower(tameable.class) .. [=[class.png|link=Animal_Taming#Tamed_Classes|]=] .. | |||
tameable.class .. [=[ Class|right]] | |||
<tr> | |||
<th style="border-top:none" colspan="8">[[]=] .. followerName .. [=[]] | |||
<tr> | |||
<th>Min Taming | |||
<th>Control Slots | |||
<th>Hits | |||
<th>Class | |||
<th colspan="2">]=] .. tameable.combat .. [=[ Damage | |||
<th>Armor | |||
<th>Wrestling | |||
<tr> | |||
<td>]=] .. tameable.taming .. [=[ | |||
<td>]=] .. tameable.slots .. [=[ | |||
<td>]=] .. tameable.hits .. [=[ | |||
<td>]=] .. tameable.class .. [=[ | |||
<td colspan="2>]=] .. tameable.mindmg .. " - " .. tameable.maxdmg .. [=[ | |||
<td>]=] .. tameable.armor .. tameable.armormin .. [=[ | |||
<td>]=] .. tameable.wrestling .. [=[ | |||
<tr> | |||
<th>Attack Speed | |||
<th>Magic Resist | |||
<th>Poison Resist | |||
<th>Special Resist | |||
<th>Poison | |||
<th>Poisoning | |||
<th>Stealth | |||
<th>Underdog Scalar | |||
<tr> | |||
<td>]=] .. tameable.atkspd .. [=[ | |||
<td>]=] .. tameable.magicresist .. tameable.magicresistmin .. [=[ | |||
<td>]=] .. tameable.poisonresist .. tameable.poisonresistmin .. [=[ | |||
<td>]=] .. tameable.specialresist .. [=[ | |||
<td>]=] .. tameable.poisontype .. [=[ | |||
<td>]=] .. tameable.poisoning .. [=[ | |||
<td>]=] .. tameable.stealth .. [=[ | |||
<td>]=] .. tameable.underdogscalar .. "</table>\n" | |||
return wikiTable | |||
elseif not string.find(string.lower(followerType), "tame") and summon then | |||
local formmatedName = string.gsub(string.lower(followerName), "%s+", "") | |||
local imageName = string.gsub(formmatedName, "%p+", "") .. ".jpg" | |||
local spelliconImage = "[[File:" .. | |||
summon.spellicon .. | |||
".png|44px|link=Spirit Speak#" .. | |||
summon.spellname .. "|" .. summon.spellname .. summon.creaturepool .. "|right]]" | |||
if summon.necro == true then | |||
spelliconImage = spelliconImage .. | |||
"[[File:SpellPlus.png|right]]<br><br>[[File:iconvengefulspirit.png|link=Necromancy#Undead Summons|Vengeful Spirit|right]]" | |||
end | |||
if section and section ~= "" then | |||
wikiTable = wikiTable .. "\n== " .. section .. " ==\n" | |||
end | |||
if imageOverride and imageOverride ~= "" then | |||
imageName = imageOverride | |||
end | |||
-- Automaticlly add categories | |||
if namespace == "" or namespace == nil then | |||
wikiTable = wikiTable .. "[[Category:Summonable Creatures]]" | |||
end | |||
wikiTable = wikiTable .. [=[__NOTOC__ | |||
<table class="wikitable" style="text-align:center"> | |||
<th style="border-right:none; border-bottom:none; width:110px"> | |||
<th colspan="5" style="border-width: 1px 0px 0px; height:100px; vertical-align:bottom;"> [[File:]=] .. | |||
imageName .. [=[|link=]] | |||
<th style="vertical-align:top; border-left:none; border-bottom:none; margin-left: 5px; width:110px>]=] .. | |||
spelliconImage .. [=[ | |||
<tr> | |||
<th style="border-top:none" colspan="7">[[]=] .. followerName .. [=[]] | |||
<tr> | |||
<th>Spell | |||
<th>Control Slots | |||
<th>Hits | |||
<th colspan="2">]=] .. summon.combat .. [=[ Damage | |||
<th>Armor | |||
<th>Wrestling | |||
<tr> | |||
<td>]=] .. summon.spellname .. [=[ | |||
<td>]=] .. summon.slots .. [=[ | |||
<td>]=] .. summon.hits .. [=[ | |||
<td colspan="2>]=] .. summon.mindmg .. " - " .. summon.maxdmg .. [=[ | |||
<td>]=] .. summon.armor .. summon.armormin .. [=[ | |||
<td>]=] .. summon.wrestling .. [=[ | |||
<tr> | |||
<th>Attack Speed | |||
<th>Magic Resist | |||
<th>Poison Resist | |||
<th>Special Resist | |||
<th>Poison | |||
<th>Poisoning | |||
<th>Stealth | |||
<tr> | |||
<td>]=] .. summon.atkspd .. [=[ | |||
<td>]=] .. summon.magicresist .. summon.magicresistmin .. [=[ | |||
<td>]=] .. summon.poisonresist .. summon.poisonresistmin .. [=[ | |||
<td>]=] .. summon.specialresist .. [=[ | |||
<td>]=] .. summon.poisontype .. [=[ | |||
<td>]=] .. summon.poisoning .. [=[ | |||
<td>]=] .. summon.stealth .. "</table>" | |||
return wikiTable | |||
--[[else | |||
return '<h1 style="color:FireBrick;"><big>FollowerTable Template Error: No tamed/summoned follower found by the name "' .. | |||
followerName .. '" (Case-sensitive)</big></h1>']] | |||
end | end | ||
end | end | ||
function p. | function p.listSlayerGroup(frame) | ||
local creatureArray = mw.loadData("Module:WildCreatureData") | |||
local slayerGroup = frame.args[1] | |||
local position = frame.args[2] | |||
local wikiTable = "" | |||
if position and string.find(string.lower(position), "start") then | |||
wikiTable = [[<table class="wikitable sortable" style="text-align:center"> | |||
<caption>Hover over a column header's text for a description of it's contents | |||
<th><span title="The name of the creature">Name</span> | |||
<th><span title="The location(s) the creature spawns in">Location</span> | |||
<th><span title="Determines which slayer bonuses apply to this creature">Slayer</span> | |||
<th><span title="An algorithmic estimation of the creature's difficulty, calculated using creature's stats and unique scalar value. This value determines the creature's gold value as well as chance to bard.">Difficulty</span> | |||
<th><span title="The base amount of gold the creature drops determined by the creatures difficulty value, special/rare loot chance and experience are calculated off this value">Gold Value</span> | |||
<th><span title="The creatures max hit points">Hits</span> | |||
<th colspan="2"><span title="The creature's melee attack damage range">Melee Damage</span> | |||
<th><span title="Determines the creature's chance to land melee attacks and decreases the player's chance to land melee attacks">Wrestling</span> | |||
<th><span title="The creature's resistance to physical damage">Armor</span> | |||
<th><span title="The creature's resistance to spell damage ">Magic Resist</span> | |||
<th><span title="Gives the creature a (parry skill / 2)% = chance to reduce incoming damage by 25%">Parry</span> | |||
<th><span title="The creature's attacks per minute (the in-game animal lore menu shows swing delay)">AtkSpd</span> | |||
<th><span title="? Determines the creature's spell damage ?">Magery</span> | |||
<th colspan="2"><span title="The creature's spell damage range">Spell Damage</span> | |||
<th><span title="The highest level of poison the creature can inflict">Poison</span> | |||
<th><span title="Determines the creature's chance to inflict poison on melee attacks">Poisoning</span> | |||
<th><span title="The creature's chance to resist, or ignore a poison tick">Poison Resist</span> | |||
<th><span title="Whether or not the creature can move while hidden">Stealth</span> | |||
<th><span title="The creature's pathfinding behavior">AI</span> | |||
<th><span title="? The creatures movement speed ?">Speed</span> | |||
<th><span title="Used to increase the creature's difficulty value to account for each creature's unique mechanics">Unique Scaler</span>]] | |||
else | |||
wikiTable = "" | |||
end | |||
for creatureName, creature in pairs(creatureArray) do | |||
if creature.slayer == slayerGroup then | |||
wikiTable = wikiTable .. [=[<tr> | |||
<td>[[]=] .. creatureName .. [=[]] | |||
<td>]=] .. creature.location .. [=[ | |||
<td>]=] .. creature.slayer .. [[ | |||
<td>]] .. creature.difficulty .. [[ | |||
<td>]] .. creature.goldvalue .. [[ | |||
<td>]] .. creature.hits .. [[ | |||
<td colspan="2">]] .. creature.minmeleedmg .. creature.maxmeleedmg .. [[ | |||
<td>]] .. creature.wrestling .. [[ | |||
<td>]] .. creature.armor .. creature.armormin .. [[ | |||
<td>]] .. creature.magicresist .. creature.magicresistmin .. [[ | |||
<td>]] .. creature.parry .. [[ | |||
<td>]] .. creature.atkspd .. [[ | |||
<td>]] .. creature.magery .. [[ | |||
<td colspan="2">]] .. creature.minspelldmg .. creature.maxspelldmg .. [[ | |||
<td>]] .. creature.poisontype .. [[ | |||
<td>]] .. creature.poisoning .. [[ | |||
<td>]] .. creature.poisonresist .. creature.poisonresistmin .. [[ | |||
<td>]] .. creature.stealth .. [[ | |||
<td>]] .. creature.ai .. [[ | |||
<td>]] .. creature.speed .. [[ | |||
<td>]] .. creature.uniquescalar | |||
end | |||
end | |||
if position and position and string.find(string.lower(position), "end") then | |||
wikiTable = wikiTable .. "</table>" | |||
end | |||
return wikiTable | |||
end | |||
function p.listLocationGroup(frame) | |||
local locationGroup = frame.args[1] | |||
local position = frame.args[2] | |||
local wikiTable = "" | |||
local array | |||
-- Change the array being pulled from if a valid creatureType is provided, also formats the creatureType to be used in Err messages and sets an iconImage | |||
if string.find(string.lower(locationGroup), "strangeland") then | |||
array = mw.loadData("Module:StrangelandsCreatureData") | |||
elseif string.find(string.lower(locationGroup), "ship") then | |||
array = mw.loadData("Module:ShipCreatureData") | |||
else | |||
array = mw.loadData("Module:WildCreatureData") | |||
end | |||
if position and string.find(string.lower(position), "start") then | |||
wikiTable = [[<table class="wikitable sortable" style="text-align:center"> | |||
<th>Name | |||
<th>Slayer | |||
<th>Difficulty | |||
<th>Gold Value | |||
<th>Hits | |||
<th colspan="2">Melee Dmg | |||
<th>Wrestling | |||
<th>Armor | |||
<th>Magic Resist | |||
<th>Parry | |||
<th>AtkSpd | |||
<th>Magery | |||
<th colspan="2">Spell Dmg | |||
<th>Poison | |||
<th>Poisoning | |||
<th>Poison Resist | |||
<th>Stealth | |||
<th>AI | |||
<th>Speed | |||
<th>Unique Scalar]] | |||
end | |||
for creatureName, creature in pairs(array) do | |||
if string.find(creature.location, "[[" .. locationGroup .. "]]") then | |||
wikiTable = wikiTable .. [=[<tr> | |||
<td>[[]=] .. creatureName .. [=[]] | |||
<td>]=] .. creature.slayer .. [[ | |||
<td>]] .. creature.difficulty .. [[ | |||
<td>]] .. creature.goldvalue .. [[ | |||
<td>]] .. creature.hits .. [[ | |||
<td colspan="2">]] .. creature.minmeleedmg .. creature.maxmeleedmg .. [[ | |||
<td>]] .. creature.wrestling .. [[ | |||
<td>]] .. creature.armor .. creature.armormin .. [[ | |||
<td>]] .. creature.magicresist .. creature.magicresistmin .. [[ | |||
<td>]] .. creature.parry .. [[ | |||
<td>]] .. creature.atkspd .. [[ | |||
<td>]] .. creature.magery .. [[ | |||
<td colspan="2">]] .. creature.minspelldmg .. creature.maxspelldmg .. [[ | |||
<td>]] .. creature.poisontype .. [[ | |||
<td>]] .. creature.poisoning .. [[ | |||
<td>]] .. creature.poisonresist .. creature.poisonresistmin .. [[ | |||
<td>]] .. creature.stealth .. [[ | |||
<td>]] .. creature.ai .. [[ | |||
<td>]] .. creature.speed .. [[ | |||
<td>]] .. creature.uniquescalar | |||
end | |||
end | |||
if position and position and string.find(string.lower(position), "end") then | |||
wikiTable = wikiTable .. "</table>" | |||
end | |||
return wikiTable | |||
end | |||
function p.listFollowerGroup(frame) | |||
local followerArray | |||
local followerGroup = frame.args["group"] | |||
local wikiTable = "" | |||
if string.find(string.lower(followerGroup), "tame") then | |||
followerArray = mw.loadData("Module:TameableCreatureData") | |||
local creatureArray = mw.loadData("Module:WildCreatureData") | |||
wikiTable = [[<table class="wikitable sortable" style="text-align:center"> | |||
<th>Name | |||
<th>Location | |||
<th>Slots | |||
<th>Taming | |||
<th>Class | |||
<th>Hits | |||
<th>Combat | |||
<th colspan="2"> Damage | |||
<th>Wrestling | |||
<th>Armor | |||
<th>Magic Resist | |||
<th>AtkSpd | |||
<th>Poison | |||
<th>Poisoning | |||
<th>Poison Resist | |||
<th>Special Resist | |||
<th>Stealth | |||
<th>Cooldown Ability | |||
<th>Innate Ability | |||
<th>Passive Ability | |||
<th>Underdog Scalar]] | |||
for followerName, follower in pairs(followerArray) do | |||
local creature = creatureArray[followerName] | |||
local cooldownability = follower.cooldownability | |||
local innateability = follower.innateability | |||
local passiveability = follower.passiveability | |||
local location | |||
if type(follower.cooldownability) == "table" then | |||
cooldownability = "" | |||
for i, ability in ipairs(follower.cooldownability) do | |||
if i > 1 then | |||
cooldownability = cooldownability .. ", " | |||
end | |||
cooldownability = cooldownability .. ability | |||
end | end | ||
end | end | ||
if type(follower.innateability) == "table" then | |||
innateability = "" | |||
for i, ability in ipairs(follower.innateability) do | |||
if i > 1 then | |||
innateability = innateability .. ", " | |||
end | |||
innateability = innateability .. ability | |||
end | |||
end | |||
if type(follower.passiveability) == "table" then | |||
passiveability = "" | |||
for i, ability in ipairs(follower.passiveability) do | |||
if i > 1 then | |||
passiveability = passiveability .. ", " | |||
end | |||
passiveability = passiveability .. ability | |||
end | |||
end | |||
if creature and creature.location then | |||
location = creature.location | |||
else | |||
location = "?" | |||
end | |||
wikiTable = wikiTable .. [=[<tr> | |||
<td>[[]=] .. followerName .. [=[]] | |||
<td>]=] .. location .. [=[ | |||
<td>]=] .. follower.slots .. [[ | |||
<td>]] .. follower.taming .. [[ | |||
<td>]] .. follower.class .. [[ | |||
<td>]] .. follower.hits .. [[ | |||
<td>]] .. follower.combat .. [[ | |||
<td colspan="2">]] .. follower.mindmg .. " - " .. follower.maxdmg .. [[ | |||
<td>]] .. follower.wrestling .. [[ | |||
<td>]] .. follower.armor .. [[ | |||
<td>]] .. follower.magicresist .. [[ | |||
<td>]] .. follower.atkspd .. [[ | |||
<td>]] .. follower.poisontype .. [[ | |||
<td>]] .. follower.poisoning .. [[ | |||
<td>]] .. follower.poisonresist .. [[ | |||
<td>]] .. follower.specialresist .. [[ | |||
<td>]] .. follower.stealth .. [[ | |||
<td>]] .. cooldownability .. [[ | |||
<td>]] .. innateability .. [[ | |||
<td>]] .. passiveability .. [[ | |||
<td>]] .. follower.underdogscalar | |||
end | end | ||
elseif string.find(string.lower(followerGroup), "summon") then | |||
followerArray = mw.loadData("Module:SummonableCreatureData") | |||
wikiTable = [[<table class="wikitable sortable" style="text-align:center"> | |||
<th>Name | |||
<th>Spell | |||
<th>Type | |||
<th>Slots | |||
<th>Hits | |||
<th>Combat | |||
<th colspan="2"> Damage | |||
<th>Wrestling | |||
<th>Armor | |||
<th>Magic Resist | |||
<th>AtkSpd | |||
<th>Poison | |||
<th>Poisoning | |||
<th>Poison Resist | |||
<th>Special Resist | |||
<th>Stealth | |||
<th>Cooldown Ability | |||
<th>Innate Ability | |||
<th>Passive Ability]] | |||
for followerName, follower in pairs(followerArray) do | |||
local cooldownability = follower.cooldownability | |||
local innateability = follower.innateability | |||
local passiveability = follower.passiveability | |||
local summonType | |||
if type(follower.cooldownability) == "table" then | |||
cooldownability = "" | |||
for i, ability in ipairs(follower.cooldownability) do | |||
if i > 1 then | |||
cooldownability = cooldownability .. ", " | |||
end | |||
cooldownability = cooldownability .. ability | |||
end | |||
end | |||
if type(follower.innateability) == "table" then | |||
innateability = "" | |||
for i, ability in ipairs(follower.innateability) do | |||
if i > 1 then | |||
innateability = innateability .. ", " | |||
end | |||
innateability = innateability .. ability | |||
end | |||
end | |||
if type(follower.passiveability) == "table" then | |||
passiveability = "" | |||
for i, ability in ipairs(follower.passiveability) do | |||
if i > 1 then | |||
passiveability = passiveability .. ", " | |||
end | |||
passiveability = passiveability .. ability | |||
end | |||
end | |||
if follower.necro and follower.necro == true then | |||
summonType = "[[Necromancy]]" | |||
else | |||
summonType = "[[Spirit Speak|Regular]]" | |||
end | end | ||
wikiTable = wikiTable .. [=[<tr> | |||
<td>[[]=] .. followerName .. [=[]] | |||
<td>]=] .. follower.spellname .. [[ | |||
<td>]] .. summonType .. [[ | |||
<td>]] .. follower.slots .. [[ | |||
<td>]] .. follower.hits .. [[ | |||
<td>]] .. follower.combat .. [[ | |||
<td colspan="2">]] .. follower.mindmg .. " - " .. follower.maxdmg .. [[ | |||
<td>]] .. follower.wrestling .. [[ | |||
<td>]] .. follower.armor .. [[ | |||
<td>]] .. follower.magicresist .. [[ | |||
<td>]] .. follower.atkspd .. [[ | |||
<td>]] .. follower.poisontype .. [[ | |||
<td>]] .. follower.poisoning .. [[ | |||
<td>]] .. follower.poisonresist .. [[ | |||
<td>]] .. follower.specialresist .. [[ | |||
<td>]] .. follower.stealth .. [[ | |||
<td>]] .. cooldownability .. [[ | |||
<td>]] .. innateability .. [[ | |||
<td>]] .. passiveability | |||
end | end | ||
end | |||
wikiTable = wikiTable .. "</table>" | |||
return wikiTable | |||
end | |||
function p.listBosses(frame) | |||
local creatureArray = mw.loadData("Module:WildCreatureData") | |||
local shipCreatureArray = mw.loadData("Module:ShipCreatureData") | |||
local bossesToList = frame.args["bosstype"] -- Main Boss | |||
local typeOfBoss = string.lower(bossesToList) | |||
local typeHeader = "" | |||
local typeRow = "" | |||
if typeOfBoss == "all" then | |||
typeHeader = "<th> Type" | |||
end | |||
local wikiTable = [[<table class="wikitable sortable" style="text-align:center"> | |||
<th>Name]] .. typeHeader .. [[ | |||
<th>Location | |||
<th>Slayer | |||
<th>Difficulty | |||
<th>Base Hits | |||
<th colspan="2">Melee Damage | |||
<th>Wrestling | |||
<th>Armor | |||
<th>Magic Resist | |||
<th>Parry | |||
<th>Magery | |||
<th colspan="2">Spell Damage | |||
<th>Poison | |||
<th>Poisoning | |||
<th>Poison Resist | |||
<th>Stealth]] | |||
for arrayName, array in pairs({creatureArray,shipCreatureArray}) do | |||
for creatureName, creature in pairs(array) do | |||
if string.lower(creature.bosstype) == typeOfBoss or typeOfBoss == "all" then | |||
if creature.bosstype ~= "" and creature.bosstype ~= "Boss Summon" then | |||
local formmatedName = string.gsub(string.gsub(string.lower(creatureName), "%p+", ""), "%s+", "") | |||
local imageType | |||
local imagePrefix = "" | |||
if bossesToList == "all" then | |||
typeRow = "<td>" .. creature.bosstype | |||
end | |||
if creature.bosstype == "Omni Boss" then | |||
imagePrefix = "omni" | |||
end | |||
if mw.title.new(imagePrefix .. formmatedName .. ".jpg", 'File').exists == true then | |||
imageType = ".jpg" | |||
elseif mw.title.new(imagePrefix .. formmatedName .. ".gif", 'File').exists == true then | |||
imageType = ".gif" | |||
else | |||
imageType = ".png" | |||
end | |||
local imageName = imagePrefix .. formmatedName .. imageType | |||
wikiTable = wikiTable .. [[<tr> | |||
<td>]] .. | |||
"[[File:" .. | |||
imageName .. "|link=" .. creatureName .. "]]<br />[[" .. creatureName .. [=[]]]=] .. typeRow .. [[ | |||
<td>]] .. creature.location .. [=[ | |||
<td>]=] .. creature.slayer .. [[ | |||
<td>]] .. creature.difficulty .. [[ | |||
<td>]] .. creature.hits .. [[ | |||
<td colspan="2">]] .. creature.minmeleedmg .. creature.maxmeleedmg .. [[ | |||
<td>]] .. creature.wrestling .. [[ | |||
<td>]] .. creature.armor .. creature.armormin .. [[ | |||
<td>]] .. creature.magicresist .. creature.magicresistmin .. [[ | |||
<td>]] .. creature.parry .. [[ | |||
<td>]] .. creature.magery .. [[ | |||
<td colspan="2">]] .. creature.minspelldmg .. creature.maxspelldmg .. [[ | |||
<td>]] .. creature.poisontype .. [[ | |||
<td>]] .. creature.poisoning .. [[ | |||
<td>]] .. creature.poisonresist .. creature.poisonresistmin .. [[ | |||
<td>]] .. creature.stealth | |||
end | |||
end | |||
end | |||
end | |||
wikiTable = wikiTable .. "</table>" | |||
return wikiTable | |||
end | |||
function p.listFollowerAbilities(frame) | |||
local tameableArray = mw.loadData("Module:TameableCreatureData") | |||
local summonArray = mw.loadData("Module:SummonableCreatureData") | |||
local abilityArray = mw.loadData("Module:FollowerAbilityData") | |||
local creature = frame.args["name"] | |||
local followerType = frame.args["type"] -- Tameable/Summon | |||
local section = frame.args["section"] | |||
local follower = "" | |||
if not string.find(string.lower(followerType), "summon") and tameableArray[creature] then | |||
follower = tameableArray[creature] | |||
elseif not string.find(string.lower(followerType), "tame") and summonArray[creature] then | |||
follower = summonArray[creature] | |||
else | |||
follower = "unknown" | |||
end | |||
local wikiTable = "" | |||
if follower and follower ~= "unknown" then -- List a follower's abilities if a follower is given | |||
local abilities = {} | |||
local abilityCount = 0 | |||
for i, creatureAbility in pairs({ follower.cooldownability, follower.innateability, follower.passiveability }) do | |||
if creatureAbility and creatureAbility ~= "" and type(creatureAbility) == "table" then | |||
for index, ability in pairs(creatureAbility) do | |||
table.insert(abilities, ability) | |||
end | |||
elseif creatureAbility and creatureAbility ~= "" then | |||
table.insert(abilities, creatureAbility) | |||
end | |||
end | |||
for i, ability in ipairs(abilities) do | |||
abilityCount = abilityCount + 1 | |||
end | |||
if abilityCount >= 1 then | |||
if section and section ~= "" then | |||
wikiTable = wikiTable .. "\n=== " .. section .. " ===\n" | |||
end | |||
wikiTable = wikiTable .. [[<table class="wikitable" style="text-align:center"> | |||
<th colspan="2">Ability | |||
<th>Type | |||
<th>Description]] | |||
end | |||
for i, ability in pairs(abilities) do | |||
local abilityImage = "[[File:followerability-" .. string.gsub(string.lower(ability), "%s+", "") .. ".png|link=]]" | |||
wikiTable = wikiTable .. [[<tr> | |||
<td style="border-right:none; padding: 10px">]] .. abilityImage ..[[ | |||
<th style="border-left:none; padding: 0px 10px 0px 0px">]] .. ability .. [[ | |||
<td>]] .. abilityArray[ability].type .. [[ | |||
<td>]] .. abilityArray[ability].description | |||
end | |||
elseif creature == "" or string.lower(creature) == "all" then -- List all abilities and the followers that have them | |||
if section and section ~= "" then | |||
wikiTable = wikiTable .. "\n== " .. section .. " ==\n" | |||
end | |||
wikiTable = wikiTable .. [[<table class="wikitable sortable" style="text-align:center"> | |||
<th colspan="2">Ability | |||
<th>Type | |||
<th>Description | |||
<th>Creatures]] | |||
for abilityName, ability in pairs(abilityArray) do | |||
local abilityImage = "[[File:followerability-" .. string.gsub(string.lower(abilityName), "%s+", "") .. ".png|link=]]" | |||
wikiTable = wikiTable .. [[<tr> | |||
<td style="border-right:none; padding: 10px">]] .. abilityImage .. [[ | |||
<th style="border-left:none; padding: 0px 10px 0px 0px">]] .. abilityName .. [[ | |||
<td>]] .. ability.type .. [[ | |||
<td>]] .. ability.description .. [[<td>]] | |||
-- Find and list any followers with the ability | |||
for i, array in pairs({ tameableArray, summonArray }) do | |||
for followerName, followerStats in pairs(array) do | |||
local followerAbilityType = "" | |||
if ability.type == "Cooldown" then | |||
followerAbilityType = followerStats.cooldownability | |||
elseif ability.type == "Innate" then | |||
followerAbilityType = followerStats.innateability | |||
elseif ability.type == "Passive" then | |||
followerAbilityType = followerStats.passiveability | |||
end | |||
if type(followerAbilityType) == "table" then | |||
for creatureName, value in pairs(followerAbilityType) do | |||
if value == abilityName then | |||
if array ~= summonArray then | |||
if not tameableArray[followerName] or not summonArray[followerName] then | |||
wikiTable = wikiTable .. "[[" .. followerName .. "]]<br>" | |||
end | |||
else | |||
wikiTable = wikiTable .. "[[" .. followerName .. "]]<br>" | |||
end | |||
end | |||
end | |||
elseif followerAbilityType == abilityName then | |||
if array ~= summonArray then | |||
if not tameableArray[followerName] or not summonArray[followerName] then | |||
wikiTable = wikiTable .. "[[" .. followerName .. "]]<br>" | |||
end | |||
else | |||
wikiTable = wikiTable .. "[[" .. followerName .. "]]<br>" | |||
end | |||
end | |||
end | |||
end | |||
-- Cut out the extra line break | |||
if string.find(wikiTable, "<br>") then | |||
wikiTable = string.reverse(wikiTable) | |||
wikiTable = string.sub(wikiTable, 5) | |||
wikiTable = string.reverse(wikiTable) | |||
end | |||
end | |||
--[[else -- If a follower is given but doesn't exist | |||
return | |||
'<h1 style="color:FireBrick;"><big>Follower Ability Table Template Error: No tamed/summoned follower found by the name "' .. | |||
creature .. '" (Case-sensitive)</big></h1>']] | |||
end | |||
wikiTable = wikiTable .. "</table>\n" | |||
return wikiTable | |||
end | |||
function p.summonStatIncrease(frame) | |||
local summonArray = mw.loadData("Module:SummonableCreatureData") | |||
local summonName = frame.args["name"] -- A summon given to display, defaults to {{PAGENAME}} | |||
local section = frame.args["section"] | |||
local pageName = frame.args["pagename"] | |||
local wikiTable = | |||
'<table class="wikitable" style="text-align:center"><td colspan="6" style="border-bottom:none">\n<tr>\n' | |||
local summon = summonArray[summonName] | |||
if summon then | |||
local stats = { | |||
["hits"] = summon.unformattedhits, | |||
["atkspd"] = summon.atkspd, | |||
["mindmg"] = summon.mindmg, | |||
["maxdmg"] = summon.maxdmg, | |||
["wrestling"] = summon.wrestling, | |||
["armor"] = summon.armor, | |||
["magicresist"] = summon.magicresist | |||
} | |||
local hitsScale = 1.5 | |||
local atkspdScale = 0.25 | |||
local dmgScale = 0.5 | |||
local wrestlingScale = 0.5 | |||
local armorIncrease = 25 | |||
local resistIncrease = 50 | |||
for statName, stat in pairs(stats) do | |||
if type(stats[statName]) == "string" then | |||
stats[statName] = 0 | |||
end | |||
end | |||
if section and section ~= "" then | |||
wikiTable = wikiTable .. "\n=== " .. section .. " ===\n" | |||
end | |||
wikiTable = wikiTable .. | |||
[=[<th colspan="6" style="border-top:none">[[File:]=] .. | |||
summon.spellicon .. [=[.png|center|link=]]<br>[[]=] .. summonName .. [=[]] | |||
<tr> | |||
<th rowspan="2">Stat | |||
<th colspan="5"> Spirit Speak Skill | |||
<tr> | |||
<th>Base | |||
<th>80 | |||
<th>100 | |||
<th>120 | |||
<th>150 | |||
<tr> | |||
<th>Hits | |||
<td>]=] .. stats.hits .. [[ | |||
<td>]] .. stats.hits + (stats.hits * (hitsScale * (80 / 100))) .. [[ | |||
<td>]] .. stats.hits + (stats.hits * (hitsScale * (100 / 100))) .. [[ | |||
<td>]] .. stats.hits + (stats.hits * (hitsScale * (120 / 100))) .. [[ | |||
<td>]] .. stats.hits + (stats.hits * (hitsScale * (150 / 100))) .. [[ | |||
<tr> | |||
<th>Attack Speed | |||
<td>]] .. stats.atkspd .. [[ | |||
<td>]] .. stats.atkspd + (stats.atkspd * (atkspdScale * (80 / 100))) .. [[ | |||
<td>]] .. stats.atkspd + (stats.atkspd * (atkspdScale * (100 / 100))) .. [[ | |||
<td>]] .. stats.atkspd + (stats.atkspd * (atkspdScale * (120 / 100))) .. [[ | |||
<td>]] .. stats.atkspd + (stats.atkspd * (atkspdScale * (150 / 100))) .. [[ | |||
<tr> | |||
<th>]] .. summon.combat .. [[ Damage | |||
<td>]] .. stats.mindmg .. " - " .. stats.maxdmg .. [[ | |||
<td>]] .. | |||
stats.mindmg + (stats.mindmg * (dmgScale * (80 / 100))) .. | |||
" - " .. stats.maxdmg + (stats.maxdmg * (dmgScale * (80 / 100))) .. [[ | |||
<td>]] .. | |||
stats.mindmg + (stats.mindmg * (dmgScale * (100 / 100))) .. | |||
" - " .. stats.maxdmg + (stats.maxdmg * (dmgScale * (100 / 100))) .. [[ | |||
<td>]] .. | |||
stats.mindmg + (stats.mindmg * (dmgScale * (120 / 100))) .. | |||
" - " .. stats.maxdmg + (stats.maxdmg * (dmgScale * (120 / 100))) .. [[ | |||
<td>]] .. | |||
stats.mindmg + (stats.mindmg * (dmgScale * (150 / 100))) .. | |||
" - " .. stats.maxdmg + (stats.maxdmg * (dmgScale * (150 / 100))) .. [[ | |||
<tr> | |||
<th>Wrestling | |||
<td>]] .. stats.wrestling .. [[ | |||
<td>]] .. stats.wrestling + (stats.wrestling * (wrestlingScale * (80 / 100))) .. [[ | |||
<td>]] .. stats.wrestling + (stats.wrestling * (wrestlingScale * (100 / 100))) .. [[ | |||
<td>]] .. stats.wrestling + (stats.wrestling * (wrestlingScale * (120 / 100))) .. [[ | |||
<td>]] .. stats.wrestling + (stats.wrestling * (wrestlingScale * (150 / 100))) .. [[ | |||
<tr> | |||
<th>Armor | |||
<td>]] .. stats.armor .. [[ | |||
<td>]] .. stats.armor + (armorIncrease * (80 / 100)) .. [[ | |||
<td>]] .. stats.armor + (armorIncrease * (100 / 100)) .. [[ | |||
<td>]] .. stats.armor + (armorIncrease * (120 / 100)) .. [[ | |||
<td>]] .. stats.armor + (armorIncrease * (150 / 100)) .. [[ | |||
<tr> | |||
<th>Magic Resist | |||
<td>]] .. stats.magicresist .. [[ | |||
<td>]] .. stats.magicresist + (resistIncrease * (80 / 100)) .. [[ | |||
<td>]] .. stats.magicresist + (resistIncrease * (100 / 100)) .. [[ | |||
<td>]] .. stats.magicresist + (resistIncrease * (120 / 100)) .. [[ | |||
<td>]] .. stats.magicresist + (resistIncrease * (150 / 100)) .. [[ | |||
</table>]] | |||
return wikiTable | return wikiTable | ||
end | --[[else | ||
return '<h1 style="color:FireBrick;"><big>Summon Stat Table Template Error: No summoned follower found by the name "' .. | |||
summonName .. '" (Case-sensitive)</big></h1>']] | |||
end | |||
end | |||
function p.summonCreaturePools(frame) | |||
local summonArray = mw.loadData("Module:SummonableCreatureData") | |||
local summonType = frame.args["type"] -- The type of summon given to list, Regular/Default or Undead/Necro | |||
local wikiTable = [[<table class="wikitable" style="text-align:center"> | |||
<tr> | |||
<th> Pool 1 | |||
<th> Pool 2 | |||
<th> Pool 3 | |||
<th> Pool 4]] | |||
local pool1 = "" | |||
local pool2 = "" | |||
local pool3 = "" | |||
local pool4 = "" | |||
for summonName, summon in pairs(summonArray) do | |||
if not string.find(string.lower(summonType), "undead") and not string.find(string.lower(summonType), "necro") then | |||
if summon.necro ~= true then | |||
if string.find(summon.creaturepool, " 1") then | |||
pool1 = pool1 .. "[[" .. summonName .. "]]<br>" | |||
elseif string.find(summon.creaturepool, " 2") then | |||
pool2 = pool2 .. "[[" .. summonName .. "]]<br>" | |||
elseif string.find(summon.creaturepool, " 3") then | |||
pool3 = pool3 .. "[[" .. summonName .. "]]<br>" | |||
elseif string.find(summon.creaturepool, " 4") then | |||
pool4 = pool4 .. "[[" .. summonName .. "]]<br>" | |||
end | |||
end | |||
else | |||
if summon.necro == true then | |||
if string.find(summon.creaturepool, " 1") then | |||
pool1 = pool1 .. "[[" .. summonName .. "]]<br>" | |||
elseif string.find(summon.creaturepool, " 2") then | |||
pool2 = pool2 .. "[[" .. summonName .. "]]<br>" | |||
elseif string.find(summon.creaturepool, " 3") then | |||
pool3 = pool3 .. "[[" .. summonName .. "]]<br>" | |||
elseif string.find(summon.creaturepool, " 4") then | |||
pool4 = pool4 .. "[[" .. summonName .. "]]<br>" | |||
end | |||
end | |||
end | |||
end | |||
wikiTable = wikiTable .. [[<tr> | |||
<td style="vertical-align:top">]] .. pool1 .. [[ | |||
<td style="vertical-align:top">]] .. pool2 .. [[ | |||
<td style="vertical-align:top">]] .. pool3 .. [[ | |||
<td style="vertical-align:top">]] .. pool4 ..[[ | |||
</table>]] | |||
return wikiTable | |||
end | |||
function p.checkCreatureValue(frame) | |||
local creatureName = frame.args["name"] -- Name of the creature to check for | |||
local creatureType = frame.args["type"] -- Wild/Tameable/Summonable/Ships/Strangelands, defaults to Wild | |||
local creatureStat = frame.args["stat"] -- location/name/slayer | |||
local value = frame.args["value"] -- Aegis Keep/Molten Mongbat/Deamonic/true, defaults to true (has value) | |||
local valueIfTrue = frame.args["iftrue"] | |||
local valueIfFalse = frame.args["iffalse"] | |||
if not creatureStat or creatureStat == "" then | |||
creatureStat = "name" | |||
end | |||
local dataSource | |||
-- Set the requested data source | |||
if creatureType and string.lower(creatureType) == "tameable" then | |||
dataSource = mw.loadData("Module:TameableCreatureData") | |||
elseif creatureType and string.lower(creatureType) == "summonable" then | |||
dataSource = mw.loadData("Module:SummonableCreatureData") | |||
elseif creatureType and string.lower(creatureType) == "ships" then | |||
dataSource = mw.loadData("Module:ShipCreatureData") | |||
elseif creatureType and string.lower(creatureType) == "tameable" then | |||
dataSource = mw.loadData("Module:TameableCreatureData") | |||
elseif creatureType and string.lower(creatureType) == "strangelands" then | |||
dataSource = mw.loadData("Module:StrangelandsCreatureData") | |||
else | |||
dataSource = mw.loadData("Module:WildCreatureData") | |||
end | |||
local creature = dataSource[creatureName] | |||
if creature then | |||
local stat = creature[creatureStat] | |||
if creatureStat == "name" then | |||
return valueIfTrue -- "creature match found in datasource" | |||
elseif not value or value == "" then | |||
if stat then | |||
return valueIfTrue -- "stat exists for this creature" | |||
else | |||
return valueIfFalse -- "stat does not exist for this creature" | |||
end | |||
else | |||
if stat and string.lower(stat) == string.lower(value) then | |||
return valueIfTrue -- "stat is equal to the value" | |||
else | |||
return valueIfFalse -- "stat is not equal to the value or doesn't exist" | |||
end | |||
end | |||
else | |||
return valueIfFalse -- "creature not found in datasource" | |||
end | |||
end | |||
function p.findImageFormat(frame) | |||
local creatureName = frame.args['image'] | |||
local formmatedName = string.gsub(string.lower(creatureName), "%s+", "") | |||
local imagePrefix = "" | |||
local creature = mw.loadData("Module:WildCreatureData")[creatureName] | |||
if creature and creature.bosstype == "Omni Boss" then | |||
imagePrefix = "omni" | |||
end | |||
local image = string.gsub(imagePrefix .. formmatedName, "%p+", "") .. ".jpg" | |||
if mw.title.new(image, 'File').exists == false then | |||
image = string.gsub(imagePrefix .. formmatedName, "%p+", "") .. ".gif" | |||
if mw.title.new(image, 'File').exists == false then | |||
image = string.gsub(imagePrefix .. formmatedName, "%p+", "") .. ".png" | |||
end | |||
end | |||
return image | |||
end | |||
function p.listImages(frame) | |||
local creatureArray = mw.loadData("Module:WildCreatureData") | |||
local wikiTable = [[<table class="wikitable sortable"> | |||
<th>Name | |||
<th>png | |||
<th>jpg | |||
<th>gif | |||
<tr>]] | |||
for creatureName, creature in pairs(creatureArray) do | |||
local formmatedName = string.gsub(string.lower(creatureName), "%s+", "") | |||
local jpgImageName = string.gsub(formmatedName, "%p+", "") .. ".jpg" | |||
local pngImageName = string.gsub(formmatedName, "%p+", "") .. ".png" | |||
local gifImageName = string.gsub(formmatedName, "%p+", "") .. ".gif" | |||
wikiTable = wikiTable .. "<td>[["..creatureName.."]] <td> [[File:"..pngImageName..[=[]] | |||
<td> [[File:]=]..jpgImageName..[=[]] | |||
<td> [[File:]=]..gifImageName..[=[]] | |||
<td><tr>]=] | |||
end | |||
wikiTable = wikiTable.."</table>" | |||
return wikiTable | |||
end | |||
return p | return p | ||
Latest revision as of 02:37, 5 November 2025
Documentation for this module may be created at Module:Creatures/doc
local p = {}
function p.singleCreature(frame)
local creatureName = frame.args["name"]
local creatureType = frame.args["type"]
local imageOverride = frame.args["image"]
local section = frame.args["section"]
local namespace = frame.args["namespace"]
local iconImage = ""
local creatureArray = mw.loadData("Module:WildCreatureData") -- Array containing wild creature data from another module
local shipsArray = mw.loadData("Module:ShipCreatureData")
local strangelandsArray = mw.loadData("Module:StrangelandsCreatureData")
local wikiTable = ""
local array
-- Change the array being pulled from if a valid creatureType is provided, also formats the creatureType to be used in Err messages and sets an iconImage
if string.find(string.lower(creatureType), "strangeland") then
array = strangelandsArray
creatureType = " " .. creatureType .. ""
iconImage = "[[File:icon-strangelands.png|right|50px|link=Strangelands#Strangelands_Creatures|Strangeland Creature]]"
elseif string.find(string.lower(creatureType), "ship") then
array = shipsArray
creatureType = " " .. creatureType .. ""
iconImage = "[[File:shipdeed.png|right|30px|link=Ships|Ship Creature]]"
else
array = creatureArray
creatureType = " wild "
end
local creature = array[creatureName]
if creature then
local formmatedName = string.gsub(string.lower(creatureName), "%s+", "")
local imageName = string.gsub(formmatedName, "%p+", "") .. ".jpg"
if section and section ~= "" then
wikiTable = wikiTable .. "\n== " .. section .. " ==\n"
end
if imageOverride and imageOverride ~= "" then
imageName = imageOverride
elseif mw.title.new(imageName, 'File').exists == false then
imageName = string.gsub(formmatedName, "%p+", "") .. ".png"
if mw.title.new(imageName, 'File').exists == false then
imageName = string.gsub(formmatedName, "%p+", "") .. ".gif"
end
end
-- Automaticly add categories
if namespace == "" or namespace == nil then
wikiTable = wikiTable .. "[[Category:Creatures]]"
wikiTable = wikiTable .. "[[Category:" .. creature.slayer .. " Creatures]]"
if creature.locationtable then
for i, location in ipairs(creature.locationtable) do
wikiTable = wikiTable .. "[[Category:" .. string.gsub(location, "%p+", "") .. "]]"
end
elseif creature.location and creature.location ~= "?" then
wikiTable = wikiTable .. "[[Category:" .. string.gsub(creature.location, "%p+", "") .. "]]"
end
if creature.bosstype ~= "" and creature.bosstype ~= "Boss Summon" then
if creature.bosstype ~= "Undermountain Boss" then
wikiTable = wikiTable .. "[[Category:" .. creature.bosstype .. "es]]"
end
wikiTable = wikiTable .. "[[Category:Bosses]]"
end
end
wikiTable = wikiTable .. [=[__NOTOC__
<table class="wikitable" style="text-align:center">
<th style="border-right:none; border-bottom:none; width:110px">
<th colspan="7" style="border-width: 1px 0px 0px; height:100px; vertical-align:bottom;"> [[File:]=] ..
imageName .. [=[|link=]]
<th style="vertical-align:top; border-left:none; border-bottom:none; margin-left: 15px; width:110px>]=] ..
iconImage .. [=[
<tr>
<th style="border-top:none" colspan="9">[[]=] .. creatureName .. [=[]]
<tr>
<th>Slayer
<th>Difficulty
<th>Gold Value
<th>Hits
<th colspan="2">Melee Damage
<th>Wrestling
<th>Armor
<th>Magic Resist
<tr>
<td>]=] .. creature.slayer .. [=[
<td>]=] .. creature.difficulty .. [=[
<td>]=] .. creature.goldvalue .. [=[
<td>]=] .. creature.hits .. [=[
<td colspan="2">]=] .. creature.minmeleedmg .. creature.maxmeleedmg .. [=[
<td>]=] .. creature.wrestling .. [=[
<td>]=] .. creature.armor .. creature.armormin .. [=[
<td>]=] .. creature.magicresist .. creature.magicresistmin .. [=[
<tr>
<th>Parry
<th>Attack Speed
<th>Magery
<th colspan="2">Spell Damage
<th>Poison
<th>Poison Resist
<th>Stealth
<th>AI
<tr>
<td>]=] .. creature.parry .. [=[
<td>]=] .. creature.atkspd .. [=[
<td>]=] .. creature.magery .. [=[
<td colspan="2">]=] .. creature.minspelldmg .. creature.maxspelldmg .. [=[
<td>]=] .. creature.poisontype .. [=[
<td>]=] .. creature.poisonresist .. creature.poisonresistmin .. [=[
<td>]=] .. creature.stealth .. [=[
<td>]=] .. creature.ai
if array == creatureArray then
wikiTable = wikiTable .. [[
<tr><td colspan="9">
<tr>
<td colspan="9">'''Location: ''']] .. creature.location
end
wikiTable = wikiTable .. "</table>"
return wikiTable
elseif creatureArray[creatureName] == nil and shipsArray[creatureName] == nil and strangelandsArray[creatureName] == nil and namespace == "" then
-- Rule out summons that aren't wild
if mw.loadData("Module:SummonableCreatureData")[creatureName] == nil then
return "[[Category:Incomplete Pages]]"
end
end
end
function p.singleFollower(frame)
local creatureArray = mw.loadData("Module:WildCreatureData")
local tameableArray = mw.loadData("Module:TameableCreatureData")
local summonArray = mw.loadData("Module:SummonableCreatureData")
-- Parameters passed when the function is invoked
local followerName = frame.args["name"] -- Sun Wyrm
local followerType = frame.args["type"] -- tame/summon
local imageOverride = frame.args["image"] -- sunwyrm.png
local section = frame.args["section"]
local namespace = frame.args["namespace"] -- {{NAMESPACE}}
local mountIcon = ""
local wikiTable = ""
local creature = creatureArray[followerName]
local tameable = tameableArray[followerName]
local summon = summonArray[followerName]
if not string.find(string.lower(followerType), "summon") and tameable then
local formmatedName = string.gsub(string.lower(followerName), "%s+", "")
local imageName = string.gsub(formmatedName, "%p+", "") .. ".jpg"
if section and section ~= "" then
wikiTable = wikiTable .. "\n== " .. section .. " ==\n"
end
if imageOverride and imageOverride ~= "" then
imageName = imageOverride
end
-- Automaticlly add categories
if namespace == "" or namespace == nil then
wikiTable = wikiTable .. "[[Category:Tameable Creatures]]"
end
if tameable.mount == true then
mountIcon = "[[File:horse1891.png|40px|link=Mounts|This creature is a mount and can be ridden]]"
end
wikiTable = wikiTable .. [=[__NOTOC__
<table class="wikitable" style="text-align:center">
<th style="border-right:none; border-bottom:none; width:110px; text-align:left; vertical-align:top;margin-right: 15px;">]=] ..
mountIcon .. [=[
<th colspan="6" style="border-width: 1px 0px 0px; height:100px; vertical-align:bottom;"> [[File:]=] ..
imageName .. [=[|link=]]
<th style="vertical-align:top; border-left:none; border-bottom:none; margin-left: 15px; width:110px>[[File:icon-]=] ..
string.lower(tameable.class) .. [=[class.png|link=Animal_Taming#Tamed_Classes|]=] ..
tameable.class .. [=[ Class|right]]
<tr>
<th style="border-top:none" colspan="8">[[]=] .. followerName .. [=[]]
<tr>
<th>Min Taming
<th>Control Slots
<th>Hits
<th>Class
<th colspan="2">]=] .. tameable.combat .. [=[ Damage
<th>Armor
<th>Wrestling
<tr>
<td>]=] .. tameable.taming .. [=[
<td>]=] .. tameable.slots .. [=[
<td>]=] .. tameable.hits .. [=[
<td>]=] .. tameable.class .. [=[
<td colspan="2>]=] .. tameable.mindmg .. " - " .. tameable.maxdmg .. [=[
<td>]=] .. tameable.armor .. tameable.armormin .. [=[
<td>]=] .. tameable.wrestling .. [=[
<tr>
<th>Attack Speed
<th>Magic Resist
<th>Poison Resist
<th>Special Resist
<th>Poison
<th>Poisoning
<th>Stealth
<th>Underdog Scalar
<tr>
<td>]=] .. tameable.atkspd .. [=[
<td>]=] .. tameable.magicresist .. tameable.magicresistmin .. [=[
<td>]=] .. tameable.poisonresist .. tameable.poisonresistmin .. [=[
<td>]=] .. tameable.specialresist .. [=[
<td>]=] .. tameable.poisontype .. [=[
<td>]=] .. tameable.poisoning .. [=[
<td>]=] .. tameable.stealth .. [=[
<td>]=] .. tameable.underdogscalar .. "</table>\n"
return wikiTable
elseif not string.find(string.lower(followerType), "tame") and summon then
local formmatedName = string.gsub(string.lower(followerName), "%s+", "")
local imageName = string.gsub(formmatedName, "%p+", "") .. ".jpg"
local spelliconImage = "[[File:" ..
summon.spellicon ..
".png|44px|link=Spirit Speak#" ..
summon.spellname .. "|" .. summon.spellname .. summon.creaturepool .. "|right]]"
if summon.necro == true then
spelliconImage = spelliconImage ..
"[[File:SpellPlus.png|right]]<br><br>[[File:iconvengefulspirit.png|link=Necromancy#Undead Summons|Vengeful Spirit|right]]"
end
if section and section ~= "" then
wikiTable = wikiTable .. "\n== " .. section .. " ==\n"
end
if imageOverride and imageOverride ~= "" then
imageName = imageOverride
end
-- Automaticlly add categories
if namespace == "" or namespace == nil then
wikiTable = wikiTable .. "[[Category:Summonable Creatures]]"
end
wikiTable = wikiTable .. [=[__NOTOC__
<table class="wikitable" style="text-align:center">
<th style="border-right:none; border-bottom:none; width:110px">
<th colspan="5" style="border-width: 1px 0px 0px; height:100px; vertical-align:bottom;"> [[File:]=] ..
imageName .. [=[|link=]]
<th style="vertical-align:top; border-left:none; border-bottom:none; margin-left: 5px; width:110px>]=] ..
spelliconImage .. [=[
<tr>
<th style="border-top:none" colspan="7">[[]=] .. followerName .. [=[]]
<tr>
<th>Spell
<th>Control Slots
<th>Hits
<th colspan="2">]=] .. summon.combat .. [=[ Damage
<th>Armor
<th>Wrestling
<tr>
<td>]=] .. summon.spellname .. [=[
<td>]=] .. summon.slots .. [=[
<td>]=] .. summon.hits .. [=[
<td colspan="2>]=] .. summon.mindmg .. " - " .. summon.maxdmg .. [=[
<td>]=] .. summon.armor .. summon.armormin .. [=[
<td>]=] .. summon.wrestling .. [=[
<tr>
<th>Attack Speed
<th>Magic Resist
<th>Poison Resist
<th>Special Resist
<th>Poison
<th>Poisoning
<th>Stealth
<tr>
<td>]=] .. summon.atkspd .. [=[
<td>]=] .. summon.magicresist .. summon.magicresistmin .. [=[
<td>]=] .. summon.poisonresist .. summon.poisonresistmin .. [=[
<td>]=] .. summon.specialresist .. [=[
<td>]=] .. summon.poisontype .. [=[
<td>]=] .. summon.poisoning .. [=[
<td>]=] .. summon.stealth .. "</table>"
return wikiTable
--[[else
return '<h1 style="color:FireBrick;"><big>FollowerTable Template Error: No tamed/summoned follower found by the name "' ..
followerName .. '" (Case-sensitive)</big></h1>']]
end
end
function p.listSlayerGroup(frame)
local creatureArray = mw.loadData("Module:WildCreatureData")
local slayerGroup = frame.args[1]
local position = frame.args[2]
local wikiTable = ""
if position and string.find(string.lower(position), "start") then
wikiTable = [[<table class="wikitable sortable" style="text-align:center">
<caption>Hover over a column header's text for a description of it's contents
<th><span title="The name of the creature">Name</span>
<th><span title="The location(s) the creature spawns in">Location</span>
<th><span title="Determines which slayer bonuses apply to this creature">Slayer</span>
<th><span title="An algorithmic estimation of the creature's difficulty, calculated using creature's stats and unique scalar value. This value determines the creature's gold value as well as chance to bard.">Difficulty</span>
<th><span title="The base amount of gold the creature drops determined by the creatures difficulty value, special/rare loot chance and experience are calculated off this value">Gold Value</span>
<th><span title="The creatures max hit points">Hits</span>
<th colspan="2"><span title="The creature's melee attack damage range">Melee Damage</span>
<th><span title="Determines the creature's chance to land melee attacks and decreases the player's chance to land melee attacks">Wrestling</span>
<th><span title="The creature's resistance to physical damage">Armor</span>
<th><span title="The creature's resistance to spell damage ">Magic Resist</span>
<th><span title="Gives the creature a (parry skill / 2)% = chance to reduce incoming damage by 25%">Parry</span>
<th><span title="The creature's attacks per minute (the in-game animal lore menu shows swing delay)">AtkSpd</span>
<th><span title="? Determines the creature's spell damage ?">Magery</span>
<th colspan="2"><span title="The creature's spell damage range">Spell Damage</span>
<th><span title="The highest level of poison the creature can inflict">Poison</span>
<th><span title="Determines the creature's chance to inflict poison on melee attacks">Poisoning</span>
<th><span title="The creature's chance to resist, or ignore a poison tick">Poison Resist</span>
<th><span title="Whether or not the creature can move while hidden">Stealth</span>
<th><span title="The creature's pathfinding behavior">AI</span>
<th><span title="? The creatures movement speed ?">Speed</span>
<th><span title="Used to increase the creature's difficulty value to account for each creature's unique mechanics">Unique Scaler</span>]]
else
wikiTable = ""
end
for creatureName, creature in pairs(creatureArray) do
if creature.slayer == slayerGroup then
wikiTable = wikiTable .. [=[<tr>
<td>[[]=] .. creatureName .. [=[]]
<td>]=] .. creature.location .. [=[
<td>]=] .. creature.slayer .. [[
<td>]] .. creature.difficulty .. [[
<td>]] .. creature.goldvalue .. [[
<td>]] .. creature.hits .. [[
<td colspan="2">]] .. creature.minmeleedmg .. creature.maxmeleedmg .. [[
<td>]] .. creature.wrestling .. [[
<td>]] .. creature.armor .. creature.armormin .. [[
<td>]] .. creature.magicresist .. creature.magicresistmin .. [[
<td>]] .. creature.parry .. [[
<td>]] .. creature.atkspd .. [[
<td>]] .. creature.magery .. [[
<td colspan="2">]] .. creature.minspelldmg .. creature.maxspelldmg .. [[
<td>]] .. creature.poisontype .. [[
<td>]] .. creature.poisoning .. [[
<td>]] .. creature.poisonresist .. creature.poisonresistmin .. [[
<td>]] .. creature.stealth .. [[
<td>]] .. creature.ai .. [[
<td>]] .. creature.speed .. [[
<td>]] .. creature.uniquescalar
end
end
if position and position and string.find(string.lower(position), "end") then
wikiTable = wikiTable .. "</table>"
end
return wikiTable
end
function p.listLocationGroup(frame)
local locationGroup = frame.args[1]
local position = frame.args[2]
local wikiTable = ""
local array
-- Change the array being pulled from if a valid creatureType is provided, also formats the creatureType to be used in Err messages and sets an iconImage
if string.find(string.lower(locationGroup), "strangeland") then
array = mw.loadData("Module:StrangelandsCreatureData")
elseif string.find(string.lower(locationGroup), "ship") then
array = mw.loadData("Module:ShipCreatureData")
else
array = mw.loadData("Module:WildCreatureData")
end
if position and string.find(string.lower(position), "start") then
wikiTable = [[<table class="wikitable sortable" style="text-align:center">
<th>Name
<th>Slayer
<th>Difficulty
<th>Gold Value
<th>Hits
<th colspan="2">Melee Dmg
<th>Wrestling
<th>Armor
<th>Magic Resist
<th>Parry
<th>AtkSpd
<th>Magery
<th colspan="2">Spell Dmg
<th>Poison
<th>Poisoning
<th>Poison Resist
<th>Stealth
<th>AI
<th>Speed
<th>Unique Scalar]]
end
for creatureName, creature in pairs(array) do
if string.find(creature.location, "[[" .. locationGroup .. "]]") then
wikiTable = wikiTable .. [=[<tr>
<td>[[]=] .. creatureName .. [=[]]
<td>]=] .. creature.slayer .. [[
<td>]] .. creature.difficulty .. [[
<td>]] .. creature.goldvalue .. [[
<td>]] .. creature.hits .. [[
<td colspan="2">]] .. creature.minmeleedmg .. creature.maxmeleedmg .. [[
<td>]] .. creature.wrestling .. [[
<td>]] .. creature.armor .. creature.armormin .. [[
<td>]] .. creature.magicresist .. creature.magicresistmin .. [[
<td>]] .. creature.parry .. [[
<td>]] .. creature.atkspd .. [[
<td>]] .. creature.magery .. [[
<td colspan="2">]] .. creature.minspelldmg .. creature.maxspelldmg .. [[
<td>]] .. creature.poisontype .. [[
<td>]] .. creature.poisoning .. [[
<td>]] .. creature.poisonresist .. creature.poisonresistmin .. [[
<td>]] .. creature.stealth .. [[
<td>]] .. creature.ai .. [[
<td>]] .. creature.speed .. [[
<td>]] .. creature.uniquescalar
end
end
if position and position and string.find(string.lower(position), "end") then
wikiTable = wikiTable .. "</table>"
end
return wikiTable
end
function p.listFollowerGroup(frame)
local followerArray
local followerGroup = frame.args["group"]
local wikiTable = ""
if string.find(string.lower(followerGroup), "tame") then
followerArray = mw.loadData("Module:TameableCreatureData")
local creatureArray = mw.loadData("Module:WildCreatureData")
wikiTable = [[<table class="wikitable sortable" style="text-align:center">
<th>Name
<th>Location
<th>Slots
<th>Taming
<th>Class
<th>Hits
<th>Combat
<th colspan="2"> Damage
<th>Wrestling
<th>Armor
<th>Magic Resist
<th>AtkSpd
<th>Poison
<th>Poisoning
<th>Poison Resist
<th>Special Resist
<th>Stealth
<th>Cooldown Ability
<th>Innate Ability
<th>Passive Ability
<th>Underdog Scalar]]
for followerName, follower in pairs(followerArray) do
local creature = creatureArray[followerName]
local cooldownability = follower.cooldownability
local innateability = follower.innateability
local passiveability = follower.passiveability
local location
if type(follower.cooldownability) == "table" then
cooldownability = ""
for i, ability in ipairs(follower.cooldownability) do
if i > 1 then
cooldownability = cooldownability .. ", "
end
cooldownability = cooldownability .. ability
end
end
if type(follower.innateability) == "table" then
innateability = ""
for i, ability in ipairs(follower.innateability) do
if i > 1 then
innateability = innateability .. ", "
end
innateability = innateability .. ability
end
end
if type(follower.passiveability) == "table" then
passiveability = ""
for i, ability in ipairs(follower.passiveability) do
if i > 1 then
passiveability = passiveability .. ", "
end
passiveability = passiveability .. ability
end
end
if creature and creature.location then
location = creature.location
else
location = "?"
end
wikiTable = wikiTable .. [=[<tr>
<td>[[]=] .. followerName .. [=[]]
<td>]=] .. location .. [=[
<td>]=] .. follower.slots .. [[
<td>]] .. follower.taming .. [[
<td>]] .. follower.class .. [[
<td>]] .. follower.hits .. [[
<td>]] .. follower.combat .. [[
<td colspan="2">]] .. follower.mindmg .. " - " .. follower.maxdmg .. [[
<td>]] .. follower.wrestling .. [[
<td>]] .. follower.armor .. [[
<td>]] .. follower.magicresist .. [[
<td>]] .. follower.atkspd .. [[
<td>]] .. follower.poisontype .. [[
<td>]] .. follower.poisoning .. [[
<td>]] .. follower.poisonresist .. [[
<td>]] .. follower.specialresist .. [[
<td>]] .. follower.stealth .. [[
<td>]] .. cooldownability .. [[
<td>]] .. innateability .. [[
<td>]] .. passiveability .. [[
<td>]] .. follower.underdogscalar
end
elseif string.find(string.lower(followerGroup), "summon") then
followerArray = mw.loadData("Module:SummonableCreatureData")
wikiTable = [[<table class="wikitable sortable" style="text-align:center">
<th>Name
<th>Spell
<th>Type
<th>Slots
<th>Hits
<th>Combat
<th colspan="2"> Damage
<th>Wrestling
<th>Armor
<th>Magic Resist
<th>AtkSpd
<th>Poison
<th>Poisoning
<th>Poison Resist
<th>Special Resist
<th>Stealth
<th>Cooldown Ability
<th>Innate Ability
<th>Passive Ability]]
for followerName, follower in pairs(followerArray) do
local cooldownability = follower.cooldownability
local innateability = follower.innateability
local passiveability = follower.passiveability
local summonType
if type(follower.cooldownability) == "table" then
cooldownability = ""
for i, ability in ipairs(follower.cooldownability) do
if i > 1 then
cooldownability = cooldownability .. ", "
end
cooldownability = cooldownability .. ability
end
end
if type(follower.innateability) == "table" then
innateability = ""
for i, ability in ipairs(follower.innateability) do
if i > 1 then
innateability = innateability .. ", "
end
innateability = innateability .. ability
end
end
if type(follower.passiveability) == "table" then
passiveability = ""
for i, ability in ipairs(follower.passiveability) do
if i > 1 then
passiveability = passiveability .. ", "
end
passiveability = passiveability .. ability
end
end
if follower.necro and follower.necro == true then
summonType = "[[Necromancy]]"
else
summonType = "[[Spirit Speak|Regular]]"
end
wikiTable = wikiTable .. [=[<tr>
<td>[[]=] .. followerName .. [=[]]
<td>]=] .. follower.spellname .. [[
<td>]] .. summonType .. [[
<td>]] .. follower.slots .. [[
<td>]] .. follower.hits .. [[
<td>]] .. follower.combat .. [[
<td colspan="2">]] .. follower.mindmg .. " - " .. follower.maxdmg .. [[
<td>]] .. follower.wrestling .. [[
<td>]] .. follower.armor .. [[
<td>]] .. follower.magicresist .. [[
<td>]] .. follower.atkspd .. [[
<td>]] .. follower.poisontype .. [[
<td>]] .. follower.poisoning .. [[
<td>]] .. follower.poisonresist .. [[
<td>]] .. follower.specialresist .. [[
<td>]] .. follower.stealth .. [[
<td>]] .. cooldownability .. [[
<td>]] .. innateability .. [[
<td>]] .. passiveability
end
end
wikiTable = wikiTable .. "</table>"
return wikiTable
end
function p.listBosses(frame)
local creatureArray = mw.loadData("Module:WildCreatureData")
local shipCreatureArray = mw.loadData("Module:ShipCreatureData")
local bossesToList = frame.args["bosstype"] -- Main Boss
local typeOfBoss = string.lower(bossesToList)
local typeHeader = ""
local typeRow = ""
if typeOfBoss == "all" then
typeHeader = "<th> Type"
end
local wikiTable = [[<table class="wikitable sortable" style="text-align:center">
<th>Name]] .. typeHeader .. [[
<th>Location
<th>Slayer
<th>Difficulty
<th>Base Hits
<th colspan="2">Melee Damage
<th>Wrestling
<th>Armor
<th>Magic Resist
<th>Parry
<th>Magery
<th colspan="2">Spell Damage
<th>Poison
<th>Poisoning
<th>Poison Resist
<th>Stealth]]
for arrayName, array in pairs({creatureArray,shipCreatureArray}) do
for creatureName, creature in pairs(array) do
if string.lower(creature.bosstype) == typeOfBoss or typeOfBoss == "all" then
if creature.bosstype ~= "" and creature.bosstype ~= "Boss Summon" then
local formmatedName = string.gsub(string.gsub(string.lower(creatureName), "%p+", ""), "%s+", "")
local imageType
local imagePrefix = ""
if bossesToList == "all" then
typeRow = "<td>" .. creature.bosstype
end
if creature.bosstype == "Omni Boss" then
imagePrefix = "omni"
end
if mw.title.new(imagePrefix .. formmatedName .. ".jpg", 'File').exists == true then
imageType = ".jpg"
elseif mw.title.new(imagePrefix .. formmatedName .. ".gif", 'File').exists == true then
imageType = ".gif"
else
imageType = ".png"
end
local imageName = imagePrefix .. formmatedName .. imageType
wikiTable = wikiTable .. [[<tr>
<td>]] ..
"[[File:" ..
imageName .. "|link=" .. creatureName .. "]]<br />[[" .. creatureName .. [=[]]]=] .. typeRow .. [[
<td>]] .. creature.location .. [=[
<td>]=] .. creature.slayer .. [[
<td>]] .. creature.difficulty .. [[
<td>]] .. creature.hits .. [[
<td colspan="2">]] .. creature.minmeleedmg .. creature.maxmeleedmg .. [[
<td>]] .. creature.wrestling .. [[
<td>]] .. creature.armor .. creature.armormin .. [[
<td>]] .. creature.magicresist .. creature.magicresistmin .. [[
<td>]] .. creature.parry .. [[
<td>]] .. creature.magery .. [[
<td colspan="2">]] .. creature.minspelldmg .. creature.maxspelldmg .. [[
<td>]] .. creature.poisontype .. [[
<td>]] .. creature.poisoning .. [[
<td>]] .. creature.poisonresist .. creature.poisonresistmin .. [[
<td>]] .. creature.stealth
end
end
end
end
wikiTable = wikiTable .. "</table>"
return wikiTable
end
function p.listFollowerAbilities(frame)
local tameableArray = mw.loadData("Module:TameableCreatureData")
local summonArray = mw.loadData("Module:SummonableCreatureData")
local abilityArray = mw.loadData("Module:FollowerAbilityData")
local creature = frame.args["name"]
local followerType = frame.args["type"] -- Tameable/Summon
local section = frame.args["section"]
local follower = ""
if not string.find(string.lower(followerType), "summon") and tameableArray[creature] then
follower = tameableArray[creature]
elseif not string.find(string.lower(followerType), "tame") and summonArray[creature] then
follower = summonArray[creature]
else
follower = "unknown"
end
local wikiTable = ""
if follower and follower ~= "unknown" then -- List a follower's abilities if a follower is given
local abilities = {}
local abilityCount = 0
for i, creatureAbility in pairs({ follower.cooldownability, follower.innateability, follower.passiveability }) do
if creatureAbility and creatureAbility ~= "" and type(creatureAbility) == "table" then
for index, ability in pairs(creatureAbility) do
table.insert(abilities, ability)
end
elseif creatureAbility and creatureAbility ~= "" then
table.insert(abilities, creatureAbility)
end
end
for i, ability in ipairs(abilities) do
abilityCount = abilityCount + 1
end
if abilityCount >= 1 then
if section and section ~= "" then
wikiTable = wikiTable .. "\n=== " .. section .. " ===\n"
end
wikiTable = wikiTable .. [[<table class="wikitable" style="text-align:center">
<th colspan="2">Ability
<th>Type
<th>Description]]
end
for i, ability in pairs(abilities) do
local abilityImage = "[[File:followerability-" .. string.gsub(string.lower(ability), "%s+", "") .. ".png|link=]]"
wikiTable = wikiTable .. [[<tr>
<td style="border-right:none; padding: 10px">]] .. abilityImage ..[[
<th style="border-left:none; padding: 0px 10px 0px 0px">]] .. ability .. [[
<td>]] .. abilityArray[ability].type .. [[
<td>]] .. abilityArray[ability].description
end
elseif creature == "" or string.lower(creature) == "all" then -- List all abilities and the followers that have them
if section and section ~= "" then
wikiTable = wikiTable .. "\n== " .. section .. " ==\n"
end
wikiTable = wikiTable .. [[<table class="wikitable sortable" style="text-align:center">
<th colspan="2">Ability
<th>Type
<th>Description
<th>Creatures]]
for abilityName, ability in pairs(abilityArray) do
local abilityImage = "[[File:followerability-" .. string.gsub(string.lower(abilityName), "%s+", "") .. ".png|link=]]"
wikiTable = wikiTable .. [[<tr>
<td style="border-right:none; padding: 10px">]] .. abilityImage .. [[
<th style="border-left:none; padding: 0px 10px 0px 0px">]] .. abilityName .. [[
<td>]] .. ability.type .. [[
<td>]] .. ability.description .. [[<td>]]
-- Find and list any followers with the ability
for i, array in pairs({ tameableArray, summonArray }) do
for followerName, followerStats in pairs(array) do
local followerAbilityType = ""
if ability.type == "Cooldown" then
followerAbilityType = followerStats.cooldownability
elseif ability.type == "Innate" then
followerAbilityType = followerStats.innateability
elseif ability.type == "Passive" then
followerAbilityType = followerStats.passiveability
end
if type(followerAbilityType) == "table" then
for creatureName, value in pairs(followerAbilityType) do
if value == abilityName then
if array ~= summonArray then
if not tameableArray[followerName] or not summonArray[followerName] then
wikiTable = wikiTable .. "[[" .. followerName .. "]]<br>"
end
else
wikiTable = wikiTable .. "[[" .. followerName .. "]]<br>"
end
end
end
elseif followerAbilityType == abilityName then
if array ~= summonArray then
if not tameableArray[followerName] or not summonArray[followerName] then
wikiTable = wikiTable .. "[[" .. followerName .. "]]<br>"
end
else
wikiTable = wikiTable .. "[[" .. followerName .. "]]<br>"
end
end
end
end
-- Cut out the extra line break
if string.find(wikiTable, "<br>") then
wikiTable = string.reverse(wikiTable)
wikiTable = string.sub(wikiTable, 5)
wikiTable = string.reverse(wikiTable)
end
end
--[[else -- If a follower is given but doesn't exist
return
'<h1 style="color:FireBrick;"><big>Follower Ability Table Template Error: No tamed/summoned follower found by the name "' ..
creature .. '" (Case-sensitive)</big></h1>']]
end
wikiTable = wikiTable .. "</table>\n"
return wikiTable
end
function p.summonStatIncrease(frame)
local summonArray = mw.loadData("Module:SummonableCreatureData")
local summonName = frame.args["name"] -- A summon given to display, defaults to {{PAGENAME}}
local section = frame.args["section"]
local pageName = frame.args["pagename"]
local wikiTable =
'<table class="wikitable" style="text-align:center"><td colspan="6" style="border-bottom:none">\n<tr>\n'
local summon = summonArray[summonName]
if summon then
local stats = {
["hits"] = summon.unformattedhits,
["atkspd"] = summon.atkspd,
["mindmg"] = summon.mindmg,
["maxdmg"] = summon.maxdmg,
["wrestling"] = summon.wrestling,
["armor"] = summon.armor,
["magicresist"] = summon.magicresist
}
local hitsScale = 1.5
local atkspdScale = 0.25
local dmgScale = 0.5
local wrestlingScale = 0.5
local armorIncrease = 25
local resistIncrease = 50
for statName, stat in pairs(stats) do
if type(stats[statName]) == "string" then
stats[statName] = 0
end
end
if section and section ~= "" then
wikiTable = wikiTable .. "\n=== " .. section .. " ===\n"
end
wikiTable = wikiTable ..
[=[<th colspan="6" style="border-top:none">[[File:]=] ..
summon.spellicon .. [=[.png|center|link=]]<br>[[]=] .. summonName .. [=[]]
<tr>
<th rowspan="2">Stat
<th colspan="5"> Spirit Speak Skill
<tr>
<th>Base
<th>80
<th>100
<th>120
<th>150
<tr>
<th>Hits
<td>]=] .. stats.hits .. [[
<td>]] .. stats.hits + (stats.hits * (hitsScale * (80 / 100))) .. [[
<td>]] .. stats.hits + (stats.hits * (hitsScale * (100 / 100))) .. [[
<td>]] .. stats.hits + (stats.hits * (hitsScale * (120 / 100))) .. [[
<td>]] .. stats.hits + (stats.hits * (hitsScale * (150 / 100))) .. [[
<tr>
<th>Attack Speed
<td>]] .. stats.atkspd .. [[
<td>]] .. stats.atkspd + (stats.atkspd * (atkspdScale * (80 / 100))) .. [[
<td>]] .. stats.atkspd + (stats.atkspd * (atkspdScale * (100 / 100))) .. [[
<td>]] .. stats.atkspd + (stats.atkspd * (atkspdScale * (120 / 100))) .. [[
<td>]] .. stats.atkspd + (stats.atkspd * (atkspdScale * (150 / 100))) .. [[
<tr>
<th>]] .. summon.combat .. [[ Damage
<td>]] .. stats.mindmg .. " - " .. stats.maxdmg .. [[
<td>]] ..
stats.mindmg + (stats.mindmg * (dmgScale * (80 / 100))) ..
" - " .. stats.maxdmg + (stats.maxdmg * (dmgScale * (80 / 100))) .. [[
<td>]] ..
stats.mindmg + (stats.mindmg * (dmgScale * (100 / 100))) ..
" - " .. stats.maxdmg + (stats.maxdmg * (dmgScale * (100 / 100))) .. [[
<td>]] ..
stats.mindmg + (stats.mindmg * (dmgScale * (120 / 100))) ..
" - " .. stats.maxdmg + (stats.maxdmg * (dmgScale * (120 / 100))) .. [[
<td>]] ..
stats.mindmg + (stats.mindmg * (dmgScale * (150 / 100))) ..
" - " .. stats.maxdmg + (stats.maxdmg * (dmgScale * (150 / 100))) .. [[
<tr>
<th>Wrestling
<td>]] .. stats.wrestling .. [[
<td>]] .. stats.wrestling + (stats.wrestling * (wrestlingScale * (80 / 100))) .. [[
<td>]] .. stats.wrestling + (stats.wrestling * (wrestlingScale * (100 / 100))) .. [[
<td>]] .. stats.wrestling + (stats.wrestling * (wrestlingScale * (120 / 100))) .. [[
<td>]] .. stats.wrestling + (stats.wrestling * (wrestlingScale * (150 / 100))) .. [[
<tr>
<th>Armor
<td>]] .. stats.armor .. [[
<td>]] .. stats.armor + (armorIncrease * (80 / 100)) .. [[
<td>]] .. stats.armor + (armorIncrease * (100 / 100)) .. [[
<td>]] .. stats.armor + (armorIncrease * (120 / 100)) .. [[
<td>]] .. stats.armor + (armorIncrease * (150 / 100)) .. [[
<tr>
<th>Magic Resist
<td>]] .. stats.magicresist .. [[
<td>]] .. stats.magicresist + (resistIncrease * (80 / 100)) .. [[
<td>]] .. stats.magicresist + (resistIncrease * (100 / 100)) .. [[
<td>]] .. stats.magicresist + (resistIncrease * (120 / 100)) .. [[
<td>]] .. stats.magicresist + (resistIncrease * (150 / 100)) .. [[
</table>]]
return wikiTable
--[[else
return '<h1 style="color:FireBrick;"><big>Summon Stat Table Template Error: No summoned follower found by the name "' ..
summonName .. '" (Case-sensitive)</big></h1>']]
end
end
function p.summonCreaturePools(frame)
local summonArray = mw.loadData("Module:SummonableCreatureData")
local summonType = frame.args["type"] -- The type of summon given to list, Regular/Default or Undead/Necro
local wikiTable = [[<table class="wikitable" style="text-align:center">
<tr>
<th> Pool 1
<th> Pool 2
<th> Pool 3
<th> Pool 4]]
local pool1 = ""
local pool2 = ""
local pool3 = ""
local pool4 = ""
for summonName, summon in pairs(summonArray) do
if not string.find(string.lower(summonType), "undead") and not string.find(string.lower(summonType), "necro") then
if summon.necro ~= true then
if string.find(summon.creaturepool, " 1") then
pool1 = pool1 .. "[[" .. summonName .. "]]<br>"
elseif string.find(summon.creaturepool, " 2") then
pool2 = pool2 .. "[[" .. summonName .. "]]<br>"
elseif string.find(summon.creaturepool, " 3") then
pool3 = pool3 .. "[[" .. summonName .. "]]<br>"
elseif string.find(summon.creaturepool, " 4") then
pool4 = pool4 .. "[[" .. summonName .. "]]<br>"
end
end
else
if summon.necro == true then
if string.find(summon.creaturepool, " 1") then
pool1 = pool1 .. "[[" .. summonName .. "]]<br>"
elseif string.find(summon.creaturepool, " 2") then
pool2 = pool2 .. "[[" .. summonName .. "]]<br>"
elseif string.find(summon.creaturepool, " 3") then
pool3 = pool3 .. "[[" .. summonName .. "]]<br>"
elseif string.find(summon.creaturepool, " 4") then
pool4 = pool4 .. "[[" .. summonName .. "]]<br>"
end
end
end
end
wikiTable = wikiTable .. [[<tr>
<td style="vertical-align:top">]] .. pool1 .. [[
<td style="vertical-align:top">]] .. pool2 .. [[
<td style="vertical-align:top">]] .. pool3 .. [[
<td style="vertical-align:top">]] .. pool4 ..[[
</table>]]
return wikiTable
end
function p.checkCreatureValue(frame)
local creatureName = frame.args["name"] -- Name of the creature to check for
local creatureType = frame.args["type"] -- Wild/Tameable/Summonable/Ships/Strangelands, defaults to Wild
local creatureStat = frame.args["stat"] -- location/name/slayer
local value = frame.args["value"] -- Aegis Keep/Molten Mongbat/Deamonic/true, defaults to true (has value)
local valueIfTrue = frame.args["iftrue"]
local valueIfFalse = frame.args["iffalse"]
if not creatureStat or creatureStat == "" then
creatureStat = "name"
end
local dataSource
-- Set the requested data source
if creatureType and string.lower(creatureType) == "tameable" then
dataSource = mw.loadData("Module:TameableCreatureData")
elseif creatureType and string.lower(creatureType) == "summonable" then
dataSource = mw.loadData("Module:SummonableCreatureData")
elseif creatureType and string.lower(creatureType) == "ships" then
dataSource = mw.loadData("Module:ShipCreatureData")
elseif creatureType and string.lower(creatureType) == "tameable" then
dataSource = mw.loadData("Module:TameableCreatureData")
elseif creatureType and string.lower(creatureType) == "strangelands" then
dataSource = mw.loadData("Module:StrangelandsCreatureData")
else
dataSource = mw.loadData("Module:WildCreatureData")
end
local creature = dataSource[creatureName]
if creature then
local stat = creature[creatureStat]
if creatureStat == "name" then
return valueIfTrue -- "creature match found in datasource"
elseif not value or value == "" then
if stat then
return valueIfTrue -- "stat exists for this creature"
else
return valueIfFalse -- "stat does not exist for this creature"
end
else
if stat and string.lower(stat) == string.lower(value) then
return valueIfTrue -- "stat is equal to the value"
else
return valueIfFalse -- "stat is not equal to the value or doesn't exist"
end
end
else
return valueIfFalse -- "creature not found in datasource"
end
end
function p.findImageFormat(frame)
local creatureName = frame.args['image']
local formmatedName = string.gsub(string.lower(creatureName), "%s+", "")
local imagePrefix = ""
local creature = mw.loadData("Module:WildCreatureData")[creatureName]
if creature and creature.bosstype == "Omni Boss" then
imagePrefix = "omni"
end
local image = string.gsub(imagePrefix .. formmatedName, "%p+", "") .. ".jpg"
if mw.title.new(image, 'File').exists == false then
image = string.gsub(imagePrefix .. formmatedName, "%p+", "") .. ".gif"
if mw.title.new(image, 'File').exists == false then
image = string.gsub(imagePrefix .. formmatedName, "%p+", "") .. ".png"
end
end
return image
end
function p.listImages(frame)
local creatureArray = mw.loadData("Module:WildCreatureData")
local wikiTable = [[<table class="wikitable sortable">
<th>Name
<th>png
<th>jpg
<th>gif
<tr>]]
for creatureName, creature in pairs(creatureArray) do
local formmatedName = string.gsub(string.lower(creatureName), "%s+", "")
local jpgImageName = string.gsub(formmatedName, "%p+", "") .. ".jpg"
local pngImageName = string.gsub(formmatedName, "%p+", "") .. ".png"
local gifImageName = string.gsub(formmatedName, "%p+", "") .. ".gif"
wikiTable = wikiTable .. "<td>[["..creatureName.."]] <td> [[File:"..pngImageName..[=[]]
<td> [[File:]=]..jpgImageName..[=[]]
<td> [[File:]=]..gifImageName..[=[]]
<td><tr>]=]
end
wikiTable = wikiTable.."</table>"
return wikiTable
end
return p