package org.archstudio.bna.logics.background;
import java.util.List;
import org.archstudio.bna.IBNAModel;
import org.archstudio.bna.IBNAWorld;
import org.archstudio.bna.IThing;
import org.archstudio.bna.IThingLogicManager;
import org.archstudio.bna.facets.IHasLife;
import org.archstudio.bna.logics.AbstractThingLogic;
import org.archstudio.bna.logics.tracking.ThingValueTrackingLogic;
import org.archstudio.bna.utils.BNAUtils;
import org.archstudio.sysutils.Finally;
import com.google.common.collect.Lists;
public final class LifeSapperLogic extends AbstractThingLogic {
private static List<LifeSapperLogic> instances = Lists.newCopyOnWriteArrayList();
private static Thread updater;
static {
updater = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(125);
}
catch (InterruptedException e) {
}
try (Finally lock = BNAUtils.lock()) {
for (LifeSapperLogic instance : instances) {
IBNAWorld world = instance.world;
IBNAModel model = world.getBNAModel();
IThingLogicManager logics = world.getThingLogicManager();
ThingValueTrackingLogic valuesLogic = logics.addThingLogic(ThingValueTrackingLogic.class);
for (IThing t : valuesLogic.getThings(IHasLife.LIFE_KEY)) {
Integer life = t.get(IHasLife.LIFE_KEY);
if (life == null || life.intValue() <= 0) {
model.removeThingAndChildren(t);
continue;
}
t.set(IHasLife.LIFE_KEY, life.intValue() - 125);
}
}
}
}
}
});
updater.setName(LifeSapperLogic.class.getName());
updater.setDaemon(true);
updater.start();
}
public LifeSapperLogic(IBNAWorld world) {
super(world);
instances.add(this);
}
@Override
public void dispose() {
BNAUtils.checkLock();
instances.remove(this);
super.dispose();
}
}