generated from nhcarrigan/template
29c817230d
## 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>
201 lines
7.7 KiB
Markdown
201 lines
7.7 KiB
Markdown
# 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
|