🎮

Adventure Builder Pro

Das vollständige Kompendium · Für Designer & Spielemacher
Version 4.3 Editor + Player Offline · Chrome/Edge Kein Code nötig

📋 Inhaltsverzeichnis

🚀
Schnellstart
In 5 Minuten zum ersten spielbaren Spiel

Was ist Adventure Builder Pro?

Adventure Builder Pro ist ein Werkzeug für alle, die Text-Adventure-Spiele erstellen möchten – ohne Programmieren zu müssen. Du gestaltest alles im Browser: Orte, Gegenstände, Charaktere, Rätsel und Geschichte. Das Ergebnis ist eine JSON-Datei, die du mit dem Player spielen kannst.

ℹ️
Alles läuft offline – du brauchst kein Internet. Öffne einfach adventure-editor.html und adventure-player.html in Chrome oder Edge.

Der Arbeitsablauf

1
Editor öffnen adventure-editor.html im Browser öffnen. Für ein bestehendes Spiel: "📂 Spiel laden" und JSON-Datei wählen.
2
Spiel aufbauen Die Tabs im Editor führen dich durch alle Bereiche: Orte → Objekte → NPCs → Flags → Rezepte → Cutscenes → Enden.
3
Exportieren "💾 JSON exportieren" – die Datei speichert alles was du gebaut hast.
4
Spielen & testen adventure-player.html öffnen, JSON laden, spielen. Fehler entdeckt? Zurück zum Editor.

Die Editor-Tabs auf einen Blick

TabInhaltWann benutzen?
📍 OrteRäume, Ausgänge, Objekte, NPCsAls erstes – die Welt aufbauen
📦 ObjekteAlle Items zentral definierenItems die Orte und NPCs brauchen
🗨️ NPCsCharaktere, Dialoge, Tausch, KampfFür lebendige Figuren
🚩 FlagsSpielzustände definierenVor Rezepten und Enden – Flags zuerst anlegen
🔮 RezepteCrafting: Item + Item = neues ItemBraucht Items und ggf. Flags
🎬 CutscenesStory-Sequenzen mit Bild/TextWerden von NPCs und Enden aufgerufen
🏁 EndenSieg- und NiederlagebedingungenBraucht Flags und ggf. Cutscenes
🔊 SoundsZentrale Sound-Bibliothek verwaltenSounds einmal hochladen, überall referenzieren
⚙️ FeaturesKampfsystem, Parser, Aufgaben aktivierenEinmalig konfigurieren
🎨 AnzeigeInventar, Layout, Schriftgröße, ThemesZum Schluss, für das Feintuning
🗺️ GraphVisueller Orts-Graph mit Drag & ZoomÜberblick bei komplexen Spielen

Neue Editor-Features

FeatureBeschreibungShortcut
↩️ Undo / ↪️ RedoBis zu 50 Schritte rückgängig machenStrg+Z / Strg+Y
🔍 Globale SucheFindet Orte, NPCs, Items und Flags sofort – Klick springt direkt dahinSuchfeld oben rechts
🗺️ Graph-TabCanvas-Graph aller Orte und Verbindungen, Knoten verschiebbar, Zoom per ScrollTab-Klick
📌 Orts-Liste verbessertMiniaturvorschau des Ortsbildes, Status-Badges (👤 NPCs, 📦 Objekte, 🚪 Ausgänge)
▶ TestenÖffnet den Player direkt aus dem Editor – kein manuelles Exportieren nötig. Spiel wird einmalig über den Browser-Speicher übergeben.Button oben rechts im Editor

Minimalstruktur eines Spiels (JSON)

Jedes Spiel besteht im Kern aus diesen Bausteinen:

{
  "title": "Mein Abenteuer",
  "author": "Dein Name",
  "startLocation": "ort_id",    // Startort des Spielers
  "defaultTheme": "modern",     // Visuelles Thema
  "locations": {},             // Alle Orte
  "items": {},                 // Alle Gegenstände
  "npcs": {},                  // Alle Charaktere
  "recipes": [],               // Kombinierrezepte
  "flags": {},                 // Spielzustände
  "sounds": {},                // 🔊 Sound-Bibliothek (optional)
  "gameEnds": { "win": [], "lose": [] },
  "cutscenes": {},             // Story-Sequenzen
  "displaySettings": {}       // Layout-Einstellungen
}
🗺️
Orte & Ausgänge
Räume, Bereiche und wie man zwischen ihnen wechselt

Ort-Eigenschaften

{
  "ort_id": {
    "name": "Dunkler Keller",
    "description": "Es riecht modrig hier unten.",
    "image": "https://...",         // Bild oder Video (WebM/MP4)
    "imageLoop": true,            // Video wiederholen?
    "sound": "data:audio/...",     // Hintergrundmusik
    "soundLoop": true,
    "silence": false,            // Alle Sounds stummschalten
    "theme": "dark",              // Ort-spezifisches Theme
    "exitTransition": "fade",    // Übergangseffekt beim Verlassen
    "exits": {},
    "objects": [],
    "npcs": [],
    "conditionalNpcs": [],
    "playCutscene": "keller_intro", // Cutscene beim Betreten
    "playCutsceneOnce": true
  }
}
EigenschaftPflicht?Beschreibung
name✅ JaAnzeigename des Ortes
description✅ JaBeschreibungstext
image○ Opt.URL, Base64 oder Data-URL (Bild oder Video)
sound○ Opt.Hintergrundmusik (MP3/OGG als Data-URL)
theme○ Opt.Überschreibt das globale Theme für diesen Ort
exitTransition○ Opt.fade, slide-left, slide-right, zoom, dissolve
silence○ Opt.true = kein Sound in diesem Ort

Ausgänge (Exits)

A) Einfache Ausgänge

Richtwörter als Keys oder beliebige Texte – was du schreibst, erscheint als Button.

"exits": {
  "N": "wald_nord",           // Standard: N S O W H R
  "Durch die Tür": "raum_2", // Eigener Text möglich
  "Ins Wasser": "see"
}

B) Ausgang mit Flag-Bedingung

Der Ausgang ist nur nutzbar wenn eine bestimmte Flag gesetzt ist.

"exits": {
  "N": {
    "to": "geheimraum",
    "requireFlag": "tuer_offen",
    "deniedMessage": "Die Tür ist noch verschlossen."
  }
}

C) Ausgang mit Item-Bedingung

Der Spieler muss ein bestimmtes Item im Inventar haben.

"exits": {
  "O": {
    "to": "schatzkammer",
    "requireItem": "goldener_schluessel",
    "deniedMessage": "Du brauchst den goldenen Schlüssel!"
  }
}

D) Ausgang mit kombinierten Bedingungen

"exits": {
  "Portal": {
    "to": "andere_dimension",
    "requireFlag": "portal_aktiviert",
    "requireItem": "magischer_kristall",
    "deniedMessage": "Das Portal reagiert nicht..."
  }
}
Praxisbeispiel: Klassische Schlüssel-Tür-Mechanik

Spieler findet Schlüssel → benutzt ihn an einer Eisentür → Flag tuer_offen wird gesetzt → Ausgang im Norden ist jetzt nutzbar.

// Objekt im Ort: Eisentür
{
  "itemName": "Eisentür",
  "canTake": false,
  "usableWith": [{
    "itemId": "rost_schluessel",
    "success": "Die Tür quietscht auf!",
    "setFlag": "tuer_offen",
    "removeItem": true
  }]
}

// Ausgang des Ortes
"N": {
  "to": "naechster_raum",
  "requireFlag": "tuer_offen",
  "deniedMessage": "Die Tür ist verschlossen!"
}

Objekte im Ort

Objekte sind Dinge, die der Spieler sieht und mit denen er interagieren kann – anfassen, untersuchen, ein Item darauf anwenden.

A) Einfaches nehmbares Objekt

{
  "itemId": "rost_schluessel",  // Referenz auf ein definiertes Item
  "canTake": true
}

B) Objekt mit Item-Anwendung (usableWith)

Was passiert, wenn ein Spieler ein bestimmtes Item aus dem Inventar auf dieses Objekt anwendet?

{
  "itemId": "truhe",
  "canTake": false,
  "failMessage": "Das bringt hier nichts.",
  "usableWith": [{
    "itemId": "schluessel",
    "actionLabel": "🔓 Aufschließen",
    "success": "Die Truhe öffnet sich!",
    "changeObject": "offene_truhe",  // Objekt wird ersetzt
    "spawnObject": "gold",         // Neues Objekt erscheint
    "spawnCanTake": true,
    "removeItem": true,            // Schlüssel wird verbraucht
    "setFlag": "truhe_geoeffnet",
    "playCutscene": "truhe_oeffnen"
  }]
}
Eigenschaft in usableWithBedeutung
itemId / itemNameWelches Item muss der Spieler anwenden?
actionLabelButton-Text (leer = "Anwenden")
successNachricht bei Erfolg
givesItemIdItem erscheint im Inventar (Transformation)
requireItemIdZusätzliches Item muss im Inventar sein
requireFlagNotAktion gesperrt wenn diese Flag gesetzt ist
changeObjectObjekt wird ersetzt durch… (Item-Name)
spawnObjectNeues Objekt erscheint im Raum
spawnCanTakeKann das gespawnte Objekt aufgenommen werden?
removeObjectObjekt verschwindet komplett
removeItemVerwendetes Item wird verbraucht
setFlag / clearFlagFlag setzen oder löschen
teleportToSpieler wird teleportiert
playCutsceneCutscene abspielen danach

C) Direkte Aktion (ohne Item) Direct Action

Ein Button der immer sichtbar ist – zum Untersuchen, Zählen, Aktivieren.

"usableWith": [{
  "itemName": "",                    // Leer = kein Item nötig
  "actionLabel": "🔍 Untersuchen",
  "success": "Du findest einen versteckten Hinweis!",
  "spawnObject": "hinweis",
  "spawnCanTake": true
}]

D) Mehrfach-Verwendung (Quantity)

Der Button ist nur eine begrenzte Anzahl von Malen nutzbar.

"usableWith": [{
  "itemName": "",
  "actionLabel": "🍪 Keks nehmen",
  "success": "Lecker! Du nimmst einen Keks.",
  "quantity": 5,
  "quantityMessage": "Die Dose ist leer!",
  "spawnObject": "keks",
  "spawnCanTake": true
}]

