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(); NormalChallenge(1).complete();
} }
if (!challenge) return; 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.complete();
challenge.updateChallengeTime(); challenge.updateChallengeTime();
if (!player.options.retryChallenge) { if (!player.options.retryChallenge) {
@ -22,9 +27,7 @@ function handleChallengeCompletion() {
export function manualBigCrunchResetRequest() { export function manualBigCrunchResetRequest() {
if (!Player.canCrunch) return; if (!Player.canCrunch) return;
if (GameEnd.creditsEverClosed) return; if (GameEnd.creditsEverClosed) return;
// Before the player has broken infinity, the confirmation modal should never be shown if (player.options.confirmations.bigCrunch) {
if ((player.break || PlayerProgress.eternityUnlocked()) &&
player.options.confirmations.bigCrunch) {
Modal.bigCrunch.show(); Modal.bigCrunch.show();
} else { } else {
bigCrunchResetRequest(); bigCrunchResetRequest();

View File

@ -120,7 +120,7 @@ export const Pelle = {
}, },
get disabledAchievements() { 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]; 74, 65, 55, 54, 37];
}, },

View File

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

View File

@ -116,7 +116,7 @@ export function getDilationGainPerSecond() {
return new Decimal(tachyonEffect) return new Decimal(tachyonEffect)
.timesEffectsOf(DilationUpgrade.dtGain, DilationUpgrade.dtGainPelle, DilationUpgrade.flatDilationMult) .timesEffectsOf(DilationUpgrade.dtGain, DilationUpgrade.dtGainPelle, DilationUpgrade.flatDilationMult)
.times(ShopPurchase.dilatedTimePurchases.currentMult ** 0.5) .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) let dtRate = new Decimal(Currency.tachyonParticles.value)
.timesEffectsOf( .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 // 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 // act dynamically on this fixed base value elsewhere solves that issue
export function getBaseTP(antimatter) { export function getBaseTP(antimatter) {
if (!Player.canEternity) return DC.D0;
const am = (isInCelestialReality() || Pelle.isDoomed) const am = (isInCelestialReality() || Pelle.isDoomed)
? antimatter ? antimatter
: Ra.unlocks.unlockDilationStartingTP.effectOrDefault(antimatter); : Ra.unlocks.unlockDilationStartingTP.effectOrDefault(antimatter);

View File

@ -163,6 +163,14 @@ export class DimBoost {
static get totalBoosts() { static get totalBoosts() {
return Math.floor(this.purchasedBoosts + this.imaginaryBoosts); 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) { 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); const dim = TimeDimension(tier);
if (tier > 4 && !TimeStudy.timeDimension(tier).isBought) return false; if (tier > 4 && !TimeStudy.timeDimension(tier).isBought) return false;
if (Enslaved.isRunning) return buySingleTimeDimension(tier); if (Enslaved.isRunning) return buySingleTimeDimension(tier);
const bulk = bulkBuyBinarySearch(Currency.eternityPoints.value, { const bulk = bulkBuyBinarySearch(eternityPoints, {
costFunction: bought => dim.nextCost(bought), costFunction: bought => dim.nextCost(bought),
cumulative: true, cumulative: true,
firstCost: dim.cost, firstCost: dim.cost,
@ -52,33 +52,23 @@ export function buyMaxTimeDimension(tier) {
return true; return true;
} }
export function maxAllTimeDimensions(checkAutobuyers = false) { export function maxAllTimeDimensions() {
// Default behavior: Buy as many as possible, starting with the highest dimension first // Try to buy single from the highest affordable new dimensions
// (reduces overhead at higher EP) for (let i = 8; i > 0 && TimeDimension(i).bought === 0; i--) {
if (Currency.eternityPoints.exponent >= 10) { buySingleTimeDimension(i);
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);
}
// Should never take more than like 50 iterations; explicit infinite loops make me nervous // Buy everything costing less than 1% of initial EP
for (let stop = 0; stop < 1000; stop++) { const eternityPoints = Currency.eternityPoints.value.times(0.01);
let cheapestDim = 0; for (let i = 8; i > 0; i--) {
let cheapestCost = 1e10; buyMaxTimeDimension(i, eternityPoints);
for (let i = 1; i <= 4; i++) { }
if (TimeDimension(i).cost.lte(cheapestCost) && (!checkAutobuyers || Autobuyer.timeDimension(i).isActive)) {
cheapestDim = i; // Loop buying the cheapest dimension possible; explicit infinite loops make me nervous
cheapestCost = TimeDimension(i).cost; 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));
let bought = false; if (!buySingleTimeDimension(cheapestDim.tier)) break;
if (cheapestDim !== 0 && Currency.eternityPoints.gte(cheapestCost)) bought = buySingleTimeDimension(cheapestDim);
if (!bought) break;
}
} }
} }

View File

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

View File

@ -296,9 +296,12 @@ GameKeyboard.bindHotkey("alt+y", () => toggleAutobuyer(Autobuyer.reality));
(function() { (function() {
function bindDimensionHotkeys(tier) { function bindDimensionHotkeys(tier) {
GameKeyboard.bindRepeatableHotkey(`${tier}`, () => buyManyDimension(tier)); GameKeyboard.bindRepeatableHotkey(`${tier}`, () => buyManyDimension(tier));
GameKeyboard.bindRepeatableHotkey(`num${tier}`, () => buyManyDimension(tier));
GameKeyboard.bindRepeatableHotkey(`shift+${tier}`, () => buyOneDimension(tier)); GameKeyboard.bindRepeatableHotkey(`shift+${tier}`, () => buyOneDimension(tier));
GameKeyboard.bindHotkey(`alt+${tier}`, () => toggleAutobuyer(Autobuyer.antimatterDimension(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+${tier}`, () => toggleBuySingles(Autobuyer.antimatterDimension(tier)));
GameKeyboard.bindHotkey(`shift+alt+num${tier}`, () => toggleBuySingles(Autobuyer.antimatterDimension(tier)));
} }
for (let i = 1; i < 9; i++) bindDimensionHotkeys(i); 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) { if (this.id >= 15 && this.id <= 18) {
DarkMatterDimension(this.id - 14).amount = DC.D1; DarkMatterDimension(this.id - 14).amount = DC.D1;
Tab.celestials.laitela.show(); Tab.celestials.laitela.show();
if (this.id === 17) Laitela.quotes.thirdDMD.show();
} }
if (this.id === 19) { if (this.id === 19) {
Tab.celestials.laitela.show(); Tab.celestials.laitela.show();
} }
if (this.id === 21) {
Laitela.quotes.finalRowIM.show();
}
if (this.id === 22) { if (this.id === 22) {
BASIC_GLYPH_TYPES.forEach(x => player.reality.glyphs.sac[x] = ImaginaryUpgrade(22).effectValue); 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 (ic.isUnlocked || ic.isCompleted) continue;
if (value.lt(ic.unlockAM)) break; if (value.lt(ic.unlockAM)) break;
// This has a reasonably high likelihood of happening when the player isn't looking at the game, so // 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 // we also give it a tab notification
GameUI.notify.infinity(`You have unlocked Infinity Challenge ${ic.id}`, 300000); 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"; 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 { class KeySpin {
constructor(key, action) { constructor(key, action) {
this.key = key; this.key = key;

View File

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

View File

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

View File

@ -80,12 +80,12 @@ GameDatabase.challenges.eternity = [
description: () => { description: () => {
if (Enslaved.isRunning) { if (Enslaved.isRunning) {
return Notations.current === Notation.shi 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." " 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" + : "you c㏰'퐚 gai鸭 Ant꟢matterﶓa⁍axie㮾랜䂇rma㦂l the cost of upgrading your max Replicanti" +
" Galaxies is massively reduced"; " 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."; " Galaxies is massively reduced.";
}, },
goal: DC.E850, goal: DC.E850,
@ -103,7 +103,7 @@ GameDatabase.challenges.eternity = [
{ {
id: 7, id: 7,
description: 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.", "7th Antimatter Dimensions. Tickspeed also directly applies to Infinity and Time Dimensions.",
goal: DC.E2000, goal: DC.E2000,
pelleGoal: DC.E2700, pelleGoal: DC.E2700,
@ -133,7 +133,7 @@ GameDatabase.challenges.eternity = [
}, },
{ {
id: 9, 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()}`, Time Dimensions with greatly reduced effect. ${specialInfinityGlyphDisabledEffectText()}`,
goal: DC.E1750, goal: DC.E1750,
pelleGoal: DC.E2900, pelleGoal: DC.E2900,
@ -168,7 +168,7 @@ GameDatabase.challenges.eternity = [
}, },
{ {
id: 11, 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()}`, Infinity Power and Dimension Boosts (to Antimatter Dimensions). ${specialInfinityGlyphDisabledEffectText()}`,
goal: DC.E500, goal: DC.E500,
pelleGoal: DC.E11200, pelleGoal: DC.E11200,

View File

@ -4,8 +4,8 @@ import { GameDatabase } from "../game-database";
GameDatabase.challenges.infinity = [ GameDatabase.challenges.infinity = [
{ {
id: 1, id: 1,
description: `all Normal Challenges, with the exception of description: `all Normal Challenge restrictions are active at once, with the exception of the
Tickspeed (C9) and Big Crunch (C12) Challenges, are active at the same time.`, Tickspeed (C9) and Big Crunch (C12) Challenges.`,
goal: DC.E650, goal: DC.E650,
isQuickResettable: true, isQuickResettable: true,
reward: { reward: {
@ -17,7 +17,7 @@ GameDatabase.challenges.infinity = [
}, },
{ {
id: 2, 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.`, an 8th Antimatter Dimension.`,
goal: DC.E10500, goal: DC.E10500,
isQuickResettable: false, isQuickResettable: false,
@ -50,7 +50,7 @@ GameDatabase.challenges.infinity = [
{ {
id: 4, id: 4,
description: () => 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)}).`, produce less (${formatPow(0.25, 2, 2)}).`,
goal: DC.E13000, goal: DC.E13000,
isQuickResettable: true, isQuickResettable: true,
@ -64,8 +64,8 @@ GameDatabase.challenges.infinity = [
{ {
id: 5, id: 5,
description: description:
`buying Antimatter Dimensions 1-4 causes all smaller Antimatter Dimension costs to increase, `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 5-8 causes all larger Antimatter Dimension costs to increase.`,
goal: DC.E16500, goal: DC.E16500,
isQuickResettable: true, isQuickResettable: true,
reward: { reward: {
@ -79,8 +79,8 @@ GameDatabase.challenges.infinity = [
{ {
id: 6, id: 6,
description: () => description: () =>
`once you have at least ${formatInt(1)} 2nd Antimatter Dimension, exponentially rising matter `exponentially rising matter divides the multiplier on all of your Antimatter Dimensions
divides the multiplier on all of your Antimatter Dimensions.`, once you have at least ${formatInt(1)} 2nd Antimatter Dimension.`,
goal: DC.D2E22222, goal: DC.D2E22222,
isQuickResettable: true, isQuickResettable: true,
effect: () => Currency.matter.value.clampMin(1), effect: () => Currency.matter.value.clampMin(1),
@ -94,14 +94,24 @@ GameDatabase.challenges.infinity = [
}, },
{ {
id: 7, id: 7,
description: () => description: () => {
`you can't get Antimatter Galaxies, but Dimension Boost multiplier // Copied from DimBoost.power; this is the base amount before any multipliers. Post-eternity this isn't
${formatX(2.5, 1, 1)} ${formatX(10)}`, // 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, goal: DC.E10000,
isQuickResettable: false, isQuickResettable: false,
effect: 10, effect: 10,
reward: { 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 effect: 4
}, },
unlockAM: DC.E23000, unlockAM: DC.E23000,
@ -109,8 +119,8 @@ GameDatabase.challenges.infinity = [
{ {
id: 8, id: 8,
description: () => description: () =>
`your production is at ${formatPercents(1)} after `your production rapidly and continually drops down over time. Purchasing an Antimatter Dimension or Tickspeed
purchasing anything, after that it rapidly drops down.`, upgrade sets production back to ${formatPercents(1)} before it starts dropping again.`,
goal: DC.E27000, goal: DC.E27000,
isQuickResettable: true, isQuickResettable: true,
effect: () => DC.D0_8446303389034288.pow( effect: () => DC.D0_8446303389034288.pow(

View File

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

View File

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

View File

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

View File

@ -2290,7 +2290,7 @@ GameDatabase.news = [
{ {
id: "a355", id: "a355",
text: 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", id: "a356",

View File

@ -13,8 +13,9 @@ GameDatabase.progressStages = [
* @property {function: @return Boolean} hasReached Checking function for whether this stage has been * @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 * 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 * last one checked (first entry) always returns true as a catch-all condition
* @property {String} suggestedResource A resource or multiple resources which may be * @property {String | function: @return Number} suggestedResource A resource or multiple resources which may be
* useful for the player to aim for at this stage * 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 * @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 * 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 * 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, id: PROGRESS_STAGE.PRE_INFINITY,
name: "Before Infinity", name: "Antimatter Production",
hasReached: () => true, hasReached: () => true,
suggestedResource: "Antimatter", suggestedResource: "Antimatter",
// Galaxies are worth 1/3 each, boosts break ties within galaxies, and antimatter breaks ties within boosts // 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, id: PROGRESS_STAGE.EARLY_ETERNITY,
name: "Eternity", name: "Eternity",
hasReached: save => new Decimal(save.eternities).gt(0), 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), subProgressValue: save => Math.sqrt(new Decimal(save.eternityPoints).pLog10() / 18),
}, },
{ {
@ -80,10 +81,13 @@ GameDatabase.progressStages = [
id: PROGRESS_STAGE.LATE_ETERNITY, id: PROGRESS_STAGE.LATE_ETERNITY,
name: "Late Eternity", name: "Late Eternity",
hasReached: save => new Decimal(save.dilation.dilatedTime).gt(1e15), 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 // 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 // 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, id: PROGRESS_STAGE.EARLY_REALITY,

View File

@ -127,9 +127,9 @@ GameDatabase.reality.upgrades = [
name: "Existentially Prolong", name: "Existentially Prolong",
id: 10, id: 10,
cost: 15, 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, hasFailed: () => !player.requirementChecks.reality.noEternities,
checkRequirement: () => Currency.infinityPoints.exponent >= 450 && checkRequirement: () => Currency.infinityPoints.exponent >= 400 &&
player.requirementChecks.reality.noEternities, player.requirementChecks.reality.noEternities,
checkEvent: GAME_EVENT.ETERNITY_RESET_BEFORE, checkEvent: GAME_EVENT.ETERNITY_RESET_BEFORE,
description: () => `Start every Reality with ${formatInt(100)} Eternities (also applies to current Reality)`, 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, checkRequirement: () => Currency.eternityPoints.exponent >= 10 && player.epmultUpgrades === 0,
checkEvent: GAME_EVENT.ETERNITY_RESET_AFTER, checkEvent: GAME_EVENT.ETERNITY_RESET_AFTER,
description: () => `Boost Tachyon Particle gain based on ${formatX(5)} Eternity Point multiplier`, 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) formatEffect: value => formatX(value, 2, 2)
}, },
{ {

View File

@ -10,7 +10,9 @@ class GameProgressState extends GameMechanicState {
} }
get suggestedResource() { 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() { get canAfford() {
return this.currency.gte(this.cost) && return this.currency.gte(this.cost) && !player.eternities.eq(0);
!(Pelle.isDoomed && player.eternities.eq(0));
} }
reset() { reset() {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -16,12 +16,6 @@ export default {
required: true required: true
} }
}, },
data() {
return {
startTime: 0,
remainingTime: 0,
};
},
computed: { computed: {
progressStage: () => ProgressChecker.getProgressStage(player).id, progressStage: () => ProgressChecker.getProgressStage(player).id,
suggestedResource() { suggestedResource() {
@ -36,19 +30,7 @@ export default {
return this.diff ? "Content Catch-up" : "Content Summary"; 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: { 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) { stageName(stage) {
return GameProgress(stage).name; return GameProgress(stage).name;
} }
@ -67,7 +49,7 @@ export default {
check the related How To Play entries if you want more detailed information. check the related How To Play entries if you want more detailed information.
<div <div
class="l-catchup-group-container" 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 <CatchupGroup
v-for="group of progressStage" v-for="group of progressStage"
@ -81,17 +63,10 @@ export default {
</span> </span>
<div class="l-confirm-padding"> <div class="l-confirm-padding">
<PrimaryButton <PrimaryButton
v-if="remainingTime === 0"
@click="emitClose" @click="emitClose"
> >
Confirm Confirm
</PrimaryButton> </PrimaryButton>
<PrimaryButton
v-else
:enabled="false"
>
Confirm ({{ formatInt(remainingTime) }})
</PrimaryButton>
</div> </div>
</div> </div>
</template> </template>
@ -104,7 +79,7 @@ export default {
border: 0.1rem solid var(--color-text); border: 0.1rem solid var(--color-text);
border-radius: var(--var-border-radius, 0.4rem); border-radius: var(--var-border-radius, 0.4rem);
margin: 1rem; margin: 1rem;
padding: 2rem; padding: 1.5rem;
} }
.l-confirm-padding { .l-confirm-padding {

View File

@ -20,7 +20,7 @@ export default {
return this.challenge.isFullyCompleted; return this.challenge.isFullyCompleted;
}, },
message() { 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. Challenge-specific restrictions and modifiers active.
To complete the Challenge${this.challengeIsCompleted ? "" : " and gain its reward"}, To complete the Challenge${this.challengeIsCompleted ? "" : " and gain its reward"},
you must reach the Challenge goal of you must reach the Challenge goal of

View File

@ -20,7 +20,7 @@ export default {
return this.challenge.isCompleted; return this.challenge.isCompleted;
}, },
message() { 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. Challenge-specific restrictions and modifiers active.
To complete the Challenge${this.challengeIsCompleted ? "" : " and gain its reward"}, To complete the Challenge${this.challengeIsCompleted ? "" : " and gain its reward"},
you must reach the Challenge goal of you must reach the Challenge goal of

View File

@ -20,7 +20,7 @@ export default {
return this.challenge.isCompleted; return this.challenge.isCompleted;
}, },
message() { 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. Challenge-specific restrictions and modifiers active.
To complete the Challenge${this.challengeIsCompleted ? "" : " and gain its reward"}, To complete the Challenge${this.challengeIsCompleted ? "" : " and gain its reward"},
you must reach Infinity again. you must reach Infinity again.

View File

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

View File

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

View File

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

View File

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

View File

@ -115,7 +115,6 @@ export default {
{{ moreShiftKeyInfo }} {{ moreShiftKeyInfo }}
</span> </span>
<br> <br>
<br>
<div class="l-modal-hotkeys-row"> <div class="l-modal-hotkeys-row">
<span class="c-modal-hotkeys-row__name l-modal-hotkeys-row__name">Autobuyer Controls</span> <span class="c-modal-hotkeys-row__name l-modal-hotkeys-row__name">Autobuyer Controls</span>
<kbd>alt</kbd> <kbd>alt</kbd>
@ -128,7 +127,6 @@ export default {
and Tickspeed Autobuyers instead. and Tickspeed Autobuyers instead.
</span> </span>
<br> <br>
<br>
<div class="l-modal-hotkeys-row"> <div class="l-modal-hotkeys-row">
<span class="c-modal-hotkeys-row__name l-modal-hotkeys-row__name">Tab Movement</span> <span class="c-modal-hotkeys-row__name l-modal-hotkeys-row__name">Tab Movement</span>
<div> <div>
@ -140,6 +138,15 @@ export default {
The Up and Down arrows cycle you through tabs, The Up and Down arrows cycle you through tabs,
and the Left and Right arrows cycle you through that tab's subtabs. and the Left and Right arrows cycle you through that tab's subtabs.
</span> </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> </div>
</span> </span>
</ModalWrapper> </ModalWrapper>

View File

@ -31,29 +31,31 @@ export default {
<template #header> <template #header>
Modify Visible Tabs Modify Visible Tabs
</template> </template>
Click a button to toggle showing a tab on/off. <div class="c-modal--short">
<br> Click a button to toggle showing a tab on/off.
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">
<br> <br>
<i>You must... see everywhere...</i> Some tabs cannot be hidden, and you cannot hide your current tab.
<br> <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> </div>
<HiddenTabGroup
v-for="(tab, index) in tabs"
:key="index"
:tab="tab"
:change-enabled="!isEnslaved && !isAlmostEnd"
class="l-hide-modal-tab-container"
/>
</ModalWrapperOptions> </ModalWrapperOptions>
</template> </template>

View File

@ -1,16 +1,18 @@
<script> <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 { export default {
name: "BigCrunchModal", name: "BigCrunchModal",
components: { components: {
ModalWrapperChoice ResetModal
}, },
data() { data() {
return { return {
gainedInfinities: new Decimal(), gainedInfinities: new Decimal(),
gainedInfinityPoints: new Decimal() gainedInfinityPoints: new Decimal(),
startingBoosts: 0,
startingAM: 10,
willStartWithGalaxy: false
}; };
}, },
computed: { computed: {
@ -18,22 +20,33 @@ export default {
return !PlayerProgress.infinityUnlocked(); return !PlayerProgress.infinityUnlocked();
}, },
message() { 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}`; 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 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.`; find in the Infinity tab. You will also gain one Infinity, which is the stat shown in the Statistics tab.`;
}, },
ipGainInfo() { ipGainInfo() {
return `You will gain ${quantify("Infinity Point", this.gainedInfinityPoints, 2, 2)} return `You will gain ${quantify("Infinity", this.gainedInfinities, 2, 0)}
and ${quantify("Infinity", this.gainedInfinities)}.`; 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: { methods: {
update() { update() {
this.gainedInfinities = gainedInfinities().round(); this.gainedInfinities = gainedInfinities().round();
this.gainedInfinityPoints = gainedInfinityPoints().round(); this.gainedInfinityPoints = gainedInfinityPoints().round();
this.startingBoosts = DimBoost.startingDimensionBoosts;
this.startingAM = Currency.antimatter.startingValue;
this.willStartWithGalaxy = InfinityUpgrade.skipResetGalaxy.isBought;
}, },
handleYesClick() { handleYesClick() {
bigCrunchResetRequest(); bigCrunchResetRequest();
@ -49,15 +62,14 @@ export default {
</script> </script>
<template> <template>
<ModalWrapperChoice <ResetModal
:option="isFirstInfinity ? undefined : 'bigCrunch'" header="You are about to Infinity"
@confirm="handleYesClick" :message="message"
> :gained-resources="ipGainInfo"
<template #header> :starting-resources="startingResources"
You are about to Infinity :confirm-fn="handleYesClick"
</template> :alternate-condition="isFirstInfinity"
<div class="c-modal-message__text"> :alternate-text="message"
{{ message }} :confirm-option="isFirstInfinity ? undefined : 'bigCrunch'"
</div> />
</ModalWrapperChoice>
</template> </template>

View File

@ -1,16 +1,17 @@
<script> <script>
import ModalWrapperChoice from "@/components/modals/ModalWrapperChoice"; import ResetModal from "@/components/modals/prestige/ResetModal";
export default { export default {
name: "EternityModal", name: "EternityModal",
components: { components: {
ModalWrapperChoice ResetModal
}, },
data() { data() {
return { return {
exitingEC: false, exitingEC: false,
startingIP: new Decimal(), startingIP: new Decimal(),
gainedEternityPoints: new Decimal() gainedEternityPoints: new Decimal(),
gainedEternities: new Decimal()
}; };
}, },
computed: { computed: {
@ -22,7 +23,8 @@ export default {
on the Statistics tab. You will also gain an Eternity Point and unlock various upgrades.`; on the Statistics tab. You will also gain an Eternity Point and unlock various upgrades.`;
}, },
gainedEPOnEternity() { 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() { startWithIP() {
return this.startingIP.gt(0) return this.startingIP.gt(0)
@ -46,6 +48,7 @@ export default {
this.exitingEC = EternityChallenge.isRunning; this.exitingEC = EternityChallenge.isRunning;
this.startingIP = Currency.infinityPoints.startingValue; this.startingIP = Currency.infinityPoints.startingValue;
this.gainedEternityPoints = gainedEternityPoints(); this.gainedEternityPoints = gainedEternityPoints();
this.gainedEternities = gainedEternities();
}, },
handleYesClick() { handleYesClick() {
animateAndEternity(); animateAndEternity();
@ -56,31 +59,14 @@ export default {
</script> </script>
<template> <template>
<ModalWrapperChoice <ResetModal
option="eternity" :header="exitingEC ? 'Complete Eternity Challenge' : 'You are about to Eternity'"
@confirm="handleYesClick" :message="message"
> :gained-resources="gainedEPOnEternity"
<template #header> :starting-resources="startWithIP"
{{ exitingEC ? "Complete Eternity Challenge" : "You are about to Eternity" }} :confirm-fn="handleYesClick"
</template> :alternate-condition="exitingEC"
<div v-if="!exitingEC"> :alternate-text="exitingEC ? eternityChallenge : undefined"
<div class="c-modal-message__text"> confirm-option="eternity"
{{ 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>
</template> </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> <script>
import HeaderTickspeedRowClassic from "../../ui-modes/HeaderTickspeedRowClassic";
import AntimatterDimensionProgressBar from "./AntimatterDimensionProgressBar"; import AntimatterDimensionProgressBar from "./AntimatterDimensionProgressBar";
import AntimatterDimensionRow from "./ClassicAntimatterDimensionRow"; import AntimatterDimensionRow from "./ClassicAntimatterDimensionRow";
import AntimatterDimensionsTabHeader from "./ClassicAntimatterDimensionsTabHeader"; import AntimatterDimensionsTabHeader from "./ClassicAntimatterDimensionsTabHeader";
import AntimatterGalaxyRow from "./ClassicAntimatterGalaxyRow"; import AntimatterGalaxyRow from "./ClassicAntimatterGalaxyRow";
import DimensionBoostRow from "./ClassicDimensionBoostRow"; import DimensionBoostRow from "./ClassicDimensionBoostRow";
import PrimaryButton from "@/components/PrimaryButton"; import PrimaryButton from "@/components/PrimaryButton";
import TickspeedRow from "./TickspeedRow";
export default { export default {
name: "ClassicAntimatterDimensionsTab", name: "ClassicAntimatterDimensionsTab",
@ -17,7 +16,7 @@ export default {
AntimatterGalaxyRow, AntimatterGalaxyRow,
DimensionBoostRow, DimensionBoostRow,
AntimatterDimensionProgressBar, AntimatterDimensionProgressBar,
HeaderTickspeedRowClassic, TickspeedRow,
}, },
data() { data() {
return { return {
@ -52,12 +51,9 @@ export default {
<template> <template>
<div class="l-old-ui-antimatter-dim-tab"> <div class="l-old-ui-antimatter-dim-tab">
<span>{{ multiplierText }}</span>
<AntimatterDimensionsTabHeader /> <AntimatterDimensionsTabHeader />
<HeaderTickspeedRowClassic {{ multiplierText }}
v-if="hasRealityButton" <TickspeedRow />
:in-header="false"
/>
<div class="l-dimensions-container"> <div class="l-dimensions-container">
<AntimatterDimensionRow <AntimatterDimensionRow
v-for="tier in 8" v-for="tier in 8"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -17,7 +17,8 @@ export default {
upgradeThreshold: new Decimal(0), upgradeThreshold: new Decimal(0),
shardsPerSecond: new Decimal(0), shardsPerSecond: new Decimal(0),
incomeType: "", incomeType: "",
areAutobuyersUnlocked: false areAutobuyersUnlocked: false,
showLockedDimCostNote: true,
}; };
}, },
computed: { computed: {
@ -25,6 +26,7 @@ export default {
}, },
methods: { methods: {
update() { update() {
this.showLockedDimCostNote = !TimeDimension(8).isUnlocked && player.realities >= 1;
this.totalUpgrades = player.totalTickGained; this.totalUpgrades = player.totalTickGained;
this.multPerTickspeed = FreeTickspeed.multToNext; this.multPerTickspeed = FreeTickspeed.multToNext;
this.tickspeedSoftcap = FreeTickspeed.softcap; this.tickspeedSoftcap = FreeTickspeed.softcap;
@ -94,7 +96,10 @@ export default {
<br> <br>
and costs increase much faster after {{ format(costIncreases[2]) }} Eternity Points. and costs increase much faster after {{ format(costIncreases[2]) }} Eternity Points.
<br> <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>
</div> </div>
</template> </template>

View File

@ -14,23 +14,23 @@ export default {
}, },
data() { data() {
return { return {
isLimitedByPelle: false isLocked: false
}; };
}, },
computed: { computed: {
isEnabled() { isEnabled() {
if (this.isLimitedByPelle) return false; if (this.isLocked) return false;
return this.budget.gte(this.cost); return this.budget.gte(this.cost);
}, },
enabledClass() { 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"; return "c-tt-buy-button--unlocked";
} }
}, },
methods: { methods: {
update() { update() {
this.isLimitedByPelle = Pelle.isDoomed && player.eternities.eq(0); this.isLocked = player.eternities.eq(0);
} }
} }
}; };
@ -42,6 +42,6 @@ export default {
:class="enabledClass" :class="enabledClass"
@click="action" @click="action"
> >
{{ isLimitedByPelle ? "Requires Eternity to unlock" : formatCost(cost) }} {{ isLocked ? "Requires Eternity to unlock" : formatCost(cost) }}
</button> </button>
</template> </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> <script>
import HeaderBlackHole from "./HeaderBlackHole";
import HeaderChallengeDisplay from "./HeaderChallengeDisplay"; import HeaderChallengeDisplay from "./HeaderChallengeDisplay";
import HeaderChallengeEffects from "./HeaderChallengeEffects"; import HeaderChallengeEffects from "./HeaderChallengeEffects";
import HeaderGameSpeed from "./HeaderGameSpeed";
import HeaderPrestigeGroup from "./HeaderPrestigeGroup"; import HeaderPrestigeGroup from "./HeaderPrestigeGroup";
export default { export default {
@ -9,7 +9,7 @@ export default {
components: { components: {
HeaderChallengeDisplay, HeaderChallengeDisplay,
HeaderChallengeEffects, HeaderChallengeEffects,
HeaderGameSpeed, HeaderBlackHole,
HeaderPrestigeGroup, HeaderPrestigeGroup,
}, },
}; };
@ -20,7 +20,7 @@ export default {
<HeaderChallengeDisplay /> <HeaderChallengeDisplay />
<HeaderChallengeEffects /> <HeaderChallengeEffects />
<HeaderPrestigeGroup /> <HeaderPrestigeGroup />
<HeaderGameSpeed /> <HeaderBlackHole />
</div> </div>
</template> </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"; import GameSpeedDisplay from "@/components/GameSpeedDisplay";
export default { export default {
name: "HeaderTickspeedRowModern", name: "HeaderTickspeedInfo",
components: { components: {
GameSpeedDisplay GameSpeedDisplay
}, },
@ -11,23 +11,27 @@ export default {
mult: new Decimal(0), mult: new Decimal(0),
tickspeed: new Decimal(0), tickspeed: new Decimal(0),
galaxyCount: 0, galaxyCount: 0,
purchasedTickspeed: 0,
freeTickspeed: 0,
}; };
}, },
computed: { computed: {
tickspeedDisplay() { tickspeedDisplay() {
return `AD Tickspeed: ${format(this.tickspeed, 2, 3)} / sec`; return `Total Tickspeed: ${format(this.tickspeed, 2, 3)} / sec`;
}, },
perUpgrade() { perUpgrade() {
if (InfinityChallenge(3).isRunning) return `Tickspeed upgrades give if (InfinityChallenge(3).isRunning) return `Tickspeed upgrades give
${formatX(1.05 + this.galaxyCount * 0.005, 3, 3)} to all ADs`; ${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: { methods: {
update() { update() {
this.mult.copyFrom(Tickspeed.multiplier); this.mult.copyFrom(Tickspeed.multiplier);
this.tickspeed.copyFrom(Tickspeed.perSecond); this.tickspeed.copyFrom(Tickspeed.perSecond);
this.galaxyCount = player.galaxies; this.galaxyCount = player.galaxies;
this.purchasedTickspeed = player.totalTickBought;
this.freeTickspeed = FreeTickspeed.amount;
}, },
}, },
}; };
@ -35,11 +39,11 @@ export default {
<template> <template>
<div> <div>
<br>
{{ tickspeedDisplay }}
<br> <br>
{{ perUpgrade }} {{ perUpgrade }}
<br> <br>
{{ tickspeedDisplay }}
<br>
<GameSpeedDisplay /> <GameSpeedDisplay />
</div> </div>
</template> </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> <script>
import BigCrunchButton from "../BigCrunchButton";
import GameHeader from "../GameHeader"; import GameHeader from "../GameHeader";
import NewsTicker from "../NewsTicker"; import NewsTicker from "../NewsTicker";
import ClassicBigCrunchButton from "./ClassicBigCrunchButton";
import ClassicSubtabBar from "./ClassicSubtabBar"; import ClassicSubtabBar from "./ClassicSubtabBar";
import ClassicTabBar from "./ClassicTabBar"; import ClassicTabBar from "./ClassicTabBar";
import EternityPointsHeader from "@/components/EternityPointsHeader"; import EternityPointsHeader from "@/components/EternityPointsHeader";
@ -12,12 +13,12 @@ export default {
name: "ClassicUi", name: "ClassicUi",
components: { components: {
GameHeader, GameHeader,
ClassicBigCrunchButton,
ClassicSubtabBar, ClassicSubtabBar,
ClassicTabBar, ClassicTabBar,
NewsTicker, NewsTicker,
InfinityPointsHeader, InfinityPointsHeader,
EternityPointsHeader EternityPointsHeader,
BigCrunchButton
}, },
data() { data() {
return { return {
@ -34,9 +35,7 @@ export default {
methods: { methods: {
update() { update() {
const crunchButtonVisible = !player.break && Player.canCrunch; const crunchButtonVisible = !player.break && Player.canCrunch;
const reachedInfinityInMinute = Time.bestInfinityRealTime.totalMinutes <= 1; this.bigCrunch = crunchButtonVisible && Time.bestInfinityRealTime.totalMinutes > 1;
this.bigCrunch = crunchButtonVisible && !reachedInfinityInMinute;
this.smallCrunch = crunchButtonVisible && reachedInfinityInMinute;
} }
}, },
}; };
@ -52,13 +51,8 @@ export default {
type="text/css" type="text/css"
href="stylesheets/old-ui.css" href="stylesheets/old-ui.css"
> >
<template v-if="bigCrunch"> <BigCrunchButton />
<ClassicBigCrunchButton class="l-old-ui__big-crunch-btn" /> <template v-if="!bigCrunch">
<div class="o-emptiness">
The world has collapsed due to excess of antimatter.
</div>
</template>
<template v-else>
<NewsTicker <NewsTicker
v-if="news" v-if="news"
class="l-old-ui__news-bar" class="l-old-ui__news-bar"
@ -70,10 +64,6 @@ export default {
v-if="tab.config.before" v-if="tab.config.before"
/> />
<ClassicSubtabBar /> <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"> <div class="l-old-ui__page">
<slot /> <slot />
</div> </div>

View File

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

View File

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

View File

@ -26,7 +26,7 @@ export default {
}, },
formatMachineStats() { formatMachineStats() {
if (!PlayerProgress.realityUnlocked() && this.nextMachineEP.gt("1e8000")) { 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)) { if (this.machinesGained.gt(0) && this.machinesGained.lt(100)) {
return `(Next at ${format(this.nextMachineEP, 2)} EP)`; return `(Next at ${format(this.nextMachineEP, 2)} EP)`;