892
edits
m (not enough memory) |
m (whoos csv) |
||
(41 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) | ||
local result = '{|\r\n' | local result = '{|\r\n' | ||
local rows = {} | 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 monsterID = 0 | ||
local monster = Monsters.getMonsterByID(monsterID) | local monster = Monsters.getMonsterByID(monsterID) | ||
while monster ~= nil and monsterID < 2000 do -- as of writing this, there are [0..163] monsters | while monster ~= nil and monsterID < 2000 do -- as of writing this, there are [0..163] monsters | ||
local rowTxt = '|-\r\n' | 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)) | |||
rowTxt | table.insert(rowTxt, Monsters._getMonsterMaxHit(monster)) | ||
table.insert(rowTxt, (monster.attackType:gsub("^%l", string.upper))) | |||
local hasSpecialAttack = false | |||
local spAtks = {} | |||
rowTxt | local spAtksChance = {} | ||
for _, spAtk in pairs(monster.specialAttacks or {}) do | |||
hasSpecialAttack = true | |||
local | 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) | local bones = Items.getItemByID(monster.bones) | ||
if bones.prayerPoints then | if bones ~= nil and bones.prayerPoints then | ||
rowTxt | table.insert(rowTxt, bones.name) | ||
rowTxt | 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 | ||
rowTxt | table.insert(rowTxt, notext) | ||
rowTxt | table.insert(rowTxt, tostring(zero)) | ||
table.insert(rowTxt, tostring(false)) | |||
table.insert(rowTxt, notext) | |||
table.insert(rowTxt, tostring(zero)) | |||
end | end | ||
local locationsTable = Areas.getMonsterAreas(monsterID) | |||
rowTxt | 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 | ||
if monster.canSlayer then | if monster.canSlayer then | ||
Line 92: | Line 134: | ||
slayer.reward = math.floor(hitpoints/10) | slayer.reward = math.floor(hitpoints/10) | ||
else | else | ||
slayer = { | |||
["id"] = notext, | |||
["display"] = notext, | |||
["cost"] = notext, | |||
["slayerLevel"] = notext, | |||
["minQuantity"] = notext, | |||
["maxQuantity"] = notext, | |||
["reward"] = notext | |||
} | |||
end | 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, rowTxt) | table.insert(rows, table.concat(rowTxt, '||')) | ||
monsterID = monsterID + 1 | monsterID = monsterID + 1 | ||
monster = Monsters.getMonsterByID(monsterID) | monster = Monsters.getMonsterByID(monsterID) | ||
end | end | ||
result = result..'\r\n'..table.concat(rows, '\r\n')..'\r\n|}' | result = result..'\r\n'..table.concat(rows, '\r\n')..'\r\n|}' | ||
return result | return result |
edits