package com.galvarez.ttw.model; import java.util.Map.Entry; 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.annotations.Wire; import com.artemis.systems.EntityProcessingSystem; import com.galvarez.ttw.model.components.AIControlled; import com.galvarez.ttw.model.components.Discoveries; import com.galvarez.ttw.model.components.Policies; import com.galvarez.ttw.model.components.Research; import com.galvarez.ttw.model.data.Culture; import com.galvarez.ttw.model.data.Discovery; import com.galvarez.ttw.model.data.Empire; import com.galvarez.ttw.model.data.Policy; import com.galvarez.ttw.rendering.components.Name; @Wire public final class AIDiscoverySystem extends EntityProcessingSystem { private static final Logger log = LoggerFactory.getLogger(AIDiscoverySystem.class); private ComponentMapper<Policies> policies; private ComponentMapper<Empire> empires; private DiscoverySystem system; @SuppressWarnings("unchecked") public AIDiscoverySystem() { super(Aspect.getAspectForAll(AIControlled.class, Discoveries.class, Empire.class)); } @Override protected boolean checkProcessing() { return false; } @Override protected void process(Entity e) { // should not be called, selectNewDiscovery will be called when an event // triggers a discovery } public void selectNewDiscovery(Entity empire, Discoveries lab) { Culture culture = empires.get(empire).culture; Entry<Faction, Research> prefered = null; float max = Float.NEGATIVE_INFINITY; for (Entry<Faction, Research> possible : lab.nextPossible.entrySet()) { Faction faction = possible.getKey(); float score = culture.ai.get(faction) * possible.getValue().target.factions.get(faction, 1); if (score > max) { max = score; prefered = possible; } } if (prefered != null) { log.debug("{} follows {} advice to investigate {} from {}", empire.getComponent(Name.class), prefered.getKey(), prefered.getValue().target, prefered.getValue().previous); system.discoverNew(empire, lab, prefered.getValue()); } Set<Policy> newPolicies; if (lab.last != null && (newPolicies = PoliciesSystem.getPolicies(lab.last.target)) != null) { Policies empirePolicies = policies.get(empire); for (Policy p : newPolicies) { Discovery newD = lab.last.target; Discovery oldD = empirePolicies.policies.get(p); float oldScore = policyScore(oldD, culture); float newScore = policyScore(newD, culture); if (newScore > oldScore) { log.info("{} replaced policy {}={}(score={}) by {}(score={})", empire.getComponent(Name.class), p, oldD, oldScore, newD, newScore); empirePolicies.policies.put(p, newD); } else log.debug("{} did not replace policy {}={}(score={}) by {}(score={})", empire.getComponent(Name.class), p, oldD, oldScore, newD, newScore); } } } private static float policyScore(Discovery d, Culture culture) { if (d == null) return 0f; float score = 0f; for (Faction f : Faction.values()) score += d.factions.get(f, 0f) * culture.ai.get(f).floatValue(); return score; } }