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( |
+ | 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 |
||
− | + | 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 |
+ | return p._main(view,monster,charm_data) |
end |
end |
||
− | function p._main(view,monster |
+ | 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( |
+ | local url = tostring(mw.uri.fullUrl(mw.title.getCurrentTitle().fullText,{ |
− | action = ' |
+ | 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 > |
+ | if #monster > 1 then |
− | pls_add = '['..url..' |
+ | 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') |
||
⚫ | |||
⚫ | |||
− | 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') |
||
⚫ | |||
− | :css({ ['text-align'] = 'center', |
||
+ | :attr('data-monster', monster) |
||
− | margin = '0 2em' }) |
||
⚫ | |||
− | |||
− | :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 />'.. |
− | ' |
+ | 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 = { |
||
⚫ | |||
+ | '{{#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), |
||
+ | '}}' |
||
+ | } |
||
⚫ | |||
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