# FRONTIER — Three Fronts

Ein eigenständiges taktisches 3D-Browser-Spiel, inspiriert vom gewünschten Drei-Fraktionen-/Control-Zone-/Cash-Loop. Keine Original-Assets, kein offizielles WARDOGS-Produkt.

## Schnellstart

Voraussetzung: **Node.js 22 oder neuer** und npm. Einmal die Abhängigkeiten installieren und den Browser-Build erzeugen:

```bash
npm ci
npm run build
npm start
```

Dann **http://localhost:3000** öffnen. Offline + Bots auswählen, Rufname, Team und Loadout wählen und einsetzen. Der Server wird für lokale Bot-Matches nicht verwendet; er liefert zunächst nur die Dateien aus.

Im gleichen Heimnetz auf der Xbox: **http://IP-DEINES-PC:3000** öffnen. Der PC und der Server müssen hierfür eingeschaltet bleiben; Port 3000 in der privaten Firewall erlauben. Für den dauerhaften Offline-Cache benötigt die Xbox-Version einen vertrauenswürdigen **HTTPS**-Ursprung. `localhost` gilt nur auf demselben Gerät als sichere Ausnahme.

Die fertig gebaute `dist/`-Version kann auf einem beliebigen statischen HTTPS-Host liegen. Alle Laufzeit-Abhängigkeiten sind gebündelt; keine CDN-Verbindung ist erforderlich. Der mitgelieferte Service Worker speichert HTML, CSS und JS nach der ersten vollständigen HTTPS-Nutzung. Warten, bis **OFFLINE-CACHE BEREIT** erscheint. Browser können Cache-Daten löschen; danach ist einmalig erneutes Laden nötig. Ein Doppelklick auf `index.html` über `file://` ist kein unterstützter Startweg.

## Online-Multiplayer

Der Node.js-/Socket.IO-Server ist eine separate Anwendung. Die veröffentlichte statische Vorschau betreibt **keinen dauerhaft laufenden Match-Server**. Starte den Server selbst oder hoste ihn auf einem Node-fähigen Server mit persistentem Datenträger.

1. `npm ci && npm run build && npm start` auf dem Server ausführen.
2. Für öffentliche Nutzung einen HTTPS-Reverse-Proxy mit WebSocket-Unterstützung vorschalten. Port 3000 dahinter betreiben.
3. Falls Client und Match-Server verschiedene Ursprünge haben, `ALLOWED_ORIGINS` setzen.
4. Im Spiel **ONLINE** wählen, die HTTPS-Server-URL eingeben und beitreten. Bei gemeinsam ausgeliefertem Client darf das Feld leer bleiben.
5. Freunde öffnen denselben Client/Server. Ohne Freunde ergänzen Bots das Gefecht.

Beispiel Linux/macOS:

```bash
PORT=3000 \
BOTS=23 \
DIFFICULTY=normal \
DATA_DIR=/var/lib/frontier \
ALLOWED_ORIGINS=https://dein-client.example \
npm start
```

Windows PowerShell:

```powershell
$env:PORT="3000"
$env:BOTS="23"
$env:DATA_DIR="C:\frontier-data"
npm start
```

`ALLOWED_ORIGINS` akzeptiert mehrere durch Kommas getrennte Ursprünge. Für einen öffentlichen Server explizit einschränken. Der Prozess hält ein Match, bis zu 32 menschliche Verbindungen und maximal 32 aktive Kampfteilnehmer bei den Standard-Botwerten. Bots werden ab dem Limit durch Menschen ersetzt. Mehrere Matches würden mehrere Prozesse beziehungsweise ein späteres Room-System benötigen.

## Steuerung

| Aktion | Xbox Controller | Maus/Tastatur |
|---|---|---|
| Bewegen / Fahrzeug beschleunigen und lenken | Linker Stick | WASD |
| Blickrichtung | Rechter Stick | Maus |
| Schießen | RT | Linksklick |
| Visieren | LT | Rechtsklick |
| Springen | A | Leertaste |
| Sprinten | Linken Stick gedrückt halten | Linke Umschalttaste |
| Nachladen | X | R |
| Einsteigen, aussteigen, wiederbeleben | Y | E |
| Medkit | LB | H |
| Sandbags bauen | RB | B |
| Team-Ping | D-Pad oben | Q |
| Menü | Menü-Taste | Escape / Menü-Button |
| Chat | Menü → Team-Chat | Enter |
| Menüs bedienen | D-Pad, A; links/rechts für Auswahl | Maus / Tab |

Controller wird über die Standard-Gamepad-API erkannt. Nach dem Öffnen einmal eine Controller-Taste drücken. Die Xbox muss Eingaben an die Webseite weitergeben; der jeweilige Edge-Modus und System-Shortcuts können dies beeinflussen. Mausfang wird nach einem Klick angefragt. Der erste Klick ohne Mausfang dient nur der Aktivierung. Rufname/Chat lassen sich mit der Bildschirmtastatur oder einer USB-Tastatur eingeben.

## Spielregeln

