2 Commits

Author SHA1 Message Date
hikari 2827ddef72 feat: add endgame prestige and gold milestone achievements (#183, #185)
Security Scan and Upload / Security & DefectDojo Upload (pull_request) Successful in 1m4s
CI / Lint, Build & Test (pull_request) Successful in 1m13s
- Add prestige milestones at P50/P100/P150/P200 (10k/25k/50k/100k crystals)
- Add gold milestones at 1e30/1e60/1e90 (Cosmic Wealthy, Infinite Hoarder, Omniversal Tycoon)
2026-03-31 17:42:54 -07:00
hikari 34f2b250f3 fix: correct outdated achievement descriptions and quest count (#184, #186)
- Update devourer_slayer description: no longer references "first six zones"
- Update quest_eternal to require 122 quests (was 95; added 27 in #175 and #178)
2026-03-31 17:42:37 -07:00
2 changed files with 68 additions and 5 deletions
+66 -3
View File
@@ -149,7 +149,7 @@ export const defaultAchievements: Array<Achievement> = [
}, },
{ {
condition: { amount: 18, type: "bossesDefeated" }, condition: { amount: 18, type: "bossesDefeated" },
description: "Defeat all 18 bosses across the first six zones.", description: "Defeat the 18 bosses of the mortal realms.",
icon: "🌟", icon: "🌟",
id: "devourer_slayer", id: "devourer_slayer",
name: "World Saver", name: "World Saver",
@@ -269,6 +269,33 @@ export const defaultAchievements: Array<Achievement> = [
reward: { crystals: 50_000 }, reward: { crystals: 50_000 },
unlockedAt: null, unlockedAt: null,
}, },
{
condition: { amount: 1e30, type: "totalGoldEarned" },
description: "Earn 1 nonillion gold in total.",
icon: "🌌",
id: "cosmic_wealthy",
name: "Cosmic Wealthy",
reward: { crystals: 100_000 },
unlockedAt: null,
},
{
condition: { amount: 1e60, type: "totalGoldEarned" },
description: "Earn a vigintillion gold in total.",
icon: "♾️",
id: "infinite_hoarder",
name: "Infinite Hoarder",
reward: { crystals: 250_000 },
unlockedAt: null,
},
{
condition: { amount: 1e90, type: "totalGoldEarned" },
description: "Earn a trigintillion gold in total.",
icon: "🔮",
id: "omniversal_tycoon",
name: "Omniversal Tycoon",
reward: { crystals: 1_000_000 },
unlockedAt: null,
},
// Higher quest milestones // Higher quest milestones
{ {
condition: { amount: 30, type: "questsCompleted" }, condition: { amount: 30, type: "questsCompleted" },
@@ -289,8 +316,8 @@ export const defaultAchievements: Array<Achievement> = [
unlockedAt: null, unlockedAt: null,
}, },
{ {
condition: { amount: 95, type: "questsCompleted" }, condition: { amount: 122, type: "questsCompleted" },
description: "Complete all 95 quests across the known multiverse.", description: "Complete all 122 quests across the known multiverse.",
icon: "🌌", icon: "🌌",
id: "quest_eternal", id: "quest_eternal",
name: "Quest Eternal", name: "Quest Eternal",
@@ -363,4 +390,40 @@ export const defaultAchievements: Array<Achievement> = [
reward: { crystals: 25_000 }, reward: { crystals: 25_000 },
unlockedAt: null, unlockedAt: null,
}, },
{
condition: { amount: 50, type: "prestigeCount" },
description: "Prestige 50 times.",
icon: "✨",
id: "prestige_transcendent",
name: "Transcendent",
reward: { crystals: 10_000 },
unlockedAt: null,
},
{
condition: { amount: 100, type: "prestigeCount" },
description: "Prestige 100 times.",
icon: "💎",
id: "prestige_eternal",
name: "Eternal Looper",
reward: { crystals: 25_000 },
unlockedAt: null,
},
{
condition: { amount: 150, type: "prestigeCount" },
description: "Prestige 150 times.",
icon: "🌟",
id: "prestige_immortal",
name: "Immortal Cycler",
reward: { crystals: 50_000 },
unlockedAt: null,
},
{
condition: { amount: 200, type: "prestigeCount" },
description: "Prestige 200 times.",
icon: "👑",
id: "prestige_absolute",
name: "Absolute Champion",
reward: { crystals: 100_000 },
unlockedAt: null,
},
]; ];
+2 -2
View File
@@ -476,8 +476,8 @@ export const computeProjectedRunestones = (state: GameState): number => {
? 1.5 ? 1.5
: 1; : 1;
const runestoneMult = gain1Mult * gain2Mult; const runestoneMult = gain1Mult * gain2Mult;
/* eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- optional chained game state field */ const echoMult: number
const echoMult: number = state.transcendence?.echoPrestigeRunestoneMultiplier ?? 1; = state.transcendence?.echoPrestigeRunestoneMultiplier ?? 1;
return Math.floor(base * runestoneMult * echoMult); return Math.floor(base * runestoneMult * echoMult);
}; };