Razón Artificial

La ciencia y el arte de crear videojuegos

Modelado del Daimyo artificial. Optimizando la extracción de recursos en juegos RTS

Escrito por adrigm el 6 de abril de 2011 en Desarrollo Videojuegos, Inteligencia Artificial, Noticias | 0 Comentarios.

Una de las tareas principales de un juego RTS es la de recolectar los recursos que necesitamos para desarrollar nuestra estrategia de crecimiento a todos los niveles: tecnologías, efectivos, edificios y cualquier otro elemento que pueda intervenir en el juego.


YouTube Direkt

El Daimyo era la figura en el entorno feudal japonés que poseia un terreno y se encargaba de administrarlo. Cuando no estaban en guerras con el resto de Daimyos era porque uno de ellos habia asumido el rol de Shogun o repartidor de palos máximo, en cuyo caso el resto tenian que dar buena cuenta de lo que se cocía en su territorio. De cualquier modo, la visión del daimyo que reparte la pana en su tierra y que debe cumplir con una serie de peticiones del Shogun en materia de tributos es la que nos interesa a nosotros. Nos vamos a dedicar a construir un Daimyo para nuestro sistema de entretenimiento de estrategia en tiempo real. Veamos que tenemos que tener en cuenta para crear el azote de los recolectores.

Respecto a los que habeis seguido la distribución de comportamiento mediante comandantes que ya hemos visto en otros artículos vereis que aqui vamos a tratar acerca del Comandante de Recursos. El que va a encargarse de distribuir las responsabilidades entre las unidades de recolección y de proveer al resto. Temas como la creación de unidades o la distribución de las mismas serán problemas a tener en cuenta.

Antes de nada hay que diferenciar entre el análisis desde el punto de vista de una inteligencia artificial que sigue las reglas establecidas y una que no. La primera se refiere a aquella que tiene la misma información que el usuario de modo que juega ‘limpio’ teniendo en cuenta que la IA no tiene la capacidad de un cerebro humano por lo que ya jugar limpio implica que los oponentes tienen capacidades muy diferentes, es decir, juegarían en diferentes categorias. Aqui lo que queremos es dar una visión del enfoque científico donde las pirulas no se deben tener en cuenta. Sin embargo, para estar a la orden del dia en lo referente al ámbito comercial, le vamos a dar un repaso al tema del trampeo en lo que se refiere al tema de minado de recursos.

Introducción a la extracción de recursos

Como en la vida real, de la correcta disponibilidad de los materiales dependerá la velocidad de desarrollo del juego y el desempeño de nuestra estrategia. Extraer recursos es una tarea que implica un nivel de organización amplio y que requiere de una serie de estructuras que soporten la posibilidad de que la lógica del sistema vaya creciendo sin que el acoplamiento y las dependencias entre los diferentes elementos crezcan de una forma inapropiada.


YouTube Direkt

Para llevar a cabo las tareas, se tienen en cuenta varias necesidades. Por un lado la necesidad de calcular con exactitud el número y la proporción de recursos necesarios para llevar a cabo la estrategia. Por otro, la necesidad de determinar los elementos necesarios para llevar a cabo la extracción con un ratio tiempo/unidades válido. Y finalmente la distribución y comando de las unidades asignadas a recursos o energías no renovables.

Número óptimo de unidades

Para calcular el número óptimo de unidades necesitamos tener una medida de lo que estas deben llevar a cabo. En términos generales se pretende que a partir de una medida de los requisitos de cada uno de los elementos que controlan la lógica del sistema (comandantes de construcción, de exploración, de guerra o cualquier otro que definamos), generemos una solución que permite obtener los recursos necesarios en un tiempo determinado.

El administrador de recursos será la pieza clave en todo el desarrollo y cumplirá con las tres tareas principales que hemos visto: calcular recursos, crear unidades de recolección y distribuirlas. La forma en la que trabaja este elemento lógico es adquiriendo peticiones, ejecutando acciones para llevar a cabo la adquisición y traspasando estos recursos obtenidos.

Vale la pena comentar que el administrador o comandante de recursos está apoyado por el comandante de exploración que se ha definido anteriormente y que marca un mapa interno con las posiciones de los recursos a minar. Pequeños ajustes en este comandante harán que este administrador disponga de más o menos opciones a la hora de distribuir las unidades.

