¡Hola, Comunidad Coded!

¡Si, lo habéis leído bien! ¡Han llegado los bots de soporte para las partidas!

Ya, pero... ¿qué son los bots de soporte?

¡Gran pregunta! Seguid leyendo, y os lo vamos a explicar: qué son, qué hacen, ¡y cómo se les pueden enviar órdenes!

¡Vamos allá!


¿Qué es un bot?

Un bot es un personaje de CodedArena que ya está programado con código Python, y que tiene una serie de estrategias y comportamientos predefinidos.

Al final, no deja de ser como vuestros personajes, pero los ha programado el Equipo de CodedArena para vosotros.


¿Cuántos bots hay?

Para la 3ª Competición Preparatoria, hemos creado 4 bots:

  • Throm
  • Baeqor
  • Darkira
  • Thyale

¿Hay diferencias entre ellos?

No, sólo estéticas. Su programación es la misma.


¿Y para qué sirven?

En la 3ª Competición Preparatoria vuestro personaje irá acompañado por un bot aleatorio, el cual os ayudará en aquella tarea que le encomendéis de las que tiene programada.

En CodedArena Challenge Tournament, vuestro personaje irá acompañado de 2 bots aleatorios.


¿Qué estrategias tienen programadas?

Cada bot puede actuar de 4 maneras diferentes. Por defecto, los bots adoptan la estrategia Heal.

Melee

Ataca al adversario con menos vida hasta derrotarlo, y, en caso de no haber, al primero que seleccione de la lista mobs.

Los hechizos que utiliza el bot cuando se le pasa la orden melee son:

  • Speed
  • Rend
  • Swipe
  • Melee

Heal

Cura y da buffos de protección a tu personaje cuando se te acaben.

Los hechizos que utiliza el bot cuando se le pasa la orden heal son:

  • Meditate
  • Heal
  • Shield
  • Speed

Debuff

Ataca al primer adversario que vea más cercano, y empieza a invocar hechizos que aplican debuffs.

Los hechizos que utiliza el bot cuando se le pasa la orden debuff son:

  • Stone skin
  • Taunt
  • Tornado
  • Slam
  • Melee

Ranged

Ataca al adversario que tiene más cerca a distancia de Wand, y lanza los sigueintes hechizos:

  • Meditate
  • Focus
  • Lightning
  • Corruption
  • Wand

¿Cómo puedo probarlos?

Cuando programéis vuestro personaje en una competición, y hagáis simulaciones, se os asignará un bot aleatorio.


¿Cómo puedo cambiarles la estrategia?

Para darles un comportamiento o estrategia, vuestro personaje debe enviarle un mensaje mediante la función send_message().

El parámetro de esta función es una cadena que tiene la siguiente forma:

nombre del bot**#**nombre de la estrategia

Por ejemplo, si a vuestro personaje se le ha asignado el bot Darkira, con

self.send_message("darkira#melee")

le estaría indicando al bot que adopte una estrategia melee.

De la misma forma con el siguiente código

self.send_message("darkira#heal")

le indicaría que viniese a curar a vuestro personaje.


¿Cuántas veces puedo cambiar de estrategia?

¡Todas las veces que quieras!

De hecho, dependiendo del transcurso de la partida, será interesante que le ordenes al bot (o a los bots) que adopten estrategias diferentes.

Por ejemplo, si tu personaje va ganando, y no tiene muy baja la vida, ordenarle al bot que adopte una estrategia melee o ranged puede ser lo adecuado. Pero si en un momento determinado, tu personaje pierde mucha vida, puedes ordenarle al bot que adopte una estrategia heal y ayude acurar.


Un ejemplo

El siguiente código muestra un ejemplo de cambio de estrategias:

ally = None
target = None

for mob in mobs:
    if mob.team_id == self.team_id and mob.name != self.name:
        ally = mob
    elif mob.team_id != self.team_id:
        target = mob

dir_x = "none"
dir_y = "none"

if self.x > target.x:
    dir_x = "left"
else:
    dir_x = "right"

if self.y > target.y:
    dir_y = "up"
else:
    dir_y = "down"
    
if self.distance_to(target) > 400:
    return ["move", dir_x, dir_y]

if target.health > target.max_health * 0.75:
    self.memory["current_ally_command"] = "ranged"
    self.send_message("darkira#ranged")
elif target.health > target.max_health * 0.5 and target.health < target.max_health * 0.75:
    self.memory["current_ally_command"] = "debuff"
    self.send_message("darkira#debuff")
