private void Collision_BotBot(object sender, MaterialCollisionArgs e)
        {
            try
            {
                //TODO: Tell the bots so they can increase their personal space
                //Also may want to slightly damage them


                //Bean bean = _beans.Where(o => o.PhysicsBody.Equals(e.Body0)).FirstOrDefault();
                //if (bean != null)
                //{
                //    bean.CollidedBean();
                //}

                //bean = _beans.Where(o => o.PhysicsBody.Equals(e.Body1)).FirstOrDefault();
                //if (bean != null)
                //{
                //    bean.CollidedBean();
                //}
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
 private void Collision_BotAsteroid(object sender, MaterialCollisionArgs e)
 {
     try
     {
         //TODO: Damage the asteroid, slightly damage the bot
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
     }
 }
        private void Collision_BeanTerrain(object sender, MaterialCollisionArgs e)
        {
            try
            {
                // Find the affected bean
                Body beanBody = e.GetBody(_material_Bean);
                Bean bean = _beans.Where(o => o.PhysicsBody.Equals(beanBody)).FirstOrDefault();

                // Inform it
                if (bean != null)
                {
                    bean.CollidedGround();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void Collision_BeanBean(object sender, MaterialCollisionArgs e)
        {
            try
            {
                Bean bean = _beans.Where(o => o.PhysicsBody.Equals(e.Body0)).FirstOrDefault();
                if (bean != null)
                {
                    bean.CollidedBean();
                }

                bean = _beans.Where(o => o.PhysicsBody.Equals(e.Body1)).FirstOrDefault();
                if (bean != null)
                {
                    bean.CollidedBean();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void Collision_BrickBrick(object sender, MaterialCollisionArgs e)
        {
            const double MAXIMPULSE = 150;

            //TODO:  There are 3 copies of the same code, consolidate a bit

            #region Paint Blue

            if (chkColoredImpacts.IsChecked.Value)
            {
                Body body0 = e.Body0;
                Body body1 = e.Body1;

                if (body0 != null && body1 != null)
                {
                    BodyMaterial material0 = _bodyMaterials[body0];
                    BodyMaterial material1 = _bodyMaterials[body1];

                    foreach (MaterialCollision collision in e.Collisions)
                    {
                        if (collision.ContactNormalSpeed > material0.MaxImpulse)
                        {
                            double speed = collision.ContactNormalSpeed;

                            // This is the biggest force this brick has felt, paint it a shade of red
                            material0.MaxImpulse = speed;

                            byte red = Convert.ToByte(UtilityCore.GetScaledValue_Capped(0, material0.OrigColor.R, MAXIMPULSE, 0, speed));		// decrease red and green
                            byte green = Convert.ToByte(UtilityCore.GetScaledValue_Capped(0, material0.OrigColor.G, MAXIMPULSE, 0, speed));
                            byte blue = Convert.ToByte(UtilityCore.GetScaledValue_Capped(material0.OrigColor.B, 255, 0, MAXIMPULSE, speed));		// increase blue

                            material0.Material.Brush = new SolidColorBrush(Color.FromArgb(255, red, green, blue));
                        }

                        if (collision.ContactNormalSpeed > material1.MaxImpulse)
                        {
                            double speed = collision.ContactNormalSpeed;

                            // This is the biggest force this brick has felt, paint it a shade of red
                            material1.MaxImpulse = speed;

                            byte red = Convert.ToByte(UtilityCore.GetScaledValue_Capped(0, material1.OrigColor.R, MAXIMPULSE, 0, speed));		// decrease red and green
                            byte green = Convert.ToByte(UtilityCore.GetScaledValue_Capped(0, material1.OrigColor.G, MAXIMPULSE, 0, speed));
                            byte blue = Convert.ToByte(UtilityCore.GetScaledValue_Capped(material1.OrigColor.B, 255, 0, MAXIMPULSE, speed));		// increase blue

                            material1.Material.Brush = new SolidColorBrush(Color.FromArgb(255, red, green, blue));
                        }
                    }
                }
            }

            #endregion
        }
Ejemplo n.º 6
0
        private void Collision_AsteroidSwarmBot(object sender, MaterialCollisionArgs e)
        {
            try
            {
                Body asteroidBody = e.GetBody(_material_Asteroid);
                Body botBody = e.GetBody(_material_SwarmBot);

                if (asteroidBody == null || botBody == null)
                {
                    return;
                }

                //NOTE: this.Map_ItemRemoved will dispose the swarmbot once the map removes it, so get these stats now
                double botMass = botBody.Mass;
                Point3D botPos = botBody.Position;
                Vector3D botVelocity = botBody.Velocity;

                // Damage the bot
                SwarmBot1b bot = _map.GetItem<SwarmBot1b>(botBody);
                if (bot != null)
                {
                    bot.TakeDamage(asteroidBody.Velocity);
                }
                else
                {
                    // Already gone
                    return;
                }

                // Damage the asteroid
                Asteroid asteroid = _map.GetItem<Asteroid>(asteroidBody);
                if (asteroid != null)
                {
                    //TODO: When swarmbots can grow and specialize, remove this mass/vel boost
                    asteroid.TakeDamage_Projectile(botMass * 5, botPos, botVelocity * 3);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
Ejemplo n.º 7
0
        private void Collision_ShipAsteroid(object sender, MaterialCollisionArgs e)
        {
            try
            {
                Body asteroidBody = e.GetBody(_material_Asteroid);
                Body shipBody = e.GetBody(_material_Ship);
                if (asteroidBody == null || shipBody == null)
                {
                    return;
                }

                Asteroid asteroid = _map.GetItem<Asteroid>(asteroidBody);
                Bot ship = _map.GetItem<Bot>(shipBody);
                if (asteroid == null || ship == null)
                {
                    return;
                }

                // Cache some props
                double asteroidMass = asteroidBody.Mass;
                //Point3D asteroidPos = asteroidBody.Position;
                //Vector3D asteroidVelocity = asteroidBody.Velocity;

                double shipMass = shipBody.Mass;
                //Point3D shipPos = shipBody.Position;
                //Vector3D shipVelocity = shipBody.Velocity;



                var collisions = e.Collisions.
                    Select(o =>
                    {
                        Point3D pos; Vector3D norm; double speed;
                        o.GetContactPositionAndNormalWorld(out pos, out norm, out speed, asteroidBody);
                        return new { Position = pos, Normal = norm, Speed = speed };
                    }).
                    ToArray();

                Point3D collisionPos = Math3D.GetCenter(collisions.Select(o => o.Position));
                Vector3D collisionVelocity = Math3D.GetAverage(collisions.Select(o => o.Normal)).ToUnit() * collisions.Average(o => o.Speed);       // this is relative to the ship.  It will need to be reversed for the asteroid

                if (collisionVelocity.IsNearZero())
                {
                    return;
                }


                //var test1 = ship.PositionWorld;
                //var test2 = ship.Radius;

                //var test3 = asteroid.PositionWorld;
                //var test4 = asteroid.Radius;

                //var test5 = Math3D.GetAABB(collisions.Select(o => o.Position));
                //var test6 = (test5.Item2 - test5.Item1).Length;


                // Damage the asteroid
                // The asteroid has a hit counter, and breaks up after a few hits.  That would need to be removed for this type of hit
                //TODO: The asteroid should only take damage if the impact exceeds a threshold
                //asteroid.TakeDamage_Other(shipMass, collisionPos, -collisionVelocity);      // negative velocity, because the collision velocity is in reference to the ship

                // Damage the ship
                Point3D posModel = ship.PhysicsBody.PositionFromWorld(collisionPos);
                Vector3D velModel = ship.PhysicsBody.DirectionFromWorld(collisionVelocity);
                ship.TakeDamage_Collision(asteroid, posModel, velModel, asteroidMass, shipMass);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void Collision_BotBot(object sender, MaterialCollisionArgs e)
        {
            try
            {

                //TODO: If they are able to reproduce, create an egg


                //Bean bean = _beans.Where(o => o.PhysicsBody.Equals(e.Body0)).FirstOrDefault();
                //if (bean != null)
                //{
                //    bean.CollidedBean();
                //}

                //bean = _beans.Where(o => o.PhysicsBody.Equals(e.Body1)).FirstOrDefault();
                //if (bean != null)
                //{
                //    bean.CollidedBean();
                //}
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
 private void Collision_SpaceStation(object sender, MaterialCollisionArgs e)
 {
     SpaceStation station = _map.GetItem<SpaceStation>(e.GetBody(_material_SpaceStation));
     if (station != null)
     {
         station.Collided(e);
     }
 }
Ejemplo n.º 10
0
        private void Collision_ShipMineral(object sender, MaterialCollisionArgs e)
        {
            try
            {
                Body botBody = e.GetBody(_material_Ship);
                Body mineralBody = e.GetBody(_material_Mineral);

                Bot bot = _map.GetItem<Bot>(botBody);
                if (bot == null)
                {
                    return;
                }

                // For now, only the player ship can take minerals
                if (!(bot is ShipPlayer))
                {
                    return;
                }

                Mineral mineral = _map.GetItem<Mineral>(mineralBody);
                if (mineral == null)
                {
                    return;
                }

                ((ShipPlayer)bot).CollidedMineral(mineral, _world, _material_Mineral, _sharedVisuals);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void Collision_Sand(object sender, MaterialCollisionArgs e)
        {
            // When the sand hits the ship, it is staying alive too long and messing up other sand
            Body body = e.GetBody(_material_Sand);

            TempBody tempBody = _tempBodies.FirstOrDefault(o => o.PhysicsBody.Equals(body));
            if (tempBody != null)
            {
                _tempBodies.Remove(tempBody);
                _tempBodies.Add(new TempBody(tempBody.PhysicsBody, TimeSpan.FromSeconds(1)));
            }
        }
 private void Collision_Ship(object sender, MaterialCollisionArgs e)
 {
 }
Ejemplo n.º 13
0
        /// <summary>
        /// Whenever the station collides with something, the force field shows full intensity, then fades to zero (purely visual)
        /// </summary>
        public void Collided(MaterialCollisionArgs e)
        {
            if (_timer == null)
            {
                _timer = new DispatcherTimer();
                _timer.Interval = new TimeSpan(0, 0, 0, 0, 50);
                _timer.Tick += new EventHandler(Timer_Tick);
            }

            _forceFieldOpacity = 1d;
            _timer.Start();
        }
Ejemplo n.º 14
0
 public void InvokeContactsProcess(IntPtr contact, float timestep, int threadIndex)
 {
     MaterialCollisionArgs e = new MaterialCollisionArgs(contact, timestep, threadIndex);
     this.EventListener(this.Sender, e);
 }
Ejemplo n.º 15
0
 private void Collision_ShipProjectile(object sender, MaterialCollisionArgs e)
 {
     try
     {
         //TODO: Damage ship, remove projectile
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
     }
 }
Ejemplo n.º 16
0
            public void InvokeContactsProcess(IntPtr contact, float timestep, int threadIndex)
            {
                MaterialCollisionArgs e = new MaterialCollisionArgs(contact, timestep, threadIndex);

                this.EventListener(this.Sender, e);
            }
Ejemplo n.º 17
0
        private void Collision_AsteroidProjectile(object sender, MaterialCollisionArgs e)
        {
            try
            {
                Body asteroidBody = e.GetBody(_material_Asteroid);
                Body projectileBody = e.GetBody(_material_Projectile);

                if (asteroidBody == null || projectileBody == null)
                {
                    return;
                }

                //NOTE: this.Map_ItemRemoved will dispose the projectile once the map removes it, so get these stats now
                double projectileMass = projectileBody.Mass;
                Point3D projectilePos = projectileBody.Position;
                Vector3D projectileVelocity = projectileBody.Velocity;

                // Find and remove the projectile
                Projectile projectile = _map.RemoveItem<Projectile>(projectileBody);
                if (projectile == null)
                {
                    // Already gone
                    return;
                }

                // Damage the asteroid
                Asteroid asteroid = _map.GetItem<Asteroid>(asteroidBody);
                if (asteroid != null)
                {
                    asteroid.TakeDamage_Projectile(projectileMass, projectilePos, projectileVelocity);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
Ejemplo n.º 18
0
        private void Collision_BotFood(object sender, MaterialCollisionArgs e)
        {
            try
            {
                Body shipBody = e.GetBody(_material_Bot);
                Body mineralBody = e.GetBody(_material_Food);

                Swimbot bot = _bots.Where(o => o.PhysicsBody.Equals(shipBody)).FirstOrDefault();
                if (bot == null)
                {
                    return;
                }

                Mineral mineral = _map.GetItem<Mineral>(mineralBody);
                if (mineral == null)
                {
                    return;
                }

                bot.CollidedMineral(mineral);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), this.Title, MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
        private void Collision_ProjectileBrick(object sender, MaterialCollisionArgs e)
        {
            const double MAXIMPULSE = 150;

            Body body0 = e.Body0;
            Body body1 = e.Body1;

            if (body0 == null || body1 == null || body0.MaterialGroupID == _material_ExplodingProjectile || body1.MaterialGroupID == _material_ExplodingProjectile)
            {
                // Since I'm changing the material to an explosion, this event still gets called several times in a single frame, but the body has changed
                // material type and GetBody throws an exception
                return;
            }

            Body projectile = e.GetBody(_material_Projectile);
            if (projectile == null)
            {
                return;
            }

            #region Light Fuse

            if (radProjectilesExplode.IsChecked.Value && !_projectilesLitFuse.ContainsKey(projectile))
            {
                _projectilesLitFuse.Add(projectile, .01);		// seconds
            }
            else if (radProjectilesImplode.IsChecked.Value && !_projectilesLitFuse.ContainsKey(projectile))
            {
                _projectilesLitFuse.Add(projectile, .01);		// seconds
            }

            #endregion

            #region Paint Red

            if (chkColoredImpacts.IsChecked.Value)
            {
                Body brickBody = e.GetBody(_material_Brick);
                if (brickBody != null)
                {
                    BodyMaterial material = _bodyMaterials[brickBody];
                    foreach (MaterialCollision collision in e.Collisions)
                    {
                        if (collision.ContactNormalSpeed > material.MaxImpulse)
                        {
                            // This is the biggest force this brick has felt, paint it a shade of red
                            material.MaxImpulse = collision.ContactNormalSpeed;

                            byte red = Convert.ToByte(UtilityCore.GetScaledValue_Capped(material.OrigColor.R, 255, 0, MAXIMPULSE, material.MaxImpulse));		// increase red
                            byte green = Convert.ToByte(UtilityCore.GetScaledValue_Capped(0, material.OrigColor.G, MAXIMPULSE, 0, material.MaxImpulse));		// decrease green and blue
                            byte blue = Convert.ToByte(UtilityCore.GetScaledValue_Capped(0, material.OrigColor.B, MAXIMPULSE, 0, material.MaxImpulse));

                            material.Material.Brush = new SolidColorBrush(Color.FromArgb(255, red, green, blue));
                        }
                    }
                }
            }

            #endregion
        }