Script del Lavoratore della Scheda

Aggiunta di uno script Lavoratore Foglio

Per aggiungere uno script del lavoratore del foglio ad un Foglio Carattere, aggiunga semplicemente lo script nella sezione "HTML" del foglio, utilizzando il seguente formato:

<script type="text/worker">

on("change:strength", function() {

});

// ... etc

</script>

Si noti che il tag script deve avere un tipo di "text/worker" per essere gestito correttamente dal sistema. Quando il gioco viene caricato, tutti i tag di script vengono rimossi dal modello del foglio per motivi di sicurezza. Tuttavia, i tag script con un tipo di "testo/lavoratore" saranno utilizzati per attivare un lavoratore in background sul computer di ogni giocatore, che può rispondere ai valori in evoluzione nei suoi fogli e agire come necessario. Tutti gli script di sheetworker devono essere contenuti in un unico tag di script.

Esempi più completi delle nozioni di baserivolti ai non programmatori

Attenzione all'ambito delle variabili "globali":l'ambito di una variabile dichiarataall'internodella `<script type="text/worker">` maall'esternodi una funzione sono attualmente pergiocatore, non per personaggio. Modificando il suo valore, lo cambierà per tutti i personaggi della sessione del suo giocatore.

Come best practice, le cascate asincrone dovrebbero essere evitate quando possibile. In genere è una pratica migliore ottenere tutti gli attributi necessari per i calcoli in un unico getAttrs, piuttosto che fare getAttrs -> calcoli -> setAttrs -> getAttrs -> calcoli -> setAttrs…


Fogli di lavoro vs. campi di calcolo automatico: Quale dovrei usare?

Non c'è una regola ferrea al riguardo. Entrambi questi strumenti sono in grado di ottenere la stessa cosa. Prendiamo un ipotetico caso d'uso di un attributo "Forza", che vogliamo utilizzare per mantenere aggiornato un attributo "Forza Mod". Ecco le differenze tra i due strumenti per questo caso d'uso:

  • I campi di calcolo automatico vengono tutti ricalcolati ogni volta che si apre un foglio per la prima volta. I campi Sheet Worker, invece, vengono ricalcolati solo quando i loro valori dipendenti cambiano. Ciò significa che i fogli che utilizzano l'opzione Lavoratore Foglio saranno molto, molto più veloci da aprire e da interagire per i giocatori.
  • Inoltre, i calcoli di Sheet Worker vengono eseguiti in un processo in background, il che significa che non si crea alcun ritardo nell'interfaccia utente durante l'esecuzione dei calcoli. I campi disabilitati, invece, vengono eseguiti sul processo principale e come tali possono causare "blocchi" o "balbuzie" se ne vengono calcolati un gran numero contemporaneamente (ad esempio, se ha un foglio molto complicato che utilizza migliaia di campi disabilitati).
  • Il campo di calcolo automatico della Forza Mod apparirà disabilitato al giocatore. Un campo Mod Forza che viene aggiornato da un Lavoratore Foglio, invece, sarebbe modificabile dopo l'esecuzione del calcolo (anche se qualsiasi valore inserito verrebbe sovrascritto quando il valore della Forza cambia). Quindi un Foglio Lavoratore supporterebbe meglio le regole homebrew, poiché il giocatore potrebbe semplicemente modificare il valore della Mod dopo le modifiche della Forza. D'altra parte, il campo di calcolo automatico non consentirebbe una tale modifica, quindi le regole verrebbero "applicate" in modo più rigido.

In generale, le consigliamo di utilizzare i campi di autocalcolo con parsimonia.Si conceda un budget di 500-1.000 campi di calcolo automatico al massimo. Raccomandiamo di utilizzare la nuova funzionalità Sheet Worker per la maggior parte dei calcoli, soprattutto quelli che devono essere eseguiti solo raramente (ad esempio, il valore di Forza (e quindi il suo Mod Forza) probabilmente cambia al massimo una volta per sessione quando il personaggio sale di livello). Non c'è bisogno di ripetere lo stesso calcolo ogni volta che si apre il foglio.


Lavoratore di lamiere API

Eventi

Oggetto eventInfo

A molti eventi viene passato un oggettoeventInfoche fornisce ulteriori dettagli sulle circostanze dell'evento.

Proprietà Descrizione
attributo sorgente L'attributo originale che ha scatenato l'evento. Si tratta del nome completo (incluso RowID se in una sezione di ripetizione) dell'attributo che ha originariamente scatenato questo evento.

Nota: L'intera stringa sarà stata tradotta in minuscolo e quindi potrebbe non essere adatta ad essere inserita direttamente in getAttrs().

