75 patrolBattlesLost.advance(days);
77 float losses = patrolBattlesLost.getAverage();
80 tracker.advance(days * Math.max(1f, losses));
81 if (!tracker.intervalElapsed())
return;
83 if (market.hasCondition(Conditions.DECIVILIZED))
return;
85 List<PatrolFleetData>
remove =
new ArrayList<PatrolFleetData>();
86 for (PatrolFleetData data : activePatrols) {
87 if (data.fleet.getContainingLocation() ==
null ||
88 !data.fleet.getContainingLocation().getFleets().contains(data.fleet)) {
90 log.info(
"Cleaning up orphaned patrol [" + data.fleet.getNameWithFaction() +
"] for market [" + market.getName() +
"]");
93 activePatrols.removeAll(
remove);
101 maxPatrols = (int) (Math.max(1, market.getSize() - 3) * (market.getStabilityValue() / 10f)) +
102 (int) Math.max(0, Math.min(losses, 5));
103 if (maxPatrols < 1) maxPatrols = 1;
105 boolean hasStationOrSpaceport = market.hasIndustry(Industries.ORBITALSTATION) ||
106 market.hasSpaceport() ||
107 market.hasIndustry(Industries.BATTLESTATION);
108 if (market.hasIndustry(Industries.MILITARYBASE)) {
110 if (hasStationOrSpaceport) maxPatrols++;
112 if (hasStationOrSpaceport) maxPatrols++;
117 log.debug(
"Checking whether to spawn patrol for market [" + market.getName() +
"]");
118 if (activePatrols.size() < maxPatrols) {
119 log.info(activePatrols.size() +
" out of a maximum " + maxPatrols +
" patrols in play for market [" + market.getName() +
"]");
121 WeightedRandomPicker<PatrolType> picker =
new WeightedRandomPicker<PatrolType>();
122 picker.add(PatrolType.FAST,
123 Math.max(1, maxPatrols - getCount(PatrolType.COMBAT, PatrolType.HEAVY)));
124 picker.add(PatrolType.COMBAT,
125 Math.max(1, maxPatrols - getCount(PatrolType.FAST, PatrolType.HEAVY) + market.getSize()) + losses);
127 if (market.getSize() >= 5) {
128 picker.add(PatrolType.HEAVY,
129 Math.max(1, maxPatrols - getCount(PatrolType.FAST, PatrolType.COMBAT) + market.getSize()) + losses * 2f);
133 PatrolType type = picker.pick();
136 if (fleet ==
null)
return;
138 SectorEntityToken entity = market.getPrimaryEntity();
139 entity.getContainingLocation().addEntity(fleet);
140 fleet.setLocation(entity.getLocation().x, entity.getLocation().y);
142 PatrolFleetData data =
new PatrolFleetData(fleet, type);
143 data.startingFleetPoints = fleet.getFleetPoints();
144 data.sourceMarket = market;
145 activePatrols.add(data);
150 log.info(
"Spawned patrol fleet [" + fleet.getNameWithFaction() +
"] from market " + market.getName());
152 log.debug(
"Maximum number of " + maxPatrols +
" patrols already in play for market [" + market.getName() +
"]");
159 PatrolType type, MarketAPI market, String factionId, Vector2f locInHyper,
float losses) {
167 float freighter = 0f;
168 String fleetType = FleetTypes.PATROL_SMALL;
171 fleetType = FleetTypes.PATROL_SMALL;
172 combat = Math.round(3f + (
float) Math.random() * 2f);
173 combat += Math.min(5f, losses * 2f);
176 fleetType = FleetTypes.PATROL_MEDIUM;
177 combat = Math.round(6f + (
float) Math.random() * 3f);
178 combat += Math.min(25f, losses * 8f);
180 tanker = Math.round((
float) Math.random());
183 fleetType = FleetTypes.PATROL_LARGE;
184 combat = Math.round(10f + (
float) Math.random() * 5f);
185 combat += Math.min(40f, losses * 12f);
191 if (market !=
null) {
192 combat *= 1f + (market.getStabilityValue() / 20f);
202 if (market !=
null && factionId ==
null) {
203 factionId = market.getFactionId();
244 if (fleet ==
null)
return null;
246 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PATROL_FLEET,
true);
248 if (type == PatrolType.FAST || type == PatrolType.COMBAT) {
249 fleet.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_CUSTOMS_INSPECTOR,
true);
252 fleet.getCommander().setPostId(Ranks.POST_PATROL_COMMANDER);
256 fleet.getCommander().setRankId(Ranks.SPACE_LIEUTENANT);
259 fleet.getCommander().setRankId(Ranks.SPACE_COMMANDER);
262 fleet.getCommander().setRankId(Ranks.SPACE_CAPTAIN);
304 super.reportBattleOccurred(primaryWinner, battle);
306 boolean playerWon = battle.isPlayerSide(battle.getSideFor(primaryWinner));
307 boolean playerLost = battle.isPlayerSide(battle.getOtherSideFor(primaryWinner));
308 if (primaryWinner.isInOrNearSystem(market.getStarSystem())) {
310 if (primaryWinner.getFaction().getId().equals(Factions.PIRATES))
return;
311 if (primaryWinner.getFaction().getId().equals(Factions.LUDDIC_PATH))
return;
313 for (CampaignFleetAPI loser : battle.getOtherSideSnapshotFor(primaryWinner)) {
314 if (loser.getFaction() == market.getFaction()) {
316 patrolBattlesLost.add(1);
320 }
else if (primaryWinner.getFaction() == market.getFaction()) {
322 if (loser.getFaction().getId().equals(Factions.PIRATES))
return;
323 if (loser.getFaction().getId().equals(Factions.LUDDIC_PATH))
return;
325 patrolBattlesLost.sub(1);