Example #1
0
        protected ProjectileWeapon(ProjectileWeaponData data, PhysicalUnit owner)
            : base(TimeSpan.FromSeconds(1.0 / data.FireRate), owner)
        {
            _name = data.Name;
            _projectilesPerFire = data.ProjectilesPerFire;
            _projectileInfo = data.ProjectileInfo;
            _spread = data.Spread;

            _contactEffect = _projectileInfo.ContactEffect == null ?
                ProjectileEffect.NullEffect : new ProjectileEffect(_projectileInfo.ContactEffect);
            _proximityEffect = _projectileInfo.ProximityEffect == null ?
                 ProjectileEffect.NullEffect : new ProjectileEffect(_projectileInfo.ProximityEffect);
            _destinationEffect = _projectileInfo.DestinationEffect == null ?
                ProjectileEffect.NullEffect : new ProjectileEffect(_projectileInfo.DestinationEffect);

            _fireParticleEffect = data.FireParticleEffectName == null ?
                null : new ParticleEffect(data.FireParticleEffectName);
            float maxProjLife = data.ProjectileInfo.SecondsToLive +
                Math.Max((float)_contactEffect.Duration.TotalSeconds, (float)_destinationEffect.Duration.TotalSeconds);
            float maxProjectiles = data.FireRate * maxProjLife * data.ProjectilesPerFire;
            maxProjectiles = Math.Max(maxProjectiles, _projectilesPerFire);
            _projectiles = new Projectile[(int)maxProjectiles + 1];
            for (int i = 0; i < _projectiles.Length; i++)
            {
                _projectiles[i] = new Projectile(data.ProjectileInfo.SpriteName);
            }
        }
        protected ProjectileWeapon(ProjectileWeaponData data, PhysicalUnit owner)
            : base(TimeSpan.FromSeconds(1.0 / data.FireRate), 
                  data.MaxAmmo,
                  data.AmmoConsumption,
                  owner)
        {
            _maxProjectiles = data.MaxProjectiles;
            _projectiles = new Projectile[_maxProjectiles];
            for (int i = 0; i < _maxProjectiles; i++)
            {
                _projectiles[i] = new Projectile();
                _projectiles[i].ProjectileSprite = new Sprite(data.ProjectileSpriteName);
            }
            _projectileDamage = data.Damage;
            _projectileForce = data.ProjectileForce;
            _recoilForce = data.Recoil;
            _projectileSpeed = data.ProjectileSpeed;
            _projectileAcceleration = data.ProjectileAcceleration;
            _dissipateOnHit = data.DissipateOnHit;
            _projectileSpread = MathHelper.ToRadians(data.ProjectileSpread);
            _projectilesPerFire = data.ProjectilesPerFire;
            _projectileLife = data.ProjectileLife;

            _splashDamage = data.SplashDamage;
            _splashRadius = data.SplashRadius;
            _splashForce = data.SplashForce;

            Sprite projectileSprite = _projectiles[0].ProjectileSprite;

            if (projectileSprite.Width <= _splashRadius * 2)
            {
                _splashScaleRate = (projectileSprite.Width / _splashRadius);
                _splashScaleRate /= (float)projectileSprite.FullAnimationTime.TotalSeconds;
            }

            _hitDetectionRect = new Rectangle(0,0,
               (int)(projectileSprite.Width), (int)projectileSprite.Height);

            if (data.MovementParticleEffect != null)
                _movementParticleEffect = new ParticleEffect(data.MovementParticleEffect);
            if (data.SplashParticleEffect != null)
                _splashParticleEffect = new ParticleEffect(data.SplashParticleEffect);
        }
 protected virtual void initializeProjectile(Projectile p, Vector2 fireDirection)
 {
     p.Active = true;
     p.Angle = XnaHelper.RadiansFromVector(fireDirection);
     p.LifeLeft = _projectileLife;
     p.Position = _owner.Center;
     p.Velocity = fireDirection * _projectileSpeed;
     p.ProjectileSprite.Reset();
 }
 protected virtual void applyProjectileHit(Projectile p, PhysicalUnit unit)
 {
     unit.ApplyForce(p.Velocity / p.Velocity.Length() * _projectileForce);
     unit.ApplyDamage(_projectileDamage);
     if (_dissipateOnHit)
         p.Active = false;
     if (_splashRadius > 0)
     {
         p.ReadyToSplash = true;
         p.Velocity = Vector2.Zero;
         p.ProjectileSprite.PlayAnimation(1);
     }
 }