No description
  • Python 98.3%
  • Shell 1.2%
  • NSIS 0.5%
Find a file
Christian Basler 366076b21f
All checks were successful
Build / linux-windows (push) Successful in 2m5s
Sonar / sonar (push) Successful in 53s
feature: Sonar-Analyse in der CI
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 06:28:10 +01:00
.forgejo/workflows feature: Sonar-Analyse in der CI 2026-11-04 06:28:10 +01:00
.idea ide: add some .idea config files 2026-10-30 19:49:32 +01:00
data/sounds fix: Aufgenommene Bell- und Platschgeräusche auch im Build 2026-11-03 07:22:27 +01:00
golden fix: springende Fische ruckeln nicht mehr 2026-11-04 06:18:09 +01:00
packaging feature: Pakete bei Tags als Forgejo-Release-Assets veröffentlichen 2026-10-30 07:14:22 +01:00
tools feature: Hund wählen: heller Golden, Flat Coated Retriever, Labrador 2026-11-03 21:21:41 +01:00
.gitignore fix: Selfies und Einstellungen im Ordner des Log-Files 2026-11-03 21:42:47 +01:00
main.py initial commit 2026-10-29 21:16:50 +01:00
README.md feature: Sonar-Analyse in der CI 2026-11-04 06:28:10 +01:00
requirements.txt initial commit 2026-10-29 21:16:50 +01:00
run.sh initial commit 2026-10-29 21:16:50 +01:00
setup.py fix: Aufgenommene Bell- und Platschgeräusche auch im Build 2026-11-03 07:22:27 +01:00
sonar-project.properties feature: Sonar-Analyse in der CI 2026-11-04 06:28:10 +01:00

Golden – Abenteuer auf der Insel

Ein kleines 3D-Erkundungsspiel: Du steuerst Goldie, einen Golden Retriever, über eine Insel. Ziel: alle 20 Knochen finden und möglichst viele Orte entdecken, auch auf den anderen Inseln. Alle Modelle und Sounds werden beim Start prozedural erzeugt. Es gibt keine externen Assets.

Läuft auf Linux, macOS und Windows (Python 3.9+ und Panda3D).

Starten

./run.sh                 # legt beim ersten Mal .venv an und installiert Panda3D
./run.sh --fullscreen
./run.sh --seed 1234     # eine bestimmte Welt laden
./run.sh --no-shadows    # ohne Echtzeitschatten (für schwache Grafikkarten)
./run.sh --hund flat     # Hund wählen: golden, golden-hell, flat, labrador-blond, labrador-schwarz, labrador-braun
./run.sh --allein        # ohne Mehrspieler (sonst finden sich Spiele im lokalen Netz von selbst)
./run.sh --join IP       # Mehrspieler: direkt dem Spiel auf diesem Rechner beitreten
./run.sh --host          # Mehrspieler: sofort selbst Gastgeber werden, ohne zu suchen
./run.sh --name Anna     # Name über dem Hund (sonst der Benutzername)
./run.sh --inseln 2      # nur 2 statt 4 weitere unbewohnte Inseln (0 = keine, für schwache Rechner)
./run.sh --biom Wüste    # Biom der eigenen Insel vorgeben: Wald, Bauernhof, Ruinen, Berge,
                         # Dschungel, Vulkan, Eisberg, Wüste (sonst bestimmt es die Weltnummer)

Bei jedem Start entsteht eine neue, zufällige Insel. Jede hat eines dieser Biome (die eigene Startinsel ist immer Wald-, Bauernhof-, Ruinen- oder Berginsel, die anderen findet man im Meer):

