private boolean shouldSwitchToCity(ICity toCity) { if (viewState.getCurrentCityProxy().isPresent()) { ICity currentCity = viewState.getCurrentCityProxy().get().getCity(); IHumanPlayer player = viewState.getPlayer(); if (!currentCity.findBuilding(ITradingOffice.class, Optional.of(player)).isEmpty()) { return false; // if there is a trading office in the current city do not switch } return !player.findShips(currentCity).isEmpty(); } else { return true; } }
@Subscribe public void handeShipReachesPort(ShipEntersPortEvent event) { ICity city = event.getCity(); final IShipOwner owner = event.getShip().getOwner(); Platform.runLater(() -> { if (owner instanceof IHumanPlayer && owner.equals(viewState.getPlayer())) { List<INavigableVessel> ships = ((IHumanPlayer)owner).findShips(city); if (ships.size() == 1) { drawShipPresenceInCity(city); } } }); }
@Subscribe public void handleSwitchToCity(SwitchCity event) { if (currentCityProxy.isPresent() && !event.getToCity().equals(currentCityProxy.get().getCity())) { final ICityPlayerProxyJFX proxy = currentCityProxy.get(); final ICity city = event.getToCity(); proxy.setCity(city); // Update the ships for that city proxy.getPlayersNavalVessels().clear(); final List<INavigableVessel> ships = proxy.getPlayer().findShips(city); proxy.getPlayersNavalVessels().addAll(ships); if (!ships.isEmpty()) { proxy.activateShip(ships.get(0)); } } }
@Subscribe public void handleShipLeavesCity(ShipLeavingPort event) { ICity city = event.getCity(); final IShipOwner owner = event.getShip().getOwner(); if (owner instanceof IHumanPlayer && owner.equals(viewState.getPlayer())) { List<INavigableVessel> ships = ((IHumanPlayer)owner).findShips(city); if (ships.isEmpty()) { double cityX = (int) Math.rint(city.getCoordinates().getX()) * scale.doubleValue(); double cityY = (int) Math.rint(city.getCoordinates().getY()) * scale.doubleValue(); for (Iterator<Node> iterator = shipCanvas.getChildren().iterator(); iterator.hasNext(); ) { Node node = iterator.next(); if (node instanceof Circle) { Circle c = (Circle) node; if (c.getCenterX() == cityX && c.getCenterY() == cityY) { Platform.runLater(iterator::remove); break; } } } } } }
private void drawShipsInCities(Image mapImage, double scale, double x) { for (ICity city : map.getCities()) { if (city.getCoordinates().getX() >= x && city.getCoordinates().getX() <= x + mapImage.getWidth()) { List<INavigableVessel> ships = viewState.getPlayer().findShips(city); if (!ships.isEmpty()) { drawShipPresenceInCity(city); } } } }
@Subscribe public void handleShipLeavesCity(ShipLeavingPort event) { ICity city = event.getCity(); final IShipOwner owner = event.getShip().getOwner(); if (owner instanceof IHumanPlayer && owner.equals(viewState.getPlayer())) { List<INavigableVessel> ships = ((IHumanPlayer)owner).findShips(city); if (ships.isEmpty()) { double cityX = (int) Math.rint(city.getCoordinates().getX()) * scale; double cityY = (int) Math.rint(city.getCoordinates().getY()) * scale; double viewportOffset = imgView.getViewport().getMinX() * scale; for (Iterator<Node> iterator = mapPane.getChildren().iterator(); iterator.hasNext(); ) { Node node = iterator.next(); if (node instanceof Circle) { Circle c = (Circle) node; if (c.getCenterX() + viewportOffset == cityX && c.getCenterY() == cityY) { Platform.runLater(iterator::remove); break; } } } } } } @Subscribe
@Subscribe public void handleShipEntersPort(ShipEntersPortEvent event) { ICity city = event.getCity(); final IShipOwner owner = event.getShip().getOwner(); if (owner instanceof IHumanPlayer && owner.equals(viewState.getPlayer())) { List<INavigableVessel> ships = ((IHumanPlayer)owner).findShips(city); if (ships.size() == 1) { Dimension2D dim = map.getDimension(); scale = 192 / dim.getHeight(); double viewportOffset = imgView.getViewport().getMinX(); Platform.runLater(() -> drawShipPresenceInCity(city, viewportOffset)); if (shouldSwitchToCity(city)) { clientEventBus.post(new SwitchCity(city)); } } } } private boolean shouldSwitchToCity(ICity toCity) {
/** * Execute after savegame was loaded triggered from the ClientViewState. */ public void postLoad() { List<INavigableVessel> ships = player.findShips(this.city); this.playersVessels.clear(); this.playersVessels.addAll(ships); if (!ships.isEmpty()) { this.activeShip.setValue(playersVessels.get(0)); } else { this.activeShip.setValue(null); } GameStatus gameStatus = context.getBean(GameStatus.class); gameStatus.bindToPlayer(player); ViewStatus viewStatus = context.getBean(ViewStatus.class); viewStatus.setCity(city.getName()); MiniMap miniMap = context.getBean(MiniMap.class); miniMap.initializeMapImage(player); }
List<INavigableVessel> ships = player.findShips(city); for (INavigableVessel ship : ships) { if (ship instanceof IShip) {