|
Simutrans-Squirrel-API
r12240
|
English | Español (traducción)
Simutrans integra el lenguaje Squirrel para ejecutar escenarios y jugadores de AI escritos como guiones. El runtime de Squirrel integrado se ha actualizado a la versión v3.2 del proyecto original.
Se trata de una actualización del runtime del lenguaje. No es un rediseño de la Script API de Simutrans. No hace falta reescribir los guiones debido a esta actualización.
bindenv que ya existía. Véase bindenv.map en la biblioteca estándar de Squirrel. Véase table.map.Las fuentes de Squirrel que acompañan a Simutrans son una copia incorporada del proyecto original alojado en albertodemichelis/squirrel.
| Base incorporada anterior | 23a0620658714b996d20da3d4dd1a0dcf9b0bd98 | una instantánea de la línea de desarrollo 3.1.x, con fecha 2021-09-16 |
|---|---|---|
| Base nueva | f92bc298784ceea459b12e2de33bdff672bfeb83 | etiqueta de publicación v3.2 del proyecto original, con fecha 2022-02-10 |
La instantánea anterior se tomó de la línea de desarrollo posterior a la publicación de la 3.1, así que no era ni una 3.1 exacta ni una 3.2. Describir la actualización simplemente como «de la 3.1 a la 3.2» sería, por tanto, inexacto.
Los dos jugadores de AI que acompañan a Simutrans, sqai y sqai_rail, se han ejecutado con el runtime nuevo y siguen siendo compatibles. En la campaña de pruebas conservaron el estado lógico de sus conexiones, continuaron progresando de forma válida y no produjeron errores de guion ni de runtime. Algunas decisiones de planificación y búsqueda de rutas pueden variar debido al orden de iteración de las tablas, como se explica más adelante. También se ha comprobado que se carga correctamente una partida guardada con el runtime anterior.
Esto es una afirmación sobre los guiones y las rutas que cubrió esa campaña de pruebas. No es una garantía de que cualquier guion posible quede inalterado. Un guion que dependa del orden de iteración de las tablas puede comportarse de otra manera: véase la sección siguiente.
Squirrel 3.2 cambia la función hash que se aplica a las claves de tipo cadena. Las tablas son contenedores hash, de modo que esto cambia el orden en que foreach recorre sus entradas.
La consecuencia para un guion es indirecta, pero real. Si un guion recorre una tabla para elegir la siguiente tarea, el orden nuevo puede cambiar:
Esto no es corrupción ni es aleatoriedad. Con la misma entrada, el runtime se comporta igual siempre, el guion conserva su estado lógico completo y la ejecución sigue siendo válida. Lo que cambia es un desempate basado en un orden que nunca estuvo garantizado.
Si un guion necesita un orden definido, tiene que imponerlo él mismo (por ejemplo, recogiendo las claves en un array y ordenándolo) en lugar de confiar en el orden que una tabla produzca por casualidad.
Los arrays no se ven afectados: son contenedores ordenados y su orden forma parte de su contrato.
Las partidas guardadas con el runtime anterior se cargan correctamente con Squirrel 3.2. Esto se ha comprobado con los jugadores de AI que acompañan a Simutrans. La misma partida del runtime anterior se cargó varias veces para confirmar la reproducibilidad. Un estado cargado con 3.2 también se volvió a guardar y se recargó correctamente. Los guiones se reanudaron con su estado persistente completo.
El sentido contrario (cargar una partida guardada por Squirrel 3.2 en una versión anterior de Simutrans) no formó parte de este trabajo y no se afirma.
Cuando el estado persistente de un guion se vuelve a escribir, las entradas de una tabla guardada pueden aparecer en un orden distinto al anterior. El estado guardado en sí no se ve afectado: se restaura por nombre, no por posición.
Vincular un entorno a una función es una característica del lenguaje Squirrel, no una clase ni un registro de la API de Simutrans.
El método que ya existía no ha cambiado y sigue funcionando:
Squirrel 3.2 añade una forma en línea. El entorno se escribe entre corchetes, entre el nombre de la función y la lista de parámetros:
La misma forma con corchetes se admite en funciones con nombre, en funciones locales y en miembros de clases y tablas, incluido constructor.
Las dos formas producen una clausura cuyo entorno es el objeto indicado, ya sea una tabla, una clase o una instancia. La forma en línea es una comodidad; no da acceso a nada que la forma con método no permitiera ya. Los guiones existentes no necesitan ningún cambio.
Squirrel 3.2 añade un método map a las tablas en la biblioteca estándar. Los arrays ya lo tenían.
El callback se llama una vez por entrada y recibe la clave y el valor, con this vinculado a la tabla:
Conviene conocer dos propiedades:
table.map devuelve un array con los resultados del callback, no una tabla. En esto se diferencia de table.filter, que devuelve una tabla.bindenv es una característica nueva del lenguaje, y table.map es una característica nueva de la biblioteca estándar. Los guiones que las usen no funcionarán en versiones anteriores de Simutrans.
1.8.13