E) Bedingte NPCs im Ort

Manche Charaktere erscheinen nur unter bestimmten Bedingungen.

"conditionalNpcs": [
  { "npcId": "geist_id",  "requireFlag": "mitternacht" },
  { "npcId": "drache_id", "forbidFlag": "drache_besiegt" }
]
📦
Items & Inventar
Gegenstände definieren und das Inventar steuern

Direct Action: Item sofort ins Inventar

Mit givesItemId in einem usableWith-Eintrag (ohne Item = Direct Action) landet ein Item sofort im Inventar des Spielers – kein zweiter Klick nötig. Perfekt für „Kiste durchsuchen", „Schublade öffnen" oder „Brief aufheben".

JSON-Beispiel: Werkzeugkiste
{
  "itemId": "werkzeugkiste",
  "canTake": false,
  "usableWith": [
    {
      "actionLabel": "🔧 Durchsuchen",
      "givesItemId": "schraubendreher",
      "message": "Du findest einen Schraubendreher!",
      "removeObject": true,
      "setFlag": "kiste_durchsucht"
    }
  ]
}

Das actionLabel erscheint als Button direkt am Objekt (kein Item im Inventar nötig). Nach dem Klick geht der Schraubendreher sofort ins Inventar, die Kiste verschwindet und der Flag kiste_durchsucht wird gesetzt.

Objekt-Aktion als Modal-Fenster (modal: true)

Standardmäßig erscheint die Erfolgsmeldung einer Objekt-Aktion als kurze Toast-Meldung. Mit modal: true wird sie stattdessen als bleibendes Modal-Fenster angezeigt – ideal für längere Texte wie Rezepte, Briefe oder Hinweisschilder.

JSON-Format
"usableWith": [
  {
    "actionLabel": "📜 Brief lesen",
    "message": "Liebe Anna, ...\n\nDein Papa",
    "modal": true,
    "title": "📜 Ein Brief"
  }
]

Items definieren

Alle Items werden zentral im Tab 📦 Objekte angelegt. Jedes Item bekommt eine eindeutige ID – so kann es überall im Spiel referenziert werden, ohne dass das Spiel kaputt geht wenn du den Namen änderst.

"items": {
  "goldener_schluessel": {
    "id": "goldener_schluessel",
    "name": "🔑 Goldener Schlüssel",
    "description": "Ein prächtiger Schlüssel aus purem Gold.",
    "image": "data:image/png;base64,...",  // auch WebM/MP4 möglich
    "sfx": "snd_1234_abc"  // 🔊 Sound-ID aus der Bibliothek – spielt beim Aufnehmen
  }
}
💡
Emojis machen das Spiel bunter! Windows: Win + . | Mac: Cmd + Ctrl + Space

Selbst-Verwendung (selfUse)

Was passiert, wenn der Spieler ein Item direkt im Inventar benutzt?

"heiltrank": {
  "name": "💊 Heiltrank",
  "selfUse": {
    "message": "Du trinkst den Heiltrank. +20 HP!",
    "healHP": 20,
    "removeAfterUse": true
  }
}

Inventar-Freischaltung

Normalerweise ist das Inventar von Anfang an sichtbar. Mit dieser Mechanik bleibt es versteckt, bis der Spieler ein bestimmtes Objekt aufnimmt – eine Tasche, einen Rucksack, eine magische Truhe.

Warum das sinnvoll ist: Ohne Inventar-Sperre kann der Spieler von Anfang an alles einsammeln. Mit der Sperre gibt es einen logischen Grund, warum man Gegenstände tragen kann. Das Freischalt-Item ist das Inventar – es erscheint deshalb nicht als Gegenstand darin.
🎨 Anzeige → Inventar → "Inventar zu Beginn ausblenden" ✅ → "Freischalt-Item ID"
1
Item anlegen (Tab 📦 Objekte) Erstelle z.B. id: "rucksack", Name: "Roter Rucksack".
2
Als Raumobjekt platzieren (Tab 📍 Orte) Das Item als Objekt am Startort hinzufügen (canTake: ✅).
3
Inventar sperren (Tab 🎨 Anzeige) "Inventar zu Beginn ausblenden" aktivieren, ID: rucksack eintragen.
JSON-FeldWertBedeutung
inventoryHiddenAtStarttrue / falseInventar beim Start versteckt?
unlockInventoryItemIdItem-IDDieses Item schaltet das Inventar frei
allowInventoryChangetrue / falseDarf der Spieler die Position ändern?
inventoryPositionright / left / bottomStandard-Position des Inventars
⚠️
Das Freischalt-Item darf nie als Tausch-Item von einem NPC eingefordert werden – sonst verliert der Spieler das Inventar und alle darin enthaltenen Gegenstände.
🗨️
NPCs & Charaktere
Dialoge, Tausch, Kampf und lebendige Figuren

Basis-Definition

"haendler": {
  "name": "Alter Händler",
  "dialog": "Willkommen! Was darf es sein?",  // Statischer Text
  "portrait": "data:image/png;base64,...",          // Bild oder Video
  "portraitSize": "medium",                         // small/medium/large/full
  "playCutscene": "haendler_intro",                  // Cutscene VOR Dialog
  "playCutsceneOnce": true,
  "playCutsceneAfter": "haendler_abschied",             // Cutscene NACH Dialog
  "givesItems": [],
  "receivesItems": [],
  "dialogTree": {}   // Verzweigter Dialog → Kapitel 5
}
ℹ️
Wenn ein NPC einen dialogTree hat, übernimmt dieser den statischen dialog. Beide können koexistieren – der Baum hat Vorrang.

NPC gibt Items (givesItems)

Der Spieler erhält beim Gespräch ein oder mehrere Items – kostenlos, ohne Gegenleistung.

"givesItems": [{
  "name": "Heiltrank",
  "description": "Stellt Lebenspunkte wieder her",
  "playCutscene": "trank_geschenk",
  "playCutsceneOnce": true
}]

NPC nimmt Items (receivesItems – Tausch)

A) Einfacher Tausch

"receivesItems": [{
  "itemId": "altes_schwert",
  "message": "Ein feines Stück! Hier, nimm das dafür.",
  "givesItemId": "neues_schwert",
  "setFlag": "upgrade_erhalten"
}]

B) Tausch mit Bedingungen

"receivesItems": [{
  "itemId": "brief",
  "message": "Danke für die Lieferung!",
  "givesItemId": "belohnung",
  "requireFlag": "quest_aktiv",          // Muss gesetzt sein
  "requireFlagNotSet": "brief_abgegeben", // Muss NICHT gesetzt sein
  "failTitle": "❌ Abgelehnt",
  "failMessage": "Das kann ich jetzt nicht annehmen.",
  "setFlag": "brief_abgegeben"
}]
Praxisbeispiel: Item-Übergabe im Dialog-Baum

Wenn ein NPC einen Dialog-Baum hat und receivesItems definiert ist, erscheint automatisch ein grüner "🎁 [Item] übergeben"-Button im Gespräch – sobald der Spieler das entsprechende Item im Inventar hat.

Kampfsystem (HP-basiert)

Wenn ein NPC maxHP gesetzt hat, kann er mit Items angegriffen werden. Der Spieler klickt auf den NPC → wählt ein Waffen-Item → der NPC verliert HP. Bei 0 HP: onDefeat.

"drache": {
  "name": "Roter Drache",
  "maxHP": 100,
  "counterDamage": 15,       // Schaden beim Gegenschlag (opt.)
  "usableWith": [{
    "itemName": "Drachenschwert",
    "damage": 25,
    "success": "Du triffst den Drachen!",
    "onDefeat": {
      "message": "Der Drache ist besiegt! 🎉",
      "givesItem": "drachenschuppe",
      "teleportTo": "thronsaal",
      "setFlag": "drache_besiegt",
      "clearFlag": "drache_lebt",
      "playCutscene": "sieg_drache"
    }
  }]
}
FeldBedeutung
maxHPMaximale HP (macht NPC kämpfbar)
counterDamageSchadenspunkte beim Gegenschlag (nur wenn Spieler-HP aktiv)
damageSchaden pro Treffer
onDefeatWas passiert bei 0 HP (Belohnung, Teleport, Flags, Cutscene)
ℹ️
Spieler-HP: Muss im Tab "🎨 Anzeige" aktiviert werden. Bei 0 HP wird automatisch die Flag player_dead gesetzt – damit lässt sich eine Verlier-Bedingung bauen.
💬
Dialog-Bäume
Verzweigte Gespräche – die Geschichte verändert sich je nach Antwort

Was sind Dialog-Bäume?

Statt einem starren Dialog-Satz kann jeder NPC jetzt einen echten Gesprächsbaum führen. Der Spieler wählt Antworten, die die Geschichte in verschiedene Richtungen lenken. Flags können gesetzt, Items vergeben und Cutscenes ausgelöst werden.

🗨️ NPCs → NPC → 💬 Dialog-Baum → ➕ Knoten hinzufügen

Aufbau: Knoten und Antworten

Ein Dialog-Baum besteht aus Knoten. Jeder Knoten ist ein Gesprächs-Moment. Der Knoten mit der ID start ist immer der Einstieg.

"dialogTree": {
  "start": {
    "npcText": "Was kann ich für dich tun?",
    "choices": [
      {
        "text": "Ich brauche Informationen.",
        "next": "info_knoten"
      },
      {
        "text": "Hier ist der Brief für dich.",
        "next": "brief_uebergeben",
        "requireFlag": "brief_gefunden"  // Nur sichtbar wenn Flag gesetzt
      },
      {
        "text": "Auf Wiedersehen!",
        "next": null              // null = Gespräch endet
      }
    ]
  },

  "info_knoten": {
    "npcText": "Der Schlüssel liegt im alten Turm!",
    "setFlag": "hinweis_erhalten",     // Flag beim Betreten
    "choices": [
      { "text": "Danke!", "next": null }
    ]
  }
}
Feld (Knoten)Bedeutung
npcTextWas der NPC sagt
setFlagFlag wird gesetzt sobald dieser Knoten geöffnet wird
flagBranchAutomatische Umleitung je nach Flag-Stand (s.u.)
choicesListe der Antwortmöglichkeiten
Feld (Antwort/Choice)Bedeutung
textDer Text auf dem Antwort-Button
nextID des nächsten Knotens (null = Gespräch endet)
setFlagFlag setzen beim Wählen
givesItemIdDieses Item bekommt der Spieler
requireFlagAntwort nur sichtbar wenn Flag gesetzt
requireFlagNotAntwort nur sichtbar wenn Flag NICHT gesetzt
playCutsceneCutscene abspielen (statt weiter zum nächsten Knoten)

