Module:Creatures: Difference between revisions

From UO Outlands Wiki
Jump to navigation Jump to search
No edit summary
mNo edit summary
Line 655: Line 655:
   local creatureStat = frame.args[3] -- location/name/slayer
   local creatureStat = frame.args[3] -- location/name/slayer
   local value = frame.args[4] -- Aegis Keep/Molten Mongbat/Deamonic/true, defaults to true (has value)
   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
   local dataSource


Line 677: Line 682:
     local stat = creature[creatureStat]
     local stat = creature[creatureStat]


     if stat then
     if creatureStat == "name" then
      if string.lower(stat) == "name" and creature == value then
      return "creature match found in datasource"
         return "creature matches the value1"
    elseif not value or value == "" then
       elseif string.lower(stat) == string.lower(value) or value == "" then
      if stat then
         return "stat found or is equal to the value"
         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
       else
         return "stat is not equal to the value"
         return "stat is not equal to the value or doesn't exist"
       end
       end
    elseif creature == value then
      return "creature matches the value2"
    else
      return "no stat found by that name"
     end
     end
   
   else
   else
     return "no creature by that name found"
     return "creature not found in datasource"
   end
   end
end
end


return p
return p

Revision as of 03:50, 9 November 2024

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