# VISAU-StageHand

Lokalna gra arcade online (WiFi), mocno inspirowana stylem PAC-MAN (labirynt, ruch po siatce, tempo), ale z własnym motywem: technicy eventowi pchający kejsy i zbierający litery `V I S A U`.

## Cechy projektu
- Backend: `Node.js` + `Express`
- Realtime: `WebSocket` (`ws`)
- Frontend:
  - ekran główny gry: `/`
  - kontroler telefonu: `/controller`
  - panel admina: `/admin`
- Tryb offline/local WiFi (bez internetu)
- Do 3 graczy jednocześnie
- Runda domyślnie 60 sekund
- Auto-start rundy po dołączeniu gracza
- Ranking rundy + trwały highscore lokalny (JSON)
- Proste hasło admina z konfiguracji
- Tryb attract/idle z URL i QR do dołączenia
- Fallback grafiki i dźwięku, jeśli własne assety nie są jeszcze podpięte

## Struktura projektu
```text
PACMAN-VISAU/
  config/
    config.json
  data/
    highscores.json
    settings.json
  public/
    assets/
      audio/
      images/
        board-bg.svg
        player-tech.svg
        pickup-a.svg
        pickup-i.svg
        pickup-s.svg
        pickup-u.svg
        pickup-v.svg
        wall-tile.svg
    admin.html
    admin.js
    controller.html
    controller.js
    index.html
    main.js
    styles.css
  src/
    config.js
    gameRoom.js
    map.js
    server.js
    storage.js
  .gitignore
  package.json
  README.md
```

## Konfiguracja
Plik: `config/config.json`

```json
{
  "port": 3000,
  "maxPlayers": 3,
  "roundDurationSec": 60,
  "adminPassword": "change-me",
  "autoStartDelaySec": 4,
  "roundCooldownSec": 8,
  "tickRate": 20,
  "moveIntervalMs": 130,
  "pickupCount": 70
}
```

Najważniejsze:
- `port` - port HTTP/WebSocket
- `roundDurationSec` - domyślny czas rundy
- `maxPlayers` - limit graczy (domyślnie 3)
- `adminPassword` - hasło panelu admina

Dodatkowo możesz nadpisywać envami: `PORT`, `ADMIN_PASSWORD`, `MAX_PLAYERS`, `ROUND_DURATION_SEC`.

## Uruchomienie lokalnie
W katalogu projektu:

```bash
npm install
npm run dev
```

albo produkcyjnie:

```bash
npm install
npm start
```

Po uruchomieniu:
- ekran główny: `http://<IP-serwera>:3000/`
- kontroler: `http://<IP-serwera>:3000/controller`
- admin: `http://<IP-serwera>:3000/admin`

Serwer wypisuje w konsoli wykryty lokalny URL kontrolera i admina.

## Uruchomienie na Raspberry Pi 5
1. Zainstaluj Node.js 20+ (np. przez NodeSource lub `nvm`).
2. Skopiuj projekt na Raspberry Pi.
3. Ustaw hasło admina w `config/config.json`.
4. Uruchom:

```bash
npm install
npm start
```

5. (Opcjonalnie) uruchamianie jako usługa `systemd`:

Przykładowy plik `/etc/systemd/system/visau-rush.service`:

```ini
[Unit]
Description=VISAU Case Rush
After=network.target

[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi/PACMAN-VISAU
ExecStart=/usr/bin/npm start
Restart=always
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target
```

Aktywacja:

```bash
sudo systemctl daemon-reload
sudo systemctl enable visau-rush
sudo systemctl start visau-rush
sudo systemctl status visau-rush
```

## WiFi lokalne (offline)
Docelowo Raspberry Pi może udostępniać własne SSID (AP). Gracze łączą się do tej sieci i otwierają lokalny adres serwera.

## Gdzie podmienić grafiki i dźwięki
Katalog: `public/assets/`

Grafiki (`public/assets/images`):
- `player-tech.png` lub `player-tech.svg` - technik + kejs
- `board-bg.png` lub `board-bg.svg` - tło planszy
- `wall-tile.png` lub `wall-tile.svg` - kafel ściany
- `pickup-v.png`, `pickup-i.png`, `pickup-s.png`, `pickup-a.png`, `pickup-u.png` (lub `.svg`) - literki

Dźwięki (`public/assets/audio`):
- `round-start.mp3`
- `pickup.mp3`
- `round-end.mp3`

Jeśli plików audio nie ma, front używa prostych sygnałów beep (fallback).

## Sterowanie i gameplay
- Telefon po logowaniu pokazuje tylko 4 kierunki (`lewo`, `prawo`, `góra`, `dół`).
- Ruch po siatce (jedno pole na krok).
- Kolizje ścian i stabilne rozwiązywanie konfliktów ruchu graczy.
- Pickup znika po podniesieniu przez pierwszego gracza.
- Po rundzie: ranking, zapis do highscore i automatyczne przejście do kolejnej rundy.

## Admin
Panel `/admin` pozwala:
- wystartować rundę ręcznie,
- zmienić czas rundy,
- zresetować highscores.

Autoryzacja: hasło z `config/config.json`.

## Dane lokalne
- `data/highscores.json` - top wyniki
- `data/settings.json` - runtime ustawienia (np. czas rundy)

## Plan dalszej rozbudowy
1. Dodać boty AI jako „wypełniacze” przy 1-2 graczach.
2. Dodać power-upy (boost, zamrożenie przeciwników, mnożnik punktów).
3. Przenieść persistence do SQLite (łatwiejsze raporty i statystyki sezonowe).
4. Dodać zestawy map + edytor mapy.
5. Dodać turniejowy tryb „best of N rounds” i eksport wyników CSV.
