Adds Web Audio API sound effects and browser notifications for key game
events: achievement unlocked, quest completed, quest failed, boss
defeated, prestige, transcendence, and apotheosis. Both features are
toggled via profile settings, with notification permission requested
on first enable.
Adds full Vitest test suites with @vitest/coverage-v8, targeting 100%
statement/branch/function/line coverage. Uses v8 ignore comments for
genuinely unreachable defensive branches.
Introduces a schema version field to GameState. Saves without the
current schema version are flagged on load (showing a modal prompting
reset or proceed), and cloud saves from outdated clients are rejected
server-side. Removes all backfill code now that outdated saves are
handled via the reset flow instead.
New POST /game/reset endpoint creates a fresh save for players who
choose to reset. Save version and current schema version are displayed
in the sidebar below the app version.
- 22 chapters across the full game arc (18 zone bosses + 4 milestones)
- Choice-based narrative with {characterName} dynamic substitution
- Story progress (unlocked + completed chapters) is permanent across all resets
- Server-side anti-cheat: chapters/choices can only accumulate, never be removed
- Tab badge and lower-right toast notifications for newly unlocked chapters
- Story choices displayed on the Character Sheet and Character Page
- How to Play entry added to About panel
Introduces 10 unlockable companions (Lyra, Finn, Wren, Aldric, Sera, Kael,
Zuri, Mira, Vex, Pria), each providing a unique bonus: passive gold, click
gold, boss damage, essence income, or quest-time reduction.
Quest-time reduction is validated server-side: computeQuestRewards applies
the active companion's reduction to the effective duration check, and the
income validation budget accounts for passive gold and essence bonuses.
Server recomputes unlockedCompanionIds on every save using DB-authoritative
lifetime stats and validates the active companion ID.
Companion bonuses are also applied in the client tick engine and
boss.ts calculatePartyStats.
Replaces the 404 response with a fresh INITIAL_GAME_STATE seeded from
the player's existing Player record. Handles the v1 GameState nuke
gracefully — returning players get a clean slate instead of an error.
Adds optional automation to the quest and boss panels. Auto-quest
automatically starts the highest-zone available quest (respecting CP
requirements) as soon as none is active. Auto-boss automatically
challenges the highest available boss when one is ready. Both run
exclusively in the client-side RAF tick loop — offline calculations
are unaffected. Toggles persist in GameState via cloud save.
Awards escalating gold rewards each consecutive day (Day 7 grants bonus
crystals). Streak resets on missed days; a week multiplier boosts all
rewards for longer streaks. Shows a modal on first daily load and
displays the current streak on the character sheet.
Titles are earned by reaching milestones (quests, bosses, gold, clicks,
adventurers, guild, prestige, transcendence, apotheosis, achievements,
longevity) and are permanent - never lost on prestige/transcendence/
apotheosis resets. 20 titles available at launch.
Also fixes a pre-existing P2034 write-conflict on the load backfill path
and the exactOptionalPropertyTypes violation in the quest failure handler.
Players can now set their character's race and class in the Character
tab. A new public page at /character/:id displays the full character
sheet — name, pronouns, race, class, bio, and guild lore.
Adds pronouns, guildName, and guildDescription fields to the player
profile. A new Character tab provides an in-game view/edit panel for
character and guild lore.
Closes#16
Each adventurer tier now has a unique baseCost that scales ~7x per
tier (L1: 10 → L32: ~2.5e27). The per-count scaling factor (1.15×)
is unchanged.
Closes#10
Quests now have a random chance of failing when their timer expires.
On failure the quest resets to available (no rewards lost, just time).
Failure chance scales by zone: 10% in Verdant Vale up to 40% in the
end-game zones. The Quest type gains lastFailedAt so the UI can show
a warning on subsequent attempts.
Server-side: check if any area is already in_progress before allowing
a new exploration to start. Client-side: derive hasActiveExploration
from the full areas list and disable all Explore buttons (with a
tooltip) whilst another area is underway. Closes#9.
Stacks the sidebar above content on ≤768px, wraps the resource bar,
hides decorative labels/badges to reduce clutter, and collapses the
click area into a compact horizontal strip. Profile link button labels
hide on ≤480px leaving icon-only buttons. Tab bar already scrolled
horizontally so no further changes needed there.
Displays the app version below the Elysium title in the sidebar.
Removes the separate client/API version cards from the About panel.
Also fixes the Vite dev proxy port to match the API server.
Adds two new game systems: Exploration (scouts collect materials from
timed area runs) and Crafting (combine materials into permanent
multipliers). Includes 72 exploration areas, 54 materials, 36 recipes,
and 108 new Codex lore entries. Removes unused characterName requirement
from prestige/transcendence/apotheosis reset flows.
Adds INITIAL_TRANSCENDENCE and INITIAL_APOTHEOSIS constants and includes
both in INITIAL_GAME_STATE so every save document contains these fields
from the very first write, rather than only appearing post-transcendence
or post-apotheosis.
- PublicProfileResponse now includes transcendenceCount and apotheosisCount
- ProfileSettings adds showTranscendence and showApotheosis toggles (both on by default)
- Profile page displays ✨ Apotheosis, 🌌 Transcendence, and ⭐ Prestige badges in that order
- EditProfileModal exposes the two new visibility toggles under Current Run settings
- Styled to match the resource bar badges (gold for apotheosis, purple for transcendence)
Apotheosis is the ultimate reset — wipes absolutely everything
including prestige and transcendence — in exchange for a pure
bragging-rights badge. No mechanical benefit whatsoever.
Unlock condition: all 15 Transcendence echo upgrades purchased.
Can be achieved multiple times; each cycle requires repurchasing
all Transcendence upgrades again.
What survives: Codex lore entries and lifetime profile statistics.
What is wiped: resources, prestige, runestones, transcendence data
(echoes, echo upgrades, multipliers), equipment, upgrades, bosses,
quests, zones, adventurers, achievements.
New files: Apotheosis.ts type, apotheosis service, apotheosis route,
ApotheosisPanel.tsx component.
Modified: GameState (apotheosis field), Api.ts, types/index.ts,
prestige service (carry apotheosis), transcendence service (carry
apotheosis), game.ts anti-cheat (cap apotheosis count), API client,
GameContext (apotheosis() function), GameLayout (new tab), ResourceBar
(gold apotheosis badge shown above transcendence and prestige badges),
styles.css, AboutPanel how-to-play.
Also removes IDEAS.md — all planned features are now implemented!
Introduce six lifetime stat fields (gold, clicks, bosses, quests,
adventurers, achievements) that accumulate across all prestige and
transcendence resets and are never cleared.
- schema: add six new Float fields to the Player model
- prestige route: capture current-run totals and increment lifetime
fields before resetting per-run counters to zero
- profile route: return lifetime fields as the All Time section data;
add four new ProfileSettings toggles for visibility control
- ProfilePage: display lifetime bosses/quests/adventurers/achievements
in All Time section; remove GameProvider dependency by importing
formatNumber directly (fixes crash on public profile pages)
- EditProfileModal: add four new All Time stat toggles
- types: update Player, ProfileSettings, and PublicProfileResponse
Implements a full in-game Codex panel that tracks lore discovery across
seven categories: bosses (72), quests (95), zones (18), equipment (65),
adventurer tiers (32), upgrades (57), and prestige upgrades (25).
Lore entries unlock automatically as players progress — existing
completions are retroactively and silently added on first load. New
discoveries trigger a toast notification and badge counter on the
Codex tab.
Adds Donate and Discord link buttons to the resource bar nav. Also
fixes a display discrepancy where the resource bar showed
resources.runestones (always 0) instead of the actual prestige
runestone balance from prestige.runestones.
✨ This feature was implemented with help from Hikari~ 🌸
Adds a new Utility category to the prestige shop with the "Autonomous Ascension" upgrade (100 runestones). Once purchased, a toggle button appears in the shop that enables automatic prestige — the client RAF loop checks the threshold on each tick and fires the prestige API automatically using the current character name.
✨ This feature was implemented with help from Hikari~ 🌸
- Add @types/node to API devDependencies
- Create HonoEnv type and apply to all routers + auth middleware for
proper context.get/set("discordId") typing
- Use conditional spreads for exactOptionalPropertyTypes dailyChallenges
in GameContext, tick engine, and prestige route
- Use conditional spread for optional signature in SaveRequest calls
- Add non-null assertions in shuffle/template index for noUncheckedIndexedAccess
- Cast GameState to never for Prisma InputJsonValue fields
- Exclude vite.config.ts from web tsconfig (it runs in Node context)
- Define EquipmentSet type + computeSetBonuses utility in packages/types
- Add setId field to Equipment type and assign sets to 27 equipment items
- Create 9 named equipment sets (Iron Vanguard → Eternal Throne) with 2pc/3pc bonuses
- Apply set combat multiplier in boss route
- Apply set gold/click multipliers in tick engine and click handler
- Include set bonuses in anti-cheat delta validation
- Show active set bonus strip + set badge per card in EquipmentPanel
- Add boss first-kill bounty runestones (scaling 1–10 per boss tier)
- Update AboutPanel and IDEAS.md
Without this, the client would auto-save stale state (runestones: 0)
after a first-kill bounty, causing the server's validateAndSanitize to
overwrite the correctly-persisted DB value back to zero.
- New GET /about API endpoint caches Gitea releases for 5 minutes
- AboutPanel displays client version (via Vite define), API version, collapsible changelog, and How to Play guide
- GiteaRelease and AboutResponse types added to shared package
Replaces the flat RESOURCE_CAP on gold and essence with a per-save
maximum derived from the player's actual income rate. The server now
computes max legitimate earnings using the previous (DB-trusted) state's
adventurers, upgrades, prestige multipliers, and equipment, then applies
a 2x buffer to cover mid-session purchases. Quest rewards are only
credited when the quest was active with an expired timer in the previous
state (using authoritative game data to prevent reward/duration
tampering). Boss rewards are included as a race-condition safety buffer
for simultaneous boss-write and save requests. Runestones are capped at
the previous value since they are only granted server-side via prestige.