RuneScape Wiki
mNo edit summary
mNo edit summary
Tag: sourceedit
 
(34 intermediate revisions by 7 users not shown)
Line 1: Line 1:
--
+
-- <pre>
 
-- Implements [[Template:Charm data]]
 
-- Implements [[Template:Charm data]]
 
--
 
--
Line 16: Line 16:
 
local args = frame:getParent().args
 
local args = frame:getParent().args
 
local view = string.lower(args.view or '')
 
local view = string.lower(args.view or '')
local monster = string.gsub( args.monster or '', '_+' , ' ' )
+
local monster = string.gsub(args.monster or '', '_' , ' ')
local log = args.log or monster..'/Charm log'
 
 
local charm_data = {
 
local charm_data = {
 
charms = tonumber(args.charms) or 1,
 
charms = tonumber(args.charms) or 1,
Line 26: Line 25:
 
blue = tonumber(args.blue) or 0,
 
blue = tonumber(args.blue) or 0,
 
rare = type(args.rare) == 'string',
 
rare = type(args.rare) == 'string',
  +
action = args.action,
 
}
 
}
 
max_charms = charm_data.kills * charm_data.charms
 
max_charms = charm_data.kills * charm_data.charms
Line 32: Line 32:
 
charm_data.crimson + charm_data.blue
 
charm_data.crimson + charm_data.blue
   
missed_charms = max_charms - charm_data.any
+
charm_data.none = max_charms - charm_data.any
charm_data.none = missed_charms / charm_data.charms
 
   
 
local function percent(...)
 
local function percent(...)
Line 58: Line 57:
 
missed_charms }
 
missed_charms }
   
return p._main(view,monster,log,charm_data)
+
return p._main(view,monster,charm_data)
 
end
 
end
   
function p._main(view,monster,log,data)
+
function p._main(view,monster,data)
 
