12,853
edits
Falterfire (talk | contribs) (typo fixing) |
(_buildAstrologyModifierArray: Further fixes to key/value pair return value) |
||
(30 intermediate revisions by 3 users not shown) | |||
Line 12: | Line 12: | ||
local thievingNormalLootChance = 75 | local thievingNormalLootChance = 75 | ||
local thievingAreaLootChance = 0.2 | local thievingAreaLootChance = 0.2 | ||
function p.getConstellationByID(constID) | |||
return SkillData.Astrology.Constellations[constID] | |||
end | |||
function p.getConstellation(constName) | |||
for i, const in ipairs(SkillData.Astrology.Constellations) do | |||
if const.name == constName then | |||
return const | |||
end | |||
end | |||
return nil | |||
end | |||
function p.getConstellations(checkFunc) | |||
local result = {} | |||
for i, const in ipairs(SkillData.Astrology.Constellations) do | |||
if checkFunc(const) then | |||
table.insert(result, const) | |||
end | |||
end | |||
return result | |||
end | |||
function p.getAxeTable(frame) | function p.getAxeTable(frame) | ||
Line 148: | Line 171: | ||
result = result..'||'..treeName..'' | result = result..'||'..treeName..'' | ||
result = result..'||style="min-width:25px" data-sort-value="'..logName..'"|'..Icons.Icon({logName, type='item', notext=true, size=50}) | result = result..'||style="min-width:25px" data-sort-value="'..logName..'"|'..Icons.Icon({logName, type='item', notext=true, size=50}) | ||
result = result..'|| | result = result..'||'..Icons.Icon({logName, type='item', noicon=true}) | ||
result = result..'||style="text-align:right"|'..tree.level | result = result..'||style="text-align:right"|'..tree.level | ||
result = result..'||style="text-align:right"|'..tree.xp | result = result..'||style="text-align:right"|'..tree.xp | ||
Line 204: | Line 227: | ||
for i, item in Shared.skpairs(itemArray) do | for i, item in Shared.skpairs(itemArray) do | ||
result = result..'\r\n|-' | result = result..'\r\n|-' | ||
result = result..'\r\n|style="min-width:25px"|'..Icons.Icon({item.name, type='item', notext= | result = result..'\r\n|style="min-width:25px"|'..Icons.Icon({item.name, type='item', notext=true, size='50'}) | ||
result = result..'||'..Icons.Icon({item.name, type='item', noicon=true}) | |||
result = result..'||style="text-align:right;" data-sort-value="'..item.sellsFor..'"|'..Icons.GP(item.sellsFor) | result = result..'||style="text-align:right;" data-sort-value="'..item.sellsFor..'"|'..Icons.GP(item.sellsFor) | ||
end | end | ||
Line 221: | Line 245: | ||
local mineData = Shared.clone(SkillData.Mining.Rocks) | local mineData = Shared.clone(SkillData.Mining.Rocks) | ||
table.sort(mineData, function(a, b) return a. | table.sort(mineData, function(a, b) return a.levelRequired < b.levelRequired end) | ||
for i, oreData in Shared.skpairs(mineData) do | for i, oreData in Shared.skpairs(mineData) do | ||
local ore = Items.getItemByID(oreData. | local ore = Items.getItemByID(oreData.oreID) | ||
result = result..'\r\n|-\r\n|style="min-width:25px"|'..Icons.Icon({ore.name, type='item', size='50', notext=true})..'|| | result = result..'\r\n|-\r\n|style="min-width:25px"|'..Icons.Icon({ore.name, type='item', size='50', notext=true}) | ||
result = result..'||style="text-align:right"|'..oreData. | result = result..'||'..Icons.Icon({ore.name, type='item', noicon=true}) | ||
result = result..'||style="text-align:right" data-sort-value="'..oreData. | result = result..'||style="text-align:right"|'..oreData.levelRequired..'||style="text-align:right"|'..ore.miningXP | ||
result = result..Shared.timeString(oreData. | result = result..'||style="text-align:right" data-sort-value="'..oreData.baseRespawnInterval..'"|' | ||
result = result..Shared.timeString(oreData.baseRespawnInterval / 1000, true) | |||
result = result..'||data-sort-value="'..ore.sellsFor..'"|'..Icons.GP(ore.sellsFor) | result = result..'||data-sort-value="'..ore.sellsFor..'"|'..Icons.GP(ore.sellsFor) | ||
end | end | ||
Line 245: | Line 270: | ||
local gem = Items.getItemByID(gemData.id) | local gem = Items.getItemByID(gemData.id) | ||
result = result..'\r\n|-\r\n|style="min-width:25px"|' | result = result..'\r\n|-\r\n|style="min-width:25px"|' | ||
result = result..Icons.Icon({gem.name, type='item', size='50', notext=true})..'|| | result = result..Icons.Icon({gem.name, type='item', size='50', notext=true}) | ||
result = result..'||'..Icons.Icon({gem.name, type='item', noicon=true}) | |||
result = result..'||style="text-align:right"|'..string.format("%.1f%%", gemData.chance) | result = result..'||style="text-align:right"|'..string.format("%.1f%%", gemData.chance) | ||
result = result..'||data-sort-value="'..gem.sellsFor..'"|'..Icons.GP(gem.sellsFor) | result = result..'||data-sort-value="'..gem.sellsFor..'"|'..Icons.GP(gem.sellsFor) | ||
Line 262: | Line 288: | ||
result = result..'\r\n|- class="headerRow-0"' | result = result..'\r\n|- class="headerRow-0"' | ||
result = result..'\r\n!Fish\r\n!Name\r\n!'..Icons.Icon({'Fishing', type='skill', notext=true})..' Level\r\n!Catch Time' | result = result..'\r\n!Fish\r\n!Name\r\n!'..Icons.Icon({'Fishing', type='skill', notext=true})..' Level\r\n!Catch Time' | ||
result = result..'\r\n!Experience\r\n!Fish Price\r\n!'..Icons.Icon({'Cooking', type='skill', notext=true})..' Level' | result = result..'\r\n!Experience\r\n!Fish Price\r\n!XP/s\r\n!GP/s\r\n!' | ||
result = result..Icons.Icon({'Cooking', type='skill', notext=true})..' Level' | |||
for i, fish in Shared.skpairs(data) do | for i, fish in Shared.skpairs(data) do | ||
result = result..'\r\n|-' | result = result..'\r\n|-' | ||
result = result..'\r\n| style="text-align: left;" | '..Icons.Icon({fish.name, type='item', size='50', notext=true}) | result = result..'\r\n| style="text-align: left;" | '..Icons.Icon({fish.name, type='item', size='50', notext=true}) | ||
result = result..'\r\n| style ="text-align: left;" | | result = result..'\r\n| style="text-align: left;" | '..Icons.Icon({fish.name, type='item', noicon=true}) | ||
result = result..'\r\n| style="text-align:right"|'..fish.fishingLevel | result = result..'\r\n| style="text-align:right"|'..fish.fishingLevel | ||
Line 275: | Line 302: | ||
result = result..'\r\n| style="text-align:right"|'..fish.fishingXP | result = result..'\r\n| style="text-align:right"|'..fish.fishingXP | ||
result = result..'\r\n| style="text-align:right"|'..fish.sellsFor | result = result..'\r\n| style="text-align:right"|'..fish.sellsFor | ||
local XPs = fish.fishingXP / (timeSortVal / 1000) | |||
local GPs = fish.sellsFor / (timeSortVal / 1000) | |||
result = result..'\r\n| style="text-align:right"|'..Shared.round(XPs, 2, 2) | |||
result = result..'\r\n| style="text-align:right" data-sort-value="'..GPs..'"|'..Icons.GP(Shared.round(GPs, 2, 2)) | |||
local cookStr = "N/A" | local cookStr = "N/A" | ||
Line 373: | Line 404: | ||
return p._getThievingNPCStat(npc, statName) | return p._getThievingNPCStat(npc, statName) | ||
end | |||
function p.getThievingGeneralRareTable(frame) | |||
local rareTxt = '{|class="wikitable sortable"' | |||
rareTxt = rareTxt..'\r\n!Item!!Qty' | |||
rareTxt = rareTxt..'!!Price!!colspan="2"|Chance' | |||
for i, drop in pairs(SkillData.Thieving.RareItems) do | |||
local thisItem = Items.getItemByID(drop.itemID) | |||
local odds = drop.chance | |||
rareTxt = rareTxt..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item'}) | |||
rareTxt = rareTxt..'||1||data-sort-value="'..thisItem.sellsFor..'"|'..Icons.GP(thisItem.sellsFor) | |||
rareTxt = rareTxt..'||style="text-align:right" data-sort-value="'..odds..'"|'..Shared.fraction(1, Shared.round2(1/(odds/100), 0)) | |||
rareTxt = rareTxt..'||style="text-align:right" data-sort-value="'..odds..'"|'..Shared.round(odds, 4, 4)..'%' | |||
end | |||
rareTxt = rareTxt..'\r\n|}' | |||
return rareTxt | |||
end | end | ||
Line 461: | Line 509: | ||
--After normal drops, add in rare drops | --After normal drops, add in rare drops | ||
local rareTxt = '===Possible Rare Drops:===\r\nAny of these can be received after a successful pickpocket' | local rareTxt = '===Possible Rare Drops:===\r\nAny of these can be received after a successful pickpocket' | ||
rareTxt = rareTxt..'\r\n | rareTxt = rareTxt..'\r\n'..p.getThievingGeneralRareTable() | ||
table.insert(sectionTxt, rareTxt) | table.insert(sectionTxt, rareTxt) | ||
local areaTxt = '===Possible Area Unique Drops===' | local areaTxt = '===Possible Area Unique Drops===' | ||
areaTxt = areaTxt..'\r\nAny Area Unique Drop is equally likely to be obtained after a successful pickpocket. ' | areaTxt = areaTxt..'\r\nAny Area Unique Drop is equally likely to be obtained after a successful pickpocket. ' | ||
areaTxt = areaTxt..'\r\nEach Area Unique Drop is rolled for separately, so it is possible to receive multiple Area Unique Drops from a single action. ' | |||
areaTxt = areaTxt..'The chance of receiving an Area Unique drop is tripled if the 95% Thieving Mastery Pool checkpoint is active.' | areaTxt = areaTxt..'The chance of receiving an Area Unique drop is tripled if the 95% Thieving Mastery Pool checkpoint is active.' | ||
Line 484: | Line 522: | ||
areaTxt = areaTxt..'!!Price!!colspan="2"|Chance' | areaTxt = areaTxt..'!!Price!!colspan="2"|Chance' | ||
local dropCount = Shared.tableCount(area.uniqueDrops) | local dropCount = Shared.tableCount(area.uniqueDrops) | ||
local dropLines = {} | local dropLines = {} | ||
for i, drop in pairs(area.uniqueDrops) do | for i, drop in pairs(area.uniqueDrops) do | ||
Line 491: | Line 528: | ||
lineTxt = lineTxt..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item'}) | lineTxt = lineTxt..'\r\n|-\r\n|'..Icons.Icon({thisItem.name, type='item'}) | ||
lineTxt = lineTxt..'||'..drop.qty..'||data-sort-value="'..thisItem.sellsFor..'"|'..Icons.GP(thisItem.sellsFor) | lineTxt = lineTxt..'||'..drop.qty..'||data-sort-value="'..thisItem.sellsFor..'"|'..Icons.GP(thisItem.sellsFor) | ||
lineTxt = lineTxt..'||style="text-align:right"|'..Shared.fraction( | lineTxt = lineTxt..'||style="text-align:right"|'..Shared.fraction(1, 1/(thievingAreaLootChance/100)) | ||
lineTxt = lineTxt..'||'..Shared.round( | lineTxt = lineTxt..'||'..Shared.round(thievingAreaLootChance, 2, 2)..'%' | ||
dropLines[thisItem.name] = lineTxt | dropLines[thisItem.name] = lineTxt | ||
end | end | ||
Line 499: | Line 536: | ||
end | end | ||
areaTxt = areaTxt..'\r\n|-class="sortbottom" \r\n!colspan="3"|Total:' | areaTxt = areaTxt..'\r\n|-class="sortbottom" \r\n!colspan="3"|Total:' | ||
areaTxt = areaTxt..'\r\n|style="text-align:right"|'..Shared.fraction(thievingAreaLootChance | areaTxt = areaTxt..'\r\n|style="text-align:right"|'..Shared.fraction(1, 1/(thievingAreaLootChance/100))..'||' | ||
areaTxt = areaTxt..'style="text-align:right"|'..Shared.round(thievingAreaLootChance, 2, 2)..'%' | areaTxt = areaTxt..'style="text-align:right"|'..Shared.round(thievingAreaLootChance, 2, 2)..'%' | ||
areaTxt = areaTxt..'\r\n|}' | areaTxt = areaTxt..'\r\n|}' | ||
Line 535: | Line 572: | ||
local result = '{| class="wikitable sortable stickyHeader"' | local result = '{| class="wikitable sortable stickyHeader"' | ||
result = result..'\r\n|- class="headerRow-0"' | result = result..'\r\n|- class="headerRow-0"' | ||
result = result..'\r\n!colspan="2"Name!!Area!!'..Icons.Icon({'Thieving', type='skill', notext=true})..' Level!!Experience!!Max Hit!!Perception!!Unique Drop' | result = result..'\r\n!colspan="2"|Name!!Area!!'..Icons.Icon({'Thieving', type='skill', notext=true})..' Level!!Experience!!Max Hit!!Perception!!GP!!Unique Drop' | ||
local npcArray = Shared.clone(SkillData.Thieving.NPCs) | local npcArray = Shared.clone(SkillData.Thieving.NPCs) | ||
table.sort(npcArray, function(a, b) return a.level < b.level end) | table.sort(npcArray, function(a, b) return a.level < b.level end) | ||
Line 541: | Line 578: | ||
result = result..'\r\n|-' | result = result..'\r\n|-' | ||
result = result..'\r\n|'..Icons.Icon({npc.name, type='thieving', size='50', notext=true}) | result = result..'\r\n|'..Icons.Icon({npc.name, type='thieving', size='50', notext=true}) | ||
result = result..'||'..Icons.Icon({npc.name, type='thieving', noicon=true}) | |||
local area = p.getThievingNPCArea(npc) | local area = p.getThievingNPCArea(npc) | ||
result = result..'||'..area.name | result = result..'||'..area.name | ||
Line 552: | Line 586: | ||
result = result..'||style="text-align:right"|'..(npc.maxHit * 10) | result = result..'||style="text-align:right"|'..(npc.maxHit * 10) | ||
result = result..'||style="text-align:right"|'..npc.perception | result = result..'||style="text-align:right"|'..npc.perception | ||
result = result..'||data-sort-value="' .. npc.maxGP .. '"|'..Icons.GP(1, npc.maxGP) | |||
if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID > -1 then | if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID > -1 then | ||
local uniqueDrop = Items.getItemByID(npc.uniqueDrop.itemID) | local uniqueDrop = Items.getItemByID(npc.uniqueDrop.itemID) | ||
Line 565: | Line 600: | ||
result = result..'\r\n|}' | result = result..'\r\n|}' | ||
return result | |||
end | |||
function p.getThievingAreaTable(frame) | |||
local resultPart = {} | |||
table.insert(resultPart, '{| class="wikitable sortable stickyHeader"') | |||
table.insert(resultPart, '\r\n|- class="headerRow-0"') | |||
table.insert(resultPart, '\r\n!Area!!'..Icons.Icon({'Thieving', type='skill', notext=true})..' Level!!NPCs!!Unique Drops') | |||
local areaArray = Shared.clone(SkillData.Thieving.Areas) | |||
table.sort(areaArray, function(a, b) return a.id < b.id end) | |||
for i, area in ipairs(areaArray) do | |||
local minLevel, npcList, areaItemList = nil, {}, {} | |||
-- Build NPC list & determine level for area, this is the minimum | |||
-- Thieving level required for all NPCs within that area | |||
if area.npcs ~= nil and Shared.tableCount(area.npcs) > 0 then | |||
for j, npcID in ipairs(area.npcs) do | |||
-- Don't bother cloning the NPC below since we aren't modifying any part of it | |||
local npc = SkillData.Thieving.NPCs[npcID + 1] | |||
if minLevel == nil or npc.level < minLevel then | |||
minLevel = npc.level | |||
end | |||
table.insert(npcList, Icons.Icon({npc.name, type='thieving'})) | |||
end | |||
else | |||
table.insert(npcList, '') | |||
end | |||
-- Build area unique item list | |||
if area.uniqueDrops ~= nil and Shared.tableCount(area.uniqueDrops) > 0 then | |||
for k, drop in ipairs(area.uniqueDrops) do | |||
local areaItem = Items.getItemByID(drop.itemID) | |||
if areaItem == nil then | |||
table.insert(areaItemList, 'Unknown[[Category:Pages with script errors]]') | |||
else | |||
local iconDef = {areaItem.name, type='item'} | |||
if drop.qty > 1 then | |||
iconDef.qty = drop.qty | |||
end | |||
table.insert(areaItemList, Icons.Icon(iconDef)) | |||
end | |||
end | |||
else | |||
table.insert(areaItemList, '') | |||
end | |||
-- Generate table row | |||
table.insert(resultPart, '\r\n|-') | |||
table.insert(resultPart, '\r\n|' .. area.name) | |||
table.insert(resultPart, '\r\n|' .. Icons._SkillReq('Thieving', minLevel)) | |||
table.insert(resultPart, '\r\n|' .. table.concat(npcList, '<br/>')) | |||
table.insert(resultPart, '\r\n|' .. table.concat(areaItemList, '<br/>')) | |||
end | |||
table.insert(resultPart, '\r\n|}') | |||
return table.concat(resultPart) | |||
end | |||
function p.getThievingSourcesForItem(itemID) | |||
local resultArray = {} | |||
local areaNPCs = {} | |||
--First check area unique drops | |||
--If an area drops the item, add all the NPC ids to the list so we can add them later | |||
if not result then | |||
for i, area in pairs(SkillData.Thieving.Areas) do | |||
for j, drop in pairs(area.uniqueDrops) do | |||
if drop.itemID == itemID then | |||
for k, npcID in pairs(area.npcs) do | |||
areaNPCs[npcID] = drop.qty | |||
end | |||
break | |||
end | |||
end | |||
end | |||
end | |||
--Now go through and get drop chances on each NPC if needed | |||
for i, npc in pairs(SkillData.Thieving.NPCs) do | |||
local totalWt = 0 | |||
local dropWt = 0 | |||
local dropQty = 0 | |||
for j, drop in pairs(npc.lootTable) do | |||
totalWt = totalWt + drop[2] | |||
if drop[1] == itemID then | |||
dropWt = drop[2] | |||
dropQty = drop[3] | |||
end | |||
end | |||
if dropWt > 0 then | |||
table.insert(resultArray, {npc = npc.name, minQty = 1, maxQty = dropQty, wt = dropWt * thievingNormalLootChance, totalWt = totalWt * 100, level = npc.level}) | |||
end | |||
--Chance of -1 on unique drops is to indicate variable chance | |||
if npc.uniqueDrop ~= nil and npc.uniqueDrop.itemID == itemID then | |||
table.insert(resultArray, {npc = npc.name, minQty = npc.uniqueDrop.qty, maxQty = npc.uniqueDrop.qty, wt = -1, totalWt = -1, level = npc.level}) | |||
end | |||
if areaNPCs[npc.id] ~= nil then | |||
table.insert(resultArray, {npc = npc.name, minQty = areaNPCs[npc.id], maxQty = areaNPCs[npc.id], wt = thievingAreaLootChance, totalWt = 100, level = npc.level}) | |||
end | |||
end | |||
for i, drop in pairs(SkillData.Thieving.RareItems) do | |||
if drop.itemID == itemID then | |||
table.insert(resultArray, {npc = 'all', minQty = 1, maxQty = 1, wt = 1, totalWt = Shared.round2(1/(drop.chance/100), 0), level = 1}) | |||
end | |||
end | |||
return resultArray | |||
end | |||
-- For a given constellation cons and modifier value modValue, generates and returns | |||
-- a table of modifiers, much like any other item/object elsewhere in the game. | |||
-- includeStandard: true|false, determines whether standard modifiers are included | |||
-- includeUnique: true|false, determines whether unique modifiers are included | |||
-- isDistinct: true|false, if true, the returned list of modifiers is de-duplicated | |||
-- asKeyValue: true|false, if true, returns key/value pairs like usual modifier objects | |||
function p._buildAstrologyModifierArray(cons, modValue, includeStandard, includeUnique, isDistinct, asKeyValue) | |||
-- Temporary function to determine if the table already contains a given modifier | |||
local containsMod = function(modList, modNew) | |||
for i, modItem in ipairs(modList) do | |||
-- Check mod names & value data types both equal | |||
if modItem[1] == modNew[1] and type(modItem[2]) == type(modNew[2]) then | |||
if type(modItem[2]) == 'table' then | |||
if Shared.tablesEqual(modItem[2], modNew[2]) then | |||
return true | |||
end | |||
elseif modItem[2] == modNew[2] then | |||
return true | |||
end | |||
end | |||
end | |||
return false | |||
end | |||
local addToArray = function(modArray, modNew) | |||
if not isDistinct or (isDistinct and not containsMod(modArray, modNew)) then | |||
table.insert(modArray, modNew) | |||
end | |||
end | |||
local modArray = {} | |||
local isSkillMod = {} | |||
-- Standard modifiers | |||
if includeStandard then | |||
for i, skillMods in ipairs(cons.standardModifiers) do | |||
local skillID = cons.skills[i] | |||
if skillID ~= nil then | |||
for j, modName in ipairs(skillMods) do | |||
local modBaseName, modText, sign, isNegative, unsign, modBase = Constants.getModifierDetails(modName) | |||
-- Check if modifier varies by skill, and amend the modifier value accordingly | |||
local modVal = modValue | |||
if Shared.contains(modText, '{SV0}') then | |||
isSkillMod[modName] = true | |||
modVal = {skillID, modValue} | |||
end | |||
addToArray(modArray, {modName, modVal}) | |||
end | |||
end | |||
end | |||
end | |||
-- Unique modifiers | |||
if includeUnique then | |||
local skillArray = {} | |||
for i, skillID in ipairs(cons.skills) do | |||
table.insert(skillArray, SkillData.Skills[skillID + 1]) | |||
end | |||
for i, modName in ipairs(cons.uniqueModifiers) do | |||
-- The most important thing we're getting here is the modText and modBase | |||
-- modText lets us check if this is a per-skill modifier or not | |||
-- modBase lets us check .isSkill, which are modifiers that we only use for skills with Mastery | |||
local modBaseName, modText, sign, isNegative, unsign, modBase = Constants.getModifierDetails(modName) | |||
if Shared.contains(modText, '{SV0}') then | |||
isSkillMod[modName] = true | |||
-- Check which skills the current modifier can be used for | |||
for j, skillID in ipairs(cons.skills) do | |||
if not modBase.isSkill or (modBase.isSkill and skillArray[j].hasMastery) then | |||
addToArray(modArray, {modName, {skillID, modValue}}) | |||
end | |||
end | |||
else | |||
addToArray(modArray, {modName, modValue}) | |||
end | |||
end | |||
end | |||
if asKeyValue then | |||
local modArrayKV = {} | |||
for i, modDefn in ipairs(modArray) do | |||
local modName, modVal = modDefn[1], modDefn[2] | |||
local isSkill = isSkillMod[modName] | |||
if modArrayKV[modName] == nil then | |||
modArrayKV[modName] = (isSkill and { modVal } or modVal) | |||
elseif isSkill then | |||
table.insert(modArrayKV[modName], modVal) | |||
else | |||
modArrayKV[modName] = modArrayKV[modName] + modVal | |||
end | |||
end | |||
return modArrayKV | |||
else | |||
return modArray | |||
end | |||
end | |||
function p._buildAstrologyConstellationTable() | |||
local maxModifier = 5 | |||
local result = '{|class="wikitable sortable stickyHeader"' | |||
result = result..'\r\n|- class="headerRow-0"' | |||
result = result..'\r\n!colspan="2"|Constellation!!'..Icons.Icon({"Astrology", type='skill', notext='true'})..' Level' | |||
result = result..'!!XP!!Skills!!Standard Modifiers!!Unique Modifiers' | |||
for i, cons in Shared.skpairs(SkillData.Astrology.Constellations) do | |||
local name = cons.name | |||
result = result..'\r\n|-' | |||
result = result..'\r\n|data-sort-value="'..name..'"|'..Icons.Icon({name, type='constellation', size='50', notext=true})..'||'..name | |||
result = result..'||'..cons.level..'||'..cons.provides.xp | |||
local skillIconArray = {} | |||
for j, skillID in ipairs(cons.skills) do | |||
table.insert(skillIconArray, Icons.Icon({Constants.getSkillName(skillID), type='skill'})) | |||
end | |||
result = result..'||'..table.concat(skillIconArray, '<br/>') | |||
local standModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, true, false, false, false) | |||
local standMods = {} | |||
--Building the list of Standard modifiers: | |||
for j, modifier in ipairs(standModsRaw) do | |||
table.insert(standMods, Constants._getModifierText(modifier[1], modifier[2], false)) | |||
end | |||
result = result..'|| '..table.concat(standMods, '<br/>') | |||
--Building the list of all Unique Modifiers | |||
local uModsRaw = p._buildAstrologyModifierArray(cons, maxModifier, false, true, false, false) | |||
local uMods = {} | |||
for j, modifier in ipairs(uModsRaw) do | |||
table.insert(uMods, Constants._getModifierText(modifier[1], modifier[2], false)) | |||
end | |||
result = result..'||'..table.concat(uMods, '<br/>') | |||
end | |||
result = result..'\r\n|}' | |||
return result | |||
end | |||
function p.buildAstrologyConstellationTable(frame) | |||
return p._buildAstrologyConstellationTable() | |||
end | |||
function p.buildAstrologyValueTable() | |||
local result = '{|class="wikitable sortable"' | |||
result = result..'\r\n!rowspan="2"| Value!!colspan="2"| Chance' | |||
result = result..'\r\n|-\r\n! This Value!! This Value or Greater' | |||
local lastChance = 0 | |||
local cumulativeChance = 100 | |||
for i, chance in Shared.skpairs(SkillData.Astrology.Defaults.valueWeight) do | |||
local thisChance = (i == 5 and chance) or chance - lastChance | |||
result = result..'\r\n|-' | |||
result = result..'\r\n|style="text-align:right"| '..i | |||
result = result..'\r\n|style="text-align:right"| ' .. thisChance .. '%' | |||
result = result..'\r\n|style="text-align:right"| ' .. cumulativeChance .. '%' | |||
cumulativeChance = cumulativeChance - thisChance | |||
lastChance = chance | |||
end | |||
result = result..'\r\n|}' | |||
return result | return result | ||
end | end | ||
return p | return p |