La proporción exacta de cada elementos. La petición del material

En nuestro sistema, será posible disponer los diferentes elementos en muchas configuraciones y estructuras diferentes. Para este tipo de sistemas, la distribución jerárquica es muy apropiada por lo que distribuiremos el comportamiento bajo este paradigma. Como se ha visto anteriormente en el artículo de “Comandantes y Subcomandantes para el control de comportamiento”, para cada comandante hay un superior que monitoriza las acciones y determina la estrategia de la partida, este es el Comandante General o General a secas.

De el General cuelgan de forma jerárquica los diferentes comandantes. Para simplificar vamos a considerar 3 de ellos. El subcomandante de exploración, el de extracción de recursos y el de batalla. Ya podemos identificar que los 3 tienen necesidad de recursos.  El lugar idoneo para colocar un gestor de los mismos es en el General. De este modo cada subcomandante comunica a su superior los recursos que necesita para llevar a cabo su estrategia. El modelo jerárquico permitirá que varias capas de jerarquía vayan aglutinando los recursos necesarios conforme se sube en el escalafón hasta llegar al nivel superior que determina la estrategia general, el Shogun que comentabamos antes.

Cada clase subcomandante, por lo tanto,  tendrá una función que vincula al General y se resume en:

peticionDeRecursos(proporción tipo0, proporción tipo1 … proporción tipoN)

por ejemplo:

// 100 unidades de oro, 200 de madera y 100 de piedra.
peticionDeRecursos(100, 200, 100);

Una pequeña variación de comandante será esta:

La clase General tendrá una estructura que permite anotar estos requisitos y facilitarlos cuando sea necesario. Vemos como.

Como repartir los recursos entre los diferentes elementos lógicos

Cuando tenemos registradas las peticiones de cada subcomandante podemos abordar el problema desde dos puntos de vista diferentes.

El primero de ellos es seguir una estrategia general y suministrar los recursos en base al estado de la partida (fase inicial, desarrollo, defensiva o ataque… o cualquier otra distribución). De este modo se asigna un porcentaje concreto de distribución de recursos que varía constantemente conforme varía el estado de la partida.

El segundo punto de vista es el de las ‘Proporciones dinámicas’. En este caso, el cálculo se hace en base a la suma de todas las peticiones realizadas por los diferentes comandantes de modo que si la suma de de los recursos de un material se dobla, los esfuerzos a realizar por las diferentes unidades también se doblarán.

Una estrategia diferente es la de llevar una lista de las peticiones de cada subcomandante y servirlas de forma ordenada conforme se van adquiriendo los recursos. Esta opción es más costosa de modificar en caso de cambio de estrategia por lo que se utilizará en aquellos
casos que no representen una complejidad importante o en el que los estados de juego no varien de forma importante.

Parámetros para la creación de unidades de recolección óptimas

Uno de los elementos clave es la creación de unidades y su distribución. Podemos hacer cálculos sencillos definiendo un porcentaje fijo de los recursos que extraemos y creando un número concreto de cada unidad de juego o podemos estimarlas en base a un cálculo más ‘inteligente’.

Para un cálculo más elaborado tendremos que tener en cuenta una serie de medidas que pueden estar o no disponibles y que ajustaremos acorde a nuestro sistema.

  • Total de las demandas de cada subcomandante. Ct
  • Recursos disponibles actuales cedidos por el General. Rd
  • Coste de las unidades de recolección, simplificamos con una. Ur
  • Velocidad de desplazamiento de las unidades. Vu
  • Tiempo de recolección de las unidades. Trec
  • Tiempo de construcción de cada recolector. Tc
  • Distancia Euclidea media a cada tipo de recurso (simplificamos a un solo tipo). De1
  • Tiempo estimado de consecución de los objetivos actuales. Te

El número de trabajadores será, escalado a cada proporción de recursos respecto el total Cd (suponemos solo un tipo):

Suponemos que el Te = (Tiempo de construcción TiC) + (Tiempo de minado total TiM). Este es el peor de los casos ya que podemos construir en paralelo mientras vamos minando, sin embargo es una buena aproximación.

