Para muchos scripts, actualizarlos para que sean compatibles con la hoja 2024 se reduce a cambiar dos cosas: cómo se obtienen y establecen los atributos y cómo se analizan las plantillas de rollo/mensajes de chat. Este documento le guiará a través de ambos, así como a solucionar algunos problemas comunes para que pueda actualizar cualquier script para que sea compatible tanto con la hoja D&D2014 como con la hoja D&D2024.
Cuando su guión se actualice de esta forma, en los juegos con hojas Beacon como D&D2024, los GM tendrán que utilizar el servidor API Experimental para utilizar todas las últimas funciones. El servidor Experimental tiene todas las mismas funcionalidades que el servidor Predeterminado, por lo que no debería romper ningún otro script hacer este cambio, pero puede que quiera indicarlo en la descripción del script para que sus usuarios lo sepan. Si no hay hoja de balizas, el servidor por defecto seguirá funcionando con estas funciones, ya que recurrirá a las funciones heredadas de obtención y fijación de atributos.
Actualizar ajuste/obtención
El principal cambio entre el acceso a los datos de la hoja 2014 y la hoja 2024, en cuanto al código, es cómo se obtienen y establecen los atributos. Ahora hay un nuevo conjunto de funciones asíncronas llamadas getSheetItem
y setSheetItem
. He aquí un ejemplo de utilización de las nuevas funciones:
const getDeathSaveSuccess = async (id) => {
const firstSuccess = await getSheetItem(characterId, "deathsave_succ1");
log(`El primer éxito es ${firstSuccess}`)
}
Si desea obtener el valor máximo de un atributo (si existe un máximo), puede pasar la propiedad max, como getSheetItem(characterId, "deathsave_succ1",
" max");
.
Observará que en el código anterior, getDeathSaveSuccess
está marcado como async. Cada función que utilice getSheetItem
tendrá que utilizar este patrón async/await, o utilizar promesas. Aquí está la misma función anterior, reescrita como una promesa:
const getDeathSaveSuccess = (id) => {
getSheetItem(characterId, "deathsave_succ1").then((firstSuccess) => {
log(`El primer éxito es ${firstSuccess}`);
});
}
Si está intentando obtener varios valores a la vez o uno tras otro y el resto de su código depende de tener esos datos, puede esperar
cada valor individualmente o utilizar Promise.all
para resolver cada promesa a la vez y obtener el valor final. Si no lo hace, el valor que obtendrá de vuelta será sólo una promesa pendiente, no el valor real del atributo.
const getSuccesses = (id) => {
const promises = [];
promises.push(getSheetItem(characterId, "deathsave_succ1"));
promises.push(getSheetItem(characterId, "deathsave_succ2"));
promises.push(getSheetItem(characterId, "deathsave_succ3"));
Promise.all(promises).then((results) => {
log(`El primer éxito es ${results[0]}, el segundo éxito es ${results[1]}, el tercer éxito es ${results[2]}`);
}
}
El código asíncrono puede tener muchas ramificaciones en la forma de escribir un script, dependiendo de cómo lo haya estructurado. Por ejemplo, si actualmente hay un script que utiliza getAttrByName
dentro de un replace
o map
, tendrá que dividirse en un bucle más asíncrono, porque esas funciones no esperarán a que vuelva un valor antes de continuar.
Rebobinemos hasta cuando escribí "Si está intentando obtener varios valores a la vez o uno tras otro y el resto de su código depende de tener esos datos". El resto de su código no siempre depende de tener ese valor. La mayoría de las veces, se basará en ese valor si está utilizando getSheetItem
, porque querrá hacer algo con el atributo que esté obteniendo. Sin embargo, a menudo para la inversa, setSheetItem
, no necesita esperar a que termine en absoluto. En ese caso, puede ignorar las ramificaciones de que estas funciones sean asíncronas y simplemente llamarlas de forma normal. El atributo se actualizará en segundo plano mientras su script sigue adelante.
La función setSheetItem
funciona igual que getSheetItem
, pero incluye un argumento adicional para determinar a qué atributo debe ajustarse.
setSheetItem(characterId, "hp", 10);
setSheetItem(characterId, "hp", 20, "max");
Actualización del análisis sintáctico de rollos
La otra cosa que hacen muchos scripts de 5e y que necesita actualizarse es el análisis sintáctico de las tiradas. Los rollos que se envían al chat tienen un formato completamente distinto y habrá que analizarlos de forma diferente para obtener resultados o conocer detalles sobre el contenido. El equipo de desarrollo ha añadido algunos atributos de datos al HTML que minimizarán la necesidad de un extenso análisis sintáctico del HTML, pero si necesita datos más complejos es posible que aún tenga que analizarlos a partir del mensaje enviado al chat. Hemos esbozado a continuación algunas necesidades comunes para ayudarle a empezar.
Para obtener el resultado de una tirada en nuestra plantilla de tirada estándar:
const rollResultMatch = msg.content.match(/data-result="(.+?)"/);
Para comprobar de qué tipo de rollo se trata basándose en el título:
const deathSaveMatch = msgContent.match(/encabezado__título">Inserte aquí el encabezado<\/div>/);
Para comprobar el subtítulo de la tirada para averiguar cosas como el nivel del hechizo o el tipo de daño:
const spellLevelMatch = msgContent.match(/cabecera__subtítulo">Nivel (.+?) /);
Dado que la hoja 2024 aún está en desarrollo activo, existe la posibilidad de que cambien cosas con las plantillas de rodillo que requieran nuevas actualizaciones de sus guiones. No podemos prometer que el análisis sintáctico de las cadenas HTML se mantenga estable para siempre, pero estamos trabajando para conseguir plantillas más estandarizadas a medida que seguimos desarrollando la hoja. Los ejemplos anteriores son algo rígidos en su regex por simplicidad, pero le recomendamos que utilice la concordancia difusa y los comodines para que su concordancia sea más robusta mientras las plantillas de rollo sigan cambiando.
Problemas comunes
"Error: No se ha encontrado ningún atributo o campo de hoja para character_id (SU ID AQUÍ) llamado (SU ATRIBUTO AQUÍ)"
Causa probable: Probablemente se encuentra en la API por defecto en lugar de en la API experimental y está intentando acceder a una propiedad computada de Beacon. Cuando haga clic en "Reiniciar servidor", asegúrese de que el mensaje de reinicio de la API incluye la palabra EXPERIMENTAL y no DEFAULT. Si el desplegable está en Experimental pero los registros de reinicio dicen DEFAULT, vuelva a cambiar a Default, reinicie y, a continuación, vuelva a cambiar a Experimental y reinicie de nuevo. Se trata de un problema conocido con el cambio entre Default y Experimental que estamos investigando actualmente.
El resultado de getSheetItem está registrando un objeto vacío en lugar de un valor
Causa probable: no esperar o utilizar .then en la función getSheetItem. Tiene que esperar a que el valor regrese antes de seguir adelante con el código.