Exemplo n.º 1
0
 private static void ChangeVelocity(
     Comps.Velocity velocity,
     Orientation.Cardinal direction,
     float moveSpeed,
     Comps.Orientations.Cardinal orientation
     )
 {
     velocity.data    = direction.GetPhysicalVector2() * moveSpeed;
     orientation.data = direction;
     velocity.decay   = 1;
 }
Exemplo n.º 2
0
        public static void Run(Registry registry)
        {
            HashSet <Entity> entities = registry.GetEntities(
                typeof(Comps.Velocity),
                typeof(Comps.Orientations.Cardinal),
                typeof(Comps.Autonomous)
                );

            Tick   tick   = Global.tick;
            Random random = Global.random;

            foreach (Entity entity in entities)
            {
                Comps.Autonomous autonomous = registry
                                              .GetComponentUnsafe <Comps.Autonomous>(entity);

                Comps.Velocity velocity = registry
                                          .GetComponentUnsafe <Comps.Velocity>(entity);

                Comps.Orientations.Cardinal orientation = registry
                                                          .GetComponentUnsafe <Comps.Orientations.Cardinal>(entity);

                float moveSpeed    = autonomous.moveSpeed;
                float changePeriod = 60 * autonomous.changePeriod;

                if (tick % changePeriod == 0)
                {
                    if (autonomous.attackChance > random.NextDouble())
                    {
                        var p = Factories.Projectile.Create(autonomous.attackType, entity, registry);

                        if (autonomous.spreadShots)
                        {
                            CreateSpreadshots(entity, autonomous, p, registry);
                        }

                        if (autonomous.stopWhileAttacking)
                        {
                            velocity.data = PhysicalVector2.Zero;
                            continue;
                        }
                    }
                }

                switch (autonomous.kind)
                {
                case Comps.Autonomous.Kind.Basic:
                    if (tick % changePeriod == 0)
                    {
                        int r = random.Next(4);
                        ChangeVelocity(velocity, GetCardinal(r), moveSpeed, orientation);
                    }
                    break;

                case Comps.Autonomous.Kind.Charging:
                    if (tick % (2 * changePeriod) == 0)
                    {
                        int r = 1 + 2 * random.Next(2);
                        moveSpeed *= 1.5f;
                        ChangeVelocity(velocity, GetCardinal(r), moveSpeed, orientation);
                    }
                    else if (tick % changePeriod == 0)
                    {
                        int r = 2 * random.Next(2);
                        moveSpeed *= 0.5f;
                        ChangeVelocity(velocity, GetCardinal(r), moveSpeed);
                    }
                    break;

                case Comps.Autonomous.Kind.Flying:
                    moveSpeed *= (float)(1 + Math.Sin((tick / (changePeriod * 5)) * 2 * Math.PI));
                    if (tick % changePeriod == 0)
                    {
                        int r = random.Next(4);
                        ChangeVelocity(velocity, GetCardinal(r), moveSpeed, orientation);
                    }
                    else
                    {
                        ChangeVelocity(velocity, orientation.data, moveSpeed);
                    }
                    break;

                case Comps.Autonomous.Kind.Shuffling:
                    if (tick % changePeriod == 0)
                    {
                        if (velocity.data.Length() == 0)
                        {
                            ChangeVelocity(velocity, orientation.data, moveSpeed);
                        }
                        else
                        {
                            velocity.data *= -1;
                        }
                    }
                    break;

                default:
                    break;
                }
            }
        }
