Módulo:Rune goldberg machine

De RuneScape Wiki
Ir para: navegação, pesquisa
Documentação do módulo
Esta documentação é transcluída de Módulo:Rune goldberg machine/doc. [editar] [atualizar]
Módulo:Rune goldberg machine's a função main é invocada por Predefinição:Máquina de Runas Goldberg.
Módulo:Rune goldberg machine requer Módulo:Moedas.
Módulo:Rune goldberg machine carrega dados de Módulo:GEPrices/data.

Módulo utilizado para prever o melhor tipo de runa a ser utilizado na Máquina de Runas Goldberg para se produzir cera vis.


-- <nowiki>
local p = {}
local coins = require('Módulo:Moedas')._amount
local prices = mw.loadData('Módulo:GEPrices/data')
local lang = mw.language.new('pt')

local slot3 = '<span class="textcolour link blue" style="color: #15f; font-style: italic; cursor: help; border-bottom: dotted 1px black;" title="O terceiro espaço é aleatório para todos os jogadores diariamente. O benefício da Capa de Criação de Runas pode dizer qual runa precisa ser utilizada.">Aleatória</span>'
local seconds_in_day = 24 * 60 * 60
local runedate_offset = 11745 + 6675 -- 11745 is 0 runedate, 6675 is day offset so pattern works
-- lookup tables
local order = {'Runa do sangue', 'Runa do ar', 'Runa da água', 'Runa da terra', 'Runa do fogo', 'Runa do pó', 'Runa da lava', 'Runa da névoa', 'Runa da lama', 'Runa da fumaça', 'Runa do vapor', 'Runa da mente', 'Runa corporal', 'Runa cósmica', 'Runa do caos', 'Runa da natureza', 'Runa da lei', 'Runa da morte', 'Runa astral', 'Runa da alma'}
local amounts = {350, 1000, 1000, 1000, 1000, 500, 500, 500, 300, 500, 500, 2000, 2000, 400, 500, 350, 300, 400, 300, 300}
local slot1 = {14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 19, 3, 2, 16, 15, 18, 17, 9, 8, 14, 13, 8, 7, 10, 9, 1, 19, 3, 2, 16, 15, 2, 1, 12, 11, 14, 13, 8, 7, 10}
local slot2a = {18, 15, 16, 13, 3, 3, 4, 17, 10, 7, 8, 5, 17, 14, 15, 12, 5, 18, 3, 19, 9, 6, 10, 4, 16, 13, 14, 11, 4, 1, 2, 18, 11, 5, 6, 6, 15, 12, 13, 10}
local slot2b = {5, 1, 16, 12, 8, 4, 19, 15, 8, 7, 19, 15, 11, 7, 3, 18, 14, 10, 3, 2, 14, 10, 6, 2, 17, 13, 9, 5, 17, 16, 9, 5, 1, 16, 12, 8, 4, 19, 12, 11}
local slot2c = {18, 12, 14, 5, 7, 1, 6, 16, 18, 12, 14, 8, 10, 4, 6, 19, 2, 15, 17, 8, 13, 7, 9, 19, 2, 15, 1, 11, 13, 7, 9, 3, 5, 18, 1, 14, 16, 10, 12, 3}

local function genRune(nkey)
	local name = order[nkey]
	local amt = amounts[nkey]
	local cost = prices[name] * amt
	
	return { name=name, amt=amt, cost=cost }
end

local function bestrune(offset)
	-- will work correctly from runedate 6635 to runedate ~7125, after which some values will be off by 3
	local offsetFromNow = tonumber(offset or 0) or 0
	local days_after_utc = math.floor(os.time() / seconds_in_day) + offsetFromNow
	local patternday = days_after_utc - runedate_offset
    local cycles = math.floor(patternday / 40)
    local daysin = (patternday % 40) + 1
    
	local slot1best = (slot1[daysin] + 14*cycles)%19 + 1
    local slot2best = {}
    slot2best[1] = (slot2a[daysin] + 4*cycles)%19 + 1
    slot2best[2] = (slot2b[daysin] + 18*cycles)%19 + 1
    slot2best[3] = (slot2c[daysin] + 9*cycles)%19 + 1
    for i,v in ipairs(slot2best) do
    	if v == slot1best then
    		if slot1best == 1 then
    			slot2best[i] = 20
    		elseif slot1best == 19 then
    			slot2best[i] = 1
    		else
    			slot2best[i] = v+1
    		end
    	end
    end
    
    local slot1 = genRune(slot1best)
    local slot2 = {}
    for _,v in ipairs(slot2best) do
    	table.insert(slot2, genRune(v))
    end
    
    local day = lang:formatDate( 'j M Y', '+ '..offsetFromNow..' days' )
    
    return {slot1, slot2, date=day}
