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 }