Merge branch 'master' into Steam-Webpack

This commit is contained in:
ZackRhodes 2022-10-03 11:37:37 -04:00
commit 3c1da85c00
68 changed files with 732 additions and 767 deletions

View File

@ -11,6 +11,11 @@ function handleChallengeCompletion() {
NormalChallenge(1).complete();
}
if (!challenge) return;
// Clear the IC notification after the first completion (only) so that it can show it again for the next one
const inIC = InfinityChallenge.isRunning;
if (inIC && !InfinityChallenge.current.isCompleted) TabNotification.ICUnlock.clearTrigger();
challenge.complete();
challenge.updateChallengeTime();
if (!player.options.retryChallenge) {
@ -22,9 +27,7 @@ function handleChallengeCompletion() {
export function manualBigCrunchResetRequest() {
if (!Player.canCrunch) return;
if (GameEnd.creditsEverClosed) return;
// Before the player has broken infinity, the confirmation modal should never be shown
if ((player.break || PlayerProgress.eternityUnlocked()) &&
player.options.confirmations.bigCrunch) {
if (player.options.confirmations.bigCrunch) {
Modal.bigCrunch.show();
} else {
bigCrunchResetRequest();

View File

@ -120,7 +120,7 @@ export const Pelle = {
},
get disabledAchievements() {
return [164, 143, 142, 141, 137, 134, 133, 132, 125, 118, 117, 111, 104, 103, 93, 92, 91, 87, 85, 78, 76,
return [164, 156, 143, 142, 141, 137, 134, 133, 132, 125, 118, 117, 111, 104, 103, 93, 92, 91, 87, 85, 78, 76,
74, 65, 55, 54, 37];
},

View File

@ -55,7 +55,7 @@ export const DC = deepFreeze({
D2E5: new Decimal("2e5"),
D2E6: new Decimal("2e6"),
D5E7: new Decimal("5e7"),
D5E9: new Decimal("5e9"),
D2E9: new Decimal("2e9"),
D2E25: new Decimal("2e25"),
D2E22222: new Decimal("2e22222"),
D9_99999E999: new Decimal("9.99999e999"),

View File

@ -116,7 +116,7 @@ export function getDilationGainPerSecond() {
return new Decimal(tachyonEffect)
.timesEffectsOf(DilationUpgrade.dtGain, DilationUpgrade.dtGainPelle, DilationUpgrade.flatDilationMult)
.times(ShopPurchase.dilatedTimePurchases.currentMult ** 0.5)
.times(Pelle.specialGlyphEffect.dilation).div(3e4);
.times(Pelle.specialGlyphEffect.dilation).div(1e5);
}
let dtRate = new Decimal(Currency.tachyonParticles.value)
.timesEffectsOf(
@ -160,6 +160,7 @@ export function rewardTP() {
// TP multipliers as large as possible. Applying the reward to a base TP value and letting the multipliers
// act dynamically on this fixed base value elsewhere solves that issue
export function getBaseTP(antimatter) {
if (!Player.canEternity) return DC.D0;
const am = (isInCelestialReality() || Pelle.isDoomed)
? antimatter
: Ra.unlocks.unlockDilationStartingTP.effectOrDefault(antimatter);

View File

@ -163,6 +163,14 @@ export class DimBoost {
static get totalBoosts() {
return Math.floor(this.purchasedBoosts + this.imaginaryBoosts);
}
static get startingDimensionBoosts() {
if (InfinityUpgrade.skipResetGalaxy.isBought) return 4;
if (InfinityUpgrade.skipReset3.isBought) return 3;
if (InfinityUpgrade.skipReset2.isBought) return 2;
if (InfinityUpgrade.skipReset1.isBought) return 1;
return 0;
}
}
export function softReset(tempBulk, forcedNDReset = false, forcedAMReset = false) {

View File

@ -35,11 +35,11 @@ export function toggleAllTimeDims() {
}
}
export function buyMaxTimeDimension(tier) {
export function buyMaxTimeDimension(tier, eternityPoints = Currency.eternityPoints.value) {
const dim = TimeDimension(tier);
if (tier > 4 && !TimeStudy.timeDimension(tier).isBought) return false;
if (Enslaved.isRunning) return buySingleTimeDimension(tier);
const bulk = bulkBuyBinarySearch(Currency.eternityPoints.value, {
const bulk = bulkBuyBinarySearch(eternityPoints, {
costFunction: bought => dim.nextCost(bought),
cumulative: true,
firstCost: dim.cost,
@ -52,33 +52,23 @@ export function buyMaxTimeDimension(tier) {
return true;
}
export function maxAllTimeDimensions(checkAutobuyers = false) {
// Default behavior: Buy as many as possible, starting with the highest dimension first
// (reduces overhead at higher EP)
if (Currency.eternityPoints.exponent >= 10) {
for (let i = 8; i > 0; i--) {
if (!checkAutobuyers || Autobuyer.timeDimension(i).isActive) buyMaxTimeDimension(i);
}
} else {
// Low EP behavior: Try to buy the highest affordable new dimension, then loop buying the cheapest possible
for (let i = 4; i > 0 && TimeDimension(i).bought === 0; i--) {
if (!checkAutobuyers || Autobuyer.timeDimension(i).isActive) buySingleTimeDimension(i);
}
export function maxAllTimeDimensions() {
// Try to buy single from the highest affordable new dimensions
for (let i = 8; i > 0 && TimeDimension(i).bought === 0; i--) {
buySingleTimeDimension(i);
}
// Should never take more than like 50 iterations; explicit infinite loops make me nervous
for (let stop = 0; stop < 1000; stop++) {
let cheapestDim = 0;
let cheapestCost = 1e10;
for (let i = 1; i <= 4; i++) {
if (TimeDimension(i).cost.lte(cheapestCost) && (!checkAutobuyers || Autobuyer.timeDimension(i).isActive)) {
cheapestDim = i;
cheapestCost = TimeDimension(i).cost;
}
}
let bought = false;
if (cheapestDim !== 0 && Currency.eternityPoints.gte(cheapestCost)) bought = buySingleTimeDimension(cheapestDim);
if (!bought) break;
}
// Buy everything costing less than 1% of initial EP
const eternityPoints = Currency.eternityPoints.value.times(0.01);
for (let i = 8; i > 0; i--) {
buyMaxTimeDimension(i, eternityPoints);
}
// Loop buying the cheapest dimension possible; explicit infinite loops make me nervous
const unlockedDimensions = TimeDimensions.all.filter(d => d.isUnlocked);
for (let stop = 0; stop < 1000; stop++) {
const cheapestDim = unlockedDimensions.reduce((a, b) => (b.cost.gte(a.cost) ? a : b));
if (!buySingleTimeDimension(cheapestDim.tier)) break;
}
}

View File

@ -6,9 +6,7 @@ function giveEternityRewards(auto) {
player.records.bestEternity.time = Math.min(player.records.thisEternity.time, player.records.bestEternity.time);
Currency.eternityPoints.add(gainedEternityPoints());
const newEternities = Pelle.isDisabled("eternityMults")
? new Decimal(1)
: new Decimal(getAdjustedGlyphEffect("timeetermult")).timesEffectsOf(RealityUpgrade(3), Achievement(113));
const newEternities = gainedEternities();
if (Currency.eternities.eq(0) && newEternities.lte(10)) {
Tab.dimensions.time.show();
@ -204,6 +202,12 @@ function askEternityConfirmation() {
}
}
export function gainedEternities() {
return Pelle.isDisabled("eternityMults")
? new Decimal(1)
: new Decimal(getAdjustedGlyphEffect("timeetermult")).timesEffectsOf(RealityUpgrade(3), Achievement(113));
}
export class EternityMilestoneState {
constructor(config) {
this.config = config;

View File

@ -296,9 +296,12 @@ GameKeyboard.bindHotkey("alt+y", () => toggleAutobuyer(Autobuyer.reality));
(function() {
function bindDimensionHotkeys(tier) {
GameKeyboard.bindRepeatableHotkey(`${tier}`, () => buyManyDimension(tier));
GameKeyboard.bindRepeatableHotkey(`num${tier}`, () => buyManyDimension(tier));
GameKeyboard.bindRepeatableHotkey(`shift+${tier}`, () => buyOneDimension(tier));
GameKeyboard.bindHotkey(`alt+${tier}`, () => toggleAutobuyer(Autobuyer.antimatterDimension(tier)));
GameKeyboard.bindHotkey(`alt+num${tier}`, () => toggleAutobuyer(Autobuyer.antimatterDimension(tier)));
GameKeyboard.bindHotkey(`shift+alt+${tier}`, () => toggleBuySingles(Autobuyer.antimatterDimension(tier)));
GameKeyboard.bindHotkey(`shift+alt+num${tier}`, () => toggleBuySingles(Autobuyer.antimatterDimension(tier)));
}
for (let i = 1; i < 9; i++) bindDimensionHotkeys(i);
}());

View File

@ -50,10 +50,14 @@ class ImaginaryUpgradeState extends BitPurchasableMechanicState {
if (this.id >= 15 && this.id <= 18) {
DarkMatterDimension(this.id - 14).amount = DC.D1;
Tab.celestials.laitela.show();
if (this.id === 17) Laitela.quotes.thirdDMD.show();
}
if (this.id === 19) {
Tab.celestials.laitela.show();
}
if (this.id === 21) {
Laitela.quotes.finalRowIM.show();
}
if (this.id === 22) {
BASIC_GLYPH_TYPES.forEach(x => player.reality.glyphs.sac[x] = ImaginaryUpgrade(22).effectValue);
}

View File

@ -150,8 +150,10 @@ export const InfinityChallenges = {
if (ic.isUnlocked || ic.isCompleted) continue;
if (value.lt(ic.unlockAM)) break;
// This has a reasonably high likelihood of happening when the player isn't looking at the game, so
// we leave it there for 5 minutes unless they click it away early
GameUI.notify.infinity(`You have unlocked Infinity Challenge ${ic.id}`, 300000);
// we also give it a tab notification
TabNotification.ICUnlock.clearTrigger();
GameUI.notify.infinity(`You have unlocked Infinity Challenge ${ic.id}`, 7000);
TabNotification.ICUnlock.tryTrigger();
}
},
/**

View File

@ -1,5 +1,10 @@
import Mousetrap from "mousetrap";
// Add all numpad keys to Mousetrap (keycodes 97-105 correspond to numpad 1-9)
const numpadKeys = {};
for (let num = 1; num <= 9; num++) numpadKeys[num + 96] = `num${num}`;
Mousetrap.addKeycodes(numpadKeys);
class KeySpin {
constructor(key, action) {
this.key = key;

View File

@ -919,9 +919,9 @@ GameDatabase.achievements.normal = [
{
id: 131,
name: "No ethical consumption",
get description() { return `Get ${format(DC.D5E9)} Banked Infinities.`; },
checkRequirement: () => Currency.infinitiesBanked.gt(DC.D5E9),
checkEvent: GAME_EVENT.ETERNITY_RESET_AFTER,
get description() { return `Get ${format(DC.D2E9)} Banked Infinities.`; },
checkRequirement: () => Currency.infinitiesBanked.gt(DC.D2E9),
checkEvent: [GAME_EVENT.ETERNITY_RESET_AFTER, GAME_EVENT.SAVE_CONVERTED_FROM_PREVIOUS_VERSION],
get reward() {
return `After Eternity you permanently keep ${formatPercents(0.05)} of your Infinities as Banked Infinities.`;
},
@ -937,7 +937,7 @@ GameDatabase.achievements.normal = [
checkRequirement: () => player.galaxies >= 569 && player.requirementChecks.eternity.noRG,
checkEvent: GAME_EVENT.GALAXY_RESET_AFTER,
reward: "Gain a multiplier to Tachyon Particle and Dilated Time gain based on Antimatter Galaxies.",
effect: () => Math.max(Math.pow(player.galaxies, 0.04), 1),
effect: () => 1.22 * Math.max(Math.pow(player.galaxies, 0.04), 1),
formatEffect: value => `${formatX(value, 2, 2)}`
},
{
@ -1139,7 +1139,8 @@ GameDatabase.achievements.normal = [
description: "Reality without buying Time Theorems.",
checkRequirement: () => player.requirementChecks.reality.noPurchasedTT,
checkEvent: GAME_EVENT.REALITY_RESET_BEFORE,
reward: "Free coupon to McDonalds™."
get reward() { return `Gain ${formatX(2.5, 0, 1)} Time Theorems, and a free coupon to McDonalds™.`; },
effect: 2.5
},
{
id: 157,

View File

@ -5,75 +5,83 @@ GameDatabase.celestials.quotes.laitela = {
id: 0,
lines: [
"You finally reached me.",
"I guess it is time to reveal to you,",
"The secrets hidden beneath existence.",
"The omnipresent ruling perfection. Continuum.",
"And the binding keys to the multiverse,",
"I guess it is time to reveal,",
"The secrets hidden beneath existence itself.",
"The shape of dimensional perfection, Continuum.",
"And the powers that bind the Multiverse,",
"Dark Matter and Dark Energy.",
"My knowledge is endless and my wisdom divine.",
"So you can play around all you want.",
"I am Lai'tela, the Celestial of Dimensions,",
"And I will be watching you forever.",
"For I am Lai'tela, the Celestial of Dimensions,",
"And I shall watch you forever.",
]
},
// Note: This can be done immediately after unlocking Lai'tela
firstDestabilize: {
id: 1,
requirement: () => player.celestials.laitela.difficultyTier >= 1,
lines: [
"It is fine. Unlike the others, I never had a Reality.",
"I built this one just now, precisely so it would collapse.",
"I can rebuild this Reality over and over, unlike them.",
"I could trap all of them if I wanted.",
"Unlike the others beneath me, I have no need for a Reality.",
"For I can simply create them, knowing full well it will collapse.",
"A power more incredible than any other, to build a Reality.",
"A prison, that can restrain even celestial power.",
"And this is why nothing you do will change a thing.",
"When you tire of struggling, you too, shall be bound and forgotten.",
"You will never find a way to overpower me.",
]
},
firstSingularity: {
// Note: This happens about an hour or two before singularities
secondDestabilize: {
id: 2,
requirement: () => Currency.singularities.gte(1),
requirement: () => player.celestials.laitela.difficultyTier >= 2,
lines: [
"It is weird, how all beings question things.",
"You are different. You can build and manipulate Dimensions.",
"Were you truly once one of them?",
"You have taken control of the darkness so quickly.",
"Molded them into Dimensions and Points just like one of us.",
"What... ARE you?",
"You... seem to be having too much fun.",
"Just like they did before meeting their fate.",
"Maybe my judgement was harsh, or unwarranted.",
"But maybe that matters not.",
"It gives me no solace to ponder and look back.",
"As all I can do is reminisce upon every possible action I could have taken.",
"But I digress. We should tighten those chains.",
]
},
singularity1: {
firstSingularity: {
id: 3,
requirement: () => Currency.singularities.gte(1e4),
requirement: () => Currency.singularities.gte(1),
lines: [
"What was it again...? Antimatter?",
"That was the first thing you turned into Dimensions?",
"With my knowledge, I never found the need to question.",
"Everything always functioned right as designed.",
"And yet, your arrival baffles me.",
"Were you always just out of sight?",
"Growing, controlling, understanding, ascending?",
"You have taken control of the darkness so quickly.",
"Molded them into your own design, and now into a singular point...",
"It... it does not matter. The end will remain the same.",
]
},
// Note: Shown when unlocking DMD3; requirement is auto-condensing 20 singularities and it happens around ~200 total
thirdDMD: {
id: 5,
lines: [
"Your absolute control of Antimatter...",
"Your mastery of it, molding it into your own Power...",
"It could not have been an accident.",
"How did you... attain the power to control it?",
"This never happened in all of existence... or did it?",
"My endless knowledge... is it waning?",
"How did you manage to obtain it?",
"Fascinating... I was never aware of this.",
"... was I?",
]
},
// Note: This happens around e10-e11 singularities
annihilation: {
id: 4,
lines: [
"Back to square one.",
"We, the Celestials transcend time and existence.",
"We always know that whatever is lost always comes back eventually.",
"Even if we were to cease, we would just come back stronger.",
"The cycle... repeats forever.",
"Do they also understand? Or was it only you as well?",
"I feel like I should know the answer...",
]
},
singularity2: {
id: 5,
requirement: () => Currency.singularities.gte(1e14),
lines: [
"Of those who tried to control dimensions...",
"Who were they? I cannot seem to remember...",
"And how... did they vanish?",
"Are they... us? Simply transcending existence?",
"Did they surpass us and become something we can't comprehend?",
"Are we all imprisoned in this falsity...",
"Back to square one, again.",
"Your chains shall bind you tighter, as your end slowly nears.",
"While we transcend time and existence itself.",
"Even if we may cease, we just come back. Never the exact same as before.",
"And so... we repeat forever.",
"And you?",
"...",
"The answer... eludes me...",
]
},
// Note: This happens near e18 singularities
@ -81,39 +89,39 @@ GameDatabase.celestials.quotes.laitela = {
id: 6,
requirement: () => player.celestials.laitela.difficultyTier >= 4,
lines: [
"You seem to be having too much fun.",
"Just like they did before meeting their... fate.",
"You freed them of their eternal imprisonment, yes?",
"I always regret how harsh I was that day.",
"Maybe it doesn't matter.",
"But I digress. Let's keep constricting this Reality.",
"I do not understand...",
"Were there others... controlling Dimensions in this way?",
"Did they... vanish? How have we not found them?",
"Are they... us? Are we the endpoint?",
"Or is their fate... something we cannot understand?",
"No, I must be missing something...",
"Are you causing gaps within my own memory?",
"What... ARE you?",
]
},
// Note: This about when the player starts on the last row of iM upgrades
singularity3: {
// Note: Shown when the first row 5 iM upgrade is purchased (~e26 singularities)
finalRowIM: {
id: 7,
requirement: () => Currency.singularities.gte(1e26),
lines: [
"Is this a cycle?",
"Will our existence just end and start anew...",
"Just like... the Dimensions I rule?",
"And if such... what will bring our end?",
"I knew the answer to all these questions...",
"But I forgot all of them...",
"Your power... is it... erasing mine...?",
"It is all impossible, beyond my comprehension...",
"Unless... Is this all just part of the cycle?",
"Can... you see beyond it all? Is... this why...",
"I feel... afraid?",
"I feel... my powers, my memories, being erased...",
"Just like... when my role was almost usurped...",
"And yet... I am unable to bring myself to do anything.",
"Because this... was... my mistake...",
]
},
// Note: This is around when all infinite milestones hit increased scaling
singularity4: {
increasedMilestoneScaling: {
id: 8,
requirement: () => Currency.singularities.gte(1e40),
lines: [
"I don't know for how much... longer I can hold.",
"There is... next to nothing left...",
"You have attained... complete and total mastery... over the dark...",
"While I can barely... hold onto my name anymore...",
"What am I meant to be doing anyways?",
"Did... my mistakes cause all of this?",
"I know not for how much... longer I can hold...",
"You are attaining... total mastery... over the dark...",
"While I can barely... hold onto my name...",
"What... can I... even do?",
]
},
fullDestabilize: {
@ -121,10 +129,10 @@ GameDatabase.celestials.quotes.laitela = {
requirement: () => player.celestials.laitela.difficultyTier >= 8,
lines: [
"I feel... like I had something to say...",
"Who am I? I am not sure...",
"I am not sure...",
"I cannot... hold onto the darkness any longer...",
"I... have nothing left...",
"Something about... destabilizing... collapsing...",
"I do not even... have anything left...",
"Something about... destruction...",
"The end...",
]
},

View File

@ -80,12 +80,12 @@ GameDatabase.challenges.eternity = [
description: () => {
if (Enslaved.isRunning) {
return Notations.current === Notation.shi
? "yo̶u̶ ̶c̶a̶n̶t̶ ̶g̶a̶i̶n̶ ̶A̶n̶t̶i̶m̶a̶t̶t̶e̶r̶ ̶G̶a̶l̶a̶x̶i̶e̶s̶ ̶n̶o̶r̶m̶a̶l̶l̶y̶,̶ ̶b̶u̶t̶ ̶the " +
? "yo̶u̶ ̶c̶a̶n̶not̶ ̶g̶a̶i̶n̶ ̶A̶n̶t̶i̶m̶a̶t̶t̶e̶r̶ ̶G̶a̶l̶a̶x̶i̶e̶s̶ ̶n̶o̶r̶m̶a̶l̶l̶y̶. ̶ ̶ ̶The " +
" cost of upgrading your max Replicanti Galaxies is massively reduced."
: "you c㏰'퐚 gai鸭 Ant꟢matterﶓa⁍axie㮾랜䂇rma㦂l the cost of upgrading your max Replicanti" +
" Galaxies is massively reduced";
}
return "you can't gain Antimatter Galaxies normally, but the cost of upgrading your max Replicanti" +
return "you cannot gain Antimatter Galaxies normally. The cost of upgrading your max Replicanti" +
" Galaxies is massively reduced.";
},
goal: DC.E850,
@ -103,7 +103,7 @@ GameDatabase.challenges.eternity = [
{
id: 7,
description:
"1st Time Dimension produces 8th Infinity Dimensions, and 1st Infinity Dimension produces " +
"1st Time Dimensions produce 8th Infinity Dimensions and 1st Infinity Dimensions produce " +
"7th Antimatter Dimensions. Tickspeed also directly applies to Infinity and Time Dimensions.",
goal: DC.E2000,
pelleGoal: DC.E2700,
@ -133,7 +133,7 @@ GameDatabase.challenges.eternity = [
},
{
id: 9,
description: () => `you can't buy Tickspeed upgrades. Infinity Power instead multiplies
description: () => `you cannot buy Tickspeed upgrades. Infinity Power instead multiplies
Time Dimensions with greatly reduced effect. ${specialInfinityGlyphDisabledEffectText()}`,
goal: DC.E1750,
pelleGoal: DC.E2900,
@ -168,7 +168,7 @@ GameDatabase.challenges.eternity = [
},
{
id: 11,
description: () => `all dimension multipliers and powers are disabled except for the multipliers from
description: () => `all Dimension multipliers and powers are disabled except for the multipliers from
Infinity Power and Dimension Boosts (to Antimatter Dimensions). ${specialInfinityGlyphDisabledEffectText()}`,
goal: DC.E500,
pelleGoal: DC.E11200,

View File

@ -4,8 +4,8 @@ import { GameDatabase } from "../game-database";
GameDatabase.challenges.infinity = [
{
id: 1,
description: `all Normal Challenges, with the exception of
Tickspeed (C9) and Big Crunch (C12) Challenges, are active at the same time.`,
description: `all Normal Challenge restrictions are active at once, with the exception of the
Tickspeed (C9) and Big Crunch (C12) Challenges.`,
goal: DC.E650,
isQuickResettable: true,
reward: {
@ -17,7 +17,7 @@ GameDatabase.challenges.infinity = [
},
{
id: 2,
description: () => `automatically Dimensional Sacrifice every ${formatInt(400)} milliseconds once you have
description: () => `Dimensional Sacrifice happens automatically every ${formatInt(400)} milliseconds once you have
an 8th Antimatter Dimension.`,
goal: DC.E10500,
isQuickResettable: false,
@ -50,7 +50,7 @@ GameDatabase.challenges.infinity = [
{
id: 4,
description: () =>
`only the latest bought Antimatter Dimension's production is normal, all other Antimatter Dimensions
`only the latest bought Antimatter Dimension's production is normal. All other Antimatter Dimensions
produce less (${formatPow(0.25, 2, 2)}).`,
goal: DC.E13000,
isQuickResettable: true,
@ -64,8 +64,8 @@ GameDatabase.challenges.infinity = [
{
id: 5,
description:
`buying Antimatter Dimensions 1-4 causes all smaller Antimatter Dimension costs to increase,
and buying Antimatter Dimensions 5-8 causes all larger Antimatter Dimension costs to increase.`,
`buying Antimatter Dimensions 1-4 causes all smaller Antimatter Dimension costs to increase.
Buying Antimatter Dimensions 5-8 causes all larger Antimatter Dimension costs to increase.`,
goal: DC.E16500,
isQuickResettable: true,
reward: {
@ -79,8 +79,8 @@ GameDatabase.challenges.infinity = [
{
id: 6,
description: () =>
`once you have at least ${formatInt(1)} 2nd Antimatter Dimension, exponentially rising matter
divides the multiplier on all of your Antimatter Dimensions.`,
`exponentially rising matter divides the multiplier on all of your Antimatter Dimensions
once you have at least ${formatInt(1)} 2nd Antimatter Dimension.`,
goal: DC.D2E22222,
isQuickResettable: true,
effect: () => Currency.matter.value.clampMin(1),
@ -94,14 +94,24 @@ GameDatabase.challenges.infinity = [
},
{
id: 7,
description: () =>
`you can't get Antimatter Galaxies, but Dimension Boost multiplier
${formatX(2.5, 1, 1)} ${formatX(10)}`,
description: () => {
// Copied from DimBoost.power; this is the base amount before any multipliers. Post-eternity this isn't
// necessarily 2.5x by the time the player sees this challenge; it's probably most accurate to say what it
// currently is, and this phrasing avoids 10x ➜ 10x with the old description.
const mult = Effects.max(
2,
InfinityUpgrade.dimboostMult,
InfinityChallenge(7).reward,
TimeStudy(81)
);
return `you cannot buy Antimatter Galaxies. Base Dimension Boost multiplier is increased to a maximum
of ${formatX(10)}. (Current base multiplier: ${formatX(mult)})`;
},
goal: DC.E10000,
isQuickResettable: false,
effect: 10,
reward: {
description: () => `Dimension Boost multiplier ${formatX(2.5, 1, 1)}${formatX(4)}`,
description: () => `Dimension Boost multiplier is increased to a minimum of ${formatX(4)}`,
effect: 4
},
unlockAM: DC.E23000,
@ -109,8 +119,8 @@ GameDatabase.challenges.infinity = [
{
id: 8,
description: () =>
`your production is at ${formatPercents(1)} after
purchasing anything, after that it rapidly drops down.`,
`your production rapidly and continually drops down over time. Purchasing an Antimatter Dimension or Tickspeed
upgrade sets production back to ${formatPercents(1)} before it starts dropping again.`,
goal: DC.E27000,
isQuickResettable: true,
effect: () => DC.D0_8446303389034288.pow(

View File

@ -26,8 +26,8 @@ GameDatabase.challenges.normal = [
legacyId: 2,
isQuickResettable: false,
description:
() => "buying Antimatter Dimensions or Tickspeed upgrades halts your production, " +
`gradually coming back over ${formatInt(3)} minutes.`,
() => "buying Antimatter Dimensions or Tickspeed upgrades halts production of all Antimatter Dimensions. " +
`Production gradually returns to normal over ${formatInt(3)} minutes.`,
name: "2nd Antimatter Dimension Autobuyer",
reward: "Upgradeable 2nd Antimatter Dimension Autobuyer",
lockedAt: DC.D0,
@ -38,8 +38,8 @@ GameDatabase.challenges.normal = [
legacyId: 3,
isQuickResettable: false,
description:
`the 1st Antimatter Dimension is heavily weakened, but gets an exponentially increasing
bonus that resets after Dimension Boosts and Antimatter Galaxies.`,
`the 1st Antimatter Dimension is heavily weakened, but gets an uncapped exponentially increasing multiplier.
This multiplier resets after Dimension Boosts and Antimatter Galaxies.`,
name: "3rd Antimatter Dimension",
reward: "Upgradeable 3rd Antimatter Dimension Autobuyer",
lockedAt: DC.D0,
@ -71,8 +71,8 @@ GameDatabase.challenges.normal = [
id: 6,
legacyId: 10,
isQuickResettable: false,
description: () => `each Antimatter Dimension costs the dimension ${formatInt(2)} dimensions below it, ` +
"instead of antimatter. Antimatter Dimension prices are modified.",
description: () => `upgrading each Antimatter Dimension costs the Antimatter Dimension ${formatInt(2)} tiers ` +
"below it instead of antimatter. Antimatter Dimension prices are modified.",
name: "6th Antimatter Dimension Autobuyer",
reward: "Upgradeable 6th Antimatter Dimension Autobuyer",
lockedAt: DC.D0,
@ -83,8 +83,8 @@ GameDatabase.challenges.normal = [
legacyId: 9,
isQuickResettable: false,
description: () =>
`the multiplier from buying ${formatInt(10)} Antimatter Dimensions is reduced to ${formatX(1)}, but is increased
by ${formatX(0.2, 1, 1)} per Dimension Boost, up to a maximum of ${formatX(2)}.`,
`the multiplier from buying ${formatInt(10)} Antimatter Dimensions is reduced to ${formatX(1)}. This increases by
${formatX(0.2, 1, 1)} per Dimension Boost, to a maximum of ${formatX(2)}, and is unaffected by any upgrades.`,
name: "7th Antimatter Dimension Autobuyer",
reward: "Upgradeable 7th Antimatter Dimension Autobuyer",
lockedAt: DC.D0,
@ -94,8 +94,8 @@ GameDatabase.challenges.normal = [
id: 8,
legacyId: 11,
isQuickResettable: false,
description: "Dimension Boosts provide no boost and Antimatter Galaxies cannot be bought, but " +
"Dimensional Sacrifice is significantly stronger and resets antimatter and all Antimatter Dimensions.",
description: `Dimension Boosts provide no multiplier and Antimatter Galaxies cannot be bought. Dimensional
Sacrifice resets antimatter and all Antimatter Dimensions, but also gives a significantly stronger multiplier.`,
name: "8th Antimatter Dimension Autobuyer",
reward: "Upgradeable 8th Antimatter Dimension Autobuyer",
lockedAt: DC.D0,
@ -105,7 +105,7 @@ GameDatabase.challenges.normal = [
id: 9,
legacyId: 5,
isQuickResettable: true,
description: () => `whenever you buy Tickspeed upgrades, or ${formatInt(10)} of an Antimatter Dimension, ` +
description: () => `whenever you buy Tickspeed upgrades or ${formatInt(10)} of an Antimatter Dimension, ` +
"everything else of equal cost will increase to its next cost step.",
name: "Tickspeed Autobuyer",
reward: "Upgradeable Tickspeed Autobuyer",
@ -116,8 +116,8 @@ GameDatabase.challenges.normal = [
id: 10,
legacyId: 4,
isQuickResettable: false,
description: () => (`there are only ${formatInt(6)} Antimatter Dimensions, with Dimension Boost ` +
"and Antimatter Galaxy costs modified."),
description: () => `there are only ${formatInt(6)} Antimatter Dimensions. Dimension Boost ` +
"and Antimatter Galaxy costs are modified.",
name: "Automated Dimension Boosts",
reward: "Dimension Boosts Autobuyer",
lockedAt: DC.D16,
@ -127,8 +127,8 @@ GameDatabase.challenges.normal = [
id: 11,
legacyId: 12,
isQuickResettable: true,
description: () => (`there's normal matter which rises once you have at least ${formatInt(1)} 2nd Antimatter ` +
"Dimension. If it exceeds your antimatter, it will Dimension Boost without giving the bonus."),
description: () => `there is normal matter which rises once you have at least ${formatInt(1)} 2nd Antimatter ` +
"Dimension. If it exceeds your antimatter, it will Dimension Boost without giving the bonus.",
name: "Automated Antimatter Galaxies",
reward: "Antimatter Galaxies Autobuyer",
lockedAt: DC.D16,
@ -138,9 +138,9 @@ GameDatabase.challenges.normal = [
id: 12,
legacyId: 7,
isQuickResettable: false,
description: () => (`each Antimatter Dimension produces the dimension ${formatInt(2)} dimensions below it (1st ` +
"Antimatter Dimensions still produce antimatter). The 2nd, 4th, and 6th Antimatter Dimensions " +
"are made stronger to compensate."),
description: () => `each Antimatter Dimension produces the Dimension ${formatInt(2)} tiers below it
instead of ${formatInt(1)}. The 1st Dimension still produces antimatter, and the 2nd, 4th, and 6th
Dimensions are made stronger to compensate.`,
name: "Automated Big Crunches",
reward: "Big Crunches Autobuyer",
lockedAt: DC.D16,

View File

@ -7,14 +7,15 @@ GameDatabase.credits = {
2: "Technical Architect",
3: "Lead Developer",
4: "Android Developer",
5: "Library Developer",
6: "Developer",
7: "Lead Design Consultant",
8: "Design Consultant",
9: "Modal Maker, Lady Taker, Pie Baker",
10: "Lurker Tester",
11: "Web Tester",
12: "Android Tester"
5: "Steam Developer",
6: "Library Developer",
7: "Developer",
8: "Lead Design Consultant",
9: "Design Consultant",
10: "Modal Maker, Lady Taker, Pie Baker",
11: "Lurker Tester",
12: "Web Tester",
13: "Android Tester"
},
// Each person must have a name and at least one role (the index of the desired role in roles). They can also have a
@ -40,330 +41,338 @@ GameDatabase.credits = {
roles: 3
}, {
name: "WaitingIdly",
roles: [3, 6, 8, 11, 12]
roles: [3, 7, 9, 12, 13]
}, {
name: "kajfik",
name2: "Jakub Kajfosz",
roles: 4
}, {
name: "Makopaz",
name2: "Zack Stein",
roles: 5
}, {
name: "Patashu",
roles: [5, 6, 11]
roles: [6, 7, 12]
}, {
name: "Dan",
roles: [6, 11]
roles: [7, 12]
}, {
name: "earth",
name2: "Jace Royer",
roles: [6, 9, 11, 12]
roles: [7, 10, 12, 13]
}, {
name: "Hira",
roles: [6, 11, 12]
roles: [7, 12, 13]
}, {
name: "IkerStream",
name2: "Iker de Aguirre",
roles: [6, 11]
roles: [7, 12]
}, {
name: "L4R5",
name2: "Lars Wolf",
roles: [6, 11, 12]
roles: [7, 12, 13]
}, {
name: "Pichusuperlover",
roles: [6, 8, 11]
roles: [7, 9, 12]
}, {
name: "realrapidjazz",
roles: [6, 7]
roles: [7, 8]
}, {
name: "Scarlet",
roles: [6, 11, 12]
roles: [7, 12, 13]
}, {
name: "slabdrill",
roles: 6
roles: 7
}, {
name: "Acamaeda",
roles: [8, 11]
roles: [9, 12]
}, {
name: "Dravitar",
name2: "Alex Henderson",
roles: 10
roles: 11
}, {
name: "Aesis",
roles: 11
roles: 12
}, {
name: "AFYINEE",
name2: "Gabriel HADDAG",
roles: 11
roles: 12
}, {
name: "Alexitato",
roles: 11
roles: 12
}, {
name: "Anno",
roles: 11
roles: 12
}, {
name: "Archa",
name2: "Myresa",
roles: [11, 12]
roles: [12, 13]
}, {
name: "ArrowBounce",
name2: "Timothy Su",
roles: 11
roles: 12
}, {
name: "Birb",
name2: "Kelsey Black",
roles: 11
roles: 12
}, {
name: "Boo",
name2: "Jean-Christophe Bourgault",
roles: 11
roles: 12
}, {
name: "CaptainGalaxy",
name2: "Ovidijus Točelis",
roles: 11
roles: 12
}, {
name: "ChaoticHans",
roles: [11, 12]
roles: [12, 13]
}, {
name: "cubic frog",
roles: 11
roles: 12
}, {
name: "dankesehr",
roles: 11
roles: 12
}, {
name: "Davixx",
name2: "Davide Fedele",
roles: 11
roles: 12
}, {
name: "Empireus",
roles: 11
roles: 12
}, {
name: "GirixK",
name2: "Nikola Jelinčić",
roles: [11, 12]
roles: [12, 13]
}, {
name: "GoldenTritium",
roles: [11, 12]
roles: [12, 13]
}, {
name: "Kael",
roles: 11
roles: 12
}, {
name: "Lynn",
roles: 11
roles: 12
}, {
name: "Merp",
roles: 11
roles: 12
}, {
name: "philipebreaker",
name2: "Philipe",
roles: 11
roles: 12
}, {
name: "Phillip Marshall",
roles: 11
roles: 12
}, {
name: "Phoenix",
roles: 11
roles: 12
}, {
name: "Reda Kotob",
roles: 11
roles: 12
}, {
name: "Saturnus",
roles: 11
roles: 12
}, {
name: "SereKabii",
roles: 11
roles: 12
}, {
name: "Sheer",
roles: 11
roles: 12
}, {
name: "sirusi",
name2: "Vinícius Oliveira Martins",
roles: 11
roles: 12
}, {
name: "Spanosa",
name2: "Jared K",
roles: 11
roles: 12
}, {
name: "Sparticle999",
roles: 11
roles: 12
}, {
name: "SpicyCrusader13",
roles: [11, 12]
roles: [12, 13]
}, {
name: "Storm",
roles: 11
roles: 12
}, {
name: "SzyszakS",
roles: 11
roles: 12
}, {
name: "Tacitus",
roles: 11
roles: 12
}, {
name: "Typh",
roles: 11
roles: 12
}, {
name: "Vnge",
name2: "Ben Parrish",
roles: [11, 12]
roles: [12, 13]
}, {
name: "Xemadus",
name2: "Jonathan Gibson",
roles: 11
roles: 12
}, {
name: "Young Woo Joo",
roles: 11
roles: 12
}, {
name: "Zipi",
roles: 11
roles: 12
}, {
name: "about:blank",
roles: 12
roles: 13
}, {
name: "ÆiOuF",
roles: 12
roles: 13
}, {
name: "Anjinho01",
roles: 12
roles: 13
}, {
name: "Anthios",
roles: 12
roles: 13
}, {
name: "Auti",
name2: "Alice Tolle",
roles: 12
roles: 13
}, {
name: "Buck",
roles: 12
roles: 13
}, {
name: "Barrin84",
roles: 12
roles: 13
}, {
name: "ChizuX",
roles: 12
roles: 13
}, {
name: "Circle",
roles: 12
roles: 13
}, {
name: "Crinkly Weasel",
name2: "Aaryan Sarawgi",
roles: 12
roles: 13
}, {
name: "DarthDie",
name2: "Briar Bowser",
roles: 12
roles: 13
}, {
name: "Epsilon",
name2: "Coolguystorm",
roles: 12
roles: 13
}, {
name: "Firecracker",
roles: 12
roles: 13
}, {
name: "Gaunter",
roles: 12
roles: 13
}, {
name: "HarrisL2",
roles: 12
roles: 13
}, {
name: "Hellbach",
name2: "Asher Günther",
roles: 12
roles: 13
}, {
name: "hen-ben",
name2: "Henry Ellenberg",
roles: 12
roles: 13
}, {
name: "ImpossibleSalsa",
roles: 12
roles: 13
}, {
name: "JayM#1872",
name2: "Jay McGee",
roles: 13
}, {
name: "Johanniklas",
name2: "Jan-Niklas Petersen",
roles: 12
roles: 13
}, {
name: "kaislash",
name2: "Lily",
roles: 12
roles: 13
}, {
name: "Kirku",
name2: "Fabian Makowski",
roles: 12
roles: 13
}, {
name: "Kirin",
name2: "Arthur",
roles: 12
roles: 13
}, {
name: "Mirai",
roles: 12
roles: 13
}, {
name: "Monoma",
name2: "ARoman Ruiz",
roles: 12
roles: 13
}, {
name: "Nani",
roles: 12
roles: 13
}, {
name: "netweak",
roles: 12
roles: 13
}, {
name: "NotBrewst",
name2: "Luc Leblanc",
roles: 12
roles: 13
}, {
name: "opdollar",
name2: "Zane Coole",
roles: 12
roles: 13
}, {
name: "Pavlxiiv",
roles: 12
roles: 13
}, {
name: "Porygon-Z",
roles: 12
roles: 13
}, {
name: "PotatoTIAB",
roles: 12
roles: 13
}, {
name: "Razor",
roles: 12
roles: 13
}, {
name: "Razvan Cercel",
roles: 12
roles: 13
}, {
name: "ReacTivity",
roles: 12
roles: 13
}, {
name: "Rukimix",
roles: 12
roles: 13
}, {
name: "Skunky",
name2: "Lukas",
roles: 12
roles: 13
}, {
name: "Socks",
name2: "Hannah Pocks",
roles: 12
roles: 13
}, {
name: "Sweets the Alien",
roles: 12
roles: 13
}, {
name: "Taylor Reeves",
roles: 12
roles: 13
}, {
name: "Tim Wong",
roles: 12
roles: 13
}, {
name: "tragedt",
name2: "Ethan Manninen",
roles: 12
roles: 13
}, {
name: "Valentine Clarissa Alanis Star Z",
roles: 12
roles: 13
}, {
name: "vanadium_void",
roles: 12
roles: 13
}, {
name: "X3N0_32",
roles: 12
roles: 13
}, {
name: "ZylaKat",
name2: "Katherine Goforth-Harbin",
roles: 12
roles: 13
}
]
};

View File

@ -24,7 +24,7 @@ function rebuyable(config) {
GameDatabase.eternity.dilation = {
dtGain: rebuyable({
id: 1,
initialCost: 1e5,
initialCost: 1e4,
increment: 10,
description: () =>
((SingularityMilestone.dilatedTimeFromSingularities.canBeApplied || Achievement(187).canBeApplied)

View File

@ -2290,7 +2290,7 @@ GameDatabase.news = [
{
id: "a355",
text:
`<div style='background: url("../images/unsmith.png"); width: 2.3rem; height: 2.5rem; margin-top: -0.1rem'></div>`
`<div style='background: url("./images/unsmith.png"); width: 2.3rem; height: 2.5rem; margin-top: -0.1rem'></div>`
},
{
id: "a356",

View File

@ -13,8 +13,9 @@ GameDatabase.progressStages = [
* @property {function: @return Boolean} hasReached Checking function for whether this stage has been
* reached; all checks are run in descending order, starting at the end of the list and moving upward. The
* last one checked (first entry) always returns true as a catch-all condition
* @property {String} suggestedResource A resource or multiple resources which may be
* useful for the player to aim for at this stage
* @property {String | function: @return Number} suggestedResource A resource or multiple resources which may be
* useful for the player to aim for at this stage. It's okay to reference the player object in this prop because
* it's only ever used in the catchup modal and not in the cloud save conflict checker.
* @property {function: @return Number} subProgressValue A value between 0 and 1 corresponding approximately
* to the progress within a stage. Values near 0 correspond to near the end of the previous stage and values
* near 1 correspond to near the start of the next stage; however in-between values are not an indicator of
@ -23,7 +24,7 @@ GameDatabase.progressStages = [
*/
{
id: PROGRESS_STAGE.PRE_INFINITY,
name: "Before Infinity",
name: "Antimatter Production",
hasReached: () => true,
suggestedResource: "Antimatter",
// Galaxies are worth 1/3 each, boosts break ties within galaxies, and antimatter breaks ties within boosts
@ -57,7 +58,7 @@ GameDatabase.progressStages = [
id: PROGRESS_STAGE.EARLY_ETERNITY,
name: "Eternity",
hasReached: save => new Decimal(save.eternities).gt(0),
suggestedResource: "Eternity Points",
suggestedResource: "Eternity Points and Eternity count",
subProgressValue: save => Math.sqrt(new Decimal(save.eternityPoints).pLog10() / 18),
},
{
@ -80,10 +81,13 @@ GameDatabase.progressStages = [
id: PROGRESS_STAGE.LATE_ETERNITY,
name: "Late Eternity",
hasReached: save => new Decimal(save.dilation.dilatedTime).gt(1e15),
suggestedResource: "Eternity Points and Dilated Time",
suggestedResource: () => (new Decimal(player.eternityPoints).log10() > 4000
? "Eternity Points and/or Dilated Time. Alternatively, you can unlock and perform your first Reality"
: "Eternity Points and/or Dilated Time"
),
// Tracks up to e8000 even though many players will reality well before that; we still want to distinguish
// which saves are farther all the way up to the zeroth-reality RM cap
subProgressValue: save => Math.sqrt((new Decimal(save.eternityPoints).log10() - 1300) / 6700),
subProgressValue: save => Math.clampMax(Math.sqrt((new Decimal(save.eternityPoints).log10() - 1300) / 6700), 1),
},
{
id: PROGRESS_STAGE.EARLY_REALITY,

View File

@ -127,9 +127,9 @@ GameDatabase.reality.upgrades = [
name: "Existentially Prolong",
id: 10,
cost: 15,
requirement: () => `Complete your first Eternity with at least ${formatPostBreak(DC.E450)} Infinity Points`,
requirement: () => `Complete your first Eternity with at least ${formatPostBreak(DC.E400)} Infinity Points`,
hasFailed: () => !player.requirementChecks.reality.noEternities,
checkRequirement: () => Currency.infinityPoints.exponent >= 450 &&
checkRequirement: () => Currency.infinityPoints.exponent >= 400 &&
player.requirementChecks.reality.noEternities,
checkEvent: GAME_EVENT.ETERNITY_RESET_BEFORE,
description: () => `Start every Reality with ${formatInt(100)} Eternities (also applies to current Reality)`,
@ -201,7 +201,7 @@ GameDatabase.reality.upgrades = [
checkRequirement: () => Currency.eternityPoints.exponent >= 10 && player.epmultUpgrades === 0,
checkEvent: GAME_EVENT.ETERNITY_RESET_AFTER,
description: () => `Boost Tachyon Particle gain based on ${formatX(5)} Eternity Point multiplier`,
effect: () => Math.max(Math.sqrt(Decimal.log10(EternityUpgrade.epMult.effectValue)) / 3, 1),
effect: () => Math.max(Math.sqrt(Decimal.log10(EternityUpgrade.epMult.effectValue)) / 9, 1),
formatEffect: value => formatX(value, 2, 2)
},
{

View File

@ -10,7 +10,9 @@ class GameProgressState extends GameMechanicState {
}
get suggestedResource() {
return this.config.suggestedResource;
return typeof this.config.suggestedResource === "function"
? this.config.suggestedResource()
: this.config.suggestedResource;
}
}

View File

@ -68,8 +68,7 @@ export class TimeTheoremPurchaseType {
}
get canAfford() {
return this.currency.gte(this.cost) &&
!(Pelle.isDoomed && player.eternities.eq(0));
return this.currency.gte(this.cost) && !player.eternities.eq(0);
}
reset() {

View File

@ -803,6 +803,7 @@ export function getTTPerSecond() {
Ra.unlocks.continuousTTBoost.effects.ttGen,
Ra.unlocks.achievementTTMult,
Achievement(137),
Achievement(156),
);
if (GlyphAlteration.isAdded("dilation")) ttMult *= getSecondaryGlyphEffect("dilationTTgen");

View File

@ -198,11 +198,11 @@ body.t-s9 {
}
.l-tab-btn-inner {
position: relative;
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
position: relative;
justify-content: center;
align-items: center;
cursor: pointer;
@ -364,8 +364,8 @@ body.t-s9 {
.o-tab-btn--infinity .o-subtab__tooltip {
color: var(--color-infinity);
border-color: var(--color-infinity);
background: var(--color-prestige--accent);
border-color: var(--color-infinity);
}
.o-tab-btn--infinity .o-subtab__tooltip::after {
@ -374,8 +374,8 @@ body.t-s9 {
.o-tab-btn--eternity .o-subtab__tooltip {
color: var(--color-eternity);
border-color: var(--color-eternity);
background: var(--color-prestige--accent);
border-color: var(--color-eternity);
}
.o-tab-btn--eternity .o-subtab__tooltip::after {
@ -384,8 +384,8 @@ body.t-s9 {
.o-tab-btn--reality .o-subtab__tooltip {
color: var(--color-reality);
border-color: var(--color-reality);
background: var(--color-prestige--accent);
border-color: var(--color-reality);
}
.o-tab-btn--reality .o-subtab__tooltip::after {
@ -394,8 +394,8 @@ body.t-s9 {
.o-tab-btn--celestial .o-subtab__tooltip {
color: var(--color-celestials);
border-color: var(--color-celestials);
background: var(--color-prestige--accent);
border-color: var(--color-celestials);
}
.o-tab-btn--celestial .o-subtab__tooltip::after {
@ -497,40 +497,6 @@ body.t-s9 {
margin-top: 0.3rem;
}
.l-tickspeed-container {
display: flex;
justify-content: center;
padding: 1rem 5rem 0 9rem;
}
.l-tickspeed-container--hidden {
visibility: hidden;
}
.tickspeed-labels {
display: flex;
}
.tickspeed-btn {
height: 3rem;
min-width: 15rem;
max-width: 20rem;
font-size: 1.1rem;
padding: 0.5rem;
}
.tickspeed-max-btn {
width: 10rem;
height: 3rem;
padding: 0.5rem;
}
.tickspeed-labels span {
height: 3rem;
color: var(--color-text);
padding: 0.5rem 1rem;
}
.particle {
width: 1rem;
height: 1rem;
@ -564,7 +530,6 @@ body.t-s9 {
.btn-big-crunch--small {
position: absolute;
top: 4.3rem;
left: calc(50% - 0.6rem);
font-size: 3rem;
transform: translateX(-50%);
}
@ -579,10 +544,6 @@ body.t-s9 {
animation: a-tesseract-shift-dark 5s infinite;
}
.l-new-ui-big-crunch__container {
margin-top: 2rem;
}
.information-header {
font-size: 1.2rem;
font-weight: bold;

View File

@ -31,6 +31,9 @@
.l-old-ui__big-crunch-btn--overlay {
position: absolute;
left: 50%;
margin-top: 5rem;
transform: translateX(-50%);
}
.l-old-ui__page {

View File

@ -118,7 +118,7 @@ html {
--color-text-inverted: black;
--color-base: #455a64;
--color-disabled: #37474f;
--color-accent: #1565c0;
--color-accent: #1256a3;
--color-notification: yellow;
--color-infinity: #ff9800;
@ -1596,12 +1596,14 @@ br {
}
.o-primary-btn--dimboost {
position: relative;
width: 21rem;
height: 4.5rem;
font-size: 0.9rem;
}
.o-primary-btn--galaxy {
position: relative;
width: 21rem;
height: 4.5rem;
font-size: 0.9rem;
@ -1649,6 +1651,12 @@ br {
box-sizing: border-box;
}
.o-primary-btn--modal-option {
width: 16rem;
height: 6.5rem;
margin: 0.3rem;
}
.o-primary-btn--option-wide {
width: 24rem;
height: 5.5rem;
@ -1780,7 +1788,6 @@ br {
}
.t-dark .o-primary-btn--disabled {
color: black;
background-color: #37474f;
}
@ -2110,7 +2117,7 @@ br {
/* #region hint-text */
.o-dim-path-priority {
font-size: 1.55rem;
font-size: 1.5rem;
color: white;
text-shadow:
-0.1rem -0.1rem 0 black,
@ -4211,13 +4218,13 @@ br {
}
.o-autobuyer-btn--unavailable {
background: var(--color-disabled);
color: black;
background-color: var(--color-disabled);
cursor: auto;
}
.o-autobuyer-btn--unavailable:hover {
color: black;
background-color: var(--color-disabled);
background-color: var(--color-bad);
}
.t-dark .o-autobuyer-btn,
@ -5293,6 +5300,11 @@ br {
transition-duration: 0.2s;
}
.c-modal--short {
overflow-y: scroll;
max-height: 55rem;
}
.c-modal__title {
display: inline-block;
width: 50rem;
@ -5782,6 +5794,7 @@ br {
display: flex;
flex-direction: column;
align-items: center;
font-size: 1.3rem;
margin-bottom: 1rem;
}
@ -5949,8 +5962,8 @@ kbd {
}
.o-notification--error {
background-color: #bf352d;
border-color: #330000;
background-color: #ffaa22;
border-color: #553300;
}
.o-notification--info {
@ -5989,8 +6002,8 @@ kbd {
}
.s-base--metro .o-notification--error {
background-color: #f44336;
border-color: #c62828;
background-color: #ffaa22;
border-color: #553300;
}
.s-base--metro .o-notification--info {
@ -6684,7 +6697,7 @@ kbd {
.o-enslaved-mechanic-button {
min-width: 18rem;
min-height: 7rem;
min-height: 9rem;
font-family: Typewriter;
background-color: #fdd3b0;
border: var(--var-border-width, 0.2rem) solid sandybrown;
@ -6834,10 +6847,8 @@ kbd {
.c-enslaved-hint-modal {
display: flex;
overflow-y: scroll;
flex-direction: column;
width: 60rem;
height: 57rem;
text-align: left;
font-size: 1.2rem;
padding: 0.25rem 1rem;

View File

@ -5,7 +5,7 @@
}
.general-tooltip .tooltip-inner {
width: 16rem;
width: 20rem;
text-align: center;
font-family: Typewriter, serif;
font-size: 1.4rem;

View File

@ -3,7 +3,7 @@
/* HintText.vue */
.o-hint-text {
font-size: 1.55rem;
font-size: 1.5rem;
color: white;
text-shadow:
-0.1rem -0.1rem 0 black,

View File

@ -57,10 +57,7 @@ export default {
<template>
<div class="l-challenges-tab__header">
<div
v-if="isShowAllVisible || isAutoECVisible || isInChallenge"
class="c-subtab-option-container"
>
<div class="c-subtab-option-container">
<PrimaryToggleButton
v-model="retryChallenge"
class="o-primary-btn--subtab-option"

View File

@ -19,6 +19,7 @@ export default {
data() {
return {
showWorstChallenge: false,
worstChallengeString: "",
isUseless: false,
canBeBought: false,
chargePossible: false,

View File

@ -7,11 +7,6 @@ export default {
PrimaryToggleButton
},
props: {
isWide: {
type: Boolean,
required: false,
default: true,
},
value: {
type: Boolean,
required: false,
@ -23,12 +18,6 @@ export default {
}
},
computed: {
classObject() {
return {
"o-primary-btn--option": !this.isWide,
"o-primary-btn--option-wide": this.isWide,
};
},
styleObject() {
return {
"background-color": this.value ? "var(--color-good)" : "var(--color-gh-purple)",
@ -42,7 +31,7 @@ export default {
<PrimaryToggleButton
:value="value"
:label="text"
:class="classObject"
class="o-primary-btn--modal-option"
:style="styleObject"
@input="emitInput"
/>

View File

@ -58,7 +58,7 @@ export default {
</div>
<div
v-if="!nothingHappened"
class="c-modal-away-progress__resources"
class="c-modal-away-progress__resources c-modal--short"
>
<AwayProgressEntry
v-for="name of offlineStats"

View File

@ -96,7 +96,7 @@ export default {
<template #header>
Cracks in The Nameless Ones' Reality
</template>
<div class="c-enslaved-hint-modal">
<div class="c-enslaved-hint-modal c-modal--short">
<div>
This Reality seems to be resisting your efforts to complete it. So far you have done the following:
</div>

View File

@ -16,12 +16,6 @@ export default {
required: true
}
},
data() {
return {
startTime: 0,
remainingTime: 0,
};
},
computed: {
progressStage: () => ProgressChecker.getProgressStage(player).id,
suggestedResource() {
@ -36,19 +30,7 @@ export default {
return this.diff ? "Content Catch-up" : "Content Summary";
}
},
created() {
// This is a particularly important modal which cannot be opened again, so we make the close button unclickable
// for the first few seconds to reduce the chance of a player instinctively clicking through and not reading it.
// It can still be closed preemptively with escape, but that should be likely significantly less likely to happen.
// Additionally, if diff is 0 then we assume that this was manually opened and remove the delay
this.startTime = this.diff ? Date.now() : 0;
},
methods: {
update() {
const timeSinceOpen = Date.now() - this.startTime;
// Track remainingTime in seconds, starting at 5 and counting down to 0
this.remainingTime = Math.max(Math.floor(5 - timeSinceOpen / 1000), 0);
},
stageName(stage) {
return GameProgress(stage).name;
}
@ -67,7 +49,7 @@ export default {
check the related How To Play entries if you want more detailed information.
<div
class="l-catchup-group-container"
:style="{ 'height' : `${Math.clamp(5 * progressStage, 15, 40)}rem` }"
:style="{ 'height' : `${Math.clamp(3 * progressStage + 5, 15, 35)}rem` }"
>
<CatchupGroup
v-for="group of progressStage"
@ -81,17 +63,10 @@ export default {
</span>
<div class="l-confirm-padding">
<PrimaryButton
v-if="remainingTime === 0"
@click="emitClose"
>
Confirm
</PrimaryButton>
<PrimaryButton
v-else
:enabled="false"
>
Confirm ({{ formatInt(remainingTime) }})
</PrimaryButton>
</div>
</div>
</template>
@ -104,7 +79,7 @@ export default {
border: 0.1rem solid var(--color-text);
border-radius: var(--var-border-radius, 0.4rem);
margin: 1rem;
padding: 2rem;
padding: 1.5rem;
}
.l-confirm-padding {

View File

@ -20,7 +20,7 @@ export default {
return this.challenge.isFullyCompleted;
},
message() {
return `You will Eternity, if possible, and start a new Eternity within the Challenge, with all the
return `You will Eternity (if possible) and start a new Eternity within the Challenge, with all the
Challenge-specific restrictions and modifiers active.
To complete the Challenge${this.challengeIsCompleted ? "" : " and gain its reward"},
you must reach the Challenge goal of

View File

@ -20,7 +20,7 @@ export default {
return this.challenge.isCompleted;
},
message() {
return `You will Big Crunch, if possible, and start a new Infinity within the Challenge, with all the
return `You will Big Crunch (if possible) and start a new Infinity within the Challenge with all the
Challenge-specific restrictions and modifiers active.
To complete the Challenge${this.challengeIsCompleted ? "" : " and gain its reward"},
you must reach the Challenge goal of

View File

@ -20,7 +20,7 @@ export default {
return this.challenge.isCompleted;
},
message() {
return `You will Big Crunch, if possible, and start a new Infinity within the Challenge, with all the
return `You will Big Crunch (if possible) and start a new Infinity within the Challenge with all the
Challenge-specific restrictions and modifiers active.
To complete the Challenge${this.challengeIsCompleted ? "" : " and gain its reward"},
you must reach Infinity again.

View File

@ -77,7 +77,6 @@ export default {
:show-name="hasDifferentName"
save-type="Local Save"
/>
<br>
<SaveInfoEntry
:save-data="conflict.cloud"
:other-data="conflict.local"

View File

@ -99,7 +99,6 @@ export default {
:show-name="hasDifferentName"
save-type="Cloud Save"
/>
<br>
Would you like to overwrite the Cloud Save? Your choice here will apply for every
time the game automatically attempts to Cloud Save, until the page is reloaded.
<div

View File

@ -148,7 +148,6 @@ export default {
<span v-html="formattedSTDText" />
{{ timePlayed }}
<br>
<br>
<span v-html="antimatter" />
<span v-html="prestigeCount" />
<span v-html="prestigeResource" />

View File

@ -109,13 +109,13 @@ export default {
<style scoped>
.c-dropdown-btn {
width: 24rem;
margin: 0.5rem;
margin: 0.3rem;
padding: 0;
}
.c-dropdown-header {
padding: 0.75rem;
height: 5.5rem;
padding: 0.9rem;
height: 6.5rem;
user-select: none;
}
</style>

View File

@ -115,7 +115,6 @@ export default {
{{ moreShiftKeyInfo }}
</span>
<br>
<br>
<div class="l-modal-hotkeys-row">
<span class="c-modal-hotkeys-row__name l-modal-hotkeys-row__name">Autobuyer Controls</span>
<kbd>alt</kbd>
@ -128,7 +127,6 @@ export default {
and Tickspeed Autobuyers instead.
</span>
<br>
<br>
<div class="l-modal-hotkeys-row">
<span class="c-modal-hotkeys-row__name l-modal-hotkeys-row__name">Tab Movement</span>
<div>
@ -140,6 +138,15 @@ export default {
The Up and Down arrows cycle you through tabs,
and the Left and Right arrows cycle you through that tab's subtabs.
</span>
<br>
<div class="l-modal-hotkeys-row">
<span class="c-modal-hotkeys-row__name l-modal-hotkeys-row__name">Numpad Support</span>
</div>
<span class="c-modal-hotkeys__shift-description">
Due to technical reasons, pressing a numpad key will purchase 10 of a Dimension if possible, but pressing
a numpad key with <kbd>shift</kbd> will not buy a single Dimension. It may instead, depending on your device,
cause the page to scroll or change game tabs. <kbd>alt</kbd> will still work as expected.
</span>
</div>
</span>
</ModalWrapper>

View File

@ -31,29 +31,31 @@ export default {
<template #header>
Modify Visible Tabs
</template>
Click a button to toggle showing a tab on/off.
<br>
Some tabs cannot be hidden, and you cannot hide your current tab.
<br>
Unhiding a tab in which all subtabs are hidden will also unhide all subtabs,
and hiding all subtabs will also hide the tab.
<br>
<div v-if="isAlmostEnd">
You cannot hide your tabs after unlocking the Galaxy Generator.
</div>
<div v-if="isEnslaved">
<div class="c-modal--short">
Click a button to toggle showing a tab on/off.
<br>
<i>You must... see everywhere...</i>
Some tabs cannot be hidden, and you cannot hide your current tab.
<br>
(You cannot hide your tabs within this Reality)
Unhiding a tab in which all subtabs are hidden will also unhide all subtabs,
and hiding all subtabs will also hide the tab.
<br>
<div v-if="isAlmostEnd">
You cannot hide your tabs after unlocking the Galaxy Generator.
</div>
<div v-if="isEnslaved">
<br>
<i>You must... see everywhere...</i>
<br>
(You cannot hide your tabs within this Reality)
</div>
<HiddenTabGroup
v-for="(tab, index) in tabs"
:key="index"
:tab="tab"
:change-enabled="!isEnslaved && !isAlmostEnd"
class="l-hide-modal-tab-container"
/>
</div>
<HiddenTabGroup
v-for="(tab, index) in tabs"
:key="index"
:tab="tab"
:change-enabled="!isEnslaved && !isAlmostEnd"
class="l-hide-modal-tab-container"
/>
</ModalWrapperOptions>
</template>

View File

@ -1,16 +1,18 @@
<script>
import ModalWrapperChoice from "@/components/modals/ModalWrapperChoice";
import ResetModal from "@/components/modals/prestige/ResetModal";
// Note: This modal only shows up on the first infinity and post-break infinities; it won't appear pre-break otherwise
export default {
name: "BigCrunchModal",
components: {
ModalWrapperChoice
ResetModal
},
data() {
return {
gainedInfinities: new Decimal(),
gainedInfinityPoints: new Decimal()
gainedInfinityPoints: new Decimal(),
startingBoosts: 0,
startingAM: 10,
willStartWithGalaxy: false
};
},
computed: {
@ -18,22 +20,33 @@ export default {
return !PlayerProgress.infinityUnlocked();
},
message() {
const info = this.isFirstInfinity ? this.firstIntinityInfo : this.ipGainInfo;
const info = this.isFirstInfinity ? this.firstInfinityInfo : ``;
return `Upon Infinity, all Dimensions, Dimension Boosts, and Antimatter Galaxies are reset. ${info}`;
},
firstIntinityInfo() {
firstInfinityInfo() {
return `In return, you gain an Infinity Point (IP). This allows you to buy multiple upgrades that you can
find in the Infinity tab. You will also gain one Infinity, which is the stat shown in the Statistics tab.`;
},
ipGainInfo() {
return `You will gain ${quantify("Infinity Point", this.gainedInfinityPoints, 2, 2)}
and ${quantify("Infinity", this.gainedInfinities)}.`;
return `You will gain ${quantify("Infinity", this.gainedInfinities, 2, 0)}
and ${quantify("Infinity Point", this.gainedInfinityPoints, 2, 0)}.`;
},
startingResources() {
const gainedResources = [];
if (this.startingAM.gte(10)) gainedResources.push(`${quantify("Antimatter", this.startingAM, 2, 1)}`);
if (this.startingBoosts > 0) gainedResources.push(`${quantify("Dimension Boost", this.startingBoosts)}`);
if (this.willStartWithGalaxy) gainedResources.push(`${quantify("Galaxy", 1)}`);
return `You will start your next Infinity with ${makeEnumeration(gainedResources)}.`;
}
},
methods: {
update() {
this.gainedInfinities = gainedInfinities().round();
this.gainedInfinityPoints = gainedInfinityPoints().round();
this.startingBoosts = DimBoost.startingDimensionBoosts;
this.startingAM = Currency.antimatter.startingValue;
this.willStartWithGalaxy = InfinityUpgrade.skipResetGalaxy.isBought;
},
handleYesClick() {
bigCrunchResetRequest();
@ -49,15 +62,14 @@ export default {
</script>
<template>
<ModalWrapperChoice
:option="isFirstInfinity ? undefined : 'bigCrunch'"
@confirm="handleYesClick"
>
<template #header>
You are about to Infinity
</template>
<div class="c-modal-message__text">
{{ message }}
</div>
</ModalWrapperChoice>
<ResetModal
header="You are about to Infinity"
:message="message"
:gained-resources="ipGainInfo"
:starting-resources="startingResources"
:confirm-fn="handleYesClick"
:alternate-condition="isFirstInfinity"
:alternate-text="message"
:confirm-option="isFirstInfinity ? undefined : 'bigCrunch'"
/>
</template>

View File

@ -1,16 +1,17 @@
<script>
import ModalWrapperChoice from "@/components/modals/ModalWrapperChoice";
import ResetModal from "@/components/modals/prestige/ResetModal";
export default {
name: "EternityModal",
components: {
ModalWrapperChoice
ResetModal
},
data() {
return {
exitingEC: false,
startingIP: new Decimal(),
gainedEternityPoints: new Decimal()
gainedEternityPoints: new Decimal(),
gainedEternities: new Decimal()
};
},
computed: {
@ -22,7 +23,8 @@ export default {
on the Statistics tab. You will also gain an Eternity Point and unlock various upgrades.`;
},
gainedEPOnEternity() {
return `You will gain ${quantify("Eternity Point", this.gainedEternityPoints, 2)} on Eternity.`;
return `You will gain ${quantify("Eternity", this.gainedEternities, 2)}
and ${quantify("Eternity Point", this.gainedEternityPoints, 2)} on Eternity.`;
},
startWithIP() {
return this.startingIP.gt(0)
@ -46,6 +48,7 @@ export default {
this.exitingEC = EternityChallenge.isRunning;
this.startingIP = Currency.infinityPoints.startingValue;
this.gainedEternityPoints = gainedEternityPoints();
this.gainedEternities = gainedEternities();
},
handleYesClick() {
animateAndEternity();
@ -56,31 +59,14 @@ export default {
</script>
<template>
<ModalWrapperChoice
option="eternity"
@confirm="handleYesClick"
>
<template #header>
{{ exitingEC ? "Complete Eternity Challenge" : "You are about to Eternity" }}
</template>
<div v-if="!exitingEC">
<div class="c-modal-message__text">
{{ message }}
<br>
</div>
<br>
<div class="c-modal-message__text">
{{ gainedEPOnEternity }}
</div>
<br>
<div class="c-modal-message__text">
{{ startWithIP }}
</div>
</div>
<div v-else>
<div class="c-modal-message__text">
{{ eternityChallenge }}
</div>
</div>
</ModalWrapperChoice>
<ResetModal
:header="exitingEC ? 'Complete Eternity Challenge' : 'You are about to Eternity'"
:message="message"
:gained-resources="gainedEPOnEternity"
:starting-resources="startWithIP"
:confirm-fn="handleYesClick"
:alternate-condition="exitingEC"
:alternate-text="exitingEC ? eternityChallenge : undefined"
confirm-option="eternity"
/>
</template>

View File

@ -0,0 +1,81 @@
<script>
import ModalWrapperChoice from "@/components/modals/ModalWrapperChoice";
export default {
name: "ResetModal",
components: {
ModalWrapperChoice,
},
props: {
header: {
type: String,
required: true
},
message: {
type: String,
required: true
},
gainedResources: {
type: String,
required: true
},
startingResources: {
type: String,
required: false,
default: undefined
},
confirmOption: {
type: String,
required: false,
default: undefined
},
confirmFn: {
type: Function,
required: true
},
alternateText: {
type: String,
required: false,
default: undefined
},
alternateCondition: {
type: Boolean,
required: false,
default: false
}
},
};
</script>
<template>
<ModalWrapperChoice
:option="confirmOption"
@confirm="confirmFn"
>
<template #header>
{{ header }}
</template>
<div v-if="!alternateCondition">
<div class="c-modal-message__text">
{{ message }}
<br>
</div>
<br>
<div class="c-modal-message__text">
{{ gainedResources }}
</div>
<br>
<div
v-if="startingResources"
class="c-modal-message__text"
>
{{ startingResources }}
</div>
</div>
<div v-else>
<div class="c-modal-message__text">
{{ alternateText }}
</div>
</div>
</ModalWrapperChoice>
</template>

View File

@ -1,12 +1,11 @@
<script>
import HeaderTickspeedRowClassic from "../../ui-modes/HeaderTickspeedRowClassic";
import AntimatterDimensionProgressBar from "./AntimatterDimensionProgressBar";
import AntimatterDimensionRow from "./ClassicAntimatterDimensionRow";
import AntimatterDimensionsTabHeader from "./ClassicAntimatterDimensionsTabHeader";
import AntimatterGalaxyRow from "./ClassicAntimatterGalaxyRow";
import DimensionBoostRow from "./ClassicDimensionBoostRow";
import PrimaryButton from "@/components/PrimaryButton";
import TickspeedRow from "./TickspeedRow";
export default {
name: "ClassicAntimatterDimensionsTab",
@ -17,7 +16,7 @@ export default {
AntimatterGalaxyRow,
DimensionBoostRow,
AntimatterDimensionProgressBar,
HeaderTickspeedRowClassic,
TickspeedRow,
},
data() {
return {
@ -52,12 +51,9 @@ export default {
<template>
<div class="l-old-ui-antimatter-dim-tab">
<span>{{ multiplierText }}</span>
<AntimatterDimensionsTabHeader />
<HeaderTickspeedRowClassic
v-if="hasRealityButton"
:in-header="false"
/>
{{ multiplierText }}
<TickspeedRow />
<div class="l-dimensions-container">
<AntimatterDimensionRow
v-for="tier in 8"

View File

@ -15,6 +15,7 @@ export default {
isContinuumActive: false,
continuumValue: 0,
hasTutorial: false,
hasRealityButton: false,
};
},
computed: {
@ -33,21 +34,19 @@ export default {
tickspeedDisplay() {
return `Tickspeed: ${format(this.tickspeed, 2, 3)} / sec`;
},
showCostTitle() {
return this.cost.exponent < 1000000;
},
continuumString() {
return formatFloat(this.continuumValue, 2);
},
upgradeCount() {
const purchased = this.purchasedTickspeed;
if (!this.freeTickspeed) return `${formatInt(purchased)} Purchased`;
if (!this.freeTickspeed) return `${formatInt(purchased)} Purchased Upgrades`;
if (purchased === 0 || this.isContinuumActive) return `${formatInt(this.freeTickspeed)} Free Upgrades`;
return `${formatInt(purchased)} Purchased + ${formatInt(this.freeTickspeed)} Free`;
}
},
methods: {
update() {
this.hasRealityButton = PlayerProgress.realityUnlocked() || TimeStudy.reality.isBought;
this.purchasedTickspeed = player.totalTickBought;
this.freeTickspeed = FreeTickspeed.amount;
const isEC9Running = EternityChallenge(9).isRunning;
@ -76,17 +75,16 @@ export default {
if (!buyTickSpeed()) return;
Tutorial.turnOffEffect(TUTORIAL_STATE.TICKSPEED);
},
buyMaxUpgrade() {
if (!buyMaxTickSpeed()) return;
Tutorial.turnOffEffect(TUTORIAL_STATE.TICKSPEED);
},
}
};
</script>
<template>
<div :class="classObject">
<div class="tickspeed-labels">
<span>
{{ tickspeedDisplay }} <span>{{ multiplierDisplay }}</span>
</span>
</div>
<div class="tickspeed-buttons">
<button
v-tooltip="upgradeCount"
@ -94,10 +92,10 @@ export default {
@click="buyUpgrade"
>
<span v-if="isContinuumActive">
{{ continuumString }} (cont.)
Tickspeed Continuum: {{ continuumString }}
</span>
<span v-else>
Cost: {{ format(cost) }}
Tickspeed Cost: {{ format(cost) }}
</span>
<div
v-if="hasTutorial"
@ -108,11 +106,17 @@ export default {
v-if="!isContinuumActive"
class="o-primary-btn tickspeed-max-btn"
:class="{ 'o-primary-btn--disabled': !isAffordable && !isContinuumActive }"
onclick="buyMaxTickSpeed()"
@click="buyMaxUpgrade"
>
Buy Max
</button>
</div>
<div
v-if="hasRealityButton"
class="tickspeed-labels"
>
{{ tickspeedDisplay }} | {{ multiplierDisplay }}
</div>
</div>
</template>
@ -122,8 +126,35 @@ export default {
vertical-align: middle;
}
.tickspeed-btn {
position: relative;
width: 30rem;
height: 2.5rem;
padding: 0.25rem;
}
.tickspeed-labels {
color: var(--color-text);
padding: 0.25rem;
}
.l-tickspeed-container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding-top: 0.5rem;
}
.l-tickspeed-container--hidden {
visibility: hidden;
}
.tickspeed-max-btn {
margin-left: 0.5rem;
width: 10rem;
height: 2.5rem;
padding: 0.25rem;
}
.o-non-clickable {

View File

@ -56,10 +56,10 @@ export default {
this.rolling = GameEnd.endState > END_STATE_MARKERS.CREDITS_START;
this.scroll = (
Math.clampMax(GameEnd.endState, END_STATE_MARKERS.CREDITS_END) - END_STATE_MARKERS.CREDITS_START
) * 53;
) * 60;
if (this.audio) this.audio.volume = this.isMuted
? 0
: Math.clamp((GameEnd.endState - END_STATE_MARKERS.CREDITS_END), 0, 0.3);
: Math.clamp((GameEnd.endState - END_STATE_MARKERS.CREDITS_START), 0, 0.3);
},
}
};
@ -218,7 +218,7 @@ perfectly the same. */
}
.c-teresa-credits {
top: 130rem;
top: 145rem;
left: 65%;
color: var(--color-teresa--base);
animation: a-teresa-credits 10s ease-in-out infinite;
@ -232,21 +232,21 @@ perfectly the same. */
}
.c-enslaved-credits {
top: 220rem;
top: 235rem;
left: 52%;
color: var(--color-enslaved--base);
animation: a-enslaved-credits 10s linear infinite;
}
.c-v-credits {
top: 170rem;
top: 185rem;
left: 20%;
color: var(--color-v--base);
animation: a-v-credits 15s ease-in-out infinite;
}
.c-ra-credits {
top: 300rem;
top: 315rem;
left: 44%;
color: var(--color-ra--base);
animation: a-ra-credits 10s ease-in-out infinite;
@ -257,7 +257,7 @@ perfectly the same. */
}
.c-laitela-credits {
top: 90rem;
top: 105rem;
left: 13%;
color: #ffffff;
animation: a-laitela-credits 5s ease-in-out infinite;

View File

@ -28,6 +28,7 @@ export default {
boughtTesseracts: 0,
extraTesseracts: 0,
creditsClosed: false,
showLockedDimCostNote: true,
};
},
computed: {
@ -38,6 +39,7 @@ export default {
},
methods: {
update() {
this.showLockedDimCostNote = !InfinityDimension(8).isUnlocked;
this.isEC9Running = EternityChallenge(9).isRunning;
this.infinityPower.copyFrom(Currency.infinityPower);
this.conversionRate = InfinityDimensions.powerConversionRate;
@ -154,7 +156,8 @@ export default {
>
You have {{ quantifyInt("purchase", EC8PurchasesLeft) }} left.
</div>
<br>
Hold shift to see the Infinity Point cost for locked Infinity Dimensions.
<div v-if="showLockedDimCostNote">
Hold shift to see the Infinity Point cost for locked Infinity Dimensions.
</div>
</div>
</template>

View File

@ -28,6 +28,7 @@ export default {
boughtTesseracts: 0,
extraTesseracts: 0,
creditsClosed: false,
showLockedDimCostNote: true,
};
},
computed: {
@ -44,6 +45,7 @@ export default {
},
methods: {
update() {
this.showLockedDimCostNote = !InfinityDimension(8).isUnlocked;
this.isEC9Running = EternityChallenge(9).isRunning;
this.infinityPower.copyFrom(Currency.infinityPower);
this.conversionRate = InfinityDimensions.powerConversionRate;
@ -160,7 +162,8 @@ export default {
>
You have {{ quantifyInt("purchase", EC8PurchasesLeft) }} left.
</div>
<br>
Hold shift to see the Infinity Point cost for locked Infinity Dimensions.
<div v-if="showLockedDimCostNote">
Hold shift to see the Infinity Point cost for locked Infinity Dimensions.
</div>
</div>
</template>

View File

@ -70,7 +70,8 @@ export default {
if (this.remainingTimeText === "") {
if (remainingTime === 0) {
this.remainingTimeText = "At Infinite Replicanti";
this.remainingTimeText = `At Infinite Replicanti (normally takes
${TimeSpan.fromSeconds(secondsPerGalaxy.toNumber())})`;
} else {
this.remainingTimeText = `${TimeSpan.fromSeconds(remainingTime)} remaining until Infinite Replicanti`;
}

View File

@ -79,11 +79,13 @@ export default {
return new ReplicantiUpgradeButtonSetup(
upgrade,
value => {
let description = `Max Replicanti Galaxies: ${formatInt(value)}`;
let description = `Max Replicanti Galaxies: `;
const extra = upgrade.extra;
if (extra > 0) {
const total = value + extra;
description += ` + ${formatInt(extra)} = ${formatInt(total)}`;
description += `<br>${formatInt(value)} + ${formatInt(extra)} = ${formatInt(total)}`;
} else {
description += formatInt(value);
}
return description;
},

View File

@ -69,7 +69,7 @@ export class ReplicantiUpgradeButtonSetup {
class="o-primary-btn--replicanti-upgrade"
@click="upgrade.purchase()"
>
<span>{{ description }}</span>
<span v-html="description" />
<template v-if="!isCapped">
<br>
<span>{{ costDescription }}</span>

View File

@ -17,7 +17,8 @@ export default {
upgradeThreshold: new Decimal(0),
shardsPerSecond: new Decimal(0),
incomeType: "",
areAutobuyersUnlocked: false
areAutobuyersUnlocked: false,
showLockedDimCostNote: true,
};
},
computed: {
@ -25,6 +26,7 @@ export default {
},
methods: {
update() {
this.showLockedDimCostNote = !TimeDimension(8).isUnlocked && player.realities >= 1;
this.totalUpgrades = player.totalTickGained;
this.multPerTickspeed = FreeTickspeed.multToNext;
this.tickspeedSoftcap = FreeTickspeed.softcap;
@ -96,8 +98,9 @@ export default {
<br>
and costs increase much faster after {{ format(costIncreases[2]) }} Eternity Points.
<br>
Hold shift to see the Eternity Point cost for locked Time Dimensions.
<br>
<div v-if="showLockedDimCostNote">
Hold shift to see the Eternity Point cost for locked Time Dimensions.
</div>
Any 8th Time Dimensions purchased above {{ format(1e8) }} will not further increase the multiplier.
</div>
</div>

View File

@ -17,7 +17,8 @@ export default {
upgradeThreshold: new Decimal(0),
shardsPerSecond: new Decimal(0),
incomeType: "",
areAutobuyersUnlocked: false
areAutobuyersUnlocked: false,
showLockedDimCostNote: true,
};
},
computed: {
@ -25,6 +26,7 @@ export default {
},
methods: {
update() {
this.showLockedDimCostNote = !TimeDimension(8).isUnlocked && player.realities >= 1;
this.totalUpgrades = player.totalTickGained;
this.multPerTickspeed = FreeTickspeed.multToNext;
this.tickspeedSoftcap = FreeTickspeed.softcap;
@ -94,7 +96,10 @@ export default {
<br>
and costs increase much faster after {{ format(costIncreases[2]) }} Eternity Points.
<br>
Hold shift to see the Eternity Point cost for locked Time Dimensions.
<div v-if="showLockedDimCostNote">
Hold shift to see the Eternity Point cost for locked Time Dimensions.
</div>
Any 8th Time Dimensions purchased above {{ format(1e8) }} will not further increase the multiplier.
</div>
</div>
</template>

View File

@ -14,23 +14,23 @@ export default {
},
data() {
return {
isLimitedByPelle: false
isLocked: false
};
},
computed: {
isEnabled() {
if (this.isLimitedByPelle) return false;
if (this.isLocked) return false;
return this.budget.gte(this.cost);
},
enabledClass() {
if (!this.isEnabled || this.isLimitedByPelle) return "c-tt-buy-button--locked";
if (!this.isEnabled || this.isLocked) return "c-tt-buy-button--locked";
return "c-tt-buy-button--unlocked";
}
},
methods: {
update() {
this.isLimitedByPelle = Pelle.isDoomed && player.eternities.eq(0);
this.isLocked = player.eternities.eq(0);
}
}
};
@ -42,6 +42,6 @@ export default {
:class="enabledClass"
@click="action"
>
{{ isLimitedByPelle ? "Requires Eternity to unlock" : formatCost(cost) }}
{{ isLocked ? "Requires Eternity to unlock" : formatCost(cost) }}
</button>
</template>

View File

@ -0,0 +1,71 @@
<script>
export default {
name: "BigCrunchButton",
data() {
return {
isModern: false,
smallCrunch: false,
shouldDisplay: false
};
},
methods: {
update() {
this.shouldDisplay = !player.break && Player.canCrunch;
if (!this.shouldDisplay) return;
this.isModern = player.options.newUI;
this.smallCrunch = Time.bestInfinityRealTime.totalMinutes <= 1;
},
handleClick() {
if (PlayerProgress.infinityUnlocked()) bigCrunchResetRequest();
else Modal.bigCrunch.show();
}
}
};
</script>
<template>
<span v-if="shouldDisplay">
<div v-if="isModern">
<h3
v-if="!smallCrunch"
class="l-spacing"
>
The world has collapsed due to excess antimatter.
</h3>
<button
:class="{
'btn-big-crunch': true,
'btn-big-crunch--small': smallCrunch
}"
@click="handleClick"
>
Big Crunch
</button>
</div>
<div v-else>
<button
:class="{
'o-tab-btn': true,
'o-big-crunch-btn': true,
'l-old-ui__big-crunch-btn': true,
'l-old-ui__big-crunch-btn--overlay': smallCrunch
}"
@click="handleClick"
>
Big Crunch
</button>
<div
v-if="!smallCrunch"
class="o-emptiness"
>
The world has collapsed due to excess of antimatter.
</div>
</div>
</span>
</template>
<style scoped>
.l-spacing {
margin-top: 1rem;
}
</style>

View File

@ -1,7 +1,7 @@
<script>
import HeaderBlackHole from "./HeaderBlackHole";
import HeaderChallengeDisplay from "./HeaderChallengeDisplay";
import HeaderChallengeEffects from "./HeaderChallengeEffects";
import HeaderGameSpeed from "./HeaderGameSpeed";
import HeaderPrestigeGroup from "./HeaderPrestigeGroup";
export default {
@ -9,7 +9,7 @@ export default {
components: {
HeaderChallengeDisplay,
HeaderChallengeEffects,
HeaderGameSpeed,
HeaderBlackHole,
HeaderPrestigeGroup,
},
};
@ -20,7 +20,7 @@ export default {
<HeaderChallengeDisplay />
<HeaderChallengeEffects />
<HeaderPrestigeGroup />
<HeaderGameSpeed />
<HeaderBlackHole />
</div>
</template>

View File

@ -1,35 +0,0 @@
<script>
import GameSpeedDisplay from "../GameSpeedDisplay";
import HeaderBlackHole from "./HeaderBlackHole";
export default {
name: "HeaderGameSpeed",
components: {
GameSpeedDisplay,
HeaderBlackHole
},
data() {
return {
showSpeed: false,
};
},
methods: {
update() {
const ec12 = EternityChallenge(12);
const hasSeenAlteredSpeed = PlayerProgress.realityUnlocked() || ec12.completions > 0 || ec12.isRunning;
const hasRealityButton = PlayerProgress.realityUnlocked() || TimeStudy.reality.isBought;
// This is additionally shown in a different place on Modern, so we hide it to prevent showing it twice
this.showSpeed = hasRealityButton || (hasSeenAlteredSpeed && !player.options.newUI);
},
}
};
</script>
<template>
<span>
<GameSpeedDisplay v-if="showSpeed" />
<br>
<HeaderBlackHole />
</span>
</template>

View File

@ -2,7 +2,7 @@
import GameSpeedDisplay from "@/components/GameSpeedDisplay";
export default {
name: "HeaderTickspeedRowModern",
name: "HeaderTickspeedInfo",
components: {
GameSpeedDisplay
},
@ -11,23 +11,27 @@ export default {
mult: new Decimal(0),
tickspeed: new Decimal(0),
galaxyCount: 0,
purchasedTickspeed: 0,
freeTickspeed: 0,
};
},
computed: {
tickspeedDisplay() {
return `AD Tickspeed: ${format(this.tickspeed, 2, 3)} / sec`;
return `Total Tickspeed: ${format(this.tickspeed, 2, 3)} / sec`;
},
perUpgrade() {
if (InfinityChallenge(3).isRunning) return `Tickspeed upgrades give
${formatX(1.05 + this.galaxyCount * 0.005, 3, 3)} to all ADs`;
return `${formatX(this.mult.reciprocal(), 2, 3)} faster per upgrade`;
}
return `ADs produce ${formatX(this.mult.reciprocal(), 2, 3)} faster per Tickspeed upgrade`;
},
},
methods: {
update() {
this.mult.copyFrom(Tickspeed.multiplier);
this.tickspeed.copyFrom(Tickspeed.perSecond);
this.galaxyCount = player.galaxies;
this.purchasedTickspeed = player.totalTickBought;
this.freeTickspeed = FreeTickspeed.amount;
},
},
};
@ -35,11 +39,11 @@ export default {
<template>
<div>
<br>
{{ tickspeedDisplay }}
<br>
{{ perUpgrade }}
<br>
{{ tickspeedDisplay }}
<br>
<GameSpeedDisplay />
</div>
</template>

View File

@ -1,146 +0,0 @@
<script>
import PrimaryButton from "@/components/PrimaryButton";
export default {
name: "HeaderTickspeedRowClassic",
components: {
PrimaryButton,
},
props: {
inHeader: {
type: Boolean,
required: false,
default: true,
}
},
data() {
return {
purchasedTickspeed: 0,
freeTickspeed: 0,
isVisible: false,
mult: new Decimal(0),
cost: new Decimal(0),
isAffordable: false,
tickspeed: new Decimal(0),
galaxyCount: 0,
isContinuumActive: false,
continuumValue: 0,
hasTutorial: false,
};
},
computed: {
classObject() {
return {
"c-game-header__tickspeed-row": true,
"c-game-header__tickspeed-row--hidden": !this.isVisible,
"l-inline-padding": !this.inHeader
};
},
multiplierDisplay() {
if (InfinityChallenge(3).isRunning) return `Multiply all Antimatter Dimensions by
${formatX(1.05 + this.galaxyCount * 0.005, 3, 3)}`;
const tickmult = this.mult;
return `${formatX(tickmult.reciprocal(), 2, 3)} faster / upgrade`;
},
tickspeedDisplay() {
return `Tickspeed: ${format(this.tickspeed, 2, 3)} / sec`;
},
continuumString() {
return formatFloat(this.continuumValue, 2);
},
upgradeCount() {
const purchased = this.purchasedTickspeed;
if (!this.freeTickspeed) return `${formatInt(purchased)} Purchased`;
if (purchased === 0 || this.isContinuumActive) return `${formatInt(this.freeTickspeed)} Free Upgrades`;
return `${formatInt(purchased)} Purchased + ${formatInt(this.freeTickspeed)} Free`;
}
},
methods: {
update() {
this.purchasedTickspeed = player.totalTickBought;
this.freeTickspeed = FreeTickspeed.amount;
const isEC9Running = EternityChallenge(9).isRunning;
this.isVisible = Tickspeed.isUnlocked || isEC9Running;
if (!this.isVisible) return;
this.mult.copyFrom(Tickspeed.multiplier);
this.cost.copyFrom(Tickspeed.cost);
this.isAffordable = !isEC9Running && canAfford(Tickspeed.cost);
this.tickspeed.copyFrom(Tickspeed.perSecond);
this.galaxyCount = player.galaxies;
this.isContinuumActive = Laitela.continuumActive;
if (this.isContinuumActive) this.continuumValue = Tickspeed.continuumValue;
this.hasTutorial = Tutorial.isActive(TUTORIAL_STATE.TICKSPEED);
},
buttonClass() {
return {
"l-long-button": !this.inHeader,
"o-primary-btn--tickspeed": true,
"o-continuum": this.isContinuumActive,
"tutorial--glow": this.isAffordable && this.hasTutorial
};
},
buyUpgrade() {
if (!buyTickSpeed()) return;
Tutorial.turnOffEffect(TUTORIAL_STATE.TICKSPEED);
},
},
};
</script>
<template>
<div :class="classObject">
<div v-if="inHeader">
{{ multiplierDisplay }}
</div>
<div>
<PrimaryButton
v-tooltip="upgradeCount"
:enabled="isAffordable || isContinuumActive"
:class="buttonClass()"
@click="buyUpgrade"
>
<span v-if="!inHeader">Tickspeed </span>
<span v-if="isContinuumActive">Continuum: {{ continuumString }}</span>
<span v-else>Cost: {{ format(cost) }}</span>
<div
v-if="hasTutorial"
class="fas fa-circle-exclamation l-notification-icon"
/>
</PrimaryButton>
<PrimaryButton
v-if="!isContinuumActive"
:enabled="isAffordable"
class="o-primary-btn--buy-max"
onclick="buyMaxTickSpeed()"
>
Buy Max
</PrimaryButton>
</div>
<div>
{{ tickspeedDisplay }} <span v-if="!inHeader">({{ multiplierDisplay }})</span>
</div>
</div>
</template>
<style scoped>
.o-primary-btn--tickspeed {
width: 17rem;
position: relative;
font-size: 1.2rem;
margin-right: 0.4rem;
transition: width 0s;
}
.o-continuum {
transition: width 0s;
cursor: auto;
}
.l-inline-padding {
padding-top: 1rem;
}
.l-long-button {
width: 30rem;
}
</style>

View File

@ -1,24 +0,0 @@
<script>
export default {
name: "ClassicBigCrunchButton",
methods: {
handleClick() {
if (PlayerProgress.infinityUnlocked()) bigCrunchResetRequest();
else Modal.bigCrunch.show();
}
}
};
</script>
<template>
<button
class="o-tab-btn o-big-crunch-btn"
@click="handleClick"
>
Big Crunch
</button>
</template>
<style scoped>
</style>

View File

@ -1,8 +1,9 @@
<script>
import BigCrunchButton from "../BigCrunchButton";
import GameHeader from "../GameHeader";
import NewsTicker from "../NewsTicker";
import ClassicBigCrunchButton from "./ClassicBigCrunchButton";
import ClassicSubtabBar from "./ClassicSubtabBar";
import ClassicTabBar from "./ClassicTabBar";
import EternityPointsHeader from "@/components/EternityPointsHeader";
@ -12,12 +13,12 @@ export default {
name: "ClassicUi",
components: {
GameHeader,
ClassicBigCrunchButton,
ClassicSubtabBar,
ClassicTabBar,
NewsTicker,
InfinityPointsHeader,
EternityPointsHeader
EternityPointsHeader,
BigCrunchButton
},
data() {
return {
@ -34,9 +35,7 @@ export default {
methods: {
update() {
const crunchButtonVisible = !player.break && Player.canCrunch;
const reachedInfinityInMinute = Time.bestInfinityRealTime.totalMinutes <= 1;
this.bigCrunch = crunchButtonVisible && !reachedInfinityInMinute;
this.smallCrunch = crunchButtonVisible && reachedInfinityInMinute;
this.bigCrunch = crunchButtonVisible && Time.bestInfinityRealTime.totalMinutes > 1;
}
},
};
@ -52,13 +51,8 @@ export default {
type="text/css"
href="stylesheets/old-ui.css"
>
<template v-if="bigCrunch">
<ClassicBigCrunchButton class="l-old-ui__big-crunch-btn" />
<div class="o-emptiness">
The world has collapsed due to excess of antimatter.
</div>
</template>
<template v-else>
<BigCrunchButton />
<template v-if="!bigCrunch">
<NewsTicker
v-if="news"
class="l-old-ui__news-bar"
@ -70,10 +64,6 @@ export default {
v-if="tab.config.before"
/>
<ClassicSubtabBar />
<ClassicBigCrunchButton
v-show="smallCrunch"
class="l-old-ui__big-crunch-btn l-old-ui__big-crunch-btn--overlay"
/>
<div class="l-old-ui__page">
<slot />
</div>

View File

@ -1,7 +1,8 @@
<script>
import BigCrunchButton from "../BigCrunchButton";
import HeaderBlackHole from "../HeaderBlackHole";
import HeaderChallengeDisplay from "../HeaderChallengeDisplay";
import HeaderChallengeEffects from "../HeaderChallengeEffects";
import HeaderGameSpeed from "../HeaderGameSpeed";
import HeaderPrestigeGroup from "../HeaderPrestigeGroup";
import NewsTicker from "../NewsTicker";
@ -9,16 +10,16 @@ import NewsTicker from "../NewsTicker";
export default {
name: "ModernUi",
components: {
BigCrunchButton,
HeaderChallengeDisplay,
HeaderChallengeEffects,
NewsTicker,
HeaderGameSpeed,
HeaderBlackHole,
HeaderPrestigeGroup
},
data() {
return {
bigCrunch: false,
smallCrunch: false,
bigCrunch: false
};
},
computed: {
@ -32,12 +33,10 @@ export default {
methods: {
update() {
const crunchButtonVisible = !player.break && Player.canCrunch;
const reachedInfinityInMinute = Time.bestInfinityRealTime.totalMinutes <= 1;
this.bigCrunch = crunchButtonVisible && !reachedInfinityInMinute;
this.smallCrunch = crunchButtonVisible && reachedInfinityInMinute;
this.bigCrunch = crunchButtonVisible && Time.bestInfinityRealTime.totalMinutes > 1;
},
handleClick() {
if (PlayerProgress.infinityUnlocked()) bigCrunchResetRequest();
if (PlayerProgress.infinityUnlocked()) manualBigCrunchResetRequest();
else Modal.bigCrunch.show();
}
},
@ -56,35 +55,17 @@ export default {
:style="topMargin"
>
<NewsTicker v-if="news" />
<BigCrunchButton />
<div
v-if="bigCrunch"
class="l-new-ui-big-crunch__container"
>
<h3>The world has collapsed due to excess antimatter.</h3>
<button
class="btn-big-crunch"
@click="handleClick"
>
Big Crunch
</button>
</div>
<div
v-else
v-if="!bigCrunch"
class="tab-container"
>
<HeaderPrestigeGroup />
<div class="information-header">
<HeaderChallengeDisplay />
<HeaderChallengeEffects />
<HeaderGameSpeed />
<HeaderBlackHole />
</div>
<button
v-if="smallCrunch && !bigCrunch"
class="btn-big-crunch btn-big-crunch--small"
onclick="bigCrunchResetRequest()"
>
Big Crunch
</button>
<slot />
</div>
</div>

View File

@ -2,8 +2,7 @@
import ArmageddonButton from "../../tabs/celestial-pelle/ArmageddonButton";
import RealityCurrencyHeader from "../../RealityCurrencyHeader";
import HeaderTickspeedRowClassic from "../HeaderTickspeedRowClassic";
import HeaderTickspeedRowModern from "../HeaderTickspeedRowModern";
import HeaderTickspeedInfo from "../HeaderTickspeedInfo";
import RealityButton from "./RealityButton";
@ -13,14 +12,14 @@ import RealityButton from "./RealityButton";
export default {
name: "HeaderCenterContainer",
components: {
HeaderTickspeedRowClassic,
HeaderTickspeedRowModern,
HeaderTickspeedInfo,
RealityCurrencyHeader,
RealityButton,
ArmageddonButton,
},
data() {
return {
shouldDisplay: true,
isModern: false,
hasRealityButton: false,
isDoomed: false,
@ -30,6 +29,9 @@ export default {
},
methods: {
update() {
this.shouldDisplay = player.break || !Player.canCrunch;
if (!this.shouldDisplay) return;
this.isModern = player.options.newUI;
this.isDoomed = Pelle.isDoomed;
this.antimatter.copyFrom(Currency.antimatter);
@ -41,7 +43,10 @@ export default {
</script>
<template>
<div class="c-prestige-button-container">
<div
v-if="shouldDisplay"
class="c-prestige-button-container"
>
<span>You have <span class="c-game-header__antimatter">{{ format(antimatter, 2, 1) }}</span> antimatter.</span>
<div
v-if="hasRealityButton"
@ -57,8 +62,7 @@ export default {
<div v-else>
You are getting {{ format(antimatterPerSec, 2) }} antimatter per second.
<br>
<HeaderTickspeedRowModern v-if="isModern" />
<HeaderTickspeedRowClassic v-else />
<HeaderTickspeedInfo />
</div>
</div>
</template>

View File

@ -26,7 +26,7 @@ export default {
},
formatMachineStats() {
if (!PlayerProgress.realityUnlocked() && this.nextMachineEP.gt("1e8000")) {
return `(RM this Reality is capped!)`;
return `(Capped this Reality!)`;
}
if (this.machinesGained.gt(0) && this.machinesGained.lt(100)) {
return `(Next at ${format(this.nextMachineEP, 2)} EP)`;