/** * Retrieve the most recent pirate activities. * @return list of {@link PirateActivityEntry} */ public List<PirateActivityEntry> getPirateActivity() { clearCache(); return new ArrayList<>(map.values()); }
@Override public int calculateRequiredSailorAmount(IShip ship, IAIPlayer player) { int min = ship.getMinNumberOfSailors(); int max = ship.getMaxNumberOfSailors(); int range = max - min; List<PirateActivityEntry> activity = pirateActivity.getPirateActivity(); int observationDuration = pirateActivity.getObservationPeriodInDays(); int nbAttacks = dangerService.getNumberOfPirateAttacks(activity); double twoWeeks = observationDuration / 14.0; double attacksInTwoWeeks = twoWeeks / nbAttacks; if (attacksInTwoWeeks > 1) { // There should be one attack in two weeks return min; } if (attacksInTwoWeeks > 0.5) { // there should be one attack in four weeks / or half an attack in two return rnd.nextInt(range) + min; } return max; } }
private void updatePirateAttackStatistic(List<IShip> defendingShips, List<IShip> sunkenDefendingShips, List<IShip> capturedDefendingShips, IShipOwner attacker) { boolean won = defendingShips.size() - capturedDefendingShips.size() - sunkenDefendingShips.size() <= 0; PirateActivityEntry entry = PirateActivityEntry.builder() .pirate((ISeaPirate) attacker) .enteredShips(capturedDefendingShips.size()) .sukenShips(sunkenDefendingShips.size()) .lootedShips(0) // TODO: andi 10/17/17 implement looting. .fightWon(won) .build(); pirateActivity.add(entry); }
@Override public boolean shouldUpgrade(IShip ship) { if (ship.getShipUpgradeLevel() == EShipUpgrade.LEVEL2) { return false; } int weaponsStrength = shipService.calculateShipsWeaponsStrength(ship); List<PirateActivityEntry> attacks = pirateActivity.getPirateActivity(); int observationDuration = pirateActivity.getObservationPeriodInDays(); int nbAttacks = dangerService.getNumberOfPirateAttacks(attacks); double twoWeeks = observationDuration / 14.0; double attacksInTwoWeeks = twoWeeks / nbAttacks; if (attacksInTwoWeeks > 1) { // There should be one attack in two weeks if (weaponsStrength < 4) { return true; } } if (attacksInTwoWeeks > 0) { // there should be one attack in four weeks / or half an attack in two return weaponsStrength < 6; } return false; }
int numberOfFreeSlots = getNumberOfEmptyWeaponSlots(ship); // also number of free small slots int numberOfFreeLargeSlots = getNumberOfEmptyLargeWeaponSlots(ship); List<PirateActivityEntry> attacks = pirateActivity.getPirateActivity(); int numberOfAttacks = dangerService.getNumberOfSuccessfulPirateAttacks(attacks); int limitNumberOfFewAttacks = pirateActivity.getObservationPeriodInDays() / 14; // one attack every 2 weeks if (numberOfAttacks > limitNumberOfFewAttacks && numberOfFreeSlots > 0 && cash > CASH_LIMIT && ship.getCapacity() > 0) { int nbHandWeapons = Math.max(0, ship.getNumberOfSailors() - ship.getWeaponAmount(EWeapon.HAND_WEAPON));
int numberOfFreeSlots = getNumberOfEmptyWeaponSlots(ship); // also number of free small slots int numberOfFreeLargeSlots = getNumberOfEmptyLargeWeaponSlots(ship); List<PirateActivityEntry> attacks = pirateActivity.getPirateActivity(); int numberOfAttacks = dangerService.getNumberOfPirateAttacks(attacks); int limitNumberOfFewAttacks = pirateActivity.getObservationPeriodInDays() / 14; // one attack every 2 weeks if (numberOfAttacks > limitNumberOfFewAttacks && numberOfFreeSlots > 0 && cash > CASH_LIMIT && ship.getCapacity() > 0) { int nbHandWeapons = Math.max(0, ship.getNumberOfSailors() - ship.getWeaponAmount(EWeapon.HAND_WEAPON));
int numberOfFreeSlots = getNumberOfEmptyWeaponSlots(ship); // also number of free small slots int numberOfFreeLargeSlots = getNumberOfEmptyLargeWeaponSlots(ship); List<PirateActivityEntry> attacks = pirateActivity.getPirateActivity(); int numberOfAttacks = dangerService.getNumberOfSuccessfulPirateAttacks(attacks); int limitNumberOfFewAttacks = pirateActivity.getObservationPeriodInDays() / 14; // one attack every 2 weeks if (numberOfAttacks > limitNumberOfFewAttacks && numberOfFreeSlots > 0 && cash > CASH_LIMIT && ship.getCapacity() > 0) { int nbHandWeapons = Math.max(0, ship.getNumberOfSailors() - ship.getWeaponAmount(EWeapon.HAND_WEAPON));