Module:Mazunki/Monsters: Difference between revisions
From Melvor Idle
m (special attacks) |
m (whoos csv) |
||
(32 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
local Items = require('Module:Items') | local Items = require('Module:Items') | ||
local Constants = require('Module:Constants') | local Constants = require('Module:Constants') | ||
local Areas = require("Module:CombatAreas") | |||
-- local SourceTables = require('Module:Monsters/SourceTables') | -- local SourceTables = require('Module:Monsters/SourceTables') | ||
-- local UseTables = require('Module:Monsters/UseTables') | -- local UseTables = require('Module:Monsters/UseTables') | ||
local p = {} | local p = {} | ||
local arraySeparatorInSheets = '<br />' | |||
local notext = '' | |||
local zero = 0 | |||
function p.getRawTable(frame) | function p.getRawTable(frame) | ||
Line 32: | Line 36: | ||
'BoneType', | 'BoneType', | ||
'BonePrayerValue', | 'BonePrayerValue', | ||
'BonesObtainable', | |||
'Fragments', | |||
'FragmentsAmount', | |||
'Location', | 'Location', | ||
'LocationNormal', | |||
'LocationSlayer', | |||
'LocationDungeon', | |||
'SlayerTier', 'SlayerTierName', 'SlayerTierCost', | 'SlayerTier', 'SlayerTierName', 'SlayerTierCost', | ||
'SlayerTierPlayerLevel', 'SlayerTierQtyMin', 'SlayerTierQtyMax', 'SlayerCoinReward', | 'SlayerTierPlayerLevel', 'SlayerTierQtyMin', 'SlayerTierQtyMax', 'SlayerCoinReward', | ||
'ItemsID', 'ItemsWeight', ' | 'ItemsID', 'ItemsName', 'ItemsWeight', 'ItemsDenominator', 'ItemsNormalised', 'ItemsQtyMin', 'ItemsQtyMax' | ||
} | } | ||
result = result.."!"..table.concat(headers, "!!") | result = result.."!"..table.concat(headers, "!!") | ||
Line 55: | Line 65: | ||
table.insert(rowTxt, Monsters._getMonsterAttackSpeed(monster)) | table.insert(rowTxt, Monsters._getMonsterAttackSpeed(monster)) | ||
table.insert(rowTxt, Monsters._getMonsterMaxHit(monster)) | table.insert(rowTxt, Monsters._getMonsterMaxHit(monster)) | ||
table.insert(rowTxt, monster.attackType | table.insert(rowTxt, (monster.attackType:gsub("^%l", string.upper))) | ||
local hasSpecialAttack = false | local hasSpecialAttack = false | ||
local spAtks = {} | local spAtks = {} | ||
local spAtksChance = {} | local spAtksChance = {} | ||
for _, spAtk in | for _, spAtk in pairs(monster.specialAttacks or {}) do | ||
hasSpecialAttack = true | hasSpecialAttack = true | ||
table.insert( | table.insert(spAtks, spAtk.name) | ||
table.insert(spAtksChance, spAtk. | table.insert(spAtksChance, spAtk.defaultChance/100) | ||
end | end | ||
table.insert(rowTxt, hasSpecialAttack) | table.insert(rowTxt, tostring(hasSpecialAttack)) | ||
table.insert(rowTxt, table.concat(spAtks, | table.insert(rowTxt, table.concat(spAtks, arraySeparatorInSheets)) | ||
table.insert(rowTxt, table.concat(spAtksChance, | table.insert(rowTxt, table.concat(spAtksChance, arraySeparatorInSheets)) | ||
table.insert(rowTxt, Monsters._getMonsterAR(monster)) | table.insert(rowTxt, Monsters._getMonsterAR(monster)) | ||
Line 80: | Line 89: | ||
table.insert(rowTxt, bones.name) | table.insert(rowTxt, bones.name) | ||
table.insert(rowTxt, bones.prayerPoints) | table.insert(rowTxt, bones.prayerPoints) | ||
table.insert(rowTxt, tostring(not(monster.isBoss))) | |||
table.insert(rowTxt, notext) | |||
table.insert(rowTxt, tostring(0)) | |||
elseif bones ~= nil and monster.boneQty then | |||
table.insert(rowTxt, notext) | |||
table.insert(rowTxt, tostring(0)) | |||
table.insert(rowTxt, tostring(false)) | |||
table.insert(rowTxt, bones.name) -- actually a fragment, not bone | |||
table.insert(rowTxt, monster.boneQty) -- actually a fragment | |||
else | else | ||
table.insert(rowTxt, notext) | |||
table.insert(rowTxt, tostring(zero)) | |||
table.insert(rowTxt, tostring(false)) | table.insert(rowTxt, tostring(false)) | ||
table.insert(rowTxt, tostring( | |||
table.insert(rowTxt, notext) | |||
table.insert(rowTxt, tostring(zero)) | |||
end | end | ||
table.insert(rowTxt, | local locationsTable = Areas.getMonsterAreas(monsterID) | ||
local isNormalLocation = false | |||
local isSlayerLocation = false | |||
local isDungeonLocation = false | |||
local locations = {} | |||
for i, location in pairs(locationsTable) do | |||
if location.type == "slayer" then | |||
isSlayerLocation = true | |||
elseif location.type == "dungeon" then | |||
isDungeonLocation = true | |||
elseif location.type == "combat" then | |||
isNormalLocation = true | |||
end | |||
table.insert(locations, tostring(location.name)) | |||
end | |||
table.insert(rowTxt, table.concat(locations, arraySeparatorInSheets)) | |||
table.insert(rowTxt, tostring(isNormalLocation)) | |||
table.insert(rowTxt, tostring(isSlayerLocation)) | |||
table.insert(rowTxt, tostring(isDungeonLocation)) | |||
local slayer = nil | local slayer = nil | ||
Line 93: | Line 135: | ||
else | else | ||
slayer = { | slayer = { | ||
["display"] = " | ["id"] = notext, | ||
["reward"] = | ["display"] = notext, | ||
["cost"] = notext, | |||
["slayerLevel"] = notext, | |||
["minQuantity"] = notext, | |||
["maxQuantity"] = notext, | |||
["reward"] = notext | |||
} | } | ||
end | end | ||
table.insert(rowTxt, slayer.id) | table.insert(rowTxt, tostring(slayer.id)) | ||
table.insert(rowTxt, slayer.display) | table.insert(rowTxt, tostring(slayer.display)) | ||
table.insert(rowTxt, slayer.cost) | table.insert(rowTxt, tostring(slayer.cost)) | ||
table.insert(rowTxt, slayer.slayerLevel) | table.insert(rowTxt, tostring(slayer.slayerLevel)) | ||
table.insert(rowTxt, slayer.minQuantity) | table.insert(rowTxt, tostring(slayer.minQuantity)) | ||
table.insert(rowTxt, slayer.maxQuantity) | table.insert(rowTxt, tostring(slayer.maxQuantity)) | ||
table.insert(rowTxt, slayer.reward) | table.insert(rowTxt, tostring(slayer.reward)) | ||
local itemIds = {} | local itemIds = {} | ||
local itemNames = {} | |||
local itemWeights = {} | local itemWeights = {} | ||
local | local itemNormalised = {} | ||
local itemQtyMins = {} | local itemQtyMins = {} | ||
local itemQtyMaxs = {} | local itemQtyMaxs = {} | ||
Line 116: | Line 163: | ||
totalWeight = totalWeight + droppable[2] | totalWeight = totalWeight + droppable[2] | ||
end | end | ||
local itemDenominator = totalWeight * 100 | |||
for _, droppable in pairs(monster.lootTable) do | for _, droppable in pairs(monster.lootTable) do | ||
table.insert(itemIds, droppable[1]) | table.insert(itemIds, droppable[1]) | ||
table.insert( | table.insert(itemNames, Items.getItemByID(droppable[1]).name) | ||
table.insert( | local numerator = droppable[2] | ||
table.insert(itemWeights, numerator) | |||
table.insert(itemNormalised, itemDenominator/(numerator*monster.lootChance)) | |||
table.insert(itemQtyMins, 1) | table.insert(itemQtyMins, 1) | ||
table.insert(itemQtyMaxs, droppable[3]) | table.insert(itemQtyMaxs, droppable[3]) | ||
end | end | ||
table.insert(rowTxt, table.concat(itemIds, | table.insert(rowTxt, table.concat(itemIds, arraySeparatorInSheets)) | ||
table.insert(rowTxt, table.concat( | table.insert(rowTxt, table.concat(itemNames, arraySeparatorInSheets)) | ||
table.insert(rowTxt, table.concat( | table.insert(rowTxt, table.concat(itemWeights, arraySeparatorInSheets)) | ||
table.insert(rowTxt, | table.insert(rowTxt, itemDenominator/monster.lootChance) | ||
table.insert(rowTxt, table.concat(itemQtyMins, | table.insert(rowTxt, table.concat(itemNormalised, arraySeparatorInSheets)) | ||
table.insert(rowTxt, table.concat(itemQtyMaxs, | table.insert(rowTxt, table.concat(itemQtyMins, arraySeparatorInSheets)) | ||
table.insert(rowTxt, table.concat(itemQtyMaxs, arraySeparatorInSheets)) | |||
table.insert(rows, table.concat(rowTxt, '||')) | table.insert(rows, table.concat(rowTxt, '||')) |
Latest revision as of 03:37, 31 January 2022
Documentation for this module may be created at Module:Mazunki/Monsters/doc
--local Shared = require('Module:Shared')
local MonsterData = mw.loadData('Module:Monsters/data')
local Monsters = require('Module:Monsters')
local Items = require('Module:Items')
local Constants = require('Module:Constants')
local Areas = require("Module:CombatAreas")
-- local SourceTables = require('Module:Monsters/SourceTables')
-- local UseTables = require('Module:Monsters/UseTables')
local p = {}
local arraySeparatorInSheets = '<br />'
local notext = ''
local zero = 0
function p.getRawTable(frame)
local result = '{|\r\n'
local rows = {}
local headers = {
'ID',
'Name',
'CombatLevel',
'Hitpoints',
'Interval',
'NormalMaxHit',
'NormalType',
'HasSpecial',
'SpecialAttacksNames',
'SpecialAttacksChance',
'Accuracy',
'MeleeEvasion',
'RangedEvasion',
'MagicEvasion',
'GoldDropMin',
'GoldDropMax',
'BoneType',
'BonePrayerValue',
'BonesObtainable',
'Fragments',
'FragmentsAmount',
'Location',
'LocationNormal',
'LocationSlayer',
'LocationDungeon',
'SlayerTier', 'SlayerTierName', 'SlayerTierCost',
'SlayerTierPlayerLevel', 'SlayerTierQtyMin', 'SlayerTierQtyMax', 'SlayerCoinReward',
'ItemsID', 'ItemsName', 'ItemsWeight', 'ItemsDenominator', 'ItemsNormalised', 'ItemsQtyMin', 'ItemsQtyMax'
}
result = result.."!"..table.concat(headers, "!!")
local monsterID = 0
local monster = Monsters.getMonsterByID(monsterID)
while monster ~= nil and monsterID < 2000 do -- as of writing this, there are [0..163] monsters
local rowTxt = {}
table.insert(rowTxt, '|-\r\n')
table.insert(rowTxt, monsterID)
table.insert(rowTxt, monster.name)
local combatLevel = Monsters._getMonsterCombatLevel(monster)
table.insert(rowTxt, combatLevel)
local hitpoints = Monsters._getMonsterHP(monster)
table.insert(rowTxt, hitpoints)
table.insert(rowTxt, Monsters._getMonsterAttackSpeed(monster))
table.insert(rowTxt, Monsters._getMonsterMaxHit(monster))
table.insert(rowTxt, (monster.attackType:gsub("^%l", string.upper)))
local hasSpecialAttack = false
local spAtks = {}
local spAtksChance = {}
for _, spAtk in pairs(monster.specialAttacks or {}) do
hasSpecialAttack = true
table.insert(spAtks, spAtk.name)
table.insert(spAtksChance, spAtk.defaultChance/100)
end
table.insert(rowTxt, tostring(hasSpecialAttack))
table.insert(rowTxt, table.concat(spAtks, arraySeparatorInSheets))
table.insert(rowTxt, table.concat(spAtksChance, arraySeparatorInSheets))
table.insert(rowTxt, Monsters._getMonsterAR(monster))
table.insert(rowTxt, Monsters._getMonsterER(monster, 'Melee'))
table.insert(rowTxt, Monsters._getMonsterER(monster, 'Ranged'))
table.insert(rowTxt, Monsters._getMonsterER(monster, 'Magic'))
table.insert(rowTxt, monster.dropCoins[1])
table.insert(rowTxt, monster.dropCoins[2])
local bones = Items.getItemByID(monster.bones)
if bones ~= nil and bones.prayerPoints then
table.insert(rowTxt, bones.name)
table.insert(rowTxt, bones.prayerPoints)
table.insert(rowTxt, tostring(not(monster.isBoss)))
table.insert(rowTxt, notext)
table.insert(rowTxt, tostring(0))
elseif bones ~= nil and monster.boneQty then
table.insert(rowTxt, notext)
table.insert(rowTxt, tostring(0))
table.insert(rowTxt, tostring(false))
table.insert(rowTxt, bones.name) -- actually a fragment, not bone
table.insert(rowTxt, monster.boneQty) -- actually a fragment
else
table.insert(rowTxt, notext)
table.insert(rowTxt, tostring(zero))
table.insert(rowTxt, tostring(false))
table.insert(rowTxt, notext)
table.insert(rowTxt, tostring(zero))
end
local locationsTable = Areas.getMonsterAreas(monsterID)
local isNormalLocation = false
local isSlayerLocation = false
local isDungeonLocation = false
local locations = {}
for i, location in pairs(locationsTable) do
if location.type == "slayer" then
isSlayerLocation = true
elseif location.type == "dungeon" then
isDungeonLocation = true
elseif location.type == "combat" then
isNormalLocation = true
end
table.insert(locations, tostring(location.name))
end
table.insert(rowTxt, table.concat(locations, arraySeparatorInSheets))
table.insert(rowTxt, tostring(isNormalLocation))
table.insert(rowTxt, tostring(isSlayerLocation))
table.insert(rowTxt, tostring(isDungeonLocation))
local slayer = nil
if monster.canSlayer then
slayer = Constants.getSlayerTierByLevel(combatLevel)
slayer.reward = math.floor(hitpoints/10)
else
slayer = {
["id"] = notext,
["display"] = notext,
["cost"] = notext,
["slayerLevel"] = notext,
["minQuantity"] = notext,
["maxQuantity"] = notext,
["reward"] = notext
}
end
table.insert(rowTxt, tostring(slayer.id))
table.insert(rowTxt, tostring(slayer.display))
table.insert(rowTxt, tostring(slayer.cost))
table.insert(rowTxt, tostring(slayer.slayerLevel))
table.insert(rowTxt, tostring(slayer.minQuantity))
table.insert(rowTxt, tostring(slayer.maxQuantity))
table.insert(rowTxt, tostring(slayer.reward))
local itemIds = {}
local itemNames = {}
local itemWeights = {}
local itemNormalised = {}
local itemQtyMins = {}
local itemQtyMaxs = {}
local totalWeight = 0
for _, droppable in pairs(monster.lootTable) do
totalWeight = totalWeight + droppable[2]
end
local itemDenominator = totalWeight * 100
for _, droppable in pairs(monster.lootTable) do
table.insert(itemIds, droppable[1])
table.insert(itemNames, Items.getItemByID(droppable[1]).name)
local numerator = droppable[2]
table.insert(itemWeights, numerator)
table.insert(itemNormalised, itemDenominator/(numerator*monster.lootChance))
table.insert(itemQtyMins, 1)
table.insert(itemQtyMaxs, droppable[3])
end
table.insert(rowTxt, table.concat(itemIds, arraySeparatorInSheets))
table.insert(rowTxt, table.concat(itemNames, arraySeparatorInSheets))
table.insert(rowTxt, table.concat(itemWeights, arraySeparatorInSheets))
table.insert(rowTxt, itemDenominator/monster.lootChance)
table.insert(rowTxt, table.concat(itemNormalised, arraySeparatorInSheets))
table.insert(rowTxt, table.concat(itemQtyMins, arraySeparatorInSheets))
table.insert(rowTxt, table.concat(itemQtyMaxs, arraySeparatorInSheets))
table.insert(rows, table.concat(rowTxt, '||'))
monsterID = monsterID + 1
monster = Monsters.getMonsterByID(monsterID)
end
result = result..'\r\n'..table.concat(rows, '\r\n')..'\r\n|}'
return result
end
function p.getDRValueForMonsterIdForHP(frame)
local monsterid = frame.args[1]
local hp = frame.args[2]
local autoeatlvl = frame.args[3] or 3
return 100
end
return p