127 lines
4.8 KiB
Markdown
127 lines
4.8 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
|
||
|
||
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/app`
|
||
|
||
Clone the repository into the app directory, then deploy `compose.yaml`. 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
|
||
```
|
||
|
||
Create a Gitea access token with repository write permission, expose it only for
|
||
the publishing process, then publish from `main`:
|
||
|
||
```bash
|
||
export GITEA_TOKEN="..."
|
||
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 TrueNAS app directory is mounted locally, publishing also performs a
|
||
fast-forward-only pull. Otherwise it prints the clone/pull command to run on
|
||
TrueNAS before restarting the app. The pull refuses to run when the TrueNAS
|
||
checkout still points at the old game's repository; move or 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. Gitea release API
|
||
credentials come from `GITEA_TOKEN`. Never store access tokens or Android signing
|
||
keys in this 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.
|