rc3/rc3_notes.md
Stephan Messlinger d7a22d84f2 Notes from talk
2021-02-16 00:57:28 +01:00

12 KiB

  • rc3-World (== Online CCC-Kongress) https://howto.rc3.world/ https://links.rc3.world/ Chaosradio über die rc3-World: https://chaosradio.de/cr265-rc3-world Scraped maps: https://github.com/MichaelKreil/rc3-map-scraper

  • Software: Workadvanture

  • Tutorials:

  • Engine

  • Maps

    • Unabhängig vom engine host

    • Wird über URL in die engine geladen: <engine_server>///<map_server>/<path_to_map>#<start_point> z.B. https://play.wa.binary-kitchen.de//global/c0c0bird.github.io/chaos-world/main.json#start_alpen

      • : Beliebiger Bezeichner (typ. "global"). Nur Spieler in derselben Instanz können sich sehen.
    • Achtung: uMatrix o.ä. blockieren eventuell den XMLHTTPRequest

    • Map-Format: json (map layer definitions) + png (tiles) WICHTIG: Tilesets müssen EMBEDDED werden.

    • Grafischer Editor: Tiled https://www.mapeditor.org/ Tiled tutorial der Binary-Kitchen: https://www.youtube.com/watch?v=NmIT2UYFVzY

    • Struktur:

      • Rechteckige Matrix aus Feldern

      • Mehrere Übereinanderliegende Ebenen (Layer)

      • Layertyp: Tile Layer (außer floorLayer)

      • LAyer Groups werden laut Github noch nicht unterstützt.

      • Jede Ebene kann an jeder Position mit einer 32x32px Kachel (Tile) gefüllt sein

        • Oben liegende Ebenen überdecken darunterliegende (beachte PNG-Transparenz)
        • Tiles organisiert in Tilesets (= PNGs mit mehreren 32x32 Tiles)
      • Spezielle Ebenen:

        • "floorLayer": Hier wird die Spielfigur dargestellt.

          • Muss vom Typ Objectlayer sein (als einziger)
        • Exitlayer (typ. "exitToXXX"): Ausgänge zu anderen Karten

          • Jeder Layer mit der Eigenschaft "exitUrl" (string)
          • Inhalt des exitUrl-Strings gibt die Zielkarte an
            • Auf dem gleichen Map-Server: "<path_to_map>#<start_point>"
            • Auf anderem Map-Server: "/_//<map_server>/<path_to_map>#<start_point>"
          • Jedes beliebige Tile auf einem Exitlayer dient als Ausgang. Good practice: Benutze Tile "EXIT" aus mapUtilities
          • ACHTUNG: Exit- und Startfelder dürfen nicht zusammenfallen. (Sonst stürzt das Spiel ab).
          • Wenn der angegebene Startlayer nicht gefunden wird: Start in der Mitte der Karte
          • exitUrl kann auch auf die aktuelle Karte zeigen --> Sprung auf Karte
        • Startlayer: (typ. "startFromXXX"): Einstiegspunkt beim betreten der Karte

          • Jeder Layer mit der Eigenschaft "startLayer" (Typ bool)
          • Einstieg definiert durch ein beliebiges Tile auf dem Startlayer
            • Good practice: Benutze Tile "START" aus Tileset "mapUtilities".
          • Bei mehreren existierenden Tiles wird eines davon zufällig als Startpunkt gewählt
          • Name des Startlayers wird als <start_point> in Map-URL übergeben
          • Es kann mehrere Startlayer geben (z.B. für verschiedene Eingänge)
        • Wände (eigentlich kein spezieller Layer):

          • Jedes Tile mit der Eigenschaft "collide" (bool) wirkt als Wand, d.h. man kann nicht durchlaufen
          • Üblich: Benutze Tile "BLOCK" aus mapUtilities.
        • Silent-Layer:

          • Unterdrückt Ad-hoc Videochats
          • Jeder Layer mit Eigenschaft "silent" (bool)
          • Bereich definiert durch beliebige Tiles
          • Good practice: Banutze Tile "SILENT" aus mapUtilities
        • Jitsi-Konferenzbereiche:

          • Erlaubt Video-Konferenzen mit mehr als 4 Teilnehmern
          • Jeder Layer mit Eigenschaft "jitsiRoom" (string)
          • Name des jitsiRooms = +string
          • Konferenzbereich definiert durch beliebige Tiles
          • Good practice: Benutze Tile "MISC" aus mapUtilities
          • Speziell: Layer-Eigenschaft "jitsiTrigger: onaction" --> Konferenz wird erst nach Drücken von Space beigetreten
        • Website öffnen (als iFrame):

          • Layer mit Eigenschaft "openWebsite" (string)

          • Beim betreten eines beliebigen Tiles wird die in Website im string geöffnet.

            • Für jede Website ist eine eigener Layer nötig.
            • Lokale Pfade funktionieren anscheinend nicht, nur vollständige URLs.
            • Nur https://
          • Good practice: Benutze Tile URL aus mapUtilities

          • Speziell: Layer-Eigenschaft "openWebsiteTrigger: onaction" --> Website wird erst nach Drücken von Space geöffnet

        • Audio abspielen:

          • Layer mit Eigenschaft "playAudio" (string)
          • Bei Betreten eines Tiles wird das im string angegeben mp3-file geladen und abgespielt
          • Good practice: Benutze Tile "AUDIO" aus mapUtilities
          • Eigenschaft "playAudioLoop" statt "playAudio": Audio wird in Endlosschleife abgespielt
        • Animationen:

          • Bestehend aus Abfolge von Tiles
          • Editierbar mit Tiled: Teilset anwählen --> Tielset bearbeiten (Schraubenschlüssel-Icon) --> Animationseditor (Kamera-Icon)
  • Maps hosten:

    • Lokaler HTTP-Server zur Entwicklung

    • Webspace

    • github.io, Droppages, GoogleDrive, OneDrive

    • Wie können wir möglichst vielen Nutzern die Möglichkeit geben, einfach eigene Karten zu hosten?

    • HTTP-Header:

      • Access-Control-Allow-Origin: * (Cross-Site-Scripting beim Laden der Karte durch Webbrowser)
      • X-Frame-Options deativieren (für iFrames)
      • Expires: 0 (Verhindere Caching durch Browser während Entwicklung und ev. für Special-Effects)
      • Cache-Control: no-cache, max-age=0
  • Hacks:

    • Mapseitige Spielmechanismen

      • Reagiere auf Events

        • Audio
        • iframes
      • Dynamisch veränderte Maps (Änderungen nur bei Mapwechsel möglich)

      • Problem: Phaser-Engine cached alle files, Ausnahme: iframes --> Ermöglicht Spielmechanismen mit iframes ohne Auswirkungen auf die Maps

      • Spielzustand speichern

        • Cookies (Spieler-Spezifisch)
        • In generierter Karte (Spieler-Spezifisch)
        • Auf Map-Server (Global)
      • Problem: Browser akzeptiert keine Cookies via Cross-Site-Scripting

    • Cache aushebeln Mapseitig:

      • HTTP redirect nützt nichts, engine merkt sich die ursprüngliche URL
      • Workaround: Dynamische einamalige Dateinamen für Maps
        • Nachteil: Jeder Spieler bekommt eine andere Map, kein Multiplayer mehr
        • Funktioniert nur für Maps, nicht für Audio-Events
      • Implementierung A: (1) Wenn eine Karte map.php aufgerufen wird: * Lade map.json * Ersetze alle Exit-URLs der Form dest.php#start --> dest.timestamp.php#start (dest.json wird so gelassen, damit man wieder in Multiplayer-Maps zurück kann). (2) URL-Rewrite rule via .htaccess: Entferne timestamp RewriteRule ^(.+).\d+.php$ $1.php
      • Implementierung B (timestamp-patching ausgelagert in eigenes file): (1) URL-Rewrite: Entferne timestamp und übergebe Mapnamen an uncache.php via URL-Parameter RewriteRule ^(.+).\d+.php$ uncache.php?target=$1 (2) In uncache.php: * Wenn es target.php gibt, dann rufe diese auf und fange ihren output ab. * sonst lade target.json * Patch Exit-URLS mit timestamp.
    • Cache deaktivieren Engineseitig:

      • Karten beim betreten neu laden
        • File GameScene.ts, function onMapExit() this.cache.tilemap.entries.clear();
    • Dynamisch generierte Maps

      • Maze-generator
      • Endless Tower
        • Automatisch generierte Stockwerke (außer das Stockwerk ist schon bewohnt)
        • Treppenhaus
        • Aufzug
    • Exit games:

      • Ausgang öffnen durch Rätsel auf iframe
      • Ausgang öffnen durch Event (z.B. Audio-Feld == Druckplatte)
      • Einschränkung: Ausgang muss in anderem Raum sein als Auslöser (Mapänderungen nur bei Mapwechsel möglich)
      • Items sammeln und benutzen
  • Engine hosten:

    • Source von github laden https://github.com/thecodingmachine/workadventure

    • Fork von binary kitchen https://git.binary-kitchen.de/noby/workadventure

    • Docker installieren

    • docker-compose installieren (via curl)

    • Eintragungen in /etc/hosts: 127.0.0.1 workadventure.localhost 127.0.0.1 pusher.workadventure.localhost (scheint nicht notwendig)

    • sudo dockerd &

    • sudo docker-compose up Dauert einige Zeit, kompiliert Zeug und startet dann mehrere Container

    • Webbrowser play.workadventure.localhost/_/global.... Firefox macht Probleme wegen irgendeinem http/https-Forwarding Chromium geht, aber ohne Kamera/Mikrofon (nur über HTTPS).

    • Erstmal nur von lokal erreichbar, von außerhalb ip:8080 meldet sich Traefik Reverse Proxy ip:80 nicht erreichbar

    • Erreichbarkeit von außen: Konfigurationsfile docker-compose.yaml Domainnamen in alle traefik host-rules eintragen Domainnamen in front envirnment Variablen eintragen Muss über Domain angesprochen werden, damit traefik entsprechend weiterleitet Nur IP geht nicht Für lokale Tests: Domains in /etc/hosts bzw. C:/windows/system32/drivers/etc/hosts eintragen

    https://xn--han-7ka.de/s/b3SKomnirgisMc9 https://play.workadventu.re//global/devlol-systems.pages.devlol.org/vspace-workadv/vspace.json Du kannst dich gern mit mir vernetzen alexander@m4h.network bzw. alexander.stellmach@ose-germany.de https://nemo.jstsmthrgk.eu/files/rc3graph.svg https://play.workadventu.re//global/simondueckert.github.io/nuedigital/map.json https://miro.com/app/board/o9J_laWLPI8=/ https://gitlab.com/fediventure/workadventure/-/tree/feature/federation/ https://gitlab.com/fediventure/fediventure/-/issues/2 https://git.devlol.org/devlol-systems/vspace-workadv/-/blob/master/.gitlab-ci.yml https://obs.ninja/?view=8iiMHZa https://github.com/tehwalris/vertiled https://miro.com/app/board/o9J_laWLPI8=/