local simple_returns = {
 
local simple_returns = {
 
kills = true,
 
kills = true,
Line 84: Line 83:
   
 
local min
 
local min
if rare then
+
if data.rare then
 
min = 15
 
min = 15
 
else
 
else
Line 91: Line 90:
   
 
local builder
 
local builder
local url = tostring(mw.uri.fullUrl(log,{
+
local url = tostring(mw.uri.fullUrl(mw.title.getCurrentTitle().fullText,{
action = 'edit',
+
action = 'view',
section = 'new',
 
preload = 'Template:Charm log submission preload',
 
editintro = 'CharmLogPreloadedUpdateGuide',
 
useeditor = 'mediawiki',
 
 
-- For User:Joeytje50/Dropadd.js to look for
 
-- For User:Joeytje50/Dropadd.js to look for
 
log_edit = 'true' }))
 
log_edit = 'true' }))
 
local pls_add
 
local pls_add
if #monster > 3 then
+
if #monster > 1 then
pls_add = '['..url..' Please add to the log.]<br>(Only if '..min..' or more creatures are killed)'
+
pls_add = '['..url..' Add data to the log] (requires JavaScript).'
 
else
 
else
 
pls_add = ''
 
pls_add = ''
 
end
 
end
   
if view == 'table' then
 
builder = mw.html.create('table')
 
:addClass('wikitable')
 
:css({ ['text-align'] = 'center',
 
margin = '0 2em' })
 
:tag('caption')
 
:wikitext('Charm drop percentages')
 
:done()
 
:tag('tr')
 
:tag('th')
 
:wikitext('None')
 
:done()
 
:tag('th')
 
:wikitext(images.gold)
 
:done()
 
:tag('th')
 
:wikitext(images.green)
 
:done()
 
:tag('th')
 
:wikitext(images.crimson)
 
:done()
 
:tag('th')
 
:wikitext(images.blue)
 
:done()
 
:done()
 
:tag('tr')
 
:tag('td')
 
:wikitext(data.nonepercent..'%')
 
:done()
 
:tag('td')
 
:wikitext(data.goldpercent..'%')
 
:done()
 
:tag('td')
 
:wikitext(data.greenpercent..'%')
 
:done()
 
:tag('td')
 
:wikitext(data.crimsonpercent..'%')
 
:done()
 
:tag('td')
 
:wikitext(data.bluepercent..'%')
 
:done()
 
:done()
 
:tag('tr')
 
:tag('td')
 
:attr('colspan','5')
 
:css({ ['font-size'] = 'smaller',
 
['text-align'] = 'left',
 
['line-height'] = '15px' })
 
:wikitext('Based on a sample of '..commas(data.kills)..' kills.<br>'..
 
data.charms..' '..plural(data.charms,'charm')..' '..
 
plural(data.charms,'is','are')..' dropped at a time.<br>'..
 
pls_add)
 
:done()
 
:done()
 
return builder
 
end
 
 
if view == 'raw' then
 
builder = mw.html.create('table')
 
:addClass('wikitable')
 
:addClass('charmtable')
 
:css({ ['text-align'] = 'center',
 
margin = '0 2em' })
 
 
:tag('caption')
 
:wikitext('Charm drop numbers')
 
:done()
 
:tag('tr')
 
:tag('th')
 
:wikitext('Total kills')
 
:done()
 
:tag('th')
 
:wikitext('No charm')
 
:done()
 
:tag('th')
 
:wikitext(images.gold)
 
:done()
 
:tag('th')
 
:wikitext(images.green)
 
:done()
 
:tag('th')
 
:wikitext(images.crimson)
 
:done()
 
:tag('th')
 
:wikitext(images.blue)
 
:done()
 
:done()
 
:tag('tr')
 
:tag('td')
 
:wikitext( commas(data.kills) )
 
:done()
 
:tag('td')
 
:wikitext( commas(data.none) )
 
:done()
 
:tag('td')
 
:wikitext( commas(data.gold) )
 
:done()
 
:tag('td')
 
:wikitext( commas(data.green) )
 
:done()
 
:tag('td')
 
:wikitext( commas(data.crimson) )
 
:done()
 
:tag('td')
 
:wikitext( commas(data.blue) )
 
:done()
 
:done()
 
:tag('tr')
 
:tag('td')
 
:attr('colspan','6')
 
:css({ ['font-size'] = 'smaller',
 
['text-align'] = 'left',
 
['line-height'] = '15px' })
 
:wikitext(data.charms..' '..plural(data.charms,'charm')..' '..
 
plural(data.charms,'is','are')..' dropped at a time')
 
:done()
 
:done()
 
return builder
 
end
 
 
--[=[ Make this mw.html eventually? ]=]
 
--[=[ Make this mw.html eventually? ]=]
 
if view == 'row' then
 
if view == 'row' then
Line 272: Line 148:
 
builder = mw.html.create('table')
 
builder = mw.html.create('table')
 
:addClass('wikitable')
 
:addClass('wikitable')
 
:addClass('charmtable')
:css({ ['text-align'] = 'center',
 
  +
:attr('data-monster', monster)
margin = '0 2em' })
 
 
:css({ ['text-align'] = 'center' })
 
:tag('caption')
 
:wikitext('Charm drop numbers')
 
:done()
 
 
:tag('tr')
 
:tag('tr')
 
:tag('th')
 
:tag('th')
Line 318: Line 191:
 
['text-align'] = 'left',
 
['text-align'] = 'left',
 
['line-height'] = '15px' })
 
['line-height'] = '15px' })
:wikitext('Represents a 90% confidence range.<br>'..
+
:wikitext('Represents a 90% confidence range based on a sample of '..commas(data.kills)..' '..(data.action or 'kills')..'.<br />'..
'Based on a sample of '..commas(data.kills)..' kills.<br>'..
+
data.charms..' '..plural(data.charms,'charm is','charms are')..' dropped at a time.<br />'..
data.charms..' '..plural(data.charms,'charm')..' '..
 
plural(data.charms,'is','are')..' dropped at a time.<br>'..
 
 
pls_add)
 
pls_add)
 
