1 module cat.wheel.ecs;
2 
3 import cat.wheel.events;
4 
5 /**
6  * A handler for an Entity-Component System, which manages entities and components allowing delegates to be registered from them to
7  * the main handler.
8  */
9 class ECSHandler {
10 
11     /**
12      * Construct a new ECS handler with no entities
13      * Params:
14      *   handler = The handler to register this ECS to
15      */
16     this(Handler handler) {
17         _handler = handler;
18     }
19 
20     /**
21      * Register a delegate to the linked handler
22      * Params:
23      *   del = The delegate to register
24      *   event = The event to run the delegate on
25      */
26     void register(void delegate(EventArgs) del, int event) {
27         _handler.addDelegate(del, event);
28     }
29 
30     /**
31      * Creates a new entity object, managed by this handler
32      * Returns: The created entity
33      */
34     Entity createEntity() {
35         auto e = new Entity();
36         _entities ~= e;
37         return e;
38     }
39 
40     Entity[] entities() {
41         return _entities.dup;
42     }
43 
44 private:
45     Handler _handler;
46 
47     Entity[] _entities;
48 }
49 
50 class Entity {
51     public Component[TypeInfo] components;
52 }
53 
54 class Component {
55 
56     this(ECSHandler handler, Entity e) {
57         _handler = handler;
58         entity = e;
59     }
60 
61     void register(void delegate(EventArgs) del, int event) {
62         _handler.register(del, event);
63     }
64 
65 protected:
66     Entity entity;
67 
68     ECSHandler _handler;
69 }