public void updateSegmentSize(int nbShips) { int[] nbSegments = calculateRowsAndColumnsNeeded(nbShips/2, mapDimension); segmentEdgeWidth = (mapDimension.getWidth() + 1) / nbSegments[1]; segmentEdgeHeigth = (mapDimension.getHeight() + 1) / nbSegments[0]; List<INavigableVessel> registeredVessels = new ArrayList<>(); if (segments != null) { for (List<WeakReference<INavigableVessel>>[] outer : segments) { for (List<WeakReference<INavigableVessel>> inner : outer) { for (WeakReference<INavigableVessel> vessel : inner) { if (vessel.get() != null) { registeredVessels.add(vessel.get()); } } } } } segments = new List[nbSegments[1]][nbSegments[0]]; for (int i = 0; i < nbSegments[1]; i++) { for (int j = 0; j < nbSegments[0]; j++) { segments[i][j] = new ArrayList<>(); } } for (INavigableVessel registeredVessel : registeredVessels) { add(registeredVessel); } } @VisibleForTesting
/** * Check which vessels are visible and add them. * @param ship for which other visible vessels should be checked * @param player human player owning the interface. */ @VisibleForTesting void addVisibleVessel(INavigableVessel ship, IHumanPlayer player) { List<INavigableVessel> visibleVessels = locationTracker.getShipsInSegments(ship.getLocation(), visibleRange); for (INavigableVessel visibleVessel : visibleVessels) { addSingleVisibleVessel(ship, player, visibleVessel); } }
public List<INavigableVessel> getShipsInSegments(Point2D location, int radius) { int[] index = calculateIndices(location); final Point2D locationBefore = pointInterner.intern(getPointOnMap(location.getX() - radius, location.getY())); int[] indexBefore = calculateIndices(locationBefore); final Point2D locationAfter = pointInterner.intern(getPointOnMap(location.getX() + radius, location.getY())); int[] indexAfter = calculateIndices(locationAfter); Set<INavigableVessel> set = new HashSet<>(); if (indexBefore != index) { set.addAll(getShipsInSegment(locationBefore)); } set.addAll(getShipsInSegment(location)); if (indexAfter != index) { set.addAll(getShipsInSegment(locationAfter)); } return new ArrayList<>(set); }
@Override public void run() { ship.setLocation(location); locationTracker.add(ship); shipyard.removeCompletedConstruction(ship); if (owner instanceof IHumanPlayer) { DisplayMessage msg = new DisplayMessage("ch.sahits.game.openpatrician.engine.event.task.ShipBuildTask.message", new Object[]{type, ship.getName()}); TargetedEvent displayMessage = new TargetedEvent((IHumanPlayer) owner, msg); clientServerEventBus.post(displayMessage); } else { aiPlayerEngine.handleShipConstructionFinished(ship, (IAIPlayer) owner); } } /**
public List<INavigableVessel> getShipsInSegment(Point2D location) { int[] index = calculateIndices(location); List<WeakReference<INavigableVessel>> references = segments[index[0]][index[1]]; ArrayList<INavigableVessel> copyList = new ArrayList<>(); for (WeakReference<INavigableVessel> reference : references) { if (reference.get() != null) { copyList.add(reference.get()); } } return copyList; }
@PostConstruct void initialize() { mapDimension = map.getDimension(); updateSegmentSize(20); clientServerEventBus.register(this); syncServerClientEventBus.register(this); }
private IHumanPlayer startupGameEnvironment(NewGame newGameDTO) { date.setStartYear(newGameDTO.getStartYear()); GameFactory gameFactory = serverContext.getBean(GameFactory.class); CityFactory cityFactory = serverContext.getBean(CityFactory.class); ShipFactory shipFactory = serverContext.getBean(ShipFactory.class); gameFactory.createMap(newGameDTO.getMapName()); LocationTracker locationTracker = serverContext.getBean(LocationTracker.class); serverContext.getBean(StartNewGameBean.class); IGame game = gameFactory.createGame(newGameDTO.getObjective(), newGameDTO.getDifficulty(), newGameDTO.getSpeed(), newGameDTO.isSingleplayer()); ICity homeCity = cityFactory.createCityByName(newGameDTO.getHometown()); IHumanPlayer player = gameFactory.createPlayer(newGameDTO.getFirstName(), newGameDTO.getLastName(), homeCity, newGameDTO.isMale(), newGameDTO.getDifficulty().getStartingCapital(), EPlayerColor.BLUE); IShip ship = shipFactory.createCrayer(shipNameLoader.getRandomName(), EShipUpgrade.LEVEL1, 350); ship.setOwner(player); player.addShip(ship); player.addSelectableVessel(ship); ship.setLocation(homeCity.getCoordinates()); locationTracker.add(ship); // Start the game server.startGame(game, 1); server.startStandaloneGame(player); serverContext.getBean("startNewGameHandler"); // Force creation of this lazy bean return player; }
public void remove(INavigableVessel ship) { int[] index = calculateIndices(ship.getLocation()); if (!segments[index[0]][index[1]].removeIf(wr -> ship.equals(wr.get()))) { LOGGER.warn("The ship {} could not be found and removed in segment {}", ship, index); } }
@Subscribe public void handleGameLoad(GameStateChange gameStateChange) { if (gameStateChange.getStatusChange() == EGameStatusChange.GAME_LOADED) { int nbShips = 0; for (IAIPlayer player : aiPlayers) { nbShips += player.getFleet().size(); } for (IPlayer player : players) { nbShips += player.getFleet().size(); } updateSegmentSize(nbShips); } } }
@VisibleForTesting void handleShipLocationUpdate() { for (MapSegmentedImage mapSegment : dataModel.getMapSegments()) { Point2D location = mapSegment.getLocation(); List<INavigableVessel> shipsToCheck = locationTracker.getShipsInSegments(location, locationDistance); for (INavigableVessel ship : shipsToCheck) { if (location.distance(ship.getLocation()) <= locationDistance && !dataModel.isInCheckedList(ship)) { LocalDateTime dealine = date.getCurrentDate().plusDays(1); MapSegmentDataCheck check = new MapSegmentDataCheck(ship, mapSegment, dealine); dataModel.getCheckList().put(check.getShip(), check); } } } }
public void add(INavigableVessel ship) { int[] index = calculateIndices(ship.getLocation()); segments[index[0]][index[1]].add(new WeakReference(ship)); }
if (handlePirateShip(vessel)) { List<INavigableVessel> visibleVessels = locationTracker.getShipsInSegments(event.getToLocation(), 50); // TODO: andi 4/28/16 make this a configurable constant if (!visibleVessels.isEmpty()) {
@Subscribe public void handleShipMove(ShipPositionUpdateEvent event) { if (event.getFromLocation().getX() != event.getToLocation().getX() || event.getFromLocation().getY() != event.getToLocation().getY()) { int[] oldIndex = calculateIndices(event.getFromLocation()); int[] newIndex = calculateIndices(event.getToLocation()); if (!Arrays.equals(oldIndex, newIndex)) { segments[oldIndex[0]][oldIndex[1]].removeIf(wr -> event.getShip().equals(wr.get())); segments[newIndex[0]][newIndex[1]].add(new WeakReference<>(event.getShip())); } } }