Module:Creature

local spellImage = require('Module:Spell').image local TableTools = require('Module:TableTools') local Utils = require('Module:Utils')

local mw = mw local sprintf = Utils.sprintf local tsort = Utils.tableSort

-- ----- MODULE FUNCTIONS --- -- local p = require("Module:BaseModule"):newModule local module_data = p:getModuleData("Module:Creature/data")

local main_args = { parentFirst = true, wrappers = { 'Template:Creature', 'Template:CreaturesInZone', 'Template:SpellsInZone', 'Template:CreaturesInZoneByType', 'Template:CreatureLocations', 'Template:CreatureHeader' } }

p.all = p:makeInvokeFunc('_all', main_args) p.attributes_modifiers = p:makeInvokeFunc('_attributes_modifiers', main_args) p.armor_and_resistances = p:makeInvokeFunc('_armor_and_resistances', main_args) p.base_attacks = p:makeInvokeFunc('_base_attacks', main_args) p.skills_abilities = p:makeInvokeFunc('_skills_abilities', main_args) p.creatures_in_zone = p:makeInvokeFunc('_creatures_in_zone', main_args) p.creatures_in_zone_by_type = p:makeInvokeFunc('_creatures_in_zone_by_type', main_args) p.get_list_of_creatures_in_zone = p:makeInvokeFunc('_get_list_of_creatures_in_zone', main_args) p.getListOfAllCreatureTypes = p:makeInvokeFunc('_getListOfAllCreatureTypes', main_args) p.spellsInZone = p:makeInvokeFunc('_spellsInZone', main_args) p.getListOfSpellsInZone = p:makeInvokeFunc('_getListOfSpellsInZone', main_args) p.creatureLocations = p:makeInvokeFunc('_creatureLocations', main_args) p.getCreatureHeader = p:makeInvokeFunc('_getCreatureHeader', main_args)

local function writeList(list) local res = "" for _, v in pairs(list) do     res = res .. sprintf('* %s\n', v)  end return res end

-- -- PAGE FUNCTIONS -- function p._all(args, frame) -- luacheck: ignore return sprintf(       "%s %s %s",        p.attributes_modifiers(args, frame),        p.armor_and_resistances(args, frame),        p.base_attacks(args, frame)    ) end

-- ATTRIBUTES AND MODIFIERS

function p._attributes_modifiers(args, frame) -- luacheck: ignore local creature_name = args[1] local creature_data = module_data[creature_name] if not creature_data then return "NO SUCH CREATURE" end

local table_title = "Attributes and Modifiers" local table_data = creature_data[table_title]

-- Create HTML output local mw_table1 = mw.html.create('table') mw_table1 :attr('class', 'wikitable') :cssText('text-align: center; font-family: Verdana,Arial,Helvetica,sans-serif; width: 480px') :tag('caption') :wikitext(table_title) :done :tag('tr') :tag('th') :wikitext("STR") :done :tag('th') :wikitext("DEX") :done :tag('th') :wikitext("INT") :done :tag('th') :wikitext("CON") :done :tag('th') :wikitext("PER") :done :tag('th') :wikitext("CHA") :done :done :tag('tr') :tag('td') :wikitext(table_data["STR"]) :done :tag('td') :wikitext(table_data["DEX"]) :done :tag('td') :wikitext(table_data["INT"]) :done :tag('td') :wikitext(table_data["CON"]) :done :tag('td') :wikitext(table_data["PER"]) :done :tag('td') :wikitext(table_data["CHA"]) :done :done

local mw_table2 = mw.html.create('table') mw_table2 :attr('class', 'wikitable') :cssText('text-align: center; font-family: Verdana,Arial,Helvetica,sans-serif; width: 480px') :tag('tr') :tag('th') :wikitext('Endurance') :done :tag('th') :wikitext('Mana') :done :done :tag('tr') :tag('td') :wikitext(table_data["Endurance"]) :done :tag('td') :wikitext(table_data["Mana"]) :done :done

local mw_table3 = mw.html.create('table') mw_table3 :attr('class', 'wikitable') :cssText('text-align: center; font-family: Verdana,Arial,Helvetica,sans-serif; width: 480px') :tag('tr') :tag('th') :wikitext('Accuracy') :done :tag('th') :wikitext('Fortitude') :done :tag('th') :wikitext('Evasion') :done :tag('th') :wikitext('Willpower') :done :done :tag('tr') :tag('td') :wikitext(table_data["Accuracy"]) :done :tag('td') :wikitext(table_data["Fortitude"]) :done :tag('td') :wikitext(table_data["Evasion"]) :done :tag('td') :wikitext(table_data["Willpower"]) :done :done

return sprintf('%s%s%s', tostring(mw_table1:allDone), tostring(mw_table2:allDone), tostring(mw_table3:allDone)) end

-- ARMOR AND RESISTANCES

function p._armor_and_resistances(args, frame) -- luacheck: ignore local creature_name = args[1] local creature_data = module_data[creature_name] if not creature_data then return "NO SUCH CREATURE" end