end

local function plink(item)
	return string.format('[[File:%s.png|link=%s|35px]] [[%s]]', item, item, item)
end
local function formatLine(runes, fmat, ret)
	if fmat then
		if fmat == 'simple' then
			if ret then
				ret = ret .. string.format('\n\n%s; Espaço 1: %s;  Espaço 2: %s, %s, %s', runes.date, runes[1].name, runes[2][1].name, runes[2][2].name, runes[2][3].name)
			else
				ret = string.format('%s; Espaço 1: %s;  Espaço 2: %s, %s, %s', runes.date, runes[1].name, runes[2][1].name, runes[2][2].name, runes[2][3].name)
			end
		elseif fmat == 'prices' then
			if not ret then
				ret = mw.html.create('table')
				ret:addClass('wikitable')
					:tag('tr')
						:tag('th'):wikitext('Data'):attr('rowspan', 2):done()
						:tag('th'):wikitext('Espaço 1'):attr('colspan', 2):done()
						:tag('th'):wikitext('Espaço 2'):attr('colspan', 2):done()
						:tag('th'):wikitext('Espaço 3'):attr('rowspan', 2):done()
						:tag('th'):wikitext('Total'):attr('rowspan', 2):done()
					:tag('tr')
						:tag('th'):wikitext('Runa'):done()
						:tag('th'):wikitext('Preço'):done()
						:tag('th'):wikitext('Runa'):done()
						:tag('th'):wikitext('Preço'):done()
			end
			ret:tag('tr')
				:tag('td'):wikitext(runes.date):attr('rowspan', 3):done()
				:tag('td'):wikitext( plink(runes[1].name) ):attr('rowspan', 3):done()
				:tag('td'):wikitext( coins(runes[1].cost) ):attr('rowspan', 3):done()
				:tag('td'):wikitext( plink(runes[2][1].name) ):done()
				:tag('td'):wikitext( coins(runes[2][1].cost) ):done()
				:tag('td'):wikitext( slot3 ):attr('rowspan', 3):done()
				:tag('td'):wikitext( coins(runes[2][1].cost + runes[1].cost) ):done()
			:tag('tr')
				:tag('td'):wikitext( plink(runes[2][2].name) ):done()
				:tag('td'):wikitext( coins(runes[2][2].cost) ):done()
				:tag('td'):wikitext( coins(runes[2][2].cost + runes[1].cost) ):done()
			:tag('tr')
				:tag('td'):wikitext( plink(runes[2][3].name) ):done()
				:tag('td'):wikitext( coins(runes[2][3].cost) ):done()
				:tag('td'):wikitext( coins(runes[2][3].cost + runes[1].cost) ):done()
		else
			if not ret then
				ret = mw.html.create('table')
				ret:addClass('wikitable')
					:tag('tr')
						:tag('th'):wikitext('Data'):attr('rowspan', 2):done()
						:tag('th'):wikitext('Espaço 1'):attr('rowspan', 2):done()
						:tag('th'):wikitext('Espaço 2'):attr('colspan', 3):done()
						:tag('th'):wikitext('Espaço 3'):attr('rowspan', 2):done()
					:tag('tr')
						:tag('th'):wikitext('Opção 1'):done()
						:tag('th'):wikitext('Opção 2'):done()
						:tag('th'):wikitext('Opção 3'):done()
			end
			ret:tag('tr')
				:tag('td'):wikitext(runes.date):done()
				:tag('td'):wikitext( plink(runes[1].name) ):done()
				:tag('td'):wikitext( plink(runes[2][1].name) ):done()
				:tag('td'):wikitext( plink(runes[2][2].name) ):done()
				:tag('td'):wikitext( plink(runes[2][3].name) ):done()
				:tag('td'):wikitext( slot3 ):done()
		end
		return ret
	end
	return string.format('%s; Espaço 1: %s;  Espaço 2: %s, %s, %s', runes.date, runes[1].name, runes[2][1].name, runes[2][2].name, runes[2][3].name)