- **Lonestar** (blau), **Valkyra** (rot), **Manticore** (grün).
- Karst Valley: begehbares Areal von 920 × 920 Simulationsmetern, mit weitläufiger Bergkulisse. Zufälliges Ziel aus drei industriellen Zonen.
- Die runde Kontrollzone hat 210 Simulationsmeter Durchmesser. Das ist eine bewusst kompakte Gameplay-Skalierung, **keine physisch simulierte 2 × 2 km Zone**.
- Alle zwei Sekunden erhält das Team mit alleiniger zahlenmäßiger Mehrheit in der Zone einen Punkt. Unentschieden zählt nicht. 100 Punkte gewinnen.
- Jeder neue lokale oder serverseitige Geräte-Account startet mit **$10.000**. Offline- und Online-Bankkonten sind getrennt.
- Kaufen beim Spawn: Waffe, Rüstung, Medkits/Sandbags und optional Anforderung eines Team-Fahrzeugs. Bereits vorhandene Team-Fahrzeuge sind kostenlos benutzbar.
- Ein bestelltes Fahrzeug wird als verfügbares, unbesetztes Team-Fahrzeug an die Basis geholt. Sind alle Fahrzeuge des Typs besetzt, wird der Fahrzeugpreis erstattet.
- Tod kostet das aktuelle Loadout. Zehn Sekunden Wiederbelebungsfenster, danach drei Sekunden Respawn-Wartezeit. Ein Kamerad in vier Metern Entfernung kann mit Interaktion sofort wiederbeleben.
- Bei zu wenig Cash steht der kostenlose C-7-Karabiner zur Verfügung. Keine Softlock durch leeres Konto.
- Transporter: vier Plätze, vorgeschobener Respawn nahe der Zone. Kampffahrzeug: zwei Plätze, vereinfachte Bordwaffe. Freundliche Fahrzeuge sind gegen Friendly Fire geschützt.
- Medkits heilen 60 HP, Rüstung absorbiert einen Teil des Schadens. Begrenzte Magazine und Reserve, individuelle Nachladezeit und Feuerrate.
- Gebäude, Container, Felsen und errichtete Sandbags blockieren Bewegung und Schüsse. Barrikadenlimit: 90 pro Match.

| Aktion | Cash |
|---|---:|
| Eliminierung | $300 |
| Wiederbeleben | $250 |
| Im eigenen kontrollierenden Team in der Zone, pro Wertung | $35 |
| Passagier nach mindestens fünf Sekunden Fahrt in die Zone liefern | $100 |
| Match-Sieg | $1.500 |
| Match-Teilnahme bei Niederlage | $500 |

## Architektur

```text
client/
  index.html        Lobby, HUD, Menüs und Formulare
  style.css         Responsive Gestaltung und Controller-Fokus
  main.js           Spielzustand, UI, Offline-/Online-Verbindung, Profile
  render.js         Three.js-Welt, Modelle, LOD, Culling und Effekte
  input.js          Gamepad-API, Mausfang, Maus/Tastatur, Menü-Navigation
  audio.js          Lokal synthetisierte Waffen, Wind, Schritte, Motor
  sw.js             Offline-Cache für den gebündelten Client
server/
  index.js          Express, Socket.IO, autoritativer Match-Prozess, Profile
shared/
  config.js         Regeln, Waffen, Karte, deterministischer Karten-Seed
  simulation.js     Physik, Projektile, Wirtschaft, Zone, Fahrzeuge, Respawn
bots/
  brain.js          Zielauswahl, Navigation, Kampf und Fahrzeugsteuerung
tests/
  simulation.test.js  Regeln, Ballistik, Cash, Bots, Fahrzeuge
  network.test.js     Echte Socket-Verbindungen, Autorität, Persistenz
build.mjs            Reproduzierbarer Client-Build mit esbuild
package-lock.json    Fixierter Abhängigkeitsstand
```

### Simulation und Ballistik

Offline läuft `Simulation` im Client, online exakt dieselbe Klasse im Server. Simulation mit 30 Hz, Server-Snapshots mit etwa 20 Hz. Der Client sendet **Eingaben**, keine vertrauenswürdigen Positionen, Treffer, Käufe oder Kontostände. Der Server begrenzt Eingabewerte, Feuerraten, Nachladen, Käufe, Bewegung und Nachrichtengrößen. Inaktive Netzwerkeingaben laufen nach 300 ms aus.

Projektile besitzen Flugzeit, Geschwindigkeit und Schwerkraft. Pro Simulationsschritt wird das ganze zurückgelegte Segment gegen Hindernisse und vereinfachte Körper-Kugeln geprüft; das reduziert Durchtunneln. Das ist vereinfachte Spielballistik, keine vollständige realistische Waffenphysik. Es gibt weder Headshot-Zonen noch Materialdurchschläge.

Die Darstellung glättet Positionen zwischen Snapshots. Ein maximal 150 ms langer Positionsrückblick auf Basis serverseitig gemessener RTT kompensiert einen Teil der Latenz bei Infanterietreffern. **Kein vollständiges Prediction-/Reconciliation-System**, keine Rückrechnung historischer Fahrzeuge oder zerstörbarer Welten. Bei hohen Pings wird sich die Online-Steuerung verzögerter anfühlen.

