Module:Monsters/Tables: Difference between revisions

From Melvor Idle
No edit summary
m (Only allow Normal Damage monsters to show in the Stormsnap table)
 
(23 intermediate revisions by 3 users not shown)
Line 1: Line 1:
p = {}
local p = {}
 
local MonsterData = mw.loadData('Module:Monsters/data')


local Shared = require('Module:Shared')
local GameData = require('Module:GameData')
local Monsters = require('Module:Monsters')
local Monsters = require('Module:Monsters')
local Shared = require('Module:Shared')
local Icons = require('Module:Icons')
local Icons = require('Module:Icons')
local Num = require('Module:Number')


function p.getFullStormsnapTable(frame)
function p.getFullStormsnapTable(frame)
  local monsterIDs = {}
--Making a single function for getting a table of monsters given a list of IDs.
  for i = 0, Shared.tableCount(MonsterData.Monsters) - 1, 1 do
local tableParts = {}
    table.insert(monsterIDs, i)
table.insert(tableParts, '{| class="wikitable sortable stickyHeader" style="width: 100%;"')
  end
 
table.insert(tableParts, '\r\n|- class="headerRow-1"\r\n!Monster !!Name ')
table.insert(tableParts, '!!style="padding:1 1em 0 0"|' .. Icons.Icon({'Magic', type='skill', notext=true}) .. ' Magic Level')
table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Ranged', type='skill', notext=true}) .. ' Ranged Attack Bonus')
table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Strength', type='skill', notext=true}) .. ' Ranged Strength Bonus')
 
 
-- Generate row per monster
for i, monster in ipairs(GameData.rawData.monsters) do
if monster.damageType == nil or monster.damageType == 'melvorD:Normal' then
local magicLevel = Monsters._getMonsterLevel(monster, 'Magic')
local rangedStrBonus = 111 + math.floor((6 * magicLevel)/33)
local rangedAttBonus = math.floor(102 * (1 + ((6 * magicLevel)/5500)))
if magicLevel > 1 then
table.insert(tableParts, '\r\n|-\r\n|style="text-align: center;" |' .. Icons.Icon({monster.name, type='monster', size=50, notext=true}))
table.insert(tableParts, '\r\n|style="text-align:left" |' .. Icons.Icon({monster.name, type='monster', noicon=true}))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. magicLevel .. '" |' .. Num.formatnum(magicLevel))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. rangedAttBonus .. '" |' .. Num.formatnum(rangedAttBonus))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. rangedStrBonus .. '" |' .. Num.formatnum(rangedStrBonus))
end
end
end
 
table.insert(tableParts, '\r\n|}')
return table.concat(tableParts)
end


  return p._getStormsnapTable(monsterIDs, false)
function p.getFullMonsterTable(frame)
return p._getMonsterTable(GameData.rawData.monsters, false)
end
end


function p._getStormsnapTable(monsterIDs, excludeDungeons)
function p._getMonsterTable(monsters, excludeDungeons)
  --Making a single function for getting a table of monsters given a list of IDs.
--Making a single function for getting a table of monsters given a list of IDs.
  local hideDungeons = excludeDungeons ~= nil and excludeDungeons or false
local hideDungeons = excludeDungeons ~= nil and excludeDungeons or false
  local tableParts = {}
local tableParts = {}
  table.insert(tableParts, '{| class="wikitable sortable stickyHeader"')
table.insert(tableParts, '{| class="wikitable sortable stickyHeader"')
-- First header row
table.insert(tableParts, '\r\n|- class="headerRow-0"\r\n! colspan="5" | !! colspan="4" |Offensive Stats !! colspan="3" |Evasion Rating !! colspan="4" |')
-- Second header row
table.insert(tableParts, '\r\n|- class="headerRow-1"\r\n!Monster !!Name !!ID !!Combat Level ')
table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Hitpoints', type='skill'}))
table.insert(tableParts, '!!Attack Speed (s) !!colspan="2"|Max Hit !!Accuracy ')
table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Defence', type='skill', notext=true}))
table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Ranged', type='skill', notext=true}))
table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Magic', type='skill', notext=true}))
table.insert(tableParts, '!!' .. Icons.Icon({'Coins', notext=true, nolink=true}) .. ' Coins !!Bones !!Locations')


  table.insert(tableParts, '\r\n|- class="headerRow-1"\r\n!Monster !!Name ')
-- Generate row per monster
  table.insert(tableParts, '!!style="padding:1 1em 0 0"|' .. Icons.Icon({'Magic', type='skill', notext=true}) .. ' Magic Level')
for i, monster in ipairs(monsters) do
  table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Ranged', type='skill', notext=true}) .. ' Ranged Attack Bonus')
local cmbLevel = p._getMonsterCombatLevel(monster)
  table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Strength', type='skill', notext=true}) .. ' Ranged Strength Bonus')
