You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.8 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# AutoHero
Isometric idle/incremental RPG for Telegram Mini Apps.
- **Backend**: Go — server-authoritative combat, REST + WebSocket APIs
- **Frontend**: React + TypeScript + PixiJS — isometric rendering, procedural endless map
- **Database**: PostgreSQL (primary) + Redis (caching/sessions)
- **Platform**: Telegram Mini Apps (`window.Telegram.WebApp` SDK)
## Game Features
- **Endless procedural world** — terrain, road, trees, bushes, and rocks generated on the fly
- **Semi-random hero movement** — wanders with heading drift, steering noise, and rest pauses
- **Server-authoritative encounters** — enemies spawn only from backend commands
- **Phase-based XP progression** — early levels fast, mid balanced, late slow
- **Band-based enemy scaling** — enemies scale within their level band with gentle overcap
- **Auto-equip loot** — drops auto-equip if 3%+ better, otherwise auto-sell
- **Buff system** — 8 buffs with cooldowns, persisted to database
- **Inventory HUD** — shows equipped weapon, armor (with rarity colors), and gold
- **Offline progression** — uses the same enemy/reward pipeline as online play
## Prerequisites
- Docker + Docker Compose
- Node.js 20+ and npm (for local frontend development)
- Go 1.23+ (for running backend outside Docker)
## Environment setup
1. Copy env template:
```bash
cp .env.example .env
```
2. Set at least:
- `ADMIN_BASIC_AUTH_USERNAME`
- `ADMIN_BASIC_AUTH_PASSWORD`
3. Optional:
- `ADMIN_BASIC_AUTH_REALM` (default: `AutoHero Admin`)
- `BOT_TOKEN` (needed when you enable Telegram auth middleware)
## Run with Docker (recommended)
Start everything:
```bash
docker compose up -d --build
```
Stop:
```bash
docker compose down
```
View logs:
```bash
docker compose logs -f
```
### Database migrations (existing volumes)
`docker-entrypoint-initdb.d` only runs SQL on **first** Postgres data directory init. After pulling new code, apply incremental migrations:
```bash
make migrate
```
Or: `sh scripts/migrate.sh` (Git Bash / macOS / Linux), or `powershell -File scripts/migrate.ps1` on Windows.
By default this **skips** `000001_*` (bootstrap + seed `INSERT`s; re-running breaks duplicates). Fresh Compose volumes still get `000001` from initdb. For an **empty** DB without that hook: `make migrate-bootstrap`, or `MIGRATE_INCLUDE_BOOTSTRAP=1 sh scripts/migrate.sh`, or `powershell -File scripts/migrate.ps1 -Bootstrap`.
Default URLs:
- Backend: `http://localhost:8080`
- Frontend: `http://localhost:3001` (HTTP), `https://localhost:3000` (HTTPS)
## Run locally (split mode)
1. Start dependencies only:
```bash
docker compose up -d postgres redis
```
2. Run backend:
```bash
cd backend
go run ./cmd/server
```
3. Run frontend in another terminal:
```bash
cd frontend
npm install
npm run dev
```
Frontend dev server runs at `http://localhost:5173` and proxies `/api` + `/ws` to backend `:8080`.
## Backend admin endpoints: Basic Auth
All backend endpoints under `/admin` require HTTP Basic Auth.
If username or password is missing, admin requests are rejected with `401 Unauthorized`.
### Admin auth quick check
Request without credentials (expected `401 Unauthorized`):
```bash
curl -i http://localhost:8080/admin/info
```
Authenticated request:
```bash
curl -i -u "$ADMIN_BASIC_AUTH_USERNAME:$ADMIN_BASIC_AUTH_PASSWORD" \
http://localhost:8080/admin/info
```
## Smoke tests
Backend health:
```bash
curl -i http://localhost:8080/health
```
Frontend dev server:
```bash
curl -i http://localhost:3000
```
Run backend tests:
```bash
cd backend
go test -race ./...
```
Run frontend lint/build:
```bash
cd frontend
npm run lint
npm run build
```
## Balance Overview
**XP curve (phase-based, v3 — bases ×10 vs v2):**
- L19: `180 × 1.28^(L-1)`
- L1029: `1450 × 1.15^(L-10)`
- L30+: `23000 × 1.10^(L-30)`
**Stat growth (v3):** MaxHP +1+Con/6 every 10th level; Attack/Defense +1 every 30th; Str +1 every 40th; Con +1 every 50th; Agi +1 every 60th; Luck +1 every 100th.
| Level | XP to Next | MaxHP | Attack | Defense | Str | Con | Agi | Luck | AttackPower | DefensePower | AttackSpeed |
|------:|-----------:|------:|-------:|--------:|----:|----:|----:|-----:|------------:|-------------:|------------:|
| 1 | 180 | 100 | 10 | 5 | 1 | 1 | 1 | 1 | 12 | 6 | 1.03 |
| 5 | 483 | 100 | 10 | 5 | 1 | 1 | 1 | 1 | 12 | 6 | 1.03 |
| 10 | 1,450 | 101 | 10 | 5 | 1 | 1 | 1 | 1 | 12 | 6 | 1.03 |
| 20 | 5,866 | 102 | 10 | 5 | 1 | 1 | 1 | 1 | 12 | 6 | 1.03 |
| 30 | 23,000 | 103 | 11 | 6 | 1 | 1 | 1 | 1 | 13 | 7 | 1.03 |
See `docs/specification.md` for full design details.