-
Notifications
You must be signed in to change notification settings - Fork 164
/
Copy pathh2p.js
2010 lines (1987 loc) · 111 KB
/
h2p.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
import { DC } from "../constants";
import { credits } from "@/core/secret-formula/credits";
export const h2p = {
/**
* @template
* {
* @property {String} name Internal name for the tab entry
* @property {String} alias Display name for the tab; if not present, will use the internal name
* @property {Number} id Unique ID for each entry (generated in-game, not explicitly stated)
* @property {function: @return String} info Text body of information for the entry
* @property {function: @return Boolean} isUnlocked Condition for when the entry is visible and searchable
* @property {Array: String} tags List of keywords which are linked to this tab in the search function
* @property {String} tab Key of a tab+subtab combination which will default the h2p to this entry if opened
* }
*/
tabs: [
{
name: "This Modal",
info: () => `
Welcome to the How to Play!
<br>
<br>
This modal (pop-up window) contains in-depth explanations and additional details for everything you will encounter
as you progress through the game. As you unlock new features and mechanics, you will also gain access to additional
pages here. If you ever feel lost or confused about how something in the game works, you may find a helpful
explanation within the related entry in here.
<br>
<br>
For now, opening the How to Play will always start you on this page. After you get your first Dimension Boost,
opening this modal will instead place you on the How to Play entry most relevant to the game content on your currently
visible tab and subtab, if such an entry exists.
`,
isUnlocked: () => true,
tags: ["h2p", "how", "to", "play", "modal"],
tab: ""
},
{
name: "Your savefile",
info: () => `
Your game's save data is stored on your computer's browser data if you are playing on a web browser, or in your Steam
installation folder if you are playing on Steam. This means that clearing your browser's cache or cookies, or fully
uninstalling the game from Steam will also delete your save file.
Similarly, if you are playing in a private or incognito window, your save
will not be there the next time you open up your browser. The saves are browser-specific as well, so for example
if you play the game on Chrome, you will not find your save on Firefox. Lastly, any saves you have on the web version
and the Steam version will also be completely independent from each other.
<br>
<br>
You can transfer your save between places by using the export function, which will copy a <i>very</i> long string of
random-looking characters into your clipboard. That text contains your save data, which you can load back into the
game by pasting it into the text box on the import prompt. You need the entirety of the save text for importing to
work properly, or else the game might not recognize the text as a valid save. Certain messaging applications may
cut off part of the text if you are using one to transfer the save between devices.
<br>
<br>
A properly-formatted save string from the Reality update will start with
<b>${GameSaveSerializer.startingString.savefile}</b> and end with <b>${GameSaveSerializer.endingString.savefile}</b>.
If you are importing from a version of the game from before Reality was released, it will instead start with <b>eyJ</b>
and end with <b>In19</b>, <b>fX0=</b>, or <b>fQ==</b>. If neither of these are the case, then part of your save is
missing and it will fail to import. In addition to importing and exporting to your clipboard, you can also import
and export from text files as well.
<br>
You can use the "Choose save" button to pick between three separate saves on your browser. These saves are, for most
intents and purposes, completely separate from each other. Importing and exporting will only affect the current save
slot. <b>The only exception is clearing your browser or Steam data, in which case all three saves will be reset.</b>
<br>
<br>
The game automatically saves periodically, by default once every ${formatInt(30)} seconds.
Keep this in mind if you need to close the game - anything you
do right before closing it might not be saved unless you wait for the autosave interval or manually save again. The
length of the autosave interval is adjustable, and its timer can be seen in the bottom-left of the screen.
<br>
<br>
Backups of your savefile are also saved after certain amounts of time online or offline, which you can examine and
reload at any point by clicking the "Open Automatic Save Backup Menu" button. These backups may be useful if you wish
to revert your save to what it looked like some time in the past, such as a few minutes ago or when you were last
offline for a while.
<br>
<br>
You can also connect a Google Account to the game, allowing you to save your progress online. This allows you to play
with the same save on any device which is also logged into the same account. Cloud saving is only compatible with other
saves on the web or Steam versions of the game; saves from the Android app of the game will not be automatically linked
via Cloud saving. Saving and loading from the Cloud will
automatically overwrite the other save unless the other save is either older or has noticeably more progression, in
which case a modal will appear which asks you which save you want to keep.
<br>
<br>
You can completely reset your save at any point if desired by clicking the button, which brings up a prompt you need
to fill out in order to make sure you intentionally wanted to reset. Going through with this reset will only clear
your current save; the other save slots will be unaffected. <b>Resetting your game in this way is completely
irreversible and gives you no permanent benefits, secret or otherwise.</b>
`,
isUnlocked: () => true,
tags: ["choose", "cloud", "google", "save", "import", "export", "reset"],
tab: "options/saving"
},
{
name: "Customization",
info: () => `
The game has two different UI layouts - the Classic UI maintains the style of Antimatter Dimensions from before the
Reality update, while the Modern UI is a redesign based on more modern dark theme styles. Additionally, there are
various themes which can be applied to modify the appearance of everything in the game. There are a few secret themes
which can be unlocked through importing certain phrases. Both UI layouts support all the different possible themes.
<br>
<br>
The notation used to display numbers in the game defaults to Mixed Scientific, but can be changed to one of numerous
options in the drop-down menu. Many of these notations are intended as jokes and in some cases will format numbers
in a way that causes text to spill over into other parts of the screen - this is not a bug. You can additionally
configure what numbers look like when they are extremely large using the "Exponent Notation Options" menu,
although this may result in some odd text appearances in some places.
<br>
<br>
Many events in the game trigger full-screen animations or pop-up modals which require you to confirm that you want to
continue. Most of these animations and confirmations can be disabled on an individual basis through the options,
although the ability to disable any given animation or confirmation will only appear after they have already shown up
at least once.
`,
isUnlocked: () => true,
tags: ["UI", "update", "news", "theme", "notation", "comma", "exponent", "animation", "retry", "confirmation",
"offline", "hotkey", "classic", "modern"],
tab: "options/visual"
},
{
name: "Offline Progress",
info: () => `
Antimatter Dimensions has a catch-up mechanic which attempts to simulate the game's behavior if the game is closed for
an extended period of time. The simulation behavior is only somewhat accurate, as the game is too mathematically
complicated to be run at full accuracy in a reasonable amount of time. At the end of the simulation, the game will
summarize how various relevant resources have changed while you were gone.
<br>
<br>
If the game is left open and becomes unfocused or otherwise suspended for an extended period of time, it will attempt
to apply the missed time as offline progress when you return. This can be potentially unreliable, as different devices
handle these situations differently. If this results in undesirable behavior, there is a toggle to turn this off in the
options - in that case the game will try to apply all the missed time in a single tick.
<br>
<br>
The game runs on a system where everything is updated once per tick - all Dimensions and resources do one unit of
production, all autobuyers trigger once, all multipliers and values are changed accordingly, and all the displayed
numbers are updated. By default there are ${formatInt(20)} ticks per second when the game is running, although this can
be modified by changing the "Update rate" within the game Options.
Your current settings will run the game at ${format(1000 / player.options.updateRate, 2, 1)} ticks per second on
average, although lag and internal javascript behavior may cause individual ticks to vary by a few percent.
<br>
<br>
When offline simulation is active, these ticks have an adjusted length in order to fill the amount of time you were
away - for example having a setting for ${formatInt(1000)} offline ticks and closing the game for an hour will result in
ticks which are ${format(3.6, 1, 1)} seconds long each. For most things in the game, this is not an issue because this
will still result in approximately the same amount of resources after the simulation completes. A notable exception is
autobuyers - in this situation autobuyers will effectively only trigger once every ${format(3.6, 1, 1)} seconds, which
may have a strong impact depending on the part of the game.
<br>
<br>
${player.blackHole[0].unlocked
? `<b>Offline Black Hole behavior:</b> Once the Black Hole has been unlocked, the offline progress simulation will
attempt to run the game in a way where each tick contains roughly the same amount of <i>game</i> time. This may
give the appearance of the Black Hole(s) being active for a much larger fraction of time than normal while
simulating, when in fact the game is running active periods more slowly and "skipping past" the inactive periods
because they contribute much less production per real time. This results in behavior which is generally in your
favor when compared to ticks with constant real time.
<br>
<br>`
: ""
}
Offline tick count can be adjusted between ${formatInt(500)} and ${formatInt(DC.E6)} ticks. Smaller counts will result
in faster but less accurate simulations, while larger counts will result in more accurate simulations which take longer
to complete. There is a limit of one day of time per game tick, meaning there are some rare situations (such as not
playing the game for more than a year) where you may not get all of the time you were away.
<br>
<br>
Offline progress can be disabled entirely if desired, for example for diagnostic or timing purposes, or in order
to do an "online only" playthrough of the game. Otherwise, offline progress is on by default from the very beginning
of the game. Note that if offline progress is disabled, the statistic for total time played will also be paused while
the game closed.
`,
isUnlocked: () => true,
tags: ["offline", "away", "progress"],
tab: "options/gameplay"
}, {
name: "Effect Stacking",
info: () => `
Most of the effects and upgrades in Antimatter Dimensions largely fall into three categories:
<br>
- <b>Additive:</b> These effects are typically denoted with a + (or the word "increase") followed by a number,
and add their value to some
base amount. Multiple additive effects are summed up. These can also sometimes show up as subtractive effects which
reduce resource costs.
<br>
- <b>Multiplicative:</b> These effects are shown either by a × (or the word "multiply") followed by a number or,
more rarely, as two numbers
separated by a ➜. Different multiplicative sources always combine by multiplying, never by adding. In some situations,
there may be negative effects or cost reductions that apply in this category as division.
<br>
- <b>Power</b>: These effects are much rarer and appear as ^ followed by a number. Multiple power effects apply
sequentially, or equivalently by multiplying the values of the power effects together and applying the final value
as a single power. In rare situations, negative effects may apply here in this category as powers which are less
than ${formatInt(1)}.
<br>
<br>
Unless otherwise noted when an upgrade or reward <i>replaces</i> an older value, all of these effects stack
with each other. In the case of an upgrade replacing an older value with a newer value, the replacement occurs before
any of the above effects are applied. To determine the final value of a set of effects, the effects from each category
are individually combined, and then applied in the order of additive, multiplicative, then power effects.
<br>
<br>
${PlayerProgress.realityUnlocked() || PlayerProgress.dilationUnlocked()
? "Dilation and any Dilation-like effects apply <i>after</i> all of these other effects are stacked together."
: ""}
<br>
<br>
${PlayerProgress.realityUnlocked()
? `Glyph Effects effectively have two stacking attributes; their internal way of stacking together and the way
they stack with all other game effects. These may not necessarily be the same - for example, the "Antimatter
Dimension Power" effect will stack <i>additively with itself</i>, but then the total effect will be added to
a base value of ${formatInt(1)} and then applied as a <i>power effect</i> to Antimatter Dimensions.`
: ""}
`,
isUnlocked: () => true,
tags: ["effect", "stack", "combine", "add", "reduce", "multiply", "divide", "power", "dilation", "glyph"],
tab: "options/gameplay"
}, {
name: "Common Abbreviations",
info: () => `
Many resources within the game may appear in an abbreviated format as text in order to save space. This How to
Play entry will update itself with additional entries for new resources as you encounter them for the first time.
<br>
- <b>AM</b>: Antimatter<br>
- <b>AD</b>: Antimatter Dimension<br>
- <b>AG</b>: Antimatter Galaxy<br>
${PlayerProgress.infinityUnlocked() ? "- <b>IP</b>: Infinity Point<br>" : ""}
${PlayerProgress.infinityUnlocked() ? "- <b>NC</b>: Normal Challenge<br>" : ""}
${PlayerProgress.infinityUnlocked() ? "- <b>IC</b>: Infinity Challenge<br>" : ""}
${InfinityDimension(1).isUnlocked || PlayerProgress.eternityUnlocked() ? "- <b>ID</b>: Infinity Dimension<br>" : ""}
${PlayerProgress.replicantiUnlocked() ? "- <b>RG</b>: Replicanti Galaxy<br>" : ""}
${PlayerProgress.eternityUnlocked() ? "- <b>EP</b>: Eternity Point<br>" : ""}
${PlayerProgress.eternityUnlocked() ? "- <b>TT</b>: Time Theorem<br>" : ""}
${PlayerProgress.eternityUnlocked() ? "- <b>TD</b>: Time Dimension<br>" : ""}
${PlayerProgress.eternityUnlocked() ? "- <b>EC</b>: Eternity Challenge<br>" : ""}
${PlayerProgress.dilationUnlocked() ? "- <b>TP</b>: Tachyon Particle<br>" : ""}
${PlayerProgress.dilationUnlocked() ? "- <b>DT</b>: Dilated Time<br>" : ""}
${PlayerProgress.dilationUnlocked() ? "- <b>TG</b>: Tachyon Galaxy<br>" : ""}
${PlayerProgress.realityUnlocked() ? "- <b>RM</b>: Reality Machine<br>" : ""}
${PlayerProgress.realityUnlocked() ? "- <b>AP</b>: Automator Point<br>" : ""}
${PlayerProgress.realityUnlocked() ? "- <b>BH</b>: Black Hole<br>" : ""}
${MachineHandler.isIMUnlocked ? "- <b>iM</b>: Imaginary Machine<br>" : ""}
${Laitela.isUnlocked ? "- <b>DM</b>: Dark Matter<br>" : ""}
${Laitela.isUnlocked ? "- <b>DE</b>: Dark Energy<br>" : ""}
`,
isUnlocked: () => true,
tags: ["abbreviation", "shorten", "am", "ad", "ag", "ip", "nc", "ic", "id", "rg", "ep", "tt", "td", "ec", "tp",
"dt", "tg", "rm", "ap", "bh", "im", "dm", "de"],
tab: ""
}, {
name: "Antimatter Dimensions",
info: () => `
Antimatter is a resource that is used throughout the entire game for purchasing various things as you progress. You
start with ${formatInt(10)} antimatter when you first open the game, and you can
spend it to buy the 1st Antimatter Dimension to start the game.
<br>
<br>
Antimatter Dimensions are your production units in game. The 1st Antimatter Dimension produces your antimatter.
Each consecutive Antimatter Dimension produces the previous one, allowing you to have steady growth.
There are eight Antimatter Dimensions total.
<br>
<br>
<b>Dimension Multiplier:</b> Beside the Dimension there is a multiplier (example: 1st Dimension ${formatX(1, 1, 1)}).
The base production of each Dimension is multiplied by this number.
This multiplier increases by ${formatX(2)} for every ${formatInt(10)} of that Dimension purchased.
Each time this occurs, the price of the dimension will increase.
<br>
<br>
<b>Accumulated Dimension Quantity:</b> The next column is your current amount of that Dimension you own.
This is a combination of how many you have purchased with antimatter,
as well as produced from the higher Dimension.
<br>
<br>
<b>Purchased Dimensions Quantity:</b> Next to each accumulated quantity of owned Dimensions,
the amount of that Dimension purchased toward the next multiplier upgrade is displayed in brackets.
For example if you have (${formatInt(4)}) next to your accumulated dimension quantity,
you will need ${formatInt(6)} more of that dimension for the next multiplier increase.
<br>
<br>
<b>Dimension Growth Percent:</b> This number represents the amount of growth that each
Dimension experiences per second. ${formatPercents(1)} means the dimension is doubling each second.
This allows you to judge overall growth.
<br>
<br>
<b>Cost & until ${formatInt(10)}:</b>
You can buy a single quantity of each Dimension with antimatter when the cost button is highlighted.
Alternatively, if the Until ${formatInt(10)} button is highlighted,
you can buy whatever quantity gets you to that Dimension's next Dimension multiplier.
<br>
<br>
<b>Max all:</b> Max all will buy until ${formatInt(10)} of the 1st Antimatter Dimension until it cannot anymore,
then second, and so on until the 8th Antimatter Dimension, and then buy max Tickspeed Upgrades.
<br>
<br>
<b>Dimension base prices:</b> ${Array.range(1, 8)
.map(tier => format(AntimatterDimension(tier)._baseCost, 2, 2))
.join(", ")}
<br>
<b>Base per ${formatInt(10)} bought dimension price increases:</b> ${Array.range(1, 8)
.map(tier => format(AntimatterDimension(tier)._baseCostMultiplier, 2, 2))
.join(", ")}
<br>
<br>
<b>Hotkeys: 1, 2, 3, 4, 5, 6, 7, 8</b> for buy until ${formatInt(10)} Xth Dimension
(you can also hold down Shift while buying Dimensions, which will only buy
${formatInt(1)} instead of ${formatInt(10)}), <b>M</b> for Max all
`,
isUnlocked: () => true,
tags: ["dims", "normal", "antimatter", "ad"],
tab: "dimensions/antimatter"
}, {
name: "Tickspeed",
info: () => `
Production in the game happens on each "tick", which initially occurs once per second. By buying Tickspeed Upgrades,
you can make your Antimatter Dimensions produce faster, as if multiple ticks occur in each second.
<br>
<br>
<b>Tickspeed:</b> This states how many game ticks are occurring every second. Fractional ticks are accounted for,
boosting production as if part of a game tick has passed. Note that the actual tickspeed time is simulated and the
game always runs calculations at the update rate you've chosen in the Options tab.
<br>
<br>
<b>Cost:</b> The cost of antimatter for multiplying ticks/sec by the displayed multiplier.
(without any Galaxies, this is ${formatX(1.1245, 0, 3)} per purchase)
<br>
<br>
<b>Buy Max:</b> This will buy the maximum amount of Tickspeed Upgrades available
with your current amount of antimatter.
<br>
<br>
<b>Hotkeys: T</b> will purchase as many Tickspeed Upgrades as possible, or <b>Shift+T</b> to buy a single upgrade.
<b>M</b> for Max all.
`,
isUnlocked: () => Tickspeed.isUnlocked,
tags: ["dimension", "earlygame", "time"],
tab: "dimensions/antimatter"
}, {
name: "Dimension Boosts",
info: () => `
<b>Dimension Boost:</b> This resets your antimatter and all of your Antimatter Dimensions, but unlocks another
Antimatter Dimension for you to purchase and boosts your Dimension multipliers.
The 1st Dimension Boost requires ${formatInt(20)} 4th Dimensions, the 2nd requires ${formatInt(20)} 5th Dimensions, etc.
After unlocking all ${formatInt(8)} Dimensions,
every additional boost will cost ${formatInt(15)} more 8th Dimensions than the previous Boost and will no longer
unlock a Dimension, but will continue to increase your Dimension multipliers.
<br>
<br>
You gain a ${formatX(2)} multiplier to the 1st Dimension for every Dimension Boost you have. Each higher
Dimension will have the multiplier applied one less time as the previous, down to a minimum of ${formatInt(0)}.
For example, with ${formatInt(3)} Boosts, the 1st Dimension will gain ${formatX(8)}, the 2nd Dimension ${formatX(4)},
the 3rd Dimension ${formatX(2)}, and all other Dimensions are unaffected.
<br>
<br>
<b>Hotkey: D</b> will try to purchase a Dimension Boost.
`,
isUnlocked: () => true,
tags: ["dimboost", "reset", "earlygame"],
tab: "dimensions/antimatter"
}, {
name: "Antimatter Galaxies",
info: () => `
Purchasing an Antimatter Galaxy will reset your game back to the point where only ${formatInt(4)} Dimensions are
available, but will increase the effect of your Tickspeed Upgrades by +${format(0.02, 0, 2)} for your first two
Galaxies. As you get more Galaxies, the multiplier will continue becoming stronger and stronger.
<br>
<br>
Though it will have very little impact for the first few Tickspeed purchases,
the increase is multiplicative and will not take long to be visible.
<br>
<br>
Your first Antimatter Galaxy requires ${formatInt(80)} Eighth Dimensions, and each additional Galaxy will cost
another ${formatInt(60)} more.
<br>
<b>Distant Galaxy scaling:</b> Above ${formatInt(100)} Antimatter Galaxies the cost increase between Galaxies will
increase by ${formatInt(2)} per Galaxy, making the next Galaxy cost ${formatInt(62)} more, then ${formatInt(64)} more,
etc.
<br>
<b>Remote Galaxy scaling:</b> Above ${formatInt(Galaxy.remoteStart)} Antimatter Galaxies, the <i>total</i> cost
increases by another ${formatPercents(0.002, 1)} per Galaxy, on top of Distant scaling.
<br>
<br>
<b>Hotkey: G</b> will try to purchase an Antimatter Galaxy.
`,
isUnlocked: () => true,
tags: ["8th", "reset", "galaxy", "earlygame"],
tab: "dimensions/antimatter"
}, {
name: "Dimensional Sacrifice",
info: () => `
<b>You unlock Dimensional Sacrifice after your fifth Dimension Boost.</b>
<br>
<br>
Sacrificing will immediately reset the owned quantity of all non-Eighth Dimensions to zero, without reducing the
multiplier or the current cost. In return, it will multiply the Eighth Dimension Multiplier by the shown value.
It will take time to get back to the production you previously had, but you will end up with a net increase.
<br>
<br>
The Dimensional Sacrifice multiplier scales with the number of 1st Dimensions you had at the time of sacrifice,
and the scaling can be improved by completing certain Achievements and challenges. The multiplier is kept between
sacrifices, meaning that sacrificing once at ${formatX(10)} and then once at ${formatX(4)} will be the same as
${formatX(8)} then ${formatX(5)}; in both cases you will end up with a total sacrifice multiplier of ${formatX(40)}.
<br>
<br>
<b>Hotkey: S</b> will try to sacrifice.
`,
isUnlocked: () => Sacrifice.isVisible,
tags: ["8th", "reset", "earlygame", "gods", "earlygame"],
tab: "dimensions/antimatter"
}, {
name: "Achievements",
info: () => `
Each Achievement has requirements to unlock. Once unlocked, some Achievements give a reward.
Requirements and rewards vary in difficulty and benefit significantly.
<br>
<br>
In addition to any specific rewards for individual Achievements, you will receive a ${formatX(1.03, 2, 2)} multiplier
to all Antimatter Dimensions. Each fully completed row also gives another ${formatX(1.25, 2, 2)}. The total multiplier
effect from all Achievements together is shown above all the Achievement images.
<br>
<br>
Secret Achievements offer no gameplay benefits or advantages and are simply there for fun. Hovering over a Secret
Achievement will give a hint on how to attain them.
`,
isUnlocked: () => true,
tags: ["earlygame", "awards", "earlygame"],
tab: "achievements"
}, {
name: "Infinity",
info: () => `
Once you have too much antimatter for the world to handle (${formatInt(2)}<sup>${formatInt(1024)}</sup>
or about ${formatPostBreak(Number.MAX_VALUE, 6)},
sometimes called "Infinity"), you will be forced to do a “Big Crunch”. This will reset your antimatter, Antimatter
Dimensions, Dimension Boosts, and your Antimatter Galaxies. Doing a Big Crunch is also sometimes referred to as
"Infinitying".
<br>
<br>
You will eventually be able to pass ${formatPostBreak(Number.MAX_VALUE, 6)}, but until then any larger numbers will
display as ${format(Infinity)}.
<br>
<br>
Each Infinity completed will give an Infinity Point, which can be spent on upgrades in the new Infinity tab.
You must purchase these upgrades from top to bottom. You will also gain one "Infinity", which is effectively
the number of times you have crunched.
<br>
<br>
The "Multiply Infinity Points from all sources by ${formatInt(2)}" upgrade can be bought multiple times,
but each purchase requires ${formatInt(10)} times as much IP.
You must complete the Achievement "No DLC required" to start purchasing this particular upgrade.
<br>
<br>
<b>Hotkey: C</b> will try to perform a Big Crunch.
`,
isUnlocked: () => PlayerProgress.infinityUnlocked(),
tags: ["crunch", "big", "upgrades", "ip", "reset", "prestige", "earlygame"],
tab: "infinity/upgrades"
}, {
name: "Normal Challenges",
info: () => `
Normal Challenges are unlocked after your first Infinity; they change in-game mechanics in different ways to create more
difficult Infinity circumstances. To complete a challenge, you must reach ${formatPostBreak(Number.MAX_VALUE, 2)}
antimatter again.
<br>
<br>
Each completed Normal Challenge will award an autobuyer or the ability to upgrade an existing autobuyer.
You can run them multiple times (though only the first time grants a reward),
and they can be exited at any time via the “Exit Challenge” button.
<br>
<br>
Your first Infinity is considered to be the first Normal Challenge, and is thus already completed when
you unlock challenges.
<br>
<br>
The rightmost column of Infinity Upgrades does not work in challenges.
`,
isUnlocked: () => PlayerProgress.infinityUnlocked(),
tags: ["infinity", "autobuyer", "earlygame"],
tab: "challenges/normal"
}, {
name: "Autobuyers",
info: () => `
Autobuyers allow you to automatically purchase dimensions, upgrades, or prestiges. All autobuyer
controls are located under the "Autobuyers" subtab of the "Automation" tab, including any additional autobuyers
unlocked later in the game.
<br>
<br>
Antimatter Dimension Autobuyers and the Tickspeed Upgrade Autobuyer can be unlocked based on your total antimatter,
but most other autobuyers require upgrades to be purchased or challenges to be beaten.
<br>
<br>
Most Autobuyers have similar attributes:
<br>
<br>
<b>Autobuyer Interval:</b> The cooldown period before the autobuyer attempts to make another purchase.
Antimatter Dimension Autobuyers and the Tickspeed Upgrade Autobuyer require their respective challenges to be beaten
before their interval can be upgraded.
<br>
<br>
<b>Antimatter Dimension Autobuyer Bulk Buy:</b> Once the interval of an autobuyer reaches its minimum
(at ${formatInt(100)} ms), all future upgrades will double the maximum amount the autobuyer can purchase per tick.
This can be disabled.
<br>
<br>
<b>Antimatter Dimension Autobuyer Buy Quantity:</b> Autobuyers for Dimensions can be set to buy a single Dimension,
or until ${formatInt(10)}. Bulk buy is disabled when the autobuyer is set to singles.
<br>
<br>
<b>Tickspeed Autobuyer Buy Quantity:</b> The tickspeed autobuyer can be set to buy a single upgrade per activation
or to buy the max possible once the Tickspeed Challenge (C9) has been beaten.
<br>
<br>
<b>Automatic Dimension Boost Customization:</b> With the Dimension Boost autobuyer you can set the max number of
Boosts it will attempt to buy, a minimum number of Antimatter Galaxies before Dimension Boosts are
always auto-purchased, and (when unlocked) the ability to buy an exact number of Dimension Boosts in bulk.
If you reach your specified Galaxy threshold, the autobuyer will ignore your max Boost limit.
<br>
<br>
<b>Max Galaxies:</b> The highest amount of Galaxies the Galaxies autobuyer will buy.
<br>
<br>
<b>IP on crunch:</b> Once you Break Infinity, you can set how many IP you would like to wait for before crunching.
<br>
<br>
<b>Sacrifice Autobuyer:</b> This autobuyer starts with a maxed interval, potentially triggering every tick.
<br>
<br>
<b>Dynamic Amount:</b> Upgraded prestige autobuyers have a mode that triggers a prestige when a specified threshold
is passed. Turning on "Dynamic Amount" will allow this threshold value to be automatically increased when unlocking
certain upgrades or achievements which apply a multiplier to this value.
<br>
<br>
<b>Pause/Resume Autobuyers:</b> This button will pause or resume autobuyers which are turned on.
It does not change individual autobuyer settings. Think of it like a master switch.
<br>
<br>
<b>Enable/Disable All Autobuyers:</b> This button will turn all of your autobuyers on or off individually.
<br>
<br>
<b>Hotkey: A</b> (for pausing/resuming autobuyers).
Additionally, holding <b>Alt</b> when pressing a hotkey associated with an upgrade, dimension, or prestige will
toggle the associated autobuyer.
`,
isUnlocked: () => true,
tags: ["infinity", "automation", "challenges", "rewards", "interval", "earlygame"],
tab: "automation/autobuyers"
}, {
name: "Break Infinity",
info: () => `
Once you Break Infinity, you are no longer limited to ${formatPostBreak(Number.MAX_VALUE, 2)} antimatter and can start
gaining more than ${formatInt(1)} IP per crunch depending on how much more antimatter you have when you crunch.
<br>
<br>
You now gain ~${format(1.78, 2, 2)} IP for crunching at ${formatPostBreak(Number.MAX_VALUE, 2)} antimatter. The IP you
gain for crunching is multiplied by ${formatInt(10)} for every additional factor of
${formatPostBreak(Number.MAX_VALUE, 2)} antimatter you gain (in a continuous manner). This is rounded down to the
nearest integer <i>after</i> all multipliers are applied.
<br>
<br>
The antimatter costs of all Dimensions begin to increase faster after they pass
${formatPostBreak(Number.MAX_VALUE, 2)}. The cost <i>between</i> upgrades will increase by ${formatX(10)}
<i>per upgrade</i> above ${formatPostBreak(Number.MAX_VALUE, 2)}, and a similar scaling happens to
Tickspeed Upgrade costs as well.
`,
isUnlocked: () => Autobuyer.bigCrunch.hasMaxedInterval || PlayerProgress.eternityUnlocked(),
tags: ["limit", "crunch", "upgrades", "midgame"],
tab: "infinity/break"
}, {
name: "Infinity Dimensions",
info: () => `
<b>Unlocking Infinity Dimensions:</b> Infinity Dimensions are unlocked by reaching a certain amount of antimatter.
<br>
<br>
<b>Infinity Dimension Purchasing:</b> Infinity Dimensions are only purchasable in sets of ${formatInt(10)}, and cost
Infinity Points. They give a permanent multiplier per purchase, similar to the other dimensions. The actual multiplier
applied depends on which Infinity Dimension you purchase. <!-- Sorry Garnet :/ -->
<br>
<br>
<b>Infinity Dimension Production:</b> Just like Antimatter Dimensions, each Infinity Dimension produces the
next lower Infinity Dimension.
<br>
<br>
Every crunch, your produced Infinity Dimensions are reset to the amount you purchased. While the production
of Infinity Dimensions does not carry between crunches, all the multipliers you got from purchasing them do.
<br>
<br>
<b>Infinity Dimension unlock thresholds (antimatter):</b> ${Array.range(1, 8)
.map(tier => formatPostBreak(InfinityDimension(tier)._unlockRequirement))
.join(", ")}
<br>
<b>Infinity Dimension purchase multipliers:</b> ${Array.range(1, 8)
.map(tier => format(InfinityDimension(tier)._powerMultiplier))
.join(", ")}
<br>
<b>Infinity Dimension base prices (IP):</b> ${Array.range(1, 8)
.map(tier => format(InfinityDimension(tier)._baseCost))
.join(", ")}
<br>
<b>Infinity Dimension price increases:</b> ${Array.range(1, 8)
.map(tier => format(InfinityDimension(tier)._costMultiplier))
.join(", ")}
<br>
<br>
Instead of antimatter, the 1st Infinity Dimension produces Infinity Power, which gives a multiplier applied
to all Antimatter Dimensions equal to (power<sup>${formatInt(7)}</sup>). Infinity Dimensions are not
affected by Tickspeed Upgrades.
`,
isUnlocked: () => Autobuyer.bigCrunch.hasMaxedInterval || PlayerProgress.eternityUnlocked(),
tags: ["id", "power", "new", "dims", "unlock", "break", "midgame"],
tab: "dimensions/infinity"
}, {
name: "Infinity Challenges",
// This one could use some work!
info: () => `
Infinity Challenges are like Normal Challenges, but they have higher end goals and are generally harder. Instead of
only unlocking autobuyers, they give you boosts to your various forms of production in more unique ways. Similarly to
Normal Challenges, the rightmost column of Infinity Upgrades are disabled within Infinity Challenges.
<br>
<br>
Unlike the Normal Challenges, which are all unlocked at once, Infinity Challenges require you to reach a certain
amount of antimatter before you can attempt them.
<br>
<br>
<b>Infinity Challenge unlock thresholds:</b> ${GameDatabase.challenges.infinity
.map(ic => formatPostBreak(ic.unlockAM)).join(", ")}
`,
isUnlocked: () => Autobuyer.bigCrunch.hasMaxedInterval || PlayerProgress.eternityUnlocked(),
tags: ["rewards", "break", "ic", "midgame"],
tab: "challenges/infinity"
}, {
name: "Replicanti",
info: () => `
Replicanti are another resource you unlock at ${format(DC.E140)} IP. Rather
than producing something else, Replicanti actually produces <i>itself</i> up to a maximum of
${formatPostBreak(Number.MAX_VALUE, 2)}. Replicanti are produced at their own pace, unaffected by Tickspeed Upgrades.
Each individual Replicanti has a certain chance (initially ${formatPercents(0.01)}) of producing another Replicanti
every Replicanti tick (initially every second), and both of these can be upgraded by spending IP.
<br>
<br>
If you have purchased a Replicanti Galaxy upgrade, then you can get a "free" Replicanti Galaxy in exchange for
resetting your Replicanti count back to ${formatInt(1)}. This Galaxy is free in that it will act as if it was an
Antimatter Galaxy, but it will not make your next Antimatter Galaxy more expensive. However, it will still reset the
same things as an Antimatter Galaxy does.
<br>
<br>
<b>Hotkey: R</b> will try to purchase a Replicanti Galaxy.
<br>
Replicanti give a multiplier to all Infinity Dimensions, which will reach a maximum of
${formatX(Math.pow(2, 20), 2, 2)} at ${formatPostBreak(Number.MAX_VALUE, 2)} Replicanti.
<br>
<br>
<b>Chance upgrade cost:</b> Base ${format(DC.E150)} IP, cost increment ${formatX(DC.E15)} IP
<br>
<b>Interval upgrade cost:</b> Base ${format(DC.E140)} IP, cost increment ${formatX(DC.E10)} IP
<br>
<b>Galaxy upgrade cost:</b> Base ${format(DC.E170)} IP, cost increment ${formatX(DC.E25)} IP and an additional
${formatX(1e5)} IP per upgrade, scaling similarly to distant Antimatter Galaxies. Above ${formatInt(100)} Replicanti
Galaxies, this ${formatX(1e5)} per upgrade changes to ${formatX(DC.E55)}. Above ${formatInt(1000)}, the scaling switches
from quadratic to cubic, with the ${formatX(DC.E55)} multiplier itself increasing by ${formatX(DC.E5)} per upgrade.
`,
isUnlocked: () => Replicanti.areUnlocked || PlayerProgress.eternityUnlocked(),
tags: ["interval", "chance", "infinity", "galaxy", "galaxies", "midgame"],
tab: "infinity/replicanti"
}, {
name: "Eternity",
info: () => `
Upon reaching ${formatPostBreak(Number.MAX_VALUE, 2)} IP, you can Eternity. Eternities will reset everything before this
point except challenge times, Achievements, and anything under the General section of the Statistics tab. You will be
able to access more content after your first Eternity.
<br>
<br>
You can pass ${formatPostBreak(Number.MAX_VALUE, 2)} IP without anything being forced upon you, unlike the first time
you reached ${formatPostBreak(Number.MAX_VALUE, 2)} antimatter. You will receive more Eternity Points the more
Infinity Points you had before going Eternal. You will also gain one "Eternity" for completing an Eternity.
<br>
<br>
Eternity Point gain scales similarly to Infinity Point gain, but scaling off of Infinity Points instead of antimatter.
The base amount of EP gained at ${formatPostBreak(Number.MAX_VALUE, 2)} IP is ~${format(1.62, 2, 2)} EP, multiplied by
${formatInt(5)} for every factor of ${formatPostBreak(Number.MAX_VALUE, 2)} more IP you have. This is always rounded
down, which means that you will get ${formatInt(1)} EP at ${formatPostBreak(Number.MAX_VALUE, 2)} IP but will not reach
${formatInt(2)} EP until ${formatPostBreak(DC.E349)}.
<br>
<br>
<b>Hotkey: E</b> will try to perform an Eternity reset.
`,
isUnlocked: () => PlayerProgress.eternityUnlocked(),
tags: ["eternal", "ep", "reset", "prestige", "midgame"],
tab: "eternity/upgrades"
}, {
name: "Eternity Milestones",
info: () => `
To make Eternities faster and more convenient, you will unlock various buffs as you get more "Eternity". These
buffs will generally let you start with certain upgrades you would otherwise lose after Eternity, give you new
autobuyers for better automation, or give you a way to passively gain resources offline at a reduced rate.
<br>
<br>
Milestones which give you upgrades will automatically purchase and upgrade them to their maximum when first starting
the Eternity, effectively letting you have them permanently.
<br>
<br>
All of the new autobuyers will have toggles next to their respective manual buttons (for example, Infinity Dimension
autobuyers can be found on the Infinity Dimension tab) in addition to their entries on the autobuyers tab.
The improvements to the Dimension Boost, Antimatter Galaxy, and Big Crunch autobuyers update their
already existing entries on the autobuyer tab.
<br>
<br>
The passive generation milestones only work offline by design and may need certain autobuyer settings to work
properly, as noted on the milestone page itself.
`,
isUnlocked: () => PlayerProgress.eternityUnlocked(),
tags: ["eternities", "rewards", "automation", "midgame"],
tab: "eternity/milestones"
}, {
name: "Time Dimensions",
info: () => `
After your first Eternity, you unlock Time Dimensions. You buy them with Eternity Points and they produce Time Shards,
which provide Tickspeed Upgrades. These Tickspeed Upgrades function like normal Tickspeed Upgrades but do not increase
their cost. Time Dimensions, Time Shards, and the Tickspeed Upgrades they provide are kept on Infinity,
but reset every Eternity.
<br>
<br>
Similarly to the other dimensions, Second Time Dimensions produce 1st Time Dimensions and so on. Similarly to Infinity
Dimensions, your production will be reset to the amount you purchased after every Eternity, but you will keep any
upgrades to your multipliers you purchased.
<br>
<br>
Each purchase increases the multiplier of that specific Time Dimension by ${formatX(4)}. The cost multiplier between
upgrades has a base value, but is increased by ${formatX(1.5, 1, 1)} at
${format(TimeDimension(1)._costIncreaseThresholds[0], 2)} EP and ${formatX(2.2, 1, 1)} (of the base value) at
${format(TimeDimension(1)._costIncreaseThresholds[1])} EP. These increases apply retroactively, causing the cost to
jump when they reach those thresholds, and only apply to the first four dimensions. Beyond
${format(TimeDimension(1)._costIncreaseThresholds[2])} EP each dimension purchase counts as four purchases for the
purpose of cost increases, causing the price to rise much more steeply.
<br>
<b>Time Dimension base prices (EP):</b> ${Array.range(1, 8)
.map(tier => format(TimeDimension(tier)._baseCost))
.join(", ")}
<br>
<b>Time Dimension base price increases:</b> ${Array.range(1, 8)
.map(tier => format(TimeDimension(tier)._costMultiplier))
.join(", ")}
<br>
<br>
Each threshold to gain another Tickspeed Upgrade is ${formatPercents(0.33)} more Time Shards than the previous,
or ${formatPercents(0.25)} with the relevant Time Study. After ${formatInt(FreeTickspeed.softcap)} upgrades, the
multiplier between each successive free Tickspeed Upgrade will gradually increase at a rate of ~${formatX(1.35, 0, 2)}
per ${formatInt(50000)} upgrades (${formatX(1.000006, 0, 6)} per upgrade).
`,
isUnlocked: () => PlayerProgress.eternityUnlocked(),
tags: ["dims", "td", "shards", "eternity", "midgame"],
tab: "dimensions/time"
}, {
name: "Time Studies",
info: () => `
A Time Study is a powerful post-Eternity upgrade, which costs a new resource called Time Theorems. Time Studies can
boost the production of anything you have seen so far in the game, or even change the way some formulas work.
<br>
<br>
Time Theorems are a limited resource which costs more for each one you buy. They can be bought with antimatter,
Infinity Points, or Eternity Points. Their cost increases by a set factor per purchase. Time Theorems do not
reset on Eternity.
<br>
<br>
Studies are laid out in a tree-like fashion, where you must buy prerequisites before continuing. The only study you
can buy at first is the very top one, and then from there you can purchase any study directly below it which you can
afford. However, there are three exceptions:
<br>
Where the lines between studies have a color, you can only choose one of the three paths at a time.
<br>
When a study for an Eternity Challenge is in the way, you need to complete all challenges connected to it at least
once in order to access the study. You do not need to have the challenge study purchased in order to access it.
<br>
Near the bottom, where all the edges join together again, you can only pick one study out of each pair.
<br>
<br>
You are able to hold down shift and then click on a Time Study to buy all studies until that point. This might not buy
the studies you want if you shift-click a study in a position where you would have to choose between two or more
different options which you cannot get together (see above), or you cannot afford all the studies needed to reach that
point. Shift-click will buy studies greedily, getting as many as possible per row before moving farther downward.
<br>
<br>
<b>Presets:</b> The buttons initially labeled 1 through 6 allow you to save your current set of studies into the slot,
letting you quickly buy that particular set of studies again with a single click. You can hover over the button and
use the tooltip to load/save a slot, or click to load and shift-click to save. These presets can be renamed, but you
are not allowed to give multiple presets the same name.
<br>
<br>
<b>Import Tree/Edit Preset:</b> When editing a preset or importing a Time Study Tree, the modal will display what
Time Studies will be bought when it is loaded, along with any errors.
For the split paths, you can use the name as a shorthand for the collection of studies.
For instance, you can replace "71, 81, 91, 101" to represent fully purchasing the antimatter split with
just "antimatter". Additionally, if a Time Study string has a valid Eternity Challenge, adding a "!" to the end of
the string will make the game to try to immediately unlock and enter the Eternity Challenge when used.
<br>
<br>
<b>Preferences:</b> Clicking the gear icon will open up a dialog which lets you select "default" paths to pick in the
three-way branches. Choosing a default will change the shift-click behavior mentioned above so that it will attempt
to buy your preferred path and continue on instead of stopping completely at the tree splits. You can choose two paths
for the Dimension split in this dialog if you have purchased the relevant Time Study.
<br>
<br>
<b>Respecs:</b> A respec allows you to reset the upgrades you have in the tree to retrieve all of the Time Theorems
spent on them. It can be done for free, but only triggers on finishing an Eternity; you cannot respec Time Studies in
the middle of an Eternity.
<br>
<br>
<b>Costs for Time Theorems:</b>
<br>
<b>Antimatter:</b> Initially ${format(DC.E20000)}, ${formatX(DC.E20000)} per Theorem
<br>
<b>Infinity Points:</b> Initially ${formatInt(1)}, ${formatX(DC.E100)} per Theorem
<br>
<b>Eternity Points:</b> Initially ${formatInt(1)}, ${formatX(2)} per Theorem
`,
isUnlocked: () => PlayerProgress.eternityUnlocked(),
tags: ["eternity", "ts", "theorems", "tree", "study", "midgame"],
tab: "eternity/studies"
}, {
name: "Eternity Challenges",
info: () => `
Eternity Challenges are another set of challenges which are unlocked by the Time Study Tree. They require a certain
amount of Time Theorems and a secondary requirement which you must meet when you unlock the challenge.
<br>
<br>
When you enter an Eternity Challenge, your goal becomes reaching a certain target IP. After completing the challenge,
you do not need to have the Eternity Challenge's study unlocked for the reward to take effect. The rewards for these
challenges are similar to Time Studies, but often even stronger and permanent since they do not require you to spend
Time Theorems to have their effects.
<br>
<br>
You can only have one Eternity Challenge unlocked at a time.
<br>
<br>
You can complete each Eternity Challenge up to five times. After each completion, the rewards grow stronger but the
goal to the next completion also increases. Additionally, the secondary requirement to unlock the challenge again will
also increase. The Time Theorem cost does not increase.
<br>
<br>
Completing an Eternity Challenge's secondary requirements will remove them from the study requirement until you complete
that particular Eternity Challenge, meaning you only need to complete the secondary requirement <i>once</i>.
As a result, you can unlock an Eternity Challenge with one set of studies, and then respec into a different set of
studies to beat the challenge. EC11 and EC12 are exceptions to this rule - the Dimension path restrictions remain even
if you respec your time studies.
`,
isUnlocked: () => PlayerProgress.eternityUnlocked(),
tags: ["ec", "study", "time", "rewards", "completions", "midgame"],
tab: "challenges/eternity"
}, {
name: "Time Dilation",
info: () => `
Time Dilation is unlocked when you purchase the Time Study to unlock it below the EC11 and EC12 studies.
In order to purchase this Time Study, you need ${formatInt(5000)} unspent TT with a tree that can reach
the study, a <i>total</i> of ${formatInt(TimeStudy.dilation.totalTimeTheoremRequirement)} TT, and must have
completed both EC11 and EC12 five times each.
<br>
<br>
Dilating time will start a modified Eternity, called Time Dilation, in which all of your Antimatter/Infinity/Time
Dimension multipliers’ <i>exponents</i> and the tickspeed multipliers’ <i>exponent</i> will be raised to
${formatPow(0.75, 2, 2)}, significantly reducing them. If you can reach ${formatPostBreak(Number.MAX_VALUE, 2)} IP
to complete this Dilated Eternity, you will be rewarded with a new resource called Tachyon Particles.
<br>
<br>
You can Dilate as many times as you want, but Tachyon Particles cannot be "farmed" like other resources. Tachyon
Particles are never reduced, only increased, and they are increased up to a cap based on your TP multipliers and
antimatter earned in the current Dilation. As a result, you generally cannot increase your TP unless
you have gained a TP multiplier or are able to significantly increase your antimatter in Dilation.
<br>
<br>
Tachyon Particles generate another currency called Dilated Time. Dilated Time is translated into Tachyon Galaxies by
reaching thresholds similarly to the Tickspeed Upgrades gained from Time Dimensions. These Tachyon Galaxies are like
Replicanti Galaxies in that they affect tickspeed as if they were Antimatter Galaxies but they do not increase the cost
of your next Antimatter Galaxy.
<br>
<br>
Unlocking Time Dilation also unlocks upgrades you can purchase using Dilated Time. The first and third upgrades in the
first row of Dilation Upgrades can be repeatedly purchased as many times as you can afford them. The second upgrade can
also be repeatedly bought, but eventually reaches a cap.
`,
isUnlocked: () => DilationTimeStudyState.studies[1].isBought || PlayerProgress.realityUnlocked(),
tags: ["dial", "dt", "dilated", "tachyon", "particle", "study", "free", "galaxy", "galaxies", "midgame"],
tab: "eternity/dilation"
}, {
name: "Reality",
info: () => `
When you reach ${formatPostBreak(DC.E4000)} EP and have completed the first
${formatInt(13)} rows of Achievements, you will be able to purchase the Time Study that unlocks Reality.
Unlocking it opens a new tab, where you can find the button to make a new Reality. Starting a new Reality
will reset almost the entire game up to this point, but in exchange gives
you a new currency known as Reality Machines, a Glyph, and a Perk Point.
<br>
<br>
Unlike the other resets so far, you also lose the first ${formatInt(13)} rows of Achievements - that is, all of the
pre-Reality Achievements and all of their associated rewards. However, you will still keep all values under the General
header in the Statistics tab and all of your best Challenge times.
<br>
<br>
After completing your first Reality, the Glyphs tab contain a button which lets you restart your current Reality again,
without changing what your upcoming Glyph choices are. <b>Note that this will not give you any rewards, even if you
would otherwise be able to complete the Reality normally.</b>
<br>
<br>
You need to redo the requirements for each Achievement in order to get their rewards again, but you will also passively
unlock the next incomplete Achievement every ${timeDisplayNoDecimals(30 * 60000)} without any effort even if you
otherwise do not have the requirements to do so. This automatic completion can be disabled, in which case the timer will
count down to zero and pause, immediately completing another Achievement when unpaused. The timer still progresses
at the same rate while offline.
<br>
<br>
Reality Machines can be spent on different upgrades throughout the Reality tab and are your primary currency from this
point onwards. Glyphs are equippable objects which you must equip in order to use their boosts. Perk Points are another
currency that can be spent in the Perks subtab on different Perks.
<br>
<br>
Reality Machines scale purely off of EP, and the Reality button will tell you how much EP you need in order to gain
the next one. The first ${formatInt(10)} RM scale linearly in the exponent between
${formatPostBreak(DC.E4000)} EP and ${formatPostBreak(DC.C10P16000D3)} EP, and then past that
RM = ${formatInt(1000)}<sup>log<sub>${formatInt(10)}</sub>(EP)/${formatInt(4000)}-${formatInt(1)}</sup>. This formula
is higher RM gain than linear above ${formatPostBreak(DC.C10P16000D3)} EP.
<br>
<br>
Glyph level scales off of a combination of Eternity Points, Replicanti, and Dilated Time, with a minimum level of
${formatInt(1)}. The type, effects, and rarity of Glyphs are randomized.
<br>
<br>
You get exactly ${formatInt(1)} Perk Point per Reality.
<br>
<br>
<b>Hotkey: Y</b> will try to perform a Reality reset.
`,
isUnlocked: () => PlayerProgress.realityUnlocked() || TimeStudy.reality.isBought,
tags: ["rm", "machines", "glyph", "perk", "reset", "prestige", "endgame", "lategame"],
tab: "reality/upgrades"
}, {
name: "Glyphs",
info: () => `
A Glyph is an equippable object that has four attributes:
<br>
<b>Type</b> - This is a name given to the Glyph based on what part of the game it will tend to boost
(eg. "Glyph of X"). This determines the possible effects it may have.
<br>
<b>Level</b> - This contributes to how strong your Glyph is, and it scales based how much of various
resources you obtained in the Reality you gained it from.
<br>
<b>Rarity</b> - This is a percentage, between ${formatPercents(0)} and ${formatPercents(1)}, which also
affects the strength of your Glyph. This is random, but can be influenced by various upgrades.
The percentage is effectively a quality
rating, higher values are better. Specific ranges of rarities are given names, such as Common or Uncommon.
<br>
<b>Effects</b> - These are the boosts that equipping the Glyph will give you, and can contain up to four effects.
Glyphs with higher level or rarity will generally have more effects than weaker Glyphs.
<br>
<b>Note: Your first Glyph will have a fixed effect and rarity, but its level will scale based on your progress before
any Reality content. Once you receive a Glyph, its attributes cannot be changed.</b>
<br>
<br>
To equip a Glyph, double-click or drag the icon from your inventory into one of the active circles in the middle
of the screen. When equipped, Glyph icons become circular and add their effects to the list on the right.
<br>
<br>
Equipping multiple Glyphs with the same effect will combine their effects; effects with "+" will generally add
their values together and effects with "×" will generally multiply their values together.
<br>
<br>
You can equip Glyphs into <i>empty</i> active slots at any time during a Reality, which will immediately apply the
effects of the new Glyph. You can also drag Glyphs into already-occupied slots to switch which ones you have equipped,
but this will restart your current Reality.
<br>
<br>
The slots in the first rows of your inventory are "protected" slots. New Glyphs will never be placed into them (even if
there is no more room in your inventory), and they are unaffected by the Sort and Auto clean buttons. If you run out of
space for new Glyphs in your inventory, any Glyphs you would receive will be automatically deleted (or sacrificed
if unlocked).
<br>
<br>
You can delete Glyphs from your inventory by shift-clicking them, which will prompt you with a confirmation dialog
asking if you are sure you want to delete the Glyph. Holding shift and ctrl together while clicking will bypass this
dialog. <b>However, deleting Glyphs will give you no benefit beyond clearing up inventory space if you do so before
unlocking Glyph Sacrifice from a Reality Upgrade!</b>
<br>
<br>
Once you unlock Glyph Sacrifice, you will be able to disable the Glyph Selection modal from appearing. If desired, you
can force the modal to appear again for this Reality (ignoring this setting) by shift-clicking the Reality button.
Completing a Reality with the selection modal disabled will choose a random Glyph from your options.
<br>
<br>
Clicking a group of circular Glyphs outside of a modal window will open up a modal which displays a detailed summary
of all those Glyphs and their various attributes. The summary will show the information for all Glyphs at once with
slightly shorter descriptions, making it more suitable for sharing with others. This can be done for Glyph records
in the Statistics page, your equipped Glyphs, and the Upcoming Glyph Selection this Reality.
`,
isUnlocked: () => PlayerProgress.realityUnlocked() || TimeStudy.reality.isBought,
tags: ["reality", "sacrifice", "level", "endgame", "lategame"],
tab: "reality/glyphs"
}, {
name: "Perks",
info: () => `
Perks are a type of upgrade unlocked upon Reality. Each Perk effect varies, but most are QoL (quality of life)