Editing Module:Rates

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 =
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>
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)