package org.multiverseking.debug;
import com.simsilica.es.Entity;
import com.simsilica.es.EntityId;
import com.simsilica.es.EntitySet;
import org.hexgridapi.core.coordinate.HexCoordinate;
import org.multiverseking.field.exploration.component.AreaEventComponent;
import org.multiverseking.field.exploration.component.AreaEventComponent.Event;
import org.multiverseking.core.utility.EntitySystemAppState;
/**
* Handle all event in the area, as teleportation, starting point etc...
*
* @author roah
*/
public class DebugSystemState extends EntitySystemAppState {
private HexCoordinate startPosition;
@Override
protected EntitySet initialiseSystem() {
return entityData.getEntities(AreaEventComponent.class);
}
public HexCoordinate getStartPosition() {
return startPosition != null ? startPosition.clone() : null;
}
@Override
protected void updateSystem(float tpf) {
}
@Override
protected void addEntity(Entity e) {
register(e);
}
@Override
protected void updateEntity(Entity e) {
register(e);
}
private void register(Entity e) {
if (startPosition == null && e.get(AreaEventComponent.class).getEvents()
.contains(Event.Start)) {
startPosition = e.get(AreaEventComponent.class).getPosition();
}
}
@Override
protected void removeEntity(Entity e) {
}
public AreaEventComponent getValue(HexCoordinate inspectedTilePos) {
for (Entity e : entities) {
if (e.get(AreaEventComponent.class).getPosition().equals(inspectedTilePos)) {
return e.get(AreaEventComponent.class);
}
}
return null;
}
public void updateEvent(HexCoordinate inspectedTilePos, AreaEventComponent.Event event, boolean add) {
Entity entity = null;
for (Entity e : entities) {
if (e.get(AreaEventComponent.class).getPosition().equals(inspectedTilePos)) {
entity = e;
}
}
if (add) {
if (event.equals(Event.Start) && startPosition != null) {
if (startPosition.equals(inspectedTilePos)) {
return;
}
for (Entity e : entities) {
if (e.get(AreaEventComponent.class).getPosition().equals(startPosition)) {
AreaEventComponent comp = e.get(AreaEventComponent.class)
.cloneAndRemove(event);
if (comp == null) {
entityData.removeComponent(e.getId(), AreaEventComponent.class);
} else {
e.set(comp);
// entityData.setComponent(e.getId(), comp);
}
startPosition = inspectedTilePos;
break;
}
}
} else if (event.equals(Event.Start)) {
startPosition = inspectedTilePos;
}
if (entity != null) {
entity.set(entity.get(AreaEventComponent.class).cloneAndAdd(event));
// entityData.setComponent(entity.getId(), entity.get(
// AreaEventComponent.class).cloneAndAdd(event));
} else {
EntityId id = entityData.createEntity();
entityData.setComponent(id, new AreaEventComponent(inspectedTilePos, event));
}
} else {
if (entity != null) {
AreaEventComponent comp = entity.get(AreaEventComponent.class).cloneAndRemove(event);
if (comp == null) {
entityData.removeComponent(entity.getId(), AreaEventComponent.class);
} else {
entity.set(comp);
// entityData.setComponent(entity.getId(), comp);
}
}
if (event.equals(Event.Start) && startPosition != null) {
startPosition = null;
}
}
}
@Override
protected void cleanupSystem() {
}
}