1 module artemisd.managers.groupmanager; 2 3 import artemisd.entity; 4 import artemisd.manager; 5 import artemisd.utils.bag; 6 import artemisd.utils.type; 7 import artemisd.utils.ext; 8 9 public class GroupManager : Manager { 10 11 mixin TypeDecl; 12 13 private Bag!Entity[string] entitiesByGroup; 14 private Bag!string[Entity] groupsByEntity; 15 16 protected override void initialize() { 17 } 18 19 public void add(Entity e, string group) { 20 auto entities = entitiesByGroup.getWithDefault(group, new Bag!Entity); 21 entities.add(e); 22 23 auto groups = groupsByEntity.getWithDefault(e, new Bag!string); 24 groups.add(group); 25 } 26 27 public void remove(Entity e, string group) { 28 Bag!Entity* entities = group in entitiesByGroup; 29 if(entities) { 30 entities.remove(e); 31 } 32 33 Bag!string* groups = e in groupsByEntity; 34 if(groups) { 35 groups.remove(group); 36 } 37 } 38 39 public void removeFromAllGroups(Entity e) { 40 Bag!string* groups = e in groupsByEntity; 41 if(groups != null) { 42 for(int i = 0; groups.size() > i; i++) { 43 Bag!Entity* entities = groups.get(i) in entitiesByGroup; 44 if(entities != null) { 45 entities.remove(e); 46 } 47 } 48 groups.clear(); 49 } 50 } 51 52 public Bag!Entity getEntities(string group) { 53 return entitiesByGroup.getWithDefault(group, new Bag!Entity); 54 } 55 56 public Bag!string getGroups(Entity e) { 57 auto group = e in groupsByEntity; 58 return group ? *group : null; 59 } 60 61 public bool isInAnyGroup(Entity e) { 62 auto groups = getGroups(e); 63 return groups !is null && groups.size > 0; 64 } 65 66 public bool isInGroup(Entity e, string group) { 67 auto groups = e in groupsByEntity; 68 return groups ? groups.contains(group) : false; 69 } 70 71 public override void deleted(Entity e) { 72 removeFromAllGroups(e); 73 } 74 } 75 76 unittest 77 { 78 GroupManager gm = new GroupManager; 79 import artemisd.world; 80 World w = new World; 81 Entity e = w.createEntity(); 82 gm.add(e,"g1"); 83 gm.add(e,"g2"); 84 assert(gm.isInGroup(e, "g1")); 85 assert(gm.isInGroup(e, "g2")); 86 assert(gm.isInAnyGroup(e)); 87 assert(gm.getGroups(e).toString() == "[g1,g2]"); 88 89 gm.remove(e,"g2"); 90 assert(gm.isInGroup(e, "g1")); 91 assert(!gm.isInGroup(e, "g2")); 92 assert(gm.isInAnyGroup(e)); 93 assert(gm.getGroups(e).toString() == "[g1]"); 94 95 gm.remove(e,"g1"); 96 assert(!gm.isInGroup(e, "g1")); 97 assert(!gm.isInGroup(e, "g2")); 98 assert(!gm.isInAnyGroup(e)); 99 assert(gm.getGroups(e).toString() == "[]"); 100 101 gm.add(e,"g1"); 102 gm.add(e,"g2"); 103 assert(gm.isInGroup(e, "g1")); 104 assert(gm.isInGroup(e, "g2")); 105 assert(gm.isInAnyGroup(e)); 106 gm.removeFromAllGroups(e); 107 assert(!gm.isInGroup(e, "g1")); 108 assert(!gm.isInGroup(e, "g2")); 109 assert(!gm.isInAnyGroup(e)); 110 }