Regelsatzebenen, Übersetzungen und Migrationen

Auf dieser Seite erfährst du, wie du Varianten anbietest, die ein Spieler für ein einzelnes Spiel einschaltet, wie du die Texte eines Regelsatzes übersetzt und wie du gespeicherte Werte auf neue IDs verschiebst, wenn sich ein Bogen ändert. Sie richtet sich an Regelsatz-Autoren. Bevor du anfängst, lies Regelsätze für Game Mode schreiben.

Ebenen: Varianten deines eigenen Regelsatzes

Eine Ebene ist eine benannte Variante deines Regelsatzes, die der Spieler bei der Spielerstellung einschaltet: seltene Magie, ein harter Winter oder ein härterer Schwierigkeitsgrad. Ebenen stehen in einem optionalen layers-Array in der Regelsatzdatei. Sie reisen dadurch mit ihr und können einem Spiel, das sie verwendet hat, nie fehlen. Der Assistent zeigt sie als Schalter unter deinem Regelsatz. Die Auswahl gilt wie der Regelsatz selbst für die gesamte Lebensdauer dieses Spiels.

"layers": [
  {
    "id": "hard_winter",
    "label": "Hard winter",
    "summary": "Cold, hunger and short days. Everything is harder.",
    "conflicts": ["mud_season"],
    "gm": {
      "guidance": "Hard winter is on. Let a failed check cost warmth, food or daylight as well as progress.",
      "worldGuidance": "Hard winter is on. Build a world of closed roads, thin stores and rationed settlements."
    },
    "fields": [{ "id": "calling", "removeValues": ["Sailor"], "default": "Hauler" }],
    "difficultyLadder": [{ "label": "Easy", "dc": 7 }],
    "catalogs": [{ "id": "knacks", "hide": { "filter": "grit", "above": 0 } }]
  },
  {
    "id": "mud_season",
    "label": "Mud season",
    "summary": "Thaw, flooded roads and slow going."
  }
]

Was eine Ebene kann. Die Liste ist geschlossen. Jede Wirkung schränkt entweder etwas ein oder fügt Text hinzu:

"items": {
  "market": { "removeSellers": ["magic_dealer", "scribe"], "unsold": [{ "tag": "magical" }] },
  "lootTables": [{ "id": "treasure_low", "label": "Pocket treasure", "entries": [{ "coins": "sp", "weight": 1, "count": "4d6" }] }]
}

Was eine Ebene nicht kann. Sie kann weder Enum-Werte, Felder, Fertigkeiten, Pools, Rasten, Händler oder Beutetabellen hinzufügen noch die Auflösungsart ändern, laufenden Zustand oder Kampfzahlen verändern oder einen Modellaufruf ergänzen. Ein von einer Ebene _hinzugefügter_ Wert wäre allen anderen Lesern des Bogens unbekannt. Deshalb können Werte nur entfallen. Alles außerhalb dieser Liste ist eine Änderung des Regelsatzes selbst oder ein zweiter Regelsatz.

Konflikte. conflicts nennt Ebenen, die nicht gleichzeitig aktiv sein dürfen. Die Angabe auf einer Seite des Paares reicht. Der Assistent deaktiviert den anderen Schalter. Enthält eine gespeicherte Auswahl dennoch beide, entfällt die später deklarierte. Dieselben zwei Auswahlen ergeben dadurch immer dieselben Regeln.

Ein Bogen mit einem entfernten Wert behält ihn. Kein Charakter wird umgeschrieben. Der Editor bietet den Wert nicht mehr an; bei einem Charakter, der ihn schon hatte, zeigt er ihn weiterhin an. Wird die Ebene in einem neuen Spiel ausgeschaltet, steht der Wert wieder zur Auswahl. Dasselbe gilt für einen ausgeblendeten Katalogeintrag: Er fehlt in der Auswahl, doch bereits ausgewählte Zeilen bleiben auf dem Bogen. Münzen, die eine Ebene herausnimmt und die jemand bereits mitführt, bleiben in seiner Tasche.

Grenzen. 12 Ebenen pro Regelsatz und 4000 Zeichen Anleitungstext je Ebene, beide Zeichenfolgen zusammengezählt. Ein als Paket ausgelieferter Regelsatz mit layers oder einem grundlegenden gm.worldGuidance braucht Capability API 1.25, einer, dessen Ebenen Münzen herausnehmen, braucht 1.64, und einer, dessen Ebenen sein items ändern, braucht 1.813. Ein importierter Regelsatz wird von der lesenden Engine geprüft und braucht keine solche Angabe.

Von anderen geschriebene Ebenen, etwa eine separat ausgelieferte Ebene für seltene Magie zu einem fremden Regelsatz, sind für später vorgesehen. Derzeit wird eine Ebene im zugehörigen Regelsatz ausgeliefert.

Übersetzungen

Übersetzungen (Capability API 1.811). Die Anzeigetexte eines Regelsatzes in einer anderen Sprache bilden eine Übersetzung pro Sprache, benannt nach dem Sprachcode wie die eigenen Sprachpakete der Engine (ru, pt-BR, zh-Hans). Im offiziellen Agentenkatalog ist jede davon ein Sprachpaket neben der Regelsatzdatei (siehe unten). Eine Regelsatz-Paketdatei, die du teilst, kann sie stattdessen in sich tragen, eine Datei pro Sprache neben ruleset.json: locales/<language>.json, wie die anderen Dateien im Manifest aufgeführt. In beiden Fällen ist jede ein Lokalisierungskatalog für das Paket mit einem Abschnitt ruleset: Jeder Schlüssel ist ein Anzeigetext des Regelsatzes oder seiner Kataloge, Wort für Wort auf Englisch, und sein Wert ist dieser Text in der Sprache der Datei.

