gamerevar / proyecto-comunitario-1-gd

Proyecto comunitario #1 (Godot)
MIT License
6 stars 1 forks source link

Controlador de Turnos #100

Open azagaya opened 3 years ago

azagaya commented 3 years ago

Se requiere un nodo con un script que controle los turnos. Siempre comienza el jugador. Se selecciona la primer unidad automáticamente. Cada vez que se realice una acción, el controlador debería checkear si quedan actions points en alguna unidad, y seleccionarla automáticamente. Una vez que las unidades no tienen action points, se cambia el turno al enemigo, y la IA comienza a hacer acciones. El controlador devuelve el turno al jugador cuando la IA se queda sin acciones.

Podemos usar grupos "Soldiers" y "Enemies" para las unidades aliadas y enemigas respectivamente. Luego, se puede usar get_tree.get_nodes_in_group() al comienzo del nivel para tener una lista de todas las unidades. Si alguna unidad muere, se la quita de la lista. Luego de cada accion, el controlador recorre la lista y observa los action points restantes.

Hay que discutir los detalles de implementación, y si las unidades enemigas se mueven cuando estan fuera de vista, ya que esto podría hacer que el jugador este esperando que se realicen las acciones pero no ver que esta pasando.

joaquin-montesdeoca commented 3 years ago

Me lo asigno para hacer, si no hay problema.

LeandroCuello commented 3 years ago

Yo pensaba que talvez las IA se puedan activar y desactivar, entonces cuando una IA está muy lejos o en una habitación diferente no realize ninguna acción. Así el controlador de turnos no se encarga de esto.

azagaya commented 3 years ago

Yo pensaba que talvez las IA se puedan activar y desactivar, entonces cuando una IA está muy lejos o en una habitación diferente no realize ninguna acción. Así el controlador de turnos no se encarga de esto.

Con que se quiten de la listas de enemigos, ya no harían nada, porque el controlador nunca les daría el turno, no?

LeandroCuello commented 3 years ago

Yo pensaba que talvez las IA se puedan activar y desactivar, entonces cuando una IA está muy lejos o en una habitación diferente no realize ninguna acción. Así el controlador de turnos no se encarga de esto.

Con que se quiten de la listas de enemigos, ya no harían nada, porque el controlador nunca les daría el turno, no?

Si, pero no sería más engorroso hacer que la IA se meta y salga de la lista? Además si usamos la lista y la partida se gana matando a todos lo enemigos sería más fácil si sabemos que están todos ahí.

azagaya commented 3 years ago

Si, es verdad eso. Entonces todos los enemigos están en la lista. Cada enemigo debería desactivarse si esta lejos de los jugadores entonces... y si esta fuera del rango de vista? deberían moverse? porque el jugador no va a ver que esta pasando pero va a tener que esperar

joaquin-montesdeoca commented 3 years ago

Me parece un poco fuera del scope de lo que es el Controlador de Turnos la discusión, aunque es interesante.

y si esta fuera del rango de vista? deberían moverse?

No me acuerdo mucho el XCOM, pero si mal no recuerdo, los enemigos no visibles pueden moverse en el mapa, sin necesidad de que el jugador los haya visto (si mal no recuerdo, al final de un turno, la cámara enfoca una zona no visible y se escuchan "ruidos de alien", dando a entender que el enemigo se está moviendo).

Creo que el controlador simplemente debería elegir a que unidad le toca el siguiente turno entre los "Soldiers" y, cuando pasa a los "Enemies", rotar por todos ellos también.

Sin embargo, es el mismo Enemy el que decide si hacer algo o no, o sea el Enemy se activa o desactiva solo.

Si no notó la presencia de los "Soldiers" skippea el turno. Si la notó, se activa solo y empieza a ejecutar acciones.

Dos formas de notar la presencia de los soldiers podría ser:

Cada enemigo debería desactivarse si esta lejos de los jugadores.

No sé si conceptualmente deberíamos hacer eso. O sea, depende mucho del tipo de enemigo que quieras crear, pero sería coherente que un enemigo trate de perseguirte si te alejás de él. También se pueden hacer enemigos que se escondan si tienen poca energía o son muy débiles.

Pero como dije, eso depende más del enemigo que quieras diseñar. Luego, creo que la idea es que, una vez hayas hecho contacto con el enemigo, que ellos dejen de "descansar", se pongan en acción para matarte y que tengas que actuar tan rápido como sea posible para eliminarlos.

jh62 commented 3 years ago

Creo que esta discusion es más para game design. Todavía faltan discutir algunos grises de la dinámica de un turno. Si te parece apropiado esto @azagaya, cambiala a game design o abrila como discusión.

Dejo como referencia inicial una entrada en Codecks

Ya que estámos dejo una cuestión de game design: Las AP's de cada unidad no hace falta gastarlas si o si cuando ésta es seleccionada. Uno debería poder gastar 1 AP, seleccionar otra unidad y gastar sus AP's y volver a la original o elegir otra. Esto hace que el orden en que las unidades finalizan su turno no sea siempre el mismo. En tal caso, la próxima unidad que empieza el turno de cero es siempre la misma de la lista o esta lista se va reordenando poniendo la unidad que termino última como última de la cola?

doctorhibert commented 3 years ago

Sí, todos los enemigos tienen un turno siempre, si queremos "desactivar" enemigos lo único que tenemos que hacer es skippear el turno cuando les toque. Creo que sería bueno hacer una mezcla de enemigos estáticos (que skippean o usan overwatch) y enemigos que patrullen (que se muevan en su turno). Para la detección usemos solo algo visual para esta primer demo, pero sí me parece una excelente idea usar la detección visual como en xcom más adelante.