Script di mod: debug

Ogni volta che scrivete programmi (dai più semplici ai più avanzati), vi capiterà inevitabilmente di imbattervi in bug che causano il malfunzionamento del programma. Data la natura della sandbox, può risultare un po’ difficile capire esattamente cosa stia succedendo. Ecco quindi alcuni suggerimenti che potete utilizzare per individuare eventuali problemi nei vostri script.

Debug “all’antica”

Poiché non disponete di accesso diretto all’ambiente in cui vengono eseguiti gli script, potete fare affidamento su un numero elevato di chiamate a log() per capire cosa sta succedendo nel vostro programma. Ad esempio, se non è sicuro del motivo per cui un segnalino non si comporti correttamente e desidera comprendere meglio i valori che vengono elaborati, potrebbe procedere come segue:

on("change:graphic:left", function(obj) {
  //Qual è il valore "left" dell'oggetto che viene passato a questa funzione?
  log(obj.get("left"));
  obj.set("left", obj.get("left") + 70);
  //Qual è il valore attuale?
  log(obj.get("left"));
  //È inoltre possibile eseguire il debug di interi oggetti per visualizzare un elenco dei loro attributi attuali
  log(obj);
});

Troverete l'output dei vostri comandi log() nella Mod Output Console, accessibile dalla pagina delle impostazioni degli script Mod relative alla vostra campagna.

Solo per Mod Script sandbox v1.5. Ove possibile, i messaggi di errore includono un oggetto di contesto che consente di verificare quale oggetto Roll20 sia stato coinvolto (tipo e ID):

ERRORE: la funzione toBelow() deve essere richiamata con un oggetto grafico, di testo o di percorso di Roll20. Chiamato con [personaggio Roll20 -NM0tVij02hIfnoTdihc].

Blocchi dovuti a errori

La sandbox provvederà automaticamente a correggere eventuali piccoli errori presenti nel vostro script, riavviandolo all’occorrenza. Tuttavia, qualora rilevi un errore grave dal quale non è in grado di riprendersi, anziché limitarsi a riavviare ripetutamente lo script con il risultato che l’errore si ripeta, applicherà un “blocco per errore” alla Sua Campagna, impedendo l’esecuzione degli script di mod fino alla risoluzione dell’errore. Se i Suoi script sono stati bloccati a causa di errori, vedrà un messaggio simile a questo nella pagina “Impostazioni script Mod”:

Errore di blocco nell'editor degli script di modifica

Non si preoccupi! Basta apportare le modifiche agli script per cercare di risolvere il problema, quindi fare clic sul pulsante “Salva script ”. Una volta effettuato tale operazione, il blocco dovuto all'errore verrà rimosso e la sandbox tenterà nuovamente di eseguire i Suoi script. Qualora si verificasse un altro errore, il blocco errori verrà nuovamente applicato. È possibile ripetere questa procedura tutte le volte che è necessario per risolvere l'errore; non Le verrà mai impedito di eliminare i blocchi dovuti all'errore a causa di un numero eccessivo di tentativi falliti.

Call stack specifico dello script

Gli stack di chiamate mostrano i nomi degli script e i numeri di riga.

Tra gli errori figura uno stack di chiamate riscritto che riporta il nome dello script e della riga, anziché il file sandbox concatenato. Gli script manuali sono contrassegnati con la dicitura SCRIPT, seguita dal nome che avete assegnato alla scheda, dal numero della scheda, dalla riga in cui si è verificato l'errore e dall'offset della colonna:

Parte Esempio
Etichetta COPIONE
Nome Script "Bad Actor"
Scheda 85
Linea 3
Rubrica 13

Esempio: SCRIPT: Script "Bad Actor" [Scheda 85]:3

Stack di chiamate per uno script da Lei scritto

Gli script della libreria “singolo-clic” sono gli stessi, ma l’etichetta è 1-CLICK:

Stack di chiamate per uno script di libreria singolo-clic

Verrà tradotto l’intero callstack; pertanto, qualora disponiate di più script che ne richiamano altri, potrete individuare con precisione dove avvengono tutte queste operazioni.

Rilevato un possibile ciclo infinito - Ulteriori dettagli

Se la sandbox smette di inviare segnali di attività, si arresta, con il rischio di entrare in un ciclo infinito. Potrà vedere l'evento e dove è stata registrata la callback che era in esecuzione. Ciò contribuisce notevolmente a individuare con precisione dove si verifica un problema e dovrebbe consentire di trovare soluzioni in modo molto più rapido.

  • Evento: change:graphic
  • Richiamata: alla riga 37 dello script "Bad Actor"

Possibile ciclo infinito con evento e callback

Errori comuni

Di seguito sono riportati alcuni degli errori più comuni:

myvar non è definito

on("ready", function() {
  var myVar;
  log(myvar);
});

Sebbene il messaggio di errore indichi “non definito”, in realtà ciò che è accaduto è che la variabile non è stata dichiarata. Una delle cause più comuni di questo problema è un errore di battitura nel nome di una delle variabili, ad esempio l'omissione di una lettera maiuscola.

Impossibile leggere la proprietà myProperty oppure Impossibile chiamare il metodo myMethod

on("ready", function() {
  var myVar;
  log(myVar.myProperty);
  log(myVar.myMethod());
});

myVar non è definito, pertanto lo script non è in grado di gestire il Suo tentativo di accedere a una proprietà di myVar. Ciò è probabilmente dovuto a uno dei seguenti motivi:

  • Ha tentato di individuare un oggetto con getObj o findObjs, ma il risultato è stato indefinito. Si prega di eseguire un controllo degli errori per assicurarsi che la variabile sia definita prima di accedere alle sue proprietà.
  • La Sua variabile viene definita in modo condizionale (tramite una serie di istruzioni "if" o simili) e, poiché nessuna delle condizioni è stata soddisfatta, la variabile è rimasta dichiarata ma mai definita. Assicurarsi di disporre delle condizioni per tutte le possibilità, oppure creare un'opzione predefinita, o eseguire un controllo degli errori per verificare che la variabile sia definita prima di accedere alle sue proprietà.

Anche gli oggetti Roll20 necessitano dei metodi get e set. obj.left non indica la posizione sul tavolo di gioco; si utilizzi obj.get("left").

Señalino inatteso

È possibile che manchi un personaggio o che ce ne sia uno in eccesso. Ciò può verificarsi se si omette una virgola tra un elenco di proprietà in un oggetto o elementi in un array, oppure se si utilizza una parentesi chiusa in eccesso o in difetto alla fine di una chiamata di metodo annidata complessa.

_displayname restituisce "undefined", mentre get("_displayname") restituisce un nome

Per accedere alla maggior parte delle proprietà degli oggetti Roll20 è necessario utilizzare i metodi get() e set(). Quando si utilizza il metodo get(), è possibile omettere il trattino basso iniziale nelle proprietà di sola lettura: obj.get("displayname") equivale a obj.get("_displayname"). obj._displayname non lo è.

Se dovesse continuare a riscontrare problemi, non esiti a pubblicare un post sul nostro forum dedicato agli script di mod. Si prega di includere il testo dell'errore visualizzato nella console e una breve descrizione di ciò che si aspettava.

Questo articolo ti è stato utile?
Utenti che ritengono sia utile: 20 su 124