135 lines
5.0 KiB
Markdown
135 lines
5.0 KiB
Markdown
# I Want To Heal — Thor healer roguelike
|
||
|
||
Playable low-poly third-person combat vertical slice for AYN Thor's dual displays.
|
||
|
||
Offline-first frontend includes three timestamped save slots, optional account sync, local/online overwrite controls, Hunter Profile statistics, boss collection logs, Settings, and PvE/PvP mode entry points.
|
||
|
||
## Run
|
||
|
||
```bash
|
||
pnpm install
|
||
pnpm dev
|
||
```
|
||
|
||
The development server listens on `0.0.0.0:4173`.
|
||
|
||
## Android / AYN Thor test APK
|
||
|
||
The Android host uses Capacitor, locks to landscape, requests immersive mode and
|
||
60 Hz, and sends controller input directly to the game WebView. Build an
|
||
installable debug APK:
|
||
|
||
```bash
|
||
pnpm android:apk
|
||
```
|
||
|
||
Output is written under `android/app/build/outputs/apk/debug/`. With Android
|
||
platform tools and a connected Thor, build and install it with:
|
||
|
||
```bash
|
||
pnpm android:install
|
||
```
|
||
|
||
The first Android milestone uses the complete single-display fallback. Press
|
||
Select (or Tab with a keyboard) to switch between the main game surface and the
|
||
620 × 540 tactical surface. Native routing to both physical Thor displays is the
|
||
next milestone; it needs two Android display contexts backed by one shared game
|
||
state rather than two independent WebViews.
|
||
|
||
## TrueNAS deployment
|
||
|
||
Complete first-install, local-Gitea clone, YAML, update, and verification steps:
|
||
[DEPLOYMENT.md](DEPLOYMENT.md).
|
||
|
||
The production preview server uses the existing deployment address and port:
|
||
|
||
- Public URL: `https://iwanttoheal.phenomrom.com`
|
||
- Host/container port: `4173`
|
||
- App directory: `/mnt/usbssds/apps/iwanttoheal-mmo/app`
|
||
|
||
Clone from the TrueNAS-local Gitea bare repository into the app directory, then
|
||
deploy `compose.yaml`. The expected source path is:
|
||
|
||
```text
|
||
/mnt/.ix-apps/app_mounts/gitea/data/git/repositories/phenom/i-want-to-heal-mmo.git
|
||
```
|
||
|
||
Compared with the old game configuration:
|
||
|
||
- use `corepack pnpm install --frozen-lockfile`, not `npm ci`;
|
||
- remove `npm run db:init` because this game has no server database;
|
||
- remove `COOKIE_SECURE`, `CORS_ORIGINS`, and `TRUST_PROXY`; the static Vite
|
||
preview server does not consume them;
|
||
- remove `/app/data`; offline saves live in each player's browser/Android WebView
|
||
storage, not on TrueNAS.
|
||
|
||
The existing reverse proxy can keep forwarding the public hostname to port
|
||
`4173`. Add server data and authentication environment variables only when an
|
||
actual sync API is introduced.
|
||
|
||
## Publish updates to Gitea
|
||
|
||
The repository target is:
|
||
|
||
```text
|
||
https://git.whoagland.com/phenom/i-want-to-heal-mmo.git
|
||
```
|
||
|
||
The Mac publisher is configured with the Gitea release token. `GITEA_TOKEN` can
|
||
optionally override it for one run. Publish from `main`:
|
||
|
||
```bash
|
||
pnpm publish:gitea -- --message "Describe the update"
|
||
```
|
||
|
||
The script installs locked dependencies, builds the web app, runs web and Android
|
||
checks, builds a debug APK, commits all project changes, pushes `main`, creates a
|
||
version tag and Gitea prerelease, and uploads the APK plus its SHA-256 file. It
|
||
uses `package.json` version unless that version is already tagged, then advances
|
||
the patch number. Pass `--version 0.2.0` to choose an explicit version.
|
||
|
||
If the publisher runs where TrueNAS paths are visible, it prefers a
|
||
fast-forward-only pull directly from TrueNAS-local Gitea storage. Otherwise it
|
||
prints the exact local clone/pull commands to run in the TrueNAS shell. The pull
|
||
refuses to run when the checkout still points at the old game's repository;
|
||
archive that checkout and clone the new repository first.
|
||
|
||
Preview checks without changing Git or TrueNAS:
|
||
|
||
```bash
|
||
pnpm publish:gitea -- --dry-run
|
||
```
|
||
|
||
Git push credentials still come from Git's credential manager. The configured
|
||
Gitea token handles release creation and APK uploads. Android signing keys remain
|
||
outside the repository.
|
||
|
||
## Controls
|
||
|
||
- `WASD` / left stick: move
|
||
- `Q` and `E` / D-pad: cycle party target
|
||
- `1`–`6`: cast Smite, Renew, Shield, Purify, Radiance, Flash Heal
|
||
- Gamepad: `X`, `Y`, `B`, `A`, `LB`, `RB` map to those abilities
|
||
- `M`: tactical map
|
||
- `I`: inventory and item tooltip
|
||
- `Enter` / Start: begin or reset encounter
|
||
|
||
Touch controls on lower display support party targeting, ability casting, map, and inventory.
|
||
|
||
## Prototype scope
|
||
|
||
- Five-member AI party with Disc Priest healer
|
||
- Animated Druid healer, Knight tank, Ranger, Rogue, and Mage party models
|
||
- One animated boss: Bulldrome, using the Bull model at 180% of its original prototype scale
|
||
- Telegraph, charge, 0.75-second knockdown, and return-to-tank behavior
|
||
- Three-charge cycle into a five-second stack marker and 300-damage shared pounce
|
||
- Tank pressure, party-wide Cinder Nova, dispellable Ember Brand
|
||
- Full cooldown, mana, healing-over-time, shield absorption, and victory/defeat simulation
|
||
- True display ratios: 1920×1080 top and 1240×1080 bottom
|
||
- Android layout targets: approximately 960×540 CSS pixels top and 620×540 CSS pixels bottom
|
||
- Lower-screen typography scales against its own container, never the main page viewport
|
||
|
||
Current Android build is an installable single-display test host. Shipping to both
|
||
physical Thor displays still needs distinct Android display contexts that project
|
||
one authoritative game state.
|