flagBranch: Automatische Umleitung

Wenn der Spieler denselben NPC nach einem wichtigen Ereignis erneut anspricht, soll dieser anders reagieren. Dafür gibt es flagBranch: Wenn eine Flag gesetzt ist, leitet der Spieler automatisch zu einem anderen Knoten um.

"start": {
  "flagBranch": [
    { "flag": "brummi_zurueck", "goto": "nach_brummi" },
    { "flagNot": "quest_aktiv", "goto": "kein_quest" }
  ],
  "npcText": "Ich fahre nicht ohne Brummi!",
  // Wird nur gezeigt wenn KEIN Branch greift
  ...
},
"nach_brummi": {
  "npcText": "BRUMMI! 🎉 Jetzt bin ich bereit!",
  "choices": [
    { "text": "Na dann – ab ins Kino!", "next": null }
  ]
}
Praxisbeispiel: Basti vor und nach der Teddy-Übergabe

Situation: Basti vermisst seinen Teddy. Sobald der Spieler ihn zurückgibt (basti_gluecklich = true), soll Basti beim nächsten Gespräch glücklich reagieren.

Lösung: flagBranch auf dem start-Knoten leitet zu nach_brummi um, sobald basti_gluecklich gesetzt ist. Kein separater Code nötig.

Einrichten im Editor

1
Startknoten anlegen Tab NPCs → NPC → Bereich "💬 Dialog-Baum" → "➕ Knoten hinzufügen". ID: start (Pflicht – das ist der Einstieg).
2
NPC-Text und Antworten füllen Text eingeben, "➕ Antwort hinzufügen" für jede Option. "Weiter zu" wählen.
3
Weitere Knoten anlegen Für jede Abzweigung einen neuen Knoten. Knoten-ID muss mit dem "Weiter zu"-Feld übereinstimmen.
4
flagBranch optional konfigurieren Im Knoten-Editor: gelbe "🔀 flagBranch"-Sektion → "➕ Branch hinzufügen" → Flag + Ziel-Knoten wählen.
💡
Autosave: Der Dialog-Baum-Editor speichert nach 800ms Pause automatisch. Du kannst das Modal jederzeit schließen ohne zu verlieren.
🎬
Cutscenes
Story-Sequenzen mit Bild, Text, Musik und Übergangseffekten

Was ist eine Cutscene?

Eine Cutscene ist eine Abfolge von Slides – jede mit einem Bild (oder Video), einem Text und optionaler Musik. Der Spieler klickt sich durch und sieht so eine Geschichte, eine Erklärung oder einen dramatischen Moment.

"cutscenes": {
  "wald_intro": [
    {
      "image": "data:image/png;base64,...",
      "text": "Es war einmal ein dunkler Wald...",
      "bgm": "data:audio/mpeg;base64,...",
      "bgmLoop": true,
      "theme": "dark",
      "transition": "fade"
    },
    {
      "image": "data:image/png;base64,...",
      "text": "Ein Held betrat ihn..."
    }
  ]
}
Slide-EigenschaftTypBeschreibung
imagestringURL, Base64 oder Data-URL (Bild oder Video)
imageLoopbooleanVideo-Loop? (Standard: true)
textstringText-Overlay über dem Bild
bgmstringHintergrundmusik für diese Slide
bgmLoopbooleanMusik loopen? (Standard: true)
themestringTheme für diese Slide (13 verfügbar)
transitionstringÜbergang: fade, slide-left, slide-right, zoom, dissolve
💡
game_intro: Eine Cutscene mit dieser genauen ID spielt automatisch beim Spielstart – perfekt für eine Einleitung!

10 Trigger – überall einsetzbar

Cutscenes können an 10 verschiedenen Stellen ausgelöst werden. Alle sind vollständig im Editor konfigurierbar:

1🎬 Game Intro
Tab: 🎬 Cutscenes → ID "game_intro" anlegen
Wann: Beim Spielstart (automatisch)
2🚪 Ort betreten
Tab: 📍 Orte → Ort → 🎬 Cutscene-Dropdown
Wann: Beim Betreten des Ortes
3💬 NPC-Dialog VOR
Tab: 🗨️ NPCs → NPC bearbeiten → Cutscene VOR Dialog
Wann: Bevor der Dialog erscheint
4💬 NPC-Dialog NACH
Tab: 🗨️ NPCs → NPC bearbeiten → Cutscene NACH Dialog
Wann: Wenn Spieler "Zurück" klickt
5🏁 Spielende
Tab: 🏁 Enden → Ende bearbeiten → Cutscene vor Ende
Wann: Bevor Sieg/Niederlage-Meldung
6🔧 Objekt verwendet
Tab: 📍 Orte → Objekt → Item-Verwendung → Cutscene
Wann: Nach erfolgreicher Item-Anwendung
7🎁 NPC gibt Item
Tab: 🗨️ NPCs → Gibt Items → Item → Cutscene
Wann: Nach Itemerhalt vom NPC
8🔄 NPC Tausch
Tab: 🗨️ NPCs → Nimmt Items → Item → Cutscene
Wann: Nach erfolgreichem Tausch
9⚗️ Rezept gecraftet
Tab: ⚗️ Rezepte → Rezept → Cutscene-Feld
Wann: Nach erfolgreicher Kombination
10🚩 Flag-basiert (Ort)
Tab: 📍 Orte → 🎬 Bedingte Cutscenes → ➕ Trigger
Wann: Ort betreten + bestimmte Flag gesetzt

JSON für Flag-basierten Trigger (Nr. 10)

"cutsceneTriggers": [{
  "requireFlag": "schatz_gefunden",
  "playCutscene": "siegesfeier",
  "playOnce": true
}]
💡
playCutsceneOnce: true sollte fast immer gesetzt sein – sonst spielt die Cutscene jedes Mal wenn der Spieler den Ort betritt oder den NPC anspricht.
🚩
Flags & Bedingungen
Spielzustände merken und Aktionen davon abhängig machen

Was sind Flags?

Eine Flag ist ein einfacher Schalter: entweder ein (true) oder aus (false). Damit kann das Spiel sich merken, was der Spieler schon gemacht hat: eine Tür geöffnet, einen Kampf gewonnen, einen Brief abgegeben.

"flags": {
  "tuer_offen": false,
  "schatz_gefunden": false,
  "quest_aktiv": true    // true = Flag startet schon gesetzt
}

Flags setzen und löschen

Flags können an vielen Stellen gesetzt oder gelöscht werden:

WoJSON-FeldWann
usableWith (Objekt)"setFlag": "name"Nach Item-Anwendung
usableWith (Objekt)"clearFlag": "name"Flag wird auf false gesetzt
NPC receivesItems"setFlag": "name"Nach Tausch
Dialog-Wahl (choice)"setFlag": "name"Beim Wählen der Antwort
Dialog-Knoten"setFlag": "name"Beim Betreten des Knotens
onDefeat (NPC)"setFlag": "name"Nach NPC-Besiegung

Automatische Flags

FlagWird automatisch gesetzt wenn…
player_deadSpieler-HP sinkt auf 0 (HP-System aktiviert)
npc_defeated_[id]NPC bei HP-System auf 0 HP gebracht

Flags als Bedingungen verwenden

Fast überall im System kann eine Flag als Bedingung geprüft werden:

FeldBedeutungEinsatzort
requireFlagFlag muss TRUE seinExits, NPC-Tausch, Game Ends, Dialog-Antworten
requireFlagNotSetFlag muss FALSE seinNPC receivesItems
requireFlagFalseFlag muss FALSE seinGame Ends
requireFlagNotFlag muss FALSE seinusableWith (Objekt)
forbidFlagFlag darf NICHT gesetzt seinconditionalNpcs
💡
Flag-Namen dürfen nur Kleinbuchstaben, Zahlen und Unterstriche enthalten. Sprechende Namen helfen enorm: tuer_offen, boss_besiegt, brief_abgegeben.
⚗️
Rezepte & Crafting
Zwei Items kombinieren – ein neues entsteht

So funktioniert Crafting

Der Spieler wählt im Inventar zwei Items aus und klickt "Kombinieren". Gibt es ein passendes Rezept, verschwinden beide Items und das Ergebnis erscheint. Gibt es keins – passiert nichts.

"recipes": [
  {
    "item1Id": "eimer_wasser",      // Item-ID (empfohlen)
    "item2Id": "seife",
    "resultId": "eimer_seifenwasser",
    "message": "Du mischst die Seife ins Wasser – es schäumt!",
    "playCutscene": "misch_animation",  // Optional
    "playCutsceneOnce": true,
    "sfx": "snd_1234_abc"              // 🔊 Sound aus der Bibliothek (optional)
  }
]
Praxisbeispiel: Seifenschwamm für die Autowäsche

Schritt 1: Eimer + Wasserhahn (givesItemId) → Befüllter Wassereimer

Schritt 2: Wassereimer + Seife (Rezept) → Seifenwasser

Schritt 3: Schwamm + Seifenwasser (Rezept) → Seifenschwamm

Schritt 4: Seifenschwamm auf Auto anwenden → Auto ist sauber 🚗✨

💡
Das Rezept ist reihenfolge-unabhängig. Item1 + Item2 = Item2 + Item1.
🏁
Spielenden
Sieg und Niederlage – mit Cutscene, Teleport und Meldung

Aufbau einer Endbedingung

Ein Ende besteht aus einer Bedingung (was muss eingetreten sein?) und optional zusätzlichen Bedingungen, einer Cutscene, einem Teleport und der Abschlussmeldung.

"gameEnds": {
  "win": [{
    "type": "flag",               // item | flag | location
    "value": "papa_informiert",  // ID oder Name je nach Typ
    "requireFlag": "basti_gluecklich", // Zusatzbedingung
    "playCutscene": "fahrt_ins_kino", // Cutscene davor
    "teleportTo": "kino",          // Ort nach Cutscene
    "message": {
      "title": "🎬 ZOO VERRÜCKT 3!",
      "message": "Du hast den Samstag gerettet!",
      "buttonText": "🍿 Film ab!"
    }
  }],
  "lose": [{
    "type": "flag",
    "value": "player_dead",
    "message": "Du bist gestorben..."
  }]
}

