package games.strategy.engine.data.changefactory;
import games.strategy.engine.data.Change;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.PlayerID;
import games.strategy.engine.data.RelationshipType;
import games.strategy.engine.data.Territory;
import games.strategy.triplea.delegate.Matches;
import games.strategy.util.CompositeMatchAnd;
import games.strategy.util.Match;
/**
* RelationshipChange this creates a change in relationshipType between two players, for example from Neutral to War.
*/
class RelationshipChange extends Change {
private static final long serialVersionUID = 2694339584633196289L;
private final String m_player1;
private final String m_player2;
private final String m_OldRelation;
private final String m_NewRelation;
RelationshipChange(final PlayerID player1, final PlayerID player2, final RelationshipType oldRelation,
final RelationshipType newRelation) {
m_player1 = player1.getName();
m_player2 = player2.getName();
m_OldRelation = oldRelation.getName();
m_NewRelation = newRelation.getName();
}
private RelationshipChange(final String player1, final String player2, final String oldRelation,
final String newRelation) {
m_player1 = player1;
m_player2 = player2;
m_OldRelation = oldRelation;
m_NewRelation = newRelation;
}
@Override
public Change invert() {
return new RelationshipChange(m_player1, m_player2, m_NewRelation, m_OldRelation);
}
@Override
protected void perform(final GameData data) {
data.getRelationshipTracker().setRelationship(data.getPlayerList().getPlayerID(m_player1),
data.getPlayerList().getPlayerID(m_player2), data.getRelationshipTypeList().getRelationshipType(m_NewRelation));
// now redraw territories in case of new hostility
if (Matches.RelationshipTypeIsAtWar.match(data.getRelationshipTypeList().getRelationshipType(m_NewRelation))) {
for (final Territory t : Match.getMatches(data.getMap().getTerritories(),
new CompositeMatchAnd<>(
Matches.territoryHasUnitsOwnedBy(data.getPlayerList().getPlayerID(m_player1)),
Matches.territoryHasUnitsOwnedBy(data.getPlayerList().getPlayerID(m_player2))))) {
t.notifyChanged();
}
}
}
@Override
public String toString() {
return "Add relation change. " + m_player1 + " and " + m_player2 + " change from " + m_OldRelation + " to "
+ m_NewRelation;
}
}