76 patrolBattlesLost.advance(days);
78 float losses = patrolBattlesLost.getAverage();
81 tracker.advance(days * Math.max(1f, losses));
82 if (!tracker.intervalElapsed())
return;
84 if (market.hasCondition(Conditions.DECIVILIZED))
return;
90 List<PatrolFleetData>
remove =
new ArrayList<PatrolFleetData>();
91 for (PatrolFleetData data : activePatrols) {
92 if (data.stub.getContainingLocation() ==
null ||
93 (!data.stub.getContainingLocation().getFleets().contains(data.stub.getFleet()) &&
94 !data.stub.getContainingLocation().getFleetStubs().contains(data.stub))) {
96 log.info(
"Cleaning up orphaned patrol [" + data.stub.getId() +
"] for market [" + market.getName() +
"]");
99 activePatrols.removeAll(
remove);
107 maxPatrols = (int) (Math.max(1, market.getSize() - 3) * (market.getStabilityValue() / 10f)) +
108 (int) Math.max(0, Math.min(losses, 5));
109 if (maxPatrols < 1) maxPatrols = 1;
111 boolean hasStationOrSpaceport = market.hasIndustry(Industries.ORBITALSTATION) ||
112 market.hasSpaceport() ||
113 market.hasIndustry(Industries.BATTLESTATION);
114 if (market.hasIndustry(Industries.MILITARYBASE)) {
116 if (hasStationOrSpaceport) maxPatrols++;
118 if (hasStationOrSpaceport) maxPatrols++;
124 log.debug(
"Checking whether to spawn patrol for market [" + market.getName() +
"]");
125 if (activePatrols.size() < maxPatrols) {
126 log.info(activePatrols.size() +
" out of a maximum " + maxPatrols +
" patrols in play for market [" + market.getName() +
"]");
128 WeightedRandomPicker<PatrolType> picker =
new WeightedRandomPicker<PatrolType>();
129 picker.add(PatrolType.FAST,
130 Math.max(1, maxPatrols - getCount(PatrolType.COMBAT, PatrolType.HEAVY)));
131 picker.add(PatrolType.COMBAT,
132 Math.max(1, maxPatrols - getCount(PatrolType.FAST, PatrolType.HEAVY) + market.getSize()) + losses * 0.5f);
134 if (market.getSize() >= 5) {
135 picker.add(PatrolType.HEAVY,
136 Math.max(1, maxPatrols - getCount(PatrolType.FAST, PatrolType.COMBAT) + market.getSize() - 5) + losses);
140 PatrolType type = picker.pick();
144 float freighter = 0f;
145 String fleetType = FleetTypes.PATROL_SMALL;
148 fleetType = FleetTypes.PATROL_SMALL;
149 combat = Math.round(3f + (
float) Math.random() * 2f);
150 combat += Math.min(5f, losses * 2f);
153 fleetType = FleetTypes.PATROL_MEDIUM;
154 combat = Math.round(6f + (
float) Math.random() * 3f);
155 combat += Math.min(15f, losses * 4f);
157 tanker = Math.round((
float) Math.random());
160 fleetType = FleetTypes.PATROL_LARGE;
161 combat = Math.round(10f + (
float) Math.random() * 5f);
162 combat += Math.min(25f, losses * 6f);
168 combat *= 1f + (market.getStabilityValue() / 20f);
173 SectorEntityToken entity = market.getPrimaryEntity();
175 FleetStubAPI stub =
null;
199 PatrolFleetData data =
new PatrolFleetData(stub, type);
200 data.startingFleetPoints = combat * 3;
201 data.sourceMarket = market;
202 activePatrols.add(data);
207 stub.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_PATROL_FLEET,
true);
212 if (type == PatrolType.FAST || type == PatrolType.COMBAT) {
213 stub.getMemoryWithoutUpdate().set(MemFlags.MEMORY_KEY_CUSTOMS_INSPECTOR,
true);
216 stub.setAdmiralPost(Ranks.POST_PATROL_COMMANDER);
220 stub.setAdmiralRank(Ranks.SPACE_LIEUTENANT);
223 stub.setAdmiralRank(Ranks.SPACE_COMMANDER);
226 stub.setAdmiralRank(Ranks.SPACE_CAPTAIN);
236 log.info(
"Spawned patrol fleet [" + stub.getId() +
"] from market " + market.getName());
238 log.debug(
"Maximum number of " + maxPatrols +
" patrols already in play for market [" + market.getName() +
"]");