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); } }