Example #1
0
        private Luchadores get_Objetivo_Mas_Cercano(PeleaHechizos hechizo)
        {
            if (hechizo.focus == HechizoFocus.ENCIMA)
            {
                return(pelea.jugador_luchador);
            }

            if (hechizo.focus == HechizoFocus.CELDA_VACIA)
            {
                return(null);
            }

            //TODO: esta vivo, evitar invocaciones, % vida, % resistencias
            bool filtro(Luchadores luchador)
            {
                if (cuenta.pelea_extension.configuracion.ignorar_invocaciones && luchador.es_invocacion)
                {
                    return(false);
                }

                return(luchador.porcentaje_vida <= hechizo.vida_objetivo);
            }

            return(hechizo.focus == HechizoFocus.ENEMIGO ? pelea.get_Enemigo_Mas_Cercano(filtro) : pelea.get_Obtener_Aliado_Mas_Cercano(filtro));
        }
Example #2
0
        private async Task <ResultadoLanzandoHechizo> lanzar_Hechizo_Celda_Vacia(PeleaHechizos hechizo_pelea)
        {
            if (pelea.get_Puede_Lanzar_hechizo(hechizo_pelea.id) != FallosLanzandoHechizo.NINGUNO)
            {
                return(ResultadoLanzandoHechizo.NO_LANZADO);
            }

            if (hechizo_pelea.focus == HechizoFocus.CELDA_VACIA && pelea.get_Cuerpo_A_Cuerpo_Enemigo().Count() == 4)
            {
                return(ResultadoLanzandoHechizo.NO_LANZADO);
            }

            Hechizo      hechizo       = cuenta.juego.personaje.get_Hechizo(hechizo_pelea.id);
            HechizoStats hechizo_stats = hechizo.get_Stats();

            List <short> rangos_disponibles = pelea.get_Rango_Hechizo(pelea.jugador_luchador.celda, hechizo_stats, mapa);

            foreach (short rango in rangos_disponibles)
            {
                if (pelea.get_Puede_Lanzar_hechizo(hechizo_pelea.id, pelea.jugador_luchador.celda, mapa.get_Celda_Id(rango), mapa) == FallosLanzandoHechizo.NINGUNO)
                {
                    if (hechizo_pelea.metodo_lanzamiento == MetodoLanzamiento.CAC || hechizo_pelea.metodo_lanzamiento == MetodoLanzamiento.AMBOS && mapa.get_Celda_Id(rango).get_Distancia(pelea.jugador_luchador.celda) != 1)
                    {
                        continue;
                    }

                    await pelea.get_Lanzar_Hechizo(hechizo_pelea.id, rango);

                    return(ResultadoLanzandoHechizo.LANZADO);
                }
            }

            return(ResultadoLanzandoHechizo.NO_LANZADO);
        }
Example #3
0
        private async Task <ResultadoLanzandoHechizo> get_Lanzar_Hechizo_Simple(PeleaHechizos hechizo)
        {
            if (pelea.get_Puede_Lanzar_hechizo(hechizo.id) != FallosLanzandoHechizo.NINGUNO)
            {
                return(ResultadoLanzandoHechizo.NO_LANZADO);
            }

            Luchadores enemigo = get_Objetivo_Mas_Cercano(hechizo);

            if (enemigo != null)
            {
                FallosLanzandoHechizo resultado = pelea.get_Puede_Lanzar_hechizo(hechizo.id, pelea.jugador_luchador.celda, enemigo.celda, mapa);

                if (resultado == FallosLanzandoHechizo.NINGUNO)
                {
                    await pelea.get_Lanzar_Hechizo(hechizo.id, enemigo.celda.id);

                    return(ResultadoLanzandoHechizo.LANZADO);
                }

                if (resultado == FallosLanzandoHechizo.NO_ESTA_EN_RANGO)
                {
                    return(await get_Mover_Lanzar_hechizo_Simple(hechizo, enemigo));
                }
            }
            else if (hechizo.focus == HechizoFocus.CELDA_VACIA)
            {
                return(await lanzar_Hechizo_Celda_Vacia(hechizo));
            }

            return(ResultadoLanzandoHechizo.NO_LANZADO);
        }