Exemplo n.º 3
0
        private static CompsExt.Visibles.Sprite CreateVisibleComp(
            Comps.Character characterComp,
            Comps.Orientations.Cardinal orientationComp,
            ContentManager contentManager
            )
        {
            switch (characterComp.kind)
            {
            case Comps.Character.Kind.Link:
                switch (orientationComp.data)
                {
                case Physical.Orientation.Cardinal.Up:
                    if (characterComp.attacking)
                    {
                        return(new CompsExt.Visibles.Sprite {
                            texture = contentManager.Load <Texture2D>("Sprites/Link"),
                            texturePosRectangle = new DrawingPosRectangle(16 * 1, 16 * 3, 16, 16 * 2),
                            destRectangle = new Drawing.Rectangle(16 * 4, 16 * 8),
                            destOffset = new DrawingVector(0, 16)         // TODO: Why does this value work?
                        });
                    }
                    else
                    {
                        return(new CompsExt.Visibles.Sprite {
                            texture = contentManager.Load <Texture2D>("Sprites/Link"),
                            texturePosRectangle = new DrawingPosRectangle(32, 32, 16, 16),
                            destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                        });
                    }

                case Physical.Orientation.Cardinal.Left:
                    if (characterComp.attacking)
                    {
                        return(new CompsExt.Visibles.Sprite {
                            texture = contentManager.Load <Texture2D>("Sprites/Link"),
                            texturePosRectangle = new DrawingPosRectangle(16 * 2, 16, 16 * 2, 16),
                            destRectangle = new Drawing.Rectangle(16 * 8, 16 * 4),
                            destOffset = new DrawingVector(16, 0)         // TODO: Why does this value work?
                        });
                    }
                    else
                    {
                        return(new CompsExt.Visibles.Sprite {
                            texture = contentManager.Load <Texture2D>("Sprites/Link"),
                            texturePosRectangle = new DrawingPosRectangle(8 * 16, 16, 16, 16),
                            destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                        });
                    }

                case Physical.Orientation.Cardinal.Down:
                    if (characterComp.attacking)
                    {
                        return(new CompsExt.Visibles.Sprite {
                            texture = contentManager.Load <Texture2D>("Sprites/Link"),
                            texturePosRectangle = new DrawingPosRectangle(16 * 7, 16 * 2, 16, 16 * 2),
                            destRectangle = new Drawing.Rectangle(16 * 4, 16 * 8),
                            destOffset = new DrawingVector(0, -16)         // TODO: Why does this value work?
                        });
                    }
                    else
                    {
                        return(new CompsExt.Visibles.Sprite {
                            texture = contentManager.Load <Texture2D>("Sprites/Link"),
                            texturePosRectangle = new DrawingPosRectangle(0, 32, 16, 16),
                            destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                        });
                    }

                case Physical.Orientation.Cardinal.Right:
                    if (characterComp.attacking)
                    {
                        return(new CompsExt.Visibles.Sprite {
                            texture = contentManager.Load <Texture2D>("Sprites/Link"),
                            texturePosRectangle = new DrawingPosRectangle(16 * 4, 0, 16 * 2, 16),
                            destRectangle = new Drawing.Rectangle(16 * 8, 16 * 4),
                            destOffset = new DrawingVector(-16, 0)         // TODO: Why does this value work?
                        });
                    }
                    else
                    {
                        return(new CompsExt.Visibles.Sprite {
                            texture = contentManager.Load <Texture2D>("Sprites/Link"),
                            texturePosRectangle = new DrawingPosRectangle(8 * 16, 0, 16, 16),
                            destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                        });
                    }

                default:
                    throw new ArgumentException(
                              "Invalid orientation direction"
                              );
                }

            case Comps.Character.Kind.Aquamentus:
                switch (orientationComp.data)
                {
                case Physical.Orientation.Cardinal.Left:
                    return(new CompsExt.Visibles.Sprite {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(0, 0, 32, 32),
                        destRectangle = new Drawing.Rectangle(32 * 4, 32 * 4)
                    });

                case Physical.Orientation.Cardinal.Right:
                    return(new CompsExt.Visibles.Sprite {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(0, 32, 32, 32),
                        destRectangle = new Drawing.Rectangle(32 * 4, 32 * 4)
                    });

                default:
                    throw new ArgumentException(
                              "Invalid orientation direction"
                              );
                }

            case Comps.Character.Kind.Zol:
                return(new CompsExt.Visibles.Sprite {
                    texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                    texturePosRectangle = new DrawingPosRectangle(96, 32, 16, 16),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Character.Kind.Goriya:
                switch (orientationComp.data)
                {
                case Physical.Orientation.Cardinal.Up:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(32, 64, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                    });

                case Physical.Orientation.Cardinal.Left:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(96, 64, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                    });

                case Physical.Orientation.Cardinal.Down:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(0, 64, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                    });

                case Physical.Orientation.Cardinal.Right:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(64, 64, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                    });

                default:
                    throw new ArgumentException(
                              "Invalid orientation direction"
                              );
                }

            case Comps.Character.Kind.Dodongos:
                switch (orientationComp.data)
                {
                case Physical.Orientation.Cardinal.Up:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(64, 96, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                    });

                case Physical.Orientation.Cardinal.Left:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(64, 80, 32, 16),
                        destRectangle = new Drawing.Rectangle(32 * 4, 16 * 4)
                    });

                case Physical.Orientation.Cardinal.Down:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(128, 80, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                    });

                case Physical.Orientation.Cardinal.Right:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(0, 80, 32, 16),
                        destRectangle = new Drawing.Rectangle(32 * 4, 16 * 4)
                    });

                default:
                    throw new ArgumentException(
                              "Invalid orientation direction"
                              );
                }

            case Comps.Character.Kind.Stalfos:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                    texturePosRectangle = new DrawingPosRectangle(128, 64, 16, 16),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Character.Kind.Rope:
                switch (orientationComp.data)
                {
                case Physical.Orientation.Cardinal.Right:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(0, 112, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                    });

                case Physical.Orientation.Cardinal.Left:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                        texturePosRectangle = new DrawingPosRectangle(32, 112, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                    });

                default:
                    throw new ArgumentException(
                              "Invalid orientation direction"
                              );
                }

            case Comps.Character.Kind.Keese:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                    texturePosRectangle = new DrawingPosRectangle(128, 96, 16, 16),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Character.Kind.Wallmaster:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                    texturePosRectangle = new DrawingPosRectangle(64, 112, 16, 16),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            default:
                throw new ArgumentException("Invalid character kind");
            }
        }
