first commit
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
# The Ashen Halls
|
||||
|
||||
A UI-focused 2D healer game prototype. The player selects party frames and uses
|
||||
healing, shielding, and cleansing spells while an AI party fights through a
|
||||
dungeon encounter.
|
||||
|
||||
## Why this stack
|
||||
|
||||
- **React + TypeScript:** The game is mostly interactive UI, timers, bars, and
|
||||
state. A full game engine is not necessary for the first version.
|
||||
- **CSS pixel-art presentation:** Fast to iterate now; sprite sheets and richer
|
||||
animation can be layered in later.
|
||||
- **SQLite:** Stores authored content and durable player data. Live combat state
|
||||
remains in memory because health and cooldowns change many times per second.
|
||||
- **Electron later:** The web build can be wrapped as a Windows/macOS/Linux
|
||||
desktop game once the core loop is fun.
|
||||
|
||||
Phaser or Godot becomes worthwhile if the design grows into animated battlefield
|
||||
positions, projectile-heavy combat, physics, or map exploration.
|
||||
|
||||
## Run it
|
||||
|
||||
```powershell
|
||||
npm install
|
||||
npm run db:init
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Use the mouse to select a party member and click spells, or use keys `1` through
|
||||
`6`.
|
||||
|
||||
For an online production build, see [DEPLOYMENT.md](DEPLOYMENT.md).
|
||||
|
||||
## Current vertical slice
|
||||
|
||||
- Five party members with tank, healer, and damage roles
|
||||
- Mana management, cooldowns, direct healing, healing over time, group healing,
|
||||
shields, and cleansing
|
||||
- Reduced starter ability costs tuned to sustain an efficient full dungeon run
|
||||
- High-contrast selected-target raid frames and a persistent active-target card
|
||||
- Per-difficulty dungeon efficiency leaderboards ranked by resource spent, with
|
||||
class, level, item-level, and run-duration snapshots
|
||||
- Account registration, secure password hashing, cookie sessions, logout, and
|
||||
fully isolated character progression for each account
|
||||
- One-account-per-public-IP registration with local administrator exceptions
|
||||
- Live-safe SQLite backups for self-hosted account and save data
|
||||
- Explicit offline characters with local progression, gear, talents, and loot
|
||||
- A shared repository boundary for online HTTP, browser-local, and future
|
||||
desktop SQLite persistence
|
||||
- Two trash encounters followed by Warden Vhal
|
||||
- Boss-wide damage and a dispellable damage-over-time mechanic
|
||||
- Victory, defeat, loot, and restart states
|
||||
- Main menu with Dungeons, Raids, PvP, Customize Character, and Talents
|
||||
- SQLite-backed class selection and persistent six-slot ability loadouts
|
||||
- Three healer class foundations with level-gated abilities
|
||||
- SQLite-driven experience progression from level 1 to 25
|
||||
- Dungeon XP rewards, level-up handling, talent-point awards, and ability unlocks
|
||||
- SQLite-backed class talent trees with ranks, tiers, prerequisites, refunds,
|
||||
and immediate persistence
|
||||
- Seven equipment slots, starter item-level 1 gear, inventory comparison, and
|
||||
persistent equipping
|
||||
- Aggregate item level, healing power, and resource bonuses that affect combat
|
||||
- Five SQLite-authored dungeon difficulty tiers with level gates, combat
|
||||
scaling, XP multipliers, and item-level reward bands
|
||||
- Encounter-specific weighted loot tables for every difficulty, with authored
|
||||
drop chances, slot pools, and item-level 5 through 25 reward variants
|
||||
- One live loot roll per defeated encounter, shown in the combat log and
|
||||
dungeon-complete summary
|
||||
- Atomic inventory awards with retry-safe roll records and stacked duplicate
|
||||
quantities
|
||||
- Safe duplicate cleanup that can discard spare copies without removing the
|
||||
character's final copy
|
||||
- SQLite schema and seed data for progression, talents, item-level difficulties,
|
||||
boss loot, characters, inventory, and runs
|
||||
|
||||
## Architecture direction
|
||||
|
||||
The combat simulator should stay framework-independent as it grows. React renders
|
||||
the current state and handles player input. A content repository will load
|
||||
classes, spells, dungeons, encounters, mechanics, and loot from SQLite. This
|
||||
makes it possible to add content through an editor later without rewriting combat
|
||||
code.
|
||||
|
||||
The Vite development and preview servers expose a local SQLite API used by the
|
||||
character screens. The API validates class ownership, unlock levels, duplicate
|
||||
abilities, and the six-slot limit. When the project is wrapped in Electron, this
|
||||
same repository boundary can move into the Electron main process.
|
||||
|
||||
Offline characters use a separate browser-local save and do not require an
|
||||
account. Production web builds cache the application shell after one successful
|
||||
visit so they can reopen without a connection. Offline characters are excluded
|
||||
from online leaderboards. Run `npm run offline:export` after changing
|
||||
SQLite-authored classes, abilities, dungeons, difficulties, items, or loot
|
||||
tables so new offline characters receive the updated starter content.
|
||||
|
||||
## Suggested milestones
|
||||
|
||||
1. Move combat updates into a deterministic simulation module and add tests.
|
||||
2. Apply authored talent effects to combat calculations.
|
||||
3. Add currency or crafting materials for selling and salvaging spare gear.
|
||||
4. Add two more bosses to complete the first three-boss dungeon.
|
||||
5. Add cast times, global cooldowns, threat, overhealing, and a combat summary.
|
||||
6. Replace placeholder glyphs with original pixel-art portraits, spell icons,
|
||||
enemies, and effects.
|
||||
|
||||
## Creative boundary
|
||||
|
||||
Genre conventions such as party frames, mana, cooldowns, dispels, and healing
|
||||
styles are fair inspiration. Keep class names, spell names, lore, icons, sounds,
|
||||
characters, encounter text, and artwork original rather than copying World of
|
||||
Warcraft assets or terminology.
|
||||
# I want to Heal
|
||||
|
||||
## Android and AYN Thor
|
||||
|
||||
The Android build uses Capacitor and includes a native `DualScreen` plugin.
|
||||
The plugin enumerates Android displays, launches the full interactive game on
|
||||
the largest display, and changes the smaller display to a compact dungeon,
|
||||
resource, targeting, skill, and cooldown panel. Android controller key events
|
||||
are forwarded into the web input system so menus and combat can both be
|
||||
navigated without touch.
|
||||
|
||||
On devices that do not permit an activity to launch on a secondary display,
|
||||
the plugin falls back to a fullscreen `Presentation` WebView.
|
||||
|
||||
Build prerequisites:
|
||||
|
||||
- Android Studio with Android SDK 36
|
||||
- JDK 17 or the Java runtime bundled with Android Studio
|
||||
|
||||
Useful commands:
|
||||
|
||||
```bash
|
||||
npm run android:sync
|
||||
npm run android:open
|
||||
npm run android:apk
|
||||
```
|
||||
|
||||
The debug APK is written to:
|
||||
|
||||
```text
|
||||
android/app/build/outputs/apk/debug/app-debug.apk
|
||||
```
|
||||
|
||||
On the Thor, open Settings and inspect the display diagnostics under
|
||||
**AYN Thor Dual-Screen Mode**. The expected displays are approximately:
|
||||
|
||||
- `1920×1080` at `120 Hz`
|
||||
- `1240×1080` at `60 Hz`
|
||||
|
||||
If Android starts the main activity on the upper panel, the next native
|
||||
fallback is a second activity launched onto the lower display with
|
||||
`ActivityOptions.setLaunchDisplayId()`. The diagnostics identify whether that
|
||||
fallback is needed on the installed Thor firmware.
|
||||
Reference in New Issue
Block a user