Пример #1
0
        /// <summary>
        /// <para>Selecciona el plan de direccion</para>
        /// </summary>
        /// <param name="plan"></param>
        private void PlanDirectionDependent(PlanDeAtaque plan)        // Selecciona el plan de direccion
        {
            // Obtener datos
            Area                areaInicial = Unidad.Area;
            Direcciones         dirInicial  = Unidad.dir;
            List <OpcionAtaque> list        = new List <OpcionAtaque>();
            List <Area>         opcionesMov = GetOpcionesMovimiento();

            // Comprobar las opciones de movimiento
            for (int n = 0; n < opcionesMov.Count; n++)
            {
                Area sigArea = opcionesMov[n];
                Unidad.Posicionar(sigArea);

                // Comprobar las ocpiones de direccion
                for (int i = 0; i < 4; i++)
                {
                    Unidad.dir = (Direcciones)i;
                    OpcionAtaque opcionAtaq = new OpcionAtaque();
                    opcionAtaq.objetivo  = sigArea;
                    opcionAtaq.direccion = Unidad.dir;
                    AnalizarLocalizacionAtaque(plan, opcionAtaq);
                    opcionAtaq.AddMovimientoObjetivo(sigArea);
                    list.Add(opcionAtaq);
                }
            }

            // Posicionar unidad
            Unidad.Posicionar(areaInicial);
            Unidad.dir = dirInicial;

            // Elegir la mejor opcion
            ElegirMejorOpcion(plan, list);
        }
Пример #2
0
        /// <summary>
        /// <para>Selecciona el plan de direccion</para>
        /// </summary>
        /// <param name="plan"></param>
        private void PlanDireccionIndependiente(PlanDeAtaque plan)        // Selecciona el plan de direccion
        {
            // Obtener datos
            Area areaInicial = Unidad.Area;
            Dictionary <Area, OpcionAtaque> mapeo = new Dictionary <Area, OpcionAtaque>();
            RangoHabilidad rangoHab    = plan.habilidad.GetComponent <RangoHabilidad>();
            List <Area>    opcionesMov = GetOpcionesMovimiento();

            // Comprobar las opciones de movimiento
            for (int n = 0; n < opcionesMov.Count; n++)
            {
                // Posicionar la unidad en la siguiente area
                Area sigArea = opcionesMov[n];
                Unidad.Posicionar(sigArea);

                // Obtener las posibles opciones de ataque
                List <Area> opcionesAtaq = rangoHab.GetAreasARango(freya.grid);

                // Comprobar las opciones de ataques
                for (int i = 0; i < opcionesAtaq.Count; i++)
                {
                    Area         areaAtaque = opcionesAtaq[i];
                    OpcionAtaque opcionAtaq = null;

                    // Comprobar si el area puede ser atacada
                    if (mapeo.ContainsKey(areaAtaque))
                    {
                        opcionAtaq = mapeo[areaAtaque];
                    }
                    else
                    {
                        // Cambiar la ocpion
                        opcionAtaq           = new OpcionAtaque();
                        mapeo[areaAtaque]    = opcionAtaq;
                        opcionAtaq.objetivo  = areaAtaque;
                        opcionAtaq.direccion = Unidad.dir;
                        AnalizarLocalizacionAtaque(plan, opcionAtaq);
                    }

                    // Moveer hacia la siguiente area
                    opcionAtaq.AddMovimientoObjetivo(sigArea);
                }
            }

            // Posicionar unidad
            Unidad.Posicionar(areaInicial);
            List <OpcionAtaque> list = new List <OpcionAtaque>(mapeo.Values);

            // Elegir la mejor opcion
            ElegirMejorOpcion(plan, list);
        }
Пример #3
0
        /// <summary>
        /// <para>Analiza la localizacion del ataque</para>
        /// </summary>
        /// <param name="plan"></param>
        /// <param name="opcionAtq"></param>
        private void AnalizarLocalizacionAtaque(PlanDeAtaque plan, OpcionAtaque opcionAtq)        // Analiza la localizacion del ataque
        {
            // Obtener datos
            AreaHabilidad area  = plan.habilidad.GetComponent <AreaHabilidad>();
            List <Area>   areas = area.GetAreasEnArea(freya.grid, opcionAtq.objetivo.pos);

            // Obtener objetivos y habilidades
            opcionAtq.areaObjetivos   = areas;
            opcionAtq.isAreaPeligrosa = IsHabilidadRealizable(plan, Unidad.Area);

            // Analizar areas
            for (int n = 0; n < areas.Count; n++)
            {
                Area areaAnali = areas[n];
                if (Unidad.Area == areas[n] || !plan.habilidad.IsTarget(areaAnali))
                {
                    continue;
                }

                // Comprobar si es realizable la habilidad y fijarla
                bool isRealizable = IsHabilidadRealizable(plan, areaAnali);
                opcionAtq.AddMarca(areaAnali, isRealizable);
            }
        }
Пример #4
0
        /// <summary>
        /// <para>Elige la mejor opcion</para>
        /// </summary>
        /// <param name="plan"></param>
        /// <param name="opcionesAtq"></param>
        private void ElegirMejorOpcion(PlanDeAtaque plan, List <OpcionAtaque> opcionesAtq)       // Elige la mejor opcion
        {
            int mejorPuntuacion = 1;

            List <OpcionAtaque> mejoresOpciones = new List <OpcionAtaque>();

            // Comprobar opciones
            for (int n = 0; n < opcionesAtq.Count; n++)
            {
                // Calcular la puntuacion de la opcion
                OpcionAtaque opcion     = opcionesAtq[n];
                int          puntuacion = opcion.GetPuntuacion(Unidad, plan.habilidad);

                // Comprobar si es mejor que la actual en puntuacion
                if (puntuacion > mejorPuntuacion)
                {
                    // Sustituir la nueva opcion por la anterior
                    mejorPuntuacion = puntuacion;
                    mejoresOpciones.Clear();
                    mejoresOpciones.Add(opcion);
                }
                else if (puntuacion == mejorPuntuacion)
                {
                    // Si es igual, agregarla a la lista
                    mejoresOpciones.Add(opcion);
                }
            }

            if (mejoresOpciones.Count == 0)
            {
                // No hay opciones
                plan.habilidad = null;
                return;
            }

            List <OpcionAtaque> seleccionesFinales = new List <OpcionAtaque>();

            mejorPuntuacion = 0;

            // Comprobar las mejores ocpiones
            for (int i = 0; i < mejoresOpciones.Count; i++)
            {
                // Calcular la puntuacion de la opcion
                OpcionAtaque opcion     = mejoresOpciones[i];
                int          puntuacion = opcion.MejorPuntuacionAngulo;

                // Comprobar si es mejor que la actual en puntuacion
                if (puntuacion > mejorPuntuacion)
                {
                    // Sustituir la nueva opcion por la anterior
                    mejorPuntuacion = puntuacion;
                    seleccionesFinales.Clear();
                    seleccionesFinales.Add(opcion);
                }
                else if (puntuacion == mejorPuntuacion)
                {
                    // Si es igual, agregarla a la lista
                    seleccionesFinales.Add(opcion);
                }
            }

            // Seleccionar la opcion elegida
            OpcionAtaque eleccion = seleccionesFinales[Random.Range(0, seleccionesFinales.Count)];

            plan.posAtaque = eleccion.objetivo.pos;
            plan.dirAtaque = eleccion.direccion;
            plan.posMovi   = eleccion.MejorMovimientoArea.pos;
        }