sorgenteTipo L'agente che ha scatenato l'evento, ogiocatoreooperaio
previousValue Il valore originale dell'attributo in un eventoon:change, prima che l'attributo fosse modificato.
nuovoValore Il valore a cui è cambiato l'attributo in un eventoon:change.
rimossoInfo Un oggetto contenente i valori di tutti gli attributi rimossi in un eventoremove:repeating_groupname.

 

modifica:<attribute_name>

Permette di ascoltare le modifiche di attributi specifici o, nel caso di una sezione ripetuta, le modifiche dell'intera sezione. È molto semplice:

on("change:strength change:StrengthMod change:StrengthOtherThing", function(eventInfo) {
   //Fare qualcosa qui
   // eventInfo.previousValue è il valore originale dell'attributo che ha scatenato questo evento, prima di essere modificato.
   // eventInfo.newValue è il valore attuale dell'attributo che ha scatenato questo evento, dopo essere stato modificato.
});

on("change:repeating_spells:spellname", function(eventInfo) {
   //Fare qualcosa qui
   // eventInfo.sourceAttribute è il nome completo (compreso l'ID di ripetizione) dell'attributo 
   // che ha originariamente scatenato questo evento, 
   // tuttavia l'intera stringa sarà stata tradotta in minuscolo e quindi potrebbe non essere 
   // adatta ad essere inserita direttamente
   // in getAttrs() o in altri usi senza essere prima devandalizzata.
});

on("change:repeating_spells", function(eventInfo) {
   //Sarebbe attivato quando un qualsiasi attributo della sezione repeating_spells viene modificato
   // eventInfo.sourceAttribute è il nome completo (minuscolo) (incluso l'ID di ripetizione) 
   // dell'attributo che ha originariamente attivato questo evento. 
});

Nota: tutti i nomi degli attributi sono minuscoli negli eventi. Quindi, anche se normalmente si riferisce ad un attributo come "Forza", utilizzi "change:strength" nell'ascoltatore di eventi.

Nota: questo supporta il suffisso "_max" in quanto sia "cambio:forza" che "cambio:forza_max" attiveranno un evento, tuttavia queste due varianti sembrano essere intercambiabili, nel senso che sia l'una che l'altra si attiveranno quando cambiano "forza" o "forza_max".

Per gli attributi nei campi ripetuti, tutti i seguenti verrebbero attivati quando l'attributo "incantesimi_ripetenti_nome_incantesimo" viene aggiornato: "change:repeating_spells:spellname", "change:repeating_spells", "change:spellname", "change:spellname_max". Questo le offre la massima flessibilità nella scelta del "livello" dell'evento di modifica a cui vuole legare la sua funzione.

Gli addetti alla lavorazione delle lastre possono anche ascoltare un evento di modifica di un attributo speciale che viene modificato ogni volta che viene riordinata una sezione di ripetizione.

su("change:_reporder:<sectionname>", function(eventInfo) {
   // Dove <sectionname> sopra dovrebbe essere il nome di una sezione ripetuta, come le abilità o gli incantesimi
});

 

rimuovere:ripetere_<groupname>

Questo è un evento che si attiverà ogni volta che una riga viene eliminata da una sezione di campi ripetuti. Può anche ascoltare l'eliminazione di una riga specifica se conosce il suo ID, come ad esempio on("remove:repeating_inventory:-ABC123")

on("remove:repeating_inventory", function(eventInfo) {
     /Combattuto ogni volta che una riga viene rimossa da repeating_inventory
     // eventInfo.sourceAttribute è il nome completo (compreso l'ID) del primo attributo che ha scatenato l'evento (può usarlo per determinare l'ID della riga che è stata cancellata)
});

L'eventinfo della funzione removed:repeating_<groupname> include una proprietà speciale removedInfo che visualizza tutti gli attributi della sezione ripetuta ora rimossa.

on("remove:repeating_inventory", function(eventinfo) {
   console.log(eventinfo.removedInfo);
});

 

foglio:aperto

Questo evento si attiverà ogni volta che un foglio viene aperto da un giocatore in una sessione di gioco. Dovrebbe essere utile per fare cose come verificare la necessità di aggiornamenti del foglio.

on('foglio:aperto',function(){

// Fa qualcosa la prima volta che il foglio viene aperto da un giocatore in una sessione

});

 

cliccato:<button_name>

Questo evento si attiverà quando viene cliccato un pulsante d'azione. Il nome del pulsante dovrà iniziare con "act_". Ad esempio:

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

on("clicked:activate", function() {
  console.log("pulsante Attiva cliccato");
});

 

Funzioni

