{"action":"closed","issue":{"url":"https://api.github.com/repos/villagra-abp/code/issues/35","repository_url":"https://api.github.com/repos/villagra-abp/code","labels_url":"https://api.github.com/repos/villagra-abp/code/issues/35/labels{/name}","comments_url":"https://api.github.com/repos/villagra-abp/code/issues/35/comments","events_url":"https://api.github.com/repos/villagra-abp/code/issues/35/events","html_url":"https://github.com/villagra-abp/code/issues/35","id":212272805,"node_id":"MDU6SXNzdWUyMTIyNzI4MDU=","number":35,"title":"Entregables [V1] 6/11 =54.5%","user":{"login":"hec17x","id":14309266,"node_id":"MDQ6VXNlcjE0MzA5MjY2","avatar_url":"https://avatars1.githubusercontent.com/u/14309266?v=4","gravatar_id":"","url":"https://api.github.com/users/hec17x","html_url":"https://github.com/hec17x","followers_url":"https://api.github.com/users/hec17x/followers","following_url":"https://api.github.com/users/hec17x/following{/other_user}","gists_url":"https://api.github.com/users/hec17x/gists{/gist_id}","starred_url":"https://api.github.com/users/hec17x/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hec17x/subscriptions","organizations_url":"https://api.github.com/users/hec17x/orgs","repos_url":"https://api.github.com/users/hec17x/repos","events_url":"https://api.github.com/users/hec17x/events{/privacy}","received_events_url":"https://api.github.com/users/hec17x/received_events","type":"User","site_admin":false},"labels":[{"id":539206586,"node_id":"MDU6TGFiZWw1MzkyMDY1ODY=","url":"https://api.github.com/repos/villagra-abp/code/labels/Entrega","name":"Entrega","color":"b60205","default":false},{"id":539206706,"node_id":"MDU6TGFiZWw1MzkyMDY3MDY=","url":"https://api.github.com/repos/villagra-abp/code/labels/[V1]","name":"[V1]","color":"006b75","default":false}],"state":"closed","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2017-03-06T22:39:41Z","updated_at":"2018-12-04T07:49:31Z","closed_at":"2018-12-04T07:49:31Z","author_association":"CONTRIBUTOR","body":"## GESTIÓN DE ESTADOS DE LA IA CON MÁQUINA DE ESTADOS **COMPLETADO 50%**\r\n### MAQUINA DE ESTADOS\r\n#### FSM\r\n##### GUIA DE IMPLEMENTACIÓN\r\n- [x] Creación de una maquina de estados finitas.\r\n- [ ] Gestionar los cambios de estados dependiendo de lo que vea el enemigo o su árbol de decisiones.\r\n##### TRABAJO REALIZADO\r\nSe ha creado una maquina de estados finita, alojada en el proyecto en MaquinaEstados -> FSM, donde encontramos dos clases MaquinaEstados y Estados.\r\n- La clase Estados contiene toda la información relativa a los Estados.\r\n- La clase MaquinaEstados gestiona una lista de Estados, donde se alojan los estados activos y los inactivos.\r\n↓\r\n\r\n## LÓGICA DIFUSA **COMPLETADO 100%**\r\n\r\nSe ha empezado a definir la lógica difusa que usará los enemigos a la hora de tomar decisiones. Se van a usar como parámetros difusos la vida del enemigo y la distancia entre el jugador y el enemigo para la toma de decisiones. En un futuro se añadirán la moral del enemigo que estará ligado a su vida, la munición que tiene disponible, entre otros más parámetros.\r\n\r\nEstán definidas las relaciones de valores de los parámetros que recibe y su traducción a parámetros difusos, aunque quedan por definir las reglas que tiene que seguir la IA y, por consecuente, cambiar los estados de la IA para que ejecute la parte correspondiente.\r\n\r\nLos valores que se han elegido han sido fusificados de maneras distintas. La vida ha sido fusificado con una gráfica de 4 triángulos dónde el primero va del valor, en porcentaje de la vida máxima del enemigo, 10% hasta el 30%, representando el estado de _Huir_; el segundo va desde 25% hasta 50% siendo el estado _Baja_; el tercero corresponde a _Media_ representado desde 45% hasta 85%; y por último el estado _Alta_ que se situa desde 75% hasta 100%.\r\n\r\nAl igual que la vida, la distanticia también está representada como la distancia máxima que recibe cuando ve al jugador. Los valores de la gráfica están representados en porcentajes: el estado _Cerca_ corresponde al 0% hasta el 35%; estado _Media_ desde el 15% hasta el 80%; y por último el estado _Lejos_ representado desde el 70% hasta el 100%.\r\n\r\nUna vez estos valores han sido fusificados se decide cuál de todos esos estados se tiene que ejeuctar en el enemigo. Siguen está tabla:\r\n\r\n![imagen](https://cloud.githubusercontent.com/assets/16962423/24700409/60d8a72a-19f7-11e7-986d-2cc3bbf76587.png)\r\n\r\nLos cambios de estado se puede ver como cambia el enemigo de color para su gestión. Son parecidos a los colores de la tabla anterior.\r\n\r\nLos varlores de moral y cansancio se pasaran a la lógica difusa para ver si su estado es Alta, Media o Baja.\r\nDependiendo de estos valores se podrán realizar las distintas acciones del enemigo. Estás acciones están condiccionadas al valor de estos valores.\r\n\r\nMoral:\r\n\r\n- Cuanta menos moral tiene el enemigo, tienes más posibilidades de entrar en el estado escapar obviando a que distancia y la vida restante que tenga.\r\n\r\n- Cuando te quitan vida se reduce la moral un porcentaje equivalente al daño recibido.\r\n\r\nCansancio:\r\n\r\n- Cuanto más cansancio tengas, la velocidad se ve reducida hasta que llegas a un punto donde tienes que descansar. El enemigo se para en lugar donde se esté y descansa.\r\n\r\n- Cuando te bajan la vida, se te aumenta el cansancio proporcional al daño.\r\n\r\n- Cuando el cansancio llega a un punto límite, el enemigo tiene que descansar. Mientras descansas se recupera resistencia y regeneras vida hasta cierto punto. Cuando tu cansancio llega a 0 nunca recuperas el valor máximo de este.\r\n\r\n## SISTEMA DE TOMA DE DECISIONES CON BEHAVIOR TREES **COMPLETADO 20%**\r\n### GUIA DE IMPLEMENTACIÓN:\r\n#### Programación\r\n##### Acciones IA a implementar\r\n   -  Lógica Difusa.\r\n      - Moral. \r\n      - Cansancio.\r\n   - Sentidos.\r\n      - Visión cónica.\r\n      - Oído.\r\n   - Memoria\r\n\r\n##### Behavior tree\r\n   - [x] Árbol.\r\n     Se ha creado una clase Behavior Tree, donde a partir del root se recorren todos sus nodos.\r\n   - [ ] Selector.\r\n   - [ ] Secuencia.\r\n   - [ ] Condición.\r\n   - [ ] Acción.\r\n\r\n- Actualización:\r\nPor el momento se recorre todo el árbol como traza, para comprobar que todos los nodos se insertan bien y son dependientes de sus padres.\r\nFalta programar las contestaciones para poder programar los distintos tipos de nodos.\r\n\r\n- Diseño de arboles:\r\n   - [x] CRIA DE ALIEN.\r\n   - [x] BERSERKER.\r\n   - [ ] SOLDADO.\r\n   - [ ] JEFE.\r\n\r\n#### JUEGO\r\n#### CRIA ALIEN\r\n![BT_Cria](https://raw.githubusercontent.com/ABPMultimediaUA/code/master/DOCUMENTACION/IMAGENES%20ISSUES/CRIA.png?token=ANpXkrJSGHq0YlrwbDX38-OK30wr0SR1ks5Y6pTQwA%3D%3D)\r\n#### ALIEN BERSERKER\r\n![BT_Berserker](https://raw.githubusercontent.com/ABPMultimediaUA/code/master/DOCUMENTACION/IMAGENES%20ISSUES/BERSERKER.png?token=ANpXkg2WkAxa6c7xqTT9HARWo1C3eMYCks5Y6pjuwA%3D%3D)\r\n\r\n#### ALIEN SOLDADO\r\n#### ALIEN JEFE\r\n↓\r\n## SISTEMA DE CONTROL DE MOVIMIENTO CON STEERING BEHAVIOURS **COMPLETADO 100%**\r\n\r\nSe ha elaborado un sistema para dar naturalidad al movimiento de los enemigos, con el objetivo de que parezcan más humanos. Además, de evitar obstáculos que hay a su paso.\r\n\r\n- [x] Seek.\r\nSe mueve con una velocidad lineal hacia un punto.\r\n\r\n- [x] Arrive.\r\nCuando el enemigo esta llegando al objeto, se produce una deceleración y modifica su trayectoria dando la sensación de comportamiento humano.\r\n\r\n- [x] Align\r\nRota el objeto en función de la parte frontal del enemigo, para mirar en que dirección se esta moviendo.\r\n\r\n- [x] Path following.\r\nBusca el punto en el que se tiene que mover. Esta ligado al Seek.\r\n\r\n- [x] Face.\r\nBusca el punto al que tiene que rotar. Esta ligado al Align.\r\n\r\n- [x] Distance of the wall.\r\nLanza un rayo con el raycasting para saber si es una pared o no, con el objetivo de no chocar con ella y evitar esa colisión. Ligado al seguimiento del líder en Flocking.\r\n\r\n- [x] CollisionAvoidance.\r\nBusca dentro de su \"vecindario\" de enemigos y si se va a provocar una colisión con otro enemigo los enemigos modifican su trayectoria para no chocar.\r\n\r\n### SISTEMA DE CONTROL DE MOVIMIENTO CON STEERING\r\n\r\nSe ha elaborado un sistema para dar naturalidad al movimiento de los enemigos, con el objetivo de que parezcan más humanos. Además, de evitar obstáculos que hay a su paso.\r\n\r\n- Seek.\r\nSe mueve con una velocidad lineal hacia un punto.\r\n\r\n- Arrive.\r\nCuando el enemigo esta llegando al objeto, se produce una deceleración y modifica su trayectoria dando la sensación de comportamiento humano.\r\n\r\n- Align\r\nRota el objeto en función de la parte frontal del enemigo, para mirar en que dirección se esta moviendo.\r\n\r\n- Path following.\r\nBusca el punto en el que se tiene que mover. Esta ligado al Seek.\r\n\r\n- Face.\r\nBusca el punto al que tiene que rotar. Esta ligado al Align.\r\n\r\n-  Distance of the wall.\r\nLanza un rayo con el raycasting para saber si es una pared o no, con el objetivo de no chocar con ella y evitar esa colisión. Ligado al seguimiento del líder en Flocking.\r\n\r\n- CollisionAvoidance.\r\nBusca dentro de su \"vecindario\" de enemigos y si se va a provocar una colisión con otro enemigo los enemigos modifican su trayectoria para no chocar.\r\n\r\n\r\n↓\r\n## SISTEMA DE PERCEPCIÓN SENSORIAL **COMPLETADO 0%**\r\n\r\n- [x] Hacer que el enemigo tenga un campo de visión\r\n\r\n- [ ] Hacer un rango de escucha\r\n\r\n- [ ] Mejorar ese campo para que sea variable si colisiona contra una pared u otro objeto\r\n\r\n- [ ] Mejorar el rango de escucha para que varie dependiendo de donde se origine el ruido (si se crea detrás de una pared se oirá menos)\r\n\r\n### GUIA PARA HACER QUE LOS ENEMIGOS DISPAREN\r\n\r\n- [x] Modificar el constructor de bala y crear los métodos correspondientes, o modificarlos, para que el enemigo pueda disparar.\r\n\r\n- [x] Hacer que el enemigo tenga su update de balas como el personaje para que se actualicen con el bucle del juego. (cuando en escenario se llama al update de enemigo que también se llame a actualizar lista de balas)\r\n\r\n- [x] El enemigo tiene que tener guardado los elementos para construir la bala en su clase\r\n\r\n- [x] Modificar la entity2D de bala para que acepte los dos tipos de bala y cambiar el tema de los filtros para que no colisionen la bala de enemigo con el enemigo y si que colisione contra el jugador\r\n\r\n- [x] Añadir al enemigo un sensor que active la función de disparar cuando detecte al jugador.\r\n\r\n- [x] Método que te calcule hacia que dirección tiene que ir la bala.\r\n\r\n\r\n↓\r\n\r\n## SISTEMA DE WAYPOINTS PARA PATHFINDING CONTINUO - @DavidBrando **COMPLETADO 100%**\r\n\r\nSe ha emplementado un sistema de pathfinding para el enemigo que busca el nodo más cercano a su punto de aparición para luego ir buscando el siguiente punto más cercano. Por ahora no tiene una ruta definida y se va moviendo entre los distintos waypoints creados en el mapa. Los nodos que sigue el enemigo están pintados en el mapa.\r\n\r\nEl sistema de waypoints que sigue el enemigo usando el pathfinding sus posiciones están creadas en Unity para su exportación. Cuando se lee el fichero exportado de Unity se crean esos waypoints y se completa el grafo de pesos que va a seguir el pathfinding.\r\n\r\nLos enemigos tienen waypoints distintos porque hay distintas zonas de waypoints creadas en el mapa, así logramos que los enemigos sean más dependientes de su zona asignada y que patrullen esas zonas.\r\n\r\n- [x] Hay que hacer el calculo de los waypoints en el escenario para que solo se calcule una vez\r\n- [x] Hacer que el enemigo no se quede dando vueltas entre 2 waypoints durante mucho tiempo y hacer que cambie.\r\n- [x] Reducir el grafo de cada enemigo y que tenga el waypoint mas cercano que encuentre y 3 o 4 mas para formar su grafo.\r\n\r\n- [x] Hacer que el enemigo decida a que waypoint tiene que ir y se diriga hacia él. Una vez llegue, que cambie a otro destino distinto.\r\n\r\n↓\r\n## SISTEMA DE NAVMESHES PARA PATHFINDING CONTINUO - @hec17x **Completado 80%** _Alpha_\r\nEl sistema de Navmeshes ha sido creado mediante código, mediante el siguiente procedimiento.\r\n1. Se crea una matriz de enteros donde el tamaño de cada celda será arbitrario, es decir si el tamaño de cada celda es 5, en el mapa del juego correspondrá a 5x5 pixeles. Es decir si nuestro mapa mide 500x500, tendremos una matriz 100x100.\r\n2. Una vez creada la matriz, la rellenamos la matriz con 0, que significará que en ese hueco no existe ninguna pared y por lo tanto es transitable. Para las paredes usaremos el 1, es decir, no transitable. Para crear estas zonas no transitables, buscaremos el centro de las paredes y su tamaño, para así conseguir rellenar las casillas correspondientes a la pared.\r\n3. El siguiente paso nos hemos basado en algoritmo de \"Marching Squares\"*, para crear el contorno que rodea a las paredes.\r\n*https://en.wikipedia.org/wiki/Marching_squares\r\n4. Ya hallados los contornos, pasamos a expandir las esquinas vertical y horizontalmente, para así crear regiones de cuatro lados.\r\n5. Creadas las regiones, vamos tratar cada esquina como un nodo, donde hallaremos su matriz de adyacencia. Mediante esta matriz, generaremos las diagonales, que nos dividirá el cuadrado en dos, triangulando así el mapa.\r\n6. Por último, hallamos los puntos medios de estas diagonales y creamos los waypoints en esas posiciones.\r\n\r\n- FALTA:\r\n- [ ] Creación de Waypoints.\r\n- [ ] Testear navmesh con el nuevo mapa.\r\n\r\n↓\r\n##  FLOCKING: COMPORTAMIENTO GRUPAL EMERGENTE. **COMPLETADO 100%**\r\n\r\nEl comportamiento Flocking ha sido realizado mediante la creación de una clase que implementa este comportamiento. Esta clase consta de un vector donde se almacenan las entities2D que forman el vecindario y un booleano que indica si es, o no, un lider; para que las entidades tengan un punto a donde ir.\r\n\r\nEl Flocking consta de 3 tipos distintos de streering behaviors para formar este comportamiento:\r\n\r\n- ### La cohesión\r\n\r\nEste tipo de comportamiento funciona de tal manera de que, busca las entities que forman el vecindario para encontrar su centro de masas y dirigirse hacia él para poder juntarse con ese grupo. Luego retorna el vector unitario correspondiente a ese centro de masas.\r\n\r\n- ### Separación\r\n\r\nEste comportamiento funciona de tal manera de que, separa a dos entidades aplicando un vector unitario que las aleja en una dirreción proporcional a la que se están moviendo (aporximadamente 180 grados). Este vector se retorna para su posterior aplicación.\r\n\r\n- ### Alineación\r\n\r\nCon este comportamiento lo que queremos simular es que todas las entidades del vecindario sigan la misma dirección que tiene el lider, para que todas se muevan al unísono y de manera uniforme. El vector calculado es un vector unitario.\r\n\r\n\r\n\r\n\r\n\r\n↓\r\n## COMUNICACIÓN SIMULADA BÁSICA ENTRE NPCs (BLACKBOARD) **COMPLETADO 0%**\r\n↓\r\n## SISTEMA DE MEMORIA DE ESTADO Y REACCIÓN PARA NPCs **COMPLETADO 0%**\r\n\r\n- [ ] Hacer que el enemigo recuerde si las puertas estaban cerradas o abiertas.\r\n\r\n- [ ] Hacer que el enemigo recuerde puntos donde el jugador ha sido visto frecuentemente\r\n\r\n- [ ] Que el enemigo reaccione al ver al jugador y decida que hacer\r\n\r\n↓\r\n## EDITOR IN-GAME DE PARÁMETROS Y COMPORTAMIENTOS DE LA IA **COMPLETADO 0%**"}}
{"actor":{"display_login":"hec17x"}}