first commit

This commit is contained in:
Warren H
2026-06-17 19:52:28 -04:00
commit 3880db1b58
+154
View File
@@ -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.