fix: rewrite prestige/transcendence formula and rebalance progression
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m8s
CI / Lint, Build & Test (pull_request) Successful in 1m11s

This commit is contained in:
2026-03-24 20:44:25 -07:00
committed by Naomi Carrigan
parent 0d6d05e50b
commit 0ae6aa12b2
7 changed files with 98 additions and 88 deletions
+54 -54
View File
@@ -353,7 +353,7 @@ export const defaultBosses: Array<Boss> = [
id: "seraph_guardian", id: "seraph_guardian",
maxHp: 500_000_000, maxHp: 500_000_000,
name: "The Seraph Guardian", name: "The Seraph Guardian",
prestigeRequirement: 6, prestigeRequirement: 1,
status: "locked", status: "locked",
upgradeRewards: [ "click_4" ], upgradeRewards: [ "click_4" ],
zoneId: "celestial_reaches", zoneId: "celestial_reaches",
@@ -371,7 +371,7 @@ export const defaultBosses: Array<Boss> = [
id: "fallen_archangel", id: "fallen_archangel",
maxHp: 2_000_000_000, maxHp: 2_000_000_000,
name: "The Fallen Archangel", name: "The Fallen Archangel",
prestigeRequirement: 7, prestigeRequirement: 2,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "celestial_reaches", zoneId: "celestial_reaches",
@@ -389,7 +389,7 @@ export const defaultBosses: Array<Boss> = [
id: "divine_judge", id: "divine_judge",
maxHp: 8_000_000_000, maxHp: 8_000_000_000,
name: "The Divine Judge", name: "The Divine Judge",
prestigeRequirement: 8, prestigeRequirement: 2,
status: "locked", status: "locked",
upgradeRewards: [ "divine_covenant" ], upgradeRewards: [ "divine_covenant" ],
zoneId: "celestial_reaches", zoneId: "celestial_reaches",
@@ -407,7 +407,7 @@ export const defaultBosses: Array<Boss> = [
id: "celestial_titan", id: "celestial_titan",
maxHp: 30_000_000_000, maxHp: 30_000_000_000,
name: "The Celestial Titan", name: "The Celestial Titan",
prestigeRequirement: 9, prestigeRequirement: 2,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "celestial_reaches", zoneId: "celestial_reaches",
@@ -425,7 +425,7 @@ export const defaultBosses: Array<Boss> = [
id: "the_first_light", id: "the_first_light",
maxHp: 100_000_000_000, maxHp: 100_000_000_000,
name: "The First Light", name: "The First Light",
prestigeRequirement: 10, prestigeRequirement: 2,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "celestial_reaches", zoneId: "celestial_reaches",
@@ -444,7 +444,7 @@ export const defaultBosses: Array<Boss> = [
id: "depth_leviathan", id: "depth_leviathan",
maxHp: 250_000_000_000, maxHp: 250_000_000_000,
name: "The Depth Leviathan", name: "The Depth Leviathan",
prestigeRequirement: 9, prestigeRequirement: 2,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "abyssal_trench", zoneId: "abyssal_trench",
@@ -462,7 +462,7 @@ export const defaultBosses: Array<Boss> = [
id: "kraken_elder", id: "kraken_elder",
maxHp: 1_000_000_000_000, maxHp: 1_000_000_000_000,
name: "The Elder Kraken", name: "The Elder Kraken",
prestigeRequirement: 10, prestigeRequirement: 2,
status: "locked", status: "locked",
upgradeRewards: [ "abyssal_pact" ], upgradeRewards: [ "abyssal_pact" ],
zoneId: "abyssal_trench", zoneId: "abyssal_trench",
@@ -480,7 +480,7 @@ export const defaultBosses: Array<Boss> = [
id: "abyssal_colossus", id: "abyssal_colossus",
maxHp: 4_000_000_000_000, maxHp: 4_000_000_000_000,
name: "The Abyssal Colossus", name: "The Abyssal Colossus",
prestigeRequirement: 11, prestigeRequirement: 2,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "abyssal_trench", zoneId: "abyssal_trench",
@@ -498,7 +498,7 @@ export const defaultBosses: Array<Boss> = [
id: "the_deep_one", id: "the_deep_one",
maxHp: 15_000_000_000_000, maxHp: 15_000_000_000_000,
name: "The Deep One", name: "The Deep One",
prestigeRequirement: 12, prestigeRequirement: 3,
status: "locked", status: "locked",
upgradeRewards: [ "global_4" ], upgradeRewards: [ "global_4" ],
zoneId: "abyssal_trench", zoneId: "abyssal_trench",
@@ -516,7 +516,7 @@ export const defaultBosses: Array<Boss> = [
id: "elder_abomination", id: "elder_abomination",
maxHp: 50_000_000_000_000, maxHp: 50_000_000_000_000,
name: "The Elder Abomination", name: "The Elder Abomination",
prestigeRequirement: 13, prestigeRequirement: 3,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "abyssal_trench", zoneId: "abyssal_trench",
@@ -535,7 +535,7 @@ export const defaultBosses: Array<Boss> = [
id: "demon_prince", id: "demon_prince",
maxHp: 120_000_000_000_000, maxHp: 120_000_000_000_000,
name: "The Demon Prince", name: "The Demon Prince",
prestigeRequirement: 12, prestigeRequirement: 3,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "infernal_court", zoneId: "infernal_court",
@@ -553,7 +553,7 @@ export const defaultBosses: Array<Boss> = [
id: "hellfire_titan", id: "hellfire_titan",
maxHp: 500_000_000_000_000, maxHp: 500_000_000_000_000,
name: "The Hellfire Titan", name: "The Hellfire Titan",
prestigeRequirement: 13, prestigeRequirement: 3,
status: "locked", status: "locked",
upgradeRewards: [ "celestial_mandate" ], upgradeRewards: [ "celestial_mandate" ],
zoneId: "infernal_court", zoneId: "infernal_court",
@@ -571,7 +571,7 @@ export const defaultBosses: Array<Boss> = [
id: "lord_of_sin", id: "lord_of_sin",
maxHp: 2_000_000_000_000_000, maxHp: 2_000_000_000_000_000,
name: "The Lord of Sin", name: "The Lord of Sin",
prestigeRequirement: 14, prestigeRequirement: 3,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "infernal_court", zoneId: "infernal_court",
@@ -589,7 +589,7 @@ export const defaultBosses: Array<Boss> = [
id: "infernal_sovereign", id: "infernal_sovereign",
maxHp: 6_000_000_000_000_000, maxHp: 6_000_000_000_000_000,
name: "The Infernal Sovereign", name: "The Infernal Sovereign",
prestigeRequirement: 15, prestigeRequirement: 3,
status: "locked", status: "locked",
upgradeRewards: [ "click_5" ], upgradeRewards: [ "click_5" ],
zoneId: "infernal_court", zoneId: "infernal_court",
@@ -607,7 +607,7 @@ export const defaultBosses: Array<Boss> = [
id: "the_fallen", id: "the_fallen",
maxHp: 8_000_000_000_000_000, maxHp: 8_000_000_000_000_000,
name: "The Fallen", name: "The Fallen",
prestigeRequirement: 16, prestigeRequirement: 4,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "infernal_court", zoneId: "infernal_court",
@@ -626,7 +626,7 @@ export const defaultBosses: Array<Boss> = [
id: "prism_golem", id: "prism_golem",
maxHp: 2e16, maxHp: 2e16,
name: "The Prism Golem", name: "The Prism Golem",
prestigeRequirement: 15, prestigeRequirement: 3,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "crystalline_spire", zoneId: "crystalline_spire",
@@ -644,7 +644,7 @@ export const defaultBosses: Array<Boss> = [
id: "crystal_drake", id: "crystal_drake",
maxHp: 8e16, maxHp: 8e16,
name: "The Crystal Drake", name: "The Crystal Drake",
prestigeRequirement: 16, prestigeRequirement: 4,
status: "locked", status: "locked",
upgradeRewards: [ "void_ascendancy" ], upgradeRewards: [ "void_ascendancy" ],
zoneId: "crystalline_spire", zoneId: "crystalline_spire",
@@ -662,7 +662,7 @@ export const defaultBosses: Array<Boss> = [
id: "the_faceted", id: "the_faceted",
maxHp: 3e17, maxHp: 3e17,
name: "The Faceted", name: "The Faceted",
prestigeRequirement: 17, prestigeRequirement: 4,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "crystalline_spire", zoneId: "crystalline_spire",
@@ -680,7 +680,7 @@ export const defaultBosses: Array<Boss> = [
id: "diamond_colossus", id: "diamond_colossus",
maxHp: 1e18, maxHp: 1e18,
name: "The Diamond Colossus", name: "The Diamond Colossus",
prestigeRequirement: 18, prestigeRequirement: 4,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "crystalline_spire", zoneId: "crystalline_spire",
@@ -698,7 +698,7 @@ export const defaultBosses: Array<Boss> = [
id: "crystal_sovereign", id: "crystal_sovereign",
maxHp: 4e18, maxHp: 4e18,
name: "The Crystal Sovereign", name: "The Crystal Sovereign",
prestigeRequirement: 19, prestigeRequirement: 4,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "crystalline_spire", zoneId: "crystalline_spire",
@@ -717,7 +717,7 @@ export const defaultBosses: Array<Boss> = [
id: "void_herald", id: "void_herald",
maxHp: 1e19, maxHp: 1e19,
name: "The Void Herald", name: "The Void Herald",
prestigeRequirement: 18, prestigeRequirement: 4,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "void_sanctum", zoneId: "void_sanctum",
@@ -735,7 +735,7 @@ export const defaultBosses: Array<Boss> = [
id: "eternal_shade", id: "eternal_shade",
maxHp: 5e19, maxHp: 5e19,
name: "The Eternal Shade", name: "The Eternal Shade",
prestigeRequirement: 19, prestigeRequirement: 4,
status: "locked", status: "locked",
upgradeRewards: [ "divine_harmony" ], upgradeRewards: [ "divine_harmony" ],
zoneId: "void_sanctum", zoneId: "void_sanctum",
@@ -753,7 +753,7 @@ export const defaultBosses: Array<Boss> = [
id: "the_unmaker", id: "the_unmaker",
maxHp: 2e20, maxHp: 2e20,
name: "The Unmaker", name: "The Unmaker",
prestigeRequirement: 20, prestigeRequirement: 5,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "void_sanctum", zoneId: "void_sanctum",
@@ -771,7 +771,7 @@ export const defaultBosses: Array<Boss> = [
id: "void_progenitor", id: "void_progenitor",
maxHp: 8e20, maxHp: 8e20,
name: "The Void Progenitor", name: "The Void Progenitor",
prestigeRequirement: 21, prestigeRequirement: 5,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "void_sanctum", zoneId: "void_sanctum",
@@ -789,7 +789,7 @@ export const defaultBosses: Array<Boss> = [
id: "void_emperor", id: "void_emperor",
maxHp: 3e21, maxHp: 3e21,
name: "The Void Emperor", name: "The Void Emperor",
prestigeRequirement: 22, prestigeRequirement: 5,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "void_sanctum", zoneId: "void_sanctum",
@@ -808,7 +808,7 @@ export const defaultBosses: Array<Boss> = [
id: "throne_warden", id: "throne_warden",
maxHp: 1e22, maxHp: 1e22,
name: "The Throne Warden", name: "The Throne Warden",
prestigeRequirement: 21, prestigeRequirement: 5,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "eternal_throne", zoneId: "eternal_throne",
@@ -826,7 +826,7 @@ export const defaultBosses: Array<Boss> = [
id: "eternal_knight", id: "eternal_knight",
maxHp: 5e22, maxHp: 5e22,
name: "The Eternal Knight", name: "The Eternal Knight",
prestigeRequirement: 22, prestigeRequirement: 5,
status: "locked", status: "locked",
upgradeRewards: [ "infernal_fury" ], upgradeRewards: [ "infernal_fury" ],
zoneId: "eternal_throne", zoneId: "eternal_throne",
@@ -844,7 +844,7 @@ export const defaultBosses: Array<Boss> = [
id: "the_undying", id: "the_undying",
maxHp: 2e23, maxHp: 2e23,
name: "The Undying", name: "The Undying",
prestigeRequirement: 23, prestigeRequirement: 5,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "eternal_throne", zoneId: "eternal_throne",
@@ -862,7 +862,7 @@ export const defaultBosses: Array<Boss> = [
id: "apex_sovereign", id: "apex_sovereign",
maxHp: 8e23, maxHp: 8e23,
name: "The Apex Sovereign", name: "The Apex Sovereign",
prestigeRequirement: 24, prestigeRequirement: 5,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "eternal_throne", zoneId: "eternal_throne",
@@ -880,7 +880,7 @@ export const defaultBosses: Array<Boss> = [
id: "the_apex", id: "the_apex",
maxHp: 3e24, maxHp: 3e24,
name: "The Apex", name: "The Apex",
prestigeRequirement: 25, prestigeRequirement: 6,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "eternal_throne", zoneId: "eternal_throne",
@@ -899,7 +899,7 @@ export const defaultBosses: Array<Boss> = [
id: "chaos_wyrm", id: "chaos_wyrm",
maxHp: 1e26, maxHp: 1e26,
name: "The Chaos Wyrm", name: "The Chaos Wyrm",
prestigeRequirement: 26, prestigeRequirement: 6,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "primordial_chaos", zoneId: "primordial_chaos",
@@ -917,7 +917,7 @@ export const defaultBosses: Array<Boss> = [
id: "creation_engine", id: "creation_engine",
maxHp: 5e27, maxHp: 5e27,
name: "The Creation Engine", name: "The Creation Engine",
prestigeRequirement: 27, prestigeRequirement: 6,
status: "locked", status: "locked",
upgradeRewards: [ "aether_weaver_1" ], upgradeRewards: [ "aether_weaver_1" ],
zoneId: "primordial_chaos", zoneId: "primordial_chaos",
@@ -935,7 +935,7 @@ export const defaultBosses: Array<Boss> = [
id: "entropy_avatar", id: "entropy_avatar",
maxHp: 2e29, maxHp: 2e29,
name: "The Entropy Avatar", name: "The Entropy Avatar",
prestigeRequirement: 29, prestigeRequirement: 7,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "primordial_chaos", zoneId: "primordial_chaos",
@@ -953,7 +953,7 @@ export const defaultBosses: Array<Boss> = [
id: "primordial_titan", id: "primordial_titan",
maxHp: 8e30, maxHp: 8e30,
name: "The Primordial Titan", name: "The Primordial Titan",
prestigeRequirement: 31, prestigeRequirement: 7,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "primordial_chaos", zoneId: "primordial_chaos",
@@ -972,7 +972,7 @@ export const defaultBosses: Array<Boss> = [
id: "expanse_drifter", id: "expanse_drifter",
maxHp: 3e33, maxHp: 3e33,
name: "The Expanse Drifter", name: "The Expanse Drifter",
prestigeRequirement: 33, prestigeRequirement: 8,
status: "locked", status: "locked",
upgradeRewards: [ "titan_warrior_1" ], upgradeRewards: [ "titan_warrior_1" ],
zoneId: "infinite_expanse", zoneId: "infinite_expanse",
@@ -990,7 +990,7 @@ export const defaultBosses: Array<Boss> = [
id: "horizon_beast", id: "horizon_beast",
maxHp: 1e37, maxHp: 1e37,
name: "The Horizon Beast", name: "The Horizon Beast",
prestigeRequirement: 35, prestigeRequirement: 8,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "infinite_expanse", zoneId: "infinite_expanse",
@@ -1008,7 +1008,7 @@ export const defaultBosses: Array<Boss> = [
id: "infinity_construct", id: "infinity_construct",
maxHp: 5e40, maxHp: 5e40,
name: "The Infinity Construct", name: "The Infinity Construct",
prestigeRequirement: 37, prestigeRequirement: 8,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "infinite_expanse", zoneId: "infinite_expanse",
@@ -1026,7 +1026,7 @@ export const defaultBosses: Array<Boss> = [
id: "expanse_sovereign", id: "expanse_sovereign",
maxHp: 2e44, maxHp: 2e44,
name: "The Expanse Sovereign", name: "The Expanse Sovereign",
prestigeRequirement: 39, prestigeRequirement: 9,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "infinite_expanse", zoneId: "infinite_expanse",
@@ -1045,7 +1045,7 @@ export const defaultBosses: Array<Boss> = [
id: "forge_guardian", id: "forge_guardian",
maxHp: 8e47, maxHp: 8e47,
name: "The Forge Guardian", name: "The Forge Guardian",
prestigeRequirement: 41, prestigeRequirement: 9,
status: "locked", status: "locked",
upgradeRewards: [ "nexus_sage_1" ], upgradeRewards: [ "nexus_sage_1" ],
zoneId: "reality_forge", zoneId: "reality_forge",
@@ -1063,7 +1063,7 @@ export const defaultBosses: Array<Boss> = [
id: "reality_shaper", id: "reality_shaper",
maxHp: 4e52, maxHp: 4e52,
name: "The Reality Shaper", name: "The Reality Shaper",
prestigeRequirement: 44, prestigeRequirement: 10,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "reality_forge", zoneId: "reality_forge",
@@ -1081,7 +1081,7 @@ export const defaultBosses: Array<Boss> = [
id: "creation_prime", id: "creation_prime",
maxHp: 2e57, maxHp: 2e57,
name: "The Creation Prime", name: "The Creation Prime",
prestigeRequirement: 47, prestigeRequirement: 11,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "reality_forge", zoneId: "reality_forge",
@@ -1099,7 +1099,7 @@ export const defaultBosses: Array<Boss> = [
id: "reality_architect", id: "reality_architect",
maxHp: 8e61, maxHp: 8e61,
name: "The Reality Architect", name: "The Reality Architect",
prestigeRequirement: 49, prestigeRequirement: 11,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "reality_forge", zoneId: "reality_forge",
@@ -1118,7 +1118,7 @@ export const defaultBosses: Array<Boss> = [
id: "storm_colossus", id: "storm_colossus",
maxHp: 4e65, maxHp: 4e65,
name: "The Storm Colossus", name: "The Storm Colossus",
prestigeRequirement: 51, prestigeRequirement: 12,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "cosmic_maelstrom", zoneId: "cosmic_maelstrom",
@@ -1136,7 +1136,7 @@ export const defaultBosses: Array<Boss> = [
id: "force_prime", id: "force_prime",
maxHp: 2e71, maxHp: 2e71,
name: "The Force Prime", name: "The Force Prime",
prestigeRequirement: 54, prestigeRequirement: 12,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "cosmic_maelstrom", zoneId: "cosmic_maelstrom",
@@ -1154,7 +1154,7 @@ export const defaultBosses: Array<Boss> = [
id: "maelstrom_god", id: "maelstrom_god",
maxHp: 1e77, maxHp: 1e77,
name: "The Maelstrom God", name: "The Maelstrom God",
prestigeRequirement: 57, prestigeRequirement: 13,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "cosmic_maelstrom", zoneId: "cosmic_maelstrom",
@@ -1172,7 +1172,7 @@ export const defaultBosses: Array<Boss> = [
id: "cosmic_annihilator", id: "cosmic_annihilator",
maxHp: 5e82, maxHp: 5e82,
name: "The Cosmic Annihilator", name: "The Cosmic Annihilator",
prestigeRequirement: 59, prestigeRequirement: 13,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "cosmic_maelstrom", zoneId: "cosmic_maelstrom",
@@ -1191,7 +1191,7 @@ export const defaultBosses: Array<Boss> = [
id: "ancient_sentinel", id: "ancient_sentinel",
maxHp: 2e88, maxHp: 2e88,
name: "The Ancient Sentinel", name: "The Ancient Sentinel",
prestigeRequirement: 61, prestigeRequirement: 14,
status: "locked", status: "locked",
upgradeRewards: [ "astral_sovereign_1" ], upgradeRewards: [ "astral_sovereign_1" ],
zoneId: "primeval_sanctum", zoneId: "primeval_sanctum",
@@ -1209,7 +1209,7 @@ export const defaultBosses: Array<Boss> = [
id: "time_elder", id: "time_elder",
maxHp: 1e95, maxHp: 1e95,
name: "The Time Elder", name: "The Time Elder",
prestigeRequirement: 65, prestigeRequirement: 15,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "primeval_sanctum", zoneId: "primeval_sanctum",
@@ -1227,7 +1227,7 @@ export const defaultBosses: Array<Boss> = [
id: "origin_beast", id: "origin_beast",
maxHp: 8e101, maxHp: 8e101,
name: "The Origin Beast", name: "The Origin Beast",
prestigeRequirement: 69, prestigeRequirement: 16,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "primeval_sanctum", zoneId: "primeval_sanctum",
@@ -1245,7 +1245,7 @@ export const defaultBosses: Array<Boss> = [
id: "primeval_god", id: "primeval_god",
maxHp: 5e108, maxHp: 5e108,
name: "The Primeval God", name: "The Primeval God",
prestigeRequirement: 74, prestigeRequirement: 17,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "primeval_sanctum", zoneId: "primeval_sanctum",
@@ -1264,7 +1264,7 @@ export const defaultBosses: Array<Boss> = [
id: "absolute_herald", id: "absolute_herald",
maxHp: 2e116, maxHp: 2e116,
name: "The Absolute Herald", name: "The Absolute Herald",
prestigeRequirement: 76, prestigeRequirement: 17,
status: "locked", status: "locked",
upgradeRewards: [ "primordial_mage_1" ], upgradeRewards: [ "primordial_mage_1" ],
zoneId: "the_absolute", zoneId: "the_absolute",
@@ -1282,7 +1282,7 @@ export const defaultBosses: Array<Boss> = [
id: "void_convergence", id: "void_convergence",
maxHp: 1e125, maxHp: 1e125,
name: "The Void Convergence", name: "The Void Convergence",
prestigeRequirement: 79, prestigeRequirement: 18,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "the_absolute", zoneId: "the_absolute",
@@ -1300,7 +1300,7 @@ export const defaultBosses: Array<Boss> = [
id: "eternal_end", id: "eternal_end",
maxHp: 5e134, maxHp: 5e134,
name: "The Eternal End", name: "The Eternal End",
prestigeRequirement: 83, prestigeRequirement: 19,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "the_absolute", zoneId: "the_absolute",
@@ -1318,7 +1318,7 @@ export const defaultBosses: Array<Boss> = [
id: "the_absolute_one", id: "the_absolute_one",
maxHp: 2e145, maxHp: 2e145,
name: "The Absolute One", name: "The Absolute One",
prestigeRequirement: 88, prestigeRequirement: 20,
status: "locked", status: "locked",
upgradeRewards: [], upgradeRewards: [],
zoneId: "the_absolute", zoneId: "the_absolute",
+15 -15
View File
@@ -11,7 +11,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
// ── Income multipliers ────────────────────────────────────────────────────── // ── Income multipliers ──────────────────────────────────────────────────────
{ {
category: "income", category: "income",
cost: 5, cost: 2,
description: description:
"The echoes of past runs linger, amplifying your guild's income by 25%.", "The echoes of past runs linger, amplifying your guild's income by 25%.",
id: "echo_income_1", id: "echo_income_1",
@@ -20,7 +20,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "income", category: "income",
cost: 10, cost: 4,
description: description:
"Your transcendent experience resonates through your guild, boosting income by 50%.", "Your transcendent experience resonates through your guild, boosting income by 50%.",
id: "echo_income_2", id: "echo_income_2",
@@ -29,7 +29,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "income", category: "income",
cost: 20, cost: 8,
description: description:
"The harmony of multiple timelines surges through your guild, doubling its income.", "The harmony of multiple timelines surges through your guild, doubling its income.",
id: "echo_income_3", id: "echo_income_3",
@@ -38,7 +38,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "income", category: "income",
cost: 40, cost: 16,
description: description:
"Ethereal energy overflows from your transcendence, tripling your guild's income.", "Ethereal energy overflows from your transcendence, tripling your guild's income.",
id: "echo_income_4", id: "echo_income_4",
@@ -47,7 +47,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "income", category: "income",
cost: 80, cost: 32,
description: description:
"The infinite chorus of every run you've ever played amplifies your guild fivefold.", "The infinite chorus of every run you've ever played amplifies your guild fivefold.",
id: "echo_income_5", id: "echo_income_5",
@@ -58,7 +58,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
// ── Combat multipliers ────────────────────────────────────────────────────── // ── Combat multipliers ──────────────────────────────────────────────────────
{ {
category: "combat", category: "combat",
cost: 5, cost: 2,
description: description:
"Memories of countless battles harden your adventurers, increasing party DPS by 25%.", "Memories of countless battles harden your adventurers, increasing party DPS by 25%.",
id: "echo_combat_1", id: "echo_combat_1",
@@ -67,7 +67,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "combat", category: "combat",
cost: 15, cost: 6,
description: description:
"Veterans of transcendence know how to fight smarter, boosting party DPS by 50%.", "Veterans of transcendence know how to fight smarter, boosting party DPS by 50%.",
id: "echo_combat_2", id: "echo_combat_2",
@@ -76,7 +76,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "combat", category: "combat",
cost: 35, cost: 12,
description: description:
"Your warriors carry the strength of every fallen timeline, doubling party DPS.", "Your warriors carry the strength of every fallen timeline, doubling party DPS.",
id: "echo_combat_3", id: "echo_combat_3",
@@ -87,7 +87,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
// ── Prestige threshold reductions ────────────────────────────────────────── // ── Prestige threshold reductions ──────────────────────────────────────────
{ {
category: "prestige_threshold", category: "prestige_threshold",
cost: 8, cost: 3,
description: description:
"Experience from past lives shortens the road to prestige — threshold reduced by 10%.", "Experience from past lives shortens the road to prestige — threshold reduced by 10%.",
id: "echo_prestige_threshold_1", id: "echo_prestige_threshold_1",
@@ -96,7 +96,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "prestige_threshold", category: "prestige_threshold",
cost: 20, cost: 6,
description: description:
"You've walked this path so many times you know every shortcut — threshold reduced by 20%.", "You've walked this path so many times you know every shortcut — threshold reduced by 20%.",
id: "echo_prestige_threshold_2", id: "echo_prestige_threshold_2",
@@ -107,7 +107,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
// ── Prestige runestone multipliers ───────────────────────────────────────── // ── Prestige runestone multipliers ─────────────────────────────────────────
{ {
category: "prestige_runestones", category: "prestige_runestones",
cost: 8, cost: 3,
description: description:
"Transcendent insight attunes you to the runestones, earning 50% more per prestige.", "Transcendent insight attunes you to the runestones, earning 50% more per prestige.",
id: "echo_prestige_runestones_1", id: "echo_prestige_runestones_1",
@@ -116,7 +116,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "prestige_runestones", category: "prestige_runestones",
cost: 20, cost: 6,
description: description:
"You have mastered the art of runestone crafting, doubling your prestige runestone yield.", "You have mastered the art of runestone crafting, doubling your prestige runestone yield.",
id: "echo_prestige_runestones_2", id: "echo_prestige_runestones_2",
@@ -127,7 +127,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
// ── Echo meta multipliers ─────────────────────────────────────────────────── // ── Echo meta multipliers ───────────────────────────────────────────────────
{ {
category: "echo_meta", category: "echo_meta",
cost: 50, cost: 25,
description: description:
"Your transcendence resonates deeper, amplifying future echo yields by 25%.", "Your transcendence resonates deeper, amplifying future echo yields by 25%.",
id: "echo_meta_1", id: "echo_meta_1",
@@ -136,7 +136,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "echo_meta", category: "echo_meta",
cost: 150, cost: 75,
description: description:
"Each loop of existence makes the next more powerful — future echo yields +50%.", "Each loop of existence makes the next more powerful — future echo yields +50%.",
id: "echo_meta_2", id: "echo_meta_2",
@@ -145,7 +145,7 @@ export const defaultTranscendenceUpgrades: Array<TranscendenceUpgrade> = [
}, },
{ {
category: "echo_meta", category: "echo_meta",
cost: 400, cost: 200,
description: description:
"You have mastered the infinite spiral of transcendence, doubling all future echo yields.", "You have mastered the infinite spiral of transcendence, doubling all future echo yields.",
id: "echo_meta_3", id: "echo_meta_3",
+6 -5
View File
@@ -15,7 +15,6 @@ import type {
} from "@elysium/types"; } from "@elysium/types";
const basePrestigeGoldThreshold = 1_000_000; const basePrestigeGoldThreshold = 1_000_000;
const thresholdScaleFactor = 5;
const runestonesPerPrestigeLevel = 10; const runestonesPerPrestigeLevel = 10;
const milestoneInterval = 5; const milestoneInterval = 5;
const milestoneRunestonesPerInterval = 25; const milestoneRunestonesPerInterval = 25;
@@ -29,7 +28,8 @@ const maxBaseRunestones = 200;
/** /**
* Calculates the gold threshold required for the next prestige. * Calculates the gold threshold required for the next prestige.
* Formula: BASE * SCALE_FACTOR^prestigeCount — each prestige makes the next threshold harder. * Formula: BASE * (count + 1)^2 — polynomial growth that peaks around prestige 810
* then gets easier as the production multiplier overtakes it.
* @param prestigeCount - The current number of prestiges completed. * @param prestigeCount - The current number of prestiges completed.
* @param thresholdMultiplier - An optional echo-upgrade multiplier applied to the threshold. * @param thresholdMultiplier - An optional echo-upgrade multiplier applied to the threshold.
* @returns The gold amount required to prestige. * @returns The gold amount required to prestige.
@@ -40,7 +40,7 @@ const calculatePrestigeThreshold = (
): number => { ): number => {
return ( return (
basePrestigeGoldThreshold basePrestigeGoldThreshold
* Math.pow(thresholdScaleFactor, prestigeCount) * Math.pow(prestigeCount + 1, 2)
* thresholdMultiplier * thresholdMultiplier
); );
}; };
@@ -146,14 +146,15 @@ const calculateRunestones = (parameters: RunestoneParameters): number => {
/** /**
* Calculates the new prestige production multiplier. * Calculates the new prestige production multiplier.
* Formula: 1.15^prestigeCount — exponential scaling per prestige. * Formula: 1.25^prestigeCount — exponential scaling per prestige that eventually
* overtakes the polynomial threshold growth, making late prestiges progressively easier.
* @param prestigeCount - The new prestige count. * @param prestigeCount - The new prestige count.
* @returns The production multiplier for the new prestige level. * @returns The production multiplier for the new prestige level.
*/ */
const calculateProductionMultiplier = ( const calculateProductionMultiplier = (
prestigeCount: number, prestigeCount: number,
): number => { ): number => {
return Math.pow(1.15, prestigeCount); return Math.pow(1.25, prestigeCount);
}; };
/** /**
+1 -1
View File
@@ -20,7 +20,7 @@ const finalBossId = "the_absolute_one";
/** /**
* Base constant used in the echo yield formula. * Base constant used in the echo yield formula.
*/ */
const echoFormulaConstant = 853; const echoFormulaConstant = 224;
const getCategoryMultiplier = ( const getCategoryMultiplier = (
purchasedIds: Array<string>, purchasedIds: Array<string>,
+1 -1
View File
@@ -158,7 +158,7 @@ describe("transcendence route", () => {
const res = await post("/buy-upgrade", { upgradeId: "echo_income_1" }); const res = await post("/buy-upgrade", { upgradeId: "echo_income_1" });
expect(res.status).toBe(200); expect(res.status).toBe(200);
const body = await res.json() as { echoesRemaining: number; purchasedUpgradeIds: string[] }; const body = await res.json() as { echoesRemaining: number; purchasedUpgradeIds: string[] };
expect(body.echoesRemaining).toBe(95); // 100 - 5 expect(body.echoesRemaining).toBe(98); // 100 - 2
expect(body.purchasedUpgradeIds).toContain("echo_income_1"); expect(body.purchasedUpgradeIds).toContain("echo_income_1");
}); });
+10 -7
View File
@@ -55,15 +55,18 @@ const makeMinimalState = (overrides: Partial<GameState> = {}): GameState =>
describe("calculatePrestigeThreshold", () => { describe("calculatePrestigeThreshold", () => {
it("returns base threshold at count 0", () => { it("returns base threshold at count 0", () => {
// base × (0+1)^2 = 1_000_000 × 1 = 1_000_000
expect(calculatePrestigeThreshold(0)).toBe(1_000_000); expect(calculatePrestigeThreshold(0)).toBe(1_000_000);
}); });
it("returns 5× at count 1", () => { it("returns 4× base at count 1", () => {
expect(calculatePrestigeThreshold(1)).toBe(5_000_000); // base × (1+1)^2 = 1_000_000 × 4 = 4_000_000
expect(calculatePrestigeThreshold(1)).toBe(4_000_000);
}); });
it("returns 25× at count 2", () => { it("returns 9× base at count 2", () => {
expect(calculatePrestigeThreshold(2)).toBe(25_000_000); // base × (2+1)^2 = 1_000_000 × 9 = 9_000_000
expect(calculatePrestigeThreshold(2)).toBe(9_000_000);
}); });
it("applies threshold multiplier correctly", () => { it("applies threshold multiplier correctly", () => {
@@ -128,12 +131,12 @@ describe("calculateProductionMultiplier", () => {
expect(calculateProductionMultiplier(0)).toBe(1); expect(calculateProductionMultiplier(0)).toBe(1);
}); });
it("returns 1.15 at count 1", () => { it("returns 1.25 at count 1", () => {
expect(calculateProductionMultiplier(1)).toBeCloseTo(1.15); expect(calculateProductionMultiplier(1)).toBeCloseTo(1.25);
}); });
it("scales exponentially", () => { it("scales exponentially", () => {
expect(calculateProductionMultiplier(10)).toBeCloseTo(Math.pow(1.15, 10)); expect(calculateProductionMultiplier(10)).toBeCloseTo(Math.pow(1.25, 10));
}); });
}); });
+11 -5
View File
@@ -97,20 +97,21 @@ describe("isEligibleForTranscendence", () => {
describe("calculateEchoes", () => { describe("calculateEchoes", () => {
it("handles prestige count of 0 by treating it as 1", () => { it("handles prestige count of 0 by treating it as 1", () => {
// safeCount = max(0, 1) = 1; floor(853 / sqrt(1)) = 853 // safeCount = max(0, 1) = 1; floor(224 / sqrt(1)) = 224
expect(calculateEchoes(0, 1)).toBe(853); expect(calculateEchoes(0, 1)).toBe(224);
}); });
it("calculates echoes at count 1", () => { it("calculates echoes at count 1", () => {
expect(calculateEchoes(1, 1)).toBe(853); // floor(224 / sqrt(1)) = 224
expect(calculateEchoes(1, 1)).toBe(224);
}); });
it("decreases echoes with higher prestige count", () => { it("decreases echoes with higher prestige count", () => {
const echoesAt1 = calculateEchoes(1, 1); const echoesAt1 = calculateEchoes(1, 1);
const echoesAt4 = calculateEchoes(4, 1); const echoesAt4 = calculateEchoes(4, 1);
expect(echoesAt4).toBeLessThan(echoesAt1); expect(echoesAt4).toBeLessThan(echoesAt1);
// floor(853 / sqrt(4)) = floor(853 / 2) = 426 // floor(224 / sqrt(4)) = floor(224 / 2) = 112
expect(echoesAt4).toBe(426); expect(echoesAt4).toBe(112);
}); });
it("applies echoMetaMultiplier", () => { it("applies echoMetaMultiplier", () => {
@@ -118,6 +119,11 @@ describe("calculateEchoes", () => {
const withMult = calculateEchoes(1, 2); const withMult = calculateEchoes(1, 2);
expect(withMult).toBe(base * 2); expect(withMult).toBe(base * 2);
}); });
it("returns 50 echoes at the target prestige 20", () => {
// floor(224 / sqrt(20)) = floor(224 / 4.472) = floor(50.09) = 50
expect(calculateEchoes(20, 1)).toBe(50);
});
}); });
describe("buildPostTranscendenceState", () => { describe("buildPostTranscendenceState", () => {