Example #4
0
        private async Task get_Procesar_hechizo()
        {
            if (cuenta?.esta_Luchando() == false || configuracion == null)
            {
                return;
            }

            if (hechizo_index >= hechizos.Count)
            {
                await antes_Fin_Turno();

                return;
            }

            PeleaHechizos hechizo_actual = hechizos[hechizo_index];

            if (hechizo_actual.lanzamientos_restantes == 0)
            {
                await get_Procesar_Siguiente_Hechizo(hechizo_actual, true);

                return;
            }

            if (!(turno == 1 || hechizo_actual.turno_lanzado == 0 || turno == (hechizo_actual.turno_lanzado + 1)))
            {
                await get_Procesar_Siguiente_Hechizo(hechizo_actual);

                return;
            }

            ResultadoLanzandoHechizo resultado = await manejador_hechizos.manejador_Hechizos(hechizo_actual);

            switch (resultado)
            {
            case ResultadoLanzandoHechizo.NO_LANZADO:
                await get_Procesar_Siguiente_Hechizo(hechizo_actual);

                break;

            case ResultadoLanzandoHechizo.LANZADO:
                hechizo_lanzado = true;
                hechizo_actual.lanzamientos_restantes--;
                esperando_sequencia = true;
                break;

            case ResultadoLanzandoHechizo.MOVIDO:
                esperando_sequencia = true;
                break;
            }
        }
Example #5
0
        private void button_bajar_hechizo_Click(object sender, EventArgs e)
        {
            if (listView_hechizos_pelea.FocusedItem == null || listView_hechizos_pelea.FocusedItem.Index == listView_hechizos_pelea.Items.Count - 1)
            {
                return;
            }

            ObservableCollection <PeleaHechizos> hechizos = cuenta.pelea_extension.configuracion.hechizos;
            PeleaHechizos temporal = hechizos[listView_hechizos_pelea.FocusedItem.Index + 1];

            hechizos[listView_hechizos_pelea.FocusedItem.Index + 1] = hechizos[listView_hechizos_pelea.FocusedItem.Index];
            hechizos[listView_hechizos_pelea.FocusedItem.Index]     = temporal;
            cuenta.pelea_extension.configuracion.guardar();
            refrescar_Lista_Hechizos();
        }
Example #6
0
        private bool get_Distancia_Buena(PeleaHechizos hechizo)
        {
            if (hechizo.distancia_minima == 0)
            {
                return(true);
            }

            Luchadores enemigo_cercano = pelea.get_Enemigo_Mas_Cercano();

            if (enemigo_cercano == null)
            {
                return(false);
            }

            return(pelea.jugador_luchador.celda.get_Distancia(enemigo_cercano.celda) >= hechizo.distancia_minima);
        }
Example #7
0
        private NodoRango get_Nodo_Rango(Celda celda, MovimientoNodo node, PeleaHechizos hechizo_pelea, HechizoStats hechizo_stats)
        {
            Dictionary <short, byte> enemigos_golpeados = new Dictionary <short, byte>();
            List <short>             rango = pelea.get_Rango_Hechizo(celda, hechizo_stats, mapa);

            for (int i = 0; i < rango.Count; i++)
            {
                byte tec = get_Total_Enemigos_Atacados(celda, mapa.get_Celda_Id(rango[i]), hechizo_pelea, hechizo_stats);
                if (tec > 0)
                {
                    enemigos_golpeados.Add(rango[i], tec);
                }
            }

            return(new NodoRango(celda, enemigos_golpeados, node));
        }
Example #8
0
        private async Task get_Procesar_Siguiente_Hechizo(PeleaHechizos hechizo_actual, bool actualizar_turno = false)
        {
            if (cuenta?.esta_Luchando() == false)
            {
                return;
            }

            hechizo_actual.lanzamientos_restantes = hechizo_actual.lanzamientos_x_turno;
            hechizo_index++;

            if (actualizar_turno)
            {
                hechizo_actual.turno_lanzado = turno;
            }

            await get_Procesar_hechizo();
        }