Biom Orte und Tiere
Waldinsel dichter Wald, alte Eiche, Waldlichtung mit Hexenring, Hochsitz; viele Rehe, Hasen und Singvögel
Bauernhof-Insel eher flach, Bauernhof mit Kuhkoppel und Schafweide, Windmühle, Obstgarten, wenige Bäume, viele Hasen
Ruineninsel Steinkreis auf einem Hügel, Burgruine, alter Brunnen, viele Bäume; Rehe, Hasen und verwilderte Schafe
Berginsel Berg mit Gipfel und Berghütte am Hang, Felsentor, zwei bis drei Seen mit Enten, viele Felsen, wenige Tiere
Dschungelinsel dichter Urwald mit Lianen und Palmen, Dschungeltempel (Stufen zum Hinaufspringen), Baumhaus, Wasserloch mit Seerosen; Affen, Papageien, viele Schmetterlinge
Vulkaninsel Vulkankegel mit glühendem Krater und Rauch (Kraterrand), Lavafeld mit glühenden Rissen, heiße Quelle mit Dampf, schwarzer Sand und Basalt, karge und abgestorbene Bäume; Eidechsen, Möwen
Eisberginsel Schnee und Eis, eisiger Gipfel, verschneite Tannen und Eiskristalle, Eisschollen im Meer (zum Daraufspringen), Iglu, gefrorener See mit Eisloch, Eistor; Pinguine, Möwen
Wüsteninsel Sanddünen und roter Fels, Kakteen und dürre Büsche, Oase mit Palmen, Pyramide mit Obelisken, Zeltlager mit Lagerfeuer; Kamele, Eidechsen, Geier

Rund um die eigene Insel liegen im Meer bis zu vier weitere, unbewohnte Inseln (ohne Hundehütte), möglichst mit anderen Biomen. Sie entstehen nach dem Start im Hintergrund, man kann hinüberschwimmen und dort Knochen sammeln (sie zählen für einen selbst) und Orte entdecken.

Bei jedem neu entdeckten Ort macht Goldie ein Selfie: ein Bild von ihr vor dem Ort, ohne HUD. Die Bilder landen im selben Ordner wie das Protokoll des Spiels (macOS ~/Documents/Golden, Windows und Linux im Benutzerordner für Programmdaten, Golden); dort liegt auch einstellungen.json mit dem gewählten Hund. Wie viele Orte es insgesamt gibt, verrät das Spiel nicht.

Etwa jede zweite Insel hat dazu einen Leuchtturm an der Küste. Wo ein Leuchtturm oder ein Bauernhof ist, gibt es auch einen Bootssteg am Meer mit Ruderboot. Die Hundehütte steht immer am Start. Küstenform, Wege, Pflanzen und Knochen liegen jedes Mal anders. Die Nummer der Welt steht oben links im Spiel (und in der Konsole). Mit --seed <Nummer> kommt man wieder in genau dieselbe Welt.

Oder manuell:

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python main.py

Unter Linux braucht es OpenGL-Treiber (Mesa reicht). Auf Debian/Ubuntu ggf. sudo apt install python3-venv libgl1.

Pakete bauen

Plattform Paket Gebaut von
Linux Golden-<v>-x86_64.AppImage Forgejo-CI (.forgejo/workflows/build.yml)
Windows Golden-<v>-Windows-Setup.exe (Installer), …-Windows-portable.zip Forgejo-CI
macOS Golden-<v>-macOS.dmg (Universal: Apple Silicon + Intel) lokal auf einem Mac
  • CI: Bei jedem Push auf main, bei Tags und bei Pull-Requests. Die Pakete liegen als Artefakte am Workflow-Lauf, je Paket eines (Forgejo liefert sie als ZIP aus). Der Job läuft auf einem Runner mit Label ubuntu-latest. Lokal lässt er sich mit sh packaging/build-linux-windows.sh auf einem Debian/Ubuntu-x86_64-System nachstellen.
  • Releases: Bei einem Tag (z. B. git tag v0.2.0 && git push origin v0.2.0) legt die CI zusätzlich ein Forgejo-Release an und hängt AppImage, Setup.exe und Portable-ZIP als einzelne Dateien an. Dafür nutzt packaging/publish-release.sh das automatische FORGEJO_TOKEN. Die Version im Dateinamen kommt aus setup.py, nicht aus dem Tag. Beides also gemeinsam erhöhen. Das macOS-DMG lässt sich danach von Hand am Release hochladen.
  • macOS: ./packaging/build-macos.sh baut das DMG nach dist/. Die App ist nur ad hoc signiert. Auf anderen Macs warnt Gatekeeper deshalb beim ersten Start (Rechtsklick → Öffnen). Ohne Warnung ginge es nur mit einer Apple-Developer-ID-Signatur und Notarisierung. packaging/fix_macho.py behebt dabei eine Eigenheit von Panda3D 1.10, durch die sich die Universal-App sonst nicht signieren lässt.
  • Die Version steht in setup.py (VERSION), das App-Icon erzeugt tools/make_icon.py.
  • Sonar: .forgejo/workflows/sonar.yml analysiert den Code bei jedem Push auf main und bei Pull-Requests mit SonarQube (Einstellungen in sonar-project.properties). Dafür braucht das Repository die Secrets SONAR_TOKEN und SONAR_HOST_URL.

