Untangle the game database

This commit is contained in:
Andrei Andreev 2023-06-11 12:13:10 +02:00 committed by Andrei Andreev
parent 740d807373
commit 1924c37539
91 changed files with 369 additions and 383 deletions

View File

@ -1,4 +1,6 @@
<script>
import { LAITELA_UPGRADE_DIRECTION } from "@/core/secret-formula";
export default {
name: "SingularityMilestoneComponent",
props: {
@ -151,4 +153,4 @@ export default {
box-shadow: 0 0 0.5rem 0.1rem inset, 0 0 0.3rem 0;
animation: 3s a-laitela-flash infinite;
}
</style>
</style>

View File

@ -2,6 +2,7 @@
import CelestialQuoteHistory from "@/components/CelestialQuoteHistory";
import GlyphSetPreview from "@/components/GlyphSetPreview";
import PrimaryButton from "@/components/PrimaryButton";
import { V_REDUCTION_MODE } from "@/core/secret-formula";
import VUnlockRequirement from "./VUnlockRequirement";
export default {

View File

@ -1,6 +1,7 @@
<script>
import { DataSet, Network } from "vis-network";
import { PERK_FAMILY } from "@/core/secret-formula";
import PerkPointLabel from "./PerkPointLabel";
export default {

View File

@ -23,7 +23,7 @@ export const AutomatorPoints = {
},
get pointsFromOther() {
return GameDatabase.reality.otherAutomatorPoints.map(s => s.automatorPoints()).sum();
return GameDatabase.reality.automator.otherAutomatorPoints.map(s => s.automatorPoints()).sum();
},
get totalPoints() {
@ -34,18 +34,3 @@ export const AutomatorPoints = {
return 100;
}
};
GameDatabase.reality.otherAutomatorPoints = [
{
name: "Reality Count",
automatorPoints: () => 2 * Math.clampMax(Currency.realities.value, 50),
shortDescription: () => `+${formatInt(2)} per Reality, up to ${formatInt(50)} Realities`,
symbol: "Ϟ",
},
{
name: "Black Hole",
automatorPoints: () => (BlackHole(1).isUnlocked ? 10 : 0),
shortDescription: () => `Unlocking gives ${formatInt(10)} AP`,
symbol: "<i class='fas fa-circle'></i>",
},
];

View File

@ -1,5 +1,7 @@
import { Pelle } from "../globals";
import { GlyphCombiner } from "@/core/secret-formula";
class GlyphEffectState {
constructor(id, props) {
this._id = id;

View File

@ -0,0 +1,7 @@
import { normalAchievements } from "./normal-achievements";
import { secretAchievements } from "./secret-achievements";
export const achievements = {
normal: normalAchievements,
secret: secretAchievements
};

View File

@ -1,7 +1,6 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
GameDatabase.achievements.normal = [
export const normalAchievements = [
{
id: 11,
name: "You gotta start somewhere",

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../game-database";
GameDatabase.achievements.secret = [
export const secretAchievements = [
{
id: 11,
name: "The first one's always free",

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "./game-database";
GameDatabase.awayProgressTypes = [
export const awayProgressTypes = [
{
name: "antimatter",
isUnlocked: () => true,

View File

@ -1,8 +1,6 @@
import { DC } from "../constants";
import { GameDatabase } from "./game-database";
GameDatabase.catchupResources = [
export const catchupResources = [
{
name: "Antimatter Dimensions",
id: 0,

View File

@ -1,7 +1,6 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
GameDatabase.celestials.alchemy.resources = {
export const alchemyResources = {
// T1 resources (Non-Effarig "base" resources)
"power": {
id: ALCHEMY_RESOURCE.POWER,

View File

@ -1,7 +1,6 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
GameDatabase.celestials.effarig.unlocks = {
export const effarigUnlocks = {
adjuster: {
id: 0,
description: "Adjustable Glyph level factor weights",

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../game-database";
GameDatabase.celestials.enslaved = {
export const enslaved = {
// These entries will be unlocked in no particular order
progress: {
hintsUnlocked: {

View File

@ -1,5 +1,3 @@
import { GameDatabase } from "../game-database";
const formatCost = c => format(c, 2);
const rebuyable = config => {
@ -16,7 +14,7 @@ const rebuyable = config => {
};
};
GameDatabase.celestials.pelle.galaxyGeneratorUpgrades = {
export const pelleGalaxyGeneratorUpgrades = {
additive: rebuyable({
id: "galaxyGeneratorAdditive",
description: "Increase base Galaxy generation by 2",

View File

@ -0,0 +1,44 @@
import { finalSigil } from "./navigation-sigils/final-sigil";
import { galaxyIcon } from "./navigation-sigils/galaxy-icon";
import { alchemyResources } from "./alchemy";
import { effarigUnlocks } from "./effarig";
import { enslaved } from "./enslaved";
import { pelleGalaxyGeneratorUpgrades } from "./galaxy-generator";
import { celestialNavigation } from "./navigation";
import { pelleUpgrades } from "./pelle-upgrades";
import { perkShop } from "./perk-shop";
import { ra } from "./ra";
import { pelleRifts } from "./rifts";
import { singularityMilestones } from "./singularity-milestones";
import { pelleStrikes } from "./strikes";
import { teresa } from "./teresa";
import { quotes } from "./quotes";
import { v } from "./v";
export const celestials = {
effarig: {
unlocks: effarigUnlocks
},
alchemy: {
resources: alchemyResources
},
pelle: {
galaxyGeneratorUpgrades: pelleGalaxyGeneratorUpgrades,
strikes: pelleStrikes,
upgrades: pelleUpgrades,
rifts: pelleRifts
},
descriptions: {},
enslaved,
navigation: celestialNavigation,
navSigils: {
...galaxyIcon,
...finalSigil
},
perkShop,
ra,
singularityMilestones,
teresa,
quotes,
v
};

View File

@ -1,5 +1,3 @@
import { GameDatabase } from "../../game-database";
import { CELESTIAL_NAV_DRAW_ORDER } from "../navigation";
function sigilProgress() {
@ -200,7 +198,5 @@ for (let arcIndex = 0; arcIndex < arcSegments; arcIndex++) {
"crimson");
}
GameDatabase.celestials.navSigils = {
...GameDatabase.celestials.navSigils,
...Object.values(Shapes).mapToObject((key, idx) => `final-sigil-${idx}`, val => val)
};
export const finalSigil = Object.values(Shapes)
.mapToObject((key, idx) => `final-sigil-${idx}`, val => val);

View File

@ -1,5 +1,3 @@
import { GameDatabase } from "../../game-database";
import { CELESTIAL_NAV_DRAW_ORDER, pelleStarPosition } from "../navigation";
// Determines styling, overall visibility, and placement/scaling of the sigil. Center and size are defined such that
@ -92,7 +90,5 @@ for (let arcIndex = 0; arcIndex < arcSegments; arcIndex++) {
"cyan");
}
GameDatabase.celestials.navSigils = {
...GameDatabase.celestials.navSigils,
...Object.values(Shapes).mapToObject((key, idx) => `galaxy-icon-${idx}`, val => val)
};
export const galaxyIcon = Object.values(Shapes)
.mapToObject((key, idx) => `galaxy-icon-${idx}`, val => val);

View File

@ -1,5 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import wordShift from "../../word-shift";
export function emphasizeEnd(fraction) {
@ -204,7 +203,7 @@ for (const fill of fillStates) {
}
}
GameDatabase.celestials.navigation = {
export const celestialNavigation = {
"teresa-base": {
visible: () => true,
complete: () => 1,
@ -1991,6 +1990,3 @@ GameDatabase.celestials.navigation = {
}()),
},
};
// This will get populated as needed in files within the navigation-sigils folder
GameDatabase.celestials.navSigils = {};

View File

@ -1,5 +1,3 @@
import { GameDatabase } from "../game-database";
const formatCost = c => format(c, 2);
// eslint-disable-next-line max-params
const expWithIncreasedScale = (base1, base2, incScale, coeff, x) =>
@ -19,7 +17,7 @@ const rebuyable = config => {
};
};
GameDatabase.celestials.pelle.upgrades = {
export const pelleUpgrades = {
antimatterDimensionMult: rebuyable({
id: "antimatterDimensionMult",
description: "Gain a multiplier to Antimatter Dimensions",

View File

@ -1,5 +1,3 @@
import { GameDatabase } from "../game-database";
function rebuyableCost(initialCost, increment, id) {
return initialCost * Math.pow(increment, player.celestials.teresa.perkShop[id]);
}
@ -19,7 +17,7 @@ function rebuyable(config) {
};
}
GameDatabase.celestials.perkShop = {
export const perkShop = {
glyphLevel: rebuyable({
id: 0,
initialCost: 1,

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../../game-database";
GameDatabase.celestials.quotes.effarig = {
export const effarigQuotes = {
initial: {
id: 0,
lines: [

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../../game-database";
GameDatabase.celestials.quotes.enslaved = {
export const enslavedQuotes = {
initial: {
id: 0,
lines: [

View File

@ -1,8 +1,17 @@
import { effarigQuotes } from "./effarig";
import { enslavedQuotes } from "./enslaved";
import { laitelaQuotes } from "./laitela";
import { pelleQuotes } from "./pelle";
import { raQuotes } from "./ra";
import { teresaQuotes } from "./teresa";
import { vQuotes } from "./v";
import "./teresa";
import "./effarig";
import "./enslaved";
import "./v";
import "./ra";
import "./laitela";
import "./pelle";
export const quotes = {
teresa: teresaQuotes,
effarig: effarigQuotes,
enslaved: enslavedQuotes,
v: vQuotes,
ra: raQuotes,
laitela: laitelaQuotes,
pelle: pelleQuotes
};

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../../game-database";
GameDatabase.celestials.quotes.laitela = {
export const laitelaQuotes = {
unlock: {
id: 0,
lines: [

View File

@ -1,5 +1,3 @@
import { GameDatabase } from "../../game-database";
// These entries describe the special flash-between-celestial effect on some quotes, with the numbers being
// durations of each celestial in seconds
const flashCelestial = [
@ -45,7 +43,7 @@ const forgotten = ["Forgotten", "Deity", "Monarch"];
const paramount = ["Paramount", "Deity", "Monarch"];
/* eslint-enable no-multi-spaces */
GameDatabase.celestials.quotes.pelle = {
export const pelleQuotes = {
initial: {
id: 0,
lines: [

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../../game-database";
GameDatabase.celestials.quotes.ra = {
export const raQuotes = {
unlock: {
id: 0,
lines: [

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../../game-database";
GameDatabase.celestials.quotes.teresa = {
export const teresaQuotes = {
initial: {
id: 0,
lines: [

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../../game-database";
GameDatabase.celestials.quotes.v = {
export const vQuotes = {
initial: {
id: 0,
lines: [

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../game-database";
GameDatabase.celestials.ra = {
export const ra = {
pets: {
teresa: {
id: "teresa",

View File

@ -1,8 +1,7 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import wordShift from "../../word-shift";
GameDatabase.celestials.pelle.rifts = {
export const pelleRifts = {
vacuum: {
id: 1,
key: "vacuum",

View File

@ -1,5 +1,3 @@
import { GameDatabase } from "../game-database";
// Used for UI purposes to give different theming for different kinds of upgrades
export const LAITELA_UPGRADE_DIRECTION = {
SELF_BOOST: 0,
@ -7,7 +5,7 @@ export const LAITELA_UPGRADE_DIRECTION = {
BOOSTS_LAITELA: 2
};
GameDatabase.celestials.singularityMilestones = {
export const singularityMilestones = {
// Infinite
continuumMult: {
start: 1,

View File

@ -1,8 +1,7 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import wordShift from "../../word-shift";
GameDatabase.celestials.pelle.strikes = {
export const pelleStrikes = {
infinity: {
id: 1,
requirementDescription: "Reach Infinity",

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../game-database";
GameDatabase.celestials.teresa = {
export const teresa = {
unlocks: {
run: {
id: 0,

View File

@ -1,5 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
// This is supposed to be in ./navigation.js but importing doesn't work for some stupid reason
function emphasizeEnd(fraction) {
@ -11,7 +10,7 @@ export const V_REDUCTION_MODE = {
DIVISION: 2
};
GameDatabase.celestials.v = {
export const v = {
// Note: mainUnlock IDs here are one-indexed to match with navigation indices
mainUnlock: {
realities: {

View File

@ -1,11 +1,10 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
const specialInfinityGlyphDisabledEffectText = () => (PelleRifts.chaos.milestones[1].canBeApplied
? "The Pelle-Specific effect from Infinity Glyphs is also disabled."
: "");
GameDatabase.challenges.eternity = [
export const eternityChallenges = [
{
id: 1,
description: "Time Dimensions are disabled.",

View File

@ -0,0 +1,9 @@
import { eternityChallenges } from "./eternity-challenges";
import { infinityChallenges } from "./infinity-challenges";
import { normalChallenges } from "./normal-challenges";
export const challenges = {
normal: normalChallenges,
infinity: infinityChallenges,
eternity: eternityChallenges
};

View File

@ -1,7 +1,6 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
GameDatabase.challenges.infinity = [
export const infinityChallenges = [
{
id: 1,
description: `all Normal Challenge restrictions are active at once, with the exception of the

View File

@ -1,12 +1,11 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
// I tried to make it relatively simple to add more locks; the idea is that you give it a value here
// and then it's all handled in the backend
// If you need to lock a challenge, set lockedAt to a new Decimal variable reflective of a desired number of Infinities
// They will always be unlocked post-eternity
GameDatabase.challenges.normal = [
export const normalChallenges = [
{
id: 1,
legacyId: 1,
@ -127,7 +126,7 @@ GameDatabase.challenges.normal = [
id: 12,
legacyId: 7,
isQuickResettable: false,
description: () => `each Antimatter Dimension produces the Dimension ${formatInt(2)} tiers below it
description: () => `each Antimatter Dimension produces the Dimension ${formatInt(2)} tiers below it
instead of ${formatInt(1)}. Both 1st and 2nd Dimensions produce antimatter.
The 2nd, 4th, and 6th Dimensions are made stronger to compensate.`,
name: "Automated Big Crunches",

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "./game-database";
GameDatabase.changelog = [
export const changelog = [
/**
* @template
* {
@ -769,7 +767,7 @@ while they were locked.</li>
<li>Added loot boxes.</li>
<li>Removed loot boxes.</li>
<li>Added various missing periods to achievement descriptions.</li>
<li>Added a missing period to time spent in this eternity.</li>
<li>Added a missing period to time spent in this eternity.</li>
Increased the price of creation count increases from 50 god power to 60.</li>
<li>Added a missing space to the "Autobuyers work twice as fast." upgrade.</li>
<li>Manually buying max dimension boosts no longer requires 10 eternities or more, and now only requires the bulk buy
@ -1028,7 +1026,6 @@ gaining infinity points.</li>
];
for (let i = 0; i < GameDatabase.changelog.length; i++) {
const entry = GameDatabase.changelog[i];
entry.id = i;
}
for (let i = 0; i < changelog.length; i++) {
changelog[i].id = i;
}

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "./game-database";
GameDatabase.confirmationTypes = [
export const confirmationTypes = [
{
name: "Dimension Boost",
option: "dimensionBoost",

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "./game-database";
GameDatabase.credits = {
export const credits = {
// Must be placed in the order it is desired they appear in the credits
roles: {
1: "Creator",
@ -441,4 +439,4 @@ GameDatabase.credits = {
]
};
GameDatabase.credits.roles.count = Object.keys(GameDatabase.credits.roles).length;
credits.roles.count = Object.keys(credits.roles).length;

View File

@ -1,5 +1,3 @@
import { GameDatabase } from "./game-database";
// We define these in the local scope to override the player's notation setting; this is something we'll probably
// expand upon later once we look more closely at support for extended Unicode in DRP
function format(number, places, placesUnder1000) {
@ -261,5 +259,3 @@ export const discordRichPresence = {
},
]
};
GameDatabase.discordRichPresence = discordRichPresence;

View File

@ -1,5 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
function rebuyableCost(initialCost, increment, id) {
return Decimal.multiply(initialCost, Decimal.pow(increment, player.dilation.rebuyables[id]));
@ -21,7 +20,7 @@ function rebuyable(config) {
};
}
GameDatabase.eternity.dilation = {
export const dilationUpgrades = {
dtGain: rebuyable({
id: 1,
initialCost: 1e4,

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../game-database";
GameDatabase.eternity.milestones = {
export const eternityMilestones = {
autobuyerIPMult: {
eternities: 1,
reward: "Unlock the Infinity Point multiplier autobuyer",

View File

@ -1,7 +1,6 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
GameDatabase.eternity.upgrades = {
export const eternityUpgrades = {
idMultEP: {
id: 1,
cost: 5,

View File

@ -0,0 +1,18 @@
import { dilationUpgrades } from "./dilation-upgrades";
import { eternityMilestones } from "./eternity-milestones";
import { eternityUpgrades } from "./eternity-upgrades";
import { dilationTimeStudies } from "./time-studies/dilation-time-studies";
import { ecTimeStudies } from "./time-studies/ec-time-studies";
import { normalTimeStudies } from "./time-studies/normal-time-studies";
export const eternity = {
dilation: dilationUpgrades,
milestones: eternityMilestones,
timeStudies: {
dilation: dilationTimeStudies,
ec: ecTimeStudies,
normal: normalTimeStudies
},
upgrades: eternityUpgrades
};

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../../game-database";
GameDatabase.eternity.timeStudies.dilation = [
export const dilationTimeStudies = [
{
id: 1,
description: "Unlock Time Dilation",

View File

@ -1,7 +1,6 @@
import { DC } from "../../../constants";
import { GameDatabase } from "../../game-database";
GameDatabase.eternity.timeStudies.ec = [
export const ecTimeStudies = [
{
id: 1,
cost: 30,

View File

@ -1,5 +1,4 @@
import { DC } from "../../../constants";
import { GameDatabase } from "../../game-database";
const thisInfinityMult = thisInfinity => {
// All "this inf time" or "best inf time" mults are * 10
@ -32,7 +31,7 @@ const passiveIPMult = () => {
* @property {String} formatEffect Formatting function for effects, if the default formatting isn't appropriate
* }
*/
GameDatabase.eternity.timeStudies.normal = [
export const normalTimeStudies = [
{
id: 11,
cost: 1,

View File

@ -1,21 +1,47 @@
import { multiplierTabTree, multiplierTabValues } from "./multiplier-tab";
import { achievements } from "./achievements";
import { awayProgressTypes } from "./away-progress-types";
import { catchupResources } from "./catchup-resources";
import { celestials } from "./celestials";
import { challenges } from "./challenges";
import { changelog } from "./changelog";
import { confirmationTypes } from "./confirmation-types";
import { credits } from "./credits";
import { discordRichPresence } from "./discord-rich-presence";
import { eternity } from "./eternity";
import { h2p } from "./h2p";
import { infinity } from "./infinity";
import { news } from "./news";
import { progressStages } from "./progress-checker";
import { reality } from "./reality";
import { shopPurchases } from "./shop-purchases";
import { speedrunMilestones } from "./speedrun-milestones";
import { tabNotifications } from "./tab-notifications";
import { tabs } from "./tabs";
export const GameDatabase = {
achievements: {},
challenges: {},
infinity: {},
eternity: {
timeStudies: {}
},
reality: {
glyphEffects: {},
glyphSacrifice: {},
},
celestials: {
effarig: {},
alchemy: {},
pelle: {},
descriptions: {},
quotes: {},
}
achievements,
awayProgressTypes,
catchupResources,
celestials,
challenges,
changelog,
confirmationTypes,
credits,
discordRichPresence,
eternity,
h2p,
infinity,
multiplierTabTree,
multiplierTabValues,
news,
progressStages,
reality,
shopPurchases,
speedrunMilestones,
tabNotifications,
tabs
};
window.GameDatabase = GameDatabase;

View File

@ -1,8 +1,8 @@
import { DC } from "../constants";
import { GameDatabase } from "./game-database";
import { credits } from "@/core/secret-formula/credits";
GameDatabase.h2p = {
export const h2p = {
/**
* @template
* {
@ -1362,7 +1362,7 @@ The Nameless Ones won't directly unlock the next Celestial.
`,
isUnlocked: () => EffarigUnlock.eternity.isUnlocked,
tags: ["reality", "time", "blackhole", "lategame", "endgame", "testers", "celestial",
...GameDatabase.credits.people.map(p => p.name)
...credits.people.map(p => p.name)
],
tab: "celestials/enslaved"
}, {
@ -1500,7 +1500,7 @@ Ra won't directly unlock the next Celestial.`,
name: "Glyph Alchemy",
info: () => `
Glyph Alchemy is a mechanic unlocked by reaching Effarig level ${formatInt(2)} in Ra. It unlocks the ability to
use up your Glyphs by refining them into Alchemy Resources associated with their type. You can refine Glyphs by
use up your Glyphs by refining them into Alchemy Resources associated with their type. You can refine Glyphs by
setting your Sacrifice Type to something other than "Always Sacrifice" in the Glyphs tab, and doing the normal
procedure for a sacrifice.
Each Alchemy Resource has a unique effect, which you can view on the Alchemy tab.
@ -1748,8 +1748,8 @@ In addition, each Rift offers three milestone rewards for filling them up to a c
}, {
name: "The Galaxy Generator",
info: () => `
When you reach ${formatInt(100)}% Recursion/Dispersion/Destruction, you unlock the <b>Galaxy Generator</b>, which can
passively generate Galaxies. Generated Galaxies are like Replicanti Galaxies and Tachyon Galaxies in that they affect
When you reach ${formatInt(100)}% Recursion/Dispersion/Destruction, you unlock the <b>Galaxy Generator</b>, which can
passively generate Galaxies. Generated Galaxies are like Replicanti Galaxies and Tachyon Galaxies in that they affect
tickspeed as if they were Antimatter Galaxies, but they don't increase the cost of your next Antimatter Galaxy. You
also unlock five new upgrades. The first upgrade increases the base amount of Galaxies generated. The other four
upgrades then give a multiplier to this base amount. The first two upgrades can be bought by spending antimatter and
@ -1767,8 +1767,8 @@ Rifts once the current cap has been reached.`,
};
(function() {
for (let i = 0; i < GameDatabase.h2p.tabs.length; i++) {
const tab = GameDatabase.h2p.tabs[i];
for (let i = 0; i < h2p.tabs.length; i++) {
const tab = h2p.tabs[i];
tab.id = i;
if (tab.alias === undefined) tab.alias = tab.name;
@ -1807,15 +1807,15 @@ Rifts once the current cap has been reached.`,
}
};
for (const tab of GameDatabase.h2p.tabs) {
for (const tab of h2p.tabs) {
addPhrase(tab.name, tab);
}
for (const tab of GameDatabase.h2p.tabs) {
for (const tab of h2p.tabs) {
for (const tag of tab.tags) {
addPhrase(tag, tab);
}
}
for (const tab of GameDatabase.h2p.tabs) {
for (const tab of h2p.tabs) {
addPhrase(tab.alias, tab);
}
@ -1907,13 +1907,13 @@ Rifts once the current cap has been reached.`,
// There are a LOT of magic numbers in this code, mostly from arbitrary choices for "What number is large enough to
// act as a placeholder for 'basically not found'?"
// This will need some cleanup if possible.
GameDatabase.h2p.search = query => {
h2p.search = query => {
const truncatedQuery = replaceSpecialChars(query);
if (truncatedQuery === "") return GameDatabase.h2p.tabs.map(x => ({ tab: x, relevance: 1.5 }));
if (truncatedQuery === "") return h2p.tabs.map(x => ({ tab: x, relevance: 1.5 }));
const searchTerms = truncatedQuery.toLowerCase().split(" ").filter(str => str !== "");
// A higher "Relevance" value actually means it's further away from the search, important to keep in mind
const relevances = Array.repeat(1e4, GameDatabase.h2p.tabs.length);
const relevances = Array.repeat(1e4, h2p.tabs.length);
for (const searchWord of searchTerms) {
const minimumRequirement = Math.min(searchWord.length - 0.9, 3) * 0.5;
for (const searchIndexStr in searchIndex) {
@ -1927,7 +1927,7 @@ Rifts once the current cap has been reached.`,
}
}
}
const results = GameDatabase.h2p.tabs.filter(x => relevances[x.id] < 0.9)
const results = h2p.tabs.filter(x => relevances[x.id] < 0.9)
.map(x => ({ tab: x, relevance: relevances[x.id] }));
// Provide both the relevance and the tab itself

View File

@ -1,61 +1,6 @@
/* eslint-disable import/newline-after-import */
/* eslint-disable import/first */
import "./game-database";
import "./tabs";
import "./away-progress-types";
import "./catchup-resources";
import "./progress-checker";
import "./confirmation-types";
import "./tab-notifications";
import "./news";
import "./achievements/normal-achievements";
import "./achievements/secret-achievements";
import "./challenges/normal-challenges";
import "./challenges/infinity-challenges";
import "./challenges/eternity-challenges";
import "./infinity/infinity-upgrades";
import "./infinity/break-infinity-upgrades";
import "./eternity/time-studies/normal-time-studies";
import "./eternity/time-studies/ec-time-studies";
import "./eternity/time-studies/dilation-time-studies";
import "./eternity/eternity-upgrades";
import "./eternity/eternity-milestones";
import "./eternity/dilation-upgrades";
import "./reality/reality-upgrades";
import "./reality/imaginary-upgrades";
export * from "./reality/perks";
import "./reality/automator";
import "./reality/glyph-types";
export * from "./reality/glyph-effects";
import "./reality/glyph-sacrifices";
import "./reality/glyph-cosmetics";
import "./celestials/perk-shop";
import "./celestials/teresa";
import "./celestials/effarig";
import "./celestials/pelle-upgrades";
import "./celestials/strikes";
import "./celestials/rifts";
import "./celestials/galaxy-generator";
import "./celestials/ra";
import "./celestials/enslaved";
import "./celestials/navigation";
import "./celestials/navigation-sigils/galaxy-icon";
import "./celestials/navigation-sigils/final-sigil";
export * from "./celestials/v";
import "./celestials/alchemy";
import "./shop-purchases";
export * from "./celestials/singularity-milestones";
import "./script-templates";
import "./speedrun-milestones";
import "./discord-rich-presence";
import "./multiplier-tab";
import "./celestials/quotes";
import "./credits";
import "./h2p";
import "./changelog";
export { PERK_FAMILY } from "./reality/perks";
export { GlyphCombiner } from "./reality/glyph-effects";
export { V_REDUCTION_MODE } from "./celestials/v";
export { LAITELA_UPGRADE_DIRECTION } from "./celestials/singularity-milestones";

View File

@ -1,5 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
function rebuyable(config) {
const effectFunction = config.effect || (x => x);
@ -27,7 +26,7 @@ function rebuyable(config) {
};
}
GameDatabase.infinity.breakUpgrades = {
export const breakInfinityUpgrades = {
totalAMMult: {
id: "totalMult",
cost: 1e4,

View File

@ -0,0 +1,7 @@
import { breakInfinityUpgrades } from "./break-infinity-upgrades";
import { infinityUpgrades } from "./infinity-upgrades";
export const infinity = {
upgrades: infinityUpgrades,
breakUpgrades: breakInfinityUpgrades
};

View File

@ -1,6 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
function dimInfinityMult() {
return Currency.infinitiesTotal.value.times(0.2).plus(1);
@ -9,7 +7,7 @@ function chargedDimInfinityMult() {
return 1 + Math.log10(Math.max(1, Currency.infinitiesTotal.value.pLog10())) * Math.sqrt(Ra.pets.teresa.level) / 150;
}
GameDatabase.infinity.upgrades = {
export const infinityUpgrades = {
totalTimeMult: {
id: "timeMult",
cost: 1,

View File

@ -1,12 +1,11 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { PlayerProgress } from "../../player-progress";
import { MultiplierTabHelper } from "./helper-functions";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.AD = {
export const AD = {
total: {
name: dim => {
if (dim) return `AD ${dim} Multiplier`;

View File

@ -1,9 +1,7 @@
import { GameDatabase } from "../game-database";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.AM = {
export const AM = {
total: {
name: "Antimatter Production",
displayOverride: () => `${format(Currency.antimatter.productionPerSecond, 2, 2)}/sec`,

View File

@ -1,5 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { PlayerProgress } from "../../player-progress";
import { MultiplierTabIcons } from "./icons";
@ -9,7 +8,7 @@ import { MultiplierTabIcons } from "./icons";
// special case due to not being a prestige currency but still needing to be treated like one in the UI. This
// is because it requires dilation to be unlocked, which isn't a given, and we want the tab continuously visible
// after the first ever dilation unlock on the 0th reality
GameDatabase.multiplierTabValues.DT = {
export const DT = {
total: {
name: "Dilated Time gain",
displayOverride: () => `${format(getDilationGainPerSecond().times(getGameSpeedupForDisplay()), 2, 2)}/sec`,

View File

@ -1,9 +1,7 @@
import { GameDatabase } from "../game-database";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.eternities = {
export const eternities = {
total: {
name: "Eternities gained per Eternity",
isBase: true,

View File

@ -1,11 +1,10 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { PlayerProgress } from "../../player-progress";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.EP = {
export const EP = {
total: {
name: "Total EP Gained on Eternity",
displayOverride: () => (Player.canEternity

View File

@ -1,10 +1,8 @@
import { GameDatabase } from "../game-database";
import { MultiplierTabHelper } from "./helper-functions";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.galaxies = {
export const galaxies = {
// Note: none of the galaxy types use the global multiplier that applies to all of them within multValue, which
// very slightly reduces performance impact and is okay because it's applied consistently
antimatter: {

View File

@ -1,10 +1,8 @@
import { GameDatabase } from "../game-database";
import { MultiplierTabHelper } from "./helper-functions";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.gamespeed = {
export const gamespeed = {
total: {
name: "Game speed",
displayOverride: () => {

View File

@ -1,11 +1,10 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { MultiplierTabHelper } from "./helper-functions";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.general = {
export const general = {
achievement: {
name: (ach, dim) => (dim?.length === 2
? `Achievement ${ach} (${dim})`

View File

@ -239,8 +239,3 @@ export const MultiplierTabHelper = {
return this.evenDimNC12Production().gt(this.oddDimNC12Production());
}
};
// All the resource files in this GameDB folder set props of multiplierTabValues, but it needs to be initialized.
// This file comes first in the import order and thus will make sure that nothing else attempts to define a prop
// on an undefined object
GameDatabase.multiplierTabValues = {};

View File

@ -1,3 +1,5 @@
import { reality } from "@/core/secret-formula/reality";
/**
* Every entry in this object is a styling specification for bars within the multiplier tab.
* {
@ -116,7 +118,7 @@ export const MultiplierTabIcons = {
},
DIMBOOST: {
symbol: `<i class="fas fa-angles-up" />`,
color: GameDatabase.reality.glyphTypes.power.color,
color: reality.glyphTypes.power.color,
},
TICKSPEED: {
symbol: `<i class="fas fa-clock" />`,
@ -160,8 +162,8 @@ export const MultiplierTabIcons = {
},
SPECIFIC_GLYPH(type) {
return {
symbol: `<b>${GameDatabase.reality.glyphTypes[type].symbol}</b>`,
color: GameDatabase.reality.glyphTypes[type].color,
symbol: `<b>${reality.glyphTypes[type].symbol}</b>`,
color: reality.glyphTypes[type].color,
};
},
BLACK_HOLE: {

View File

@ -1,6 +1,3 @@
import "./helper-functions";
/**
* Most of the GameDB entries in this folder follow largely the same structure, but have been split into multiple
* for purposes of organization and ease-of-use. All fields may also be functions which may or may not accept an input
@ -29,21 +26,6 @@ import "./helper-functions";
* entry has in the Vue component
* }
*/
import "./general";
import "./antimatter";
import "./antimatter-dimensions";
import "./infinity-dimensions";
import "./time-dimensions";
import "./infinity-points";
import "./eternity-points";
import "./tachyon-particles";
import "./dilated-time";
import "./tickspeed";
import "./galaxies";
import "./infinities";
import "./eternities";
import "./gamespeed";
import "./replicanti";
// Some props in the tree are dynamically generated from value structure in the GameDB
import "./tree";
export { multiplierTabValues } from "./values";
export { multiplierTabTree } from "./tree";

View File

@ -1,10 +1,9 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.infinities = {
export const infinities = {
total: {
name: "Infinities gained per Crunch",
isBase: true,

View File

@ -1,12 +1,11 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { PlayerProgress } from "../../player-progress";
import { MultiplierTabHelper } from "./helper-functions";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.ID = {
export const ID = {
total: {
name: dim => {
if (dim) return `ID ${dim} Multiplier`;

View File

@ -1,11 +1,10 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { PlayerProgress } from "../../player-progress";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.IP = {
export const IP = {
total: {
name: "Total IP Gained on Infinity",
displayOverride: () => (Player.canCrunch

View File

@ -1,10 +1,9 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.replicanti = {
export const replicanti = {
total: {
name: "Replicanti Speed",
multValue: () => totalReplicantiSpeedMult(Replicanti.amount.gt(replicantiCap())),

View File

@ -1,11 +1,10 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { PlayerProgress } from "../../player-progress";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.TP = {
export const TP = {
total: {
name: "Total Tachyon Particles",
displayOverride: () => {

View File

@ -1,11 +1,10 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { MultiplierTabHelper } from "./helper-functions";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.tickspeed = {
export const tickspeed = {
total: {
name: "Total Tickspeed",
displayOverride: () => {
@ -68,7 +67,7 @@ GameDatabase.multiplierTabValues.tickspeed = {
},
};
GameDatabase.multiplierTabValues.tickspeedUpgrades = {
export const tickspeedUpgrades = {
purchased: {
name: "Purchased Tickspeed Upgrades",
displayOverride: () => (Laitela.continuumActive

View File

@ -1,12 +1,11 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
import { PlayerProgress } from "../../player-progress";
import { MultiplierTabHelper } from "./helper-functions";
import { MultiplierTabIcons } from "./icons";
// See index.js for documentation
GameDatabase.multiplierTabValues.TD = {
export const TD = {
total: {
name: dim => {
if (dim) return `TD ${dim} Multiplier`;

View File

@ -1,8 +1,7 @@
/* eslint-disable max-depth */
/* eslint-disable camelcase */
import { GameDatabase } from "../game-database";
import { MultiplierTabHelper } from "./helper-functions";
import { multiplierTabValues } from "./values";
const dynamicGenProps = ["TP", "DT", "infinities", "eternities", "gamespeed", "replicanti"];
const propList = {
@ -22,7 +21,7 @@ const propList = {
// generate them dynamically instead
for (const prop of dynamicGenProps) {
propList[prop] = [];
for (const toCopy of Object.keys(GameDatabase.multiplierTabValues[prop])) {
for (const toCopy of Object.keys(multiplierTabValues[prop])) {
if (toCopy !== "total") propList[prop].push(toCopy);
}
}
@ -44,10 +43,10 @@ function getProps(resource, tier) {
return newProps;
}
// Everything is multiplierTabTree is associated with values in GameDatabase.multiplierTabValues. The only explicitly
// Everything is multiplierTabTree is associated with values in multiplierTabValues. The only explicitly
// initialized props here are the "root" props which are viewable on the tab with full breakdowns. After the initial
// specification, all children props are dynamically added based on the arrays in the helper functions above
GameDatabase.multiplierTabTree = {
export const multiplierTabTree = {
AM_total: [
["AD_total", "tickspeed_total", "AM_effarigAM"]
],
@ -106,12 +105,12 @@ GameDatabase.multiplierTabTree = {
// Gamespeed's two alternate displays are current and average gamespeed, distinguished by which of two
// mutually-exclusive entries appear in the list. We explicity modify props here as needed
const allGamespeed = GameDatabase.multiplierTabTree.gamespeed_total[0];
GameDatabase.multiplierTabTree.gamespeed_total[0] = [...allGamespeed].filter(key => key !== "gamespeed_blackHoleAvg");
GameDatabase.multiplierTabTree.gamespeed_total[1] = [...allGamespeed].filter(key => key !== "gamespeed_blackHoleCurr");
const allGamespeed = multiplierTabTree.gamespeed_total[0];
multiplierTabTree.gamespeed_total[0] = [...allGamespeed].filter(key => key !== "gamespeed_blackHoleAvg");
multiplierTabTree.gamespeed_total[1] = [...allGamespeed].filter(key => key !== "gamespeed_blackHoleCurr");
// DT doesn't explicitly have an entry to TP, due to it being its own total entry, so we link them together
GameDatabase.multiplierTabTree.DT_total[0].unshift("TP_total");
multiplierTabTree.DT_total[0].unshift("TP_total");
// Additional data specification for dynamically-generated props
const dimTypes = ["AD", "ID", "TD"];
@ -148,20 +147,20 @@ const targetedEffects = {
// Highest actively-producing dimensions need a special case
for (const dim of dimTypes) {
GameDatabase.multiplierTabTree[`${dim}_total`][0].push(`${dim}_highestDim`);
GameDatabase.multiplierTabTree[`${dim}_total`][1].push(`${dim}_highestDim`);
multiplierTabTree[`${dim}_total`][0].push(`${dim}_highestDim`);
multiplierTabTree[`${dim}_total`][1].push(`${dim}_highestDim`);
}
// EC7 also needs a special case for tickspeed, since it doesn't appear on the multipliers themselves
for (const dim of ["ID", "TD"]) {
GameDatabase.multiplierTabTree[`${dim}_total`][0].push(`${dim}_tickspeed`);
GameDatabase.multiplierTabTree[`${dim}_total`][1].push(`${dim}_tickspeed`);
multiplierTabTree[`${dim}_total`][0].push(`${dim}_tickspeed`);
multiplierTabTree[`${dim}_total`][1].push(`${dim}_tickspeed`);
}
// Dynamically generate all values from existing values, but broken down by dimension
for (const res of dimTypes) {
for (const prop of getProps(res)) GameDatabase.multiplierTabTree[prop] = [append8(prop)];
for (let dim = 1; dim <= 8; dim++) GameDatabase.multiplierTabTree[`${res}_total_${dim}`] = [getProps(res, dim)];
for (const prop of getProps(res)) multiplierTabTree[prop] = [append8(prop)];
for (let dim = 1; dim <= 8; dim++) multiplierTabTree[`${res}_total_${dim}`] = [getProps(res, dim)];
}
// A few dynamically-generated props are largely useless in terms of what they connect to, in that they have very few
@ -172,50 +171,50 @@ const removedRegexes = ["AD_sacrifice", "AD_breakInfinityUpgrade", "AD_nerfIC",
".._achievementMult", ".._glyph", ".._alchemy", ".._imaginaryUpgrade", ".._iap",
".._nerfV", ".._nerfCursed", ".._nerfPelle", ".._pelle"
];
const removedProps = Object.keys(GameDatabase.multiplierTabTree)
const removedProps = Object.keys(multiplierTabTree)
.filter(key => removedRegexes.some(regex => key.match(regex)));
for (const prop of removedProps) {
GameDatabase.multiplierTabTree[prop] = undefined;
multiplierTabTree[prop] = undefined;
}
// We need to handle infinity power multiplier a bit differently; previous steps of dynamic generation fill it with
// 8 identical AD multipliers, but we want to replace it with ID mults and the conversion rate
GameDatabase.multiplierTabTree.AD_infinityPower = [["ID_total", "ID_powerConversion"]];
multiplierTabTree.AD_infinityPower = [["ID_total", "ID_powerConversion"]];
for (let dim = 1; dim <= 8; dim++) {
GameDatabase.multiplierTabTree[`AD_infinityPower_${dim}`] = [["ID_total", "ID_powerConversion"]];
multiplierTabTree[`AD_infinityPower_${dim}`] = [["ID_total", "ID_powerConversion"]];
}
// Tesseracts are added one layer deep, but we don't want to override the existing ID_purchase entry
GameDatabase.multiplierTabTree.ID_purchase.unshift(["ID_basePurchase", "ID_tesseractPurchase",
multiplierTabTree.ID_purchase.unshift(["ID_basePurchase", "ID_tesseractPurchase",
"ID_infinityGlyphSacrifice", "ID_powPurchase"]);
for (let dim = 1; dim <= 7; dim++) {
GameDatabase.multiplierTabTree[`ID_purchase_${dim}`] = [[`ID_basePurchase_${dim}`, `ID_tesseractPurchase_${dim}`,
multiplierTabTree[`ID_purchase_${dim}`] = [[`ID_basePurchase_${dim}`, `ID_tesseractPurchase_${dim}`,
"ID_powPurchase"]];
}
GameDatabase.multiplierTabTree.ID_purchase_8 = [[`ID_basePurchase_8`, `ID_infinityGlyphSacrifice`, "ID_powPurchase"]];
multiplierTabTree.ID_purchase_8 = [[`ID_basePurchase_8`, `ID_infinityGlyphSacrifice`, "ID_powPurchase"]];
// These are also added one layer deep
for (let dim = 1; dim <= 7; dim++) {
GameDatabase.multiplierTabTree[`TD_purchase_${dim}`] = [[`TD_basePurchase_${dim}`, `TD_powPurchase_${dim}`]];
multiplierTabTree[`TD_purchase_${dim}`] = [[`TD_basePurchase_${dim}`, `TD_powPurchase_${dim}`]];
}
GameDatabase.multiplierTabTree.TD_purchase.push(["TD_basePurchase", "TD_timeGlyphSacrifice", "TD_powPurchase"]);
GameDatabase.multiplierTabTree.TD_purchase_8 = [["TD_basePurchase_8", "TD_timeGlyphSacrifice", "TD_powPurchase"]];
multiplierTabTree.TD_purchase.push(["TD_basePurchase", "TD_timeGlyphSacrifice", "TD_powPurchase"]);
multiplierTabTree.TD_purchase_8 = [["TD_basePurchase_8", "TD_timeGlyphSacrifice", "TD_powPurchase"]];
// Dynamically fill effects which only affect certain dimensions, as noted in targetedEffects
for (const res of dimTypes) {
for (const eff of Object.keys(targetedEffects)) {
if (!targetedEffects[eff][res]) continue;
GameDatabase.multiplierTabTree[`${res}_${eff}`] = [[]];
multiplierTabTree[`${res}_${eff}`] = [[]];
for (const id of targetedEffects[eff][res]) {
for (let dim = 1; dim <= 8; dim++) {
const propStr = `${res}_${eff}_${dim}`;
const dimStr = `${res}${dim}`;
if (targetedEffects[eff].checkFn(id, dimStr)) {
if (!GameDatabase.multiplierTabTree[propStr]) GameDatabase.multiplierTabTree[propStr] = [[]];
GameDatabase.multiplierTabTree[propStr][0].push(`general_${eff}_${id}_${dimStr}`);
if (!multiplierTabTree[propStr]) multiplierTabTree[propStr] = [[]];
multiplierTabTree[propStr][0].push(`general_${eff}_${id}_${dimStr}`);
}
}
GameDatabase.multiplierTabTree[`${res}_${eff}`][0].push(`general_${eff}_${id}_${res}`);
multiplierTabTree[`${res}_${eff}`][0].push(`general_${eff}_${id}_${res}`);
}
}
}
@ -224,17 +223,17 @@ for (const res of dimTypes) {
for (const res of singleRes) {
for (const eff of Object.keys(targetedEffects)) {
if (!targetedEffects[eff][res]) continue;
GameDatabase.multiplierTabTree[`${res}_${eff}`] = [[]];
multiplierTabTree[`${res}_${eff}`] = [[]];
for (const ach of targetedEffects[eff][res]) {
GameDatabase.multiplierTabTree[`${res}_${eff}`][0].push(`general_${eff}_${ach}`);
multiplierTabTree[`${res}_${eff}`][0].push(`general_${eff}_${ach}`);
}
}
}
// Fill in eternity upgrade entries
GameDatabase.multiplierTabTree.ID_eternityUpgrade = [[`ID_eu1`, `ID_eu2`, `ID_eu3`]];
GameDatabase.multiplierTabTree.TD_eternityUpgrade = [[`TD_eu1`, `TD_eu2`]];
multiplierTabTree.ID_eternityUpgrade = [[`ID_eu1`, `ID_eu2`, `ID_eu3`]];
multiplierTabTree.TD_eternityUpgrade = [[`TD_eu1`, `TD_eu2`]];
for (let dim = 1; dim <= 8; dim++) {
GameDatabase.multiplierTabTree[`ID_eternityUpgrade_${dim}`] = [[`ID_eu1_${dim}`, `ID_eu2_${dim}`, `ID_eu3_${dim}`]];
GameDatabase.multiplierTabTree[`TD_eternityUpgrade_${dim}`] = [[`TD_eu1_${dim}`, `TD_eu2_${dim}`]];
multiplierTabTree[`ID_eternityUpgrade_${dim}`] = [[`ID_eu1_${dim}`, `ID_eu2_${dim}`, `ID_eu3_${dim}`]];
multiplierTabTree[`TD_eternityUpgrade_${dim}`] = [[`TD_eu1_${dim}`, `TD_eu2_${dim}`]];
}

View File

@ -0,0 +1,34 @@
import { AM } from "./antimatter";
import { AD } from "./antimatter-dimensions";
import { DT } from "./dilated-time";
import { eternities } from "./eternities";
import { EP } from "./eternity-points";
import { galaxies } from "./galaxies";
import { gamespeed } from "./gamespeed";
import { general } from "./general";
import { infinities } from "./infinities";
import { ID } from "./infinity-dimensions";
import { IP } from "./infinity-points";
import { replicanti } from "./replicanti";
import { TP } from "./tachyon-particles";
import { tickspeed, tickspeedUpgrades } from "./tickspeed";
import { TD } from "./time-dimensions";
export const multiplierTabValues = {
general,
AM,
AD,
ID,
TD,
IP,
EP,
TP,
DT,
tickspeed,
tickspeedUpgrades,
galaxies,
infinities,
eternities,
gamespeed,
replicanti
};

View File

@ -1,7 +1,5 @@
import { DC } from "../constants";
import { GameDatabase } from "./game-database";
// A = always there
// L = locked
// R = random chance condition
@ -13,7 +11,7 @@ function newsAnimSpd(seconds) {
}
GameDatabase.news = [
export const news = [
{
id: "a1",
text: "The cookie is a lie.",

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "./game-database";
GameDatabase.progressStages = [
export const progressStages = [
/**
* This is used in both the catchup modal and for cloud save comparisons. Due to the fact that it's used for
* cloud comparisons, there's a lot of processing that needs to be done on raw player-like objects that aren't

View File

@ -1,6 +1,6 @@
import { GameDatabase } from "../game-database";
import { automatorTemplates } from "../script-templates";
GameDatabase.reality.automator = {
export const automator = {
categoryNames: [
"Time Studies",
"Event Triggers",
@ -615,5 +615,20 @@ GameDatabase.reality.automator = {
}`
]
},
]
],
otherAutomatorPoints: [
{
name: "Reality Count",
automatorPoints: () => 2 * Math.clampMax(Currency.realities.value, 50),
shortDescription: () => `+${formatInt(2)} per Reality, up to ${formatInt(50)} Realities`,
symbol: "Ϟ",
},
{
name: "Black Hole",
automatorPoints: () => (BlackHole(1).isUnlocked ? 10 : 0),
shortDescription: () => `Unlocking gives ${formatInt(10)} AP`,
symbol: "<i class='fas fa-circle'></i>",
},
],
templates: automatorTemplates
};

View File

@ -1,7 +1,5 @@
import { GameDatabase } from "../game-database";
// Color prop is a combination of a B/W background and a border hex code
GameDatabase.reality.glyphCosmeticSets = {
export const glyphCosmeticSets = {
cards: {
id: "cards",
name: "Playing Card Suits",

View File

@ -1,5 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
export const GlyphCombiner = Object.freeze({
/**
@ -28,8 +27,7 @@ export const GlyphCombiner = Object.freeze({
multiplyDecimal: x => x.reduce(Decimal.prodReducer, DC.D1)
});
GameDatabase.reality.glyphEffects = {
export const glyphEffects = {
timepow: {
id: "timepow",
bitmaskIndex: 0,

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "../game-database";
GameDatabase.reality.glyphSacrifice = {
export const glyphSacrifice = {
"power": {
id: "power",
effect: added => {

View File

@ -1,11 +1,9 @@
import { GameDatabase } from "../game-database";
// The glyphTypes entry is used for both gameplay and cosmetics purposes, so we cannot modify isUnlocked for cosmetics.
// For the purposes of cosmetics, the difference between isUnlocked and canCustomize is as follows:
// - isUnlocked: Whether or not this type appears as a choice in glyph-specific customization for overriding their
// normal display type; this is ignored for functional type entries
// - canCustomize: Whether or not this type can have its color/symbol changed in the type-specific customization
GameDatabase.reality.glyphTypes = {
export const glyphTypes = {
time: {
id: "time",
symbol: GLYPH_SYMBOLS.time,
@ -81,7 +79,7 @@ GameDatabase.reality.glyphTypes = {
},
};
GameDatabase.reality.cosmeticGlyphs = {
export const cosmeticGlyphs = {
music: {
id: "music",
symbol: "♫",

View File

@ -1,5 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
const rebuyable = props => {
props.cost = () => props.initialCost * Math.pow(props.costMult, player.reality.imaginaryRebuyables[props.id]);
@ -11,7 +10,7 @@ const rebuyable = props => {
return props;
};
GameDatabase.reality.imaginaryUpgrades = [
export const imaginaryUpgrades = [
rebuyable({
name: "Temporal Intensifier",
id: 1,

View File

@ -0,0 +1,22 @@
import { cosmeticGlyphs, glyphTypes } from "./glyph-types";
import { perkConnections, perks } from "./perks";
import { automator } from "./automator";
import { glyphCosmeticSets } from "./glyph-cosmetics";
import { glyphEffects } from "./glyph-effects";
import { glyphSacrifice } from "./glyph-sacrifices";
import { imaginaryUpgrades } from "./imaginary-upgrades";
import { realityUpgrades } from "./reality-upgrades";
export const reality = {
automator,
cosmeticGlyphs,
glyphCosmeticSets,
glyphEffects,
glyphSacrifice,
glyphTypes,
imaginaryUpgrades,
perks,
perkConnections,
upgrades: realityUpgrades
};

View File

@ -1,5 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
export const PERK_FAMILY = {
ANTIMATTER: "ANTIMATTER",
@ -30,7 +29,7 @@ function vectorToNum(v) {
* Note: This encoding/decoding only works properly for coordinates with values between -1000 and 1000, and will
* be slightly off for vectors whose coordinates aren't divisible by 5
*/
GameDatabase.reality.perks = {
export const perks = {
firstPerk: {
id: 0,
label: "START",
@ -511,8 +510,8 @@ GameDatabase.reality.perks = {
}
};
GameDatabase.reality.perkConnections = (function() {
const p = GameDatabase.reality.perks;
export const perkConnections = (function() {
const p = perks;
// First item is the start, other items are the ends
const groups = [
[p.firstPerk, p.achievementGroup1, p.startAM, p.autounlockEU1, p.bypassEC5Lock],
@ -553,7 +552,7 @@ GameDatabase.reality.perkConnections = (function() {
[p.achievementGroup4, p.achievementGroup5],
];
const connections = {};
for (const perk of Object.values(GameDatabase.reality.perks)) {
for (const perk of Object.values(perks)) {
const connectedPerks = [];
const directConnections = groups.find(g => g[0] === perk);
if (directConnections !== undefined) {

View File

@ -1,5 +1,4 @@
import { DC } from "../../constants";
import { GameDatabase } from "../game-database";
const rebuyable = props => {
props.cost = () => getHybridCostScaling(
@ -26,7 +25,7 @@ const rebuyable = props => {
};
GameDatabase.reality.upgrades = [
export const realityUpgrades = [
rebuyable({
name: "Temporal Amplifier",
id: 1,

View File

@ -1,7 +1,6 @@
import { AutobuyerInputFunctions } from "@/components/tabs/autobuyers/AutobuyerInput";
import { GameDatabase } from "./game-database";
GameDatabase.reality.automator.templates = {
export const automatorTemplates = {
/**
* List of possible data types to dynamically generate in script templates, assumed to be only string or boolean
* {

View File

@ -1,8 +1,7 @@
import { STEAM } from "@/env";
import { GameDatabase } from "./game-database";
// NOTE: IF ANY COSTS ARE CHANGED HERE, THEY ALSO NEED TO BE CHANGED ON THE BACKEND TOO
GameDatabase.shopPurchases = {
export const shopPurchases = {
dimPurchases: {
key: "dimPurchases",
cost: 30,
@ -126,5 +125,5 @@ GameDatabase.shopPurchases = {
};
if (STEAM) {
delete GameDatabase.shopPurchases.allCosmeticSets;
delete shopPurchases.allCosmeticSets;
}

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "./game-database";
GameDatabase.speedrunMilestones = [
export const speedrunMilestones = [
{
id: 1,
key: "firstBoost",

View File

@ -1,8 +1,6 @@
import { DC } from "../constants";
import { GameDatabase } from "./game-database";
GameDatabase.tabNotifications = {
export const tabNotifications = {
firstInfinity: {
id: 0,
tabsToHighLight: [

View File

@ -1,6 +1,4 @@
import { GameDatabase } from "./game-database";
GameDatabase.tabs = [
export const tabs = [
{
key: "dimensions",
name: "Dimensions",