Sea el tiempo de recolección que requiere un trabajador para minar todos los recursos (tiempo en llegar, recolectar y volver medio).

T1t = Ct/(Trec+Tdesp);

Tiempo de desplazamiento medio:

Tdesp = De1 / Vu; (x = vt <– ¿suena esta?)

Se calcula el TiM (Tiempo que tenemos disponible para minar) como:

TiM = Te – TiC; 

En un primer paso no conocemos el tiempo de construcción ya que no sabemos cuantos construiremos por lo que marcamos un determinado porcentaje del tiempo esperado de recolección que inicialmente representa un estimador de la velocidad que queremos darle a la extracción y por lo tanto al juego. de este modo:

//Iniciamos con un factor alto y vamos disminuyendo, por ejemplo 0.8.
//Quiere decir que tenemos la espectativa de dedicar el 20% del tiempo a construir en un primer plano.
TiM = factor*Te; 

Y marcamos el número de trabajadores inicial como Nt:

Nt =  TiM / T1t;

Desde este punto monitorizaremos la entrada de recursos y ampliaremos o disminuiremos en función de la carga de los recursos y la disponibilidad de los mismos. Seguiremos una política prudente para no disponer de un número excesivo de efectivos.

Una vez conocemos el Nt podemos calcular el tiempo de recolección esperado como:

TeCalculado = Tc*Nu + TiM;

Si este supera en un determinado porcentaje a nuestras espectativas de Te ajustamos el parámetro y volvemos a calcular. El proceso es único para cada paso de la partida y será rápido. De cualquier modo no deja de ser un estimador y debe de ser calculado constantemente para ajustarse a las variaciones del juego.

Control de los trabajadores y cálculo del recurso idoneo

El parámetro principal es la distancia a la base desde el recurso. Cuando la mínima distancia al recurso es superior a un determinado parámetro, se debe crear nueva base de recolección más cercana. Esta responsabilidad será del comandante constructor.

Nosotros mandaremos a nuestras unidades al recurso más cercano y al tipo concreto y tantas como el recurso sea capaz de asimilar sin que las unidades interfieran entre ellas. El algoritmo de selección del recurso idóneo para cada unidad será:

para cada unidad
min = +infinito;
para cada base
para cada recurso libre
distanciaParcial = calculoDistanciaEuclidea (baseActual, recurso);
si distanciaParcial < min
marcaRecursoActual();
finsi
fin
fin
recursoMarcado.numeroDeMineros++;
Si recursoMarcado.numeroDeMineros > máximoDeMinerosPorRecurso
recursoMarcadoExtraidoDelCálculo;
finsi
MonitorPathFinding(unidad, recurso, base);
fin

En términos generales el algoritmo busca el recurso más cercano y lo asigna. Si hay muchas unidades asignadas lo saca del cálculo. Este está simplificado pero para el cálculo algo más complejo tendremos en cuenta la posición de la unidad actual para reasignarla primero a los más cercanos a su posición. Por otro lado podemos tener en cuenta el tipo de recurso filtrando en el caso de que haya más de uno.

Cuando la unidad notifica el fin de recursos a su comandante se reasigna. Si recibe ataque o cualquier otro evento también notifica y se le reasigna.

Recursos renovables VS No renovables. El comercio de comodín

El tipo de recursos en muchos de los juegos RTS puede caracterizarse en tres tipos por norma general: renovables, no renovables y auto-generables.

En el último caso no es necesario preocuparse por la distribución ni la estrategia a largo plazo, sin embargo, los otros dos representan un problema, la disponibilidad. Este aspecto lo tendremos en cuenta en la definición de la estrategia general en el ‘General’ haciendo una estimación en base al mapa en el que nos encontremos y a la densidad de recursos. Esto produce una solución dependiente del problema.