Steuerung

Taste Aktion
WASD / Pfeiltasten Laufen (relativ zur Kamera)
Shift Rennen
Feststelltaste Dauerhaft rennen, solange sie eingerastet ist
Leertaste Springen, auch über Zäune und auf Felsen/Heuballen
B Bellen (verscheucht Schmetterlinge)
F Schnüffeln: zeigt eine Duftspur zum nächsten Knochen (danach eine Minute Pause)
C Sitz
P Pinkeln (ein Hinterbein heben)
M Karte ein/aus
Tab (halten) Liste der entdeckten Orte, nach Inseln geordnet
R Hund wechseln (Golden, heller Golden, Flat Coated Retriever, Labrador blond/schwarz/schokobraun); das Spiel merkt sich die Wahl
Maus Umsehen und Laufrichtung bestimmen (W läuft in Blickrichtung)
Q/E Kamera drehen
Mausrad Zoom
H Hilfe ein/aus
F3 FPS-Anzeige ein/aus
Esc Maus freigeben (Klick ins Fenster fängt sie wieder ein), nochmal Esc: Beenden

Game-Controller

Ist ein Gamepad angeschlossen (auch während des Spiels), lässt sich Goldie zusätzlich damit steuern:

Controller (Xbox-Belegung) Aktion
Linker Stick Laufen (halb ausgelenkt: langsamer)
Rechter Stick Kamera drehen und neigen
Rechter Trigger / L3 Rennen
A Springen
B Bellen
X Schnüffeln
Y Sitz
LB / RB Pinkeln / Karte ein/aus
Steuerkreuz hoch/runter: Zoom, links/rechts: Kamera drehen
Start / Select Hilfe / FPS-Anzeige

Goldie kann schwimmen, über den Steg laufen, den roten Ball anstupsen (im Sprung fliegt er hoch, auch über Zäune) und sich in seine Hütte legen. In der Koppel am Bauernhof stehen Kühe mit Glocken, auf der Schafweide grasen Schafe (die beim Bellen davonlaufen). In freier Wildbahn leben Hasen (fliehen im Zickzack) und Rehe, auf den Bergseen schwimmen quakende Enten, Singvögel kreisen in Schwärmen, Möwen segeln über der Küste, und ab und zu springt ein Fisch.

Mehrspieler im lokalen Netz

Jeder spielt auf seiner eigenen Insel weiter, die Inseln der anderen liegen daneben im Meer (gut 150 m Wasser dazwischen). Man kann hinüberschwimmen und die anderen besuchen:

Dafür muss niemand etwas drücken: Jedes Spiel sucht nach dem Start ein paar Sekunden im lokalen Netz nach einem anderen und tritt ihm bei; findet es keines, öffnet es selbst eines (oben links steht dann Offen im Netz (192.168.0.12), noch allein). Werden doch zwei Spiele gleichzeitig Gastgeber, merken sie das und das kleinere tritt dem größeren bei, seine Mitspieler kommen nach. Reißt die Verbindung ab, sucht das Spiel wieder. Die eigene Insel und alles bisher Gefundene bleiben, die Inseln der anderen tauchen auf; eine Meldung sagt, in welcher Richtung sie liegen. Findet die Suche das andere Spiel nicht (manche Netze lassen keinen Broadcast durch), hilft --join 192.168.0.12. Wer allein spielen will, startet mit --allein.

