Latest revision |
Your text |
Line 1: |
Line 1: |
| -- <nowiki>
| |
| --
| |
| -- Formats drop rates and calculates two rates multiplied together (usually DAR and RDR)
| |
| --
| |
|
| |
| local p = {} | | local p = {} |
|
| |
|
| -- Every DAR/RDR fraction between 1/2 and 1/1
| |
| local wholeFractions = | | local wholeFractions = |
| { | | { |
Line 13: |
Line 7: |
| [0.875] = "7/8", | | [0.875] = "7/8", |
| [0.85] = "17/20", | | [0.85] = "17/20", |
| [0.7] = "7/10",
| |
| [0.8] = "4/5", | | [0.8] = "4/5", |
| [0.6] = "3/5", | | [0.6] = "3/5", |
| [0.5625] = "9/16", | | [0.5625] = "9/16", |
| [0.55] = "9/20", | | [0.55] = "9/20", |
| [0.50625] = "81/160",
| |
| [0.5] = "1/2" | | [0.5] = "1/2" |
| } | | } |
|
| |
|
| --
| | function p.calcRate(dar, rdr) |
| -- Multiply a DAR and RDR together. Any number works but it's basically just for those
| | return dar*rdr |
| --
| |
| -- @param dar {number}
| |
| -- @param rdr {number}
| |
| -- @return {number}
| |
| --
| |
| local function calcRate(dar, rdr)
| |
| local mult = {} | |
| mult[1] = dar
| |
| mult[2] = rdr
| |
| -- Initialize numbers for string conversion
| |
| local frac = {}
| |
| frac[1] = {}
| |
| frac[2] = {}
| |
| -- If either number is a fraction, split it up into numerator and denominator
| |
| -- Thanks, Ender!
| |
| for i=1,2,1 do
| |
| for number in string.gmatch(mult[i], '([^/]+)') do
| |
| table.insert(frac[i], number)
| |
| end
| |
| -- If either number wasn't a fraction, fill 1 in for its denominator
| |
| if frac[i][2] == nil then
| |
| frac[i][2] = 1
| |
| end
| |
| end
| |
| return (frac[1][1]/frac[1][2])*(frac[2][1]/frac[2][2])
| |
| end | | end |
|
| |
|
| --
| | local function trimRate(rate, fmt, digits) |
| -- Number formatting. Pass in a number in either fraction, decimal, or whole format and convert it.
| |
| --
| |
| -- @param rate {string}
| |
| -- @param fmt {string} -- "f" for fraction, "p" for percent, "n" for both fraction and percent used in the Note template
| |
| -- @param digits {number} -- optional
| |
| -- @return {string}
| |
| --
| |
| local function fmtRate(rate, fmt, digits) | |
| local out = "" | | local out = "" |
| local frac = {}
| | if digits == nil then |
| -- If either number is a fraction, split it up into numerator and denominator
| | digits = 0 |
| -- Thanks, Ender!
| |
| for number in string.gmatch(rate, '([^/]+)') do
| |
| table.insert(frac, number)
| |
| end
| |
| -- If either number wasn't a fraction, fill 1 in for its denominator
| |
| if frac[2] == nil then | |
| frac[2] = 1 | |
| end | | end |
| local num = frac[1]
| |
| local den = frac[2]
| |
| -- Turn rate into a number!
| |
| rate = num / den
| |
| if fmt == "f" then | | if fmt == "f" then |
| if wholeFractions[rate] == nil then | | if rate < 10 then |
| if not digits then
| | digits = math.max(digits, 2) |
| digits = 0
| | elseif rate < 100 then |
| end
| | digits = math.max(digits, 1) |
| -- Set maximum number of decimal places
| |
| if 1/rate < 10 then
| |
| -- Displays with two places between 1.01 ~ 9.99
| |
| digits = math.max(digits, 2)
| |
| elseif 1/rate < 100 then
| |
| -- Displays with one place between 10.1 ~ 99.9
| |
| digits = math.max(digits, 1)
| |
| end
| |
| -- Even if we're displaying one or more decimal places, cut zeroes off
| |
| out = string.format("1/%." .. digits .. "f", 1/rate)
| |
| return out:gsub("%.0+$", "")
| |
| else | | else |
| out = wholeFractions[rate] | | digits = math.max(digits, 0) |
| end | | end |
| | out = out .. string.format("%f", string.format(" %." .. digits .. "f", rate)):gsub("%.?0+$", "") |
| return out | | return out |
| elseif fmt == "p" then | | elseif fmt == "p" then |
| -- Display up to five decimal places. Cut zeroes off | | rate = string.format("%f", string.format(" %.5f", rate)):gsub("%.?0+$", "") |
| out = string.format("%.5f", rate * 100)
| | out = out .. rate |
| if string.find(out, "%.") then
| | return out |
| out = string.gsub(out, "%.0+$", "")
| |
| end | |
| return string.format("%s%%", out) | |
| end | | end |
| end | | end |
|
| |
|
| --
| | function p.displayRate(rate, fmt, digits) |
| -- Rate display accessed through #invoke. Display up to TWO rates plus their combination!
| | local out = "" |
| --
| | if fmt == "f" then |
| -- @param frame {table}
| | if wholeFractions[rate] == nil then |
| -- @return {string}
| | out = out .. string.format("1/%s", trimRate(1/rate, "f", digits)) |
| --
| | else |
| function p.displayRate(frame) | | out = out .. wholeFractions[rate] |
| -- Separate the format (strings) from the rates (numbers passed in as strings).
| | end |
| local fmt = frame.args[1] | |
| local rate = {} | |
| rate[1] = frame.args[2]
| |
| if frame.args[3] == nil then
| |
| rate[2] = 1
| |
| else
| |
| rate[2] = frame.args[3]
| |
| end | | end |
| if rate[1] == "0" or rate[2] == "0" then | | if fmt == "p" then |
| return nil
| | out = out .. string.format("%s%%", trimRate(rate*100, "p")) |
| end | | end |
| local out = ""
| | if fmt == "n" then |
| if fmt == "f" then | | out = out .. displayRate(rate, "f", 2) .. " (" .. displayRate(rate, "p") .. ")" |
| -- Fraction
| |
| out = out .. fmtRate(rate[1], "f")
| |
| elseif fmt == "p" then
| |
| -- Percentage
| |
| out = out .. fmtRate(rate[1], "p")
| |
| elseif fmt == "n" then
| |
| -- Fraction with hover text showing first two input rates as Fraction (Percentage) | |
| local span = mw.html.create("span")
| |
| span
| |
| :addClass("more_info")
| |
| :attr("title", string.format("Drop Rate: %s (%s), Rare Rate: %s (%s)", fmtRate(rate[1], "f"), fmtRate(rate[1], "p"), fmtRate(rate[2], "f", 2), fmtRate(rate[2], "p")))
| |
| :css("border-bottom", "1px dotted")
| |
| :wikitext(string.format("%s", fmtRate(calcRate(rate[1], rate[2]), "f")))
| |
| --out = out .. fmtRate(rate, "f", 2) .. " (" .. fmtRate(rate, "p") .. ")"
| |
| return span:allDone()
| |
| end | | end |
| return out | | return out |
Line 146: |
Line 59: |
|
| |
|
| return p | | return p |
| -- </nowiki>
| |