gameai's People
gameai's Issues
Implementar "Defender territorio"
Opción 1
Descripción
Las unidades estan en modo defender zona que cubre todo el territorio aliado hasta el rio.
Lógica
-
Si la unidad está en un punto de curación y su salud no es máxima:
->Nada -
Si la unidad está en un punto de curación y su salud es máxima:
->Considerar 3. y 4. -
Si la unidad está en fuera del rango del centro del terreno y no tiene GoTo
->GoToPasivo centro del terreno por camino seguro, margen de llegada alto.
#-> Defender zona -
Si la unidad está en en el rango del centro, no hay enemigos en el territorio y tiene asignado DefendZona:
-> GoToActivo cerca del punto, marge de llegada medio
#-> Defender zona -
Si la unidad está en el rango del centro, tiene poca vida y no GoTo
-> GoToPasivo camino seguro a punto de recuperar vida con margen pequeño
#-> Defender zona con radio muy pequeño
Problemas
- 1 Todas las unidades es probable que vayan a atacar a la misma al defender la misma zona cogerán la primera que aparezca.
- 2 Si vienen unidades por el río normalmente no dará tiempo a interceptarlas antes de cruzar.
Posibles soluciones:
- 1.1 Puede controlarse cuantos aliados van a atacar a un enemigo e intentar solo atacar a aquellas unidades con menos de X aliados que la atacan. Pero esta límitado porque es una tarea, no pueden tomarse decisiones coordinadas.
- 1.2 La Capa 3 puede ser quien controle que enemigos entran en la zona y sea quien asigna en tiempo real los objetivos de las unidades aliadas.
- 2 Cuando no haya un objetivo a la vista pueden irse al río para prevenir la llegada de enemigos.
Opción 2
Descripción
Las capa 3 detecta clusters de enemigos y les manda el número apropiado de unidades disponibles como para destruirlo. También predice la llegada de enemigos por el puente y bloquea los puentes.
Métodos
Detección de clusters:
Cluster 1: Se coge un enemigo, se buscan sus vecinos no visitados y se marca enemigo como visitado. Se repite el proceso añadiendo los vecinos no visitados al cluster.
Cluster N: Repetir hasta que no queden enemigos en territorio aliado.
Asiganción de unidades a cluster:
Los clusters se recalculan cada N segundos y se asignan las unidades más cercanas.
N unidades atacar a cluster:
- Opcion 1. Cada unidad se le da la orden de atacar a otra unidad del cluster.
- Opcion 2. Todas las unidades se les manda un defender zona en el centro del cluster.
Lógica
[Las unidades con poca vida debería ir a curarse]
- Obtener lista de clusters
- Puntuarlos en función del número de aliados alrededor del cluster, ponderando la cercanía.
- Restar a la ponderación el número de unidades del cluster. (para obtener el balance de fuerzas)
- Ordenarlos por puntuación
- Asignar a cada cluster el número mínimo de unidades para tener una pequeña ventaja.
5.1 Cada cluster coge la unidad más cercana a su centro
5.2 Está unidad se le ordena un atacar+follow al enemigo más cercano del clúster - Si quedan unidades restantes -> Coger el número de enemigos de cada clúster y normalizarlo para que sumen el número de unidades restantes.
6.1 Repetir 5.1
6.2 Si la relación de unidades mandas respecto a enemigos es muy alta -> Dejar de asignar.
Si la lista de clusters es nula o quedan unidades sin asignar
-> Mandar las unidades a algún puente con GoToPasivo
#->poner en defender zona
Implementar "Recuperar vida"
Comprobación de seguridad de un camino
Opción 1: Usando pathfinding.
Usamos el pathfinding para generar el camino a un punto, extraemos la lista de nodos del camino, y comprobamos la influencia del camino.
Pros:
- El más preciso
Contras:
- Ejecución lenta
- Necesitaríamos trabajar de forma asíncrona
- La unidad probablemente se quede quieta hasta encontrar una respuesta
Opción 2: Usando una heurística (línea recta)
Pros:
- En la mayoría de los casos, funcionará igual de bien (solo cambiaría el resultado si la línea recta atraviesa terreno impasable, y al tomar el desvío el pathfinding se mete en una zona peligrosa)
- Más rápido, podríamos trabajar de forma síncrona
Contras:
- Sigue siendo algo lento
Opción 3: Usando varias heurísticas (línea recta y memoria)
Una vez calculado si un punto de curación es seguro o no, almacenarlo para que otras unidades cercanas no tengan que calcularlo de nuevo
Pros:
- Mucho más rápido que la opción 2 con un éxito similar
Contras:
- Dificultad para saber cuándo resetear el estado de "peligro" de un punto de curación
- Dificultad para saber qué unidades tienen que comprobar si es seguro o no (unidades lejanas), y qué unidades no necesitan hacerlo (unidades cercanas a la que lo comprobó)
Opción 4: No hacer comprobaciones
Simplemente si una unidad necesita curarse, va y lo hace. Con poca vida lo más probable es que muera pronto, no haría mucha diferencia quedandose en combate.
Pros:
- La más fácil y rápida
Contras:
- La más "tonta" (Pero recordar el Good enough, soon enough)
Implementar "Atacar territorio enemigo"
Selección de unidades Capa 2
DEFBASE:
Priorizar aquellas unidades que esten más cerca de la base aliada
DEFHALF:
La importancia de la estrategia de DEFHALF se determina evaluando la importancia por separado de cada Waypoint central (mid, top y bottom) y cogiendo el máximo entre esos tres. Lo adecuado sería guardar cuál de los tres waypoints ha sido el elegido, y priorizar las unidades cercanas a él, preferiblemente que estén en la mitad aliada del terreno, para que no haya conflictos con ATKHALF, en caso de que salga elegida (¿Tener esto en cuenta solo si ATKHALF ha sido elegida sería viable? Si ATKHALF no tiene unidades asignadas podemos simplemente coger las más cercanas al waypoint en concreto)
ATKBASE:
Priorizar aquellas unidades que estén más cerca de la base enemiga
ATKHALF:
Priorizar aquellas unidades en territorio enemigo, es decir, en un radio de tamaño 45 con el centro en el waypoint "enemyBase" (la distancia a la base o a otros waypoints da igual)
Arquitectura mapa distintos terrenos
Resolver como crear el mapa de tal forma que hayan distintos tipos de terreno. Esto puede requerir tener distintos objetos tipo Plane con el mismo Layer y distinto Tag por ejemplo.
Opcion 1º:
Tenemos un objeto Plane por cada zona de terreno del mismo tipo contigua con un Tag que identifica el tipo de terreno.
Todos los Plane compartirían un Layer "terreno".
Implementar "Atacar Base"
Comportamiento capa 3
DEFENDER BASE:
- Si la unidad tiene poca vida, y el camino hacia una zona de curación que no esté muy lejana no está amenazado, la unidad irá hacia dicha zona de curación (Nota: ¿Considerar algun cierto caso en el que la unidad no vaya a curarse?)
- Si no hay enemigos en la base, y las fuerzas aliadas en la base son superiores a las enemigas en las cercanías de la base (y hay enemigos en dichas cercanías), las unidades aliadas saldrán de la base y atacarán a dichas unidades
- Si no, deberá Defender la Zona, donde la zona a defender es la base
DEFENDER TERRITORIO:
- En caso de que Mid tenga unidades enemigas a su alrededor, la zona a Defender será dicho waypoint
- Si no, la zona a defender será el Waypoint con mayor influencia de los dos, siempre que las unidades que compongan esta estrategia tengan una fuerza militar no muy inferior a la enemiga en dicho waypoint
- Si es muy inferior, la zona a defender será delante de la base, entre las dos montañas
ATACAR TERRITORIO:
- (Discutir formas eficientes de buscar zonas críticas en campo enemigo:
Opcion 1: Establecer varios waypoints, y comprobar los alrededores de dichos waypoints
Opcion 2: Dividir el territorio enemigo en zonas de 10x10 (o de otro tamaño), comprobar la influencia/ventaja militar en esa zona, y atacar a la que más tenga, o a la que más tenga donde el grupo aliado vaya a tener ventaja militar
Opción 3: Simplemente dirigirse al territorio enemigo y reagruparse. Los enemigos tendrán que defender su territorio o se arriesgarían a que el grupo aliado acumulase demasiadas fuerzas y pueda atacar la base enemiga) (Lo suyo es esta)
ATACAR BASE:
- Comprobar qué unidades están más o menos cerca de la base enemiga. Si esas unidades NO tienen ventaja militar con respecto a los enemigos en la base, esperarán delante de la base enemiga (a una distancia razonable) a reagruparse con los rezagados, hasta que SÍ tengan ventaja frente a las unidades enemigas en la base. Entonces se les asignará la orden de Atacar la
- (Si las unidades enemigas en la base enemiga ven que son mas fuertes que este grupo que está reagrupándose van a salir a atacarles. ¿Tendriamos que hacer que en ese caso este grupo se retirase, o dejamos que peleen contra los enemigos?)
- Una vez reagrupados (o, si ya desde el principio son mas fuertes, nada mas asignarse a esta orden) todas las unidades con esta orden reciben la orden de Atacar Base
Comportamiento de las unidades
Trigger : Accion 1
Accion 2
Accion 3...
Trigger :
> Caso a : Accion 1
Accion 2...
> Caso b : Accion 1
Accion 2....
La prioridad de los Triggers va según el orden en el que estén descritos
-- MELEE --
Base siendo atacada: Mantenerse a una distancia máxima de la base
Atacar a los invasores
Vida por debajo del 20%:
> Si hay en un rango un punto de curacion que no esté en zona peligrosa: Huir a ese punto
> Si no, huir hacia la base
Una unidad enemiga entra en un rango: Ataca a la unidad
Default: Avanzar hacia la base enemiga
< Cómo atacan >
- Modo agresivo:
Preferencia de ataque: Artillery > Ranged > Scout > Melee
Preferencia de situación: Atacarán a aquella unidad situada en un terreno donde maximicen el daño que provoquen. En caso de empate, a la más cercana.
- Modo defensivo:
Preferencia de ataque: Melee > Scout > Ranged > Artillery
Preferencia de situación: Atacarán a aquella unidad situada en un terreno donde minimicen el daño que reciban. En caso de empate, a la más cercana.
- Modo berserker: (Ganan un 25% de fuerza, no huyen cuando les queda <20% HP)
Preferencia de ataque/situación: La que sea que esté más cerca de ellas
(solo del equipo rival)
-- RANGED --
Mismos comportamientos base que Melee
< Cómo atacan >
- Modo agresivo:
Preferencia de ataque: Al que le hagan más daño
Preferencia de situación: Atacarán situados en un terreno donde maximicen el daño que provoquen. En caso de empate, a la más cercana.
- Modo defensivo:
Preferencia de ataque: Melee = Scout > Ranged > Artillery
Preferencia de situación: Atacarán situados en un terreno donde minimicen
el daño que reciban. En caso de empate, a la más cercana. Se alejarán para ponerse a distancia máxima de disparo.
- Modo berserker: (Ganan un 25% de fuerza, no huyen cuando les queda <20% HP)
Preferencia de ataque/situación: La que sea que esté más cerca de ellas (solo del equipo rival)
-- SCOUT --
Base siendo atacada: Mantenerse a una distancia máxima de la base
Atacar a los invasores
Vida por debajo del 50%
> Si hay en un rango un punto de curacion que no esté en zona peligrosa: Huir a ese punto
> Si no: huir hacia la base
Una unidad enemiga entra en un rango:
> Si hay una unidad aliada en un cierto rango: Atacar al enemigo
> Si no: huir hacia la unidad aliada más cercana
Default: Avanzar hacia la base enemiga
< Cómo atacan >
- Modo agresivo:
Preferencia de ataque: Ranged > Scout > Artillery > Melee
Preferencia de situación: Atacarán a aquella unidad situada en un terreno donde maximicen el daño que provoquen. En caso de empate, a la más cercana.
- Modo defensivo:
Preferencia de ataque: A la más cercana
Preferencia de situación: Buscarán primero de todo posicionarse en el terreno beneficioso más cercano, y luego atacarán a la más cercana
- Modo berserker: (Ganan un 25% de fuerza, no huyen cuando les queda <20% HP)
Preferencia de ataque/situación: La que sea que esté más cerca de ellas (solo del equipo rival)
-- ARTILLERY--
Enemigo a la vista: Atacar al enemigo
Base enemiga desprotegida: Atacar base enemiga
Base siendo atacada: Mantenerse a una distancia máxima de la base
Atacar a los invasores
Vida por debajo del 40%
> Si hay en un rango un punto de curacion que no esté en zona peligrosa: Huir a ese punto
> Si no: huir hacia la base
Default: Avanzar hacia la base enemiga
< Cómo atacan >
- Modo agresivo:
Preferencia de ataque: Ranged > Scout > Melee > Artillery
Preferencia de situación: Atacarán situados en un terreno donde maximicen
el daño que provoquen. En caso de empate, a la más cercana.
- Modo defensivo:
Preferencia de ataque: A la más cercana
Preferencia de situación: Atacarán a la más cercana que no implique moverse a un terreno menos ventajoso
- Modo berserker: (Ganan un 25% de fuerza, no huyen cuando les queda <20% HP)
Preferencia de ataque/situación: La que sea que esté más cerca de ellas (solo del equipo rival)
Heurísticas de la Capa 1
-- Defender la base:
Gana puntos por:
- Alto numero de enemigos cerca de la base aliada
- En menor grado, por número de enemigos en territorio aliado
- Todavía en menor medida, por número de enemigos cerca de los waypoints
-- Defender terreno:
Gana puntos por:
- Numero de enemigos cerca de los waypoints (waypoints = pasos por el rio). El waypoint central se valora más.
- Fuerzas aliadas cercanas a los waypoints superiores a fuerzas enemigas cercanas a los waypoints. Debido al reducido tamaño de los puentes, las fuerzas enemigas a partir de un cierto valor empiezan a contar de forma reducida.
-- Atacar terreno:
Gana puntos por:
- Numero de enemigos en terreno enemigo. Cuanto más alejados de la base enemiga estén, menos cuentan.
- Fuerzas aliadas cerca de los waypoints o en la mitad enemiga del mapa superiores a fuerzas enemigas en la mitad enemiga del mapa (excluyendo la base)
-- Atacar base:
Gana puntos por:
- Fuerzas aliadas en territorio enemigo superiores a fuerzas enemigas cerca de base enemiga
- En menor medida, fuerzas aliadas vivas frente a fuerzas enemigas vivas
- Fuerzas aliadas en territorio enemigo superiores a fuerzas enemigas en territorio aliado
Notas:
Defender la base: En caso de ataques pequeños, el objetivo es simplemente retener a las fuerzas enemigas, o superarles por poco, para que nuestras fuerzas restantes puedan ganar objetivos en el resto del mapa. Sin embargo, cuando la cantidad de enemigos es mayor, interesa defender con todas las unidades posibles, para poder eliminar cómodamente a un gran porcentaje de las fuerzas rivales, y atacar libremente con todas las fuerzas aliadas.
Defender terreno:
Cuando hay un numero importante de enemigos en los waypoints se tiene que empezar a considerar limpiarlos, para evitar que se convierta en un problema (unidades en territorio aliado, lo que equivaldria a un peligro para la base).
Como nota, no todos los waypoints cuentan lo mismo: Un mayor número de unidades en el waypoint central es más relevante que si están en los waypoints laterales
La importancia aquí radica a que el equipo que esté pasando por los waypoints se encuentra en desventaja de posicionamiento, dado que en un espacio muy pequeño no hay sitio para que muchas unidades ataquen a la vez.
Por tanto, cuando hay enemigos acercándose a los waypoints, hay que empezar a considerar atacarlas para aprovechar esa ventaja de terreno. A la hora, por tanto, de contar las fuerzas aliadas y de compararlas con las enemigas, hay que tener en cuenta que las fuerzas enemigas no podrán atacar todas simultaneamente (es decir, a partir de una cierta cantidad de fuerzas enemigas, a la hora de valorar el resto de fuerzas enemigas, se debería aplicar un modificador, para representar que, efectivamente hay más unidades, pero no son tan efectivas como en una situación normal).
Atacar terreno:
Si el numero de unidades en territorio enemigo es grande, es buena idea pensar en eliminarlas para poder liberar el camino a la base enemiga. Hay que considerar que son más importantes los enemigos en la parte central del lado enemigo que los laterales, aunque la diferencia en este caso es mucho menor que en el caso de los waypoints (enemigos en los laterales de su lado del mapa no tardarían mucho en llegar a su base en caso de ataque de las fuerzas aliadas)
Atacar base:
Si las fuerzas aliadas relativamente cerca de la base enemiga superan a las fuerzas enemigas cerca de dicha base, tenemos muchas papeletas para poder lanzar un ataque.
También habría que tener en cuenta el total de unidades vivas de ambas facciones, para poder considerar la posibilidad de unión de refuerzos al combate.
Además, si el enemigo está lanzando un ataque simultáneo a la base aliada, habría que comparar la ventaja que tienen los aliados en el ataque frente a la que tienen los enemigos en su ataque. En caso de que los enemigos tengan más ventaja militar en su ataque, la probabilidad de que se realice un ataque a la base enemiga se reduciría en gran cantidad.
Patrullas
OPCIÓN 1
- Las patrullas son dos unidades que van aparte del sistema. Patrullan alrededor de la base, en una especie de Defender Zona que implica movimiento recorriendo una ruta.
1A: Esas dos unidades son únicas, y en caso de morir nunca vuelven a reaparecer
2A: Esas dos unidades reaparecen como unidades normales. Habría que decidir si reaparecen además de las unidades normales, o si las próximas dos unidades normales en reaparecer serán patrullas, o cómo gestionarlo.
OPCIÓN 2:
- No hay "patrullas" como tal. Todas las unidades en la estrategia de Defender Base tendrán el comportamiento de una patrulla (Defender Zona y seguir una ruta). Forzaremos que siempre haya mínimo dos unidades asignadas a Defender Base.
Contras: Quizá esto implique que, si las patrullas mueren, dado que mínimo debe haber dos unidades defendiendo la base, en algún momento alguna estrategia vea que se le han "robado" asignaturas en algún momento clave, para ponerse a defender (cosa que es bastante difícil que ocurra, pero no imposible).
Implementar "Defender la base"
Aquellas unidades que no están en el radio de la base y su tarea actual no sea GoTo
-> GoToPasivo con camino seguro a la base. Margen de llegada alto
#-> Defender Zona
Aquellas unidades que están en la base y su tarea actual no sea ni Defender Zona ni GoTO
-> Defender Zona
Heurísticas para decidir la generación de unidades
Lo primero es intentar respetar la distribución ideal de unidades:
- 8 Melee
- 5 Ranged
- 4 Scout
- 3 Artillery
Por lo general siempre se intentará crear una unidad del tipo con menos representación (en % de actual/ideal). Por ejemplo si la distribución actual es 4M, 3R, 1S, 3A, se creará un Scout.
En situaciones concretas, la distribución ideal cambiará.
Por ejemplo, si el enemigo no tiene arqueros, sería una tontería estar creando Scouts, porque, aunque no solo funcionen contra Arqueros, los Melee cumplen mejor su función en general. O si estamos intentando limpiar un territorio, la Artillería no será tan útil, ya que el los territorios están llenos de Hierba y Bosque, y la artillería se mueve muy mal por esos terrenos.
Así que, cuando se den ciertas condiciones, quitaremos unidades de un tipo de esa distribución ideal, y se las daremos a otro. Es posible que eso provoque que las unidades ideales de un tipo sean 0, o que las unidades actuales sean más que las ideales, pero eso no es ningún problema.
MODIFICACIONES A LA DISTRIBUCIÓN IDEAL:
- RANGED:
Si, una vez normalizada, las prioridades de ATKBASE o DEFBASE no son la mayor, -2A, +2R (La artillería es más útil cuando no se va a mover en terreno abierto, para poder atacar desde una posición segura, y debido a que fuera de los caminos se mueve bastante mal)
- SCOUT:
Por cada Ranged que el rival tenga por debajo de 5: +1M, -1S
Por cada Ranged que el rival tenga por encima de 5: +1S, -1M
- ARTILLERY:
Si el rival tiene 5 o más Scouts: -2R, +2A (Si el rival tiene muchos scouts es peligroso tener rangeds)
Arquitectura Steerings Basicos, Delegados y Compuestos.
El desarrollo de Steerings Basicos, Delegados y Compuestos tiene ciertas restricciones que no son fácilmente compatibles con la forma en la que funciona Unity. Hay que encontrar una solución que permita crear steerings de tal forma que aquellos steerings que se basen en otros sub-steerings puedan llamarlos.
Las soluciones pasan a grandes rasgos por usar:
- Métodos estáticos
- Herencia
A su vez cada una de estas opciones presenta variaciones con sus peculiaridades.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.