else:
    self.memory["current_ally_command"] = "melee"
    self.send_message("darkira#melee")

return ally.name + " " + self.memory["current_ally_command"] + " attack!"

Podeis ver el resultado a continuación.

Comentando el código

Vamos a ver qué hace el código anterior, bloque a bloque.

Buscar a nuestro bot aliado

En primer lugar, algo de código para buscar al mismo tiempo quién es nuestro aliado, y quién es nuestro adversario:

ally = None
target = None

for mob in mobs:
    if mob.team_id == self.team_id and mob.name != self.name:
        ally = mob
    elif mob.team_id != self.team_id:
        target = mob

Como podéis observar, hemos utilizado la variable team_id que en las competiciones tienen los personajes para determinar quién es está en el equipo de nuestro personaje, y quién no.

Aproximarnos al adversario

No es 100% obligatorio, pero en este caso hemos aproximado nuestro personaje al Dummy para que se pueda ver bien lo que dice:

dir_x = "none"
dir_y = "none"

if self.x > target.x:
    dir_x = "left"
else:
    dir_x = "right"

if self.y > target.y:
    dir_y = "up"
else:
    dir_y = "down"
    
if self.distance_to(target) > 400:
    return ["move", dir_x, dir_y]

Hemos decidido poner el personaje a distancia 400, pero es un número aleatorio, de ejemplo. 450 ó 300 hubiese dado el mismo resultado para el objetivo que buscábamos: ver lo que dice nuestro personaje.

Cambiar de estrategia

El siguiente bloque de código hace que nuestro personaje, dependiendo de la vida del Dummy cambie de estrategia:

if target.health > target.max_health * 0.75:
    self.memory["current_ally_command"] = "ranged"
    self.send_message("darkira#ranged")
elif target.health > target.max_health * 0.5 and target.health < target.max_health * 0.75:
    self.memory["current_ally_command"] = "debuff"
    self.send_message("darkira#debuff")
else:
    self.memory["current_ally_command"] = "melee"
    self.send_message("darkira#melee")
  • Si el Dummy está por encima del 75% de la vida, le ordenamos al bot que adopte una estrategia Ranged, y nos guardamos esta estrategia en memoria.
  • Si el Dummy está entre el 50% y 75% de la vida, estrategia Debuff.
  • Si en cambio baja del 50%, estrategia Melee.

Mostrar una cadena con la orden que hemos dado

Por último, hacemos que nuestro personaje muestre una cadena con la orden y el nombre del bot que nos está ayudando:

return ally.name + " " + self.memory["current_ally_command"] + " attack!"

¡Precauciones!

Hay que tomar una serie de precauciones a la hora de programar el código de nuestro personaje cuando cooperamos con un bot.

Busca bien quién es aliado, y quién adversario

Analizad con cuidado la lista mobs quién es aliado, y quién adversario. Al final, no hay nada más desastroso que seleccionar a un aliado como adversario, y descargar todos nuestro hechizos sobre él.

¿Y si el bot es derrotado?

En efecto, el bot puede ser derrotado. Y en ese momento ya no estará presente como elemento en la lista mobs.

Y aquí pueden empezar los problemas. Miremos parte del código anterior:

ally = None
target = None

for mob in mobs:
    if mob.team_id == self.team_id and mob.name != self.name:
        ally = mob
    elif mob.team_id != self.team_id:
        target = mob

return ally.name + " " + self.memory["current_ally_command"] + " attack!"

Como el bot ya no está en la lista mobs, ¿qué valor tendrá la variable ally? En efecto, None.

Y si ally = None, ¿qué pasará en la línea return ally.name..... que equivaldría a return None.name....? En efecto, que Python nos devolverá un error:

Con este error Python os está diciendo que Noneno tiene una variable/propiedad/atributo (attribute) name.

En efecto, name es una variable de los personajes de CodedArena, por ejemplo de self o de cualquier elemento de la lista mobs, pero None no tiene esa variable propia del videojuego.

¿Qué está haciendo mi bot?

Una vez tu personaje le mande una orden al bot, este cambiará de estrategia. Y no hay forma de saber la estrategia adoptada por el bot posteriormente.

Es decir, es responsabilidad del código de tu personaje guardarse la estrategia que el bot está siguiendo, por si en algún momento quieres cambiar de estrategia en función de la estrategia anterior.


¿Y ahora, qué toca?

Pues toca pensar en las miles de posibilidades y estrategias que nos ofrece tener un aliado al que poder mandarle órdenes.

¡Adelante, y nos vemos en las competiciones con los bots!