package com.siondream.core.entity.systems;
import java.util.Iterator;
import com.badlogic.gdx.utils.Logger;
import com.badlogic.gdx.utils.ObjectMap;
import com.siondream.core.Env;
import ashley.core.Engine;
import ashley.core.Entity;
import ashley.core.EntityListener;
import ashley.core.EntitySystem;
import ashley.core.Family;
import ashley.utils.IntMap;
public class GroupSystem extends EntitySystem implements EntityListener {
private static final String TAG = "GroupSystem";
private Logger logger;
private IntMap<Entity> entities;
private ObjectMap<String, IntMap<Entity>> groups;
private Family family;
private IntMap<Entity> emptyGroup;
public GroupSystem() {
super();
logger = new Logger(TAG, Env.debugLevel);
logger.info("initialising");
groups = new ObjectMap<String, IntMap<Entity>>();
family = Family.getFamilyFor();
emptyGroup = new IntMap<Entity>();
Env.game.getEngine().addEntityListener(this);
}
@Override
public void addedToEngine(Engine engine) {
entities = engine.getEntitiesFor(family);
}
@Override
public void removedFromEngine(Engine engine) {
entities = null;
}
@Override
public void update(float deltaTime) {
Iterator<String> groupIt = groups.keys().iterator();
while(groupIt.hasNext()) {
IntMap<Entity> groupEntities = groups.get(groupIt.next());
Iterator<Entity> entityIt = groupEntities.values().iterator();
while (entityIt.hasNext()) {
if (!entities.containsValue(entityIt.next(), false)) {
entityIt.remove();
}
}
if (groupEntities.size == 0) {
groupIt.remove();
}
}
}
public IntMap<Entity> getGroup(String name) {
IntMap<Entity> group = groups.get(name, emptyGroup);
if (group == emptyGroup) {
logger.error("group " + name + " doesn't exist");
}
return group;
}
public void register(Entity entity, String name) {
if (!entities.containsValue(entity, false)) {
logger.error("entity " + entity + " is not registered in engine");
return;
}
logger.info("registering entity " + entity + " in group " + name);
IntMap<Entity> group = groups.get(name, null);
if (group == null) {
group = new IntMap<Entity>();
groups.put(name, group);
}
group.put(entity.getIndex(), entity);
}
public void unregister(Entity entity, String name) {
IntMap<Entity> group = getGroup(name);
if (group != emptyGroup) {
logger.info("unregistering entity " + entity + " from group " + name);
group.remove(entity.getIndex());
if (group.size == 0) {
groups.remove(name);
}
}
}
public void unregister(Entity entity) {
logger.info("unregistering entity " + entity + " from all groups");
Iterator<String> groupIt = groups.keys().iterator();
while(groupIt.hasNext()) {
IntMap<Entity> groupEntities = groups.get(groupIt.next());
Iterator<Entity> entityIt = groupEntities.values().iterator();
while (entityIt.hasNext()) {
if (entity == entityIt.next()) {
entityIt.remove();
}
}
if (groupEntities.size == 0) {
groupIt.remove();
}
}
}
public void clear(String name) {
groups.remove(name);
}
public void clear() {
groups.clear();
}
@Override
public void entityAdded(Entity entity) {
// TODO Auto-generated method stub
}
@Override
public void entityRemoved(Entity entity) {
unregister(entity);
}
}