Initial Brogether prototype

This commit is contained in:
Kroonk
2026-05-23 00:38:59 +02:00
commit 536cbff829
9 changed files with 866 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
# Brotato Multiplayer Mod Research
Stand: 2026-05-22
## Kurzfazit
Brotato-Mods laufen ueber den Godot Mod Loader und werden als ZIPs ueber Steam Workshop verteilt. Fuer eine echte Online-Multiplayer-Mod ist das Workshop-Paket nur der Verteilungskanal; die eigentliche Schwierigkeit ist die Netzwerksynchronisation des Spiels.
Es gibt bereits eine Workshop-Mod namens "Brotatogether - Networked Multiplayer with Steam Lobbies". Sie nutzt Steam-basierte Lobbies, ist aber laut Workshop-Kommentaren und Beschreibung vor allem bei 3-4 Spielern und aktuellen DLC-/Patch-Staenden fehleranfaellig. Das ist trotzdem die wichtigste Referenz, weil sie beweist, dass Steam-Lobbies aus einer Brotato-Mod heraus grundsaetzlich machbar sind.
## Was man braucht
- Brotato auf Steam, weil die Steam-Version Workshop und ModLoader enthaelt.
- GodotSteam passend zur Brotato-Godot-Version. Der aktuelle Brotato-Modding-Guide verweist auf GodotSteam fuer Godot 3.6; aeltere Notizen nennen Godot 3.5. Die genaue Version sollte beim Decompile ueber GDRETools/Export-Log verifiziert werden.
- GDRETools, um das Brotato-Projekt lokal fuer Modding/Analyse zu recovern.
- Godot-Kenntnisse, insbesondere GDScript, Szenenbaum, Autoloads/Singletons und Resource-Dateien.
- Godot Mod Loader Wissen: `mods-unpacked`, `manifest.json`, `mod_main.gd`, Script Extensions, Hooks, Abhaengigkeiten.
- Steam-/GodotSteam-Netzwerkkenntnisse: Steam Matchmaking/Lobbies plus P2P/Networking Messages oder Sockets.
- Mindestens zwei Steam-Accounts/Installationen oder Testmaschinen fuer echte Netzwerk-Tests.
## Mod-Struktur
Entwicklung:
```text
res://
└── mods-unpacked
└── Brogether-Brogether
├── manifest.json
├── mod_main.gd
├── extensions/
└── translations/
```
Workshop/Distribution:
```text
Brogether-Brogether-0.1.0.zip/
├── .import/
└── mods-unpacked/
└── Brogether-Brogether/
├── manifest.json
├── mod_main.gd
└── extensions/
```
## Multiplayer-Architektur
Empfohlener erster Ansatz: Host-authoritative P2P ueber Steam.
- Ein Spieler erstellt eine Steam Lobby.
- Andere Spieler joinen ueber Steam Lobby/Friends.
- Der Host ist die einzige Wahrheit fuer Run-State, Gegner, Drops, Shop-Entscheidungen und RNG.
- Clients senden Inputs/Entscheidungen an den Host.
- Host sendet regelmaessige Snapshots oder Events zurueck.
Warum nicht sofort voll deterministisch/lockstep: Brotato hat viele zufalls- und framegetriebene Systeme. Ein kompletter Lockstep-Port waere wahrscheinlich spröde, solange wir nicht exakt wissen, welche Systeme deterministisch laufen.
## MVP-Vorschlag
1. Mod-Skeleton laedt in Brotato und zeigt einen Multiplayer-Button oder Debug-Hotkeys.
2. Steam-Lobby erstellen/joinen.
3. Text-/Ping-Nachrichten zwischen zwei Clients senden.
4. Run-Start zwischen zwei Clients synchronisieren.
5. Nur Spielerposition/Input synchronisieren, Gegner und Spielwelt bleiben host-controlled.
6. Shop-Phase synchronisieren.
7. Erst danach 3-4 Spieler, Reconnects, Crash Recovery und DLC-Kompatibilitaet.
## Hauptrisiken
- Brotato ist nicht fuer echten Online-Multiplayer gebaut; viele Systeme muessen per Hook/Extension kontrolliert werden.
- Steam Workshop erlaubt die Verteilung, gibt aber keine Multiplayer-API. Netzwerk laeuft ueber GodotSteam/Steamworks.
- Updates/DLC koennen Script-Extensions brechen.
- Save- und Cloud-Daten koennen bei instabilen Mods leiden; Tests sollten mit Backup-Saves laufen.
- 3-4 Spieler sind deutlich schwerer als 2 Spieler, weil Bandbreite, Shop-Sync, Disconnects und Edge Cases stark wachsen.
## Wichtige Quellen
- Brotato Wiki, Modding: https://brotato.wiki.spellsandguns.com/Modding
- Steam Community, Brotato Modding Guide: https://steamcommunity.com/sharedfiles/filedetails/?id=2931079751
- Godot Mod Loader Wiki: https://wiki.godotmodding.com/
- Godot Mod Loader, Mod Structure: https://wiki.godotmodding.com/guides/modding/mod_structure/
- Godot Mod Loader, Mod Files: https://wiki.godotmodding.com/guides/modding/mod_files/
- Godot Mod Loader, Workshop Uploader: https://wiki.godotmodding.com/guides/modding/tools/workshop_uploader/
- Steamworks Networking Docs: https://partner.steamgames.com/doc/features/multiplayer/networking
- Brotatogether GitHub: https://github.com/boardengineer/Brotatogether
- Brotatogether Workshop: https://steamcommunity.com/workshop/filedetails/?id=2985539742

