Translate public UI and docs to English
This commit is contained in:
110
README.md
110
README.md
@@ -1,104 +1,104 @@
|
||||
# Brogether
|
||||
|
||||
Brogether ist ein experimentelles Brotato-Mod-Projekt mit dem Ziel, echten Online-Multiplayer fuer 2 Spieler vorzubereiten. Brotato selbst kann lokal im Coop gespielt werden und ueber Steam Remote Play geteilt werden; Brogether erforscht stattdessen eine native Steam-Lobby- und P2P-Basis.
|
||||
Brogether is an experimental Brotato mod project that prepares real online multiplayer for 2 players first. Brotato already supports local co-op and Steam Remote Play; Brogether explores native Steam lobby and P2P networking instead.
|
||||
|
||||
Der aktuelle Stand ist bewusst ein technischer Prototyp. Es ist noch keine fertige Multiplayer-Mod, aber die wichtigsten Grundlagen sind vorbereitet: Mod-Laden, Steam-Lobby-Erstellung, Debug-Logging, lokale Pakettests und erste Hooks in den Brotato-Run.
|
||||
This is a technical prototype, not a finished multiplayer mod. The current focus is mod loading, Steam lobby flow, debug logging, local packaging, lobby UI, and early hooks into Brotato runs.
|
||||
|
||||
## Was aktuell funktioniert
|
||||
## What Works Right Now
|
||||
|
||||
- Die Mod wird von Brotatos Godot Mod Loader geladen.
|
||||
- Steam wird ueber den im Spiel vorhandenen Steam-Singleton angesprochen.
|
||||
- Eine oeffentliche Dev-Steam-Lobby kann erstellt werden.
|
||||
- Basis-Pakete fuer Handshake, Ping und Pong sind implementiert.
|
||||
- Ein lokaler Loopback-Test simuliert Paketverkehr ohne zweiten Steam-Client.
|
||||
- Brotatos Run-Szene wird per Script-Extension beobachtet.
|
||||
- Run-Start, Spieler-Spawn und einfache Player-Snapshots werden geloggt bzw. fuer P2P-Versand vorbereitet.
|
||||
- Das Brogether-Modal ist standardmaessig versteckt und kann ueber das Hauptmenue oder `F5` geoeffnet werden.
|
||||
- Die UI enthaelt einen ersten Lobby-Browser, Lobby-Erstellung mit optionalem Passwort und einen Wartebereich mit Spielerkacheln.
|
||||
- Der Wartebereich hat Ready-Status und einen Fake-Peer-Modus fuer lokale Tests ohne zweiten Client.
|
||||
- The mod loads through Brotato's Godot Mod Loader.
|
||||
- Steam is accessed through the Steam singleton already available in the game.
|
||||
- Public development Steam lobbies can be created.
|
||||
- Basic handshake, ping, pong, and ready-state packets are implemented.
|
||||
- A local loopback test simulates packet flow without a second Steam client.
|
||||
- Brotato's run scene is observed through a script extension.
|
||||
- Run start, player spawn, and basic player snapshots are logged or prepared for P2P transfer.
|
||||
- The Brogether modal is hidden by default and opens from the main menu or with `F5`.
|
||||
- The UI includes a first lobby browser, lobby creation with optional password, and a waiting room with player cards.
|
||||
- The waiting room has ready states and a fake peer mode for local testing without a second client.
|
||||
|
||||
## Was noch nicht fertig ist
|
||||
## What Is Not Finished Yet
|
||||
|
||||
- Ein echter zweiter Steam-Client wurde noch nicht getestet.
|
||||
- Remote-Spieler werden noch nicht voll spielbar synchronisiert.
|
||||
- Shop-, Item-, Gegner-, Wave- und RNG-Synchronisation fehlen noch.
|
||||
- Die Snapshot-Anwendung auf einen zweiten lokalen Player ist nur experimentell vorbereitet.
|
||||
- A real second Steam client has not been tested yet.
|
||||
- Remote players are not fully playable or synchronized yet.
|
||||
- Shop, item, enemy, wave, and RNG synchronization are missing.
|
||||
- Applying remote snapshots to a second local player is only experimentally prepared.
|
||||
|
||||
## Projektstruktur
|
||||
## Project Structure
|
||||
|
||||
```text
|
||||
src/mods-unpacked/Brogether-Brogether/
|
||||
manifest.json Mod-Metadaten fuer Godot Mod Loader
|
||||
mod_main.gd Steam-Lobby, P2P-Pakete, Brogether-Modal, Logging
|
||||
extensions/main_ext.gd Hook in Brotatos Run-Szene
|
||||
extensions/main_menu_ext.gd Brogether-Menuepunkt im Hauptmenue
|
||||
manifest.json Godot Mod Loader metadata
|
||||
mod_main.gd Steam lobby, P2P packets, Brogether modal, logging
|
||||
extensions/main_ext.gd Hook into Brotato's run scene
|
||||
extensions/main_menu_ext.gd Brogether main menu button
|
||||
|
||||
scripts/
|
||||
package.ps1 Baut das Mod-ZIP
|
||||
install-local.ps1 Installiert das ZIP fuer lokale Brotato-Tests
|
||||
package.ps1 Builds the mod ZIP
|
||||
install-local.ps1 Installs the ZIP for local Brotato tests
|
||||
|
||||
docs/
|
||||
setup.md Setup- und Testnotizen
|
||||
setup.md Setup and test notes
|
||||
brotato-multiplayer-modding-research.md
|
||||
workshop-upload.md Schritt-fuer-Schritt Steam Workshop Upload
|
||||
workshop-upload.md Step-by-step Steam Workshop upload guide
|
||||
```
|
||||
|
||||
Nicht eingecheckt werden `.tools/`, `recovered/` und `dist/`. Diese Ordner enthalten lokale Tools, recovered Brotato-Dateien und gebaute ZIPs.
|
||||
`.tools/`, `recovered/`, and `dist/` are intentionally not committed. They contain local tools, recovered Brotato files, and built ZIPs.
|
||||
|
||||
## Lokaler Test
|
||||
## Local Test
|
||||
|
||||
Brotato laedt in der Steam-Version nur abonnierte Workshop-Ordner. Das Install-Skript legt das gebaute Brogether-ZIP deshalb fuer lokale Tests neben eine bereits abonnierte Brotato-Workshop-Mod.
|
||||
Brotato's Steam build only loads Workshop folders that Steam considers subscribed. The install script therefore places the built Brogether ZIP next to an already subscribed Brotato Workshop mod for local testing.
|
||||
|
||||
```powershell
|
||||
.\scripts\install-local.ps1
|
||||
```
|
||||
|
||||
Danach Brotato komplett neu starten.
|
||||
Then fully restart Brotato.
|
||||
|
||||
Brogether ist im Spiel standardmaessig unsichtbar. Im Hauptmenue gibt es einen neuen `BROGETHER`-Button; alternativ oeffnet `F5` das Brogether-Modal. Das Modal pausiert das Spiel wie Brotatos eigenes F8-Feedback-Fenster und kann mit `Escape`, `F5` oder dem Close-Button wieder geschlossen werden.
|
||||
Brogether stays hidden until opened. The main menu gets a new `BROGETHER` button; `F5` opens the same modal. The modal pauses the game like Brotato's own F8 feedback window and can be closed with `Escape`, `F5`, or the close button.
|
||||
|
||||
Im Modal gibt es jetzt zwei Bereiche:
|
||||
The modal currently has two main areas:
|
||||
|
||||
- Lobby-Browser: zeigt gefundene Brogether-Lobbys mit Name, Host, Spielerzahl und Passwortstatus.
|
||||
- Wartebereich: zeigt die Spieler in der aktuellen Lobby als Kacheln mit Steam-Namen, statischem Initialen-Avatar und Ready-Status.
|
||||
- Lobby Browser: shows discovered Brogether lobbies with name, host, player count, and password status.
|
||||
- Waiting Room: shows players in the current lobby as cards with Steam name, static initials avatar, and ready state.
|
||||
|
||||
## Debug-Tasten
|
||||
## Debug Hotkeys
|
||||
|
||||
```text
|
||||
F5 Brogether-Modal ein-/ausblenden
|
||||
F6 Steam-Lobby erstellen
|
||||
F7 Lobby suchen / joinen
|
||||
F9 Lobby verlassen
|
||||
F10 Ping senden
|
||||
F11 Lokalen Loopback-Test starten
|
||||
F5 Toggle Brogether modal
|
||||
F6 Create Steam lobby
|
||||
F7 Search / join lobby
|
||||
F9 Leave lobby
|
||||
F10 Send ping
|
||||
F11 Run local loopback test
|
||||
```
|
||||
|
||||
Das Brogether-Modal enthaelt Buttons fuer Host, Join, Leave und Ping. Es ist fuer die naechsten Zwei-Client-Tests gedacht und ersetzt die meisten Hotkey-Aktionen. Passwort-Lobbys sind aktuell eine Mod-seitige Zugangskontrolle: die Lobby bleibt sichtbar, der Join-Button prueft aber das Passwort, bevor Brogether beitritt.
|
||||
The Brogether modal contains buttons for Host, Join, Leave, and Ping. It is intended for the next two-client tests and replaces most hotkey actions. Password lobbies are currently a mod-side access check: the lobby stays visible, but Brogether checks the entered password before joining.
|
||||
|
||||
Fuer Tests ohne zweiten Steam-Client kann im Wartebereich `Add Fake` genutzt werden. Das fuegt einen lokalen Test-Peer hinzu, dessen Ready-Status mit `Fake Ready` umgeschaltet werden kann. Einen eigenen Brogether-Startbutton gibt es bewusst noch nicht; bis die echte Run-Synchronisation steht, startet man Brotato weiterhin ueber den normalen Spielablauf.
|
||||
For testing without a second Steam client, use `Add Fake` in the waiting room. This adds a local fake peer whose ready state can be toggled with `Fake Ready`. There is intentionally no Brogether start button yet; until real run synchronization exists, start Brotato through the normal game flow.
|
||||
|
||||
Brogether schreibt ein eigenes Log nach:
|
||||
Brogether writes its own log to:
|
||||
|
||||
```text
|
||||
C:\Users\tommi\AppData\Roaming\Brotato\brogether.log
|
||||
```
|
||||
|
||||
## Naechster sinnvoller Test
|
||||
## Next Useful Test
|
||||
|
||||
Sobald ein zweiter Steam-Client verfuegbar ist:
|
||||
Once a second Steam client is available:
|
||||
|
||||
1. Beide Clients mit derselben Brogether-Version starten.
|
||||
2. Host oeffnet `BROGETHER` im Hauptmenue oder drueckt `F5`.
|
||||
3. Host klickt `Host` oder drueckt `F6`.
|
||||
4. Client klickt `Join` oder drueckt `F7`.
|
||||
5. Mit `Ping` oder `F10` Ping/Pong testen.
|
||||
6. Einen Run starten und pruefen, ob `run_started`, `players_spawned` und Snapshot-Pakete auf beiden Seiten im Log erscheinen.
|
||||
1. Start both clients with the exact same Brogether version.
|
||||
2. Host opens `BROGETHER` from the main menu or presses `F5`.
|
||||
3. Host clicks `Host` or presses `F6`.
|
||||
4. Client clicks `Refresh`, selects the lobby, then clicks `Join`.
|
||||
5. Test ping/pong with `Ping` or `F10`.
|
||||
6. Start a Brotato run normally and check whether `run_started`, `players_spawned`, and snapshot packets appear in both logs.
|
||||
|
||||
Wenn das stabil laeuft, ist der naechste Entwicklungsschritt die echte Remote-Spielersteuerung auf Basis der Snapshot- und Input-Pakete.
|
||||
If that works reliably, the next development step is real remote player control based on snapshot and input packets.
|
||||
|
||||
## Steam Workshop Upload
|
||||
|
||||
Die einfache Upload-Anleitung liegt in:
|
||||
The simple upload guide is here:
|
||||
|
||||
```text
|
||||
docs/workshop-upload.md
|
||||
|
||||
@@ -1,48 +1,48 @@
|
||||
# Brogether Setup
|
||||
|
||||
Stand: 2026-05-23
|
||||
Status: 2026-05-23
|
||||
|
||||
## Aktueller Zustand
|
||||
## Current State
|
||||
|
||||
- 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`.
|
||||
- Brotato Steam was found locally at `C:\Program Files (x86)\Steam\steamapps\common\Brotato`.
|
||||
- Recovered scripts report Brotato `1.1.15.3` and ModLoader `6.3.0`.
|
||||
- GDRETools was downloaded to `.tools/gdretools`.
|
||||
- Godot Mod Loader v6.3.0 was downloaded to `.tools/godot-mod-loader`.
|
||||
- Brotato and DLC scripts were recovered to `recovered/`.
|
||||
- The mod source lives in `src/mods-unpacked/Brogether-Brogether`.
|
||||
|
||||
## Lokalen Test-Build installieren
|
||||
## Install A Local Test Build
|
||||
|
||||
```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:
|
||||
This creates `dist/Brogether-Brogether-0.1.0.zip` and copies it into an already subscribed Brotato Workshop folder for local testing:
|
||||
|
||||
```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.
|
||||
Brotato's Steam build only loads Workshop folders that Steam considers subscribed. That is why the local ZIP is placed next to an existing subscribed Workshop mod for the first tests. Later, this should be replaced by Brogether's own private or unlisted Workshop item.
|
||||
|
||||
Danach Brotato ueber Steam starten. Die Mod sollte im Mod-Menue auftauchen.
|
||||
Start Brotato through Steam afterwards. The mod should appear in the mod menu.
|
||||
|
||||
Brogether selbst bleibt danach unsichtbar, bis es geoeffnet wird. Im Hauptmenue fuegt die Mod einen `BROGETHER`-Button hinzu. Alternativ oeffnet `F5` dasselbe Modal. Das Modal verhaelt sich bewusst wie Brotatos F8-Feedback-Fenster: es pausiert, legt sich ueber das Spiel und kann mit `Escape`, `F5` oder `Close` geschlossen werden.
|
||||
Brogether stays hidden until opened. The mod adds a `BROGETHER` button to the main menu. Alternatively, `F5` opens the same modal. The modal intentionally behaves like Brotato's F8 feedback window: it pauses the game, overlays the screen, and can be closed with `Escape`, `F5`, or `Close`.
|
||||
|
||||
Die UI hat jetzt einen ersten Lobby-Browser. Dort kann man Lobbys suchen, eine Lobby mit optionalem Passwort erstellen und einer ausgewaehlten Lobby beitreten. Nach Host/Join wechselt Brogether in einen Wartebereich mit Steam-Namen und statischen Initialen-Avataren fuer die Lobby-Spieler.
|
||||
The UI currently has a first lobby browser. You can search for lobbies, create a lobby with an optional password, and join a selected lobby. After hosting or joining, Brogether switches to a waiting room with Steam names and static initials avatars for lobby players.
|
||||
|
||||
Ohne zweiten Client kann im Wartebereich `Add Fake` gedrueckt werden. Dadurch erscheint ein lokaler Test-Peer. Mit `Ready` und `Fake Ready` lassen sich beide Ready-Zustaende pruefen. Einen eigenen Brogether-Startbutton gibt es erst, wenn die echte Run-Synchronisation dran ist; bis dahin nutzt man Brotatos normalen Startablauf.
|
||||
Without a second client, press `Add Fake` in the waiting room. This adds a local test peer. Use `Ready` and `Fake Ready` to test both ready states. A dedicated Brogether start button will only come back once real run synchronization is implemented; until then, use Brotato's normal start flow.
|
||||
|
||||
## Debug-Hotkeys im Spiel
|
||||
## Debug Hotkeys
|
||||
|
||||
- `F5`: Brogether-Modal ein-/ausblenden
|
||||
- `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
|
||||
- `F5`: toggle Brogether modal
|
||||
- `F6`: create public development Steam lobby
|
||||
- `F7`: search and join Brogether lobby
|
||||
- `F9`: leave lobby
|
||||
- `F10`: send ping packet to the other player
|
||||
- `F11`: run local loopback test without a second client
|
||||
|
||||
Die Ausgabe landet im Godot/Brotato-Log. Das erste Ziel ist, auf zwei Steam-Clients folgende Meldungen zu sehen:
|
||||
Output goes to the Godot/Brotato log. The first two-client goal is to see these messages:
|
||||
|
||||
- `Steam ready`
|
||||
- `created lobby`
|
||||
@@ -51,38 +51,38 @@ Die Ausgabe landet im Godot/Brotato-Log. Das erste Ziel ist, auf zwei Steam-Clie
|
||||
- `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.
|
||||
Without a second Steam client, `F11` simulates packet flow locally. It does not replace a real Steam P2P test, but it checks whether handshake, ping, and pong handling work inside Brogether.
|
||||
|
||||
Zusaetzlich schreibt Brogether ein eigenes Debug-Log nach:
|
||||
Brogether also writes its own debug log:
|
||||
|
||||
```text
|
||||
C:\Users\tommi\AppData\Roaming\Brotato\brogether.log
|
||||
```
|
||||
|
||||
## Naechster technischer Schritt
|
||||
## Next Technical Step
|
||||
|
||||
Wenn der P2P-Handshake zwischen zwei Steam-Clients funktioniert, erweitern wir die Mod um:
|
||||
Once the P2P handshake works between two Steam clients, extend the mod with:
|
||||
|
||||
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.
|
||||
1. Hook into run creation. Done: `extensions/main_ext.gd` reports run start.
|
||||
2. Host/client role model. Basic version exists through Steam lobby owner.
|
||||
3. Minimal player snapshot sync. Basic version exists: position, health, dead state every 250 ms.
|
||||
4. Enemy, wave, and shop sync after that.
|
||||
|
||||
## Aktueller Multiplayer-Stand
|
||||
## Current Multiplayer State
|
||||
|
||||
Brogether hat jetzt eine Script-Extension fuer `res://main.gd`. Beim Start einer Wave/Run schreibt sie:
|
||||
Brogether has a script extension for `res://main.gd`. At the start of a wave/run, it logs:
|
||||
|
||||
- `run scene ready`
|
||||
- `players spawned`
|
||||
- periodische `host_snapshot`/`client_snapshot` Pakete, wenn eine Lobby mit Peer existiert
|
||||
- periodic `host_snapshot` / `client_snapshot` packets if a lobby with a peer exists
|
||||
- `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.
|
||||
Snapshots currently contain only the safe minimum: player index, position, health, max health, and dead state. This is not a playable remote player yet, but the transport and hook structure is prepared.
|
||||
|
||||
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.
|
||||
There is an internal experimental function to prepare local 2-player co-op slots. It is intentionally not bound to a hotkey anymore because it activates Brotato's local co-op UI and can disturb normal menus. If a 2-player run exists, Brogether tries to apply incoming remote snapshots to the second local player.
|
||||
|
||||
## Editor-Hinweis
|
||||
## Editor Note
|
||||
|
||||
Fuer den ersten In-Game-Test ist noch kein Godot-Editor noetig: die Mod wird als ZIP gebaut und direkt von Brotato geladen.
|
||||
No Godot editor is required for the first in-game test: the mod is built as a ZIP and loaded directly by Brotato.
|
||||
|
||||
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.
|
||||
For later hook work, a GodotSteam editor can be useful. Current GodotSteam 3.x releases mostly provide templates; if an editor is needed, use or build a GodotSteam binary that matches Brotato's recovered engine version. Vanilla Godot is problematic for the recovered Brotato project because the `Steam` singleton is missing.
|
||||
|
||||
@@ -1,103 +1,103 @@
|
||||
# Brogether Steam Workshop Upload
|
||||
|
||||
Stand: 2026-05-23
|
||||
Status: 2026-05-23
|
||||
|
||||
Diese Anleitung beschreibt den einfachen Upload-Weg fuer Brogether ueber Brotatos mitgeliefertes `GodotWorkshopUtility.exe`.
|
||||
This guide describes the simple upload path for Brogether using Brotato's bundled `GodotWorkshopUtility.exe`.
|
||||
|
||||
## Was du brauchst
|
||||
## Requirements
|
||||
|
||||
- Brotato auf Steam installiert.
|
||||
- Steam muss laufen und dein Account muss online sein.
|
||||
- Dein Steam-Account muss Brotato besitzen.
|
||||
- Der aktuelle Brogether-ZIP-Build:
|
||||
- Brotato installed through Steam.
|
||||
- Steam must be running and your account must be online.
|
||||
- Your Steam account must own Brotato.
|
||||
- The current Brogether ZIP build:
|
||||
|
||||
```powershell
|
||||
.\scripts\package.ps1
|
||||
```
|
||||
|
||||
Danach liegt die Datei hier:
|
||||
After that, the ZIP is here:
|
||||
|
||||
```text
|
||||
dist\Brogether-Brogether-0.1.0.zip
|
||||
```
|
||||
|
||||
- Optional, aber empfohlen: ein Workshop-Preview-Bild als PNG oder JPG. Am besten `512x512`, unter `1 MB`.
|
||||
- Fuer den ersten Upload brauchst du noch keine Workshop-ID. Steam erzeugt sie beim Upload.
|
||||
- Fuer spaetere Updates brauchst du die Workshop-ID aus der URL deines Workshop-Eintrags.
|
||||
- Optional but recommended: a Workshop preview image as PNG or JPG. `512x512` and below `1 MB` is a good target.
|
||||
- For the first upload, you do not need a Workshop ID. Steam creates it.
|
||||
- For later updates, you need the Workshop ID from your Workshop item URL.
|
||||
|
||||
## Wichtig Vor Dem Upload
|
||||
## Before Uploading
|
||||
|
||||
Brogether ist noch ein Prototyp. Fuer den ersten Workshop-Eintrag empfehle ich:
|
||||
Brogether is still a prototype. For the first Workshop item, the recommended settings are:
|
||||
|
||||
- Sichtbarkeit zuerst auf `Private` oder `Unlisted` lassen.
|
||||
- Titel klar als Test/Prototype markieren.
|
||||
- Beschreibung deutlich machen, dass echter Zwei-Spieler-Gameplay-Sync noch nicht fertig ist.
|
||||
- Nach dem Upload direkt die Workshop-ID notieren.
|
||||
- Keep visibility on `Private` or `Unlisted` first.
|
||||
- Mark the title clearly as a test/prototype.
|
||||
- Make the description clear that real two-player gameplay sync is not finished yet.
|
||||
- Note the Workshop ID immediately after upload.
|
||||
|
||||
## Schritt Fuer Schritt: Erster Upload
|
||||
## First Upload
|
||||
|
||||
1. Steam starten und online lassen.
|
||||
2. Brotato schliessen, falls es offen ist.
|
||||
3. Im Projektordner den ZIP bauen:
|
||||
1. Start Steam and stay online.
|
||||
2. Close Brotato if it is running.
|
||||
3. Build the ZIP from the project folder:
|
||||
|
||||
```powershell
|
||||
.\scripts\package.ps1
|
||||
```
|
||||
|
||||
4. Brotatos Workshop-Uploader starten:
|
||||
4. Start Brotato's Workshop uploader:
|
||||
|
||||
```text
|
||||
C:\Program Files (x86)\Steam\steamapps\common\Brotato\GodotWorkshopUtility.exe
|
||||
```
|
||||
|
||||
5. Im Uploader bei der Mod-Datei diesen ZIP auswaehlen:
|
||||
5. Select this ZIP as the mod file:
|
||||
|
||||
```text
|
||||
C:\Users\tommi\Documents\PotatoConnect\dist\Brogether-Brogether-0.1.0.zip
|
||||
```
|
||||
|
||||
6. Optional ein Preview-Bild auswaehlen. Wenn der Upload wegen des Bildes fehlschlaegt, erst einmal ohne Bild hochladen.
|
||||
7. Das Feld fuer die Workshop Item ID leer lassen.
|
||||
8. Upload starten und warten, bis der Uploader Erfolg meldet.
|
||||
9. Wenn Steam nach der Workshop Legal Agreement fragt, im Browser/Steam-Overlay akzeptieren.
|
||||
10. Den neuen Workshop-Eintrag in Steam oeffnen.
|
||||
11. Sichtbarkeit rechts im Workshop-Eintrag auf `Private`, `Unlisted` oder spaeter `Public` setzen.
|
||||
12. Die Workshop-ID aus der URL notieren. Beispiel:
|
||||
6. Optionally select a preview image. If the upload fails because of the image, try the first upload without one.
|
||||
7. Leave the Workshop Item ID field empty.
|
||||
8. Start the upload and wait for a success message.
|
||||
9. If Steam asks for the Workshop Legal Agreement, accept it in Steam or in your browser.
|
||||
10. Open the new Workshop item in Steam.
|
||||
11. Set visibility to `Private`, `Unlisted`, or later `Public`.
|
||||
12. Note the Workshop ID from the URL. Example:
|
||||
|
||||
```text
|
||||
https://steamcommunity.com/sharedfiles/filedetails/?id=1234567890
|
||||
```
|
||||
|
||||
Die ID waere hier:
|
||||
The ID would be:
|
||||
|
||||
```text
|
||||
1234567890
|
||||
```
|
||||
|
||||
## Schritt Fuer Schritt: Update Eines Bestehenden Workshop-Eintrags
|
||||
## Updating An Existing Workshop Item
|
||||
|
||||
1. ZIP neu bauen:
|
||||
1. Build the ZIP again:
|
||||
|
||||
```powershell
|
||||
.\scripts\package.ps1
|
||||
```
|
||||
|
||||
2. `GodotWorkshopUtility.exe` starten.
|
||||
3. Wieder `dist\Brogether-Brogether-0.1.0.zip` auswaehlen.
|
||||
4. Optional dasselbe Preview-Bild auswaehlen.
|
||||
5. Dieses Mal die bestehende Workshop-ID eintragen.
|
||||
6. Upload starten.
|
||||
7. Danach im Steam Workshop Titel, Beschreibung, Sichtbarkeit und Bilder pruefen.
|
||||
2. Start `GodotWorkshopUtility.exe`.
|
||||
3. Select `dist\Brogether-Brogether-0.1.0.zip` again.
|
||||
4. Optionally select the same preview image.
|
||||
5. This time, enter the existing Workshop ID.
|
||||
6. Start the upload.
|
||||
7. After uploading, check the Steam Workshop title, description, visibility, and images.
|
||||
|
||||
Hinweis: Der Godot Mod Loader Wiki-Hinweis sagt, dass der Titel bei Updates vom Uploader wieder ueberschrieben werden kann. Also nach jedem Upload kurz in Steam kontrollieren.
|
||||
Note: The Godot Mod Loader wiki mentions that the uploader can overwrite the title during updates. Check the Steam Workshop item after every upload.
|
||||
|
||||
## Vorschlag Fuer Workshop-Titel
|
||||
## Suggested Workshop Title
|
||||
|
||||
```text
|
||||
Brogether - Online Multiplayer Prototype
|
||||
```
|
||||
|
||||
## Vorschlag Fuer Workshop-Beschreibung
|
||||
## Suggested Workshop Description
|
||||
|
||||
```text
|
||||
Brogether is an experimental online multiplayer prototype for Brotato.
|
||||
@@ -118,25 +118,25 @@ Not finished yet:
|
||||
Use this only for testing with friends who know it is still experimental.
|
||||
```
|
||||
|
||||
## Was Tester Danach Machen
|
||||
## What Testers Need To Do
|
||||
|
||||
1. Steam Workshop-Eintrag abonnieren.
|
||||
2. Warten, bis Steam den Workshop-Download abgeschlossen hat.
|
||||
3. Brotato starten.
|
||||
4. Im Mod-Menue Brogether aktivieren, falls noetig.
|
||||
5. Brotato neu starten, wenn die Mod erst nach Neustart sauber geladen wird.
|
||||
6. Im Hauptmenue `BROGETHER` oeffnen.
|
||||
1. Subscribe to the Steam Workshop item.
|
||||
2. Wait until Steam finishes the Workshop download.
|
||||
3. Start Brotato.
|
||||
4. Enable Brogether in the mod menu if required.
|
||||
5. Restart Brotato if the mod only loads cleanly after restart.
|
||||
6. Open `BROGETHER` from the main menu.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
- Mod taucht nicht auf: Steam Workshop-Download abwarten, Brotato neu starten, Mod-Menue pruefen.
|
||||
- Upload findet Datei nicht: ZIP-Pfad pruefen und vorher `.\scripts\package.ps1` ausfuehren.
|
||||
- Upload mit Icon schlaegt fehl: Icon unter `1 MB` halten, am besten `512x512 PNG`, oder den ersten Upload ohne Icon testen.
|
||||
- Zugriff verweigert oder Item bleibt versteckt: Steam Workshop Legal Agreement akzeptieren.
|
||||
- Update erstellt neuen Eintrag: Beim Update muss die bestehende Workshop-ID eingetragen sein.
|
||||
- Logs fuer Upload/Download liegen laut Steamworks-Doku unter anderem in `Steam\logs\Workshop_log.txt` und `Steam\workshopbuilds\depot_build_<appid>.log`.
|
||||
- Mod does not appear: wait for the Steam Workshop download, restart Brotato, and check the mod menu.
|
||||
- Upload cannot find the file: check the ZIP path and run `.\scripts\package.ps1` first.
|
||||
- Upload fails with an icon: keep the icon below `1 MB`, preferably `512x512 PNG`, or test the first upload without an icon.
|
||||
- Access denied or item stays hidden: accept the Steam Workshop Legal Agreement.
|
||||
- Update creates a new item: enter the existing Workshop ID when updating.
|
||||
- Steam upload/download logs can be found in places such as `Steam\logs\Workshop_log.txt` and `Steam\workshopbuilds\depot_build_<appid>.log`.
|
||||
|
||||
## Quellen
|
||||
## Sources
|
||||
|
||||
- Godot Mod Loader Wiki: Steam Workshop Uploader: https://wiki.godotmodding.com/guides/modding/tools/workshop_uploader/
|
||||
- Godot Mod Loader Wiki: Distributing Mods: https://wiki.godotmodding.com/guides/modding/distributing_mods/
|
||||
|
||||
@@ -643,7 +643,7 @@ func _create_debug_panel() -> void:
|
||||
browser_column.add_child(browser_title)
|
||||
|
||||
var browser_hint: Label = Label.new()
|
||||
browser_hint.text = "Offene Brogether-Lobbys werden hier angezeigt."
|
||||
browser_hint.text = "Open Brogether lobbies appear here."
|
||||
browser_hint.autowrap = true
|
||||
browser_column.add_child(browser_hint)
|
||||
|
||||
@@ -657,7 +657,7 @@ func _create_debug_panel() -> void:
|
||||
scroll.add_child(lobby_list_container)
|
||||
|
||||
lobby_empty_label = Label.new()
|
||||
lobby_empty_label.text = "Noch keine Lobbys geladen."
|
||||
lobby_empty_label.text = "No lobbies loaded yet."
|
||||
lobby_empty_label.autowrap = true
|
||||
lobby_list_container.add_child(lobby_empty_label)
|
||||
|
||||
@@ -681,7 +681,7 @@ func _create_debug_panel() -> void:
|
||||
create_box.add_child(create_content)
|
||||
|
||||
var create_title: Label = Label.new()
|
||||
create_title.text = "LOBBY ERSTELLEN"
|
||||
create_title.text = "CREATE LOBBY"
|
||||
create_content.add_child(create_title)
|
||||
|
||||
lobby_name_input = LineEdit.new()
|
||||
@@ -690,11 +690,11 @@ func _create_debug_panel() -> void:
|
||||
create_content.add_child(lobby_name_input)
|
||||
|
||||
lobby_password_check = CheckBox.new()
|
||||
lobby_password_check.text = "Passwort verwenden"
|
||||
lobby_password_check.text = "Use password"
|
||||
create_content.add_child(lobby_password_check)
|
||||
|
||||
lobby_password_input = LineEdit.new()
|
||||
lobby_password_input.placeholder_text = "Passwort"
|
||||
lobby_password_input.placeholder_text = "Password"
|
||||
lobby_password_input.secret = true
|
||||
lobby_password_input.rect_min_size = Vector2(360, 34)
|
||||
create_content.add_child(lobby_password_input)
|
||||
@@ -715,17 +715,17 @@ func _create_debug_panel() -> void:
|
||||
join_box.add_child(join_content)
|
||||
|
||||
var join_title: Label = Label.new()
|
||||
join_title.text = "AUSGEWAEHLTE LOBBY"
|
||||
join_title.text = "SELECTED LOBBY"
|
||||
join_content.add_child(join_title)
|
||||
|
||||
selected_lobby_label = Label.new()
|
||||
selected_lobby_label.text = "Keine Lobby ausgewaehlt."
|
||||
selected_lobby_label.text = "No lobby selected."
|
||||
selected_lobby_label.autowrap = true
|
||||
selected_lobby_label.rect_min_size = Vector2(360, 58)
|
||||
join_content.add_child(selected_lobby_label)
|
||||
|
||||
join_password_input = LineEdit.new()
|
||||
join_password_input.placeholder_text = "Passwort, falls noetig"
|
||||
join_password_input.placeholder_text = "Password if required"
|
||||
join_password_input.secret = true
|
||||
join_password_input.rect_min_size = Vector2(360, 34)
|
||||
join_content.add_child(join_password_input)
|
||||
@@ -744,12 +744,12 @@ func _create_debug_panel() -> void:
|
||||
box.add_child(lobby_view)
|
||||
|
||||
lobby_title_label = Label.new()
|
||||
lobby_title_label.text = "WARTEBEREICH"
|
||||
lobby_title_label.text = "WAITING ROOM"
|
||||
lobby_title_label.add_color_override("font_color", Color(0.92, 0.96, 1.0, 1.0))
|
||||
lobby_view.add_child(lobby_title_label)
|
||||
|
||||
lobby_detail_label = Label.new()
|
||||
lobby_detail_label.text = "Noch nicht in einer Lobby."
|
||||
lobby_detail_label.text = "Not in a lobby yet."
|
||||
lobby_detail_label.autowrap = true
|
||||
lobby_view.add_child(lobby_detail_label)
|
||||
|
||||
@@ -894,7 +894,7 @@ func _update_lobby_browser() -> void:
|
||||
_clear_children(lobby_list_container)
|
||||
if available_lobbies.empty():
|
||||
lobby_empty_label = Label.new()
|
||||
lobby_empty_label.text = "Keine Brogether-Lobbys gefunden.\nErstelle eine neue Lobby oder druecke Refresh."
|
||||
lobby_empty_label.text = "No Brogether lobbies found.\nCreate a lobby or press Refresh."
|
||||
lobby_empty_label.autowrap = true
|
||||
lobby_empty_label.rect_min_size = Vector2(360, 80)
|
||||
lobby_list_container.add_child(lobby_empty_label)
|
||||
@@ -911,7 +911,7 @@ func _update_lobby_browser() -> void:
|
||||
|
||||
func _format_lobby_summary(summary: Dictionary) -> String:
|
||||
var lock_text := "PASSWORT" if bool(summary.get("has_password", false)) else "OFFEN"
|
||||
return "%s\n%s/%s Spieler | %s | Host: %s" % [
|
||||
return "%s\n%s/%s players | %s | Host: %s" % [
|
||||
str(summary.get("name", "Brogether Lobby")),
|
||||
str(summary.get("member_count", 0)),
|
||||
str(summary.get("max_members", MAX_LOBBY_MEMBERS)),
|
||||
@@ -930,10 +930,10 @@ func _update_selected_lobby_label() -> void:
|
||||
return
|
||||
var summary: Dictionary = _get_selected_lobby_summary()
|
||||
if summary.empty():
|
||||
selected_lobby_label.text = "Keine Lobby ausgewaehlt."
|
||||
selected_lobby_label.text = "No lobby selected."
|
||||
return
|
||||
var password_text := "Passwort noetig" if bool(summary.get("has_password", false)) else "Kein Passwort"
|
||||
selected_lobby_label.text = "%s\n%s/%s Spieler\n%s" % [
|
||||
var password_text := "Password required" if bool(summary.get("has_password", false)) else "No password"
|
||||
selected_lobby_label.text = "%s\n%s/%s players\n%s" % [
|
||||
str(summary.get("name", "Brogether Lobby")),
|
||||
str(summary.get("member_count", 0)),
|
||||
str(summary.get("max_members", MAX_LOBBY_MEMBERS)),
|
||||
@@ -955,16 +955,16 @@ func _update_lobby_room() -> void:
|
||||
_clear_children(lobby_members_container)
|
||||
if lobby_id == 0:
|
||||
if lobby_title_label != null:
|
||||
lobby_title_label.text = "WARTEBEREICH"
|
||||
lobby_title_label.text = "WAITING ROOM"
|
||||
if lobby_detail_label != null:
|
||||
lobby_detail_label.text = "Noch nicht in einer Lobby."
|
||||
lobby_detail_label.text = "Not in a lobby yet."
|
||||
return
|
||||
var lobby_name: String = _get_lobby_data(lobby_id, "name", "Brogether Lobby")
|
||||
var password_text := "mit Passwort" if _get_lobby_data(lobby_id, "has_password", "0") == "1" else "ohne Passwort"
|
||||
var password_text := "password protected" if _get_lobby_data(lobby_id, "has_password", "0") == "1" else "no password"
|
||||
if lobby_title_label != null:
|
||||
lobby_title_label.text = lobby_name.to_upper()
|
||||
if lobby_detail_label != null:
|
||||
lobby_detail_label.text = "Wartebereich %s | %s/%s Spieler | %s | %s" % [str(lobby_id), lobby_members.size(), MAX_LOBBY_MEMBERS, password_text, _lobby_ready_summary()]
|
||||
lobby_detail_label.text = "Waiting room %s | %s/%s players | %s | %s" % [str(lobby_id), lobby_members.size(), MAX_LOBBY_MEMBERS, password_text, _lobby_ready_summary()]
|
||||
for member in lobby_members:
|
||||
_add_member_card(member)
|
||||
var empty_slot_count: int = max(0, MAX_LOBBY_MEMBERS - lobby_members.size())
|
||||
@@ -1026,7 +1026,7 @@ func _add_empty_member_slot(_index: int) -> void:
|
||||
lobby_members_container.add_child(card)
|
||||
|
||||
var label: Label = Label.new()
|
||||
label.text = "Freier Platz"
|
||||
label.text = "Open slot"
|
||||
label.align = Label.ALIGN_CENTER
|
||||
label.valign = Label.VALIGN_CENTER
|
||||
label.rect_min_size = Vector2(360, 96)
|
||||
|
||||
Reference in New Issue
Block a user