package com.galvarez.ttw.model;
import static java.lang.Math.min;
import static java.util.stream.Collectors.toList;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.EntitySystem;
import com.artemis.annotations.Wire;
import com.artemis.utils.ImmutableBag;
import com.galvarez.ttw.model.components.Discoveries;
import com.galvarez.ttw.model.components.Policies;
import com.galvarez.ttw.model.data.Discovery;
import com.galvarez.ttw.model.data.Policy;
/**
* For every empire, handle policies changes.
* <p>
* When changing a policy, the stability decreases. It increases slowly over
* time.
* </p>
*
* @author Guillaume Alvarez
*/
@Wire
public final class PoliciesSystem extends EntitySystem {
private static final int STABILITY_LOSS_WHEN_SWITCHING = 20;
@SuppressWarnings("unused")
private static final Logger log = LoggerFactory.getLogger(PoliciesSystem.class);
private ComponentMapper<Policies> policies;
private ComponentMapper<Discoveries> discoveries;
private EffectsSystem effects;
@SuppressWarnings("unchecked")
public PoliciesSystem() {
super(Aspect.getAspectForAll(Policies.class));
}
@Override
protected boolean checkProcessing() {
return true;
}
@Override
protected void processEntities(ImmutableBag<Entity> entities) {
for (Entity entity : entities) {
Policies empire = policies.get(entity);
if (empire.stability < empire.stabilityMax)
empire.stability = min(empire.stabilityMax, empire.stability + empire.stabilityGrowth);
else if (empire.stability > empire.stabilityMax)
// decrease only one at a time
empire.stability--;
}
}
public void applyPolicy(Entity entity, Policy policy, Discovery selected) {
Policies empire = policies.get(entity);
Discovery old = empire.policies.put(policy, selected);
if (old != null) {
effects.apply(old.effects, entity, true);
empire.stability -= STABILITY_LOSS_WHEN_SWITCHING;
}
if (selected != null) {
effects.apply(selected.effects, entity, false);
}
}
public List<Discovery> getAvailablePolicies(Entity empire, Policy choice) {
return discoveries.get(empire).done.stream().filter(d -> d.groups.contains(choice.name())).collect(toList());
}
public static Set<Policy> getPolicies(Discovery d) {
Set<Policy> set = null;
for (String group : d.groups) {
Policy p = Policy.get(group);
if (p != null) {
if (set == null)
set = EnumSet.of(p);
else
set.add(p);
}
}
return set;
}
}