:done()
 
:done()
Line 329: Line 200:
 
return tostring(builder)..'[[Category:Monsters with too little charm data]]'
 
return tostring(builder)..'[[Category:Monsters with too little charm data]]'
 
elseif ns == 114 then
 
elseif ns == 114 then
  +
local properties = {
return tostring(builder)..'[[Category:Charm logs]]'
 
  +
'{{#set:',
  +
string.format('Gold charm percent=%s|',data.goldpercent),
  +
string.format('Green charm percent=%s|',data.greenpercent),
  +
string.format('Crimson charm percent=%s|',data.crimsonpercent),
  +
string.format('Blue charm percent=%s',data.bluepercent),
  +
'}}'
  +
}
 
return tostring(builder)..'[[Category:Charm logs]]'..mw.getCurrentFrame():preprocess(table.concat(properties,''))
 
else
 
else
 
return builder
 
return builder
Line 343: Line 222:
 
end
 
end
   
-- Wikipedia:Module:Math
+
-- From Wikipedia:Module:Math
 
function p._round(value, precision)
 
function p._round(value, precision)
 
local rescale = math.pow(10, precision or 0);
 
local rescale = math.pow(10, precision or 0);

Latest revision as of 04:42, 9 June 2017

Documentation for this module may be created at Module:Charm log/doc

-- <pre>
-- Implements [[Template:Charm data]]
--

local p = {}
local commas = require('Module:Addcommas')._add

local images = {
	gold = '[[File:Gold charm.png|link=Gold charm]]',
	green = '[[File:Green charm.png|link=Green charm]]',
	crimson = '[[File:Crimson charm.png|link=Crimson charm]]',
	blue = '[[File:Blue charm.png|link=Blue charm]]'
}

function p.main(frame)
	local args = frame:getParent().args
	local view = string.lower(args.view or '')
	local monster = string.gsub(args.monster or '', '_' , ' ')
	local charm_data = {
			charms = tonumber(args.charms) or 1,
			kills = tonumber(args.kills) or 0,
			gold = tonumber(args.gold) or 0,
			green = tonumber(args.green) or 0,
			crimson = tonumber(args.crimson) or 0,
			blue = tonumber(args.blue) or 0,
			rare = type(args.rare) == 'string',
			action = args.action,
		}
	max_charms = charm_data.kills * charm_data.charms

	charm_data.any = charm_data.gold + charm_data.green +
				charm_data.crimson + charm_data.blue

	charm_data.none = max_charms - charm_data.any

	local function percent(...)
		local ret = {}
		for _, v in ipairs(...) do
			if kills == 0 then
				table.insert(ret,nil)
			else
				table.insert(ret,math.floor(100 * (v / max_charms ) ) )
			end
		end
		return unpack(ret)
	end
	charm_data.goldpercent,
	charm_data.greenpercent,
	charm_data.crimsonpercent,
	charm_data.bluepercent,
	charm_data.anypercent,
	charm_data.nonepercent = percent{ charm_data.gold,
					charm_data.green,
					charm_data.crimson,
					charm_data.blue,
					charm_data.any,
					missed_charms }

	return p._main(view,monster,charm_data)
end

