¿Cómo funcionan los algoritmos de generación de historia?

19

Escuché sobre el juego Dwarf Fortress, pero solo ahora una de las personas que sigo en Youtube hizo un comentario al respecto ... ¡Estaba más que sorprendido cuando noté cómo Dwarf Fortress realmente genera una historia para el mundo!

Ahora, ¿cómo funcionan estos algoritmos? ¿Qué suelen tomar como entrada, excepto la duración de la simulación? ¿Qué tan específicos pueden ser?

Y más importante; ¿Se pueden hacer en Javascript o Javascript es demasiado lento? (Supongo que esto depende de la profundidad de la simulación, pero tome Dwarf Fortress como ejemplo).

jcora
fuente
3
"¿Se pueden hacer en Javascript?" La respuesta es obviamente sí, pero depende de qué tan rápido desee los resultados y cuán complejos desee que sean. Dwarf Fortress también lleva un tiempo, ¡y se ralentiza a medida que el mundo envejece! Entonces, siempre que desee un historial superficial, sí, puede hacerlo en Javascript, por lo que depende de cuán complejo desee que sea el historial.
doppelgreener
2
Quiere decir "al nivel de la fortaleza enana", como en la escala.
MichaelHouse
2
@Bane Sí, quiero decir que puedes alterar la cantidad de historia que habrá en DF. Cuando comienzas un mundo, primero genera terreno al azar y luego comienza a envejecer el mundo ante tus ojos y genera historia a medida que avanza. Lo ves a medida que los imperios se expanden y se contraen, a medida que el terreno cambia, a medida que los bosques crecen y retroceden, a medida que las áreas se vuelven embrujadas (o ya no lo son), y así sucesivamente. Progresa año tras año (o varios años a la vez realmente) ante sus propios ojos. Esto continúa hasta que le digas que se detenga. Cuanto más avance, más lenta será la generación (debido al uso de la CPU, no a la mecánica del juego).
doppelgreener
1
Para ser muy claros: cuanto más viejo es el mundo, más lento es calcular cada año. En un mundo joven, se precipitará durante los primeros años, en un mundo de cientos de años, el próximo año podría demorar un segundo o unos segundos en generarse.
doppelgreener
1
Oh, eso lo sé. Por "profundidad", no me refería a la cantidad de años, me refería a la cantidad de eventos que ocurren y la precisión de la simulación. Puedes mantener una cantidad de cuántas personas tiene un imperio, o puedes hacer que se llame a una clase Person, que hace tareas, va al ejército, etc. Shallow permitiría que el tamaño del imperio decida los resultados de las batallas, pero profundo sería tener a cada soldado luchando por los suyos.
jcora

Respuestas:

27

En primer lugar, hay algunas pistas para la generación de historia sobre Dwarf Fortress. Alguien preguntó en los foros de Bay12 hace un tiempo, y se compartió una transcripción y puede encontrar dónde comienza la discusión buscando: "nuestro tema hoy es la generación mundial y la generación de historia".


No sé exactamente cómo lo hace Dwarf Fortress, pero explicaré cómo planeo implementar un primer borrador muy básico en mi juego. Voy a usar un autómata celular simple . Si observa estos prototipos de esporas , como el cultivo celular y el bioma.

ingrese la descripción de la imagen aquí

Estos son ejemplos de automatizaciones celulares y lo que pueden producir. Básicamente, crearé reglas para diferentes razas. Algunos ejemplos de reglas serían:

  • Su hostilidad hacia otras razas.
  • Sus preferencias climáticas
  • Sus necesidades de recursos
  • Sus tasas de natalidad y esperanza de vida.
  • Sus deseos (investigación tecnológica, comercio, existencia pacífica, dominación mundial)
  • Sus capacidades (construcción de estructuras, recolección de recursos, guerra, etc.)
  • Y así...

