Charakterbogen-Scripte

Hinzufügen eines Charakterbogen-Scripts

Um ein Charakterbogen-Script zu einem Charakterbogen hinzuzufügen, füge das Script einfach in den "HTML" Abschnitt des Bogen mit dem folgenden Format hinzu:

<Script Typ="text/worker">

on("change:stärke", Funktion() {

});

// ... etc

</Script>

Beachten Sie, dass das Script-Tag einen Typ von "text/worker" haben muss, um vom System ordnungsgemäß verarbeitet zu werden. Wenn das Spiel geladen wird, werden alle Skript-Tags aus der Vorlage des Blattes aus Sicherheitsgründen entfernt. Allerdings werden Skript-Tags mit dem Typ "text/worker" verwendet, um auf jedem Computer der Spieler einen Hintergrundarbeiter zu starten, der auf sich ändernde Werte in ihren Blättern reagieren und bei Bedarf Maßnahmen ergreifen kann. Alle Sheetworker-Skripts müssen innerhalb eines einzelnen Skript-Tags enthalten sein.

Weitere umfassende Beispiele für die Grundlagen für Nicht-Programmierer konzipiert

Warnung über den Geltungsbereich "globaler" Variablen:der Geltungsbereich einer Variable, dieinnerhalbder `<script type="text/worker">` aberaußerhalbeiner Funktion deklariert wurde, sind derzeit proSpieler, nicht pro Zeichen. Wenn sich der Wert ändert, ändert er sich für alle Charaktere in der Sitzung deines Spielers.

Es ist generell eine bessere Praxis, alle für Berechnungen benötigten Attribute in einem getAttrs abzurufen, anstatt getAttrs - 0 Berechnungen - 1 setAttrs - 2 getAttrs - 3 Berechnungen - 4 setAttrs 5 durchzuführen. Es ist in der Regel eine bessere Praxis, alle für Berechnungen benötigten Attribute in einem getAttrs abzurufen, anstatt getAttrs -> Berechnungen -> setAttrs -> getAttrs -> Berechnungen -> setAttrs….


Charakterbogen-Entwickler vs. Auto-Berechnungsfelder: Welches soll ich verwenden?

Es gibt keine harten Regeln dafür. Beide Werkzeuge können dasselbe erreichen. Nehmen wir einen hypothetischen Anwendungsfall für das Attribut "Stärke", das wir verwenden möchten, um ein Attribut "Stärkemodifikator" auf dem neuesten Stand zu halten. Hier wären die Unterschiede zwischen den beiden Werkzeugen für diesen Anwendungsfall:

  • Die automatisch berechneten Felder werden jedes Mal neu berechnet, wenn ein Bogen zum ersten Mal geöffnet wird. Die Charakterbogen-Entwickler-Felder hingegen werden nur neu berechnet, wenn sich ihre abhängigen Werte ändern. Dies bedeutet, dass Bögen, die die Option "Charakterbogen-Entwickler" nutzen, für Spieler viel, viel schneller geöffnet und verwendet werden können.
  • Darüber hinaus werden die Berechnungen der Charakterbogen-Entwickler im Hintergrund ausgeführt, was bedeutet, dass keine Benutzeroberflächenverzögerung entsteht, während die Berechnungen durchgeführt werden. Deaktivierte Felder hingegen laufen im Hauptprozess und können bei gleichzeitiger Berechnung großer Mengen von ihnen zu "Einfrierungen" oder "Stockungen" führen (beispielsweise bei einem sehr komplizierten Bogen mit Tausenden deaktivierter Felder).
  • Das automatisch berechnete Feld des Stärkemodifikators würde für den Spieler deaktiviert erscheinen. Ein durch einen Charakterbogen-Entwickler aktualisiertes Feld des Stärkemodifikators wäre hingegen nach der Berechnung änderbar (obwohl jeder eingegebene Wert überschrieben würde, wenn sich der Stärkewert ändert). Ein Sheet Worker würde sich also besser für selbst erstellte Regeln eignen, da der Spieler den Mod-Wert nach einer Stärkeänderung einfach ändern kann. Andererseits würde das automatisch berechnende Feld eine solche Änderung nicht zulassen, sodass die Regeln strenger "durchgesetzt" würden.

