package games.strategy.triplea.attachments;
import java.util.HashMap;
import java.util.Map;
import games.strategy.engine.data.Attachable;
import games.strategy.engine.data.DefaultAttachment;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.GameParseException;
import games.strategy.engine.data.PlayerID;
import games.strategy.engine.data.annotations.GameProperty;
import games.strategy.engine.data.annotations.InternalDoNotExport;
import games.strategy.triplea.Constants;
import games.strategy.triplea.MapSupport;
import games.strategy.triplea.delegate.GenericTechAdvance;
import games.strategy.triplea.delegate.TechAdvance;
@MapSupport
public class TechAttachment extends DefaultAttachment {
private static final long serialVersionUID = -8780929085456199961L;
// attaches to a PlayerID
public static TechAttachment get(final PlayerID id) {
final TechAttachment attachment = id.getTechAttachment();
// dont crash, as a map xml may not set the tech attachment for all players, so just create a new tech attachment
// for them
if (attachment == null) {
return new TechAttachment();
}
return attachment;
}
public static TechAttachment get(final PlayerID id, final String nameOfAttachment) {
if (!nameOfAttachment.equals(Constants.TECH_ATTACHMENT_NAME)) {
throw new IllegalStateException(
"TechAttachment may not yet get attachments not named:" + Constants.TECH_ATTACHMENT_NAME);
}
final TechAttachment attachment = (TechAttachment) id.getAttachment(nameOfAttachment);
// dont crash, as a map xml may not set the tech attachment for all players, so just create a new tech attachment
// for them
if (attachment == null) {
return new TechAttachment();
}
return attachment;
}
private int techCost = 5;
private boolean heavyBomber = false;
private boolean longRangeAir = false;
private boolean jetPower = false;
private boolean rocket = false;
private boolean industrialTechnology = false;
private boolean superSub = false;
private boolean destroyerBombard = false;
private boolean improvedArtillerySupport = false;
private boolean paratroopers = false;
private boolean increasedFactoryProduction = false;
private boolean warBonds = false;
private boolean mechanizedInfantry = false;
private boolean aARadar = false;
private boolean shipyards = false;
// do not export at this point. currently map xml cannot
// define a player having a custom tech at start of game
@InternalDoNotExport
private Map<String, Boolean> genericTech = new HashMap<>();
public TechAttachment(final String name, final Attachable attachable, final GameData gameData) {
super(name, attachable, gameData);
setGenericTechs();
}
/**
* @deprecated Since many maps do not include a tech attachment for each player (and no maps include tech attachments
* for the Null
* Player),
* we must ensure a default tech attachment is available for all these players. It is preferred to use the
* full
* constructor. Do not delete
* this.
* TODO: create tech attachments all players that don't have one, as the map is initialized.
*/
@Deprecated
public TechAttachment() {
super(Constants.TECH_ATTACHMENT_NAME, null, null);
// TODO: not having game data, and not having generic techs, causes problems. Fix by creating real tech attachments
// for all players who
// are missing them, at the beginning of the game.
}
// setters
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setTechCost(final String s) {
techCost = getInt(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setTechCost(final Integer s) {
techCost = s;
}
public void resetTechCost() {
techCost = 5;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setHeavyBomber(final String s) {
heavyBomber = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setHeavyBomber(final Boolean s) {
heavyBomber = s;
}
public void resetHeavyBomber() {
heavyBomber = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setDestroyerBombard(final String s) {
destroyerBombard = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setDestroyerBombard(final Boolean s) {
destroyerBombard = s;
}
public void resetDestroyerBombard() {
destroyerBombard = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setLongRangeAir(final String s) {
longRangeAir = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setLongRangeAir(final Boolean s) {
longRangeAir = s;
}
public void resetLongRangeAir() {
longRangeAir = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setJetPower(final String s) {
jetPower = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setJetPower(final Boolean s) {
jetPower = s;
}
public void resetJetPower() {
jetPower = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setRocket(final String s) {
rocket = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setRocket(final Boolean s) {
rocket = s;
}
public void resetRocket() {
rocket = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setIndustrialTechnology(final String s) {
industrialTechnology = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setIndustrialTechnology(final Boolean s) {
industrialTechnology = s;
}
public void resetIndustrialTechnology() {
industrialTechnology = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setSuperSub(final String s) {
superSub = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setSuperSub(final Boolean s) {
superSub = s;
}
public void resetSuperSub() {
superSub = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setImprovedArtillerySupport(final String s) {
improvedArtillerySupport = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setImprovedArtillerySupport(final Boolean s) {
improvedArtillerySupport = s;
}
public void resetImprovedArtillerySupport() {
improvedArtillerySupport = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setParatroopers(final String s) {
paratroopers = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setParatroopers(final Boolean s) {
paratroopers = s;
}
public void resetParatroopers() {
paratroopers = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setIncreasedFactoryProduction(final String s) {
increasedFactoryProduction = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setIncreasedFactoryProduction(final Boolean s) {
increasedFactoryProduction = s;
}
public void resetIncreasedFactoryProduction() {
increasedFactoryProduction = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setWarBonds(final String s) {
warBonds = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setWarBonds(final Boolean s) {
warBonds = s;
}
public void resetWarBonds() {
warBonds = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setMechanizedInfantry(final String s) {
mechanizedInfantry = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setMechanizedInfantry(final Boolean s) {
mechanizedInfantry = s;
}
public void resetMechanizedInfantry() {
mechanizedInfantry = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setAARadar(final String s) {
aARadar = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setAARadar(final Boolean s) {
aARadar = s;
}
public void resetAARadar() {
aARadar = false;
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setShipyards(final String s) {
shipyards = getBool(s);
}
@GameProperty(xmlProperty = true, gameProperty = true, adds = false)
public void setShipyards(final Boolean s) {
shipyards = s;
}
public void resetShipyards() {
shipyards = false;
}
// getters
public int getTechCost() {
return techCost;
}
public boolean getHeavyBomber() {
return heavyBomber;
}
public boolean getLongRangeAir() {
return longRangeAir;
}
public boolean getJetPower() {
return jetPower;
}
public boolean getRocket() {
return rocket;
}
public boolean getIndustrialTechnology() {
return industrialTechnology;
}
public boolean getSuperSub() {
return superSub;
}
public boolean getDestroyerBombard() {
return destroyerBombard;
}
public boolean getImprovedArtillerySupport() {
return improvedArtillerySupport;
}
public boolean getParatroopers() {
return paratroopers;
}
public boolean getIncreasedFactoryProduction() {
return increasedFactoryProduction;
}
public boolean getWarBonds() {
return warBonds;
}
public boolean getMechanizedInfantry() {
return mechanizedInfantry;
}
public boolean getAARadar() {
return aARadar;
}
public boolean getShipyards() {
return shipyards;
}
// custom techs
/**
* Internal use only, is not set by xml or property utils.
*/
@InternalDoNotExport
private void setGenericTechs() {
for (final TechAdvance ta : getData().getTechnologyFrontier()) {
if (ta instanceof GenericTechAdvance) {
if (((GenericTechAdvance) ta).getAdvance() == null) {
genericTech.put(ta.getProperty(), Boolean.FALSE);
}
}
}
}
public Boolean hasGenericTech(final String name) {
return genericTech.get(name);
}
/**
* Internal use only, is not set by xml or property utils.
* Adds to, not sets. Anything that adds to instead of setting needs a clear function as well.
*/
@InternalDoNotExport
public void setGenericTech(final String name, final boolean value) {
genericTech.put(name, value);
}
@InternalDoNotExport
public void setGenericTech(final HashMap<String, Boolean> value) {
genericTech = value;
}
public Map<String, Boolean> getGenericTech() {
return genericTech;
}
public void clearGenericTech() {
genericTech.clear();
}
@Override
public void validate(final GameData data) throws GameParseException {}
public static boolean isMechanizedInfantry(final PlayerID player) {
final TechAttachment ta = (TechAttachment) player.getAttachment(Constants.TECH_ATTACHMENT_NAME);
if (ta == null) {
return false;
}
return ta.getMechanizedInfantry();
}
public static boolean isAirTransportable(final PlayerID player) {
final TechAttachment ta = (TechAttachment) player.getAttachment(Constants.TECH_ATTACHMENT_NAME);
if (ta == null) {
return false;
}
return ta.getParatroopers();
}
}