Example #9
0
        public async Task <ResultadoLanzandoHechizo> manejador_Hechizos(PeleaHechizos hechizo)
        {
            if (hechizo_para_lanzar != -1 && hechizo_para_lanzar == hechizo.id)
            {
                if (GlobalConf.mostrar_mensajes_debug)
                {
                    cuenta.logger.log_informacion("DEBUG", $"Se ha lanzado el hechizo {hechizo.nombre} atacando a {enemigos_tocados} enemigos en la celda {celda_objetivo}");
                }

                await pelea.get_Lanzar_Hechizo(hechizo.id, celda_objetivo);

                hechizo_para_lanzar = -1;
                celda_objetivo      = -1;
                enemigos_tocados    = 0;

                return(ResultadoLanzandoHechizo.LANZADO);
            }

            if (!get_Distancia_Buena(hechizo))
            {
                return(ResultadoLanzandoHechizo.NO_LANZADO);
            }

            if (hechizo.necesita_piedra)//Para capturar
            {
                ObjetosInventario arma = cuenta.juego.personaje.inventario.get_Objeto_en_Posicion(InventarioPosiciones.ARMA);
                if (arma != null && arma.id_modelo != 83)
                {
                    return(await get_Lanzar_Hechizo_Simple(hechizo));
                }
                else
                {
                    return(ResultadoLanzandoHechizo.NO_LANZADO);
                }
            }

            if (hechizo.focus == HechizoFocus.CELDA_VACIA)
            {
                return(await lanzar_Hechizo_Celda_Vacia(hechizo));
            }

            if (hechizo.metodo_lanzamiento == MetodoLanzamiento.AMBOS && !hechizo.es_aoe)
            {
                return(await get_Lanzar_Hechizo_Simple(hechizo));
            }

            if (hechizo.metodo_lanzamiento == MetodoLanzamiento.ALEJADO && !hechizo.es_aoe && !pelea.esta_Cuerpo_A_Cuerpo_Con_Enemigo())
            {
                return(await get_Lanzar_Hechizo_Simple(hechizo));
            }

            if (hechizo.metodo_lanzamiento == MetodoLanzamiento.CAC && !hechizo.es_aoe && pelea.esta_Cuerpo_A_Cuerpo_Con_Enemigo())
            {
                return(await get_Lanzar_Hechizo_Simple(hechizo));
            }

            if (hechizo.metodo_lanzamiento == MetodoLanzamiento.CAC && !hechizo.es_aoe && !pelea.esta_Cuerpo_A_Cuerpo_Con_Enemigo())
            {
                return(await get_Mover_Lanzar_hechizo_Simple(hechizo, get_Objetivo_Mas_Cercano(hechizo)));
            }

            if (hechizo.es_aoe)
            {
                if (pelea.total_enemigos_vivos > 1)
                {
                    return(await lanzar_Hechizo_AOE(hechizo));
                }
                else
                {
                    return(await get_Lanzar_Hechizo_Simple(hechizo));
                }
            }

            return(ResultadoLanzandoHechizo.NO_LANZADO);
        }
Example #10
0
        private byte get_Total_Enemigos_Atacados(Celda celda_actual, Celda celda_objetivo, PeleaHechizos hechizo_pelea, HechizoStats hechizo_stats)
        {
            byte         n    = 0;
            List <Celda> zona = pelea.get_Zona_Hechizo(celda_actual, celda_objetivo, hechizo_stats, mapa);

            if (zona != null)
            {
                foreach (Celda celda in zona)
                {
                    if (hechizo_pelea.auto_golpearse && celda.id == celda_actual.id)
                    {
                        return(0);
                    }

                    if (hechizo_pelea.golpear_aliados)
                    {
                        foreach (Luchadores aliado in pelea.get_Aliados)
                        {
                            if (aliado.celda.id == celda.id)
                            {
                                return(0);
                            }
                        }
                    }

                    foreach (Luchadores enemigo in pelea.get_Enemigos)
                    {
                        if (enemigo.celda.id == celda.id)
                        {
                            n++;
                        }
                    }
                }
            }

            return(n);
        }
