diff --git a/data/strings/FreeColMessages_pt_PT.properties b/data/strings/FreeColMessages_pt_PT.properties index 20a803958..068b517a8 100644 --- a/data/strings/FreeColMessages_pt_PT.properties +++ b/data/strings/FreeColMessages_pt_PT.properties @@ -2320,9 +2320,9 @@ payForBuilding.disabled=A capacidade de pagar para concluir uma construção est payForBuilding.text=Gostaria de pagar %amount% {{plural:%amount%|one=moeda|other=moedas|default=moedas}} de ouro para concluir este edifício? renameColony.text=Sugira um novo nome para a nossa colónia, por favor: renameUnit.text=Sugira um novo nome para a nossa unidade, por favor: -scoutSettlement.expertScout=Nós apreciámos muito os contos maravilhosos do seu batedor. Portanto, iremos fornecer-vos ajuda para as vossas futuras explorações. O seu batedor tornou-se %unit%. -scoutSettlement.speakBeads=Bem-vindo, viajante. Por favor, leve estas valiosas contas (no valor de %amount% de ouro) de volta ao seu chefe como sinal de paz. -scoutSettlement.speakDie=Quebrou os ritos sagrados da tribo! Vamos amarrá-lo para praticar tiro ao alvo. +scoutSettlement.expertScout=Gostámos muito das histórias que o seu batedor nos contou, por isso vamos fornecer guias para ajudar nas suas explorações futuras. O seu batedor tornou-se %unit%. +scoutSettlement.speakBeads=Bem-vindo, viajante. No regresso, leve estas contas valiosas (no valor de %amount% de ouro) ao seu chefe como sinal de paz. +scoutSettlement.speakDie=Quebrou os ritos sagrados da tribo! Vamos amarrá-lo e usá-lo para tiro ao alvo. scoutSettlement.speakNothing=Ficamos sempre satisfeitos por receber viajantes %nation%. scoutSettlement.speakTales=Recebemos com agrado viajantes de terras longínquas. Venham, sentem-se junto à fogueira e contar-vos-emos histórias de terras vizinhas. sellProposition.text=Quer vender algumas mercadorias? diff --git a/data/strings/FreeColMessages_ru.properties b/data/strings/FreeColMessages_ru.properties index 681fa4cb8..a14f06217 100644 --- a/data/strings/FreeColMessages_ru.properties +++ b/data/strings/FreeColMessages_ru.properties @@ -2604,7 +2604,7 @@ server.reject=Сервер не может этого сделать. server.timeOut=Вышло время соединения с сервером. server.userNameInUse=Имя пользователя %name% уже используется. server.userNameNotPresent=Указанное имя пользователя %name% отсутствует в этой игре, но это: %names%. --# Fuzzy +# Fuzzy server.wrongFreeColVersion=Версии клиента и сервера FreeCol не совпадают. buildColony.others={{tag:country|%nation%}} основали новую колонию %colony% в %region%. cashInTreasureTrain.colonial=Сундуки сокровищ с %amount% золота прибыли в Европу. %cashInAmount% золота перечислено вам. diff --git a/src/net/sf/freecol/client/gui/CanvasMouseListener.java b/src/net/sf/freecol/client/gui/CanvasMouseListener.java index d1942b67b..a4b9c9fad 100644 --- a/src/net/sf/freecol/client/gui/CanvasMouseListener.java +++ b/src/net/sf/freecol/client/gui/CanvasMouseListener.java @@ -74,25 +74,29 @@ public final class CanvasMouseListener extends FreeColClientHolder if (tile == null) return; // Only process events that could not have been gotos. - final Unit unit = getGUI().getActiveUnit(); + final GUI gui = getGUI(); + final Unit active = gui.getActiveUnit(); if (e.getClickCount() > 1 - || unit == null - || unit.getTile() == tile + || active == null + || active.getTile() == tile || !canvas.isDrag(e.getX(), e.getY())) { - if (tile.hasSettlement()) { - getGUI().showTileSettlement(tile); - } else if (unit == null || unit.getTile() != tile) { + if (!tile.isExplored()) { + gui.setSelectedTile(tile); + gui.setViewMode(GUI.VIEW_TERRAIN_MODE); + } if (tile.hasSettlement()) { + gui.showTileSettlement(tile); + } else if (active == null || active.getTile() != tile) { Unit other = tile.getFirstUnit(); if (other != null && getMyPlayer().owns(other)) { - getGUI().setActiveUnit(other); - getGUI().setViewMode(GUI.MOVE_UNITS_MODE); + gui.setActiveUnit(other); + gui.setViewMode(GUI.MOVE_UNITS_MODE); } else { - getGUI().setSelectedTile(tile); - getGUI().setViewMode(GUI.VIEW_TERRAIN_MODE); + gui.setSelectedTile(tile); + gui.setViewMode(GUI.VIEW_TERRAIN_MODE); } } else { - getGUI().setSelectedTile(tile); - getGUI().setViewMode(GUI.VIEW_TERRAIN_MODE); + gui.setSelectedTile(tile); + gui.setViewMode(GUI.VIEW_TERRAIN_MODE); } } } diff --git a/src/net/sf/freecol/client/gui/GUI.java b/src/net/sf/freecol/client/gui/GUI.java index 9b94d1d59..cef59711d 100644 --- a/src/net/sf/freecol/client/gui/GUI.java +++ b/src/net/sf/freecol/client/gui/GUI.java @@ -1672,11 +1672,8 @@ public class GUI extends FreeColClientHolder { * Set the active unit. * * @param unit The {@code Unit} to activate. - * @return True if the focus was set. */ - public boolean setActiveUnit(Unit unit) { - return false; - } + public void setActiveUnit(Unit unit) {} /** * Center the active unit. @@ -1696,11 +1693,8 @@ public class GUI extends FreeColClientHolder { * Set the selected tile. * * @param tile The new selected {@code Tile}. - * @return True if setting the tile changes the focus. */ - public boolean setSelectedTile(Tile tile) { - return true; - } + public void setSelectedTile(Tile tile) {} // Zoom controls diff --git a/src/net/sf/freecol/client/gui/MapViewer.java b/src/net/sf/freecol/client/gui/MapViewer.java index 40fa0e1e1..a7fbb20ba 100644 --- a/src/net/sf/freecol/client/gui/MapViewer.java +++ b/src/net/sf/freecol/client/gui/MapViewer.java @@ -256,6 +256,42 @@ public final class MapViewer extends FreeColClientHolder { } } + /** + * Gets the active unit. + * + * @return The {@code Unit}. + */ + public Unit getActiveUnit() { + return this.activeUnit; + } + + /** + * Sets the active unit. + * + * @param activeUnit The new active {@code Unit}. + */ + public void setActiveUnit(Unit activeUnit) { + this.activeUnit = activeUnit; + } + + /** + * Gets the selected tile. + * + * @return The {@code Tile} selected. + */ + public Tile getSelectedTile() { + return this.selectedTile; + } + + /** + * Sets the selected tile. + * + * @param tile The new selected {@code Tile}. + */ + public void setSelectedTile(Tile tile) { + this.selectedTile = tile; + } + /** * Centers the map on the selected unit. */ @@ -918,56 +954,6 @@ public final class MapViewer extends FreeColClientHolder { && tile.getX() >= leftColumn && tile.getX() <= rightColumn; } - /** - * Gets the selected tile. - * - * @return The {@code Tile} selected. - */ - Tile getSelectedTile() { - return selectedTile; - } - - /** - * Selects the tile at the specified position. There are two - * possible cases: - * - *
    - *
  1. If the tile contains a unit that can become active, then - * that unit will be set as the active unit. - *
  2. If not, the {@code selectedTile} will become the map focus. - *
