public override EstadoNPC Procesar(float fDeltaSegundos) { //Estoy yendo a atacar EstadoNPC nuevoEstado = this; if (!thingAAtacar.Eliminado) { Vector2 diferencia = thingAAtacar.Centro - nave.Centro; if (diferencia.Length > DistanciaAcercamiento) { //Todavia no me acerque todo lo posible if (tiempoIntentosFallidos < 2 && diferencia.Length < RadioBusquedaAtaque * 1.5) { if (!EstadoNPCNavegarA.IrA(nave, thingAAtacar.Centro, fDeltaSegundos)) { tiempoIntentosFallidos += fDeltaSegundos; } } else { //Fallé muchas veces en llegar o se alejó mucho, planifico de nuevo nuevoEstado = new EstadoNPCPlanificar(nave); } } diferencia = thingAAtacar.Centro - nave.Centro; if (diferencia.Length <= DistanciaDisparo) { //Estoy cerca para atacar, roto y disparo! EstadoNPCNavegarA.RotarA(nave, thingAAtacar.Centro, fDeltaSegundos); nave.Shoot(); return(this); } } else { //Destrui mi objetivo! Replanifico nuevoEstado = new EstadoNPCPlanificar(nave); } return(nuevoEstado); }
public override EstadoNPC Procesar(float fDeltaSegundos) { EstadoNPC nuevoEstado = this; switch (nave.Faccion.TipoFaccion) { case Faccion.TipoFaccionEnum.Agresiva: { Thing[] thingsEnRadio = nave.Galaxia.GetThingsEnRadio(nave.Centro, RadioBusquedaAtaque); bool atacando = false; foreach (Thing thing in thingsEnRadio) { if (thing is ThingNave && thing != nave) { ThingNave thingNave = (ThingNave)thing; if (nave.Faccion.GetRelacion(thingNave.Faccion) == Faccion.RelacionConOtraFaccionEnum.Agresiva) { nuevoEstado = new EstadoNPCAtacar(nave, thingNave); atacando = true; break; } } } if (!atacando) { Vector2 destino = nave.Galaxia.BuscarPosicionLibreAlAzar(nave.SectorNativo.Centro, RadioBusquedaRecursos, nave.Tamanio.X); nuevoEstado = new EstadoNPCNavegarA(nave, destino); } break; } case Faccion.TipoFaccionEnum.Neutral: case Faccion.TipoFaccionEnum.Pavisa: { Vector2 destino = nave.Galaxia.BuscarPosicionLibreAlAzar(nave.SectorNativo.Centro, RadioBusquedaRecursos, nave.Tamanio.X); nuevoEstado = new EstadoNPCNavegarA(nave, destino); break; } case Faccion.TipoFaccionEnum.Recolectora: { Recursos.Recurso[] recursos = nave.Galaxia.BuscarRecursos(nave.SectorNativo.Centro, RadioBusquedaRecursos); Recursos.Recurso recursoARecolectar = null; for (int i = 0; i < recursos.Length; i++) { if (recursos[i].CantidadDisponible >= 300.0f) { recursoARecolectar = recursos[i]; break; } } if (recursoARecolectar != null) { nuevoEstado = new EstadoNPCRecolectar(nave, recursoARecolectar); } else { Vector2 destino = nave.Galaxia.BuscarPosicionLibreAlAzar(nave.SectorNativo.Centro, RadioBusquedaRecursos, nave.Tamanio.X); nuevoEstado = new EstadoNPCNavegarA(nave, destino); } break; } } return(nuevoEstado); }