local table_title = "Armor and Resistances" local table_data = creature_data[table_title]

-- Create HTML output local mw_table1 = mw.html.create('table') mw_table1 :attr('class', 'wikitable') :cssText('text-align: center; font-family: Verdana,Arial,Helvetica,sans-serif; width: 480px') :tag('caption') :wikitext(table_title) :done :tag('tr') :tag('th') :wikitext('Armor (Slash)') :done :tag('th') :wikitext('Armor (Pierce)') :done :tag('th') :wikitext('Armor (Crush)') :done :done :tag('tr') :tag('td') :wikitext(table_data["Armor (Slash)"]) :done :tag('td') :wikitext(table_data["Armor (Pierce)"]) :done :tag('td') :wikitext(table_data["Armor (Crush)"]) :done :done

local mw_table2 = mw.html.create('table') mw_table2 :attr('class', 'wikitable') :cssText('text-align: center; font-family: Verdana,Arial,Helvetica,sans-serif; width: 480px') :tag('tr') :tag('th') :wikitext('Elemental (Fire)') :done :tag('th') :wikitext('Elemental (Ice)') :done :tag('th') :wikitext('Elemental (Shock)') :done :done :tag('tr') :tag('td') :wikitext(table_data["Elemental (Fire)"]) :done :tag('td') :wikitext(table_data["Elemental (Ice)"]) :done :tag('td') :wikitext(table_data["Elemental (Shock)"]) :done :done

local mw_table3 = mw.html.create('table') mw_table3 :attr('class', 'wikitable') :cssText('text-align: center; font-family: Verdana,Arial,Helvetica,sans-serif; width: 480px') :tag('tr') :tag('th') :wikitext('Magic') :done :tag('th') :wikitext('Poison') :done :tag('th') :wikitext('Acid') :done :done :tag('tr') :tag('td') :wikitext(table_data["Magic"]) :done :tag('td') :wikitext(table_data["Poison"]) :done :tag('td') :wikitext(table_data["Acid"]) :done :done

return sprintf('%s%s%s', tostring(mw_table1:allDone), tostring(mw_table2:allDone), tostring(mw_table3:allDone)) end

-- BASE ATTACKS

function p._base_attacks(args, frame) -- luacheck: ignore local creature_name = args[1] local creature_data = module_data[creature_name] if not creature_data then return "NO SUCH CREATURE" end

local table_title = "Base Attacks" local table_data = creature_data[table_title]

if not table_data then return "" end

-- Create HTML output local mw_table1 = mw.html.create('table') mw_table1 :attr('class', 'wikitable') :cssText('text-align: left; font-family: Verdana,Arial,Helvetica,sans-serif; width: 480px') :tag('caption') :wikitext(table_title) :done

local mw_inner_table local c = 0

for _, v in ipairs(table_data) do       if c ~= #table_data then mw_table1 :tag('tr') :tag('td') :wikitext(' ') :done :done else c = c + 1 end

mw_inner_table = mw.html.create('table') mw_inner_table :cssText('width: 100%') :tag('tr') :tag('td') :attr('colspan', '2') :wikitext(v["Name"]) :done :done :tag('tr') :tag('td') :wikitext("Damage") :done :tag('td') :wikitext(v["Damage"]) :done :done :tag('tr') :tag('td') :wikitext("Range") :done :tag('td') :wikitext(v["Range"]) :done :done :tag('tr') :tag('td') :wikitext("Speed") :done :tag('td') :wikitext(v["Speed"]) :done :done

mw_table1 :tag('tr') :tag('td') :wikitext(tostring(mw_inner_table:allDone)) :done :done end

return tostring(mw_table1:allDone) end

-- SKILLS AND ABILITIES

function p._skills_abilities(args, frame) -- luacheck: ignore local creature_name = args[1] local creature_data = module_data[creature_name] if not creature_data then return "NO SUCH CREATURE" end

local table_title = "Skills and Abilities" local table_data = creature_data[table_title]

if not table_data then return "NONE" end

local mw_inner_table local mw_table1 local myframe = mw.getCurrentFrame

-- Create HTML output local html = ""

for _, v in ipairs(table_data) do       mw_inner_table = mw.html.create('table') mw_inner_table :cssText('width: 100%') :tag('tr') :tag('td') :wikitext('KP') :done :tag('td') :wikitext(v["KP"]) :done :done :tag('tr') :tag('td') :wikitext('Acquired') :done :tag('td') :wikitext(v["Acquired"]) :done :done

-- Give ability name as first argument to spellImage myframe.args = {v["Name"]}