- * - * If a unit is active and is located on the selected tile, - * then nothing (except perhaps a map reposition) will happen. - * - * @param newTile The {@code Tile}, the tile to be selected - * @return True if the focus was set. - * @see #getSelectedTile - * @see #setActiveUnit - * @see #setFocus(Tile) - */ - boolean setSelectedTile(Tile newTile) { - Tile oldTile = this.selectedTile; - boolean ret = false; - selectedTile = newTile; - - // Check for refocus - if (!onScreen(newTile) - || getClientOptions().getBoolean(ClientOptions.ALWAYS_CENTER)) { - gui.setFocus(newTile); - ret = true; - } else { - if (oldTile != null) { - gui.refreshTile(oldTile); - } - - if (newTile != null) { - gui.refreshTile(newTile); - } - } - return ret; - } - /** * Gets the unit that should be displayed on the given tile. * @@ -1009,42 +995,6 @@ public final class MapViewer extends FreeColClientHolder { return result; } - /** - * Gets the active unit. - * - * @return The {@code Unit}. - * @see #setActiveUnit - */ - Unit getActiveUnit() { - return activeUnit; - } - - /** - * Sets the active unit. - * - * @param activeUnit The new active {@code Unit}. - * @return True if the focus was set. - */ - boolean setActiveUnit(Unit activeUnit) { - // Don't select a unit with zero moves left. -sjm - // The user might what to check the status of a unit - SG - Tile tile = (activeUnit == null) ? null : activeUnit.getTile(); - this.activeUnit = activeUnit; - - if (activeUnit == null || tile == null) { - gui.getCanvas().stopGoto(); - } else { - changeViewMode(GUI.MOVE_UNITS_MODE); - updateCurrentPathForActiveUnit(); - if (!gui.setSelectedTile(tile) - || getClientOptions().getBoolean(ClientOptions.JUMP_TO_ACTIVE_UNIT)) { - gui.setFocus(tile); - return true; - } - } - return false; - } - /** * Checks if there is currently a goto operation on the mapboard. * diff --git a/src/net/sf/freecol/client/gui/SwingGUI.java b/src/net/sf/freecol/client/gui/SwingGUI.java index 5085b669d..7178c76ac 100644 --- a/src/net/sf/freecol/client/gui/SwingGUI.java +++ b/src/net/sf/freecol/client/gui/SwingGUI.java @@ -174,6 +174,26 @@ public class SwingGUI extends GUI { return null; } + /** + * Internal version of setSelectedTile allowing focus override. + * + * @param newTile The new {@code Tile} to select. + * @param refocus If true, always refocus. + */ + private void setSelectedTile(Tile newTile, boolean refocus) { + final Tile oldTile = getSelectedTile(); + refocus = newTile != null && (refocus || !mapViewer.onScreen(newTile) + || getClientOptions().getBoolean(ClientOptions.ALWAYS_CENTER)); + if (refocus) { + setFocus(newTile); + } else { + if (oldTile != null) refreshTile(oldTile); + if (newTile != null) refreshTile(newTile); + } + mapViewer.setSelectedTile(newTile); + } + + // TODO private void setFocusImmediately(Tile tileToFocus) { mapViewer.setFocus(tileToFocus); Dimension size = canvas.getSize(); @@ -957,14 +977,34 @@ public class SwingGUI extends GUI { * {@inheritDoc} */ @Override - public boolean setActiveUnit(Unit unit) { - boolean result = mapViewer.setActiveUnit(unit); + public void setActiveUnit(Unit unit) { + final Unit old = getActiveUnit(); + + Tile tile = null; + if (unit == null || (tile = unit.getTile()) == null) { + canvas.stopGoto(); + } + mapViewer.setActiveUnit(unit); + // Automatic mode switch when switching to/from null active unit + if (unit != null && old == null) { + setViewMode(GUI.MOVE_UNITS_MODE); + // Bring the selected tile along with the unit + if (tile != getSelectedTile()) { + setSelectedTile(tile, tile != null + && getClientOptions().getBoolean(ClientOptions.JUMP_TO_ACTIVE_UNIT)); + } + } else if (unit == null && old != null) { + tile = getSelectedTile(); + if (tile != null) setViewMode(GUI.VIEW_TERRAIN_MODE); + } + updateMapControls(); updateMenuBar(); + + // TODO: why do we have to refresh the entire canvas? if (unit != null && !getMyPlayer().owns(unit)) { canvas.refresh(); } - return result; } /** @@ -990,11 +1030,10 @@ public class SwingGUI extends GUI { * {@inheritDoc} */ @Override - public boolean setSelectedTile(Tile newTileToSelect) { - boolean result = mapViewer.setSelectedTile(newTileToSelect); + public void setSelectedTile(Tile newTile) { + setSelectedTile(newTile, false); updateMapControls(); updateMenuBar(); - return result; } diff --git a/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java b/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java index e2a03a05b..0dd69547f 100644 --- a/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java +++ b/src/net/sf/freecol/client/gui/dialog/EditSettlementDialog.java @@ -242,8 +242,7 @@ public final class EditSettlementDialog extends FreeColDialog Player owner = is.getOwner(); UnitType brave = spec.getDefaultUnitType(owner); for (int index = 0; index < numberOfUnits; index++) { - is.add(new ServerUnit(is.getGame(), - is, owner, brave)); + is.add(new ServerUnit(is.getGame(), is, owner, brave)); } } else if (numberOfUnits < 0) { List unitList diff --git a/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java b/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java index bd8b61256..6b9be5c4c 100644 --- a/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java +++ b/src/net/sf/freecol/server/ai/EuropeanAIPlayer.java @@ -638,7 +638,7 @@ public class EuropeanAIPlayer extends MissionAIPlayer { int aPrice = player.getMonarch().loadMercenaries(air, aMercs); if (aPrice > 0) { List mercs = ((ServerPlayer)player) - .createUnits(aMercs, europe); + .createUnits(aMercs, europe, air); for (Unit u : mercs) { AIUnit aiu = getAIUnit(u); if (aiu == null) continue; // Can not happen diff --git a/src/net/sf/freecol/server/control/InGameController.java b/src/net/sf/freecol/server/control/InGameController.java index b7faab387..196eb11f7 100644 --- a/src/net/sf/freecol/server/control/InGameController.java +++ b/src/net/sf/freecol/server/control/InGameController.java @@ -376,11 +376,11 @@ public final class InGameController extends Controller { // For now, do not fail completely } List landUnits = refPlayer.createUnits(exf.getLandUnitsList(), - europe);//-vis: safe!map + europe, null);//-vis: safe!map List navalUnits = refPlayer.createUnits(exf.getNavalUnitsList(), - europe);//-vis: safe!map + europe, random);//-vis: safe!map List leftOver = refPlayer.loadShips(landUnits, navalUnits, - random);//-vis: safe!map + random);//-vis: safe!map if (!leftOver.isEmpty()) { // Should not happen, make this return null one day logger.warning("Failed to board REF units: " @@ -760,7 +760,7 @@ public final class InGameController extends Controller { int warGold = 0; if (!warSupport.isEmpty()) { serverPlayer.createUnits(warSupport, - serverPlayer.getEurope());//-vis: safe, Europe + serverPlayer.getEurope(), random);//-vis: safe, Europe warGold = spec.getInteger(GameOptions.WAR_SUPPORT_GOLD); warGold += (warGold/10) * (randomInt(logger, "War support gold", random, 5) - 2); @@ -789,7 +789,7 @@ public final class InGameController extends Controller { List support = monarch.getSupport(random, sea); if (support.isEmpty()) break; serverPlayer.createUnits(support, - serverPlayer.getEurope());//-vis: safe, Europe + serverPlayer.getEurope(), random);//-vis: safe, Europe cs.add(See.only(serverPlayer), serverPlayer.getEurope()); cs.add(See.only(serverPlayer), new MonarchActionMessage(action, StringTemplate diff --git a/src/net/sf/freecol/server/generator/SimpleMapGenerator.java b/src/net/sf/freecol/server/generator/SimpleMapGenerator.java index ee34c0211..8cd148a77 100644 --- a/src/net/sf/freecol/server/generator/SimpleMapGenerator.java +++ b/src/net/sf/freecol/server/generator/SimpleMapGenerator.java @@ -884,8 +884,10 @@ public class SimpleMapGenerator implements MapGenerator { // In debug mode give each player a few more units and a colony. UnitType unitType = spec.getUnitType("model.unit.galleon"); Unit galleon = new ServerUnit(game, startTile, player, unitType); + galleon.setName(player.getNameForUnit(unitType, random)); unitType = spec.getUnitType("model.unit.privateer"); Unit privateer = new ServerUnit(game, startTile, player, unitType); + privateer.setName(player.getNameForUnit(unitType, random)); ((ServerPlayer)player).exploreForUnit(privateer); unitType = spec.getUnitType("model.unit.freeColonist"); new ServerUnit(game, galleon, player, unitType); diff --git a/src/net/sf/freecol/server/model/MonarchSession.java b/src/net/sf/freecol/server/model/MonarchSession.java index b03005454..c6337601e 100644 --- a/src/net/sf/freecol/server/model/MonarchSession.java +++ b/src/net/sf/freecol/server/model/MonarchSession.java @@ -83,6 +83,7 @@ public class MonarchSession extends Session { * Primitive level to finishing the session with the given result. * * @param result The result of the session, null means ignored. + * @param random A pseudo-random number source. * @param cs A {@code ChangeSet} to update. */ private void completeInternal(Boolean result, ChangeSet cs) { @@ -98,7 +99,7 @@ public class MonarchSession extends Session { if (result == null) { serverPlayer.ignoreMercenaries(cs); } else if (result) { - serverPlayer.csAddMercenaries(mercenaries, price, cs); + serverPlayer.csAddMercenaries(mercenaries, price, null, cs); } break; default: diff --git a/src/net/sf/freecol/server/model/ServerColony.java b/src/net/sf/freecol/server/model/ServerColony.java index efd59d135..5e894ca76 100644 --- a/src/net/sf/freecol/server/model/ServerColony.java +++ b/src/net/sf/freecol/server/model/ServerColony.java @@ -155,6 +155,7 @@ public class ServerColony extends Colony implements TurnTaker { UnitType type = (UnitType)buildQueue.getCurrentlyBuilding(); Unit unit = new ServerUnit(getGame(), getTile(), owner, type);//-vis: safe, within colony + unit.setName(owner.getNameForUnit(type, random)); if (unit.hasAbility(Ability.BORN_IN_COLONY)) { cs.addMessage(owner, new ModelMessage(MessageType.UNIT_ADDED, diff --git a/src/net/sf/freecol/server/model/ServerPlayer.java b/src/net/sf/freecol/server/model/ServerPlayer.java index 9cc6f427f..3ef6620c9 100644 --- a/src/net/sf/freecol/server/model/ServerPlayer.java +++ b/src/net/sf/freecol/server/model/ServerPlayer.java @@ -1127,10 +1127,11 @@ public class ServerPlayer extends Player implements TurnTaker { * create. * @param location The {@code Location} where the units will * be created. + * @param random A pseudo-random number source. * @return A list of units created. */ public List createUnits(List abstractUnits, - Location location) { + Location location, Random random) { final Game game = getGame(); final Specification spec = game.getSpecification(); List units = new ArrayList<>(); @@ -1150,6 +1151,7 @@ public class ServerPlayer extends Player implements TurnTaker { for (int i = 0; i < au.getNumber(); i++) { ServerUnit su = new ServerUnit(game, location, this, type, role);//-vis(this) + su.setName(this.getNameForUnit(type, random)); units.add(su); lb.add(' ', su); } @@ -1974,7 +1976,7 @@ outer: for (Effect effect : effects) { List units = father.getUnitList(); if (units != null && !units.isEmpty() && europe != null) { - createUnits(units, europe);//-vis: safe, Europe + createUnits(units, europe, random);//-vis: safe, Europe europeDirty = true; } @@ -4138,7 +4140,7 @@ outer: for (Effect effect : effects) { * @param cs A {@code ChangeSet} to update. */ public void csAddMercenaries(List mercs, int price, - ChangeSet cs) { + Random random, ChangeSet cs) { if (checkGold(price)) { final Specification spec = getSpecification(); final Predicate isNaval = au -> @@ -4149,12 +4151,12 @@ outer: for (Effect effect : effects) { Tile dst; if (naval.isEmpty()) { // Deliver to first settlement dst = first(getColonies()).getTile(); - createUnits(mercs, dst);//-vis: safe, in colony + createUnits(mercs, dst, null);//-vis: safe, in colony cs.add(See.only(this), dst); } else { // Let them sail in dst = getEntryTile(); - loadShips(createUnits(transform(mercs, isLand), null), - createUnits(naval, dst),//-vis + loadShips(createUnits(transform(mercs, isLand), null, null), + createUnits(naval, dst, random),//-vis null); invalidateCanSeeTiles();//+vis(this) cs.add(See.perhaps(), dst); @@ -4524,9 +4526,9 @@ outer: for (Effect effect : effects) { // Create the force. Force ivf = getMonarch().getInterventionForce(); List land = createUnits(ivf.getLandUnitsList(), - entry);//-vis(this) + entry, random);//-vis(this) List naval = createUnits(ivf.getNavalUnitsList(), - entry);//-vis(this) + entry, random);//-vis(this) List leftOver = loadShips(land, naval, random);//-vis(this) for (Unit unit : leftOver) { // no use for left over units diff --git a/src/net/sf/freecol/server/model/ServerUnit.java b/src/net/sf/freecol/server/model/ServerUnit.java index 26332857e..802e823b9 100644 --- a/src/net/sf/freecol/server/model/ServerUnit.java +++ b/src/net/sf/freecol/server/model/ServerUnit.java @@ -134,6 +134,7 @@ public class ServerUnit extends Unit implements TurnTaker { game.getSpecification().getDefaultRole()); final Specification spec = getSpecification(); + if (template.getName() != null) setName(template.getName()); setNationality(template.getNationality()); setEthnicity(template.getEthnicity()); workLeft = template.getWorkLeft(); @@ -166,8 +167,8 @@ public class ServerUnit extends Unit implements TurnTaker { super(game); final Specification spec = getSpecification(); - this.type = type; this.owner = owner; + this.type = type; this.state = UnitState.ACTIVE; // placeholder this.role = getSpecification().getDefaultRole(); // placeholder this.location = null;