Die Inseln liegen bei allen gleich: die des Gastgebers in der Mitte, die weiteren im Osten, Westen, Norden und Süden. Bis zu 5 Spieler. Freie Plätze füllen unbewohnte Inseln, die aus der Weltnummer des Gastgebers entstehen, damit alle dieselben sehen; tritt ein Spieler bei, ersetzt seine Insel die unbewohnte auf seinem Platz. Neue Inseln entstehen im Hintergrund, das Spiel läuft dabei weiter. Jeder Hund trägt ein Halsband in eigener Farbe und hat seinen Namen über dem Kopf. Die Karte zeigt die Insel, auf der man gerade ist, mit allen Hunden darauf; wer woanders ist, erscheint als Pfeil in seiner Farbe am Kartenrand, der in seine Richtung zeigt.

Knochen darf man auch auf fremden Inseln aufsammeln, sie zählen dann für einen selbst und fehlen dem Besitzer (oben links: „Knochen: 3 gesammelt (deine Insel: 5 / 20)“). Orte entdeckt jeder für sich, auf allen Inseln (mit Selfie). Die Fahne auf einem Gipfel weht in der Halsbandfarbe dessen, der zuletzt oben war (anfangs ist sie weiß). Bellen hört man in der Nähe, und es verscheucht die Tiere auch bei den anderen. Ball und Tiere laufen in jedem Spiel für sich.

Technisch: UDP auf Port 47474; die Suche nutzt einen Broadcast. Beim ersten Öffnen fragt die Firewall (macOS, Windows) eventuell, ob eingehende Verbindungen erlaubt sind. Das muss man erlauben. Geht ein Spieler oder reißt die Verbindung ab, bleiben die Inseln liegen und man kann sie weiter besuchen; geht der Gastgeber, spielen die anderen allein weiter. Kommt ein Spieler zurück, wird seine Insel weiterverwendet, und was in der Zwischenzeit dort gefunden wurde, erfährt auch er. Alle brauchen denselben Stand des Spiels, das Spiel prüft das beim Beitreten. Baut ein Rechner eine fremde Insel anders, als sie beim Besitzer aussieht (andere Systeme rechnen minimal anders), steht oben links eine Warnung.

Aufbau

  • golden/terrain.py: Biom, zufällige Anordnung der Orte, Höhenfeld der Insel, Wege, Farben, Karte
  • golden/world.py: Himmel, Wasser, Vegetation und Tiere je Biom, Orte, Knochen, Ball, Schmetterlinge
  • golden/detmath.py: Mathematik, die auf jedem System bitgenau gleich rechnet (für die Welterzeugung)
  • golden/dog.py: Hundemodell je Rasse (Farben, Felllänge, Rute) und prozedurale Animation (Trab, Galopp, Schwimmen, Sitz …)
  • golden/settings.py: Ordner für Selfies und Einstellungen (z. B. der gewählte Hund)
  • golden/fur.py: Fell per Shell-Technik (mehrere Schichten mit Alpha-Test, nach hinten/unten gekämmt)
  • golden/animals.py: Schafe und Kühe (Modelle, Verhalten)
  • golden/wildlife.py: Wildtiere (Hasen, Rehe, Enten, Vögel, Möwen, Fische)
  • golden/shading.py: Beleuchtung und Echtzeitschatten (eigener GLSL-Shader, zwei Schattenkaskaden)
  • golden/effects.py: Spritzer, Wellenringe, Tropfen, Staub
  • golden/game.py: Steuerung, Kamera, HUD
  • golden/sounds.py: synthetisierte Soundeffekte
  • golden/net.py: Mehrspieler im lokalen Netz (Gastgeber, Beitritt, Suche per Broadcast)
  • golden/selfie.py: Selfie-Kamera (rendert außerhalb des Fensters) und Ordner für die Bilder
  • golden/islands.py: Inseln im Meer (eigene im Ursprung, fremde und unbewohnte daneben), Aufbau im Hintergrund
  • golden/remote.py: Hunde der Mitspieler (Namensschild, geglättete Bewegung)