Alle Felder einer Endbedingung

FeldPflicht?Beschreibung
type✅ Jaitem = Spieler hat Item, flag = Flag gesetzt, location = Spieler am Ort
value✅ JaItem-ID, Flag-Name oder Ort-ID
requireFlag○ Opt.Zusätzlich: diese Flag muss TRUE sein
requireFlagFalse○ Opt.Zusätzlich: diese Flag muss FALSE sein
playCutscene○ Opt.Cutscene vor der Meldung abspielen
teleportTo○ Opt.Nach der Cutscene zu diesem Ort wechseln
message✅ JaString oder Objekt mit title/message/buttonText
image○ Opt.Bild in der Abschlussmeldung

Reihenfolge der Ereignisse

1
Bedingung erfüllt – Item erhalten / Flag gesetzt / Ort betreten
2
Cutscene startet (falls hinterlegt) – Spieler klickt "Fertig"
3
Teleport (falls hinterlegt) – Spieler sieht den Zielort
4
Sieg/Niederlage-Meldung erscheint mit Konfetti und Neustart-Button
⚠️
Wichtig: Die erste erfüllte Bedingung in der Liste gewinnt. Die Reihenfolge bestimmt die Priorität – daher kannst du spezifische Bedingungen weiter oben eintragen und einen allgemeinen Fallback (z.B. player_dead ohne requireFlag) weiter unten.

Tod-Szenarien mit verschiedenen Meldungen

"lose": [
  {
    "type": "flag", "value": "player_dead",
    "requireFlag": "vergiftet",
    "message": "Das Gift war zu stark..."
  },
  {
    "type": "flag", "value": "player_dead",
    "requireFlag": "im_kampf",
    "message": "Du wurdest im Kampf besiegt..."
  },
  {
    "type": "flag", "value": "player_dead",
    "message": "Du bist gestorben."  // Fallback
  }
]
🎯
Aufgaben-System
Fortschrittsbalken · Geheimziele · Benachrichtigungen

Was ist das Aufgaben-System?

Mit dem Aufgaben-System kannst du dem Spieler eine sichtbare Liste von Zielen mit Fortschrittsbalken anzeigen. Jedes Ziel ist an ein Flag gebunden – sobald das Flag im Spielverlauf gesetzt wird, gilt das Ziel als erfüllt und wird visuell abgehakt.

ℹ️
Das System ist vollständig optional. Wenn im Editor keine Ziele definiert sind, erscheint nichts im Player.

Einrichten im Editor

Tab 🎨 Anzeige → Abschnitt 🎯 Aufgaben / Ziele.

