using System.Collections.Generic;
using System.Runtime.Serialization;
public static void Main()
SceneManager.Instance.Spawn(new Player());
public sealed class SceneManager
static SceneManager _instance;
public SceneManager Instance
get { return _instance ?? (_instance = new SceneManager()); }
List<GameEntity> _entities;
_entities = new List<GameEntity>();
_timer.Elapsed += WhenTimerElapsed;
public void Spawn(GameEntity entity)
void WhenTimerElapsed(object sender, EventArgs e)
foreach(var entity in _entities) { entity.Update(); }
public abstract class Component
internal static T Create<T>(GameEntity parent)
T component = (T)FormatterServices.GetUninitializedObject(typeof(T));
component.Parent = parent;
protected GameEntity Parent { get; private set; }
protected abstract void Initialize();
public static implicit operator GameEntity(Component component)
public virtual void Update()
Console.WriteLine("ComponentUpdated");
public sealed class EnemyBehaviour
protected override void Initialize()
if (!Parent.HasComponent<Attributes>())
Parent.AddComponent<Attributes>();
void DoDamage(GameEntity entity)
if(entity.HasComponent<Mortality>())
double damage = Parent.GetComponent<Attributes>().Strength * 1.3;
entity.GetComponent<Mortality>().DoDamage(damage);
public sealed class Attributes
get { return _strength; }
set { _strength = value; }
protected override void Initialize()
public sealed class Controller
protected override void Initialize()
public sealed class Dialogue
Dictionary<string, string> _dialogues;
protected override void Initialize()
_dialogues = new Dictionary<string, string>();
public string Echo(string message)
if(_dialogues.ContainsKey(message.ToLower()))
return _dialogues[message.ToLower()];
return "I dont know what you're talking about!";
public sealed class Mortality
get { return _maxHealth; }
set { _maxHealth = value; }
protected override void Initialize()
public void DoDamage(double damage)
public abstract class GameEntity
List<Component> _components;
_components = new List<Component>();
public T AddComponent<T>()
_components.Add(Component.Create<T>(this));
return (T)_components.Last();
public bool HasComponent<T>()
return _components.OfType<T>().Count() > 0;
public T GetComponent<T>()
return _components.OfType<T>().FirstOrDefault();
foreach(Component component in _components){ component.Update(); }
AddComponent<Mortality>();
AddComponent<Dialogue>();
AddComponent<Controller>();
AddComponent<EnemyBehaviour>();