BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Ein Fantasy-Quartett im Browser mit taktischem Kniff – gegen den Computer (Leicht/Normal/Schwer) oder zu zweit online an zwei Geräten. Keine Installation nötig – index.html im Browser öffnen, oder:查看完整 README ↗
Ein Fantasy-Quartett im Browser mit taktischem Kniff – gegen den Computer (Leicht/Normal/Schwer) oder zu zweit online an zwei Geräten.
Keine Installation nötig – index.html im Browser öffnen, oder:
python3 -m http.server 8765 # dann http://localhost:8765
Als App und offline: Über HTTPS (z. B. GitHub Pages) lässt sich das Spiel auf den Homescreen legen
(Android/Chrome: „App installieren“, iPhone: Teilen → „Zum Home-Bildschirm“). Nach dem ersten Besuch hält ein
Service Worker (sw.js) alle Dateien bereit – das Spiel startet dann sofort und läuft auch ohne Netz, nur der
Online-Modus braucht natürlich eine Verbindung. Die Cache-Version aus index.html gilt auch für den Service Worker:
Hochzählen genügt, dann lädt er beim nächsten Besuch alles neu. Auf localhost ist er nur mit ?sw in der Adresse
aktiv, damit beim Entwickeln keine alten Dateien aus dem Cache kommen.
Direkt von Browser zu Browser (WebRTC), ohne eigenen Server. Wer „Spiel eröffnen“ wählt, bekommt einen
Einladungslink, einen QR-Code und einen kurzen Raumcode (z. B. K7M-Q2P). Der Mitspieler tippt
auf den Link, scannt den QR-Code mit der Handykamera oder gibt den Code unter „Beitreten“ ein – fertig.
Zusammengeführt werden die beiden über öffentliche Nostr-Relays (Bibliothek Trystero,
lokal in js/vendor/). Die Relays sehen nur verschlüsselte Verbindungsdaten, das Spiel selbst läuft direkt
zwischen den Geräten; ein öffentlicher STUN-Server hilft beim Finden der Adressen. Die Seite muss über HTTPS
oder localhost laufen (z. B. GitHub Pages). In sehr strengen Netzen (manche Mobilfunkanbieter) kommt keine
Direktverbindung zustande – dann hilft ein WLAN.
Notlösung ohne Relays: „Klappt nicht? Ohne Vermittlung verbinden“ – dann tauschen die Spieler zwei lange Codes von Hand aus.
Beide Geräte rechnen dieselbe Partie mit demselben Startwert (der Gast spiegelverkehrt), übers Netz gehen
nur die Züge. Beide müssen dieselbe Spielversion geladen haben (geprüft wird die Cache-Version aus index.html);
nach jedem Duell vergleichen beide eine Prüfsumme des Spielstands, damit Abweichungen sofort auffallen.
Reißt die Verbindung mitten in der Partie ab (Handy gesperrt, kurz kein Netz), warten beide eine Minute und
suchen sich über den Raum neu; die verpassten Züge werden dann nachgeschickt. Bei den Codes von Hand geht das nicht.
Gedacht ist der Online-Modus für Partien unter Freunden: Beide Geräte kennen den ganzen Spielstand, ein
veränderter Browser könnte also die gegnerische Hand auslesen.
Lässt der Gegner länger als 30 Sekunden auf seinen Zug warten, zeigt ein Zähler das an; nach zwei Minuten
kann man die Partie dort direkt verlassen. Gezogen wird nie für ihn.
1–3 Karte wählen, H Schlachtruf, Enter ausspielen/weiter, Z Karte groß zeigen, Esc Fenster schließen;
mit Tab lassen sich die Handkarten ansteuern, Leertaste wählt.| Datei | Inhalt |
|---|---|
sw.js, manifest.webmanifest | Service Worker (offline, schneller Start) und App-Beschreibung zum Installieren; Icons in art/icons/ (aus dem Wappen der Kartenrückseite) |
js/cards.js | Völker, Karten und Schlachtfelder (hier lässt sich alles balancen) |
js/engine.js | Regeln und Spielzustand, ohne DOM (läuft auch in Node) |
js/net.js | Online-Verbindung: Raum über Nostr-Relays (Link, QR, Raumcode) oder Codes von Hand, WebRTC-Datenkanal |
js/vendor/ | Trystero und QR-Code-Generator (MIT, siehe LIZENZ.md), werden erst in der Online-Lobby geladen |
js/ai.js | Computergegner: Siegchance × Wert der Beute gegen Verlustrisiko; „Schwer“ zählt Karten und rechnet mit der wahrscheinlichen Gegnerkarte |
js/audio.js | Soundeffekte und Hintergrundmusik, live mit der Web-Audio-API erzeugt (keine Audiodateien) |
js/ui.js | Menü, Rundenablauf, Karten, Animationen, Fenster; ruckelt es, schaltet watchFrames die Bildeffekte stufenweise ab. Teilt sich mit den folgenden Dateien das Objekt CG.UI (dort UI.s = aktueller Spielstand) |
js/ui-duel.js | Duell zum Mitverfolgen: Schritte, hochzählende Werte, automatisches „Weiter“ |
js/ui-input.js | Maus, Tastatur und Touch im Spiel, Spielmenü |
js/ui-online.js | Online-Partie: Züge, Prüfsummen, Abrisse, Revanche, Lobby |
js/art-fx.js | ART_FX legt die bewegten Bildeffekte je Karte fest (Glut, Funken, Leuchten, Nebel …) |
art/src/**/*.svg | Handgezeichnete SVG-Illustrationen (32 Helden, 14 Schlachtfelder, Kartenrückseite) – die Quellen |
art/src/textures/*.webp | Graue Strukturkarten (Stein, Metall, Stoff, Holz, Haar, Schuppen …, CC0), die beim Bauen über die Illustrationen gelegt werden. In einem SVG markiert man Flächen mit data-tx="stone" am Verlauf oder filter="url(#tx-metal)" an Form/Gruppe (Varianten -soft, -fine) – Details in |
tools/texturize.pyart/cards, art/terrains | Daraus erzeugte WebP-Bilder (groß + .thumb für kleine Darstellungen), die das Spiel lädt: nach Änderungen an einem SVG tools/build-art.sh ausführen |
art/cursors/*.svg | Eigene Mauszeiger (Pfeil, Panzerhandschuh, Lupe, Info) |
tools/texturize.py | Setzt die Material-Texturen in ein SVG ein (von build-art.sh und render-svg.sh aufgerufen) |
tools/emoji-font.py | Baut die Emoji-Ersatzschrift (art/fonts/noto-emoji-subset.woff2) nur mit den Emojis des Spiels – nach neuen Emojis ausführen |
tools/render-svg.sh | Rendert ein SVG per Headless-Chromium als PNG (zum Prüfen von Illustrationen) |
test/simulate.js | KI-gegen-KI-Partien mit Invarianten-Prüfung und Grenzen für die Spielstärke der Stufen (EXPECT): node test/simulate.js 400 |
test/online.js | Online-Partien im Gleichschritt: Host und Gast müssen bei jeder Zugreihenfolge gleich rechnen (inkl. Prüfsumme und ungültiger Züge): node test/online.js 500 |
test/balance.js | Balance-Analyse (Karten, Fähigkeiten, Schlachtruf, Schwierigkeitsstufen): node test/balance.js 3000 |
package.json, .github/workflows/test.yml | npm test startet simulate.js und online.js (knapp eine Minute, ohne Installation); GitHub führt das bei jedem Push aus |