function p._main(view,monster,data)
	local simple_returns = {
		kills = true,
		charms = true,
		gold = true,
		green = true,
		crimson = true,
		blue = true,
		any = true,
		none = true,
		goldpercent = true,
		greenpercent = true,
		crimsonpercent = true,
		bluepercent = true,
		anypercent = true,
		nonepercent = true
	}

	if simple_returns[view] then
		return data[view]
	end

	local min
	if data.rare then
		min = 15
	else
		min = 50
	end

	local builder
	local url = tostring(mw.uri.fullUrl(mw.title.getCurrentTitle().fullText,{
				action = 'view',
				-- For User:Joeytje50/Dropadd.js to look for
				log_edit = 'true' }))
	local pls_add
	if #monster > 1 then
		pls_add = '['..url..' Add data to the log] (requires JavaScript).'
	else
		pls_add = ''
	end

	--[=[ Make this mw.html eventually? ]=]
	if view == 'row' then
		local ret_row = '\n|-'..
			'\n| [['..monster..']]'..
			'\n| '..commas(data.kills)..
			'\n| '..data.charms..
			'\n| '..data.goldpercent..'%'..
			'\n| '..data.greenpercent..'%'..
			'\n| '..data.crimsonpercent..'%'..
			'\n| '..data.bluepercent..'%'..
			'\n|-\n'
		return ret_row
	end

	--[[
		If not any other return
					--]]
	local function conf_range(_c)
		if data.kills == 0 then
			return 0
		end
		_c = _c / data.charms
		local _z = 1.64485
		local zsq = _z * _z
		local _p = _c / data.kills
		local n1 = 2 * data.kills * _p + zsq
		local n2 = _z * math.sqrt( zsq + (4 * data.kills * _p * ( 1 - _p) ) )
		local _d = 2 * ( data.kills + zsq )
		local _l = ( 100 / _d ) * ( n1 - n2 )
		local _u = ( 100 / _d ) * ( n1 + n2 )
		local rnd
		if _l < 1 then
			rnd = 1
		else
			rnd = 0
		end
		local _lr = p._round(_l,rnd)
		local _ur = p._round(_u,rnd)
		if _lr == _ur then
			return _lr..'%'
		else
			return _lr..'–'.._ur..'%'
		end
	end

	builder = mw.html.create('table')
		:addClass('wikitable')
		:addClass('charmtable')
		:attr('data-monster', monster)
		:css({ ['text-align'] = 'center' })
	:tag('tr')
		:tag('th')
			:wikitext('No charm')
		:done()
		:tag('th')
			:wikitext(images.gold)
		:done()
		:tag('th')
			:wikitext(images.green)
		:done()
		:tag('th')
			:wikitext(images.crimson)
		:done()
		:tag('th')
			:wikitext(images.blue)
		:done()
	:done()
	:tag('tr')
		:tag('td')
			:wikitext( conf_range(data.none) )
		:done()
		:tag('td')
			:wikitext( conf_range(data.gold) )
		:done()
		:tag('td')
			:wikitext( conf_range(data.green) )
		:done()
		:tag('td')
			:wikitext( conf_range(data.crimson) )
		:done()
		:tag('td')
			:wikitext( conf_range(data.blue) )
		:done()
	:done()
	:tag('tr')
		:tag('td')
			:attr('colspan','5')
			:css({ ['font-size'] = 'smaller',
				['text-align'] = 'left',
				['line-height'] = '15px' })
			:wikitext('Represents a 90% confidence range based on a sample of '..commas(data.kills)..' '..(data.action or 'kills')..'.<br />'..
				data.charms..' '..plural(data.charms,'charm is','charms are')..' dropped at a time.<br />'..
				pls_add)
		:done()
	:done()
	local ns = mw.title.getCurrentTitle().namespace
	if ns == 0 and data.kills < 250 then
		return tostring(builder)..'[[Category:Monsters with too little charm data]]'
	elseif ns == 114 then
		local properties = {
				'{{#set:',
				string.format('Gold charm percent=%s|',data.goldpercent),
				string.format('Green charm percent=%s|',data.greenpercent),
				string.format('Crimson charm percent=%s|',data.crimsonpercent),
				string.format('Blue charm percent=%s',data.bluepercent),
				'}}'
		}
		return tostring(builder)..'[[Category:Charm logs]]'..mw.getCurrentFrame():preprocess(table.concat(properties,''))
	else
		return builder
	end
end

function plural(n,s,p)
	if n == 1 then
		return s
	else
		return p or s..'s'
	end
end

-- From Wikipedia:Module:Math
function p._round(value, precision)
	local rescale = math.pow(10, precision or 0);
	return math.floor(value * rescale + 0.5) / rescale;
end

return p