public void Start(World world)
    {
        var entities      = world.entities;
        var enemyEntities = world.enemyEntities;

        // add randomized velocity to all player entities that have positions
        for (var i = 0; i < entities.flags.Count; i++)
        {
            if (entities.flags[i].HasFlag(EntityFlags.kFlagPosition))
            {
                entities.AddComponent(new PlayerEntity(i), EntityFlags.kFlagForce);

                var forceComponent = new ForceComponent()
                {
                    massInverse = Random.Range(0f, 5f), force = Vector2.zero
                };
                entities.forceComponents[i] = forceComponent;
            }
        }
        for (var i = 0; i < enemyEntities.enemyFlags.Count; i++)
        {
            if (enemyEntities.enemyFlags[i].HasFlag(EnemyEntityFlags.kFlagPosition))
            {
                enemyEntities.AddEnemyComponent(new EnemyEntity(i), EnemyEntityFlags.kFlagForce);

                var enemyForceComponent = new EnemyForceComponent()
                {
                    massInverse = Random.Range(0f, 5f), force = Vector2.zero
                };
                enemyEntities.enemyForceComponents[i] = enemyForceComponent;
            }
        }
    }
Esempio n. 2
0
        private void CheckCollision(Entity entity1, Entity entity2)
        {
            ObjectComponent objectComponent1 = entity1.GetComponent <ObjectComponent>(),
                            objectComponent2 = entity2.GetComponent <ObjectComponent>();

            if (objectComponent1.IsHeld || objectComponent2.IsHeld ||
                !objectComponent1.IsSolid || !objectComponent2.IsSolid)
            {
                return;
            }

            PositionComponent positionComponent1 = entity1.GetComponent <PositionComponent>(),
                              positionComponent2 = entity2.GetComponent <PositionComponent>();
            ForceComponent forceComponent1       = entity1.GetComponent <ForceComponent>(),
                           forceComponent2       = entity2.GetComponent <ForceComponent>();

            Vector2 difference       = positionComponent1.Position - positionComponent2.Position;
            float   touchingDistance = objectComponent1.Radius + objectComponent2.Radius;

            float distance = difference.LengthSquared();

            if (distance == 0f || distance > touchingDistance * touchingDistance)
            {
                return;
            }

            distance = (float)Math.Sqrt(distance);
            float   strength = 1000f / distance;
            Vector2 force    = (difference / distance) * strength;

            forceComponent1.Force += force;
            forceComponent2.Force -= force;
        }
Esempio n. 3
0
        public override void Process(Entity entity)
        {
            ForceComponent    forceComponent    = entity.GetComponent <ForceComponent>();
            VelocityComponent velocityComponent = entity.GetComponent <VelocityComponent>();

            velocityComponent.Velocity += forceComponent.Force / forceComponent.Mass;
            forceComponent.Force        = Vector2.Zero;
        }
Esempio n. 4
0
    void ShootEntity()
    {
        int id = entities.Shoot();

        if (entities.flags[id].HasFlag(EntityFlags.kFlagPosition))
        {
            entities.AddComponent(new Entity(id), EntityFlags.kFlagGravity);
            entities.AddComponent(new Entity(id), EntityFlags.kFlagForce);
            entities.AddComponent(new Entity(id), EntityFlags.kFlagMove);
            entities.AddComponent(new Entity(id), EntityFlags.kFlagCollision);
            entities.AddComponent(new Entity(id), EntityFlags.kFlagWorldBounds);

            //gravity - empty

            //force
            var forceComponent = new ForceComponent()
            {
                massInverse = Random.Range(1f, 5f), force = Vector2.zero
            };
            entities.forceComponents[id] = forceComponent;

            //movement
            var moveComponent = entities.moveComponents[id];
            moveComponent.velocity = new Vector2(mouseClickDirection.x, mouseClickDirection.y) * force;

            //moveComponent.velocity = new Vector2(Random.Range(-3f, 3f), Random.Range(-3f, 3f));
            entities.moveComponents[id] = moveComponent;

            //collition
            var collisionComponent = new CollisionComponent();
            if (entities.forceComponents[id].massInverse > 1e-6f)
            {
                collisionComponent.radius = 1.0f / entities.forceComponents[id].massInverse;
            }

            collisionComponent.coeffOfRestitution = Random.Range(0.1f, 0.9f);

            entities.collisionComponents[id] = collisionComponent;

            //worldboudns - empty


            // add force in selected direction
        }
    }
Esempio n. 5
0
        public override void Process(Entity entity)
        {
            ObjectComponent objectComponent = entity.GetComponent <ObjectComponent>();

            if (objectComponent.IsHeld)
            {
                return;
            }

            PositionComponent positionComponent = entity.GetComponent <PositionComponent>();
            ForceComponent    forceComponent    = entity.GetComponent <ForceComponent>();

            Vector2 worldForce = Vector2.Zero;

            worldForce.X -= Math.Max(0f, positionComponent.Position.X + objectComponent.Radius - _world.Right);
            worldForce.X += Math.Max(0f, _world.Left - positionComponent.Position.X + objectComponent.Radius);
            worldForce.Y -= Math.Max(positionComponent.Position.Y + objectComponent.Radius - _world.Bottom, 0f);
            worldForce.Y += Math.Max(_world.Top - positionComponent.Position.Y + objectComponent.Radius, 0f);
            if (worldForce.X != 0f || worldForce.Y != 0f)
            {
                forceComponent.Force += Vector2.Normalize(worldForce) * 100f;
            }

            Vector2 wallForce = Vector2.Zero;

            foreach (Rectangle wall in _walls)
            {
                if (wall.Contains(positionComponent.Position - new Vector2(0f, objectComponent.Radius)) ||
                    wall.Contains(positionComponent.Position + new Vector2(0f, objectComponent.Radius)) ||
                    wall.Contains(positionComponent.Position - new Vector2(objectComponent.Radius, 0f)) ||
                    wall.Contains(positionComponent.Position + new Vector2(objectComponent.Radius, 0f)))
                {
                    wallForce += positionComponent.Position - wall.Center.ToVector2();
                }
            }
            if (wallForce.X != 0f || wallForce.Y != 0f)
            {
                forceComponent.Force += Vector2.Normalize(wallForce) * 80f;
            }
        }