### Bots

Bots kaufen beim Spawn ein Loadout aus ihrem Konto, priorisieren die Zone, suchen sichtbare Gegner, schießen und laden nach. Bei niedrigen HP suchen sie nahe Deckung auf. Sie heilen, beleben Kameraden wieder und nutzen Team-Fahrzeuge. Navigation verwendet Hindernis-Vorausschau und Ausweichlenkung. Die drei Schwierigkeitsgrade verändern die Zielstreuung. Das ist eine einfache taktische KI **ohne Navmesh/A*-Wegfindung**; komplexe Engstellen und Fahrmanöver können sie noch festhalten.

### Profile und Speicherung

- Offline: Browser-`localStorage`, automatische Speicherung bei Cash-Änderungen. Lokal manipulierbar; kein Schutz vor Änderungen über Entwicklerwerkzeuge.
- Online: Server erstellt ein zufälliges 24-Byte-Geräte-Token. Browser speichert das Token, Server nur dessen SHA-256-Hash mit dem Profil. Wiederverbindung stellt das Serverkonto wieder her. Kein Passwort-Login, keine E-Mail-Wiederherstellung und kein geräteübergreifendes Konto.
- Serverdaten: `DATA_DIR/profiles.json`, atomarer Austausch über temporäre Datei. Regelmäßiges Speichern und zusätzlich Käufe, Verbindungsende, SIGINT/SIGTERM. Bei hartem Prozessabbruch können zuletzt verdiente Beträge bis zum nächsten Speichern verloren gehen.
- Datenverzeichnis sichern. Für einen öffentlichen Produktionsbetrieb sind Datenbank, Account-Wiederherstellung, Moderation, belastbare Rate-Limits und Betriebsschutz weitere Arbeit.

### Rendering und Audio

Prozedurale Industriearchitektur, offene Fabriken, Container, Silos, Kran, Straßen, Bergsilhouetten und Vegetation. Instancing für wiederholte statische Geometrie. Three.js-Frustum-Culling, entfernungsabhängige Detailreduktion bei Soldaten und konservative Drei-Punkt-Sichttests gegen Fabrikwände für verdeckte Gegner. Diese Occlusion-Lösung ist kein GPU-Hi-Z-System. Schatten sind abschaltbar. Materialien sind bewusst einfach; keine hochauflösenden PBR-Texturpakete oder Motion-Capture-Animationen.

Web Audio erzeugt Sounds lokal. Kein externes Audio-Paket, kein Voice-Chat. Team-/Gesamtchat online; Team-Pings in beiden Modi. Offline-Chat ist ein lokales Log und keine Bot-Konversation.

## Xbox-Optimierung und Prüfgrenzen

1. Mit **Performance** und **11 Bots** beginnen, dann Balanced/23 testen.
2. Browser-Hardwarebeschleunigung/WebGL2 und Gamepad-Weitergabe prüfen. Keine parallelen ressourcenintensiven Tabs.
3. Performance reduziert Render-Pixelratio auf 0,8 und deaktiviert Schatten. Balanced begrenzt auf 1,1; High auf maximal 1,5.
4. FPS-Zähler im HUD beobachten: Ziel 60 FPS, **keine auf Xbox gemessene Garantie**.
5. Die skalierte Karte und einfachen Kollisionsformen sind Absicht. 32 Spieler sind das implementierte Verbindungslimit, **kein Nachweis stabiler 60 FPS bei 32 entfernten echten Spielern**.
6. Online möglichst Ethernet, niedrige RTT und regionalen Server verwenden.

Dieses Projekt ist ein vollständiger ausführbarer **Prototyp/Vertical Slice**, keine AAA-Produktion. Es gibt einen spielbaren Gameplay-Loop und zusammenhängenden Client-/Server-Code. Die Produktionsqualität eines kommerziellen WARDOGS-Titels, anspruchsvolle Animationen, ausgereifte Fahrphysik und umfangreiche Netzwerk-Härtung werden damit nicht behauptet.

## Tests

```bash
npm test
npm run build
```

Tests prüfen Kaufregeln, kostenlosen Fallback, Mehrheiten und Gleichstände, Siegprämien, Bewegung/Kollision, Nachladen, Team-Schutz, Treffer, Wiederbelebung, Fahrzeuge, Barrikaden, eine zweiminütige Bot-Simulation sowie echte Socket.IO-Clients und Wiederverbindung. Visuelle Browser-QA, echte Xbox-Controller-Hardware, Xbox-FPS und WAN-Last müssen separat getestet werden.

## Quellen und Lizenzen

- Three.js (MIT): https://threejs.org/docs/pages/InstancedMesh.html
- Socket.IO (MIT): https://socket.io/docs/v4/server-options/
- express (MIT), esbuild (MIT). Lizenztexte liegen in den installierten Paketen. Der esbuild-Build erhält erforderliche Lizenzkommentare in `game.js.LEGAL.txt`.
- Eigene prozedurale Spielinhalte und Originalcode. Keine übernommenen WARDOGS-Modelle, Karten, Logos oder Audiodateien.