Generell empfehlen wir, dass du mit automatisch berechneten Feldern sparsam umgehst.Nimm dir ein Budget von 500 bis maximal 1.000 automatisch berechnenden Feldern vor. Wir empfehlen, die neue Sheet Worker-Funktion für die meisten Berechnungen zu verwenden, vor allem für Berechnungen, die nur selten durchgeführt werden müssen (zum Beispiel ändert sich dein Stärkewert (und damit dein Stärke-Mod) wahrscheinlich höchstens einmal pro Sitzung, wenn der Charakter aufsteigt. Du musst nicht jedes Mal, wenn du das Blatt öffnest, dieselbe Berechnung erneut durchführen.


Sheet Worker API

Veranstaltungen

eventInfo Objekt

Vielen Ereignissen wird eineventInfoObjekt übergeben, das dir zusätzliche Details über die Umstände des Ereignisses liefert.

Eigentum Beschreibung
sourceAttribute Das ursprüngliche Attribut, das das Ereignis ausgelöst hat. Es ist der vollständige Name (einschließlich RowID, wenn es sich um einen wiederholenden Abschnitt handelt) des Attributs, das ursprünglich dieses Ereignis ausgelöst hat.

Hinweis: Der gesamte String wurde in Kleinbuchstaben übersetzt und ist daher möglicherweise nicht geeignet, um direkt in getAttrs() verwendet zu werden.

sourceType Der Agent, der das Ereignis ausgelöst hat, entwederSpielerodersheetworker
previousValue Der ursprüngliche Wert des Attributs in einemon:change-Ereignis, bevor das Attribut geändert wurde.
newValue Der Wert, auf den sich das Attribut in einemon:change-Ereignis geändert hat.
removedInfo Ein Objekt, das die Werte aller entfernten Attribute in einemremove:wiederholende_gruppennameEvent enthält.

 

änderung:<attribute_name>

Ermöglicht es Ihnen, auf Änderungen bestimmter Attribute zu hören, oder im Fall eines wiederholenden Abschnitts auf Änderungen im gesamten Abschnitt. Es ist sehr einfach:

auf("change:strength change:StrengthMod change:StrengthOtherThing", Funktion(eventInfo) {
   //Hier etwas tun
   // eventInfo.previousValue ist der ursprüngliche Wert des Attributs, das dieses Ereignis ausgelöst hat, bevor es geändert wurde.
   // eventInfo.newValue ist der aktuelle Wert des Attributs, das dieses Ereignis ausgelöst hat, nachdem es geändert wurde.
});

auf("change:repeating_spells:spellname", Funktion(eventInfo) {
   //Hier etwas tun
   // eventInfo.sourceAttribute ist der vollständige Name (einschließlich wiederholender ID) des Attributs 
   // das dieses Ereignis ursprünglich ausgelöst hat, 
   // jedoch wird der gesamte Satz in Kleinbuchstaben übersetzt und ist daher möglicherweise nicht 
   // geeignet, um direkt in getAttrs() oder anderen Verwendungen ohne vorherige Bearbeitung verwendet zu werden.
   // in getAttrs() oder anderen Verwendungen ohne vorherige Bearbeitung verwendet zu werden.
});

auf("change:repeating_spells", Funktion(eventInfo) {
   //Wird ausgelöst, wenn ein Attribut im Abschnitt repeating_spells geändert wird
   // eventInfo.sourceAttribute ist der vollständige Name (kleingeschrieben) (einschließlich wiederholender ID) 
   // des Attributs, das dieses Ereignis ursprünglich ausgelöst hat. 
});

Note: All attribute names are lowercased in events. So even if you normally refer to an attribute as "Strength", use "change:strength" in the event listener.

Note: This supports the "_max" suffix in that ether "change:strength" or "change:strength_max" will fire an event, however these two variations seem to be interchangeable, in that ether or both will fire when ether "strength" or "strength_max" changes.

For attributes in repeating fields, all of the following would be triggered when the "repeating_spells_SpellName" attribute is updated: "change:repeating_spells:spellname", "change:repeating_spells", "change:spellname", "change:spellname_max". This gives you maximum flexibility in choosing what "level" of change event you want to bind your function to.

Sheetworkers can also listen for a change event of a special attribute that is modified whenever a repeating section is re-ordered.

on("change:_reporder:<sectionname>", function(eventInfo) {
   // Where <sectionname> above should be a repeating section name, such as skills or spells
});

 

entfernen:repeating_<groupname>

Dies ist ein Ereignis, das immer dann ausgelöst wird, wenn eine Zeile aus einem sich wiederholenden Feld gelöscht wird. Sie können auch auf das Löschen einer bestimmten Zeile hören, wenn Sie deren ID kennen, wie z. B. on("entfernen:repeating_inventory:-ABC123")

auf("entfernen:repeating_inventory", function(eventInfo) {
     //Wird immer dann ausgelöst, wenn eine Zeile aus repeating_inventory entfernt wird
     // eventInfo.sourceAttribute ist der vollständige Name (einschließlich ID) des ersten Attributs, das das Ereignis ausgelöst hat (Sie können dies verwenden, um die ID der gelöschten Zeile zu ermitteln)
});

Die Funktion removed:repeating_<groupname> enthält ein spezielles Eigenschaftsfeld removedInfo, das alle Attribute des jetzt entfernten sich wiederholenden Abschnitts anzeigt.

auf("entfernen:repeating_inventory", function(eventinfo) {
   console.log(eventinfo.removedInfo);
});

 

Charakterbogen:geöffnet

Dieses Ereignis wird jedes Mal ausgelöst, wenn ein Spieler in einer Spielsitzung einen Charakterbogen öffnet. Es sollte nützlich sein, um beispielsweise nach erforderlichen Charakterbogen-Upgrades zu überprüfen.

auf('Charakterbogen:geöffnet',Funktion(){

// Führe etwas aus, wenn der Charakterbogen zum ersten Mal von einem Spieler in einer Spielsitzung geöffnet wird

});

 

geklickt:<button_name>

Dieses Ereignis wird ausgelöst, wenn auf einen Aktionsknopf geklickt wird. Der Name des Knopfes muss mit "act_" beginnen. Zum Beispiel:

<button type="action" name="act_activate">Aktivieren!</button>

auf("clicked:activate", function() {
  console.log("Aktivierungsknopf geklickt");
});

 

Funktionen

getAttrs Attributname-Feld, Rückruf) Asynchron