mw_table1 = mw.html.create('table') mw_table1 :attr('class', 'wikitable') :cssText('text-align: left; font-family: Verdana,Arial,Helvetica,sans-serif') :tag('tr') :tag('th') :attr('colspan', '2') :wikitext(sprintf('%s', v["Name"])) :done :done :tag('tr') :tag('td') :cssText('width: 140px') :wikitext(sprintf('', spellImage(myframe), v["Name"])) :done :tag('td') :cssText('vertical-align: top; width: 180px; padding-left:5px') :wikitext(tostring(mw_inner_table:allDone)) :done :done

html = sprintf("%s%s", html, tostring(mw_table1:allDone)) end

return html end

-- Creatures In Zone

function p._creatures_in_zone(args, frame) -- luacheck: ignore local getList = require('Module:Places').getListOfAllZones local check = false

for _, name in pairs(getList) do                                              -- Check if zone exists if args[1] == name then check = true break end end if check == false then return sprintf('%s', "NO SUCH ZONE EXISTS") end

return sprintf('%s', writeList(tsort(p.get_list_of_creatures_in_zone(args))))

end

-- Creatures In Zone By Type

-- -- idea for possible improvement: Array[1,1] = category1, Array[1,2] = creature1, Array[1,3] = creature2, Array[2,1] = category2, Array[2,2] = creature3,... -- only one loop for data module would be required, dont forget break, same goes for spellsInZoneByType fnc -- function p._creatures_in_zone_by_type(args, frame) -- luacheck: ignore local res = "" local creature_data

for _, v in pairs(p.getListOfAllCreatureTypes(args)) do     local list = {} local i = 1 for key, _ in pairs(module_data) do        creature_data = module_data[key] if args[1] == "all" and v == creature_data["Category"] then list[i] = key i = i + 1 else for _, two in pairs(creature_data["Tags"]) do              if two == args[1] and v == creature_data["Category"] then list[i] = key i = i + 1 end end end end if #list ~= 0 then res = res .. sprintf('* %s\n', v)        for _, value in pairs(tsort(list)) do            res = res .. sprintf('** %s\n', value) end end end

return res end

-- Spells In Zone

function p._spellsInZone(args, frame) -- luacheck: ignore return sprintf('%s', writeList(p.getListOfSpellsInZone(args))) end

-- Get List of Creatures In Zone                                                 -- Fnc which makes list of creatures in zone

function p._get_list_of_creatures_in_zone(args, frame) -- luacheck: ignore local list = {} local i = 1

for k, _ in pairs(module_data) do       local creature_data = module_data[k] for _, two in pairs(creature_data["Tags"]) do           if two == args[1] then list[i] = k               i = i + 1 end end end

return list end

-- Get List of All Creature Types -- -- Makes list of all creature types

function p._getListOfAllCreatureTypes(args, frame) -- luacheck: ignore local list = {} local i = 1 local creature_data

for k, _ in pairs(module_data) do       creature_data = module_data[k] list[i] = creature_data["Category"] i = i + 1 end

return tsort(TableTools.removeDuplicates(list)) end

-- Get List of All Spells In Zone -- -- Makes list of all spells in zone

function p._getListOfSpellsInZone(args, frame) -- luacheck: ignore local list = {} local i = 1 local creature_data

for k, _ in pairs(module_data) do       creature_data = module_data[k] for _, g in pairs(p.get_list_of_creatures_in_zone(args)) do           if (g == k) and (creature_data["Skills and Abilities"] ~= nil) then for _, y in ipairs(creature_data["Skills and Abilities"]) do                   list[i] = y["Name"] i = i + 1 end end end end

return tsort(TableTools.removeDuplicates(list)) end

-- Creature Locations

function p._creatureLocations(args, frame) -- luacheck: ignore local creature_data = module_data[args[1]] local tags = {} local places_data = mw.loadData('Module:Places/Data') local res = ""

for k, v in pairs(creature_data["Tags"]) do     tags[k] = v   end

if #tags == 0 then return res end for k, _ in pairs(places_data) do     for key, value in pairs(tags) do         if value == k then res = res .. sprintf('* %s\n', table.remove(tags, key)) break end end if #tags == 0 then return res end local continent_data = places_data[k] for key, _ in pairs(continent_data) do        local first = true local newLine = false local i = 1 while i <= #tags do           if tags[i] == key then res = res .. sprintf('** %s', table.remove(tags, i)) newLine = true break else i = i + 1 end end if #tags == 0 then return sprintf('%s\n', res) end for _, y in pairs(continent_data[key]) do           for _, b in pairs(tags) do               if b == y then if first then res = res .. sprintf(': %s', y)                    first = false else res = res .. sprintf(', %s', y)                 end break end end end if newLine then res = res .. sprintf('\n') end end end

return res end

-- Get Creature Header

function p._getCreatureHeader(args, frame) -- luacheck: ignore local creature_data = module_data[args[1]] local res = "" if creature_data["EnvImage"] == nil then res = res .. "Env Image needed!" else res = res .. sprintf('',creature_data["EnvImage"]) end if creature_data["Description"] == nil then res = res .. "\n\nDescription needed!" else res = res .. "\n\n" .. creature_data["Description"] end

return res end

return p