81
docs/setup.md Normal file
View File

@@ -0,0 +1,81 @@
# Brogether Setup
Stand: 2026-05-22
## Aktueller Zustand
- Brotato Steam wurde lokal gefunden unter `C:\Program Files (x86)\Steam\steamapps\common\Brotato`.
- Die recovered Scripts melden Brotato `1.1.15.3` und ModLoader `6.3.0`.
- GDRETools wurde nach `.tools/gdretools` geladen.
- Godot Mod Loader v6.3.0 wurde nach `.tools/godot-mod-loader` geladen.
- Brotato- und DLC-Scripts wurden nach `recovered/` recovered.
- Das erste Mod-Skeleton liegt unter `src/mods-unpacked/Brogether-Brogether`.
## Lokalen Test-Build installieren
```powershell
.\scripts\install-local.ps1
```
Das erzeugt `dist/Brogether-Brogether-0.1.0.zip` und kopiert es fuer lokale Tests in einen bereits abonnierten Brotato-Workshop-Ordner:
```text
C:\Program Files (x86)\Steam\steamapps\workshop\content\1942280\<workshop-id>
```
Brotato laedt in der Steam-Version nur Workshop-Ordner, deren ID Steam als abonniert meldet. Darum wird das lokale ZIP fuer den ersten Test neben eine vorhandene abonnierte Workshop-Mod gelegt. Spaeter ersetzen wir das durch einen eigenen privaten/unlisted Brogether-Workshop-Eintrag.
Danach Brotato ueber Steam starten. Die Mod sollte im Mod-Menue auftauchen.
## Debug-Hotkeys im Spiel
- `F6`: oeffentliche Dev-Steam-Lobby erstellen
- `F7`: Brogether-Lobby suchen und beitreten
- `F9`: Lobby verlassen
- `F10`: Ping-Paket an den anderen Spieler senden
- `F11`: lokalen Loopback-Test ohne zweiten Client ausfuehren
Die Ausgabe landet im Godot/Brotato-Log. Das erste Ziel ist, auf zwei Steam-Clients folgende Meldungen zu sehen:
- `Steam ready`
- `created lobby`
- `joined lobby`
- `packet from ... handshake`
- `packet from ... ping`
- `packet from ... pong`
Ohne zweiten Steam-Client kann `F11` die Paketlogik lokal simulieren. Das ersetzt keinen echten Steam-P2P-Test, prueft aber, ob Handshake-, Ping- und Pong-Verarbeitung in Brogether funktionieren.
Zusaetzlich schreibt Brogether ein eigenes Debug-Log nach:
```text
C:\Users\tommi\AppData\Roaming\Brotato\brogether.log
```
## Naechster technischer Schritt
Wenn der P2P-Handshake zwischen zwei Steam-Clients funktioniert, erweitern wir die Mod um:
1. Hook in die Run-Erstellung. Erledigt: `extensions/main_ext.gd` meldet Run-Start.
2. Host/Client-Rollenmodell. Grundlegend vorhanden ueber Steam-Lobby-Owner.
3. Minimalen Player-Snapshot-Sync. Grundlegend vorhanden: Position, Leben, Dead-State alle 250 ms.
4. Erst danach Gegner-, Wave- und Shop-Sync.
## Aktueller Multiplayer-Stand
Brogether hat jetzt eine Script-Extension fuer `res://main.gd`. Beim Start einer Wave/Run schreibt sie:
- `run scene ready`
- `players spawned`
- periodische `host_snapshot`/`client_snapshot` Pakete, wenn eine Lobby mit Peer existiert
- `run scene exiting`
Die Snapshots enthalten derzeit nur das sichere Minimum: Spielerindex, Position, Leben, Max-Leben und Dead-State. Das ist noch kein spielbarer Remote-Player, aber die Transport- und Hook-Struktur ist damit vorbereitet.
Es gibt intern eine experimentelle Funktion zum Vorbereiten lokaler 2-Spieler-Coop-Slots. Sie ist bewusst nicht mehr an einen Hotkey gebunden, weil sie Brotatos lokale Coop-UI aktiviert und im normalen Menue stoeren kann. Wenn ein 2-Spieler-Run existiert, versucht Brogether eingehende Remote-Snapshots auf den zweiten lokalen Player anzuwenden.
## Editor-Hinweis
Fuer den ersten In-Game-Test ist noch kein Godot-Editor noetig: die Mod wird als ZIP gebaut und direkt von Brotato geladen.
Fuer spaetere Hook-Arbeit ist ein GodotSteam-Editor sinnvoll. Die aktuellen GodotSteam-3.x-Releases liefern auf GitHub/Codeberg vor allem Templates; wenn wir den Editor brauchen, sollten wir gezielt eine zu Brotatos recovered Engine-Version passende GodotSteam-Binary verwenden oder selbst bauen. Vanilla-Godot ist fuer das recovered Brotato-Projekt problematisch, weil der `Steam`-Singleton fehlt.