Die getAttrs-Funktion ermöglicht es Ihnen, die Werte eines Satzes von Attributen aus dem Bogen abzurufen. Der "_max"-Suffix wird unterstützt, so dassgetAttrs( ["Stärke", "Stärke_max"], func) beide den aktuellen Wert und den maximalen Wert von "Stärke" zurückgibt. Beachten Sie, dass die Funktion asynchron ist, was bedeutet, dass keine Garantie dafür besteht, dass die Reihenfolge, in der mehrere getAttrs-Aufrufe erfolgen, der Reihenfolge entspricht, in der die Ergebnisse zurückgegeben werden. Stattdessen geben Sie eine Rückruffunktion an, die ausgeführt wird, wenn die Werte berechnet wurden. Die Rückruffunktion erhält ein einfaches JavaScript-Objekt mit einer Liste von Schlüssel-Wert-Paaren, eines für jedes angeforderte Attribut.

Hier ist ein Beispiel:

on("change:strength", function() {
   getAttrs(["Strength", "Level"], function(values) {
      //Do something with values.Strength and/or values[ "Level" ]
   });
});

Werte in sich wiederholenden Abschnitten erfordern eine besondere Handhabung. Wenn sich das Ereignis, in dem du dich befindest, bereits in einem wiederholenden Abschnitt befindet, kannst du die Variable einfach mit ihrem Namen vor dem Namen der wiederholenden Gruppe abfragen und erhältst den Wert in demselben wiederholenden Abschnitt, in dem das Ereignis ausgelöst wurde. Wenn wir zum Beispiel einen Abschnitt mit wiederholenden_Zaubern haben, der sowohl SpellName, SpellLevel und SpellDamage enthält, dann:

auf("Änderung:wiederholende_Zauber:Zauberstufe", Funktion() {
   getAttrs([
      "wiederholende_Zauber_ZauberSchaden",
      "wiederholende_Zauber_ZauberName"
    ], Funktion(Werte) {
      //Werte.wiederholende_Zauber_ZauberSchaden und Werte.wiederholende_Zauber_ZauberName 
//beziehen sich beide auf die gleiche wiederholende Abschnittszeile, in der sich die geänderte Zauberstufe befindet.
   });
});

Auf der anderen Seite, wenn du dich gerade nicht in einem wiederholenden Abschnitt befindest, kannst du explizit den Wert eines Feldes in einer wiederholenden Abschnittszeile anfordern, indem du seine ID manuell angibst:

