- Add quest_hero milestone at 75 quests (closes gap between 50 and 122)
- Add boss_legend milestone at 50 bosses (closes gap between 30 and 72)
- Replace crystal rewards on P50/P100/P150/P200 prestige achievements
with runestones (100/500/2000/10000) — crystals become worthless by
the time these are earned, runestones remain meaningful throughout
Crystals are an early-game currency. The total crystal sink is ~125M
crystals (purchasable equipment), but Zone 7+ bosses were awarding up
to 5e139 crystals with the crystal multipliers applied. Bosses in
celestial_reaches and beyond now award 0 crystals, keeping the
crystal economy meaningful in early-mid game only.
- 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)
Give Troll King 5 crystals (was 0) to signal the crystal economy from
the first boss kill, and halve crystal_focus cost from 100 to 50 so it
is reachable within the first zone's boss chain (#173).
Increase production multiplier base from 1.25 to 1.3 so each prestige
provides more perceptible run-time reduction in the P1-P30 window where
the treadmill effect was most pronounced (#174).
Reduce income_10 cost 30k→22.5k and income_11 80k→60k (25% cut each)
to ease the late-prestige runestone cliff without collapsing the timeline.
Change prestige milestone bonus from linear (n×25) to quadratic (n²×25)
so high-prestige milestones feel meaningful (P100 = 10k stones).
Replace linear prestige combat multiplier (1 + count×0.1) with exponential
(4^count) in both the tick engine and server-side boss route. Without this
the final boss (2×10^145 HP) was unreachable by ~112 orders of magnitude;
base-4 makes it achievable around P190, consistent with the 6-month target.
Quest max reduced from 168h to 24h (÷7 scaling).
Exploration max reduced from 144h to 12h (÷12 scaling).
Zone 1 quest durations restored to original short values (1–30min).
All inline duration comments updated to reflect new values.
Adds enablePrestigeAnnouncements to ProfileSettings (defaults to true).
The prestige route now checks this setting before posting the Discord
webhook, and the edit profile modal exposes a toggle in the Sounds &
Notifications section so players can opt out.
Closes#169
Players blocked on zone progression had days where all three daily
challenges (bossesDefeated, questsCompleted, prestige) required
progression they couldn't make. Always including a clicks challenge
ensures at least one challenge is completable regardless of where
the player is in the game.
Raise runestonesPerPrestigeLevel from 10 to 15. Early-game players
were earning only 10-20 runestones per prestige, making the upgrade
shop feel out of reach. This boost helps mid-game without affecting
the cap behaviour (cbrt formula still prevents AFK windfalls).
Add 150 crystals to shadow_mere and 500 to witch_coven quest rewards.
Double shadow_marshes boss crystal drops (700->1500, 1500->3000, 3000->6000)
to provide meaningful crystal flow for players reaching Shadow Marshes.
The zone unlocks at 1.5M CP (storm_citadel), making the 5M CP entry
quest unreachable for most players. 2M CP is achievable with Arcane
Scholar and Dragon Rider adventurers without being trivial.
Adds an optimistic lock on the prestige route so that a second concurrent
request for the same state is rejected with 409 rather than firing the
Discord announcement twice. Also adds missing branch-coverage tests for
debug.ts to satisfy the 100% threshold.
Closes#162
Ten upgrades were dropping 1-2 zones after the adventurer they buff was
no longer meaningful. Moved apprentice_1 to goblin_camp, militia_1 to
haunted_mine, knight_1 to frozen_wastes, peasant_2 to glacier_tomb,
peasant_3 to shadow_mere, and pulled the T27-30 upgrades
(astral_sovereign_1, primordial_mage_1, reality_warden_1,
infinity_ranger_1) and cosmos_knight_1 into their adventurer's own zone.
The auto-buy adventurers toggle was silently reset to false on every
prestige because it was not included in the list of automation preferences
carried forward into the fresh state. This mirrors the existing handling
for autoBoss and autoQuest.
Closes#156
Distributes the nine unassigned adventurer-specific upgrade rewards
across Crystalline Spire through Eternal Throne bosses that previously
had empty upgradeRewards arrays, ensuring all adventurer upgrades are
obtainable via boss drops.
- #141: Already resolved in prior commits (celestial_focus 4.25×,
void_conduit 10.5×, crystal_matrix 7.5× all exceed free-drop tier)
- #142: Add primal_omega_lens cross-zone click_power recipe at 1.38×,
matching the eternal_omega combat ceiling and closing the gap above
the zone-17 cap of 1.25×
- #143: Already resolved in prior commits (elder_bark_shield 1.12×,
void_fragment_amulet 1.15×, soul_bound_catalyst 1.20× all buffed)
- #144: Raise philosophers_stone click 2.25×→2.5× to differentiate from
eternal_flame; raise crystal_shard click 1.55×→1.65× so the
volcanic_forger set trinket beats void_compass (1.6×)
- #145: Militia goldPerSecond already fixed; raise celestial_guard
baseCost 1.4T→1.8T, smoothing tier 14→15 from 4.67× to 6× and
removing the jarring tier 15→16 wall (7.14×→5.56×)
- #147: Guard all patch functions with hasChanged before incrementing
sync counter to prevent inflation on no-op patches
- #148: Clear stale HMAC signature after each boss fight so subsequent
auto-saves do not send a mismatched signature
- #146: Auto-unlock adventurer-specific upgrades in applyTick when
their adventurer count > 0; show recruit hint in upgrade panel
- #149: Add Essence/s row to resource bar dropdown
- #150: Fix broken auto-quest CP reduce formula; centralise via
computePartyCombatPower which applies all multipliers correctly
- #151: Cap auto-buy at 100 for non-max-tier adventurers; max tier
(highest level unlocked) remains uncapped
- #152: Export computePartyCombatPower from tick, applying global
upgrades, prestige, equipment, set bonuses, echo, crafted, and
companion multipliers; use it in resource bar and boss panel
- Added glacier_tomb (200K combat, 2.5hr) between frozen_wastes and ice_caves
- Added frozen_throne (3M combat, 7hr) after storm_citadel
- Updated ice_caves prerequisite to chain from glacier_tomb
- Frozen Peaks now has 5 quests, in line with other zones
Closes#139
## Summary
- Grants the Elysian Discord role to players on login/registration and persists an `inGuild` flag on the Player record
- Connects to the Discord Gateway via WebSocket to keep `inGuild` in sync as players join or leave the server
- Shows a dismissible "Join our community" modal to players who are not yet in the guild
- Hardens `inGuild` exposure through the load endpoint and game context
- Moves all non-secret Discord IDs (guild, role, client, redirect URI) out of env vars and into hardcoded constants; removes them from `prod.env`
## Test plan
- [ ] Lint, build, and test pipeline passes (100% coverage maintained)
- [ ] New player auth grants Elysian role and sets `inGuild: true`
- [ ] Existing player auth re-attempts role grant and updates `inGuild`
- [ ] Join community modal appears for players not in the guild
- [ ] Modal does not reappear within the same browser session after dismissal
- [ ] Gateway correctly sets `inGuild: true/false` on member add/remove events
✨ This issue was created with help from Hikari~ 🌸
Reviewed-on: #134
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>
## Summary
- Sync New Content now **injects** missing entries AND **patches canonical fields** on all existing entries to match current defaults
- Adventurers: stats (baseCost, combatPower, goldPerSecond, essencePerSecond, name, class, level)
- Quests: duration, prerequisites, combat requirement, rewards
- Bosses: HP, damage, rewards, prestige requirement, upgrade rewards
- Zones: unlock conditions (boss/quest required)
- Upgrades: multiplier, costs
- Equipment: bonus, cost, set membership
- Achievements: condition, reward
- Crafting: multipliers recomputed from `craftedRecipeIds` so recipe balance changes apply retroactively
Closes#126
## Test plan
- [ ] On an existing save, click Sync New Content and verify the notification reports patched counts for all content types
- [ ] Verify that rebalanced adventurer/boss/upgrade stats are reflected in the UI after syncing
- [ ] Verify that player-owned state (counts, unlock status, boss HP, quest status) is preserved after syncing
- [ ] Verify crafting multipliers are correct after syncing if any recipes were previously crafted
✨ This issue was created with help from Hikari~ 🌸
Reviewed-on: #130
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>
## Summary
- Fix `NaN` displayed in Sync New Content / Force Unlock notifications by guarding against undefined counts
- Poll server for exploration claimability before showing Collect button to prevent client/server desync
- Return authoritative materials list from craft API to prevent client desync causing false affordability
- Add test coverage for `sync-new-content` and `explore/claimable` endpoints
Closes#125Closes#127Closes#128
## Test plan
- [ ] Trigger a sync with new content and verify the notification shows a real count instead of `NaN`
- [ ] Start an exploration, wait for it to complete, and verify the Collect button only appears after the server confirms claimable
- [ ] Attempt to craft a recipe and verify the material counts in the UI update to match the server's authoritative values
✨ This issue was created with help from Hikari~ 🌸
Reviewed-on: #129
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>