getAttrs(attributeNameArray, callback) Asincrono

La funzione getAttrs le permette di ottenere i valori di un insieme di attributi dal foglio. Il suffisso "_max" è supportato, quindigetAttrs( ["Strength", "Strength_max"], func)otterrà sia il valore attuale che quello massimo di "Strength". Si noti che la funzione è asincrona, il che significa che non è garantito che l'ordine in cui vengono effettuate le chiamate multiple a getAttrs sia l'ordine in cui verranno restituiti i risultati. Piuttosto, passa una funzione di callback che sarà eseguita quando i valori sono stati calcolati. La funzione di callback riceve un semplice oggetto Javascript con un elenco di coppie chiave-valore, una per ogni attributo richiesto.

Ecco un esempio:

su("change:strength", function() {
   getAttrs(["Strength", "Level"], function(values) {
      //Fare qualcosa con values.Strength e/o values[ "Level" ]
   });
});

I valori nelle sezioni ripetute richiedono una gestione un po' speciale. Se l'evento in cui si trova è già all'interno di una sezione di ripetizione, può semplicemente richiedere la variabile utilizzando il suo nome preceduto dal nome del gruppo di ripetizione e riceverà il valore nella stessa sezione di ripetizione in cui è stato attivato l'evento. Per esempio, se abbiamo una sezione Incantesimi_Ripetenti che ha sia NomeIncantesimo, LivelloIncantesimo e IncantesimoDanno, allora:

su("change:repeating_spells:spelllevel", function() {
   getAttrs([
      "repeating_spells_SpellDamage",
      "repeating_spells_SpellName"
    ], function(values) {
      //values //values.repeating_spells_SpellDamage e values.repeating_spells_SpellName 
//saranno entrambi della stessa riga della sezione di ripetizione in cui si trova lo SpellLevel modificato.
   });
});

D'altra parte, se non si trova attualmente in una sezione ripetuta, può richiedere specificamente il valore di un campo in una riga della sezione ripetuta, specificando manualmente il suo ID:

getAttrs(["repeating_spells_-ABC123_SpellDamage"]...

Può anche richiedere l'attributo "_reporder_repeating_<sectionname>" con getAttrs() per ottenere un elenco di tutti gli ID della sezione che sono stati ordinati. Tuttavia, si noti che questo potrebbe non includere l'elenco completo di tutti gli ID in una sezione. Qualsiasi ID non presente nell'elenco e che si trova nella sezione, si presume che venga dopo gli ID ordinati nell'ordine lessografico.

 

setAttrs(valori,opzioni,callback) Asincrono

valori-- Si tratta di un oggetto le cui proprietà sono i nomi degli attributi (senza il prefisso attr_) e i cui valori sono ciò a cui si desidera impostare l'attributo.

opzioni-- (Opzionale) Questo è un oggetto che specifica un comportamento opzionale per la funzione. Attualmente l'unica opzione è "silenzioso", che impedisce la propagazione degli eventi di modifica dall'impostazione degli attributi forniti.

callback-- (Opzionale) Questa è una funzione di callback che verrà eseguita quando gli attributi impostati saranno stati aggiornati.

La funzione setAttrs le permette di impostare gli attributi della scheda personaggio. Utilizzi il suffisso "_max" per impostare il valore massimo di un attributo. Ad esempio "Forza_max".

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

Nota: se sta cercando di aggiornare un campo di input disabilitato con questo metodo, potrebbe incontrare dei problemi. Un'opzione è quella di utilizzare questo metodo `setAttrs` per impostare un input nascosto, quindi impostare l'input disabilitato sull'elemento nascosto. In questo esempio abbiamo un attr chiamato volontà, e vogliamo calcolare il giudizio in base a 1/2 della stat di volontà, ma senza permettere che superi 90. Vedi sotto.

<etichetta>Giudizio</etichetta>
<tipo di input="hidden" nome="attr_foo_judgment" valore="0" />
<tipo di input="number" nome="attr_judgment" valore="@{foo_judgment}" disabilitato="true" titolo="1/2 della volontà arrotondata per difetto, massimo 90" />
on("change:will", function() {
  getAttrs(["will"], function(values) {
    setAttrs({ pippo_giudizio: Math.min(90, (valori.will/2))) });
  });
});

Nota che anche se setAttrs è una funzione asincrona e non c'è garanzia su quale ordine gli attributi effettivi verranno impostati per più chiamate di setAttrs().

Per sezioni ripetute, hai l'opzione di utilizzare il nome semplice della variabile se l'evento originale è in una sezione ripetuta, oppure puoi specificare il nome completo della variabile della sezione ripetuta, inclusa l'ID in qualsiasi evento.

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

 

