package games.strategy.engine.data.changefactory;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import games.strategy.engine.data.Change;
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.net.GUID;
/**
* Changes ownership of a unit.
*/
class PlayerOwnerChange extends Change {
/**
* Maps unit id -> owner as String.
*/
private final Map<GUID, String> m_old;
private final Map<GUID, String> m_new;
private final String m_location;
private static final long serialVersionUID = -9154938431233632882L;
PlayerOwnerChange(final Collection<Unit> units, final PlayerID newOwner, final Territory location) {
m_old = new HashMap<>();
m_new = new HashMap<>();
m_location = location.getName();
for (final Unit unit : units) {
m_old.put(unit.getID(), unit.getOwner().getName());
m_new.put(unit.getID(), newOwner.getName());
}
}
PlayerOwnerChange(final Map<GUID, String> newOwner, final Map<GUID, String> oldOwner, final String location) {
m_old = oldOwner;
m_new = newOwner;
m_location = location;
}
@Override
public Change invert() {
return new PlayerOwnerChange(m_old, m_new, m_location);
}
@Override
protected void perform(final GameData data) {
for (final GUID id : m_new.keySet()) {
final Unit unit = data.getUnits().get(id);
if (!m_old.get(id).equals(unit.getOwner().getName())) {
throw new IllegalStateException("Wrong owner, expecting" + m_old.get(id) + " but got " + unit.getOwner());
}
final String owner = m_new.get(id);
final PlayerID player = data.getPlayerList().getPlayerID(owner);
unit.setOwner(player);
}
data.getMap().getTerritory(m_location).notifyChanged();
}
@Override
public String toString() {
return "Some units change owners in territory " + m_location;
}
}