end
local function formatEnd(ret, fmat)
	if fmat == 'simple' then
		ret = ret .. '\n\nCombinações em colaboração com o servidor no Discord do Vis Wax FC'
	elseif fmat == 'prices' then
		ret:tag('tr')
			:tag('td'):attr({ colspan = 7, style = 'font-style: italic; text-align: center;' })
				:wikitext('Combinações em colaboração com o servidor no Discord do Vis Wax FC'):done()
	else
		ret:tag('tr')
			:tag('td'):attr({ colspan = 6, style = 'font-style: italic; text-align: center;' })
				:wikitext('Combinações em colaboração com o servidor no Discord do Vis Wax FC'):done()
	end
	return ret
end

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

function p._main(args)
	args = args or {}
	
	if args.number and tonumber(args.number) then
		return p._upcoming(args)
	end
	
	offset = tonumber(args.offset) or 0
	local runes = bestrune(offset)
	
	if args.format then
		local fmat = string.lower(args.format)
		ret = formatLine(runes, fmat)
		ret = formatEnd(ret, fmat)
	else
		ret = formatLine(runes, 'normal')
		ret = formatEnd(ret, 'normal')
	end
	
	return ret
end

function p._upcoming(args)
	local offset = tonumber(args.offset) or 0
	local number = tonumber(args.number) or 20
	local retObj = {}
	
	for i=offset,number+offset,1 do
		local runes = bestrune(i)
		table.insert(retObj, runes)
	end
	
	local fmat = 'normal'
	if args.format then
		fmat = string.lower(args.format)
	end
	local ret
	for _,v in ipairs(retObj) do
		ret = formatLine(v, fmat, ret)
	end
	ret = formatEnd(ret, fmat)
	
	return ret
end

function p.api(frame)
	local args = frame:getParent().args
	return p._api(args.offset, args.format)
end
function p._api(offset, format)
	offset = tonumber(offset or 0) or 0
	runes = bestrune(i)
	
	if format == 'simple' then
		return string.format('@%s¦¦%s¦%s¦%[email protected]', runes[1].name, runes[2][1].name, runes[2][2].name, runes[2][3].name)
	end
	if format == 'json' then
		local jsonret = {}
		jsonret['timestamp'] = os.time()
		jsonret['items'] = {
			['Data'] = runes.date,
			['Espaço 1'] = {
				{ name = runes[1].name, quantity = runes[1].amt, cost = runes[1].cost }
			},
			['Espaço 2'] = {
				{ name = runes[2][1].name, quantity = runes[2][1].amt, cost = runes[2][1].cost },
				{ name = runes[2][2].name, quantity = runes[2][2].amt, cost = runes[2][2].cost },
				{ name = runes[2][3].name, quantity = runes[2][3].amt, cost = runes[2][3].cost }
			}
		}
		return mw.text.jsonEncode(jsonret)
	end
	local ret = mw.html.create('div')
	ret	:tag('span'):addClass('Data')
			:wikitext(runes.date)
		:done()
		:tag('span'):addClass('slot1')
			:tag('span'):addClass('name'):wikitext(runes[1].name):done()
			:tag('span'):addClass('quantity'):wikitext(runes[1].amt):done()
			:tag('span'):addClass('preço'):wikitext(runes[1].cost):done()
		:done()
		:tag('span'):addClass('slot2')
			:tag('span'):addClass('runa1')
				:tag('span'):addClass('name'):wikitext(runes[2][1].name):done()
				:tag('span'):addClass('quantity'):wikitext(runes[2][1].amt):done()
				:tag('span'):addClass('preço'):wikitext(runes[2][1].cost):done()
			:done()
			:tag('span'):addClass('runa2')
				:tag('span'):addClass('name'):wikitext(runes[2][2].name):done()
				:tag('span'):addClass('quantity'):wikitext(runes[2][2].amt):done()
				:tag('span'):addClass('cost'):wikitext(runes[2][2].cost):done()
			:done()
			:tag('span'):addClass('runa3')
				:tag('span'):addClass('name'):wikitext(runes[2][3].name):done()
				:tag('span'):addClass('quantity'):wikitext(runes[2][3].amt):done()
				:tag('span'):addClass('cost'):wikitext(runes[2][3].cost):done()
			:done()
		:done()
	return ret	
end

return p