Editing Module:Sandbox/User:Artoire/1

Jump to navigation Jump to search
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
--[[
mw.log(p._main{
current_xp = 24,
target_xp = 37,
ingot = 'Coarse Deathstone (Etched)',
profession = 'Stonemason', -- 'Bonewright'/'Stonemason'/'Blacksmith'
ore_buy = 'true',
pole_buy = 'none', -- 'none'/'logs'/'pole'
})
]]

require('strict')
require('strict')
require('Module:Mw.html extension')
local persistant = require('Module:Break Isolation').get_module_store('Module:Location Table')
local xp = require('Module:Experience')
local parse = require('Module:Param Parse')
local currency = require('Module:Currency')
local edit = 'Unknown <span class="small plainlinks">' .. require('Module:Edit button')() .. '</span>'
local lang = mw.language.getContentLanguage()


persistant.counter = persistant.counter or 0
local _ingots = {}
local function lookup_ingots(profession)
if _ingots[profession] then
return _ingots[profession]
end
_ingots[profession] = {
recipes = {},
order = {}
}
for _, result in ipairs(mw.smw.ask{
({
Blacksmith = '[[Uses facility::Goblin Smelter||Gnome Smelter]]',
Stonemason = '[[Uses facility::T.E.A. Machine]]',
Bonewright = '[[Uses facility::B.R.E.W.S. Vat]]'
})[profession],
['?Recipe JSON'] = '',
mainlabel = '-',
sort = 'Profession Level A',
limit = '500'
}) do
result = mw.text.jsonDecode(result[1])
local ingot = result.output[1].name
_ingots[profession].recipes[ingot] = {
xp = result.xp,
facility = result.facility,
ingot = result.output[1].name,
ore = result.materials[1].name,
level = result.level
}
table.insert(_ingots[profession].order, ingot)
end
return _ingots[profession]
end


local p = {}
local function lookup_weapons(profession)

local ingots = lookup_ingots(profession)
function p.head(frame)
local weapons = {}
local args = frame.args
for _, result in ipairs(mw.smw.ask{
assert(not persistant.in_table, 'Second {{LocTableHead}} (Missing {{LocTableBottom}}?)')
({
persistant.in_table = true
Blacksmith = '[[Uses facility::Goblin Forge||Gnome Forge]]',
persistant.json = {}
Stonemason = '[[Category:Stonemason]][[Category:Pages with recipes]][[Uses facility::!T.E.A. Machine]]',
persistant.version = args.version
Bonewright = '[[Category:Bonewright]][[Category:Pages with recipes]][[Uses facility::!B.R.E.W.S. Vat]]'
persistant.location_object = mw.title.getCurrentTitle().fullText
})[profession],
if args.version then
['?Recipe JSON'] = '',
persistant.location_object = persistant.location_object .. '#' .. args.version
mainlabel = '-',
sort = 'Profession Level A',
limit = '500'
}) do
local lvl = result['Profession Level A']
result = mw.text.jsonDecode(result[1])
if not result.passive and result.profession == profession then
local ingot
local pole
for _, material in ipairs(result.materials) do
if ingots.recipes[material.name] then
assert(not ingot)
ingot = material
else
assert(not pole)
pole = material
end
end
weapons[ingot.name] = weapons[ingot.name] or {}
table.insert(weapons[ingot.name], {
facility = result.facility,
level = result.level,
ingot = ingot,
pole = pole,
name = result.output[1].name,
xp = result.xp
})
end
end
end
return weapons
end
end


local function _lookup_price_uncached(item)
function p.line(frame)
assert(persistant.in_table, '{{LocLine}} when not in a location table (Missing {{LocTableHead}}?)')
local result = mw.smw.ask{
local args = frame.args
('[[Sold item::%s]]'):format(item),
local loc = args.loc
['?Shop buy price'] = 'buy',
local qty = args.quantity
['?Shop sell price'] = 'sell',
qty = tonumber(qty or '')
mainlabel = '-'
persistant.json[loc] = qty or -1
}[1]
local loc_link = ('[[%s]]'):format(loc)
return {
local episode = mw.smw.ask{loc_link, '?Episode#=', 'mainlabel=-'}
buy = tonumber(result.buy),
episode = episode and episode[1][1]
sell = tonumber(result.sell)
}
end


persistant.counter = persistant.counter + 1
local _lookup_price_cache = {}
local id = 'LOC_' .. persistant.counter
local function lookup_price(item)
_lookup_price_cache[item] = _lookup_price_cache[item] or _lookup_price_uncached(item)
return _lookup_price_cache[item]
end


mw.smw.subobject({
local function _lookup_pole_uncached(pole)
['Location object'] = persistant.location_object,
local pole_data = mw.text.jsonDecode(mw.smw.ask{
['Located in'] = loc,
('[[%s]]'):format(pole),
['?Recipe JSON'] = '',
['Location quantity'] = qty or 'Unknown'
}, id)
mainlabel = '-'
}[1][1])
local post = pole_data.materials[1].name
local post_data = mw.text.jsonDecode(mw.smw.ask{
('[[%s]]'):format(post),
['?Recipe JSON'] = '',
mainlabel = '-'
}[1][1])
return {
level = pole_data.level,
pole = pole,
post = post,
log = post_data.materials[1].name
}
end


