public virtual bool IsSatisified(Player player) { return false; }
public class HasKills : Condition
public HasKills(int kills) => Kills = kills;
public override bool IsSatisified(Player player)
return player.kills >= Kills;
public class HasName : Condition
public HasName(string name) => Name = name;
public override bool IsSatisified(Player player)
return player.name.Equals(Name);
public class HasPosition : Condition
public HasPosition(Vector3 point) => Point = point;
public override bool IsSatisified(Player player)
return player.position == Point;
public Vector3(float x,float y,float z) {this.x=x;this.y=y;this.z=z;}
public static bool operator ==(Vector3 v1, Vector3 v2) { return v1.x == v2.x && v1.y == v2.y && v1.z == v2.z; }
public static bool operator !=(Vector3 v1, Vector3 v2) { return !(v1==v2); }
public override int GetHashCode()
return (int)(this.x + this.y + this.z);
public override bool Equals(object obj)
return this == (Vector3)obj;
public string name = "Player";
public static void Main()
var player = new Player();
var killsTest = new HasKills(5);
var nameTest = new HasName("Foo");
var posTest = new HasPosition(new Vector3(1,2,3));
Console.WriteLine("KillsTest(1): " + killsTest.IsSatisified(player));
Console.WriteLine("KillsTest(2): " + killsTest.IsSatisified(player));
Console.WriteLine("NameTest(1): " + nameTest.IsSatisified(player));
Console.WriteLine("NameTest(2): " + nameTest.IsSatisified(player));
Console.WriteLine("posTest(1): " + posTest.IsSatisified(player));
player.position = new Vector3(1,2,3);
Console.WriteLine("posTest(2): " + posTest.IsSatisified(player));