package games.strategy.triplea.ui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.PlayerID;
import games.strategy.engine.data.Resource;
import games.strategy.engine.data.Territory;
import games.strategy.engine.data.Unit;
import games.strategy.engine.data.UnitType;
import games.strategy.engine.stats.AbstractStat;
import games.strategy.engine.stats.IStat;
import games.strategy.triplea.Constants;
import games.strategy.triplea.attachments.TechAttachment;
import games.strategy.triplea.delegate.Matches;
import games.strategy.triplea.delegate.TechAdvance;
import games.strategy.util.CompositeMatchAnd;
import games.strategy.util.Match;
public class ExtendedStats extends StatPanel {
private static final long serialVersionUID = 2502397606419491543L;
private IStat[] m_statsExtended = new IStat[] {};
public ExtendedStats(final GameData data, final IUIContext uiContext) {
super(data, uiContext);
}
@Override
protected void initLayout() {
// no layout necessary
}
@Override
public void setGameData(final GameData data) {
super.setGameData(data);
}
public IStat[] getStatsExtended(final GameData data) {
if (m_statsExtended.length == 0) {
fillExtendedStats(data);
}
return m_statsExtended;
}
private void fillExtendedStats(final GameData data) {
// add other resources, other than PUs and tech tokens
final List<Resource> resources = data.getResourceList().getResources();
for (final Resource r : resources) {
if (r.getName().equals(Constants.PUS) || r.getName().equals(Constants.TECH_TOKENS)) {
continue;
} else {
final GenericResourceStat resourceStat = new GenericResourceStat();
resourceStat.init(r.getName());
final List<IStat> statsExtended = new ArrayList<>(Arrays.asList(m_statsExtended));
statsExtended.add(resourceStat);
m_statsExtended = statsExtended.toArray(new IStat[statsExtended.size()]);
}
}
// add tech related stuff
if (games.strategy.triplea.Properties.getTechDevelopment(data)) {
// add tech tokens
if (data.getResourceList().getResource(Constants.TECH_TOKENS) != null) {
final List<IStat> statsExtended = new ArrayList<>(Arrays.asList(m_statsExtended));
statsExtended.add(new TechTokenStat());
m_statsExtended = statsExtended.toArray(new IStat[statsExtended.size()]);
}
// add number of techs
final List<IStat> techStatsExtended = new ArrayList<>(Arrays.asList(m_statsExtended));
techStatsExtended.add(new TechCountStat());
m_statsExtended = techStatsExtended.toArray(new IStat[techStatsExtended.size()]);
// add individual techs
for (final TechAdvance ta : TechAdvance.getTechAdvances(m_data)) {
final GenericTechNameStat techNameStat = new GenericTechNameStat();
techNameStat.init(ta);
final List<IStat> statsExtended = new ArrayList<>(Arrays.asList(m_statsExtended));
statsExtended.add(techNameStat);
m_statsExtended = statsExtended.toArray(new IStat[statsExtended.size()]);
}
}
// now add actual number of each unit type (holy gumdrops batman, this is going to be long!)
final Iterator<UnitType> allUnitTypes = data.getUnitTypeList().iterator();
while (allUnitTypes.hasNext()) {
final UnitType ut = allUnitTypes.next();
final GenericUnitNameStat unitNameStat = new GenericUnitNameStat();
unitNameStat.init(ut);
final List<IStat> statsExtended = new ArrayList<>(Arrays.asList(m_statsExtended));
statsExtended.add(unitNameStat);
m_statsExtended = statsExtended.toArray(new IStat[statsExtended.size()]);
}
}
class TechCountStat extends AbstractStat {
@Override
public String getName() {
return "Techs";
}
@Override
public double getValue(final PlayerID player, final GameData data) {
int count = 0;
final TechAttachment ta = TechAttachment.get(player);
if (ta.getHeavyBomber()) {
count++;
}
if (ta.getLongRangeAir()) {
count++;
}
if (ta.getJetPower()) {
count++;
}
if (ta.getRocket()) {
count++;
}
if (ta.getIndustrialTechnology()) {
count++;
}
if (ta.getSuperSub()) {
count++;
}
if (ta.getDestroyerBombard()) {
count++;
}
if (ta.getImprovedArtillerySupport()) {
count++;
}
if (ta.getParatroopers()) {
count++;
}
if (ta.getIncreasedFactoryProduction()) {
count++;
}
if (ta.getWarBonds()) {
count++;
}
if (ta.getMechanizedInfantry()) {
count++;
}
if (ta.getAARadar()) {
count++;
}
if (ta.getShipyards()) {
count++;
}
for (final boolean value : ta.getGenericTech().values()) {
if (value) {
count++;
}
}
return count;
}
}
class GenericResourceStat extends AbstractStat {
private String m_name = null;
public void init(final String name) {
m_name = name;
}
@Override
public String getName() {
return "Resource: " + m_name;
}
@Override
public double getValue(final PlayerID player, final GameData data) {
return player.getResources().getQuantity(m_name);
}
}
class GenericTechNameStat extends AbstractStat {
private TechAdvance m_ta = null;
public void init(final TechAdvance ta) {
m_ta = ta;
}
@Override
public String getName() {
return "TechAdvance: " + m_ta.getName();
}
@Override
public double getValue(final PlayerID player, final GameData data) {
if (m_ta.hasTech(TechAttachment.get(player))) {
return 1;
}
return 0;
}
}
class GenericUnitNameStat extends AbstractStat {
private UnitType m_ut = null;
public void init(final UnitType ut) {
m_ut = ut;
}
@Override
public String getName() {
return "UnitType: " + m_ut.getName();
}
@Override
public double getValue(final PlayerID player, final GameData data) {
int rVal = 0;
final Match<Unit> ownedBy =
new CompositeMatchAnd<>(Matches.unitIsOwnedBy(player), Matches.unitIsOfType(m_ut));
for (final Territory place : data.getMap().getTerritories()) {
rVal += place.getUnits().countMatches(ownedBy);
}
return rVal;
}
}
class TechTokenStat extends ResourceStat {
public TechTokenStat() {
super(m_data.getResourceList().getResource(Constants.TECH_TOKENS));
}
}
public IStat[] getStats() {
return m_stats;
}
}