Exemplo n.º 4
0
        private static CompsExt.Visibles.Sprite CreateVisibleComp(
            Comps.Projectile projectileComp,
            Comps.Orientations.Cardinal orientationComp,
            ContentManager contentManager
            )
        {
            switch (projectileComp.kind)
            {
            case Comps.Projectile.Kind.Arrow:
                switch (orientationComp.data)
                {
                case Physical.Orientation.Cardinal.Up:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Items"),
                        texturePosRectangle = new DrawingPosRectangle(16, 32, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                    });

                case Physical.Orientation.Cardinal.Down:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Items"),
                        texturePosRectangle = new DrawingPosRectangle(16, 32, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4),
                        effects = SpriteEffects.FlipVertically
                    });

                case Physical.Orientation.Cardinal.Right:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Items"),
                        texturePosRectangle = new DrawingPosRectangle(16, 32, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4),
                        rotation = (float)Math.PI / 2,
                        destOffset = new DrawingVector(-16 * 4, 0)
                    });

                case Physical.Orientation.Cardinal.Left:
                    return(new CompsExt.Visibles.Sprite
                    {
                        texture = contentManager.Load <Texture2D>("Sprites/Items"),
                        texturePosRectangle = new DrawingPosRectangle(16, 32, 16, 16),
                        destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4),
                        rotation = (float)Math.PI / 2,
                        destOffset = new DrawingVector(-16 * 4, 0),
                        effects = SpriteEffects.FlipVertically
                    });

                default:
                    throw new ArgumentException("Invalid orientation direction");
                }

            case Comps.Projectile.Kind.Bomb:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Items"),
                    texturePosRectangle = new DrawingPosRectangle(130, 18, 14, 14),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Projectile.Kind.Boomerang:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Items"),
                    texturePosRectangle = new DrawingPosRectangle(36, 19, 11, 11),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Projectile.Kind.RedKey:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Items"),
                    texturePosRectangle = new DrawingPosRectangle(28, 0, 16, 16),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Projectile.Kind.BlueKey:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Items"),
                    texturePosRectangle = new DrawingPosRectangle(28, 0, 16, 16),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Projectile.Kind.GreenKey:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Items"),
                    texturePosRectangle = new DrawingPosRectangle(28, 0, 16, 16),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Projectile.Kind.PurpleKey:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Items"),
                    texturePosRectangle = new DrawingPosRectangle(28, 0, 16, 16),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Projectile.Kind.YellowKey:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Items"),
                    texturePosRectangle = new DrawingPosRectangle(28, 0, 16, 16),
                    destRectangle = new Drawing.Rectangle(16 * 4, 16 * 4)
                });

            case Comps.Projectile.Kind.Fireball:
                return(new CompsExt.Visibles.Sprite
                {
                    texture = contentManager.Load <Texture2D>("Sprites/Enemies"),
                    texturePosRectangle = new DrawingPosRectangle(100, 51, 10, 10),
                    destRectangle = new Drawing.Rectangle(10 * 4, 10 * 4)
                });

            default:
                throw new NotImplementedException("TODO");
            }
        }