# 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):** - L1–9: `180 × 1.28^(L-1)` - L10–29: `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.