* @param colony The <code>Colony</code> to capture.
     * @param random A pseudo-random number source.
     * @param cs The <code>ChangeSet</code> to update.
     */
    private void csCaptureColony(Unit attacker, Colony colony, Random random,
                                 ChangeSet cs) {
        Game game = attacker.getGame();
        ServerPlayer attackerPlayer = (ServerPlayer) attacker.getOwner();
        StringTemplate attackerNation = attackerPlayer.getNationName();
        ServerPlayer colonyPlayer = (ServerPlayer) colony.getOwner();
        StringTemplate colonyNation = colonyPlayer.getNationName();
        Tile tile = colony.getTile();
        int plunder = colony.getPlunder(attacker, random);

        // Handle history and messages before colony handover
        cs.addHistory(attackerPlayer,
                      new HistoryEvent(game.getTurn(),
                                       HistoryEvent.EventType.CONQUER_COLONY)
                      .addStringTemplate("%nation%", colonyNation)
                      .addName("%colony%", colony.getName()));
        cs.addHistory(colonyPlayer,
                      new HistoryEvent(game.getTurn(),
                                       HistoryEvent.EventType.COLONY_CONQUERED)
                      .addStringTemplate("%nation%", attackerNation)
                      .addName("%colony%", colony.getName()));
        cs.addMessage(See.only(attackerPlayer),
                      new ModelMessage(ModelMessage.MessageType.COMBAT_RESULT,
                                       "model.unit.colonyCaptured",
                                       colony)
                      .addName("%colony%", colony.getName())
                      .addAmount("%amount%", plunder));
        cs.addMessage(See.only(colonyPlayer),
                      new ModelMessage(ModelMessage.MessageType.COMBAT_RESULT,
                                       "model.unit.colonyCapturedBy",
                                       colony.getTile())
                      .addName("%colony%", colony.getName())
                      .addAmount("%amount%", plunder)
                      .addStringTemplate("%player%", attackerNation));

        // Allocate some plunder
        if (plunder > 0) {
            attackerPlayer.modifyGold(plunder);
            colonyPlayer.modifyGold(-plunder);
            cs.addPartial(See.only(attackerPlayer), attackerPlayer, "gold");
            cs.addPartial(See.only(colonyPlayer), colonyPlayer, "gold");
        }

        // Hand over the colony.
        colony.changeOwner(attackerPlayer);
        // Remove goods party modifiers as they apply to a different monarch.
        for (Modifier m : colony.getModifiers()) {
            if ("model.modifier.colonyGoodsParty".equals(m.getSource())) {
                colony.removeModifier(m);
            }
        }

        // Inform former owner of loss of owned tiles, and process possible
        // increase in line of sight.  Leave other exploration etc to csMove.
        for (Tile t : colony.getOwnedTiles()) {
            cs.add(See.perhaps().always(colonyPlayer), t);
        }
        if (colony.getLineOfSight() > attacker.getLineOfSight()) {
            for (Tile t : tile.getSurroundingTiles(attacker.getLineOfSight(),
                                                   colony.getLineOfSight())) {
                // New owner has now explored within settlement line of sight.
                attackerPlayer.setExplored(t);
                cs.add(See.only(attackerPlayer), t);
            }
        }

        // Inform the former owner of loss of units.  Only the potentially
        // active units on the tile need be considered.  Carried and colony
        // workers will just become inaccessible.
        for (Unit u : tile.getUnitList()) {
            cs.addDisappear(colonyPlayer, tile, u);
        }

        cs.addAttribute(See.only(attackerPlayer), "sound",
                        "sound.event.captureColony");
    }