Entwicklungs-Tools

Die Skripte in tools/ rendern Bilder, um Änderungen an Modell, Animation oder Licht zu prüfen, ohne selbst spielen zu müssen. Sie laufen mit dem Python aus .venv (vorher einmal ./run.sh ausführen). Bis auf animstrip.py verwenden alle die feste Welt Nr. 7, damit die Bilder vergleichbar bleiben. Kurz geht ein Fenster auf, danach beenden sie sich selbst.

.venv/bin/python tools/screenshot.py   <ordner>        # 8 Szenen: Start, Gesicht, Sitz, Rennen, See, Hof, Berg, Leuchtturm
.venv/bin/python tools/dogcloseup.py   <präfix>        # 5 Ansichten rund um den Hund
.venv/bin/python tools/headshots.py    <präfix>        # 5 Nahaufnahmen von Kopf und Rute
.venv/bin/python tools/animstrip.py    <datei.png>     # Bildstreifen: Schritt, Trab, Galopp, Schwimmen, Sprung
.venv/bin/python tools/shadowtest.py   <datei.png> [--no-shadows]   # Schattenbild schräg von oben
.venv/bin/python tools/make_icon.py                    # App-Icon nach packaging/icon-*.png
.venv/bin/python tools/showanimal.py   [tier] [--mode 1-4] [--angle GRAD] [--save <datei.png>]   # ein Tier anschauen
.venv/bin/python tools/playsound.py    [name…] [--volume V] [--rate R] [--save <ordner>]   # Soundeffekt anhören
Tool Ausgabe Wofür
screenshot.py <ordner>/01_spawn.png … 08_lighthouse.png (1280×720) Gesamteindruck nach Änderungen an Welt, Licht oder Hund; Orte, die es im Biom nicht gibt, ersetzt ein Blick nahe dem Start
dogcloseup.py <präfix>_0.png … _4.png (900×600) Fell, Proportionen und Farben des Hundes aus mehreren Winkeln
headshots.py <präfix>_0.png … _4.png (800×600) Kopf (Profil, Dreiviertel, Kiefer/Hals von unten) und Rute (seitlich, von hinten)
animstrip.py ein Bild, 6 Phasen pro Bewegung nebeneinander (2160×1300) Laufzyklen und Sprungbogen vergleichen; rendert offscreen, ohne Welt
shadowtest.py ein Bild (1280×720) Schattenqualität; mit --no-shadows zum Vergleich ohne Schatten
make_icon.py packaging/icon-512.png … icon-16.png (überschreibt sie) Icon nach Änderungen am Hundekopf neu erzeugen und mit einchecken; der Paketbau nimmt die eingecheckten Icons
showanimal.py Fenster; mit --save ein Bild (1100×750) Ein Tier allein auf leerer Wiese (Enten auf Wasser), wie im Spiel zusammengebaut. Ohne Namen listet es alle auf (schaf, braunvieh, fleckvieh, hase, reh, rehbock, erpel, ente, singvogel, möwe, goldie …). Im Fenster: 1–4 Bewegung (z. B. Grasen, Stehen, Gehen, Rennen), Maus ziehen/Rad für die Kamera, R dreht automatisch, Tab nächstes Tier, G Geräusch
playsound.py Ton (kein Fenster); mit --save <ordner>/<name>.wav Synthetisierte Klänge anhören, ohne zu spielen. Ohne Namen listet es alle auf (bark, trickle, cowbell …); mehrere Namen werden nacheinander gespielt. --volume/--rate wie im Spiel, z. B. trickle --volume 0.02

Der Präfix darf einen Pfad enthalten, z. B. tools/headshots.py /tmp/kopf erzeugt /tmp/kopf_0.png usw. Der Zielordner muss bereits existieren.

Attribution / Danksagung