getAttrs(["wiederholende_Zauber_-ABC123_ZauberSchaden"]...

Du kannst auch das Attribut "_reporder_wiederholend_<sectionname>" mit getAttrs() anfordern, um eine Liste aller IDs in dem Abschnitt zu erhalten, die sortiert wurden. Beachte jedoch, dass dies möglicherweise nicht die vollständige Auflistung aller IDs in einem Abschnitt enthält. IDs, die nicht in der Liste enthalten sind, werden angenommen, dass sie nach den geordneten IDs in lexografischer Reihenfolge im Abschnitt kommen.

 

setAttrs(values,options,callback) Asynchron

Werte -- Dies ist ein Objekt, dessen Eigenschaften die Namen der Attribute (ohne den Präfix "attr_") sind und deren Werte das zu setzende Attribut darstellen.

Optionen -- (Optional) Dies ist ein Objekt, das das optionale Verhalten für die Funktion angibt. Derzeit ist die einzige Option "silent", die das Weiterleiten von Änderungsereignissen durch das Festlegen der mitgelieferten Attribute verhindert.

Rückruf -- (Optional) Dies ist eine Rückruffunktion, die ausgeführt wird, wenn die Attribute aktualisiert wurden.

Die setAttrs-Funktion ermöglicht es Ihnen, die Attribute des Charakterbogens festzulegen. Verwende den Suffix "_max", um den maximalen Wert eines Attributs einzustellen. Zum Beispiel "Strength_max".

auf("change:strength", function() {
   getAttrs(["Strength", "Level"], function(values) {
      setAttrs({
          StrengthMod: Math.floor(values.Strength / 2)
      });
   });
});

Hinweis: Wenn du versuchst, ein deaktiviertes Eingabefeld mit dieser Methode zu aktualisieren, könntest du auf Probleme stoßen. Eine Option ist, diese `setAttrs` Methode zu verwenden, um ein verstecktes Eingabefeld festzulegen, und dann das deaktivierte Eingabefeld auf das versteckte Element zu setzen. In diesem Beispiel haben wir ein Attribut namens Will, und wir möchten ein Urteil auf der Grundlage von 1/2 der Will-Statistik berechnen, aber ohne dass es 90 überschreitet. Siehe unten.

<Kennzeichnung>Urteil</Kennzeichnung>
<Eingabetyp="hidden" name="attr_foo_judgment" value="0" />
<Eingabetyp="number" name="attr_judgment" value="@{foo_judgment}" disabled="true" title="1/2 vom Willen abgerundet, max. 90" />
auf("change:will", Funktion() {
  getAttrs(["will"], Funktion(Werte) {
    setAttrs({ foo_judgment: Math.min(90, (Werte.will/2)) });
  });
});

Beachte, dass die setAttrs eine asynchrone Funktion ist und es keine Garantie dafür gibt, in welcher Reihenfolge die tatsächlichen Attribute für mehrere Aufrufe von setAttrs() festgelegt werden.

Bei wiederholenden Abschnitten kannst du den einfachen Variablennamen verwenden, wenn das ursprüngliche Ereignis in einem wiederholenden Abschnitt liegt, oder du kannst den vollständigen Namen des wiederholenden Abschnitts einschließlich ID in einem Ereignis angeben.

am("change:repeating_spells:spelllevel", function() {
   getAttrs(["repeating_spells_SpellLevel", "repeating_spells_SpellName"], function(values) {
      setAttrs({
         repeating_spells_SpellDamage: Math.floor(values.repeating_spells_SpellLevel / 2) + 10
      });
   });
});

 

getSectionIDs(section_name,callback) Asynchronous

Diese Funktion ermöglicht das Abrufen einer Liste der vorhandenen IDs für einen bestimmten wiederholenden Abschnitt. Dies ist nützlich, um Dinge wie Inventar zu berechnen, bei denen eine variable Anzahl von Zeilen vorhanden sein kann.

auf("change:repeating_inventory", Funktion() {
   getSectionIDs("Inventar", Funktion(idarray) {
      für(var i=0; i < idarray.length; i++) {
         //Mach etwas mit den IDs
      }
   });
});

Beachte jedoch, dass du GetAttrs() (oben beschrieben) verwenden kannst, um das Attribut "_reporder_repeating_<sectionname>" anzufordern, um eine Liste aller IDs in dem Abschnitt zu erhalten, die bestellt wurden. Beachte jedoch, dass dies möglicherweise nicht die vollständige Auflistung aller IDs in einem Abschnitt enthält. Jede IDs, die nicht in der Liste enthalten sind, aber im Abschnitt vorhanden sind, werden angenommen, dass sie nach den geordneten IDs in lexografischer Reihenfolge kommen.
Das bedeutet, dass getSectionIDs() alle IDs abruft - jedoch nicht in der Reihenfolge, wie sie dem Benutzer angezeigt werden. getAttrs("_reporder_repeating_<sectionname>", ... ) gibt eine Liste aller IDs zurück, die aus ihrer normalen lexografischen Reihenfolge entfernt wurden. Du kannst die folgende Funktion als Ersatz für getSectionIDs verwenden, um die IDs in der Reihenfolge, in der sie angezeigt werden, zu erhalten.

var getSectionIDsOrdered = function (sectionName, callback) {
  'use strict';
  getAttrs([`_reporder_${sectionName}`], function (v) {
    getSectionIDs(sectionName, function (idArray) {
      let reporderArray = v[`_reporder_${sectionName}`] ? v[`_reporder_${sectionName}`].toLowerCase().split(',') : [],
        ids = [...new Set(reporderArray.filter(x => idArray.includes(x)).concat(idArray))];
      callback(ids);
    });
  });
};

 

generateRowID()

A synchronous function which immediately returns a new random ID which you can use to create a new repeating section row. If you use setAttrs() and pass in the ID of a repeating section row that doesn't exist, one will be created with that ID.

Here's an example you can use to create a new row in a repeating section:

var newrowid = generateRowID();
var newrowattrs = {};
newrowattrs["repeating_inventory_" + newrowid + "_weight"] = "testnewrow";
setAttrs(newrowattrs);

 

removeRepeatingRow( RowID )

Eine synchronisierte Funktion, die sofort alle mit einer bestimmten RowID verbundenen Attribute entfernt und dann die Zeile vom Charakterbogen entfernt. Die RowID sollte im Format "repeating_<sectionname>_<rowid>" sein. Zum Beispiel "repeating_skills_-KbjuRmBRiJNeAJBJeh2".

Hier ist ein Beispiel dafür, wie man eine Zusammenfassungsliste leert, wenn sich die ursprüngliche Liste ändert:

auf("Änderung:wiederholende_Inventar", Funktion() {
   getSectionIDs("wiederholende_Inventarübersicht", Funktion(idarray) {
      für(var i=0; i < idarray.length; i++) {
        removeRepeatingRow("wiederholende_Inventarübersicht_" + idarray[i]);
      }
   });
});

 

getTranslationByKey([key])

Eine synchrone Funktion, die sofort den Übersetzungsstring zum angegebenen Schlüssel zurückgibt. Wenn kein Schlüssel vorhanden ist, wird false zurückgegeben und eine Meldung in der Konsole wird ausgegeben, die den spezifischen Schlüssel auflistet, der nicht in der Übersetzungs-JSON gefunden wurde.

Hier ist ein Beispiel, mit dem du einen Übersetzungsstring aus der Übersetzungs-JSON abrufen kannst: Mit der folgenden Übersetzungs-JSON

{
    "str": "Stärke",
    "dex": "Geschicklichkeit"
}
var strTranslation = getTranslationByKey('str'); // "Strength"
var dexTranslation = getTranslationByKey('dex'); // "Dexterity"
var intTranslation = getTranslationByKey('int'); // false

 

getTranslationLanguage()

Eine synchrone Funktion, die sofort den 2-stelligen Sprachcode für die ausgewählte Sprache des Benutzers zurückgibt.

Hier ist ein Beispiel, das Sie verwenden können, um die Übersetzungssprache abzurufen:

var translationLang = getTranslationLanguage(); // "en" , for an account using English

 

setDefaultToken(values)

Eine Funktion, die es dem Autor des Blatts ermöglicht, festzulegen, welche Attribute für den Charakter festgelegt werden, der aus dem Kompendium fallen gelassen wird. Bei der Festlegung des Standard-Spielmarkers nach dem Ablegen eines Kompendiums kann diese Funktion beliebige Attribute des Standard-Spielmarkers festlegen, um wichtige Attribute festzulegen, die spezifisch für diesen Charakterbogen sind, wie zum Beispiel attr_hit_points.

Die Liste der Attributwerte für Spielmarker, die von setDefaultToken festgelegt werden können, umfasst:

["bar1_value","bar1_max","bar2_value","bar2_max","bar3_value","bar3_max","aura1_square","aura1_radius","aura1_color","aura2_square","aura2_radius","aura2_color",
"tint_color","showname","showplayers_name","playersedit_name","showplayers_bar1","playersedit_bar1","showplayers_bar2","playersedit_bar2","showplayers_bar3",
"playersedit_bar3","showplayers_aura1","playersedit_aura1","showplayers_aura2","playersedit_aura2","light_radius","light_dimradius","light_angle","light_otherplayers",
"light_hassight","light_losangle","light_multiplier"]

Um weitere Informationen zu diesen Attributen und deren Funktionen zu erhalten, siehe die SeiteAPI Objects Page.

Hier ist ein Beispiel:

on("Blatt:compendium-drop", function() {
    var default_attr = {};
    default_attr["width"] = 70;
    default_attr["height"] = 70;
    default_attr["bar1_value"] = 10;
    default_attr["bar1_max"] = 15;
    setDefaultToken(default_attr);
});
War dieser Beitrag hilfreich?
17 von 31 fanden dies hilfreich