From f620706ed76488a1eafb5f1a04d8d036f2319c0d Mon Sep 17 00:00:00 2001 From: LeopoldTal Date: Mon, 7 Dec 2020 13:06:54 +0100 Subject: [PATCH] Format all upgrade tiers as Roman numerals (#830) * format all upgrade tiers as Roman numerals * show upgrade tiers 50+ as Arabic numerals --- src/js/core/utils.js | 75 +++++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/src/js/core/utils.js b/src/js/core/utils.js index 50657841..6eed9c34 100644 --- a/src/js/core/utils.js +++ b/src/js/core/utils.js @@ -723,29 +723,8 @@ export function startFileChoose(acceptedType = ".bin") { }); } -const romanLiterals = [ - "0", // NULL - "I", - "II", - "III", - "IV", - "V", - "VI", - "VII", - "VIII", - "IX", - "X", - "XI", - "XII", - "XIII", - "XIV", - "XV", - "XVI", - "XVII", - "XVIII", - "XIX", - "XX", -]; +const MAX_ROMAN_NUMBER = 49; +const romanLiteralsCache = ["0"]; /** * @@ -754,8 +733,52 @@ const romanLiterals = [ */ export function getRomanNumber(number) { number = Math.max(0, Math.round(number)); - if (number < romanLiterals.length) { - return romanLiterals[number]; + if (romanLiteralsCache[number]) { + return romanLiteralsCache[number]; } - return String(number); + + if (number > MAX_ROMAN_NUMBER) { + return String(number); + } + + function formatDigit(digit, unit, quintuple, decuple) { + switch (digit) { + case 0: + return ""; + case 1: // I + return unit; + case 2: // II + return unit + unit; + case 3: // III + return unit + unit + unit; + case 4: // IV + return unit + quintuple; + case 9: // IX + return unit + decuple; + default: + // V, VI, VII, VIII + return quintuple + formatDigit(digit - 5, unit, quintuple, decuple); + } + } + + let thousands = Math.floor(number / 1000); + let thousandsPart = ""; + while (thousands > 0) { + thousandsPart += "M"; + thousands -= 1; + } + + const hundreds = Math.floor((number % 1000) / 100); + const hundredsPart = formatDigit(hundreds, "C", "D", "M"); + + const tens = Math.floor((number % 100) / 10); + const tensPart = formatDigit(tens, "X", "L", "C"); + + const units = number % 10; + const unitsPart = formatDigit(units, "I", "V", "X"); + + const formatted = thousandsPart + hundredsPart + tensPart + unitsPart; + + romanLiteralsCache[number] = formatted; + return formatted; }