1 module artemisd.entity;
2 
3 import std.uuid;
4 import std.bitmanip;
5 import std.conv;
6 import artemisd.utils.bag;
7 import artemisd.world;
8 import artemisd.entitymanager;
9 import artemisd.component;
10 import artemisd.componentmanager;
11 import artemisd.entitysystem;
12 
13 final class Entity 
14 {
15     private UUID uuid;
16 
17     private int id;
18     private BitArray componentBits;
19     private BitArray systemBits;
20 
21     private World world;
22     private EntityManager entityManager;
23     private ComponentManager componentManager;
24     
25     this(World world, int id) 
26     {
27         this.world = world;
28         this.id = id;
29         this.entityManager = world.getEntityManager();
30         this.componentManager = world.getComponentManager();
31     
32         reset();
33     }
34 
35     public int getId() 
36     {
37         return id;
38     }
39 
40     BitArray getComponentBits() 
41     {
42         return componentBits;
43     }
44     
45     BitArray getSystemBits() 
46     {
47         return systemBits;
48     }
49 
50     void reset() 
51     {
52         clearComponents();
53         systemBits.length = EntitySystem.TypeNum;
54         systemBits ^= systemBits;
55         uuid = randomUUID();
56     }
57 
58     void clearComponents()
59     {
60         componentBits.length = Component.TypeNum;
61         componentBits ^= componentBits;
62     }
63 
64     override string toString() 
65     {
66         return "Entity[" ~ to!string(uuid) ~ "(" ~ to!string(id) ~ ")]";
67     }
68 
69     Entity addComponent(T)(T component) 
70         if( is(T:Component) )
71     {
72         componentManager.addComponent!T(this,  component);
73         return this;
74     }
75 
76     Entity removeComponent(T)() 
77     {
78         componentManager.removeComponent!T(this);
79         return this;
80     }
81 
82     bool isActive() 
83     {
84         return entityManager.isActive(id);
85     }
86     
87     bool isEnabled() 
88     {
89         return entityManager.isEnabled(id);
90     }
91     
92     T getComponent(T)()
93     {
94         return componentManager.getComponent!T(this);
95     }
96 
97     Bag!Component getComponents(Bag!Component fillBag) 
98     {
99         return componentManager.getComponentsFor(this, fillBag);
100     }
101 
102     void addToWorld() 
103     {
104         world.addEntity(this);
105     }
106     
107     void changedInWorld() 
108     {
109         world.changedEntity(this);
110     }
111 
112     void deleteFromWorld() 
113     {
114         world.deleteEntity(this);
115     }
116     
117     void enable() 
118     {
119         world.enable(this);
120     }
121     
122     void disable() 
123     {
124         world.disable(this);
125     }
126     
127     UUID getUuid() 
128     {
129         return uuid;
130     }
131 
132     World getWorld() 
133     {
134         return world;
135     }
136 }