@Override public Optional<ICaptain> getCaptain(ICity city) { return captainsState.getCaptain(city); } @Override
/** * Create a pirate near a certain point * @param name of the pirate * @param ship new ship of the pirate * @return new sea pirate instance */ public ISeaPirate createNewPirate(String name, INavigableVessel ship) { SeaPirate pirate = context.getBean(SeaPirate.class); pirate.setName(name); pirate.setShip(ship); Point2D p = locationProvider.getRandomPointAtSea(); pirate.getShip().setLocation(p); return pirate; }
@Override public void hire(IAIPlayer player, IShip vessel, ICaptain captain, ICity city) { vessel.setCaptain(captain); captainsState.hireCaptain(captain, city); clientServerEventBus.post(new PersonLeavesTavernEvent(city, captain)); } }
@Subscribe public void handleDayChange(ClockTickDayChange event) { LocalDateTime today = date.getCurrentDate(); LocalDateTime shouldLeaveWhenArrivedBefore = today.minusDays(captainsState.getMaxDaysPresent()); for (ICaptain captain : captainsState.getAllFreeCaptains()) { Optional<ICity> city = captainsState.findCaptainsCurrentCity(captain); if (city.isPresent()) { LocalDateTime arrival = captainsState.getArrivalDate(captain); if (arrival.isBefore(shouldLeaveWhenArrivedBefore)) { ICity nextCity = getRandomCity(); while (city.get().equals(nextCity)) { nextCity = getRandomCity(); } // calculate days in between double distance = Math.abs(city.get().getCoordinates().getX() - nextCity.getCoordinates().getX()); double percentage = distance/map.getDimension().getWidth(); int days = (int) Math.rint(10*percentage); captainsState.hireCaptain(captain, city.get()); // This removes the current mapping LocalDateTime arrivalDate = date.getCurrentDate().plusDays(days); captainsState.assignCaptainToCity(captain, city.get(), arrivalDate); } } } }
@PostConstruct private void initializeDialog() { setTitle(messageSource.getMessage("ch.sahits.game.openpatrician.display.dialog.TavernCaptainDialog.title", new Object[]{}, locale.getCurrentLocal())); captain = captainsState.getCaptain(city.getCity()).get(); Text intro = new Text(); intro.getStyleClass().add("dialogText"); try { currentShip.get().setCaptain(captain); captainsState.hireCaptain(captain, city.getCity()); clientServerEventBus.post(new PersonLeavesTavernEvent(city.getCity(), captain)); executeOnCloseButtonClicked();
/** * Periodically check if there is a free pirate and if not, create one. * @param event weekly update */ @Subscribe public void handleWeeklyUpdate(PeriodicalTimeWeekEndUpdate event) { // Check if there is a free pirate and if not spawn a new one if (piratesState.getFreePirates().isEmpty()) { IShip ship = createInitialPiratesShip(); String name = firstNameLoader.getRandomName()+" "+lastNameLoader.getRandomName(); ISeaPirate pirate = peopleFactory.createNewPirate(name, ship); ship.setOwner(pirate); piratesState.add(pirate); } } /**
/** * Create an new pirate anywhere on the sea * @param name of the pirate * @param ship of the pirate * @param hiree player who hired the pirate * @param nearCity city near which the pirate should roam or null. * @return new non free pirate instance */ public INonFreeSeaPirate createNewPirate(String name, IShip ship, IPlayer hiree, ICity nearCity) { NonFreeSeaPirate pirate = (NonFreeSeaPirate) context.getBean("nonFreeSeaPirate", new Object[]{hiree, date.getCurrentDate(), nearCity}); pirate.setName(name); pirate.setShip(ship); Point2D p; if (nearCity != null) { p = locationProvider.getRandomPointAtSeaNear(nearCity.getCoordinates()); } else { p = locationProvider.getRandomPointAtSea(); } pirate.getShip().setLocation(p); return pirate; } /**
@VisibleForTesting void removeFromFleet(IShip ship, IShipOwner owner) { if (owner instanceof IPlayer) { ((IPlayer) owner).getFleet().remove(ship); } if (owner instanceof ISeaPirate) { ISeaPirate pirate = (ISeaPirate) owner; IShipGroup oldGroup = pirate.getShip() instanceof IShipGroup ? (IShipGroup) pirate.getShip() : null; if (oldGroup != null) { oldGroup.removeShip(ship); if (oldGroup.getShips().size() == 1) { ((SeaPirate)pirate).setShip(oldGroup.getShips().get(0)); ((DependentAnnotationConfigApplicationContext)context).removePrototypeBean(oldGroup); } } else { piratesState.remove(pirate); ((DependentAnnotationConfigApplicationContext)context).removePrototypeBean(pirate); } } }
/** * Create an alderman task to hunt a pirate, while ignoring the ones that are already worked on. * @param office aderman office * @return pirate hunter task */ public Optional<IHuntPirate> createPirateHuntEledermanTask(IAldermanOffice office) { List<IAcceptedAldermanTask> workedOnTasks = office.getWorkedOnTasks(); List<ISeaPirate> tasks = new ArrayList<>(); for (IAcceptedAldermanTask workedOnTask : workedOnTasks) { if (workedOnTask.getTask() instanceof IHuntPirate) { tasks.add(((IHuntPirate)workedOnTask.getTask()).getPirate()); } } List<ISeaPirate> pirates = new ArrayList<>(pirateState.getFreePirates()); Collections.shuffle(pirates); for (ISeaPirate pirate : pirates) { if (tasks.contains(pirate)) { continue; } int duration = 60; IHuntPirate hunt = (IHuntPirate) context.getBean("huntPirate", duration, pirate); return Optional.of(hunt); } return Optional.empty(); }
@Override public void run() { while (!graphInitialized) { Thread.yield(); } String name = firstNameLoader.getRandomName()+" "+lastNameLoader.getRandomName(); IShip ship = createInitialPiratesShip(); ISeaPirate pirate = peopleFactory.createNewPirate(name, ship); ship.setOwner(pirate); piratesState.add(pirate); // this will trigger a NewPirateEvent } };
@VisibleForTesting void addToFleet(IShip ship, IShipOwner owner) { if (owner instanceof IPlayer) { ((IPlayer)owner).getFleet().add(ship); } if (owner instanceof ISeaPirate) { ISeaPirate pirate = (ISeaPirate) owner; IShipGroup oldGroup = pirate.getShip() instanceof IShipGroup ? (IShipGroup) pirate.getShip() : null; if (oldGroup != null) { oldGroup.addShip(ship); } else { ArrayList<IShip> ships = new ArrayList<>(); ships.add((IShip) pirate.getShip()); ships.add(ship); IShipGroup group = regroup(ships, (IShipGroup) null); ((SeaPirate)pirate).setShip(group); } } } @VisibleForTesting
@Override protected EventHandler<MouseEvent> createAcceptHandler() { return mouseEvent -> { try { IHumanPlayer player = city.getPlayer(); ThieveState burglar = (ThieveState) currentPerson.get(); player.getCompany().updateCash(-burglar.getPrice()); int probability = rnd.nextInt(3); if (probability < 1) { timedTaskListener.add((TimedTask) taskFactory.getDelayedCaughtAction(player, city.getCity())); } else { timedTaskListener.add((TimedTask) taskFactory.getBreakInAction(selectedOponent.get())); } player.updateCrimialDrive(1); burglar.leave(); executeOnCloseButtonClicked(); } catch (RuntimeException e) { logger.error("Failed to accept burglar offer", e); } }; }
/** * A non free pirate becomes free. * @param pirate non free pirate instance that is to be freed. */ public void free(INonFreeSeaPirate pirate) { ISeaPirate freePirate = createNewPirate(pirate.getName(), pirate.getShip()); ((DependentAnnotationConfigApplicationContext)context).removePrototypeBean(pirate); piratesState.replace(pirate, freePirate); }
@PostConstruct public void init() { for (int i = 0; i<maxFreeCaptains; i++) { // select town ICity city = getRandomCity(); // create arival date in intervall [now-maxTimeInTown,now] LocalDateTime currentDate = date.getCurrentDate(); double nextGaussian = rnd.nextDouble(); LocalDateTime arrival = currentDate.minusDays((int)Math.rint(nextGaussian*maxTimeInTown)); // create captain ICaptain captain = peopleFactory.createNewCaptainProperty(); captainsState.addCaptain(city, arrival, captain); } timerEventBus.register(this); } @PreDestroy
private void updateReputationDueToPirateDefeat(INavigableVessel pirateVessel, INavigableVessel playerVessel) { if (pirateVessel.getOwner() instanceof ISeaPirate && playerVessel.getOwner() instanceof IPlayer) { if (!piratesState.getAllPirates().contains(pirateVessel.getOwner())) { IPlayer player = (IPlayer) playerVessel.getOwner(); for (ICity city : map.getCities()) { city.getReputation(player).update(15); // If the distruction was a Alderman task the increase is larger } } } } }
ISeaPirate pirate = pirateState.findSuccessfulPirate(); ICity nearest = cityUtils.findNearestCity(pirate.getShip().getLocation()); informant.setPirateLocation(pirate, nearest);
@Override public boolean shouldHire(IAIPlayer player, IShip vessel, ICity city) { if (vessel.getCaptian().isPresent()) { return false; } Optional<ICaptain> optCaptain = captainsState.getCaptain(city); return optCaptain.isPresent(); }
boolean huntPirate = false; boolean capturePirateNest = false; List<ISeaPirate> pirates = new ArrayList<>(pirateState.getFreePirates()); for (Iterator<IAldermanTask> iterator = tasks.iterator(); iterator.hasNext(); ) { IAldermanTask task = iterator.next();
@Subscribe public void handleDayChange(ClockTickDayChange dayChange) { Optional<ICaptain> captain = captainsState.getCaptain(city.getCity()); if (!captain.isPresent()) { executeOnCloseButtonClicked(); } }
@Override public LinkedHashSet<NoticeBoardMenuEntry> createMenuEntries(ICityPlayerProxyJFX proxy, ENoticeBoardType type) { LinkedHashSet<NoticeBoardMenuEntry> entries = new LinkedHashSet<>(); final TavernState tavernState = getTavernState(proxy.getCity()); Optional<ICaptain> captain = captainsState.getCaptain(proxy.getCity()); List<IPerson> present = tavernState.presentPersonsProperty(); List<ISideRoomPerson> sideRoom = Lists.newArrayList(); List<IPerson> mainRoom = Lists.newArrayList(); IPlayer player = proxy.getPlayer(); collectPresentPersons(tavernState, present, sideRoom, mainRoom, player); captain.ifPresent(mainRoom::add); for (IPerson pers : mainRoom) { String s = messageSource.getMessage(pers.getClass().getName() + ".noticeboardTitle", new Object[0], locale.getCurrentLocal()); NoticeBoardMenuEntry entry = createNoticeBoardEntryMainRoom(s, pers, tavernState, player); entries.add(entry); } if (!sideRoom.isEmpty()) { String s = messageSource.getMessage("ch.sahits.game.openpatrician.display.notice.NoticeBoardFactory.sideRoom", new Object[]{}, locale.getCurrentLocal()); NoticeBoardMenuEntry entry = createNoticeBoardEntrySideRoom(s, sideRoom.get(0), tavernState, player); entries.add(entry); } return entries; } @VisibleForTesting