Esempio n. 6
0
        public override void Process(Entity entity)
        {
            PositionComponent positionComponent = entity.GetComponent <PositionComponent>();
            ForceComponent    forceComponent    = entity.GetComponent <ForceComponent>();
            ObjectComponent   objectComponent   = entity.GetComponent <ObjectComponent>();
            MinionComponent   minionComponent   = entity.GetComponent <MinionComponent>();

            float speed = _musicBox.IsActive ? 20f : 18f;

            if (_random.Next(1000) < 100)
            {
                minionComponent.Offset = new Vector2(64f * ((float)_random.NextDouble() * 2f - 1f), 64f * ((float)_random.NextDouble() * 2f - 1f));
            }

            if (objectComponent.IsHeld || positionComponent.Depth != 0f)
            {
                return;
            }

            if (minionComponent.TargetItem != null)
            {
                if (minionComponent.TargetItem.DeletingState)
                {
                    minionComponent.TargetItem = null;
                }
                else
                {
                    PositionComponent itemPositionComponent = minionComponent.TargetItem.GetComponent <PositionComponent>();
                    if (itemPositionComponent == null || itemPositionComponent.Depth < 0f || itemPositionComponent.Position.Y <= _furnace.Region.Bottom - 4f)
                    {
                        ObjectComponent itemObjectComponent = minionComponent.TargetItem.GetComponent <ObjectComponent>();
                        if (itemObjectComponent != null)
                        {
                            itemObjectComponent.IsMarked = false;
                        }

                        minionComponent.TargetItem = null;
                    }
                }
            }

            if (minionComponent.TargetItem == null)
            {
                float  closestDistance = float.MaxValue;
                Entity closestObject   = null;
                foreach (Entity item in EntityWorld.EntityManager.GetEntities(Aspect.All(typeof(ObjectComponent), typeof(PositionComponent))))
                {
                    ObjectComponent itemObjectComponent = item.GetComponent <ObjectComponent>();
                    if (itemObjectComponent.IsMarked || !WantsItem(itemObjectComponent.Type, minionComponent.Intelligence))
                    {
                        continue;
                    }

                    PositionComponent itemPositionComponent = item.GetComponent <PositionComponent>();
                    float             checkDistance         = 0f;
                    if (minionComponent.Intelligence < 30)
                    {
                        checkDistance = 20f;
                    }
                    if (itemPositionComponent.Depth < 0f || itemPositionComponent.Position.Y <= _furnace.Region.Bottom - checkDistance)
                    {
                        continue;
                    }

                    float distance = (itemPositionComponent.Position - positionComponent.Position).LengthSquared();
                    if (distance < closestDistance)
                    {
                        closestDistance = distance;
                        closestObject   = item;
                    }
                }
                minionComponent.TargetItem = closestObject;

                if (closestObject != null)
                {
                    ObjectComponent itemObjectComponent = closestObject.GetComponent <ObjectComponent>();
                    itemObjectComponent.IsMarked = true;
                }
            }

            float safetyDistance = 20f;

            if (minionComponent.Intelligence > 90)
            {
                safetyDistance = 40f;
            }
            else if (minionComponent.Intelligence > 80)
            {
                safetyDistance = 30f;
            }

            if (minionComponent.Intelligence > 50 && (positionComponent.Position.Y <= _furnace.Region.Bottom + safetyDistance && _furnace.Timer > Furnace.ClosedTime - 1f))
            {
                Vector2 target = GetNowhereTarget(minionComponent.Offset, minionComponent.Leftie);

                forceComponent.Force += Vector2.Normalize(target - positionComponent.Position) * speed;
            }
            else if (minionComponent.TargetItem != null)
            {
                PositionComponent itemPositionComponent = minionComponent.TargetItem.GetComponent <PositionComponent>();

                Vector2 difference = itemPositionComponent.Position - positionComponent.Position;
                float   distance   = difference.Length();
                if (distance > 32f)
                {
                    Vector2 target = itemPositionComponent.Position + minionComponent.Offset * Math.Min((distance - 32f) / 100f, 1f);

                    forceComponent.Force += Vector2.Normalize(target - positionComponent.Position) * speed;
                }
                else
                {
                    float xTarget = _furnace.Region.Left + 100f * minionComponent.Tendency;
                    if (positionComponent.Position.X > _furnace.Region.Center.X)
                    {
                        xTarget = _furnace.Region.Right - 100f * minionComponent.Tendency;
                    }
                    float hDir = xTarget - positionComponent.Position.X;

                    forceComponent.Force += new Vector2(hDir / 30f, -speed);

                    ForceComponent itemForceComponent = minionComponent.TargetItem.GetComponent <ForceComponent>();

                    itemForceComponent.Force += new Vector2(hDir / 30f, -speed);
                }
            }
            else
            {
                Vector2 target = GetNowhereTarget(minionComponent.Offset, minionComponent.Leftie);

                forceComponent.Force += Vector2.Normalize(target - positionComponent.Position) * speed;
            }
        }