update calculations for lucky levels (#1161)

* update calculations for lucky levels

* [pre-commit.ci] auto fixes from pre-commit.com hooks

for more information, see https://pre-commit.ci

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
This commit is contained in:
Grace Carr
2023-07-17 00:40:29 -07:00
committed by GitHub
parent 7269577009
commit 9f78e14bec
7 changed files with 177 additions and 28 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,82 @@
const SPECIAL_DIGIT = 7;
/**
* Count the number of 7s in any number
* @param {number} number The number to count sevens for
* @returns {number} The number of 7s in the provided number
*/
export function CountSevens(number) {
let localNumber = number;
let sevenCount = 0;
while (localNumber >= SPECIAL_DIGIT) {
if (localNumber % 10 === SPECIAL_DIGIT) sevenCount += 1;
localNumber = Math.floor(localNumber / 10);
}
return sevenCount;
}
/**
* Calculate the delta for the next number where the given digit is a 7
* @param {number} number The starting number to calculate the delta for
* @param {number} digitPlace 1 for ones place, 10 for tens place, 100 for hundreds place, etc
* @returns {number} The calculated delta
*/
export function CalculateSevenDelta(number, digitPlace) {
const target = SPECIAL_DIGIT * digitPlace;
const modulus = digitPlace * 10;
let delta = target - (number % modulus) + (number % digitPlace);
if (delta < 0) delta += modulus;
return delta;
}
/**
* This function calculates each of the next "lucky" prestige levels
* @param {number} currentLevel The user's prestige level, including levels earned since the last ascension
* @returns {{number}, {number}, {number}} luckyDigit, luckyNumber, luckyPayout The next eligible level for each upgrade
*/
export default function CalculateLuckyLevels(currentLevel) {
const result = {};
let localLevel = currentLevel;
let sevenCount = CountSevens(currentLevel);
if (sevenCount < 1) {
// find the next 7 for the ones digit
const delta = CalculateSevenDelta(localLevel, 1);
localLevel += delta;
sevenCount = CountSevens(localLevel);
}
result.luckyDigit = localLevel;
while (sevenCount < 2) {
// find the next 7 in the ones or tens digit
let delta = CalculateSevenDelta(localLevel, 1);
if (delta === 0) delta = CalculateSevenDelta(localLevel, 10);
localLevel += delta;
sevenCount = CountSevens(localLevel);
}
result.luckyNumber = localLevel;
let digitPlace = 1;
while (sevenCount < 4) {
// look for missing 7s in the ones, tens, hundreds, thousands digits
const delta = CalculateSevenDelta(localLevel, digitPlace);
if (delta === 0) {
digitPlace *= 10;
} else {
localLevel += delta;
sevenCount = CountSevens(localLevel);
}
}
result.luckyPayout = localLevel;
return result;
}

View File

@@ -37,6 +37,7 @@ import {
CacheWrinklersTotal, CacheWrinklersTotal,
} from '../../../Cache/VariablesAndData'; } from '../../../Cache/VariablesAndData';
import ResetBonus from '../../../Sim/SimulationEvents/ResetAscension'; import ResetBonus from '../../../Sim/SimulationEvents/ResetAscension';
import CalculateLuckyLevels from '../../HelperFunctions/CalculateLuckyLevels';
import GetCPS from '../../HelperFunctions/GetCPS'; import GetCPS from '../../HelperFunctions/GetCPS';
import GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank'; import GetWrinkConfigBank from '../../HelperFunctions/GetWrinkConfigBank';
import { ColourGreen, ColourRed, ColourTextPre } from '../../VariablesAndData'; import { ColourGreen, ColourRed, ColourTextPre } from '../../VariablesAndData';
@@ -606,46 +607,47 @@ export function PrestigeSection() {
const currentPrestige = Math.floor(Game.HowMuchPrestige(Game.cookiesReset)); const currentPrestige = Math.floor(Game.HowMuchPrestige(Game.cookiesReset));
const willHave = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned)); const willHave = Math.floor(Game.HowMuchPrestige(Game.cookiesReset + Game.cookiesEarned));
const willGet = willHave - currentPrestige; const willGet = willHave - currentPrestige;
const { luckyDigit, luckyNumber, luckyPayout } = CalculateLuckyLevels(willHave);
if (!Game.Has('Lucky digit')) { if (!Game.Has('Lucky digit')) {
let delta7 = 7 - (willHave % 10); const luckyDigitDelta = luckyDigit - willHave;
if (delta7 < 0) delta7 += 10; const luckyDigitReset = willGet + luckyDigitDelta;
const next7Reset = willGet + delta7; const fragLuckyDigit = document.createDocumentFragment();
const next7Total = willHave + delta7; fragLuckyDigit.appendChild(
const frag7 = document.createDocumentFragment();
frag7.appendChild(
document.createTextNode( document.createTextNode(
`${next7Total.toLocaleString()} / ${next7Reset.toLocaleString()} (+${delta7})`, `${luckyDigit.toLocaleString()} / ${luckyDigitReset.toLocaleString()} (+${luckyDigitDelta})`,
), ),
); );
section.appendChild(StatsListing('basic', 'Next "Lucky Digit" (total / reset)', frag7)); section.appendChild(
StatsListing('basic', 'Next "Lucky Digit" (total / reset)', fragLuckyDigit),
);
} }
if (!Game.Has('Lucky number')) { if (!Game.Has('Lucky number')) {
let delta777 = 777 - (willHave % 1000); const luckyNumberDelta = luckyNumber - willHave;
if (delta777 < 0) delta777 += 1000; const luckyNumberReset = willGet + luckyNumberDelta;
const next777Reset = willGet + delta777; const fragLuckyNumber = document.createDocumentFragment();
const next777Total = willHave + delta777; fragLuckyNumber.appendChild(
const frag777 = document.createDocumentFragment();
frag777.appendChild(
document.createTextNode( document.createTextNode(
`${next777Total.toLocaleString()} / ${next777Reset.toLocaleString()} (+${delta777})`, `${luckyNumber.toLocaleString()} / ${luckyNumberReset.toLocaleString()} (+${luckyNumberDelta})`,
), ),
); );
section.appendChild(StatsListing('basic', 'Next "Lucky Number" (total / reset)', frag777)); section.appendChild(
StatsListing('basic', 'Next "Lucky Number" (total / reset)', fragLuckyNumber),
);
} }
if (!Game.Has('Lucky payout')) { if (!Game.Has('Lucky payout')) {
let delta777777 = 777777 - (willHave % 1000000); const luckyPayoutDelta = luckyPayout - willHave;
if (delta777777 < 0) delta777777 += 1000000; const luckyPayoutReset = willGet + luckyPayoutDelta;
const next777777Reset = willGet + delta777777; const fragLuckyPayout = document.createDocumentFragment();
const next777777Total = willHave + delta777777; fragLuckyPayout.appendChild(
const frag777777 = document.createDocumentFragment();
frag777777.appendChild(
document.createTextNode( document.createTextNode(
`${next777777Total.toLocaleString()} / ${next777777Reset.toLocaleString()} (+${delta777777})`, `${luckyPayout.toLocaleString()} / ${luckyPayoutReset.toLocaleString()} (+${luckyPayoutDelta})`,
), ),
); );
section.appendChild(StatsListing('basic', 'Next "Lucky Payout" (total / reset)', frag777777)); section.appendChild(
StatsListing('basic', 'Next "Lucky Payout" (total / reset)', fragLuckyPayout),
);
} }
return section; return section;

