Anonymous
Not logged in
Talk
Contributions
Create account
Log in
Ephinea PSO Wiki
Search
Editing
Module:Rates/Sandbox
From Ephinea PSO Wiki
Namespaces
Module
Discussion
More
More
Page actions
Read
Edit source
History
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 appears to have already been undone.
Anti-spam check. Do
not
fill this in!
-- <nowiki> -- -- Formats drop rates and calculates two rates multiplied together (usually DAR and RDR) -- local p = {} -- Every DAR/RDR fraction between 1/2 and 1/1 local wholeFractions = { [0.9] = "9/10", [0.88] = "22/25", [0.875] = "7/8", [0.85] = "17/20", [0.7] = "7/10", [0.8] = "4/5", [0.6] = "3/5", [0.5625] = "9/16", [0.55] = "9/20", [0.50625] = "81/160", [0.5] = "1/2" } -- -- Multiply a DAR and RDR together. Any number works but it's basically just for those -- -- @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 -- -- 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 frac = {} -- If either number is a fraction, split it up into numerator and denominator -- 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 local num = frac[1] local den = frac[2] -- Turn rate into a number! rate = num / den if fmt == "f" then if wholeFractions[rate] == nil then if not digits then digits = 0 end -- 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 = out .. string.format("%s", string.format("1/%." .. digits .. "f", 1/rate)):gsub("%.?0+$", "") else out = out .. wholeFractions[rate] end return out elseif fmt == "p" then -- Display up to five decimal places. Cut zeroes off rate = string.format("%s%%", string.format("%f", string.format("%.5f", rate*100)):gsub("%.?0+$", "")) out = out .. rate return out end end -- -- Rate display accessed through #invoke. Display up to TWO rates plus their combination! -- -- @param frame {table} -- @return {string} -- function p.displayRate(frame) -- Separate the format (strings) from the rates (numbers passed in as strings). 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 if rate[1] == "0" or rate[2] == "0" then return nil end local out = "" if fmt == "f" then -- 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 return out end return p -- </nowiki>
Summary:
Please note that all contributions to Ephinea PSO Wiki are considered to be released under the CC BY-NC-SA 4.0 (see
Ephinea PSO Wiki: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)
Navigation
PSO BB Ephinea
Homepage
Forums
Discord
Navigation
Main page
Recent changes
Random page
Help
Items
Weapons
Frames
Barriers
Units
Mags
Techniques
Tools
Info
Classes
Monsters
Quests
Terminology
Price guide
Wiki tools
Wiki tools
Special pages
Page tools
Page tools
User page tools
More
What links here
Related changes
Page information
Page logs