Editing Module:Rates/Sandbox

From Ephinea PSO Wiki
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 can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

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 =
{
  [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)
function p.displayRate(frame)
  -- Separate the format (strings) from the rates (numbers passed in as strings).
   local rate = tonumber(frame.args[1])
  local fmt = frame.args[1]
   return rate
   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
end


return p
return p
-- </nowiki>
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)