View File

@@ -0,0 +1,65 @@
import { describe, it } from 'mocha';
import { expect } from 'chai';
import CalculateLuckyLevels, {
CalculateSevenDelta,
CountSevens,
} from '../../src/Disp/HelperFunctions/CalculateLuckyLevels';
describe('CountSevens', () => {
const examples = [
{ input: 1234567890, output: 1 },
{ input: 7777777777, output: 10 },
{ input: 1111111111, output: 0 },
{ input: 7897897897, output: 4 },
];
examples.forEach((example) => {
it(`Counts sevens in ${example.input}`, () => {
expect(CountSevens(example.input)).to.equal(example.output);
});
});
});
describe('CalculateSevenDelta', () => {
const examples = [
{ number: 123, digit: 1, output: 4 },
{ number: 123, digit: 10, output: 50 },
{ number: 123, digit: 100, output: 600 },
{ number: 123, digit: 1000, output: 7000 },
{ number: 7777, digit: 1, output: 0 },
{ number: 7777, digit: 10, output: 0 },
{ number: 7777, digit: 100, output: 0 },
{ number: 7777, digit: 1000, output: 0 },
{ number: 9999, digit: 1, output: 8 },
{ number: 9999, digit: 10, output: 80 },
{ number: 9999, digit: 100, output: 800 },
{ number: 9999, digit: 1000, output: 8000 },
];
examples.forEach((example) => {
it(`Calculates delta from ${example.number} to the next 7 in the ${example.digit}s digit`, () => {
expect(CalculateSevenDelta(example.number, example.digit)).to.equal(example.output);
});
});
});
describe('CalculateLuckyLevels', () => {
const examples = [
{ input: 0, luckyDigit: 7, luckyNumber: 77, luckyPayout: 7777 },
{ input: 123, luckyDigit: 127, luckyNumber: 177, luckyPayout: 7777 },
{ input: 77777, luckyDigit: 77777, luckyNumber: 77777, luckyPayout: 77777 },
{ input: 799999, luckyDigit: 799999, luckyNumber: 800077, luckyPayout: 807777 },
{ input: 999999, luckyDigit: 1000007, luckyNumber: 1000077, luckyPayout: 1007777 },
];
examples.forEach((example) => {
it(`Calculates the next lucky levels for the starting level ${example.input}`, () => {
expect(CalculateLuckyLevels(example.input)).to.deep.equal({
luckyDigit: example.luckyDigit,
luckyNumber: example.luckyNumber,
luckyPayout: example.luckyPayout,
});
});
});
});