package games.strategy.triplea.ui.screen.drawable; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.util.HashSet; import java.util.Set; import games.strategy.engine.data.GameData; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.Territory; import games.strategy.engine.data.Unit; import games.strategy.triplea.TripleAUnit; import games.strategy.triplea.ui.mapdata.MapData; public class BattleDrawable extends TerritoryDrawable implements IDrawable { private final String m_territoryName; public BattleDrawable(final String territoryName) { m_territoryName = territoryName; } @Override public void draw(final Rectangle bounds, final GameData data, final Graphics2D graphics, final MapData mapData, final AffineTransform unscaled, final AffineTransform scaled) { final Set<PlayerID> players = new HashSet<>(); for (final Unit u : data.getMap().getTerritory(m_territoryName).getUnits()) { if (!TripleAUnit.get(u).getSubmerged()) { players.add(u.getOwner()); } } final Territory territory = data.getMap().getTerritory(m_territoryName); PlayerID attacker = null; boolean draw = false; for (final PlayerID p : players) { if (!territory.isWater()) { if (data.getRelationshipTracker().isAtWar(p, territory.getOwner())) { attacker = p; draw = true; break; } else { // O(n^2), but n is usually 2, and almost always < 10 for (final PlayerID p2 : players) { if (data.getRelationshipTracker().isAtWar(p, p2)) { draw = true; break; } } } } else { // O(n^2), but n is usually 2, and almost always < 10 for (final PlayerID p2 : players) { if (data.getRelationshipTracker().isAtWar(p, p2)) { draw = true; break; } } } } if (draw) { Color stripeColor; if (attacker == null || territory.isWater()) { stripeColor = Color.RED.brighter(); } else { stripeColor = mapData.getPlayerColor(attacker.getName()); } final Paint paint = new GradientPaint(0 - (float) bounds.getX(), 0 - (float) bounds.getY(), new Color(stripeColor.getRed(), stripeColor.getGreen(), stripeColor.getBlue(), 120), 30 - (float) bounds.getX(), 50 - (float) bounds.getY(), new Color(0, 0, 0, 0), true); draw(bounds, graphics, mapData, scaled, territory, paint); } } @Override public int getLevel() { return BATTLE_HIGHLIGHT_LEVEL; } }