Files
elysium/verify.md
T
hikari 29c817230d
Security Scan and Upload / Security & DefectDojo Upload (push) Successful in 1m1s
CI / Lint, Build & Test (push) Successful in 1m6s
feat: initial prototype — core game systems (#30)
## Summary

This PR represents the full v1 prototype, implementing the core game systems for Elysium.

- Full idle/clicker RPG loop: resource collection, crafting, boss fights, exploration, and quests
- Adventurer hiring with batch size selector and progressive tier cost scaling
- Prestige, transcendence, and apotheosis systems with auto-prestige support
- Character sheet, titles, leaderboards, companion system, and daily login bonuses
- Auto-quest and auto-boss toggles
- Discord webhook notifications on prestige/transcendence/apotheosis
- Discord role awarded on apotheosis
- Responsive design and overarching story/lore system
- In-game sound effects and browser notifications for key events
- Support link button in the resource bar
- Full test coverage (100% on `apps/api` and `packages/types`)
- CI pipeline: lint → build → test

## Closes

Closes #1
Closes #2
Closes #3
Closes #4
Closes #5
Closes #6
Closes #7
Closes #8
Closes #9
Closes #10
Closes #11
Closes #12
Closes #13
Closes #14
Closes #16
Closes #19
Closes #20
Closes #21
Closes #22
Closes #23
Closes #24
Closes #25
Closes #26
Closes #27
Closes #29

 This issue was created with help from Hikari~ 🌸

Co-authored-by: Naomi Carrigan <commits@nhcarrigan.com>
Reviewed-on: #30
Co-authored-by: Hikari <hikari@nhcarrigan.com>
Co-committed-by: Hikari <hikari@nhcarrigan.com>
2026-03-08 15:53:39 -07:00

201 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Manual Verification Checklist
Things our unit tests cannot verify — these need manual testing in a real browser with a live server.
---
## Auth & Login
- [ ] Discord OAuth login flow works end-to-end (redirect → callback → JWT → game loads)
- [ ] Logging out and back in restores the correct game state
- [ ] A brand-new player (no existing save) gets a fresh game state with no errors
- [ ] A player with an outdated save (no `schemaVersion`) sees the `OutdatedSchemaModal` on login
- [ ] "Reset Progress" button nukes the save and starts fresh
- [ ] "Proceed with Bugs" dismisses the modal for the session but reappears on next login
- [ ] Cloud save attempts while on an outdated save are rejected (save button should fail gracefully)
- [ ] A player whose save was nuked server-side (v1 release reset) gets a fresh state, not a 404
---
## Cloud Save
- [ ] Auto-save triggers every 60 seconds while the game is open
- [ ] Manual save (if applicable) works correctly
- [ ] Saving and reloading in a new tab preserves all progress
- [ ] Save is rejected with a helpful error if the schema version is outdated (HTTP 409)
---
## Offline Progress
- [ ] Closing the tab and reopening after 30+ minutes shows the offline earnings modal
- [ ] Offline gold is calculated correctly (passive income × elapsed time, capped appropriately)
- [ ] Offline essence is calculated correctly
- [ ] **Resetting progress clears offline earnings** — after a reset, no offline modal should appear
---
## Daily Login Bonus
- [ ] First login of a new day shows the login bonus modal with correct reward
- [ ] Consecutive days increment the streak counter
- [ ] Missing a day resets the streak to 1
- [ ] Day 7 reward (crystals) is awarded correctly
- [ ] Week multiplier applies for streaks beyond 7 days
- [ ] Streak is displayed correctly on the Character Sheet
---
## Discord Integration
- [ ] **Webhook on prestige**: posting to the Discord webhook channel with correct message and player mention
- [ ] **Webhook on transcendence**: same as above
- [ ] **Webhook on apotheosis**: webhook fires AND Discord role is granted to the player
- [ ] Discord role grant requires the bot to have `Manage Roles` permission and the bot role to be above the target role
- [ ] If Discord env vars are missing (dev environment), these silently no-op without crashing
---
## Prestige / Transcendence / Apotheosis
- [ ] Prestige resets gold and adventurers but preserves story/titles/companions/achievements
- [ ] Prestige increments the prestige count correctly
- [ ] Transcendence resets prestige progress but preserves correct fields
- [ ] Apotheosis resets transcendence progress but preserves correct fields
- [ ] Story chapters unlock at correct milestone points (1st prestige, 5th prestige, 1st transcendence, 1st apotheosis)
---
## Boss Fights
- [ ] Boss fight UI opens correctly and shows HP bar
- [ ] Win/loss outcomes are applied correctly
- [ ] Boss rewards (gold, equipment) are granted on win
- [ ] Zone unlock happens after final zone boss is defeated **and** final zone quest is completed
- [ ] `bossesDefeated` daily challenge counter increments in the UI after a win
- [ ] Auto-boss toggle fires when a boss is available and the player is actively on the page
---
## Quests
- [ ] Quest starts and the timer counts down in real time
- [ ] Quest completes and rewards are granted
- [ ] Quest failure (chance-based) resets the quest to available with ⚠️ indicator
- [ ] `questsCompleted` daily challenge counter increments in the UI
- [ ] Auto-quest toggle fires when a quest becomes available
- [ ] Active companion quest-time reduction (Wren, Zuri) visibly shortens the timer
---
## Exploration
- [ ] Starting an exploration works and shows in-progress state
- [ ] Cannot start a second exploration while one is in progress (all Explore buttons disabled)
- [ ] Exploration completes and rewards/codex entries are granted
- [ ] "Found nothing" outcome is handled gracefully (no crash, no reward)
- [ ] `adventurer_loss` event properly removes adventurers
---
## Companions
- [ ] Companions unlock when the correct threshold is met (bosses defeated, quests completed, prestige, etc.)
- [ ] Setting an active companion applies the bonus correctly:
- [ ] Passive gold bonus (Lyra, Mira, Pria) — check gold income rate
- [ ] Click gold bonus (Finn) — check click power
- [ ] Boss damage bonus (Aldric, Kael) — check boss fight outcomes
- [ ] Quest time reduction (Wren, Zuri) — check quest timer
- [ ] Essence income bonus (Sera, Vex) — check essence accumulation
- [ ] Changing active companion takes effect immediately
---
## Story System
- [ ] First zone boss defeat unlocks Chapter 1 and shows a toast notification
- [ ] Story tab shows unread dot badge when new chapters are available
- [ ] Reading a chapter and making a choice saves the selection
- [ ] Choice outcome is displayed after selection
- [ ] Completed choices are visible on the Character Sheet
- [ ] Story progress is preserved through prestige, transcendence, and apotheosis
- [ ] `{characterName}` is substituted correctly with the player's character name
---
## Titles
- [ ] Titles unlock when the correct milestones are reached
- [ ] Active title is selectable in the Character Sheet edit mode
- [ ] Active title displays on the public `/character/:id` page
- [ ] Titles are preserved through prestige, transcendence, and apotheosis
---
## Leaderboards
- [ ] Leaderboard page loads and displays real player data
- [ ] All 7 categories (gold, bosses, quests, achievements, prestige, transcendence, apotheosis) work
- [ ] Top 3 rows have medal highlighting
- [ ] Clicking a player's row navigates to their `/character/:id` page
- [ ] `showOnLeaderboards: false` hides the player from all categories
- [ ] Default is opted-in (new players appear on leaderboards)
---
## Character Sheet & Public Profile
- [ ] Character Sheet tab loads and displays correctly
- [ ] Edit mode saves all fields (name, pronouns, race, class, bio, guild name, guild description, active title)
- [ ] Share button copies the correct `/character/:id` URL and shows ✓ Copied!
- [ ] Public `/character/:id` page renders for another player's ID
- [ ] Equipped items (weapon, armour, trinket) display correctly with rarity colours
- [ ] Profile settings (showOnLeaderboards, etc.) persist correctly
---
## Batch Hire
- [ ] Batch selector (×1, ×5, ×10, ×25, ×100, ×Max) updates all hire buttons
- [ ] Cost display updates to reflect batch price
- [ ] ×Max hires as many as the player can afford, down to 1
- [ ] ×Max is disabled (or shows ×0) if the player cannot afford even 1
---
## Responsive Layout
- [ ] Game is usable on a 375px wide mobile screen
- [ ] Sidebar collapses to a horizontal strip on mobile
- [ ] Tabs scroll horizontally when there are too many to fit
- [ ] Resource bar wraps cleanly on small screens
---
## Notifications / Toasts
- [ ] Achievement toast appears when an achievement is unlocked
- [ ] Codex toast appears when a new codex entry is discovered
- [ ] Story toast appears when a new chapter unlocks
- [ ] Login bonus modal appears on first daily login
- [ ] Offline progress modal appears when returning after time away
- [ ] Outdated schema modal appears for players with old saves
- [ ] All toasts auto-dismiss after a few seconds
---
## Crafting
- [ ] Crafting a recipe deducts the correct materials
- [ ] Crafted item appears in inventory / updates stats
- [ ] Cannot craft without required materials (error shown)
---
## 1Password Secrets (Production Only)
- [ ] `DISCORD_MILESTONE_WEBHOOK` is set and webhook posts succeed
- [ ] `DISCORD_BOT_TOKEN`, `DISCORD_GUILD_ID`, `DISCORD_APOTHEOSIS_ROLE_ID` are set and role grant succeeds
- [ ] JWT secret is correctly injected
- [ ] MongoDB connection string is correctly injected