local atkSpeed = p._getMonsterAttackSpeed(monster)
local maxHit = p._getMonsterMaxHit(monster)
local accR = p._getMonsterAR(monster)
local evaR = {p._getMonsterER(monster, "Melee"), p._getMonsterER(monster, "Ranged"), p._getMonsterER(monster, "Magic")}


local gpRange = {0, 0}
if monster.dropCoins ~= nil and monster.dropCoins[2] > 1 then
gpRange = {monster.dropCoins[1], monster.dropCoins[2]}
end
local gpTxt = nil
if monster.gpDrops.min >= monster.gpDrops.max then
gpTxt = Num.formatnum(monster.gpDrops.min)
else
gpTxt = Num.formatnum(monster.gpDrops.min) .. ' - ' .. Num.formatnum(monster.gpDrops.max)
end
local bones = p._getMonsterBones(monster)
local boneTxt = (bones ~= nil and Icons.Icon({bones.item.name, type='item', notext=true})) or 'None'


  -- Generate row per monster
table.insert(tableParts, '\r\n|-\r\n|style="text-align: center;" |' .. Icons.Icon({monster.name, type='monster', size=50, notext=true}))
  for i, monsterID in Shared.skpairs(monsterIDs) do
table.insert(tableParts, '\r\n|style="text-align:left" |' .. Icons.Icon({monster.name, type='monster', noicon=true}))
    local monster = Monsters.getMonsterByID(monsterID)
table.insert(tableParts, '\r\n|style="text-align:right" |' .. monster.id)
local magicLevel = Monsters._getMonsterLevel(monster, 'Magic')
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. cmbLevel .. '" |' .. Num.formatnum(cmbLevel))
local rangedStrBonus = 111 + math.floor((6 * magicLevel)/33)
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. p._getMonsterHP(monster) .. '" |' .. Num.formatnum(p._getMonsterHP(monster)))
local rangedAttBonus = math.floor(102 * (1 + ((6 * magicLevel)/5500)))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. atkSpeed .. '" |' .. Num.round(atkSpeed, 1, 1))
table.insert(tableParts, '\r\n|style="text-align:center;border-right:hidden" |' .. p._getMonsterStyleIcon({monster, notext=true}))
if magicLevel > 1 then
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. maxHit .. '" |' .. Num.formatnum(maxHit))
    table.insert(tableParts, '\r\n|-\r\n|style="text-align: center;" |' .. Icons.Icon({monster.name, type='monster', size=50, notext=true}))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. accR .. '" |' .. Num.formatnum(accR))
    table.insert(tableParts, '\r\n|style="text-align:left" |' .. Icons.Icon({monster.name, type='monster', noicon=true}))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. evaR[1] .. '" |' .. Num.formatnum(evaR[1]))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. magicLevel .. '" |' .. Shared.formatnum(magicLevel))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. evaR[2] .. '" |' .. Num.formatnum(evaR[2]))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. rangedAttBonus .. '" |' .. Shared.formatnum(rangedAttBonus))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. evaR[3] .. '" |' .. Num.formatnum(evaR[3]))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. rangedStrBonus .. '" |' .. Shared.formatnum(rangedStrBonus))
table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. (monster.gpDrops.min + monster.gpDrops.max) / 2 .. '" |' .. gpTxt)
table.insert(tableParts, '\r\n|style="text-align:center" |' .. boneTxt)
table.insert(tableParts, '\r\n|style="text-align:right;width:190px" |' .. p._getMonsterAreas(monster, hideDungeons))
end
end
  end


  table.insert(tableParts, '\r\n|}')
table.insert(tableParts, '\r\n|}')
  return table.concat(tableParts)
return table.concat(tableParts)
end
end


return p
return p

Latest revision as of 23:52, 27 October 2024

Documentation for this module may be created at Module:Monsters/Tables/doc

local p = {}

local Shared = require('Module:Shared')
local GameData = require('Module:GameData')
local Monsters = require('Module:Monsters')
local Icons = require('Module:Icons')
local Num = require('Module:Number')

function p.getFullStormsnapTable(frame)
	--Making a single function for getting a table of monsters given a list of IDs.
	local tableParts = {}
	table.insert(tableParts, '{| class="wikitable sortable stickyHeader" style="width: 100%;"')

	table.insert(tableParts, '\r\n|- class="headerRow-1"\r\n!Monster !!Name ')
	table.insert(tableParts, '!!style="padding:1 1em 0 0"|' .. Icons.Icon({'Magic', type='skill', notext=true}) .. ' Magic Level')
	table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Ranged', type='skill', notext=true}) .. ' Ranged Attack Bonus')
	table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Strength', type='skill', notext=true}) .. ' Ranged Strength Bonus')


	-- Generate row per monster
	for i, monster in ipairs(GameData.rawData.monsters) do
		if monster.damageType == nil or monster.damageType == 'melvorD:Normal' then
			local magicLevel = Monsters._getMonsterLevel(monster, 'Magic')
			local rangedStrBonus = 111 + math.floor((6 * magicLevel)/33)
			local rangedAttBonus = math.floor(102 * (1 + ((6 * magicLevel)/5500)))
		
			if magicLevel > 1 then
				table.insert(tableParts, '\r\n|-\r\n|style="text-align: center;" |' .. Icons.Icon({monster.name, type='monster', size=50, notext=true}))
				table.insert(tableParts, '\r\n|style="text-align:left" |' .. Icons.Icon({monster.name, type='monster', noicon=true}))
				table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. magicLevel .. '" |' .. Num.formatnum(magicLevel))
				table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. rangedAttBonus .. '" |' .. Num.formatnum(rangedAttBonus))
				table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. rangedStrBonus .. '" |' .. Num.formatnum(rangedStrBonus))
			end
		end
	end

	table.insert(tableParts, '\r\n|}')
	return table.concat(tableParts)
