package games.strategy.triplea.delegate; import java.util.ArrayList; import java.util.Collection; import games.strategy.engine.data.Change; import games.strategy.engine.data.GameData; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.TechnologyFrontier; import games.strategy.engine.data.changefactory.ChangeFactory; import games.strategy.engine.delegate.IDelegateBridge; import games.strategy.triplea.attachments.TechAttachment; /** * Tracks which players have which technology advances. */ public class TechTracker implements java.io.Serializable { private static final long serialVersionUID = 4705039229340373735L; /** Creates new TechTracker. */ public TechTracker() {} /** * Returns what tech advances this player already has successfully researched (including ones that may not be in their * tech frontier). */ public static Collection<TechAdvance> getCurrentTechAdvances(final PlayerID id, final GameData data) { final Collection<TechAdvance> rVal = new ArrayList<>(); final TechAttachment attachment = TechAttachment.get(id); // search all techs for (final TechAdvance ta : TechAdvance.getTechAdvances(data)) { if (ta.hasTech(attachment)) { rVal.add(ta); } } return rVal; } /** * Returns what tech categories are no longer available for this player, because all techs in them have been * successfully researched * already. */ public static Collection<TechnologyFrontier> getFullyResearchedPlayerTechCategories(final GameData data, final PlayerID id) { final Collection<TechnologyFrontier> rVal = new ArrayList<>(); final TechAttachment attachment = TechAttachment.get(id); for (final TechnologyFrontier tf : TechAdvance.getPlayerTechCategories(data, id)) { boolean has = true; for (final TechAdvance t : tf.getTechs()) { has = t.hasTech(attachment); if (!has) { break; } } if (has) { rVal.add(tf); } } return rVal; } public static synchronized void addAdvance(final PlayerID player, final IDelegateBridge bridge, final TechAdvance advance) { Change attachmentChange; if (advance instanceof GenericTechAdvance && ((GenericTechAdvance) advance).getAdvance() == null) { attachmentChange = ChangeFactory.genericTechChange(TechAttachment.get(player), true, advance.getProperty()); } else { attachmentChange = ChangeFactory.attachmentPropertyChange(TechAttachment.get(player), "true", advance.getProperty()); } bridge.addChange(attachmentChange); advance.perform(player, bridge); } public static synchronized void removeAdvance(final PlayerID player, final IDelegateBridge bridge, final TechAdvance advance) { Change attachmentChange; if (advance instanceof GenericTechAdvance) { if (((GenericTechAdvance) advance).getAdvance() == null) { attachmentChange = ChangeFactory.genericTechChange(TechAttachment.get(player), false, advance.getProperty()); } else { attachmentChange = ChangeFactory.attachmentPropertyChange(TechAttachment.get(player), "false", advance.getProperty()); } } else { attachmentChange = ChangeFactory.attachmentPropertyChange(TechAttachment.get(player), "false", advance.getProperty()); } bridge.addChange(attachmentChange); } public static int getTechCost(final PlayerID id) { final TechAttachment ta = TechAttachment.get(id); return ta.getTechCost(); } public static boolean hasLongRangeAir(final PlayerID player) { return TechAttachment.get(player).getLongRangeAir(); } public static boolean hasHeavyBomber(final PlayerID player) { return TechAttachment.get(player).getHeavyBomber(); } public static boolean hasSuperSubs(final PlayerID player) { return TechAttachment.get(player).getSuperSub(); } public static boolean hasJetFighter(final PlayerID player) { return TechAttachment.get(player).getJetPower(); } public static boolean hasRocket(final PlayerID player) { return TechAttachment.get(player).getRocket(); } public static boolean hasIndustrialTechnology(final PlayerID player) { return TechAttachment.get(player).getIndustrialTechnology(); } public static boolean hasImprovedArtillerySupport(final PlayerID player) { return TechAttachment.get(player).getImprovedArtillerySupport(); } public static boolean hasParatroopers(final PlayerID player) { return TechAttachment.get(player).getParatroopers(); } public static boolean hasIncreasedFactoryProduction(final PlayerID player) { return TechAttachment.get(player).getIncreasedFactoryProduction(); } public static boolean hasAARadar(final PlayerID player) { return TechAttachment.get(player).getAARadar(); } }