return mw.html.create('tr')
local _lookup_pole_cache = {}
:attr{ id = id }
local function lookup_pole(pole)
:tag('td'):wikitext(loc_link):done()
_lookup_pole_cache[pole] = _lookup_pole_cache[pole] or _lookup_pole_uncached(pole)
:tag('td'):wikitext(parse.episode_func(episode)):done()
return _lookup_pole_cache[pole]
:tag('td'):wikitext(qty or edit):done()
:done()
end
end


local function _lookup_ore_uncached(ore)
function p.bottom(frame)
assert(persistant.in_table, '{{LocTableBottom}} when not in a location table (Missing {{LocTableHead}}?)')
local data = mw.smw.ask{
('[[%s]]'):format(ore),
['?Profession Level A'] = '',
mainlabel = '-'
}[1]
return {
level = tonumber(data[1])
}
end


if persistant.version then
local _lookup_ore_cache = {}
mw.smw.subobject({ ['Location JSON'] = mw.text.jsonEncode(persistant.json) }, persistant.version)
local function lookup_ore(ore)
_lookup_ore_cache[ore] = _lookup_ore_cache[ore] or _lookup_ore_uncached(ore)
return _lookup_ore_cache[ore]
end

local function _lookup_log_uncached(log)
local data = mw.smw.ask{
('[[%s]]'):format(log),
['?Profession Level A'] = '',
mainlabel = '-'
}[1]
return {
level = tonumber(data[1])
}
end

local _lookup_log_cache = {}
local function lookup_log(log)
_lookup_log_cache[log] = _lookup_log_cache[log] or _lookup_log_uncached(log)
return _lookup_log_cache[log]
end

local p = {}

local p = {}

function p.ingots(frame)
return table.concat(lookup_ingots(frame.args.profession).order, ',')
end

function p.main(frame)
return p._main(frame:getParent().args)
end

function p._main(args)
local profession = args.profession

local current_xp = tonumber(args.current_xp) or 0
local current_lvl
if current_xp <= 500 then
current_lvl = current_xp
current_xp = xp._total_xp(current_lvl)
else
else
mw.smw.set{ ['Location JSON'] = mw.text.jsonEncode(persistant.json) }
current_lvl = xp._level_at(current_xp)
end

local target_xp = tonumber(args.target_xp) or 0
local target_lvl
if target_xp <= 500 then
target_lvl = target_xp
target_xp = xp._total_xp(target_lvl)
else
target_lvl = xp._level_at(target_xp)
end

local remaining_xp = target_xp - current_xp

local buying_ores = args.ore_buy ~= 'false'

local buying_poles = args.pole_buy
local chopping_logs = buying_poles == 'none'
local buying_logs = buying_poles == 'logs'
buying_poles = not (buying_logs or chopping_logs)

local ingot = lookup_ingots(profession).recipes[args.ingot]

local result = mw.html.create()

result:wikitext(('To get from %s xp (level %s) to %s xp (level %s) requires %s experience'):format(lang:formatNum(current_xp), current_lvl, lang:formatNum(target_xp), target_lvl, lang:formatNum(remaining_xp)))

local tbl = result:tag('table')
:addClass('wikitable sortable')

local function skillclickpic(profession)
return ('[[File:%s small icon.png|15px|link=%s|%s level]]'):format(profession, profession, profession)
end
local colspan = 23
if chopping_logs then
colspan = colspan + 1
end
if chopping_logs or buying_logs then
colspan = colspan + 3
end

tbl
:tag('tr')
:th(skillclickpic(({
Blacksmith = 'Miner',
Stonemason = 'Miner',
Bonewright = 'Gatherer'
})[profession])):done()
:th{ ({
Blacksmith = 'Ore',
Stonemason = 'Rock',
Bonewright = 'Bone'
})[profession], attr = { colspan = '3' } }:done()
:th{ ({
Blacksmith = 'Ingot',
Stonemason = 'Etched',
Bonewright = 'Brewed'
})[profession], attr = { colspan = '2' } }:done()
:IF(chopping_logs)
:th(skillclickpic('Woodcutter')):done()
:END()
:IF(chopping_logs or buying_logs)
:th{ 'Log', attr = { colspan = '3' } }:done()
:th(skillclickpic('Carpenter')):done()
:END()
:th{ 'Pole', attr = { colspan = '3' } }:done()
:th(skillclickpic(profession)):done()
:th{ 'Product', attr = { colspan = '3' } }:done()
:th{ 'Cost', attr = { colspan = '10' } }:done()
:done()

