Module:Creatures
Documentation for this module may be created at Module:Creatures/doc
local p = {} function p.singleCreature(frame) local creatureArray = mw.loadData("Module:WildCreatureData") -- Array containing wild creature data from another module local creatureName = frame.args[1] local creatureType = frame.args[2] local imageOverride = frame.args[3] local namespace = frame.args[4] local iconImage = "" local wikiTable = "" local array = creatureArray -- 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.lower(creatureType) == "strangelands" then array = mw.loadData("Module:StrangelandsCreatureData") creatureType = " " .. creatureType .. "" iconImage = "[[File:icon-strangelands.png|right|50px|link=Strangelands#Strangelands_Creatures|Strangeland Creature]]" elseif string.lower(creatureType) == "ships" then array = mw.loadData("Module:ShipCreatureData") creatureType = " " .. creatureType .. "" iconImage = "[[File:shipdeed.png|right|30px|link=Ships|Ship Creature]]" else 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 imageOverride and imageOverride ~= "" then imageName = imageOverride end -- Automaticly add categories if namespace == "" or namespace == nil then wikiTable = wikiTable .. "[[Category:" .. creature.location .. "]]" wikiTable = wikiTable .. "[[Category:" .. creature.slayer .. " Creatures]]" if creature.bosstype ~= "" then wikiTable = wikiTable .. "[[Category:" .. creature.bosstype .. "es]] [[Category:Bosses]]" end end 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 .. "</table>" return wikiTable else return '<h1 style="color:FireBrick;"><big>Creature Table Template Error: No' .. creatureType .. 'creature by the name "' .. creatureName .. '" was found (Case-sensitive)</big></h1>' 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[1] -- Sun Wyrm local imageOverride = frame.args[2] -- sunwyrm.png local followerType = frame.args[3] -- Tameable/Summon local namespace = frame.args[4] -- {{NAMESPACE}} local wikiTable = "" local creature = creatureArray[followerName] local tameable = tameableArray[followerName] local summon = summonArray[followerName] if string.lower(followerType) ~= "summon" and tameable then local formmatedName = string.gsub(string.lower(followerName), "%s+", "") local imageName = string.gsub(formmatedName, "%p+", "") .. ".jpg" if imageOverride and imageOverride ~= "" then imageName = imageOverride end -- Automaticlly add categories if namespace == "" or namespace == nil then if creature then wikiTable = wikiTable .. "[[Category:" .. creature.location .. "]]" wikiTable = wikiTable .. "[[Category:" .. creature.slayer .. " Creatures]]" end wikiTable = wikiTable .. "[[Category:Tameable Creatures]]" wikiTable = wikiTable .. "[[Category:" .. tameable.class .. " Class Tameable]]" wikiTable = wikiTable .. "[[Category:" .. tameable.combat .. " Tameable]]" end wikiTable = [=[__NOTOC__ <table class="wikitable" style="text-align:center"> <th style="border-right:none; border-bottom:none; width:110px"> <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>" return wikiTable elseif string.lower(followerType) ~= "tameable" 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.tometier .. "|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 imageOverride and imageOverride ~= "" then imageName = imageOverride end -- Automaticlly add categories if namespace == "" or namespace == nil then if creature then wikiTable = wikiTable .. "[[Category:" .. creature.location .. "]]" wikiTable = wikiTable .. "[[Category:" .. creature.slayer .. " Creatures]]" end wikiTable = wikiTable .. "[[Category:Summonable Creatures]]" end 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 .. summon.tometier .. [=[ <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>CreatureTable 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"> <th>Name <th>Location <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]] 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 = creatureArray if string.lower(locationGroup) == "strangelands" then array = mw.loadData("Module:StrangelandsCreatureData") elseif string.lower(locationGroup) == "ships" then array = mw.loadData("Module:ShipCreatureData") 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.listBosses(frame) local creatureArray = mw.loadData("Module:WildCreatureData") local bossesToList = frame.args[1] -- Main Boss local typeOfBoss = string.lower(bossesToList) local wikiTable = [[<table class="wikitable sortable" style="text-align:center"> <th>Name <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 creatureName, creature in pairs(creatureArray) do if string.lower(creature.bosstype) == typeOfBoss or typeOfBoss == "all" then if creature.bosstype ~= "" and creature.bosstype ~= "Boss Summon" then local imageType = ".jpg" local imagePrefix = "" if creature.bosstype == "Main Boss" then imageType = ".gif" elseif creature.bosstype == "Shrine Boss" then imageType = ".png" elseif creature.bosstype == "Omni Boss" then imageType = ".gif" imagePrefix = "omni" end local formmatedName = string.gsub(string.lower(creatureName), "%s+", "") local imageName = imagePrefix .. string.gsub(formmatedName, "%p+", "") .. imageType wikiTable = wikiTable .. [[<tr> <td>]] .. "[[File:" .. imageName .. "|link=" .. creatureName .. "]]<br />[[" .. creatureName .. [=[]] <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 wikiTable = wikiTable .. "</table>" return wikiTable end function p.listAbilities(frame) local tameableArray = mw.loadData("Module:TameableCreatureData") local summonArray = mw.loadData("Module:SummonableCreatureData") local abilityArray = mw.loadData("Module:FollowerAbilityData") local creature = frame.args[1] -- Warpig local followerType = frame.args[2] -- Tameable/Summon local follower = "" if string.lower(followerType) ~= "summon" and tameableArray[creature] then follower = tameableArray[creature] elseif string.lower(followerType) ~= "tameable" and summonArray[creature] then follower = summonArray[creature] else follower = "undefined" end local wikiTable = "" if follower and follower ~= "undefined" then -- List a follower's abilities if a follower is given wikiTable = [[<table class="wikitable" style="text-align:center"> <th>Ability <th>Type <th>Description]] local abilities = {} 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 pairs(abilities) do wikiTable = wikiTable .. [[<tr> <td>]] .. ability .. [[ <td>]] .. abilityArray[ability].type .. [[ <td style="text-align:left">]] .. abilityArray[ability].description end elseif follower == "undefined" then -- List all abilities and the followers that have them wikiTable = [[<table class="wikitable sortable" style="text-align:center"> <th>Ability <th>Type <th>Description <th>Creatures]] for abilityName, ability in pairs(abilityArray) do wikiTable = wikiTable .. [[<tr> <td>]] .. abilityName .. [[ <td>]] .. ability.type .. [[ <td style="text-align:left">]] .. 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 and tameableArray[followerName] and summonArray[followerName] then wikiTable = wikiTable .. "[[" .. followerName .. "|"..followerName.." (Summon)]],<br>" else wikiTable = wikiTable .. "[[" .. followerName .. "]],<br>" end end end elseif followerAbilityType == abilityName then if array == summonArray and tameableArray[followerName] and summonArray[followerName] then wikiTable = wikiTable .. "[[" .. followerName .. "|"..followerName.." (Summon)]],<br>" 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, 6) 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>" return wikiTable end function p.summonStatIncrease(frame) local summonArray = mw.loadData("Module:SummonableCreatureData") local summonName = frame.args[1] -- A summon given to display, defaults to {{PAGENAME}} local wikiTable = '<table class="wikitable" style="text-align:center">' 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 } for statName, stat in pairs(stats) do if type(stats[statName]) == "string" then stats[statName] = 0 end end wikiTable = wikiTable .. [=[<th colspan="6">[[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 * 1.5 * (80 / 100) .. [[ <td>]] .. stats.hits * 1.5 * (100 / 100) .. [[ <td>]] .. stats.hits * 1.5 * (120 / 100) .. [[ <td>]] .. stats.hits * 1.5 * (150 / 100) .. [[ <tr> <th>Attack Speed <td>]] .. stats.atkspd .. [[ <td>]] .. stats.atkspd * 1.125 * (80 / 100) .. [[ <td>]] .. stats.atkspd * 1.125 * (100 / 100) .. [[ <td>]] .. stats.atkspd * 1.125 * (120 / 100) .. [[ <td>]] .. stats.atkspd * 1.125 * (150 / 100) .. [[ <tr> <th>]] .. summon.combat .. [[ Damage <td>]] .. stats.mindmg .. " - " .. stats.maxdmg .. [[ <td>]] .. stats.mindmg * 1.25 * (80 / 100) .. " - " .. stats.maxdmg * 1.25 * (80 / 100) .. [[ <td>]] .. stats.mindmg * 1.25 * (100 / 100) .. " - " .. stats.maxdmg * 1.25 * (100 / 100) .. [[ <td>]] .. stats.mindmg * 1.25 * (120 / 100) .. " - " .. stats.maxdmg * 1.25 * (120 / 100) .. [[ <td>]] .. stats.mindmg * 1.25 * (150 / 100) .. " - " .. stats.maxdmg * 1.25 * (150 / 100) .. [[ <tr> <th>Wrestling <td>]] .. stats.wrestling .. [[ <td>]] .. stats.wrestling * 1.25 * (80 / 100) .. [[ <td>]] .. stats.wrestling * 1.25 * (100 / 100) .. [[ <td>]] .. stats.wrestling * 1.25 * (120 / 100) .. [[ <td>]] .. stats.wrestling * 1.25 * (150 / 100) .. [[ <tr> <th>Armor <td>]] .. stats.armor .. [[ <td>]] .. stats.armor + (25 * (80 / 100)) .. [[ <td>]] .. stats.armor + (25 * (100 / 100)) .. [[ <td>]] .. stats.armor + (25 * (120 / 100)) .. [[ <td>]] .. stats.armor + (25 * (150 / 100)) .. [[ <tr> <th>Magic Resist <td>]] .. stats.magicresist .. [[ <td>]] .. stats.magicresist + (50 * (80 / 100)) .. [[ <td>]] .. stats.magicresist + (50 * (100 / 100)) .. [[ <td>]] .. stats.magicresist + (50 * (120 / 100)) .. [[ <td>]] .. stats.magicresist + (50 * (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.checkCreatureValue(frame) local creatureName = frame.args[1] -- Name of the creature to check for local creatureType = frame.args[2] -- Wild/Tameable/Summonable/Ships/Strangelands, defaults to Wild local creatureStat = frame.args[3] -- location/name/slayer local value = frame.args[4] -- Aegis Keep/Molten Mongbat/Deamonic/true, defaults to true (has value) 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 "creature match found in datasource" elseif not value or value == "" then if stat then return "stat exists for this creature" else return "stat does not exist for this creature" end else if stat and string.lower(stat) == string.lower(value) then return "stat is equal to the value" else return "stat is not equal to the value or doesn't exist" end end else return "creature not found in datasource" end end return p