Otra solución que no permitirá aprovechar la distribución de los recursos desde el inicio será la de una estrategia adaptativa. Mediante esta orientación, vamos solventando de forma progresiva las peticiones de los subcomandantes conforme vamos adquiriendo material. El ‘comandante General’ puede tener acceso a la lógica de sus subcomandantes de forma conceptual asignando determinados porcentajes de recursos de modo que ell subcomandante ‘conozca’ la situación del minado de los recursos de forma indirecta. De este modo, el subcomandante puede decidir ajustarse al tipo de unidad que más se adapta a la producción en curso y a su cuota asignada. Los elementos que intervendrían en resumen: producción de cada tipo, porcentaje de la producción asignada a cada subcomandante y en sistemas avanzados, estimadores en base a las previsiones de generación de recursos.

El comercio toma una baza significativa en muchos sistemas actuales, siendo el único modo de adquirir determinadas materia primas o recursos y en muchas ocasiones la más efectiva. En nuestro subcomandante de recolección podemos definir una cuota asociada al desarrollo a largo plazo del elemento de comercio. Si bien puede permanecer inactiva en las fases iniciales del juego, conforme se desarrolla puede tomar mayor importancia. Las adquisiciones se harán en base a valores absolutos que recibe el jefe, es decir, el General.

Defensa de los recursos

Los recursos son casi tan importantes como las bases por lo que nuestra estrategia a largo plazo implicará defenderlos y afianzar las posiciones de las minas u otros recursos. En este caso interviene el ‘Posicionamiento de las unidades de defensa’ y es una tarea que debe llevar a cabo el Subcomandante de Defensa. La ventaja de haber distribuido la lógica por funcionalidad y tipo de tareas es que en lugar de tener que preocuparnos de buscar recursos o de defenderlos, tenemos que ir a la materia, recogerlos.

Los scouts o exploradores estarán gestionados por el subcomandante de exploración que en la fase correspondiente se encargará de posicionarlos de forma correcta para prevenir ataques sobre las minas. Cuando se detecta una intrusión o un ataque inminente, el Subcomandante de Exploración se encarga de avisar al General con su posición y el General de comunicar a los diferentes Subcomandantes que actuan en un radio de seguridad determinado de una alerta. Si el sistema de control o subcomandante de Recursos recibe una orden de peligro del General, deberá aplicar las maniobras necesarias. En este caso podemos mover las unidades a un punto seguro (la base o los puntos de seguridad concretos) o podemos plantear una mabiobra evasiva. De cualquier modo esperaremos la señal de fin de alerta del General para volver al trabajo.

Trampeando para mejorar la competitividad

Una vez hemos visto como lo hacemos bien y de forma organizada, nos bajamos al mundo real en el que tenemos que disponer de un sistema competitivo y que plantee retos a los niveles más avanzados de usuarios. En este caso, podemos trabajar la IA y ajustarla de forma que mediante muchos estados de juego y muchas optimizaciones quizá lleguemos a obtener un buen desempeño, o bien podemos tomarnos la licencia de hacerle un pequeño feo al jugador, claro está este no debe percibirlo, por eso es una trampa.

Lo que se hace en general es inyectar soluciones que influyan directamente en la economía del sistema sin que los enemigos lo perciban. ¿Donde metemos mano? Pues muy facil, en todo lo que se menea y en lo que no. Costes de unidades y edificios, capacidad de extracción de recursos de las unidades, tecnologías adicionales y en definitiva todo aquello que no pueda ser percibido directamente.

Un conocido ejemplo entre los insiders es el del Starcraft, donde en la modalidad Insane, la máquina se ‘atribuye’ 2000 de mineral y de gas, haciendo que la partida sea dura (Por supuesto esto no se extrae a través de un comunicado oficial): http://www.shamusyoung.com/twentysidedtale/?p=1597

En resumen

Hemos visto en detalle los elementos que se deben tener en cuenta a la hora de extraer recursos
con un punto de vista estratégico, desde la cantidad hasta el control de las unidades. Hemos comprobado como en ocasiones, es necesario añadir ‘ventajas’ competitivas sobre los jugadores y hemos distribuido la lógica del sistema de recolección y su comunicación con el resto de elementos del juego. Se ha visto que en función del estado en el que nos encontremos, aplicaremos una estrategia diferente y que en lo referente a la defensa y a la exploración, daremos por hecho que cada elemento cumple con su objetivo. En caso de detectar cualquier problema, sabremos donde ir a solucionarlo.

Deja un comentario