end

function p.getFullMonsterTable(frame)
	return p._getMonsterTable(GameData.rawData.monsters, false)
end

function p._getMonsterTable(monsters, excludeDungeons)
	--Making a single function for getting a table of monsters given a list of IDs.
	local hideDungeons = excludeDungeons ~= nil and excludeDungeons or false
	local tableParts = {}
	table.insert(tableParts, '{| class="wikitable sortable stickyHeader"')
	-- First header row
	table.insert(tableParts, '\r\n|- class="headerRow-0"\r\n! colspan="5" | !! colspan="4" |Offensive Stats !! colspan="3" |Evasion Rating !! colspan="4" |')
	-- Second header row
	table.insert(tableParts, '\r\n|- class="headerRow-1"\r\n!Monster !!Name !!ID !!Combat Level ')
	table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Hitpoints', type='skill'}))
	table.insert(tableParts, '!!Attack Speed (s) !!colspan="2"|Max Hit !!Accuracy ')
	table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Defence', type='skill', notext=true}))
	table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Ranged', type='skill', notext=true}))
	table.insert(tableParts, '!!style="padding:0 1em 0 0"|' .. Icons.Icon({'Magic', type='skill', notext=true}))
	table.insert(tableParts, '!!' .. Icons.Icon({'Coins', notext=true, nolink=true}) .. ' Coins !!Bones !!Locations')

	-- Generate row per monster
	for i, monster in ipairs(monsters) do
		local cmbLevel = p._getMonsterCombatLevel(monster)
		local atkSpeed = p._getMonsterAttackSpeed(monster)
		local maxHit = p._getMonsterMaxHit(monster)
		local accR = p._getMonsterAR(monster)
		local evaR = {p._getMonsterER(monster, "Melee"), p._getMonsterER(monster, "Ranged"), p._getMonsterER(monster, "Magic")}

		local gpRange = {0, 0}
		if monster.dropCoins ~= nil and monster.dropCoins[2] > 1 then
			gpRange = {monster.dropCoins[1], monster.dropCoins[2]}
		end
		local gpTxt = nil
		if monster.gpDrops.min >= monster.gpDrops.max then
			gpTxt = Num.formatnum(monster.gpDrops.min)
		else
			gpTxt = Num.formatnum(monster.gpDrops.min) .. ' - ' .. Num.formatnum(monster.gpDrops.max)
		end
		local bones = p._getMonsterBones(monster)
		local boneTxt = (bones ~= nil and Icons.Icon({bones.item.name, type='item', notext=true})) or 'None'

		table.insert(tableParts, '\r\n|-\r\n|style="text-align: center;" |' .. Icons.Icon({monster.name, type='monster', size=50, notext=true}))
		table.insert(tableParts, '\r\n|style="text-align:left" |' .. Icons.Icon({monster.name, type='monster', noicon=true}))
		table.insert(tableParts, '\r\n|style="text-align:right" |' .. monster.id)
		table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. cmbLevel .. '" |' .. Num.formatnum(cmbLevel))
		table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. p._getMonsterHP(monster) .. '" |' .. Num.formatnum(p._getMonsterHP(monster)))
		table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. atkSpeed .. '" |' .. Num.round(atkSpeed, 1, 1))
		table.insert(tableParts, '\r\n|style="text-align:center;border-right:hidden" |' .. p._getMonsterStyleIcon({monster, notext=true}))
		table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. maxHit .. '" |' .. Num.formatnum(maxHit))
		table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. accR .. '" |' .. Num.formatnum(accR))
		table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. evaR[1] .. '" |' .. Num.formatnum(evaR[1]))
		table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. evaR[2] .. '" |' .. Num.formatnum(evaR[2]))
		table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. evaR[3] .. '" |' .. Num.formatnum(evaR[3]))
		table.insert(tableParts, '\r\n|style="text-align:right" data-sort-value="' .. (monster.gpDrops.min + monster.gpDrops.max) / 2 .. '" |' .. gpTxt)
		table.insert(tableParts, '\r\n|style="text-align:center" |' .. boneTxt)
		table.insert(tableParts, '\r\n|style="text-align:right;width:190px" |' .. p._getMonsterAreas(monster, hideDungeons))
	end

	table.insert(tableParts, '\r\n|}')
	return table.concat(tableParts)
end

return p