{
  "_meta": { "locale": "ru", "direction": "ltr" },
  "package": { "name": "5e (SRD 5.1)" },
  "ruleset": { "Prone": "Лежащий", "Fire Bolt": "Огненный снаряд", "Goblin": "Гоблин" }
}

_meta.locale muss die Sprache sein, nach der die Datei benannt ist, und die Datei enthält $schema, _meta, package und ruleset und nichts anderes, jeden Wert als Text. Ein leer gelassener Text ist noch nicht übersetzt und erscheint auf Englisch; eine Datei ohne Abschnitt ruleset (der eigene englische Eintrag eines Pakets, locales/en.json) übersetzt nichts. Übersetzungen dienen nur der Anzeige: Die Regeln, die Charakterbogenbefehle und alles, was dem Game Master mitgeteilt wird, lesen weiterhin das Englische. Der Kampfbildschirm (Namen, Zustände, Aktionen, Zauber, das Protokoll und die Zugreihenfolge) zeigt jeden Text in der Sprache des Spielers, sofern die Übersetzung des Regelsatzes ihn enthält, zuerst aus der Datei dieser Sprache selbst und dann aus der Datei der Sprache, von der sie eine Variante ist (pt für pt-BR), und andernfalls auf Englisch; „Goblin 2“ zeigt die Übersetzung von „Goblin“ mit ihrer Zahl. Eine Paketdatei mit Übersetzungen braucht Capability API 1.811. Beim Import wird nur die Übersetzung in der Sprache behalten, auf die die Engine eingestellt ist (oder der Sprache, von der sie eine Variante ist), und der Rest verworfen; um den Regelsatz in einer anderen Sprache zu lesen, ändere die Sprache der Engine und importiere die Datei erneut, wodurch die behaltene Übersetzung ersetzt wird. Übersetzungen sind kein Teil der Version; ein erneuter Import derselben Version mit einer korrigierten Übersetzung ersetzt diese also ebenfalls, und eine Datei dieser Version ohne Übersetzung lässt die behaltene bestehen.

Ein Katalogregelsatz enthält nie locales/<language>.json in seiner Datei (einer, der dies tut, wird vor dem Herunterladen abgelehnt). Seine Übersetzungen sind Sprachpakete (Capability API 1.811): eine JSON-Datei pro Sprache, <id>-<version>.<language>.json, neben <id>-<version>.ruleset.json veröffentlicht und mit genau dem Inhalt einer locales/<language>.json (_meta.locale mit der Sprache, nach der sie benannt ist, sowie ein Abschnitt ruleset). Der Katalogeintrag führt sie neben seinem artifact auf:

"locales": {
  "ru": {
    "url": "https://raw.githubusercontent.com/Pasta-Devs/Marinara-Agents/main/artifacts/ember-roads-1.0.0.ru.json",
    "sha256": "<64 hex>",
    "bytes": 812345,
    "name": "Угольные дороги",
    "description": "<the store card's description in Russian>"
  }
}

Jedes Paket ist eine https-URL in derselben Form wie die des Artefakts, benannt nach seiner Version und Sprache, mit seinem sha256 und seiner Größe (höchstens 8 MB); ein Regelsatz führt höchstens 40 auf, nie en (das Englische ist der Regelsatz selbst), und sein Manifest deklariert Capability API 1.811. name und description sind die Texte der Store-Karte in dieser Sprache, sodass die Karte in der Sprache der Engine angezeigt wird, ohne das Paket abzurufen. Eine Installation ruft die Regelsatzdatei ab und dann nur das Paket in der Sprache, auf die die Engine eingestellt ist (oder der Sprache, von der sie eine Variante ist), prüft seine Größe, Prüfsumme und Sprache und behält es zusammen mit der installierten Version. Wenn sich die Sprache der Engine ändert (und jedes Mal, wenn darin eine Seite geöffnet wird), ruft jeder installierte Katalogregelsatz, der ein Paket in der neuen Sprache aufführt, dieses ab, und das Paket der alten Sprache wird entfernt. Ist ein Paket nicht verfügbar (offline, keines aufgeführt oder nicht die vom Katalog aufgeführte Datei), bleibt der Regelsatz auf Englisch; die nächste Installation oder Sprachänderung versucht es erneut. Ein Update behält die vorherige Version für einen Rollback, ohne ihr Paket: Nach einem Rollback ruft die nächste Sprachänderung das Paket dieser Version erneut ab, sofern der Katalog es noch aufführt.

Werte auf neue IDs verschieben: sheet.migrations

Hinzufügen braucht nichts weiter. Verschiebt eine neue Form des Bogens einen Wert an eine andere Stelle (ein umbenanntes Feld, eine Stufe, die zu einer Stufe pro Klasse wird, ein Pool von Trefferwürfeln, der zu einem Pool pro Würfeltyp wird), gib in sheet.migrations (Capability API 1.77) an, wie; so behält jeder Charakter, der auf der alten Form erstellt wurde, seine Zahlen: in der Bibliothek, in Spielen, in alten Spielständen, Verzweigungen und Checkpoints und in importierten Karten.

"migrations": [
  {
    "from": 3,
    "steps": [
      { "rename": "field", "from": "xp", "to": "experience" },
      {
        "route": "level",
        "by": "class",
        "cases": [
          { "words": ["fighter"], "to": "level_fighter" },
          { "words": ["wizard"], "to": "level_wizard" }
        ],
        "else": "level_other",
        "default": 1
      },
      {
        "routeLive": "pool",
        "from": "hit_dice",
        "cases": ["hit_dice_d6", "hit_dice_d8", "hit_dice_d10", "hit_dice_d12"],
        "else": "hit_dice_d8"
      }
    ]
  }
]