Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }