

* 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
    * 2D-Multiplayer-Onlinespielumgebung mit integriertem Ad-Hoc Video-Konferenz-System wenn Spieler sich begegnen (Max. 4 Teilnehmer)
    * Entwickler: The Coding Machine https://www.thecodingmachine.com/
    * https://workadventu.re/
    * https://github.com/thecodingmachine/workadventure
    * Binary-Kitchen Fork:
        * https://git.binary-kitchen.de/noby/workadventure


* Tutorials:
    * https://workadventu.re/map-building
    * https://howto.rc3.world/
    * Videos der Binary Kitchen:
        * https://www.youtube.com/watch?v=NmIT2UYFVzY
        * https://www.youtube.com/watch?v=hPPvZaI97aM


* Engine
    * Basiert auf der Phaser HTML5 Game Engine (https://phaser.io/)
    * Online version (https://play.workadventu.re)
    * Self hosted
    * Other hosts (z.B. https://play.wa.binary-kitchen.de/)
    * 200+ Spieler (lt. Website)
    * Lizensierung erbeten für >= 25 Spieler (aber z.Zt. nicht erzwungen)
    * AGPL Lizenz
        * You cannot offer online subscriptions to a WorkAdventure server you are putting online.
            
* Maps
    * Unabhängig vom engine host
    * Wird über URL in die engine geladen:
        <engine_server>/_/<instance>/<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
        * <instance>: 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: "/_/<instance>/<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 = <instance>+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:
            (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


    * 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=/
    