EinstellungBeschreibung
AktivierenCheckbox – schaltet das System global ein/aus
TitelAnzeigename der Sektion (z.B. „🎯 Meine Aufgaben")
PositionSidebar · Sidebar aufklappbar · Modal (🎯-Button im Header)
ZielePro Ziel: Aufgaben-Text + Flag-Dropdown + optional Geheimziel
GeheimzielCheckbox + Platzhaltertext (z.B. „???") bis Flag erfüllt

JSON-Struktur

{
  "displaySettings": {
    "goalsEnabled":  true,
    "goalsTitle":    "🎯 Aufgaben",
    "goalsPosition": "sidebar",  // "sidebar" | "accordion" | "modal"
    "goals": [
      {
        "text":        "Pizza bestellen",
        "flag":        "pizza_bestellt",
        "secret":      false
      },
      {
        "text":        "Geheimende finden",
        "flag":        "geheim_ende",
        "secret":      true,
        "secretLabel": "???"   // bis Flag erfüllt
      }
    ]
  }
}

Die drei Anzeigeoptionen

PositionVerhaltenIdeal für
sidebarImmer sichtbar über dem Inventar, mit FortschrittsbalkenSpiele mit vielen Zielen
accordionSidebar, aber eingeklappt – Klick auf Titel öffnet/schließt, Anzahl im TitelPlatzsparend bei langen Ziellisten
modalUnsichtbar – 🎯-Button im Header öffnet Vollbild-Übersicht mit BalkenSauberes UI ohne Sidebar-Platz

Features im Player

FeatureBeschreibung
✅ Ziele abhakenErfüllte Ziele werden grün mit Durchstreichung angezeigt
📊 FortschrittsbalkenZeigt z.B. „2/5" + visuellen Balken
🔒 GeheimzieleZeigen „???" bis das Flag erfüllt ist – dann erscheint der echte Text
🔔 BenachrichtigungGrüne Notification oben: „🎯 Ziel erreicht: Pizza bestellen"
💡
Die Reihenfolge der Ziele im Editor bestimmt die Anzeigereihenfolge im Player. Setze wichtige Hauptziele nach oben, optionale Geheimziele nach unten.
🗣️
Text-to-Speech (TTS)
Vorlesen lassen – der Spieler bestimmt das Tempo

Was ist TTS?

Adventure Builder Pro nutzt die eingebaute Web Speech API des Browsers – kein Internet nötig, DSGVO-konform. Wenn TTS aktiviert ist, kann der Spieler mit der Maus über Elemente fahren und sie werden vorgelesen.

ℹ️
Beste Unterstützung: Chrome (Google-Stimme), Edge (Microsoft Katja). Die Stimme wird automatisch nach Browser gewählt und bleibt beim nächsten Start erhalten.

Was wird vorgelesen?

ElementVorgelesen bei
Ortsname + BeschreibungHover
Raumobjekte, Items, NPCsHover
AusgängeHover
Dialog-Text (NPC)Hover
Dialog-AntwortenHover
🎯 Tipps/ZwischenzieleHover · „erledigt" wenn abgehakt
Fortschrittsanzeige (1/3)Hover
🎒 Inventar-ÜberschriftHover
⚙️ Einstellungen (alle Elemente)Hover
🎬 Cutscene-SlideAutomatisch beim Erscheinen
💡
Hover-TTS hat einen kurzen Verzögerung – schnelles Durchfahren löst kein Vorlesen aus.

Auto-Stimmen-Wahl

ABP wählt automatisch die beste verfügbare deutsche Stimme:

BrowserBevorzugte Stimme
ChromeGoogle Deutsch (Online)
EdgeMicrosoft Katja (Neural, Online)
Firefox / andereBeste verfügbare OS-Stimme

Die Wahl des Teilnehmenden wird dauerhaft gespeichert – die Stimme bleibt beim nächsten Spielstart erhalten.

Designer-Einstellungen

⚙️ Features → 🗣️ Text-to-Speech
JSON-FeldStandardBeschreibung
tts.defaultEnabledfalseTTS beim Spielstart sofort aktiv
tts.stripEmojistrueEmojis aus vorgelesenen Texten entfernen
💾
Spielstand speichern
Ein Slot – einfach und zuverlässig

Wie es funktioniert

Im ⚙️-Einstellungsmenü gibt es einen 💾 Spielstand-Bereich mit einem Speicherslot. Der Stand wird im localStorage des Browsers gespeichert – kein Server, kein Internet nötig.

Spieler: ⚙️ Einstellungen → 💾 Spielstand → Speichern / Laden / Löschen

Was wird gespeichert?

GespeichertBedeutung
Aktueller OrtWo der Spieler zuletzt war
InventarAlle Items mit Mengen
FlagsAlle gesetzten/nicht gesetzten Flags
HP & SkillLebenspunkte und Kampf-Level

Wichtig zu wissen

ℹ️
Der Spielstand ist browser- und gerätespezifisch. Ein Stand auf dem Desktop ist nicht auf dem Handy verfügbar. Beim Leeren des Browser-Caches gehen Spielstände verloren.
💡
Für Workshops: Erkläre den Teilnehmenden, dass Spielstände im Browser gespeichert sind. Nach einem Browser-Reset wären sie weg.
⏱️
Spielzeit-Tracking
Zeit messen, anzeigen, vorlesen

Wie es funktioniert

ABP misst die Spielzeit automatisch – ab dem Spielstart bis zum Spielende. Die Zeit läuft im Hintergrund, auch wenn das ⚙️-Menü geöffnet ist. Beim Neustart wird die Uhr zurückgesetzt.

Timer im HUD anzeigen

Editor → ⚙️ Features → Anzeige → ☑️ Timer in der Sidebar anzeigen

Wenn aktiviert, erscheint ein grüner ⏱️ Spielzeit-Kasten in der Sidebar. Format: MM:SS (unter einer Stunde) oder H:MM:SS (ab einer Stunde). Mit TTS vorlesbar per Hover.

JSON: "displaySettings": { "showTimerInHUD": true }

Spielzeit am Spielende

Die finale Spielzeit erscheint automatisch in der Sieg- oder Niederlage-Meldung. Mit TTS wird sie in natürlicher Sprache vorgelesen:

Anzeige:  01:23
TTS:      „1 Minute und 23 Sekunden"

Editor-Usability – neue Funktionen

🖌️ Editor-Themes

Unter ⚙️ Einstellungen → Editor-Theme stehen 5 Farbthemen zur Wahl: 🌈 Bunt, ⚫ Dark, 🔘 Schlicht, 🔵 Klassisch und 🎮 Minecraft. Jedes Theme ändert Hintergrundfarbe, Buttons, Header und Sidebar. Die Wahl wird im Browser gespeichert (nicht im Spiel-JSON).

⚙️ Einstellungen-Tab

Der neue Tab ⚙️ Einstellungen fasst Spiel-Informationen (Titel, Autor, Version), Editor-Theme, Spielmodi, TTS, Kampf-System und alle Anzeige-Einstellungen an einem Ort zusammen. Der Header-Button „⚙️ Einstellungen" öffnet direkt diesen Tab statt einem Modal.

↕ Akkordeon-Zyklus

Der ↕-Button rechts in der Titelleiste von ORTE, Features und Anzeige schaltet zwischen drei Zuständen durch: Alle aufAlle zuMerker (gespeicherter Zustand). Der Editor merkt sich welche Akkordeons offen waren und kehrt auf Wunsch dorthin zurück.

⏱ Zuletzt bearbeitet

Ab 3 Orten zeigt die Orts-Sidebar oben die 3 zuletzt bearbeiteten Orte als Schnellzugriff an. Spart Scrollen bei großen Spielen.

⧉ Objekt duplizieren

Jedes Objekt in einem Ort hat jetzt einen ⧉-Button (Duplizieren). Ein Klick erstellt eine identische Kopie direkt darunter – inklusive aller Verwendungen, Flags und Bedingungen.

🔍 Schnellsuche

In der Sidebar der Tabs NPCs, Flags und Sounds gibt es jetzt ein Suchfeld zum schnellen Filtern der Liste.

🎮 Spieltitel im Header

Nach dem Laden oder Anlegen eines Spiels erscheint der Spieltitel rechts neben dem „Adventure Builder Pro"-Logo im Header. Er aktualisiert sich automatisch wenn du den Titel im Tab ⚙️ Einstellungen → 📋 Spiel-Informationen änderst.

💾 Export-Dateiname = Spieltitel

Beim Export heißt die JSON-Datei jetzt automatisch nach dem Spieltitel – z.B. Mission_Zoo_verrueckt.json. Sonderzeichen werden entfernt, Leerzeichen durch _ ersetzt. Umlaute bleiben erhalten.

📋 Spiel-Informationen inline

Titel, Autor, Version und Startort sind jetzt direkt im Tab ⚙️ Einstellungen → 📋 Spiel-Informationen inline editierbar – kein Modal mehr nötig. Der Header-Button „⚙️ Einstellungen" öffnet direkt diesen Tab.

🚩 Flag setzen beim Nehmen (canTake)

Objekte mit canTake: true können jetzt ein setFlag erhalten. Sobald der Spieler das Objekt aufnimmt, wird dieser Flag automatisch auf true gesetzt. Im Editor erscheint dafür ein Dropdown „🚩 Flag setzen beim Nehmen" im Objekt-Modal (Hinzufügen + Bearbeiten). Dies ist z.B. nützlich um bedingte Ortsbeschreibungen auszulösen (Tasche nehmen → tasche_genommen → Beschreibung ändert sich).

🏁 Spielende – Verzögerung & Partikeldesigner

Unter ⚙️ Einstellungen → 🏁 Spielende kannst du die Ende-Meldung fein einstellen:

  • ⏱️ Verzögerung – Slider 0–5s (Standard: 2s). Wähle wie lange es dauert bis die Gewinn/Verlier-Meldung nach dem auslösenden Event erscheint.
  • 🎨 Partikel-Effekt – drei Modi: 🎉 Emojis (frei konfigurierbar), 🎊 Konfetti (geometrische Farbflächen), 🚫 Keiner
  • ✏️ Emojis konfigurieren – eigene Emojis eingeben oder aus 8 Schnellauswahl-Presets wählen (Party, Sterne, Sieg, Herzen, Natur, Space, Action, Games)
  • 🔢 Menge – Slider 10–200 Partikel
  • ⚡ Geschwindigkeit – 🐢 Langsam / ▶️ Normal / ⚡ Schnell

📝 forbidFlag in konditionalen Beschreibungen

Konditionale Ortsbeschreibungen unterstützen jetzt ein zweites Dropdown 🚫 Flag (darf NICHT gesetzt sein). Damit lassen sich Beschreibungen exakter steuern: z.B. „zeige diesen Text wenn Flag A gesetzt ist, aber nur solange Flag B noch nicht gesetzt ist". Außerdem gibt es einen ↑ Nach-oben-Button um die Reihenfolge der Einträge zu ändern – wichtig, da immer der erste passende Eintrag gewinnt (spezifischste Bedingungen müssen oben stehen).

Sound-Bibliothek für Hintergrundmusik

Hintergrundmusik eines Ortes wird jetzt über die 🔊 Sound-Bibliothek referenziert statt direkt als Base64 gespeichert. Im Ort-Editor erscheint ein Dropdown mit allen Bibliotheks-Sounds. Bestehende JSON-Spiele mit direkt eingebetteter Musik werden beim Laden automatisch migriert.

Vorteil: Dieselbe Musik kann mehreren Orten zugewiesen werden ohne den JSON-Export zu vergrößern. Unter Tab 🔊 Sounds sieht man bei jedem Sound wo er eingesetzt wird (z.B. „🎵 Hintergrundmusik: Küche").

🎨
Themes & Darstellung
Stimmung durch visuelle Gestaltung

Verfügbare Themes

Theme-IDBeschreibungTipp für
modernHell, bunt, Comic Sans – StandardEinsteiger, Casual-Games
darkDunkler Hintergrund, dezentKrimis, Thriller
lightSehr hell, cleanAlltag, Schule
classicRetro-Sepia, Paper-TexturKlassische Adventures
cyberpunkNeon-Glow, schwarzSci-Fi, Dystopie
fantasyPergament, BrauntöneMittelalter, Magie
jungleDunkelgrün, organischNatur, Dschungel
spaceDunkles Lila, SterneWeltraum, Zukunft
undergroundGrau, cave-artigDungeon, Höhlen
minecraftPixelig, BlockyEinsteiger, Pixel-Art
retroGrüner CRT-Monitor-Look8-Bit-Ästhetik
lcarsStar Trek LCARS-InterfaceSci-Fi, Star Trek
kawaiiPastellrosa, runde Ecken, Punkte-MusterNiedlich, Manga, Kawaii
💡
Jeder Ort kann ein eigenes Theme haben – damit wechselt die Stimmung automatisch beim Raumwechsel. Zum Beispiel: normale Orte im classic-Theme, der Endbosskampf plötzlich in cyberpunk.

Anzeige-Einstellungen (displaySettings)

"displaySettings": {
  // ── Inventar ──────────────────────────────────────────────
  "inventoryPosition":     "right",   // right | left | bottom
  "allowInventoryChange":  true,
  "inventoryHiddenAtStart":false,
  "unlockInventoryItemId": "",
  "inventoryLayout":       "vertical",  // horizontal | vertical
  "inventoryColumns":      "1",
  "inventoryWidth":        "300",

  // ── Thumbnails ────────────────────────────────────────────
  "thumbSizeInventory":    70,
  "thumbSizeRoomObjects":  80,
  "thumbSizeNPCs":         80,
  "thumbSizeModal":        300,

  // ── Layout ────────────────────────────────────────────────
  "roomLayout":            "horizontal",
  "compactMode":           "normal",
  "locationImageSize":     "full",      // hidden | small | medium | full
  "containerMaxWidth":     1400,
  "showObjectText":        true,
  "showNPCText":           true,
  "showInventoryText":     true,
  "hideEmptySectionTitles":false,

  // ── 3-Wege-Spielmodus ──────────────────────────────────────
  "parserEnabled":         true,
  "textOnlyMode":          false,
  "textModeImages":        true,
  "terminalWidth":         "full",      // full | 600px | 700px | 800px …
  "showModeGrafik":        true,
  "showModeParser":        true,
  "showModeText":          true,

  // ── HP-System ─────────────────────────────────────────────
  "playerHPEnabled":       false,
  "playerStartHP":         100,
  "playerMaxHP":           100,
  "hpSectionTitle":        "❤️ Spieler",
  "hpUnit":                "HP",

  // ── Skill-System ──────────────────────────────────────────
  "skillSystemEnabled":    false,
  "skillStartValue":       0,
  "skillMaxValue":         100,
  "skillSectionTitle":     "⭐ Erfahrung",
  "skillLabel":            "XP",

  // ── Aufgaben-System ────────────────────────────────────────
  "goalsEnabled":          false,
  "goalsTitle":            "🎯 Aufgaben",
  "goalsPosition":         "sidebar",   // sidebar | accordion | modal
  "goals": [
    { "text": "Ziel-Text", "flag": "flag_name", "secret": false }
  ]
}
🖼️
Konditionelle Bilder
Ortsbilder die sich je nach Spielzustand automatisch ändern

Was sind konditionelle Bilder?

Jeder Ort hat ein Standard-Bild. Zusätzlich können beliebig viele konditionelle Bilder definiert werden, die das Standard-Bild ersetzen sobald ein Flag-Kriterium erfüllt ist. Der Player prüft die Liste von oben nach unten – das erste passende Bild gewinnt.

ℹ️
Das Bild wechselt sofort nach einer NPC-Tausch-Interaktion – kein Ortswechsel nötig. Alle Formate werden unterstützt: JPG · PNG · GIF · WebP · AVIF · WebM · MP4.

Im Editor einstellen

Ort auswählen → Tab 🖼️ Standard für das Basis-Bild, dann Tab 🔀 Konditional für flagabhängige Bilder.

Pro konditionellem Bild zwei optionale Bedingungen:

FeldBedeutung
requireFlagBild erscheint nur wenn dieses Flag gesetzt ist
forbidFlagBild erscheint nur wenn dieses Flag nicht gesetzt ist
imageLoopBoolean: Video/GIF wiederholen? Standard: true – gilt pro konditionalem Eintrag unabhängig vom Standard-Bild

Praxisbeispiel: Pizza-Katastrophe – Haustür

Drei Zustände, drei verschiedene Bilder – alles automatisch:

JSON-Struktur (Ort „Haustür")
"tuer": {
  "name": "Haustür",
  "image": "haustuer_leer.jpg",         // Bild A – Standard
  "conditionalImages": [
    {
      "image": "haustuer_pizza_weg.jpg", // Bild C – Bote weg
      "requireFlag": "pizza_bekommen"    // ← geprüft zuerst!
    },
    {
      "image": "haustuer_marco.jpg",     // Bild B – Bote wartet
      "requireFlag": "pizza_bestellt"
    }
  ]
}
💡
Reihenfolge ist entscheidend! Bild C muss vor Bild B stehen. Wenn pizza_bekommen gesetzt ist, gilt immer auch pizza_bestellt – käme B zuerst, würde C nie angezeigt.
Zustandpizza_bestelltpizza_bekommenBild
SpielstartA – leere Tür
Pizza bestelltB – Marco wartet
Pizza bezahltC – Marco weg, Pizza in Hand

Wann werden Flags gesetzt?

Das Flag pizza_bestellt wird im Telefon-Objekt via usableWith → setFlag gesetzt. Das Flag pizza_bekommen wird im NPC Pizza-Bote Marco via receivesItems → setFlag gesetzt – sobald der Spieler 8 Euro oder Kekse übergibt. Der Player erkennt Flags aus allen Quellen:

  • usableWith → setFlag (Objekt-Aktionen)
  • receivesItems → setFlag (NPC-Tausch) ← pizza_bekommen
  • dialogTree → setFlag (Dialog-Bäume)

Cutscene nach Objekt-Aktion

Nach einer erfolgreichen usableWith-Aktion kann automatisch eine Cutscene gestartet werden. Optional: nur einmal abspielen (playCutsceneOnce: true). Im Editor: Itemverwendung bearbeiten → „🎬 Cutscene nach Verwendung".

JSON-Format
"usableWith": [
  {
    "itemId": "zauberstab",
    "success": "Ein magisches Tor öffnet sich!",
    "playCutscene": "magie_cutscene",
    "playCutsceneOnce": true,
    "setFlag": "tor_offen"
  }
]

Konditionale Bilder bei Items (Objekten)

Nicht nur Orte – auch Items im Raum und im Info-Modal können je nach Flag-Stand ihr Bild wechseln. Das Prinzip ist identisch: erste passende Bedingung gewinnt, Fallback auf das Standard-Bild des Items.

Im Editor: Item bearbeiten → Abschnitt „🔀 Konditionale Bilder"+ Bild hinzufügen. Jeder Eintrag hat requireFlag, forbidFlag und Bild-Upload.

JSON-Format
"items": {
  "tablet": {
    "name": "Tablet",
    "image": "tablet_kein_internet.jpg",
    "conditionalImages": [
      {
        "image": "tablet_internet.jpg",
        "requireFlag": "internet_frei"
      }
    ]
  }
}

Der Bildwechsel erfolgt automatisch nach jedem Flag-setzenden Ereignis (Objekt-Aktion, NPC-Tausch, Dialog) – ohne Ortswechsel.

Konditionaler NPC-Dialog

Für einfache Fälle ohne Dialog-Baum: Der Gesprächstext eines NPCs wechselt automatisch je nach Flag-Zustand. Erste passende Bedingung gewinnt, Fallback auf den Standard-Dialog. Im Editor: NPC bearbeiten → Reiter „🔀 Konditional" beim Dialog-Feld.

JSON-Format
"npcs": {
  "papa": {
    "name": "Papa",
    "dialog": "Hast du den Schraubendreher?",
    "conditionalDialogs": [
      {
        "flag": "gegeben_schraubendreher",
        "dialog": "Danke! Ich repariere das gleich."
      },
      {
        "flag": "werkzeugkiste_leer",
        "dialog": "Die Werkzeugkiste ist jetzt leer..."
      }
    ]
  }
}

Für komplexere Gespräche mit Auswahloptionen → Dialog-Baum (dialogTree) verwenden.

Standard / Konditional – Tab-System im Editor

Alle konditionalen Inhalte sind im Editor über ein einheitliches Zwei-Reiter-System erreichbar. Der Reiter Standard zeigt den normalen Inhalt, Konditional die Flag-abhängigen Varianten. Hat ein Objekt bereits Einträge, öffnet sich der Konditional-Reiter automatisch mit Badge-Zähler.

WoWas
Objekte (Items)Bild · Beschreibung
OrteBild · Beschreibung
NPCsPortrait · Dialog

Konditionale NPC-Portraits

NPC-Portraits können ebenfalls je nach Flag-Zustand wechseln – z.B. ein trauriges Portrait bevor eine Quest erfüllt ist, danach ein lächelndes.

JSON-Format
"npcs": {
  "papa": {
    "name": "Papa",
    "portrait": "papa_neutral.jpg",
    "conditionalPortraits": [
      {
        "image": "papa_gluecklich.jpg",
        "flag": "papa_gluecklich"
      }
    ]
  }
}

Im Editor: NPC bearbeiten → Konditionale Portraits+ Portrait hinzufügen.

🎛️
3-Wege-Spielmodus
Grafik, Parser und Nur-Text – alles in einer Engine

Konditionale Item-Beschreibungen

Nicht nur das Bild – auch der Beschreibungstext eines Items kann je nach Flag-Stand wechseln. Die Beschreibung erscheint im Info-Modal (wenn der Spieler auf das Objekt klickt) und im Inventar-Detail. Erste passende Bedingung gewinnt, Fallback auf den Standard-Text.

Im Editor: Item bearbeiten → Abschnitt „📝 Konditionale Beschreibungen"+ Beschreibung hinzufügen. Jeder Eintrag hat ein Flag-Dropdown und ein Textfeld.

JSON-Format
"items": {
  "tablet": {
    "name": "Tablet",
    "description": "Das Tablet zeigt: Kein Internetzugang.",
    "conditionalDescriptions": [
      {
        "flag": "internet_frei",
        "description": "Das Tablet ist online! Du kannst jetzt surfen."
      }
    ]
  }
}

Lässt sich beliebig mit konditionalen Bildern kombinieren – so kann das Tablet bei internet_frei = true sowohl ein neues Bild als auch einen neuen Text zeigen.

Item Inline-Editor (Objekte-Tab)

Der Objekte-Tab im Editor arbeitet ohne Popup-Modals. Alle Item-Eigenschaften werden direkt im Hauptbereich bearbeitet: Name, Item-ID, Beschreibung, Tags, Bild/Video, Self-Use (sofort benutzen ohne Ziel), konditionale Bilder und konditionale Beschreibungen. Änderungen werden beim Verlassen eines Felds automatisch gespeichert – ein separater Speichern-Button ist optional.

Die linke Liste zeigt alle Items mit ihrer ID. Klick auf ein Item → sofortiger Wechsel, alle Felder werden neu geladen.

Die drei Modi

ModusSteuerungDarstellungIdeal für
🖼️ GrafikMausklick / TastaturBilder, Karten, ButtonsEinsteiger, alle Altersgruppen
⌨️ ParserFreitext + KlickGrafik + Parser-LeisteGemischte Zielgruppe
📟 Nur-TextFreitext-BefehleTerminal, scrollendes LogKlassische IF, Zork-Stil

Der Spieler kann jederzeit umschalten – der Spielstand bleibt erhalten. Der Designer legt im Editor fest welche Buttons überhaupt sichtbar sind.

Im Editor konfigurieren

Tab 🎨 Anzeige → Abschnitt „📟 Nur-Text-Modus":

EinstellungBeschreibung
Nur-Text-Modus aktivierenStartet das Spiel direkt im Terminal
🖼️ Ortsbilder im TextmodusZeigt Ortsbild inline im Log (Stundenglas-Stil)
📐 Terminal-BreiteVoll / 600–1000 px (zentriert)
Sichtbare Modus-ButtonsJe Checkbox: Grafik / Parser / Text anzeigen

Nur-Text-Modus mit Ortsbildern

Wenn „Ortsbilder im Textmodus" aktiviert ist, erscheint das Bild direkt im Log-Fluss – direkt über der Raumbeschreibung. Das Bild scrollt mit dem Text mit, sodass beim Raumwechsel automatisch das neue Bild sichtbar ist. Ein 🖼️-Button im Header blendet alle Bilder ein/aus.

💡
Konditionelle Bilder funktionieren auch im Nur-Text-Modus vollständig – das richtige Bild erscheint abhängig vom aktuellen Flag-Zustand.

Tastaturkürzel im Grafik- und Parser-Modus

TasteAktion
1–9Ausgang Nr. 1–9 betreten
A, B, C …NPC ansprechen (A = erster NPC im Raum)
↑ ↓ ← →Richtungsausgänge (N/S/O/W)
EnterModal bestätigen / Dialog-Option
EscapeModal schließen
IInventar anzeigen (Parser-Modus)
?Tastaturhilfe
ℹ️
Ausgänge und NPCs bekommen sichtbare Hinweise (1, 2 … bzw. A, B …) direkt auf den Karten angezeigt. Im Parser-Modus sind A–Z für die Texteingabe reserviert und lösen keine NPC-Shortcuts aus.
🆕
Neue Editor-Features
Undo/Redo · Globale Suche · Orts-Graph · Verbesserte Orts-Liste

↩️ Undo / Redo

Jede Änderung im Editor ist rückgängig machbar – bis zu 50 Schritte zurück. Kein versehentliches Löschen ist mehr permanent.

AktionTastaturButton
Rückgängig machenStrg+Z (Win) · ⌘+Z (Mac)↩️ in der Toolbar
WiederholenStrg+Y (Win) · ⌘+Y (Mac)↪️ in der Toolbar
ℹ️
Undo/Redo funktioniert für alle Änderungen an Orten, NPCs, Items, Rezepten und Einstellungen. Tastaturkürzel sind nur aktiv wenn kein Eingabefeld fokussiert ist.

🔍 Globale Suche

Das Suchfeld oben rechts in der Toolbar durchsucht das gesamte Spiel in Echtzeit – Orte, NPCs, Items und Flags. Ein Klick auf ein Ergebnis springt direkt zur richtigen Stelle.

Suche findet:
TypDurchsuchte Felder
📍 OrteName, ID, Beschreibungstext
🗨️ NPCsName, ID
📦 ItemsName, ID, Beschreibung
🚩 FlagsFlag-Name
💡
Bei großen Spielen mit 20+ Orten und 50+ Items ist die Suche unverzichtbar – z.B. „schlüssel" findet sofort alle Items, Orte und Flags die das Wort enthalten.

🗺️ Orts-Graph

Der neue Graph-Tab zeigt alle Orte als interaktive Knotenpunkte und alle Verbindungen (Exits) als Pfeile dazwischen. Ideal um den Überblick bei komplexen Spielen zu behalten.

FarbeBedeutung
🟡 Gelber RahmenStartort des Spiels
🟢 Grüner HintergrundOrt hat ein Ortsbild
🔵 Blauer HintergrundNormaler Ort
🔴 Roter HintergrundOrt hat Validierungsfehler
🟡 Gestrichelter PfeilBedingter Exit (requireFlag / requiredItem)
InteraktionFunktion
Knoten klickenOrt im Editor öffnen
Knoten ziehenPosition im Graph verschieben
Hintergrund ziehenAnsicht verschieben (Pan)
MausradZoom in/aus (0.3× bis 3×)
„Auto-Layout"Knoten automatisch anordnen
„Ansicht zurücksetzen"Zoom und Position zurücksetzen

📌 Verbesserte Orts-Liste

Die Orts-Liste in der linken Sidebar zeigt jetzt auf einen Blick:

  • Miniaturvorschau (48×36 px) des Ortsbildes – sofort erkennbar welcher Ort was ist
  • Startort-Markierung
  • 👤2 Anzahl NPCs
  • 📦3 Anzahl Objekte
  • 🚪2 Anzahl Ausgänge
  • ⚠️ Validierungswarnung

🏷️ Item-ID Umbenennung mit automatischem Referenz-Update

Im Tab 📦 Objekte kann die interne Item-ID direkt bearbeitet werden. Wenn du eine ID änderst, aktualisiert der Editor automatisch alle Verweise im gesamten Spiel:

BereichWas wird aktualisiert
Orts-ObjekteitemId, usableWith[].itemId, spawnObjectId
NPCsreceivesItems[].itemId, receivesItems[].givesItemId, givesItems[]
Rezepteitem1Id, item2Id, resultId
Anzeige-EinstellungenunlockInventoryItemId
Spielende-BedingungengameEnds.win/lose[].value
💡
Nach dem Speichern zeigt der Editor: „ID aktualisiert: alteid → neueid". So siehst du sofort ob die Umbenennung erfolgreich war.
⌨️
Parser-Modus
Freitext-Eingabe als Alternative zum Klicken

Was ist der Parser-Modus?

Jedes Spiel kann optional per Freitext gespielt werden. Ein Toggle-Button im Player-Header schaltet zwischen Klick-Modus und Parser-Modus um. Beide Modi laufen parallel – der Spieler kann jederzeit wechseln, ohne den Spielstand zu verlieren.

ℹ️
Aktivieren im Editor: Tab 🎨 Anzeige → Abschnitt "⌨️ Parser-Modus" → Checkbox aktivieren. Nur dann erscheint der Toggle-Button im Player.

Vollständiges Vokabular

🗺️ Gehen

VerbenBeispiele
GEHE · GEH · LAUFE · BETRETEGEHE NORDEN · BETRETE KUECHE
Kurzformen: N S O W H RN · NORDEN · SÜD · OSTEN · WESTEN · HOCH · RUNTER
Freie AusgangsnamenGEHE ZUR HAUSTÜR · GEHE IN DIE KÜCHE

📦 Nehmen

NIMM · NEHME · AUFHEBEN · AUFNEHMEN · GREIF · STECKE EIN · SAMMLE

🗑️ Ablegen

LEGE AB · ABLEGEN · WIRF WEG · WEGWERFEN · ABGEBEN

🔍 Untersuchen

UNTERSUCHE · SCHAU AN · BETRACHTE · PRÜFE · INSPIZIERE · X · LOOK · L

Zeigt die Beschreibung eines Objekts oder Items – ohne eine Aktion auszulösen.

🔎 Durchsuchen

DURCHSUCHE · DURCHSUCHEN · SUCHE IN · WÜHLE IN · FILZE · STÖBERE IN · KRAME IN · GRABE IN

Löst Direkt-Aktionen an Raumobjekten aus – ideal für Objekte die man "durchsuchen", "öffnen" oder "aktivieren" kann ohne ein Item zu brauchen.

💡
DURCHSUCHE allein (ohne Ziel) listet alle durchsuchbaren Objekte im Raum auf.

🔧 Benutzen (solo)

BENUTZE · VERWENDE · NUTZE · SETZE EIN · WENDE AN · KOMBINIERE · MISCHE

Erkennt automatisch ob das Argument ein Inventar-Item (→ auf passendes Raumobjekt anwenden) oder ein Raumobjekt (→ Direkt-Aktion) ist.

⚗️ Benutzen mit

MusterBeispiele
BENUTZE [X] MIT [Y]BENUTZE STAUBSAUGER MIT STAUB
KOMBINIERE [X] MIT [Y]KOMBINIERE 5 EURO MIT 3 EURO
MISCHE [X] MIT [Y]MISCHE SEIFE MIT EIMER
BENUTZE [X] AUF [Y] / [X] UND [Y]BENUTZE SCHLÜSSEL AUF TRUHE

Prüft zuerst Rezept (beide Items im Inventar), dann Raumobjekt. Reihenfolge ist egal.

🎁 Geben an NPC

VerbenVerbinderBeispiel
GIB · GEBE · ÜBERGIB · BRINGE · ZEIGEAN · ZU · BEI · DEM · DERGIB STAUBSAUGER AN MAMA

💬 Sprechen · 🚪 Öffnen · 🎒 Inventar · ❓ Hilfe

FunktionVerben
SprechenSPRICH MIT · REDE MIT · FRAG · ANTWORTE
ÖffnenÖFFNE · AUFMACHEN · MACH AUF
SchließenSCHLIESSE · SCHLIEßEN · MACH ZU
InventarINVENTAR · INV · I
UmschauenSCHAU DICH UM · UMGEBUNG · LOOK · L
HilfeHILFE · HELP · H · ?

Parser-Tipps für Game Designer

Synonyme pro Item (Tab 📦 Objekte)

Im Feld Parser-Synonyme kommagetrennte Alternativnamen eintragen. Groß-/Kleinschreibung egal, Teilwörter werden erkannt.

Item: "Goldener Schlüssel"
Synonyme: schluessel, rost, key

NIMM SCHLÜSSEL, NIMM ROST und NIMM KEY funktionieren alle.

Direkt-Aktionen parser-freundlich gestalten

Damit DURCHSUCHE und BENUTZE [Objekt] funktionieren, braucht das Objekt in usableWith einen Eintrag mit leerem itemName:

"usableWith": [{
  "itemName": "",
  "actionLabel": "🔍 Durchsuchen",
  "success": "Du wühlst zwischen den Kissen... 5 Euro!"
}]

Komplettlösung per Parser: Pizza-Katastrophe

SCHAU DICH UM
BENUTZE TELEFON
DURCHSUCHE SOFA-KISSEN
NIMM 5 EURO
GEHE IN DIE KÜCHE
DURCHSUCHE KEKSDOSE
NIMM KEKSE
GEHE ZURÜCK INS ZIMMER
NIMM STAUBSAUGER
BENUTZE STAUBSAUGER MIT STAUB
GIB STAUBSAUGER AN MAMA
NIMM 3 EURO
KOMBINIERE 5 EURO MIT 3 EURO
GEHE ZUR HAUSTÜR
GIB 8 EURO AN MARCO
-- oder: GIB KEKSE AN MARCO
🔊
Sound-Bibliothek & SFX
Soundeffekte zentral verwalten – einmal hochladen, überall einsetzen

Was ist die Sound-Bibliothek?

Neben der Hintergrundmusik pro Ort unterstützt ABP jetzt auch Soundeffekte (SFX) – kurze Klänge die bei konkreten Spielereignissen abgespielt werden. Alle Sounds werden einmalig in der zentralen Bibliothek gespeichert. Objekte, Rezepte und Items referenzieren den Sound dann nur noch per ID – kein doppeltes Speichern derselben Audiodatei.

ℹ️
Tab 🔊 Sounds im Editor – zwischen „🏁 Enden" und „⚙️ Features". Hier verwaltest du die gesamte Bibliothek: hochladen, umbenennen, voranhören, ersetzen, löschen.

JSON-Struktur der Bibliothek

"sounds": {
  "snd_1234_abc": {
    "name": "💥 Explosion",
    "data": "data:audio/mp3;base64,..."
  },
  "snd_5678_xyz": {
    "name": "🔑 Tür knarrt",
    "data": "data:audio/mp3;base64,..."
  }
}

Die IDs werden automatisch generiert. Du referenzierst sie überall im Spiel als einfacher String – z.B. "sfx": "snd_1234_abc".

SFX-Felder – wo einsetzbar

StelleJSON-FeldWann wird er gespielt?
Item aufnehmenitems["id"].sfxSpieler nimmt das Objekt ins Inventar
usableWith ErfolgusableWith[i].sfxItem erfolgreich auf Objekt angewendet
Rezept gecraftetrecipes[i].sfxZwei Items erfolgreich kombiniert
Spieler HP-SchadendisplaySettings.sfx.hitSpieler wird vom NPC getroffen
Spieler HeilungdisplaySettings.sfx.healHeiltrank oder selfUse mit healHP
Skill-Level steigtdisplaySettings.sfx.levelupKampf-Skill erhöht sich
Spieler stirbtdisplaySettings.sfx.deathSpieler-HP sinkt auf 0
NPC besiegtdisplaySettings.sfx.npcDefeatNPC-HP sinkt auf 0 (onDefeat)
💡
Kampf-Sounds (hit, heal, levelup, death, npcDefeat) sind global und gelten für das gesamte Spiel. Sie werden im Tab ⚙️ Features im Abschnitt „🔊 Kampf-Sounds" per Dropdown zugewiesen.

Beispiel: Schlüssel mit Pickup-Sound

"rost_schluessel": {
  "name": "🔑 Rostiger Schlüssel",
  "description": "Ein alter, verrosteter Schlüssel.",
  "sfx": "snd_1234_abc"  // Knarr-Sound aus der Bibliothek
}

Beispiel: Tür öffnen mit SFX

"usableWith": [{
  "itemId": "rost_schluessel",
  "success": "Die Tür quietscht auf!",
  "setFlag": "tuer_offen",
  "removeItem": true,
  "sfx": "snd_5678_xyz"  // Tür-knarrt-Sound
}]

Sound-Bibliothek im Editor verwalten

AktionBeschreibung
➕ HochladenMP3, OGG oder WAV – Name wird automatisch aus dem Dateinamen vorgeschlagen
▶️ VorschauSound direkt im Editor anhören
✏️ UmbenennenName direkt in der Karte bearbeiten – alle Referenzen bleiben gültig (ID ändert sich nicht)
🔄 ErsetzenNeue Audiodatei hochladen – alle Stellen im Spiel spielen sofort den neuen Sound
🗑️ LöschenWarnung wenn der Sound noch in Verwendung ist (Zähler zeigt wie oft)
⚠️
Wenn ein Sound gelöscht wird der noch referenziert wird, wird er an diesen Stellen stumm – es kommt aber zu keinem Fehler. Der Verwendungs-Zähler in der Bibliothek zeigt dir vorher wie oft ein Sound genutzt wird.

Technische Hinweise

ℹ️
Rückwärtskompatibel: Alte JSON-Dateien die Base64-Audio direkt im sfx-Feld gespeichert haben (statt einer Sound-ID) werden vom Player weiterhin korrekt abgespielt. Eine Migration ist nicht nötig.
ℹ️
SFX unterbricht BGM nicht: Soundeffekte laufen parallel zur Hintergrundmusik. Der globale Sound-an/aus-Schalter im Player gilt für beide.
🔗
Spiel per URL laden
?JSON=dateiname – direkt aus der URL starten

Was ist das?

Der Player kann eine JSON-Datei automatisch laden wenn der Dateiname als URL-Parameter übergeben wird. Damit kann ein Spiel direkt über einen Link gestartet werden – ohne dass der Spieler erst eine Datei auswählen muss.

URL-Format

player.html?JSON=pizza-katastrophe
player.html?JSON=pizza-katastrophe.json   // .json optional
player.html?game=zoo-verrueckt            // auch ?game= wird erkannt
ℹ️
Die JSON-Datei muss im selben Verzeichnis wie player.html auf dem Webserver liegen. Lokal (per file://) funktioniert das aus Sicherheitsgründen nicht – nur auf einem echten Webserver.

Auf der Homepage einsetzen

Statt für jedes Spiel eine eigene Standalone-HTML-Datei (Packager) zu erzeugen, kannst du einfach die JSON-Datei hochladen und direkt verlinken:

<!-- Statt: -->
<a href="pizza-katastrophe.html">Spielen</a>

<!-- Einfacher: -->
<a href="player.html?JSON=pizza-katastrophe">Spielen</a>
VorteilBeschreibung
PlatzsparendNur die kleine JSON-Datei hochladen – kein 8.500-Zeilen-Player pro Spiel
Immer aktuellWenn du den Player verbesserst, profitieren alle Spiele sofort
Einfaches UpdateNeues JSON hochladen – der Link bleibt gleich
📋
JSON-Schnellreferenz
Alle wichtigen Felder auf einen Blick

Vollständige Grundstruktur

{
  // === PFLICHT ===
  "title": "Spielname",
  "startLocation": "ort_id",

  // === OPTIONAL ===
  "author": "Dein Name",
  "version": "1.0",
  "defaultTheme": "modern",
  "startInventory": ["item_id_1", "item_id_2"],

  // === KERN-DATEN ===
  "locations": { /* Orte */ },
  "items": { /* Gegenstände */ },
  "npcs": { /* Charaktere */ },
  "recipes": [ /* Rezepte */ ],
  "quests": [ /* Aufgaben */ ],
  "flags": { /* Spielzustände */ },
  "sounds": { /* 🔊 Sound-Bibliothek */ },
  "cutscenes": { /* Story-Sequenzen */ },
  "gameEnds": { "win": [], "lose": [] },
  "displaySettings": { /* Layout */ }
}

usableWith – alle Felder

FeldTypBeschreibung
itemIdstringItem-ID (bevorzugt)
itemNamestringItem-Name (Legacy-Kompatibilität)
actionLabelstringButton-Text (leer = kein Item nötig)
successstringErfolgsmeldung
givesItemIdstringItem erscheint im Inventar
requireItemIdstringZusätzliches Item muss vorhanden sein
requireFlagNotstringGesperrt wenn diese Flag TRUE ist
changeObjectstringObjekt wird durch dieses ersetzt
spawnObjectstringNeues Objekt erscheint im Raum
spawnCanTakebooleanKann gespawntes Objekt aufgenommen werden?
removeObjectbooleanObjekt verschwindet
removeItembooleanVerwendetes Item wird verbraucht
setFlagstringDiese Flag wird gesetzt
clearFlagstringDiese Flag wird gelöscht
teleportTostringSpieler wird teleportiert
playCutscenestringCutscene wird danach abgespielt
playCutsceneOncebooleanCutscene nur einmal abspielen
quantitynumberWie oft nutzbar?
quantityMessagestringMeldung wenn aufgebraucht
damagenumberSchaden bei HP-Objekten
sfxstring🔊 Sound-ID aus der Bibliothek – spielt bei Erfolg
Checkliste
Ist dein Spiel fertig zum Testen?

Vor dem ersten Test

📁 Grundstruktur

  • startLocation ist gesetzt und der Ort existiert
  • Alle Orte haben Name und Beschreibung
  • Kein Ort verweist auf einen nicht-existierenden Ort (Exits)
  • Mindestens eine Sieg-Bedingung ist definiert

📦 Items & Inventar

  • Alle Items die in Rezepten, Exits oder usableWith verwendet werden, sind in items definiert
  • Wenn Inventar-Freischaltung: Freischalt-Item liegt als Raumobjekt vor, nicht als Tausch-Item

🗨️ NPCs & Dialog

  • Jeder NPC hat entweder einen statischen Dialog oder einen Dialog-Baum mit start-Knoten
  • receivesItems verweist auf Items die der Spieler auch wirklich finden kann
  • flagBranch-Ziel-Knoten existieren im Dialog-Baum

🏁 Spielende

  • Spielende-Bedingungen sind erreichbar (kein unlösbares Spiel)
  • Wenn teleportTo gesetzt: Ziel-Ort existiert
  • Wenn playCutscene gesetzt: Cutscene-ID existiert
  • message ist ausgefüllt (title + message + buttonText empfohlen)

🎬 Cutscenes

  • Alle referenzierten Cutscene-IDs existieren in cutscenes
  • game_intro vorhanden (optional, aber empfohlen)
  • playCutsceneOnce: true gesetzt wo nötig

🚩 Flags

  • Alle Flags die als Bedingung verwendet werden, sind in flags definiert
  • Flag-Namen sind konsistent (exakt gleich geschrieben)
💡
Best Practices
Tipps für besseres Game Design

Namenskonventionen

WasEmpfehlungBeispiel
Ort-IDsBeschreibend, klein, Unterstrichwald_eingang, schloss_thronsaal
Item-IDsBedeutungsträger, eindeutigrost_schluessel, heiltrank_gross
Flag-NamenZustand beschreibentuer_offen, boss_besiegt
Cutscene-IDsAuslöser erkennbargame_intro, boss_defeat

Story-Struktur

  • Tutorial-Ort: Der erste Ort sollte die Grundmechaniken erklären – am besten durch Handeln, nicht durch langen Text
  • Klare Ziele: Der Spieler sollte immer wissen was als nächstes zu tun ist – NPCs geben Hinweise
  • Belohnungen: Nach jedem Rätsel eine Belohnung – ein neues Item, eine Cutscene, eine neue Tür
  • Mehrere Wege: Dialog-Bäume und bedingte Ausgänge ermöglichen verschiedene Spielwege

Balance & Schwierigkeit

  • Kampfsystem: Feinde mit 100–200 HP, Waffen mit 20–40 Schaden gibt 3–8 Treffer pro Kampf
  • Rezepte: Nicht mehr als 2–3 Kombinationsschritte hintereinander – sonst wird's frustierend
  • Hinweise: Wenn Rätsel schwer sind, sollte mindestens ein NPC einen Tipp geben können
  • Sackgassen vermeiden: Teste jeden möglichen Weg – gibt es eine unbeabsichtigte Situation wo der Spieler feststeckt?

Atmosphäre & Stil

  • Themes konsequent einsetzen: Wechsle das Theme nur bei wichtigen Momenten – zu viele Wechsel wirken unruhig
  • Beschreibungen: Atmosphäre geht vor Fakten. "Es riecht modrig, ein Tropfen fällt in die Stille" ist besser als "Ein Keller, 3x4 Meter."
  • NPC-Persönlichkeit: Jeder NPC sollte eine eigene Sprache haben – Händler reden von Profit, Wachen von Pflicht
  • Cutscenes sparsam: Cutscenes sind emotionale Höhepunkte – zu viele davon verlieren ihre Wirkung

Typische Spielmuster als Vorlage

🔑 Schlüssel-Tür

Item finden → an Objekt verwenden → Flag setzen → Ausgang freischalten. Das klassischste Muster.

📜 Boten-Quest

Item A von NPC A erhalten → Item A zu NPC B bringen → Belohnung erhalten. Gut für strukturierte Quests.

⚗️ Mehrstufiges Crafting

Item A + Item B = Item C → Item C + Item D = Item E → Item E auf Objekt anwenden. Gut für Rätsel die Vorausdenken erfordern.

⚔️ Boss mit Belohnung

NPC mit maxHP → mit Waffe bekämpfen → onDefeat gibt Item und setzt Flag → Game End wird ausgelöst.

🎭 Geschichte mit mehreren Enden

Dialog-Baum mit setFlag → verschiedene Flags führen zu verschiedenen Win-Bedingungen mit unterschiedlichen Meldungen und Cutscenes.

📜
Quests – ein Hinweis
Warum der Tab entfernt wurde

Quests werden durch Flags ersetzt

Der Quest-Tab wurde aus dem Editor entfernt, weil das Quest-System im Player nie implementiert war – Quests wurden im JSON gespeichert, aber nie angezeigt oder ausgewertet.

⚠️
Bestehende Spiele: Wenn dein JSON ein "quests": [...]-Feld enthält, schadet das nicht – der Player ignoriert es einfach. Du musst nichts ändern.

So baust du Quest-Mechaniken mit Flags

Alles was ein Quest-System leisten soll, lässt sich vollständig mit dem Flag-System abbilden:

Beispiel: Mehrstufige Quest "Brot backen"
// Schritt 1: Rezept – Mehl + Wasser = Teig
{ "item1": "mehl", "item2": "wasser", "result": "teig" }

// Schritt 2: NPC nimmt das Brot entgegen
"receivesItems": [{
  "itemId": "brot",
  "message": "Danke! Hier hast du deine Belohnung.",
  "givesItemId": "gold",
  "setFlag": "brot_abgegeben"
}]

// Schritt 3: Spielende wenn Quest abgeschlossen
"win": [{
  "type": "flag",
  "value": "brot_abgegeben",
  "message": "Du hast die Aufgabe erfüllt!"
}]
💡
Fortschrittsanzeige für den Spieler? Nutze NPC-Dialoge mit flagBranch – der NPC sagt etwas anderes je nachdem ob die Quest-Flag schon gesetzt ist.