getSectionIDs(section_name,callback) Asincrono

Questa funzione ti consente di ottenere un elenco di ID che esistono attualmente per una determinata sezione ripetuta. Questo è utile per calcolare cose come l'inventario in cui potrebbe esserci un numero variabile di righe.

su("change:repeating_inventory", funzione() {
   getSectionIDs("inventario", funzione(idarray) {
      per(var i=0; i < idarray.length; i++) {
         //Fai qualcosa con gli ID
      }
   });
});

Nota che puoi utilizzare GetAttrs() (descritto sopra) per richiedere l'attributo "_reporder_repeating_<sectionname>" per ottenere una lista di tutti gli ID nella sezione che sono stati ordinati. Tuttavia, nota che questo potrebbe non includere l'elenco completo di tutti gli ID in una sezione. Qualsiasi ID non presente nell'elenco e presente nella sezione si presume venga dopo gli ID ordinati in ordine lessicografico.
Ciò significa che getSectionIDs() otterrà tutti gli ID, ma non nell'ordine in cui vengono visualizzati all'utente. getAttrs( "_reporder_repeating_<sectionname>", ... ) restituirà un elenco di tutti gli ID che sono stati spostati fuori dal loro ordine lessicografico normale. È possibile utilizzare la seguente funzione come sostituto di getSectionIDs per ottenere gli ID nell'ordine in cui vengono visualizzati.

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()

Una funzione sincrona che restituisce immediatamente un nuovo ID casuale che puoi utilizzare per creare una nuova riga nella sezione di ripetizione. Se utilizzi setAttrs() e passi l'ID di una riga della sezione di ripetizione che non esiste, ne verrà creata una con quell'ID.

Ecco un esempio che puoi utilizzare per creare una nuova riga in una sezione di ripetizione:

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

 

removeRepeatingRow( RowID )

Una funzione sincrona che rimuoverà immediatamente tutti gli attributi associati a un determinato RowID e quindi rimuoverà la riga dalla scheda del personaggio. Il RowID dovrebbe essere nel formato "repeating_<sectionname>_<rowid>". Ad esempio, "repeating_skills_-KbjuRmBRiJNeAJBJeh2".

Ecco un esempio di cancellazione di un elenco di riepilogo quando l'elenco originale cambia:

su("change:repeating_inventory", funzione() {
   getSectionIDs("repeating_inventorysummary", funzione(idarray) {
      per(var i=0; i < idarray.lunghezza; i++) {
        rimuoviRigaRipetuta("repeating_inventorysummary_" + idarray[i]);
      }
   });
});

 

getTranslationByKey([chiave])

Una funzione sincrona che restituisce immediatamente la stringa di traduzione relativa alla chiave fornita. Se la chiave non esiste, verrà restituito false e verrà visualizzato un messaggio nella console che elenca la chiave specifica non trovata nel file JSON di traduzione.

Ecco un esempio che puoi utilizzare per recuperare una stringa di traduzione dal file JSON di traduzione: Con il seguente file JSON di traduzione

{
    "str": "Forza",
    "dex": "Destrezza"
}
var strTranslation = getTranslationByKey('str'); // "Forza"
var dexTranslation = getTranslationByKey('dex'); // "Destrezza"
var intTranslation = getTranslationByKey('int'); // falso

 

getTranslationLanguage()

Una funzione sincrona che restituisce immediatamente il codice di lingua a 2 caratteri per la lingua selezionata dall'utente.

Ecco un esempio che puoi usare per ottenere la lingua di traduzione:

var translationLang = getTranslationLanguage(); // "en" , per un account che utilizza l'inglese

 

setDefaultToken(valori)

Una funzione che consente all'autore del foglio di determinare quali attributi sono impostati sul personaggio trascinato dal compendio. Quando si imposta il token predefinito dopo un rilascio dal compendio, questa funzione può impostare qualsiasi attributo sul token predefinito per collegare attributi importanti specifici del foglio di quel personaggio, come attr_hit_points.

La lista degli attributi del token che possono essere impostati da setDefaultToken è:

["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"]

Per maggiori informazioni su questi attributi e sulle loro funzioni, consulti la pagina Oggetti API.

Ecco un esempio:

su("foglio:compendio-drop", funzione() {
    var default_attr = {};
    default_attr["larghezza"] = 70;
    default_attr["altezza"] = 70;
    default_attr["barra1_valore"] = 10;
    default_attr["barra1_max"] = 15;
    settaTokenPredefinito(default_attr);
});
Questo articolo ti è stato utile?
Utenti che ritengono sia utile: 17 su 32