/// <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); }
/// <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); }
/// <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); } }
/// <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; }