for _, weapon in ipairs(lookup_weapons(profession)[ingot.ingot]) do
if not ingot.xp then
tbl
:tr()
:td{
'Missing XP for preparing [[' .. ingot.ingot .. ']]; Please [' .. tostring(mw.uri.fullUrl(ingot.ingot, 'action=edit&section=1')) .. ' edit the page] to add the experience earned (after |exp =)',
attr = { colspan = colspan }
}
:done()
break
end
if not weapon.xp then
tbl
:tr()
:td{
'Missing XP for creating [[' .. weapon.name .. ']]; Please ['.. tostring(mw.uri.fullUrl(weapon.name, 'action=edit&section=1')) .. ' edit the page] to add the experience earned (after |exp =)',
attr = { colspan = colspan }
}
:done()
else
local xp_per = weapon.xp + ingot.xp * weapon.ingot.quantity
local needed = math.ceil(remaining_xp / xp_per)

local needed_ores = needed * weapon.ingot.quantity
local row = tbl
:tag('tr')
:td(lookup_ore(ingot.ore).level):done()
:td{ needed_ores .. '&times;', css = { ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right', ['data-sort-value'] = needed_ores } }:done()
:td{ ('[[File:%s.png|link=%s|30px]]'):format(ingot.ore, ingot.ore), css = { ['border-left'] = '0', ['padding-left'] = '0' }, addClass = 'plinkt-image no-border' }:done()
:td{ '[[' .. ingot.ore .. ']]', addClass = 'plinkt-link no-border' }:done()
:td{ ('[[File:%s.png|link=%s|30px]]'):format(ingot.ingot, ingot.ingot), css = { ['border-left'] = '0', ['padding-left'] = '0' }, addClass = 'plinkt-image no-border', ['data-sort-value'] = needed_ores }:done()
:td{ '[[' .. ingot.ingot .. ']]', addClass = 'plinkt-link no-border' }:done()

local pole_info
local needed_logs, needed_poles

if weapon.pole then
needed_poles = needed * weapon.pole.quantity
if chopping_logs or buying_logs then
pole_info = lookup_pole(weapon.pole.name)
needed_logs = math.ceil(needed_poles / 2)
end
if chopping_logs then
row
:td(lookup_log(pole_info.log).level):done()
end
if chopping_logs or buying_logs then
row
:td{ needed_logs .. '&times;', css = { ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right' }, attr = { ['data-sort-value'] = needed_logs } }:done()
:td{ ('[[File:%s.png|link=%s|30px]]'):format(pole_info.log, pole_info.log), css = { ['border-left'] = '0', ['padding-left'] = '0' }, addClass = 'plinkt-image no-border' }:done()
:td{ '[[' .. pole_info.log .. ']]', addClass = 'plinkt-link no-border' }:done()
:td(pole_info.level):done()
end

row
:td{ needed_poles .. '&times;', css = { ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right' }, attr = { ['data-sort-value'] = needed_poles } }:done()
:td{ ('[[File:%s.png|link=%s|30px]]'):format(weapon.pole.name, weapon.pole.name), css = { ['border-left'] = '0', ['padding-left'] = '0' }, addClass = 'plinkt-image no-border' }:done()
:td{ '[[' .. weapon.pole.name .. ']]', addClass = 'plinkt-link no-border' }:done()
else
if chopping_logs then
row
:na()
end
if chopping_logs or buying_logs then
row
:td{ '<small>N/A</small>', addClass = 'table-na', attr = { ['data-sort-value'] = '0', colspan = '3' } }:done()
:na()
end
row
:td{ '<small>N/A</small>', addClass = 'table-na', attr = { ['data-sort-value'] = '0', colspan = '3' } }:done()
end

row
:td(weapon.level)
:td{ needed .. '&times;', css = { ['border-right'] = '0', ['padding-right'] = '0', ['text-align'] = 'right' }, attr = { ['data-sort-value'] = needed } }:done()
:td{ ('[[File:%s.png|link=%s|30px]]'):format(weapon.name, weapon.name), css = { ['border-left'] = '0', ['padding-left'] = '0' }, addClass = 'plinkt-image no-border' }:done()
:td{ '[[' .. weapon.name .. ']]', addClass = 'plinkt-link no-border' }

local cost = needed_ores * lookup_price(ingot.ore)[buying_ores and 'buy' or 'sell']
if chopping_logs then
if needed_logs then
cost = cost + needed_logs * lookup_price(pole_info.log).sell
end
elseif buying_logs then
if needed_logs then
cost = cost + needed_logs * lookup_price(pole_info.log).buy
end
else
if weapon.pole then
cost = cost + needed_poles * lookup_price(weapon.pole.name).buy
end
end

row:node(currency._cell(cost, { html = 'yes' }))
end
end
end


persistant.in_table = nil
return result
persistant.json = nil
persistant.version = nil
persistant.location_object = nil
end
end


Please note that all contributions to Brighter Shores Wiki are considered to be released under the CC BY-NC-SA 3.0 (see Brighter Shores:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)
Preview page with this template

Template used on this page: