@@ -65,7 +65,8 @@ public class StratconContractInitializer {
65
65
/**
66
66
* Initializes the campaign state given a contract, campaign and contract definition
67
67
*/
68
- public static void initializeCampaignState (AtBContract contract , Campaign campaign , StratconContractDefinition contractDefinition ) {
68
+ public static void initializeCampaignState (AtBContract contract , Campaign campaign ,
69
+ StratconContractDefinition contractDefinition ) {
69
70
StratconCampaignState campaignState = new StratconCampaignState (contract );
70
71
campaignState .setBriefingText (contractDefinition .getBriefing () +
71
72
"<br/>" +
@@ -91,10 +92,8 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai
91
92
int planetaryTemperature = campaign .getLocation ().getPlanet ().getTemperature (campaign .getLocalDate ());
92
93
93
94
for (int x = 0 ; x < maximumTrackIndex ; x ++) {
94
- int scenarioOdds = contractDefinition .getScenarioOdds ()
95
- .get (Compute .randomInt (contractDefinition .getScenarioOdds ().size ()));
96
- int deploymentTime = contractDefinition .getDeploymentTimes ()
97
- .get (Compute .randomInt (contractDefinition .getDeploymentTimes ().size ()));
95
+ int scenarioOdds = getScenarioOdds (contractDefinition );
96
+ int deploymentTime = getDeploymentTime (contractDefinition );
98
97
99
98
StratconTrackState track = initializeTrackState (NUM_LANCES_PER_TRACK ,
100
99
scenarioOdds ,
@@ -109,16 +108,24 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai
109
108
// required lances.
110
109
int oddLanceCount = contract .getRequiredCombatTeams () % NUM_LANCES_PER_TRACK ;
111
110
if (oddLanceCount > 0 ) {
112
- int scenarioOdds = contractDefinition .getScenarioOdds ()
113
- .get (Compute .randomInt (contractDefinition .getScenarioOdds ().size ()));
114
- int deploymentTime = contractDefinition .getDeploymentTimes ()
115
- .get (Compute .randomInt (contractDefinition .getDeploymentTimes ().size ()));
111
+ int scenarioOdds = getScenarioOdds (contractDefinition );
112
+ int deploymentTime = getDeploymentTime (contractDefinition );
116
113
117
114
StratconTrackState track = initializeTrackState (oddLanceCount ,
118
115
scenarioOdds ,
119
116
deploymentTime ,
120
117
planetaryTemperature );
121
- track .setDisplayableName (String .format ("Sector %d" , campaignState .getTracks ().size ()));
118
+ track .setDisplayableName (String .format ("Sector %d" , campaignState .getTrackCount ()));
119
+ campaignState .addTrack (track );
120
+ }
121
+
122
+ // Last chance generation, to ensure we never generate a StratCon map with 0 tracks
123
+ if (campaignState .getTrackCount () == 0 ) {
124
+ int scenarioOdds = getScenarioOdds (contractDefinition );
125
+ int deploymentTime = getDeploymentTime (contractDefinition );
126
+
127
+ StratconTrackState track = initializeTrackState (1 , scenarioOdds , deploymentTime , planetaryTemperature );
128
+ track .setDisplayableName (String .format ("Sector %d" , campaignState .getTrackCount ()));
122
129
campaignState .addTrack (track );
123
130
}
124
131
@@ -129,7 +136,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai
129
136
(int ) Math .max (1 ,
130
137
-objectiveParams .objectiveCount * contract .getRequiredCombatTeams ());
131
138
132
- List <Integer > trackObjects = trackObjectDistribution (objectiveCount , campaignState .getTracks (). size ());
139
+ List <Integer > trackObjects = trackObjectDistribution (objectiveCount , campaignState .getTrackCount ());
133
140
134
141
for (int x = 0 ; x < trackObjects .size (); x ++) {
135
142
int numObjects = trackObjects .get (x );
@@ -197,7 +204,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai
197
204
(int ) (-contractDefinition .getAlliedFacilityCount () *
198
205
contract .getRequiredCombatTeams ());
199
206
200
- List <Integer > trackObjects = trackObjectDistribution (facilityCount , campaignState .getTracks (). size ());
207
+ List <Integer > trackObjects = trackObjectDistribution (facilityCount , campaignState .getTrackCount ());
201
208
202
209
for (int x = 0 ; x < trackObjects .size (); x ++) {
203
210
int numObjects = trackObjects .get (x );
@@ -214,7 +221,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai
214
221
(int ) contractDefinition .getHostileFacilityCount () :
215
222
(int ) (-contractDefinition .getHostileFacilityCount () * contract .getRequiredCombatTeams ());
216
223
217
- trackObjects = trackObjectDistribution (facilityCount , campaignState .getTracks (). size ());
224
+ trackObjects = trackObjectDistribution (facilityCount , campaignState .getTrackCount ());
218
225
219
226
for (int x = 0 ; x < trackObjects .size (); x ++) {
220
227
int numObjects = trackObjects .get (x );
@@ -283,10 +290,50 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai
283
290
// now we're done
284
291
}
285
292
293
+ /**
294
+ * Retrieves a random deployment time from the provided {@link StratconContractDefinition}.
295
+ *
296
+ * <p>The deployment time is selected randomly from the list of deployment times in the
297
+ * given {@code StratconContractDefinition}.</p>
298
+ *
299
+ * @param contractDefinition the contract definition containing deployment time options
300
+ *
301
+ * @return a randomly selected deployment time
302
+ *
303
+ * @throws IllegalArgumentException if the list of deployment times is empty
304
+ * @throws NullPointerException if {@code contractDefinition} or its deployment times list is null
305
+ * @author Illiani
306
+ * @since 0.50.05
307
+ */
308
+ private static int getDeploymentTime (StratconContractDefinition contractDefinition ) {
309
+ return contractDefinition .getDeploymentTimes ()
310
+ .get (Compute .randomInt (contractDefinition .getDeploymentTimes ().size ()));
311
+ }
312
+
313
+ /**
314
+ * Retrieves a random scenario odds value from the provided {@link StratconContractDefinition}.
315
+ *
316
+ * <p>The scenario odds are selected randomly from the list of scenario odds in the
317
+ * given {@code StratconContractDefinition}.</p>
318
+ *
319
+ * @param contractDefinition the contract definition containing scenario odds options
320
+ *
321
+ * @return a randomly selected scenario odds value
322
+ *
323
+ * @throws IllegalArgumentException if the list of scenario odds is empty
324
+ * @throws NullPointerException if {@code contractDefinition} or its scenario odds list is null
325
+ * @author Illiani
326
+ * @since 0.50.05
327
+ */
328
+ private static int getScenarioOdds (StratconContractDefinition contractDefinition ) {
329
+ return contractDefinition .getScenarioOdds ().get (Compute .randomInt (contractDefinition .getScenarioOdds ().size ()));
330
+ }
331
+
286
332
/**
287
333
* Set up initial state of a track, dimensions are based on number of assigned lances.
288
334
*/
289
- public static StratconTrackState initializeTrackState (int numLances , int scenarioOdds , int deploymentTime , int planetaryTemp ) {
335
+ public static StratconTrackState initializeTrackState (int numLances , int scenarioOdds , int deploymentTime ,
336
+ int planetaryTemp ) {
290
337
// to initialize a track,
291
338
// 1. we set the # of required lances
292
339
// 2. set the track size to a total of numlances * 28 hexes, a rectangle that is
@@ -325,6 +372,9 @@ public static StratconTrackState initializeTrackState(int numLances, int scenari
325
372
* Generates an array list representing the number of objects to place in a given number of tracks.
326
373
*/
327
374
private static List <Integer > trackObjectDistribution (int numObjects , int numTracks ) {
375
+ // This ensures we're not at risk of dividing by 0
376
+ numTracks = Math .max (1 , numTracks );
377
+
328
378
List <Integer > retVal = new ArrayList <>();
329
379
int leftOver = numObjects % numTracks ;
330
380
@@ -350,7 +400,8 @@ private static List<Integer> trackObjectDistribution(int numObjects, int numTrac
350
400
* Avoids places with existing facilities and scenarios, capable of taking facility sub set and setting strategic
351
401
* objective flag.
352
402
*/
353
- private static void initializeTrackFacilities (StratconTrackState trackState , int numFacilities , ForceAlignment owner , boolean strategicObjective , List <String > modifiers ) {
403
+ private static void initializeTrackFacilities (StratconTrackState trackState , int numFacilities ,
404
+ ForceAlignment owner , boolean strategicObjective , List <String > modifiers ) {
354
405
355
406
int trackSize = trackState .getWidth () * trackState .getHeight ();
356
407
@@ -424,7 +475,9 @@ private static void initializeTrackFacilities(StratconTrackState trackState, int
424
475
* @param objectiveModifiers a list of optional {@link String} modifiers to apply to the generated scenarios; can be
425
476
* {@code null} if no modifiers are required
426
477
*/
427
- private static void initializeObjectiveScenarios (Campaign campaign , AtBContract contract , StratconTrackState trackState , int numScenarios , List <String > objectiveScenarios , List <String > objectiveModifiers ) {
478
+ private static void initializeObjectiveScenarios (Campaign campaign , AtBContract contract ,
479
+ StratconTrackState trackState , int numScenarios , List <String > objectiveScenarios ,
480
+ List <String > objectiveModifiers ) {
428
481
// pick scenario from subset
429
482
// place it on the map somewhere nothing else has been placed yet
430
483
// if it's a facility scenario, place the facility
@@ -551,7 +604,8 @@ private static void initializeObjectiveScenarios(Campaign campaign, AtBContract
551
604
* @return a {@link StratconCoords} object representing the location of a suitable, unoccupied coordinate, or
552
605
* {@code null} if no valid coordinates are available
553
606
*/
554
- public static @ Nullable StratconCoords getUnoccupiedCoords (StratconTrackState trackState , boolean allowPlayerFacilities , boolean allowPlayerForces , boolean emphasizeStrategicTargets ) {
607
+ public static @ Nullable StratconCoords getUnoccupiedCoords (StratconTrackState trackState ,
608
+ boolean allowPlayerFacilities , boolean allowPlayerForces , boolean emphasizeStrategicTargets ) {
555
609
final int trackHeight = trackState .getHeight ();
556
610
final int trackWidth = trackState .getWidth ();
557
611
0 commit comments