move to github
This commit is contained in:
20
SpacePew/Models/Weapons/Cannon.cs
Normal file
20
SpacePew/Models/Weapons/Cannon.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
namespace SpacePew.Models.Weapons
|
||||
{
|
||||
public class Cannon : WeaponBase
|
||||
{
|
||||
public override float HeatGeneration
|
||||
{
|
||||
get { return 0.4f; }
|
||||
}
|
||||
|
||||
public override int Delay
|
||||
{
|
||||
get { return 35; }
|
||||
}
|
||||
|
||||
public override int Spread
|
||||
{
|
||||
get { return 0; }
|
||||
}
|
||||
}
|
||||
}
|
20
SpacePew/Models/Weapons/ClusterLauncher.cs
Normal file
20
SpacePew/Models/Weapons/ClusterLauncher.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
namespace SpacePew.Models.Weapons
|
||||
{
|
||||
public class ClusterLauncher : WeaponBase
|
||||
{
|
||||
public override float HeatGeneration
|
||||
{
|
||||
get { return 100f; }
|
||||
}
|
||||
|
||||
public override int Delay
|
||||
{
|
||||
get { return 0; }
|
||||
}
|
||||
|
||||
public override int Spread
|
||||
{
|
||||
get { return 0; }
|
||||
}
|
||||
}
|
||||
}
|
13
SpacePew/Models/Weapons/IWeapon.cs
Normal file
13
SpacePew/Models/Weapons/IWeapon.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using SpacePew.Models.Projectiles;
|
||||
|
||||
namespace SpacePew.Models.Weapons
|
||||
{
|
||||
public interface IWeapon
|
||||
{
|
||||
int Delay { get; }
|
||||
int Spread { get; }
|
||||
float Heat { get; set; }
|
||||
float HeatGeneration { get; }
|
||||
void Fire(IProjectile projectile, Player player);
|
||||
}
|
||||
}
|
20
SpacePew/Models/Weapons/Launcher.cs
Normal file
20
SpacePew/Models/Weapons/Launcher.cs
Normal file
@@ -0,0 +1,20 @@
|
||||
namespace SpacePew.Models.Weapons
|
||||
{
|
||||
public class Launcher : WeaponBase
|
||||
{
|
||||
public override float HeatGeneration
|
||||
{
|
||||
get { return 100f; }
|
||||
}
|
||||
|
||||
public override int Delay
|
||||
{
|
||||
get { return 200; }
|
||||
}
|
||||
|
||||
public override int Spread
|
||||
{
|
||||
get { return 0; }
|
||||
}
|
||||
}
|
||||
}
|
24
SpacePew/Models/Weapons/SecondaryCannon.cs
Normal file
24
SpacePew/Models/Weapons/SecondaryCannon.cs
Normal file
@@ -0,0 +1,24 @@
|
||||
namespace SpacePew.Models.Weapons
|
||||
{
|
||||
/// <summary>
|
||||
/// A slower version of the cannon, should be used for powerful projectiles like the homing bullets to even things out
|
||||
/// </summary>
|
||||
public class SecondaryCannon : Cannon
|
||||
{
|
||||
public override float HeatGeneration
|
||||
{
|
||||
get
|
||||
{
|
||||
return 1f;
|
||||
}
|
||||
}
|
||||
|
||||
public override int Delay
|
||||
{
|
||||
get
|
||||
{
|
||||
return 80;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
64
SpacePew/Models/Weapons/TriCannon.cs
Normal file
64
SpacePew/Models/Weapons/TriCannon.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
|
||||
using Microsoft.Xna.Framework;
|
||||
using SpacePew.Models.Projectiles;
|
||||
|
||||
namespace SpacePew.Models.Weapons
|
||||
{
|
||||
public class TriCannon : WeaponBase
|
||||
{
|
||||
public override float HeatGeneration
|
||||
{
|
||||
get { return 0.8f; }
|
||||
}
|
||||
|
||||
public override int Delay
|
||||
{
|
||||
get { return 40; }
|
||||
}
|
||||
|
||||
public override int Spread
|
||||
{
|
||||
get { return 3; }
|
||||
}
|
||||
|
||||
public override void Fire(IProjectile projectile, Player player)
|
||||
{
|
||||
if (Heat + this.HeatGeneration > MaxHeat)
|
||||
return;
|
||||
|
||||
Heat += 1f * this.HeatGeneration;
|
||||
|
||||
if (_lastShot <= DateTime.Now.AddMilliseconds(-this.Delay - (Heat >= HeatStartAffectAt ? Heat : 0)))
|
||||
{
|
||||
float angle = player.Angle + (float)(Randomizer.Next(-Spread * 100, Spread * 100) / 9000.0);
|
||||
|
||||
InternalFire(projectile, player, angle - 0.15f);
|
||||
InternalFire(projectile, player, angle);
|
||||
InternalFire(projectile, player, angle + 0.15f);
|
||||
|
||||
_lastShot = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
private static void InternalFire(IProjectile projectile, IEntity player, float angle)
|
||||
{
|
||||
var entity = EntityFactory.Instance.CreateEntity<ProjectileBase>(
|
||||
projectile.GetType(),
|
||||
player.Owner,
|
||||
player.Position,
|
||||
new Vector2(),
|
||||
angle);
|
||||
|
||||
Matrix m = Matrix.CreateRotationZ(angle);
|
||||
Vector2 velocity = Vector2.Transform(-Vector2.UnitY, m);
|
||||
|
||||
entity.Position += velocity * (player.Origin.Y + entity.Origin.Y);
|
||||
entity.Velocity = velocity * projectile.Speed;
|
||||
|
||||
entity.Velocity = player.Velocity + entity.Velocity;
|
||||
|
||||
FiredShots.Enqueue(entity);
|
||||
}
|
||||
}
|
||||
}
|
82
SpacePew/Models/Weapons/WeaponBase.cs
Normal file
82
SpacePew/Models/Weapons/WeaponBase.cs
Normal file
@@ -0,0 +1,82 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using Microsoft.Xna.Framework;
|
||||
using SpacePew.Models.Projectiles;
|
||||
|
||||
namespace SpacePew.Models.Weapons
|
||||
{
|
||||
public abstract class WeaponBase : IWeapon
|
||||
{
|
||||
protected const int MaxHeat = 100;
|
||||
protected const int HeatStartAffectAt = MaxHeat / 2;
|
||||
|
||||
static WeaponBase()
|
||||
{
|
||||
FiredShots = new Queue<IProjectile>();
|
||||
}
|
||||
|
||||
public static Queue<IProjectile> FiredShots;
|
||||
|
||||
protected DateTime _lastShot;
|
||||
|
||||
private static Random _randomizer;
|
||||
|
||||
public static Random Randomizer
|
||||
{
|
||||
get { return _randomizer ?? (_randomizer = new Random()); }
|
||||
}
|
||||
|
||||
private float _heat;
|
||||
|
||||
protected WeaponBase()
|
||||
{
|
||||
_lastShot = DateTime.Now;
|
||||
}
|
||||
|
||||
public virtual float Heat
|
||||
{
|
||||
get { return _heat; }
|
||||
set { _heat = value; }
|
||||
}
|
||||
|
||||
#region IWeapon Members
|
||||
|
||||
public abstract float HeatGeneration { get; }
|
||||
public abstract int Delay { get; }
|
||||
public abstract int Spread { get; }
|
||||
|
||||
public virtual void Fire(IProjectile projectile, Player player)
|
||||
{
|
||||
if (_heat + this.HeatGeneration > MaxHeat)
|
||||
return;
|
||||
|
||||
_heat += 1f * this.HeatGeneration;
|
||||
|
||||
if (_lastShot <= DateTime.Now.AddMilliseconds(-this.Delay - (_heat >= HeatStartAffectAt ? _heat : 0)))
|
||||
{
|
||||
float angle = player.Angle + (float)(Randomizer.Next(-Spread * 100, Spread * 100) / 9000.0);
|
||||
|
||||
var entity = EntityFactory.Instance.CreateEntity<ProjectileBase>(
|
||||
projectile.GetType(),
|
||||
player.Owner,
|
||||
player.Position,
|
||||
new Vector2(),
|
||||
angle);
|
||||
|
||||
Matrix m = Matrix.CreateRotationZ(angle);
|
||||
Vector2 velocity = Vector2.Transform(-Vector2.UnitY, m);
|
||||
|
||||
entity.Position += velocity * (player.Origin.Y + entity.Origin.Y);
|
||||
entity.Velocity = velocity * projectile.Speed;
|
||||
|
||||
entity.Velocity = player.Velocity + entity.Velocity;
|
||||
FiredShots.Enqueue(entity);
|
||||
|
||||
_lastShot = DateTime.Now;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user