public override EstadoNPC OnDaniadoPor(Thing thing) { if (thing is ThingNave) { ThingNave naveAtacante = (ThingNave)thing; Faccion.RelacionConOtraFaccionEnum relacionConFaccionAtacante = nave.Faccion.GetRelacion(naveAtacante.Faccion); switch (nave.Faccion.TipoFaccion) { case Faccion.TipoFaccionEnum.Agresiva: //Si la nave atacada pertenece a una facción agresiva, ataca de vuelta siempre! (al menos que sea de la misma facción) return(new EstadoNPCAtacar(nave, naveAtacante)); case Faccion.TipoFaccionEnum.Neutral: //Si la nave atacada pertenece a una facción neutral, solo devuelve el ataque si la relación con esa facción es agresiva if (nave.Faccion.GetRelacion(naveAtacante.Faccion) == Faccion.RelacionConOtraFaccionEnum.Agresiva) { return(new EstadoNPCAtacar(nave, naveAtacante)); } else { return(new EstadoNPCHuir(nave, naveAtacante)); } case Faccion.TipoFaccionEnum.Pavisa: case Faccion.TipoFaccionEnum.Recolectora: //Finalmente, si la nave atacada pertenece a una facción pasiva o recolectora, comienza a huir! return(new EstadoNPCHuir(nave, naveAtacante)); } } return(this); }
public override EstadoNPC OnDaniadoPor(Thing thing) { if (thing is ThingNave) { ThingNave naveAtacante = (ThingNave)thing; if (naveAtacante.Faccion != nave.Faccion && naveAtacante.Faccion != null) { Faccion.RelacionConOtraFaccionEnum relacionConFaccionAtacante = nave.Faccion.GetRelacion(naveAtacante.Faccion); if (relacionConFaccionAtacante != Faccion.RelacionConOtraFaccionEnum.Amigable) { //Si la relación con la facción a la que pertenece la nave que me ataca es distinta a amigable, la empiezo a atacar thingAAtacar = naveAtacante; } } } return(this); }
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); }
public override void Draw(GUIGraphicEngine guiGraphicEngine) { Thing thingASeguir = Game.GameEngine.Instance.ThingASeguir; if (thingASeguir == null) { return; } Galaxia galaxia = thingASeguir.Galaxia; //Calculo la posición del mapa en la pantalla Vector2 inicioSuperiorIzquierdo = new Vector2(PrvGetAbsolutePosition().X, PrvGetAbsolutePosition().Y); Vector2 finInferiorDerecho = new Vector2(PrvGetAbsolutePosition().X + Size.Width, PrvGetAbsolutePosition().Y + Size.Height); //Calculo la cantidad óptima de sectores de igual tamaño (cuadrados) a dibujar int radioSectoresADibujarEnMapaX = Properties.Settings.Default.RadioSectoresCercanosADibujarEnMapa; int radioSectoresADibujarEnMapaY = Properties.Settings.Default.RadioSectoresCercanosADibujarEnMapa; Vector2 tamanioSectorEnMapa = new Vector2( (finInferiorDerecho.X - inicioSuperiorIzquierdo.X) / (radioSectoresADibujarEnMapaX * 2 + 1), (finInferiorDerecho.Y - inicioSuperiorIzquierdo.Y) / (radioSectoresADibujarEnMapaY * 2 + 1)); float tamanioSectorAUsar; if (tamanioSectorEnMapa.X > tamanioSectorEnMapa.Y) { tamanioSectorAUsar = tamanioSectorEnMapa.X; } else { tamanioSectorAUsar = tamanioSectorEnMapa.Y; } tamanioSectorEnMapa.X = tamanioSectorAUsar; tamanioSectorEnMapa.Y = tamanioSectorAUsar; radioSectoresADibujarEnMapaX = (int)Math.Ceiling((finInferiorDerecho.X - inicioSuperiorIzquierdo.X) / tamanioSectorEnMapa.X / 2 - 1); radioSectoresADibujarEnMapaY = (int)Math.Ceiling((finInferiorDerecho.Y - inicioSuperiorIzquierdo.Y) / tamanioSectorEnMapa.Y / 2 - 1); SectorID sectorIDCentro = galaxia.GetSectorEnPosicion(thingASeguir.Centro).SectorID; Gl.glBegin(Gl.GL_QUADS); //Dibujo un fondo negro GraphicEngine.Instance.SetColor(Color.FromArgb(200, Color.Black)); Gl.glVertex3f(inicioSuperiorIzquierdo.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glVertex3f(inicioSuperiorIzquierdo.X, finInferiorDerecho.Y, GraphicEngine.zValue); Gl.glVertex3f(finInferiorDerecho.X, finInferiorDerecho.Y, GraphicEngine.zValue); Gl.glVertex3f(finInferiorDerecho.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glEnd(); //Dibujo el borde del mapa Gl.glBegin(Gl.GL_LINE_LOOP); GraphicEngine.Instance.SetColor(Color.FromArgb(100, Color.LightBlue)); Gl.glVertex3f(inicioSuperiorIzquierdo.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glVertex3f(inicioSuperiorIzquierdo.X, finInferiorDerecho.Y, GraphicEngine.zValue); Gl.glVertex3f(finInferiorDerecho.X, finInferiorDerecho.Y, GraphicEngine.zValue); Gl.glVertex3f(finInferiorDerecho.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glEnd(); //Dibujo las lineas de los sectores y su contenido //Calculo el offset dentro del mapa debido al desplazamiento del jugador en el sector Vector2 offset = new Vector2( (thingASeguir.Centro.X - galaxia.GetSector(sectorIDCentro).Centro.X) / Sector.TamanioSector * tamanioSectorEnMapa.X, (thingASeguir.Centro.Y - galaxia.GetSector(sectorIDCentro).Centro.Y) / Sector.TamanioSector * tamanioSectorEnMapa.Y); //Dibujo un sector menos y un sector mas en cada uno de los ejes (X,Y) para compensar los casos en los que //el offset es distinto a cero, en cuyo caso se deberian ver parcialmente algunos otros sectores Vector2 from = new Vector2( inicioSuperiorIzquierdo.X - offset.X - tamanioSectorEnMapa.X, finInferiorDerecho.Y + offset.Y + tamanioSectorEnMapa.Y); Gl.glBegin(Gl.GL_LINES); for (int x = sectorIDCentro.X - radioSectoresADibujarEnMapaX - 1; x <= sectorIDCentro.X + radioSectoresADibujarEnMapaX + 1; x++) { from.Y = finInferiorDerecho.Y + offset.Y + tamanioSectorEnMapa.Y; GraphicEngine.Instance.SetColor(Color.FromArgb(100, Color.LightBlue)); //Linea vertical que abarca todos los sectores if (Properties.Settings.Default.DibujarLineasMapa) { Gl.glVertex3f(from.X, inicioSuperiorIzquierdo.Y, GraphicEngine.zValue); Gl.glVertex3f(from.X, finInferiorDerecho.Y, GraphicEngine.zValue); } Vector2 to = new Vector2(from.X + tamanioSectorEnMapa.X, from.Y - tamanioSectorEnMapa.Y); for (int y = sectorIDCentro.Y - radioSectoresADibujarEnMapaY - 1; y <= sectorIDCentro.Y + radioSectoresADibujarEnMapaY + 1; y++) { Sector sector = galaxia.GetSector(new SectorID(x, y)); bool cambiarFondo = false; Color nuevoColorFondo = Color.Black; if (sector.TieneNebulosa) { //Relleno el sector de un color distinto si tiene nebulosa cambiarFondo = true; nuevoColorFondo = Color.FromArgb(50, Color.DarkViolet); } if (thingASeguir is ThingNave) { ThingNave thingNave = (ThingNave)thingASeguir; if (sector.Faccion != null && sector.Faccion.GetRelacion(thingNave.Faccion) == Faccion.RelacionConOtraFaccionEnum.Agresiva) { cambiarFondo = true; nuevoColorFondo = Color.FromArgb(50, Color.Red); } } if (cambiarFondo) { Gl.glEnd(); Gl.glBegin(Gl.GL_QUADS); GraphicEngine.Instance.SetColor(nuevoColorFondo); Gl.glVertex3f(from.X, from.Y, GraphicEngine.zValue); Gl.glVertex3f(from.X, to.Y, GraphicEngine.zValue); Gl.glVertex3f(to.X, to.Y, GraphicEngine.zValue); Gl.glVertex3f(to.X, from.Y, GraphicEngine.zValue); Gl.glEnd(); Gl.glBegin(Gl.GL_LINES); } //Dibujo las naves que haya en el sector if (sector.ThingsCount > 0) { Gl.glEnd(); } foreach (Thing thing in sector.Things) { //Dibujo todos los elementos en el mapa, excepto la nave del jugador //que la dibujo al final para que queda arriba de todo if (!(thing is ThingNaveJugador)) { DibujarThing(guiGraphicEngine, thing, sector, from, to, tamanioSectorAUsar); } } if (sector.ThingsCount > 0) { Gl.glBegin(Gl.GL_LINES); } GraphicEngine.Instance.SetColor(Color.FromArgb(100, Color.LightBlue)); //Linea horizontal que abarca solo este sector if (Properties.Settings.Default.DibujarLineasMapa) { Gl.glVertex3f(from.X, to.Y, GraphicEngine.zValue); Gl.glVertex3f(to.X, to.Y, GraphicEngine.zValue); } from.Y -= tamanioSectorEnMapa.Y; to.Y -= tamanioSectorEnMapa.Y; } from.X += tamanioSectorEnMapa.X; } Gl.glEnd(); //Dibujo la nave del jugador en el centro del mapa, lo cual siempre va a ser correcto //porque el mapa esta centrado en el jugador //DibujarThing(guiGraphicEngine, naveJugador, galaxia.GetSectorEnPosicion(naveJugador.Centro), from, to, tamanioSectorAUsar); Vector2 centroMapa = new Vector2( (inicioSuperiorIzquierdo.X + finInferiorDerecho.X) / 2, (inicioSuperiorIzquierdo.Y + finInferiorDerecho.Y) / 2); centroMapa.X -= PrvGetAbsolutePosition().X; centroMapa.Y -= PrvGetAbsolutePosition().Y; thingASeguir.DibujarEnMapa(centroMapa, tamanioSectorAUsar / 3, guiGraphicEngine); }