Por lo tanto, el aporte más crítico para que todo esto funcione es un mundo en el que se dediquen estas razas. El terreno determinará sus preferencias y expansión. Entonces, una vez que haya generado un mundo, elija ubicaciones aleatorias en el mundo donde estas razas vivirían adecuadamente y déjelos perder. Ahora las cosas interesantes comienzan a suceder. Ahora que tiene tierras y razas con deseos y capacidades, puede comenzar a construir una historia. Estas razas reúnen recursos, luego se construyen estructuras:

  • Ciudades en áreas de altos recursos y alta habitabilidad.
  • Los caminos conectan las ciudades más grandes.
  • Puentes a través de ríos.
  • Túneles a través de las montañas.
  • Fortalezas cerca de las primeras líneas de expansión en respuesta a las batallas.

Cualquier estructura puede ser asaltada / conquistada por otras razas. Cuanto más larga sea una estructura (como una ciudad o fortaleza) en la historia, más defendible es, más difícil es hacerse cargo. Y lo más deseable es para las carreras que quieren control. Las batallas se libran donde las razas se encuentran (al menos una es hostil). Las batallas se nombran por puntos de referencia o estructuras cercanas, o si la batalla es significativa o los puntos de referencia no se nombran, los puntos de referencia se nombran después de la batalla.

Los caminos, puentes y túneles se expanden a través del comercio y el transporte de recursos. Cada uno tiene un rendimiento máximo que puede aumentar con el gasto de recursos. ¿Construir una fortaleza de piedra en medio de pastizales? Esos caminos tendrán un uso intensivo para transportar la piedra requerida. Se harán más grandes y obtendrán un nombre.

Ocurren desastres naturales que afectan a las poblaciones y al curso de la historia. Los terremotos pueden reducir una ciudad a ruinas o colapsar un túnel. Una inundación puede arrastrar un camino o puente.


No es tan profundo como Dwarf Fortress, pero es un comienzo. Ahora, como pueden imaginar, (y como Johnathan Hobbs mencionó) cuanto más se expanden estas razas, más células se simulan. No solo se simulan más células, sino que las simulaciones son más complejas, ya que ahora hay estructuras para construir / mantener, batallas para ganar, comercio para ... comercio, etc. Esto se vuelve pesado para cualquier idioma. Javascript podría ralentizarse antes. Sin embargo, siempre puedes sacrificar la complejidad para mejorar la velocidad.

Todo es una simulación (aunque compleja), solo estás registrando los eventos importantes en el camino y llamándolo historia.

También acabo de encontrar una publicación en el foro de Bay12 para personas que hacen una lluvia de ideas sobre cómo hacer que la generación mundial de Dwarf Fortress sea más rápida. No lo he leído, pero puede proporcionar algunas sugerencias si alguna vez se encuentra con problemas con la implementación demasiado lenta.

MichaelHouse
fuente
Genial e informativo como siempre, @ Byte56. :)
jcora
1
Gracias Bane Tal vez no siempre, simplemente sucede que la gente hace preguntas sobre las que creo saber algo. Gracias por darme la oportunidad de pensarlo más y obtener algo escrito :)
MichaelHouse
4

Solo como un punto secundario, JavaScript no es tan lento como podría pensar .

Los desarrolladores de navegadores han dedicado mucho tiempo y energía a optimizar sus motores JavaScript . El punto de referencia al que me vinculé muestra que, fuera de las tareas comparadas, en la mediana, JavaScript fue solo 5 veces más lento que C , lo que no se puede decir de otros lenguajes interpretados. Y el límite inferior es aún más impresionante: a la par con C .

Por supuesto, los puntos de referencia del lenguaje no significan mucho, probablemente podría encontrar contraejemplos usando un punto de referencia diferente. Pero el punto es que JavaScript es bastante rápido . No, no es C o C ++, y no intenta serlo. Pero es bueno no quedarse atrapado en la mentalidad de "lenguaje interpretado == lento", porque para cualquier tarea de complejidad no trivial, el rendimiento tendrá más importancia en el diseño de algoritmos y menos en la elección del idioma.

En realidad iba a escribir todo esto en un comentario, pero me quedé sin espacio.

Voithos
fuente
1

Sí, se puede construir en javascript, verifique proyectos como ASM.js, que obtienen una velocidad casi 2 veces más lenta que C. Si se ocupa de múltiples núcleos (utilizando trabajadores web), puede ser incluso más rápido que el DF (en términos de recursos) , que es monocore en este momento.

usuario29687
fuente