Example #11
0
        private async Task <ResultadoLanzandoHechizo> lanzar_Hechizo_AOE(PeleaHechizos hechizo_pelea)
        {
            if (hechizo_pelea.focus == HechizoFocus.ALIADO || hechizo_pelea.focus == HechizoFocus.CELDA_VACIA)
            {
                return(ResultadoLanzandoHechizo.NO_LANZADO);
            }

            if (pelea.get_Puede_Lanzar_hechizo(hechizo_pelea.id) != FallosLanzandoHechizo.NINGUNO)
            {
                return(ResultadoLanzandoHechizo.NO_LANZADO);
            }

            Hechizo          hechizo       = cuenta.juego.personaje.get_Hechizo(hechizo_pelea.id);
            HechizoStats     hechizo_stats = hechizo.get_Stats();
            List <NodoRango> entradas      = new List <NodoRango>();
            NodoRango        entrada;

            //Celda actual del jugador
            entrada = get_Nodo_Rango(pelea.jugador_luchador.celda, null, hechizo_pelea, hechizo_stats);
            if (entrada.enemigos_atacos_en_celda.Count > 0)
            {
                entradas.Add(entrada);
            }

            foreach (KeyValuePair <short, MovimientoNodo> kvp in PeleasPathfinder.get_Celdas_Accesibles(pelea, mapa, pelea.jugador_luchador.celda))
            {
                if (!kvp.Value.alcanzable)
                {
                    continue;
                }

                entrada = get_Nodo_Rango(mapa.get_Celda_Id(kvp.Key), kvp.Value, hechizo_pelea, hechizo_stats);
                if (entrada.enemigos_atacos_en_celda.Count > 0)
                {
                    entradas.Add(entrada);
                }
            }

            short celda_id       = -1;
            short desde_celda_id = -1;
            KeyValuePair <short, MovimientoNodo>?node = null;
            byte enemigos_atacados = 0;
            int  pm_utilizados     = 99;

            foreach (NodoRango nodo in entradas)
            {
                foreach (KeyValuePair <short, byte> kvp in nodo.enemigos_atacos_en_celda)
                {
                    if (hechizo_pelea.metodo_lanzamiento == MetodoLanzamiento.CAC && !pelea.esta_Cuerpo_A_Cuerpo_Con_Enemigo(nodo.celda))
                    {
                        continue;
                    }

                    if (pelea.get_Puede_Lanzar_hechizo(hechizo_pelea.id, nodo.celda, mapa.get_Celda_Id(kvp.Key), mapa) != FallosLanzandoHechizo.NINGUNO)
                    {
                        continue;
                    }

                    if (kvp.Value >= enemigos_atacados)
                    {
                        if (kvp.Value > enemigos_atacados || (kvp.Value == enemigos_atacados && nodo.pm_utilizados <= pm_utilizados))
                        {
                            enemigos_atacados = kvp.Value;
                            celda_id          = kvp.Key;
                            desde_celda_id    = nodo.celda.id;
                            pm_utilizados     = nodo.pm_utilizados;

                            if (nodo.nodo != null)
                            {
                                node = new KeyValuePair <short, MovimientoNodo>(desde_celda_id, nodo.nodo);
                            }
                        }
                    }
                }
            }

            if (celda_id != -1)
            {
                if (node == null)
                {
                    if (GlobalConf.mostrar_mensajes_debug)
                    {
                        cuenta.logger.log_informacion("DEBUG", $"Se ha lanzado el hechizo {hechizo.nombre} atacando a {enemigos_atacados} enemigos en la celda {celda_id}");
                    }

                    await pelea.get_Lanzar_Hechizo(hechizo_pelea.id, celda_id);

                    return(ResultadoLanzandoHechizo.LANZADO);
                }
                else
                {
                    hechizo_para_lanzar = hechizo.id;
                    celda_objetivo      = celda_id;
                    enemigos_tocados    = enemigos_atacados;

                    await cuenta.juego.manejador.movimientos.get_Mover_Celda_Pelea(node);

                    return(ResultadoLanzandoHechizo.MOVIDO);
                }
            }

            return(ResultadoLanzandoHechizo.NO_LANZADO);
        }
Example #12
0
        private async Task <ResultadoLanzandoHechizo> get_Mover_Lanzar_hechizo_Simple(PeleaHechizos hechizo_pelea, Luchadores enemigo)
        {
            KeyValuePair <short, MovimientoNodo>?nodo = null;
            int pm_utilizados = 99;

            foreach (KeyValuePair <short, MovimientoNodo> movimiento in PeleasPathfinder.get_Celdas_Accesibles(pelea, mapa, pelea.jugador_luchador.celda))
            {
                if (!movimiento.Value.alcanzable)
                {
                    continue;
                }

                if (hechizo_pelea.metodo_lanzamiento == MetodoLanzamiento.CAC && !pelea.esta_Cuerpo_A_Cuerpo_Con_Enemigo(mapa.get_Celda_Id(movimiento.Key)))
                {
                    continue;
                }

                if (pelea.get_Puede_Lanzar_hechizo(hechizo_pelea.id, mapa.get_Celda_Id(movimiento.Key), enemigo.celda, mapa) != FallosLanzandoHechizo.NINGUNO)
                {
                    continue;
                }

                if (movimiento.Value.camino.celdas_accesibles.Count <= pm_utilizados)
                {
                    nodo          = movimiento;
                    pm_utilizados = movimiento.Value.camino.celdas_accesibles.Count;
                }
            }

            if (nodo != null)
            {
                await cuenta.juego.manejador.movimientos.get_Mover_Celda_Pelea(nodo);

                return(ResultadoLanzandoHechizo.MOVIDO);
            }

            return(ResultadoLanzandoHechizo.NO_LANZADO);
        }