From b80ba27bc496f1163d3ae8d7077514c69f352eb3 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 14:42:47 -0600 Subject: [PATCH 01/22] Add planetary diameter to track state initialization Added the calculation of planetary diameter to the initialization of StratconTrackState. This allows the track size to be set proportionally based on the planet's surface area, ensuring more realistic and varied gameplay environments. --- .../stratcon/StratconContractInitializer.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 2a18790323..47585721e9 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -70,6 +70,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai int maximumTrackIndex = Math.max(0, contract.getRequiredLances() / NUM_LANCES_PER_TRACK); int planetaryTemperature = campaign.getLocation().getPlanet().getTemperature(campaign.getLocalDate()); + double planetaryDiameter = campaign.getLocation().getPlanet().getDiameter(); for (int x = 0; x < maximumTrackIndex; x++) { int scenarioOdds = contractDefinition.getScenarioOdds() @@ -78,7 +79,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai .get(Compute.randomInt(contractDefinition.getDeploymentTimes().size())); StratconTrackState track = initializeTrackState(NUM_LANCES_PER_TRACK, scenarioOdds, deploymentTime, - planetaryTemperature); + planetaryTemperature, planetaryDiameter); track.setDisplayableName(String.format("Sector %d", x)); campaignState.addTrack(track); } @@ -94,7 +95,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai .get(Compute.randomInt(contractDefinition.getDeploymentTimes().size())); StratconTrackState track = initializeTrackState(oddLanceCount, scenarioOdds, deploymentTime, - planetaryTemperature); + planetaryTemperature, planetaryDiameter); track.setDisplayableName(String.format("Sector %d", campaignState.getTracks().size())); campaignState.addTrack(track); } @@ -193,6 +194,8 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai for (StratconTrackState track : campaignState.getTracks()) { track.getStrategicObjectives().clear(); } + } else { + // Initialize non-objective scenarios } // now we're done @@ -203,20 +206,24 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai * lances. */ public static StratconTrackState initializeTrackState(int numLances, int scenarioOdds, - int deploymentTime, int planetaryTemp) { + int deploymentTime, int planetaryTemp, + double planetaryDiameter) { // to initialize a track, // 1. we set the # of required lances - // 2. set the track size to a total of numlances * 28 hexes, a rectangle that is + // 2. set the track size to a total of numlances * 84 hexes, a rectangle that is // wider than it is taller - // the idea being to create a roughly rectangular playing field that, - // if one deploys a scout lance each week to a different spot, can be more or - // less fully covered StratconTrackState retVal = new StratconTrackState(); retVal.setRequiredLanceCount(numLances); + // calculate planet surface area + double radius = planetaryDiameter / 2; + double planetSurfaceArea = 4 * Math.PI * Math.pow(radius, 2); + // This gives us a decently sized track, without it feeling too large + planetSurfaceArea /= 1000000; + // set width and height - int numHexes = numLances * 28; + int numHexes = (int) Math.round(planetSurfaceArea); int height = (int) Math.floor(Math.sqrt(numHexes)); int width = numHexes / height; retVal.setWidth(width); From bdf3772b236e4c9b3649841b5f388952c9560696 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 15:09:32 -0600 Subject: [PATCH 02/22] Refactor Stratcon scenario generation to handle null scenarios Added null checks throughout Stratcon scenario generation methods to handle potential null scenarios. Created new methods and updated existing ones to ensure robust error handling and to return null if scenario creation fails. --- .../stratcon/StratconRulesManager.java | 260 ++++++++++++++---- 1 file changed, 202 insertions(+), 58 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index ec47576c29..59e3f2d96e 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -52,6 +52,7 @@ import java.util.*; import java.util.stream.Collectors; +import static mekhq.campaign.force.Force.FORCE_NONE; import static mekhq.campaign.mission.ScenarioMapParameters.MapLocation.AllGroundTerrain; import static mekhq.campaign.mission.ScenarioMapParameters.MapLocation.LowAtmosphere; import static mekhq.campaign.mission.ScenarioMapParameters.MapLocation.Space; @@ -138,7 +139,10 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont if (track.getAssignedCoordForces().containsKey(scenarioCoords)) { StratconScenario scenario = generateScenarioForExistingForces(scenarioCoords, track.getAssignedCoordForces().get(scenarioCoords), contract, campaign, track); - generatedScenarios.add(scenario); + + if (scenario != null) { + generatedScenarios.add(scenario); + } continue; } @@ -164,7 +168,10 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont } StratconScenario scenario = setupScenario(scenarioCoords, randomForceID, campaign, contract, track); - generatedScenarios.add(scenario); + + if (scenario != null) { + generatedScenarios.add(scenario); + } } } @@ -190,31 +197,44 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont } /** - * Creates a new StratCon scenario, placing it in an unoccupied location on the specified track. - * If no track is specified, a random one will be chosen. - * An optional scenario template can be applied. - * This method is based on {@code generateScenariosForTrack()}, designed to simplify the - * process by which external classes can add new StratCon scenarios. + * Generates a StratCon scenario. + * This is a utility method that allows us to generate a scenario quickly without specifying + * track state and scenario template. * - * @param campaign The campaign object encapsulating the current campaign state. - * @param contract The contract associated with the current scenario. - * @param track The {@link StratconTrackState} the scenario should be assigned to, or - * {@code null} to select a random track. - * @param template A specific {@link ScenarioTemplate} to use for scenario generation, - * or {@code null} to select scenario template randomly. + * @param campaign The current campaign. + * @param contract The contract associated with the scenario. + * @return A newly generated {@link StratconScenario}, or {@code null} if scenario creation fails. */ - public static void generateExternalScenario(Campaign campaign, AtBContract contract, - @Nullable StratconTrackState track, @Nullable ScenarioTemplate template) { + public static @Nullable StratconScenario generateExternalScenario(Campaign campaign, AtBContract contract) { + return generateExternalScenario(campaign, contract, null, null, null); + } + + /** + * Generates a new StratCon scenario using advanced configuration. + * It provides a scenario based on a given campaign, contract, track, template. + * This is meant for scenario control on a higher level than the overloading methods. + * + * @param campaign The current campaign. + * @param contract The contract associated with the scenario. + * @param track The {@link StratconTrackState} the scenario should be assigned to, or + * {@code null} to select a random track. + * @param scenarioCoords The {@link StratconCoords} where in the track to place the scenario, or + * {@code null} to select a random hex. If populated, {@code track} cannot be + * {@code null} + * @param template A specific {@link ScenarioTemplate} to use for scenario generation, + * or {@code null} to select scenario template randomly. + * @return A newly generated {@link StratconScenario}, or {@code null} if scenario creation fails. + */ + public static @Nullable StratconScenario generateExternalScenario(Campaign campaign, AtBContract contract, + @Nullable StratconTrackState track, @Nullable StratconCoords scenarioCoords, + @Nullable ScenarioTemplate template) { // If we're not generating for a specific track, randomly pick one. if (track == null) { - List tracks = contract.getStratconCampaignState().getTracks(); - Random rand = new Random(); - - if (!tracks.isEmpty()) { - track = tracks.get(rand.nextInt(tracks.size())); - } else { - logger.error("No tracks available. Aborting scenario generation."); - return; + track = getRandomTrack(contract); + + if (track == null) { + logger.error("Failed to generate a random track, aborting scenario generation."); + return null; } } @@ -226,11 +246,13 @@ public static void generateExternalScenario(Campaign campaign, AtBContract contr Map> sortedAvailableForceIDs = sortForcesByMapType(availableForceIDs, campaign); // Select the target coords. - StratconCoords scenarioCoords = getUnoccupiedCoords(track); + if (scenarioCoords == null) { + scenarioCoords = getUnoccupiedCoords(track); + } if (scenarioCoords == null) { - logger.warn("Target track is full, aborting scenario generation"); - return; + logger.warn("Target track is full, aborting scenario generation."); + return null; } // If forces are already assigned to the target coordinates, use those instead of randomly @@ -266,14 +288,104 @@ public static void generateExternalScenario(Campaign campaign, AtBContract contr // If we haven't generated a scenario yet, it's because we need to pick a random force. if (scenario == null) { - int randomForceIndex = Compute.randomInt(availableForceIDs.size()); - int randomForceID = availableForceIDs.get(randomForceIndex); + int availableForces = availableForceIDs.size(); + int randomForceID = FORCE_NONE; + + if (availableForces > 0) { + int randomForceIndex = Compute.randomInt(availableForces); + randomForceID = availableForceIDs.get(randomForceIndex); + } scenario = setupScenario(scenarioCoords, randomForceID, campaign, contract, track, template); } + if (scenario == null) { + return null; + } + // We end by finalizing the scenario finalizeBackingScenario(campaign, contract, track, autoAssignLances, scenario); + + // We return the scenario in case we want to make specific changes. + return scenario; + } + + /** + * Adds a {@link StratconScenario} to the specified contract. This scenario is cloaked so will + * not be visible until the player uncovers it. + * If no {@link StratconTrackState} or {@link ScenarioTemplate} is provided, random one will be + * picked. + * + * @param campaign The current campaign. + * @param contract The {@link AtBContract} associated with the scenario. + * @param trackState The {@link StratconTrackState} in which the scenario occurs. + * If {@code null}, a random trackState is selected. + * @param template The {@link ScenarioTemplate} for the scenario. + * If {@code null}, the default template is used. + * + * @return The created {@link StratconScenario} or @code null}, + * if no {@link ScenarioTemplate} is found or if all coordinates in the provided + * {@link StratconTrackState} are occupied (and therefore, scenario placement is not possible). + */ + public static @Nullable StratconScenario addHiddenExternalScenario(Campaign campaign, AtBContract contract, + @Nullable StratconTrackState trackState, + @Nullable ScenarioTemplate template) { + // If we're not generating for a specific track, randomly pick one. + if (trackState == null) { + trackState = getRandomTrack(contract); + + if (trackState == null) { + logger.error("Failed to generate a random track, aborting scenario generation."); + return null; + } + } + + StratconCoords coords = getUnoccupiedCoords(trackState); + + if (coords == null) { + logger.error(String.format("Unable to place objective scenario on track %s," + + " as all coords were occupied. Aborting.", + trackState.getDisplayableName())); + return null; + } + + // create scenario - don't assign a force yet + StratconScenario scenario = StratconRulesManager.generateScenario(campaign, contract, + trackState, FORCE_NONE, coords, template); + + if (scenario == null) { + return null; + } + + // clear dates, because we don't want the scenario disappearing on us + scenario.setDeploymentDate(null); + scenario.setActionDate(null); + scenario.setReturnDate(null); + scenario.setStrategicObjective(true); + scenario.getBackingScenario().setCloaked(true); + + trackState.addScenario(scenario); + + return scenario; + } + + /** + * Fetches a random {@link StratconTrackState} from the {@link StratconCampaignState}. + * If no tracks are present, it logs an error message and returns {@code null}. + * + * @param contract The {@link AtBContract} from which the track state will be fetched. + * @return The randomly chosen {@link StratconTrackState}, or {@code null} if no tracks are available. + */ + public static @Nullable StratconTrackState getRandomTrack(AtBContract contract) { + List tracks = contract.getStratconCampaignState().getTracks(); + Random rand = new Random(); + + if (!tracks.isEmpty()) { + return tracks.get(rand.nextInt(tracks.size())); + } else { + logger.error("No tracks available. Unable to fetch random track"); + return null; + } } /** @@ -291,7 +403,7 @@ private static void finalizeBackingScenario(Campaign campaign, AtBContract contr StratconScenario scenario) { AtBDynamicScenarioFactory.finalizeScenario(scenario.getBackingScenario(), contract, campaign); setScenarioParametersFromBiome(track, scenario); - swapInPlayerUnits(scenario, campaign, Force.FORCE_NONE); + swapInPlayerUnits(scenario, campaign, FORCE_NONE); if (!autoAssignLances && !scenario.ignoreForceAutoAssignment()) { for (int forceID : scenario.getPlayerTemplateForceIDs()) { @@ -399,7 +511,7 @@ private static void swapInPlayerUnits(StratconScenario scenario, Campaign campai Collection potentialUnits = new HashSet<>(); // find units in player's campaign by default, all units in the TO&E are eligible - if (explicitForceID == Force.FORCE_NONE) { + if (explicitForceID == FORCE_NONE) { for (UUID unitId : campaign.getForces().getUnits()) { try { potentialUnits.add(campaign.getUnit(unitId)); @@ -457,7 +569,7 @@ private static void swapInPlayerUnits(StratconScenario scenario, Campaign campai * @param track The relevant StratCon track. * @return The newly generated {@link StratconScenario}. */ - public static StratconScenario generateScenarioForExistingForces(StratconCoords scenarioCoords, + public static @Nullable StratconScenario generateScenarioForExistingForces(StratconCoords scenarioCoords, Set forceIDs, AtBContract contract, Campaign campaign, StratconTrackState track) { return generateScenarioForExistingForces(scenarioCoords, forceIDs, contract, campaign, @@ -478,7 +590,7 @@ public static StratconScenario generateScenarioForExistingForces(StratconCoords * select a random template. * @return The newly generated {@link StratconScenario}. */ - public static StratconScenario generateScenarioForExistingForces(StratconCoords scenarioCoords, + public static @Nullable StratconScenario generateScenarioForExistingForces(StratconCoords scenarioCoords, Set forceIDs, AtBContract contract, Campaign campaign, StratconTrackState track, @Nullable ScenarioTemplate template) { boolean firstForce = true; @@ -488,6 +600,10 @@ public static StratconScenario generateScenarioForExistingForces(StratconCoords if (firstForce) { scenario = setupScenario(scenarioCoords, forceID, campaign, contract, track, template); firstForce = false; + + if (scenario == null) { + return null; + } } else { scenario.incrementRequiredPlayerLances(); scenario.addPrimaryForce(forceID); @@ -563,7 +679,7 @@ public static void deployForceToCoords(StratconCoords coords, int forceID, Campa * @param track The relevant StratCon track. * @return The newly set up {@link StratconScenario}. */ - private static StratconScenario setupScenario(StratconCoords coords, int forceID, Campaign campaign, + private static @Nullable StratconScenario setupScenario(StratconCoords coords, int forceID, Campaign campaign, AtBContract contract, StratconTrackState track) { return setupScenario(coords, forceID, campaign, contract, track, null); } @@ -586,8 +702,9 @@ private static StratconScenario setupScenario(StratconCoords coords, int forceID * {@code null} to select the scenario template randomly. * @return The newly set up {@link StratconScenario}. */ - private static StratconScenario setupScenario(StratconCoords coords, int forceID, Campaign campaign, - AtBContract contract, StratconTrackState track, @Nullable ScenarioTemplate template) { + private static @Nullable StratconScenario setupScenario(StratconCoords coords, int forceID, Campaign campaign, + AtBContract contract, StratconTrackState track, + @Nullable ScenarioTemplate template) { StratconScenario scenario; if (track.getFacilities().containsKey(coords)) { @@ -603,6 +720,10 @@ private static StratconScenario setupScenario(StratconCoords coords, int forceID scenario = generateScenario(campaign, contract, track, forceID, coords); } + if (scenario == null) { + return null; + } + // we may generate a facility scenario randomly - if so, do the facility-related // stuff and add a new facility to the track if (scenario.getBackingScenario().getTemplate().isFacilityScenario()) { @@ -911,10 +1032,17 @@ public static void commitPrimaryForces(Campaign campaign, StratconScenario scena * is on defence */ private static boolean commanderLanceHasDefensiveAssignment(AtBDynamicScenario scenario, Campaign campaign) { - Unit commanderUnit = scenario.getLanceCommander(campaign).getUnit(); - Lance lance = campaign.getLances().get(commanderUnit.getForceId()); + Person lanceCommander = scenario.getLanceCommander(campaign); + if (lanceCommander != null){ + Unit commanderUnit = lanceCommander.getUnit(); + if (commanderUnit != null) { + Lance lance = campaign.getLances().get(commanderUnit.getForceId()); + + return (lance != null) && lance.getRole().isDefence(); + } + } - return (lance != null) && lance.getRole().isDefence(); + return false; } /** @@ -960,7 +1088,7 @@ private static Map> sortForcesByMapType(List * given force, on the * given track. Also registers it with the track and campaign. */ - private static StratconScenario generateScenario(Campaign campaign, AtBContract contract, StratconTrackState track, + private static @Nullable StratconScenario generateScenario(Campaign campaign, AtBContract contract, StratconTrackState track, int forceID, StratconCoords coords) { int unitType = campaign.getForce(forceID).getPrimaryUnitType(campaign); ScenarioTemplate template = StratconScenarioFactory.getRandomScenario(unitType); @@ -976,10 +1104,27 @@ private static StratconScenario generateScenario(Campaign campaign, AtBContract * given force, on the * given track, using the given template. Also registers it with the campaign. */ - static StratconScenario generateScenario(Campaign campaign, AtBContract contract, StratconTrackState track, + static @Nullable StratconScenario generateScenario(Campaign campaign, AtBContract contract, StratconTrackState track, int forceID, StratconCoords coords, ScenarioTemplate template) { StratconScenario scenario = new StratconScenario(); + if (template == null) { + int unitType = UnitType.MEK; + + try { + unitType = campaign.getForce(forceID).getPrimaryUnitType(campaign); + } catch (NullPointerException ignored) { + // This just means the player has no units + } + + template = StratconScenarioFactory.getRandomScenario(unitType); + } + + if (template == null) { + logger.error("Failed to fetch random scenario template. Aborting scenario generation."); + return null; + } + AtBDynamicScenario backingScenario = AtBDynamicScenarioFactory.initializeScenarioFromTemplate(template, contract, campaign); scenario.setBackingScenario(backingScenario); @@ -1011,10 +1156,10 @@ static StratconScenario generateScenario(Campaign campaign, AtBContract contract // dates, otherwise, the report messages for new scenarios look weird // also, suppress the "new scenario" report if not generating a scenario // for a specific force, as this indicates a contract initialization - campaign.addScenario(backingScenario, contract, forceID == Force.FORCE_NONE); + campaign.addScenario(backingScenario, contract, forceID == FORCE_NONE); scenario.setBackingScenarioID(backingScenario.getId()); - if (forceID > Force.FORCE_NONE) { + if (forceID > FORCE_NONE) { scenario.addPrimaryForce(forceID); } @@ -1252,7 +1397,6 @@ public static boolean forceCompositionMatchesDeclaredUnitType(int primaryUnitTyp * @return List of available force IDs. */ public static List getAvailableForceIDs(Campaign campaign) { - // first, we gather a set of all forces that are already deployed to a track so // we eliminate those later Set forcesInTracks = campaign.getActiveAtBContracts().stream() @@ -1664,34 +1808,34 @@ public static void updateFacilityForScenario(AtBScenario scenario, AtBContract c * ResolveScenarioTracker.finish() * has been invoked. */ - public static void processScenarioCompletion(ResolveScenarioTracker rst) { - if (rst.getMission() instanceof AtBContract) { - StratconCampaignState campaignState = ((AtBContract) rst.getMission()).getStratconCampaignState(); + public static void processScenarioCompletion(ResolveScenarioTracker tracker) { + Campaign campaign = tracker.getCampaign(); + Mission mission = tracker.getMission(); + + if (mission instanceof AtBContract) { + StratconCampaignState campaignState = ((AtBContract) mission).getStratconCampaignState(); if (campaignState == null) { return; } + Scenario backingScenario = tracker.getScenario(); + + boolean victory = backingScenario.getStatus().isOverallVictory(); + for (StratconTrackState track : campaignState.getTracks()) { - if (track.getBackingScenariosMap().containsKey(rst.getScenario().getId())) { + if (track.getBackingScenariosMap().containsKey(backingScenario.getId())) { // things that may potentially happen: // scenario is removed from track - implemented // track gets remaining forces added to reinforcement pool // facility gets remaining forces stored in reinforcement pool // process VP and SO - StratconScenario scenario = track.getBackingScenariosMap().get(rst.getScenario().getId()); + StratconScenario scenario = track.getBackingScenariosMap().get(backingScenario.getId()); StratconFacility facility = track.getFacility(scenario.getCoords()); - boolean victory = rst.getScenario().getStatus().isOverallVictory(); - boolean draw = rst.getScenario().getStatus().isDraw(); - - if (scenario.isRequiredScenario()) { - if (draw) { - // do nothing - } else { - campaignState.updateVictoryPoints(victory ? 1 : -1); - } + if (scenario.isRequiredScenario() && !backingScenario.getStatus().isDraw()) { + campaignState.updateVictoryPoints(victory ? 1 : -1); } // this must be done before removing the scenario from the track @@ -1702,7 +1846,7 @@ public static void processScenarioCompletion(ResolveScenarioTracker rst) { switchFacilityOwner(facility); } - processTrackForceReturnDates(track, rst.getCampaign()); + processTrackForceReturnDates(track, campaign); track.removeScenario(scenario); break; From 01e323051300a4fba901f21a9368581e1e8f8d60 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 15:09:47 -0600 Subject: [PATCH 03/22] Add `getSize` method to StratconTrackState Implemented a `getSize` method to calculate the track size based on width and height. This change enhances the functionality by providing a straightforward way to retrieve the total size of the track. Additionally, minor formatting adjustments were made for code consistency. --- .../mekhq/campaign/stratcon/StratconTrackState.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconTrackState.java b/MekHQ/src/mekhq/campaign/stratcon/StratconTrackState.java index cdfa08cf01..622dd4c2ca 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconTrackState.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconTrackState.java @@ -23,9 +23,9 @@ import jakarta.xml.bind.annotation.XmlRootElement; import jakarta.xml.bind.annotation.XmlTransient; import megamek.common.annotations.Nullable; -import mekhq.utilities.MHQXMLUtility; import mekhq.campaign.mission.ScenarioForceTemplate.ForceAlignment; import mekhq.campaign.stratcon.StratconContractDefinition.StrategicObjectiveType; +import mekhq.utilities.MHQXMLUtility; import java.time.LocalDate; import java.util.*; @@ -107,6 +107,13 @@ public void setHeight(int height) { this.height = height; } + /** + * @return The size of the track derived by multiplying width and height. + */ + public int getSize() { + return width * height; + } + @XmlElementWrapper(name = "trackFacilities") @XmlElement(name = "facility") public Map getFacilities() { @@ -159,7 +166,7 @@ public void removeScenario(int campaignScenarioID) { removeScenario(getBackingScenariosMap().get(campaignScenarioID)); } } - + /** * Removes a StratconScenario from this track. */ @@ -169,7 +176,7 @@ public void removeScenario(StratconScenario scenario) { Map objectives = getObjectivesByCoords(); if (objectives.containsKey(scenario.getCoords())) { StrategicObjectiveType objectiveType = objectives.get(scenario.getCoords()).getObjectiveType(); - + switch (objectiveType) { case RequiredScenarioVictory: case SpecificScenarioVictory: From 08f789bb93283dfcbd9e5237175a34dd922b0a62 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 15:09:56 -0600 Subject: [PATCH 04/22] Initialize non-objective scenarios for StratCon contracts Added logic to seed sectors with hidden forces based on contract type in StratconContractInitializer. Differentiated scenario creation between garrison, raid, pirate hunting, and planetary assault contracts. --- .../stratcon/StratconContractInitializer.java | 35 +++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 47585721e9..afc2221731 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -25,6 +25,7 @@ import mekhq.campaign.mission.*; import mekhq.campaign.mission.ScenarioForceTemplate.ForceAlignment; import mekhq.campaign.mission.atb.AtBScenarioModifier; +import mekhq.campaign.mission.enums.AtBContractType; import mekhq.campaign.mission.enums.ContractCommandRights; import mekhq.campaign.stratcon.StratconContractDefinition.ObjectiveParameters; import mekhq.campaign.stratcon.StratconContractDefinition.StrategicObjectiveType; @@ -33,6 +34,8 @@ import java.util.Collections; import java.util.List; +import static mekhq.campaign.stratcon.StratconRulesManager.addHiddenExternalScenario; + /** * This class handles StratCon state initialization when a contract is signed. */ @@ -185,6 +188,36 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai false, Collections.emptyList()); } + // Initialize non-objective scenarios + for (StratconTrackState track : campaignState.getTracks()) { + AtBContractType contractType = contract.getContractType(); + + // If the contract is a garrison type, we don't want to generate what will appear to be + // a full-scale invasion on day one. + if (contractType.isGarrisonType()) { + break; + } + + // otherwise, seed each sector with hidden forces. + // the number of hidden forces is dependent on the type of contract. + final int OFFENSIVE_MULTIPLIER = 10; + final int DEFENSIVE_MULTIPLIER = 20; + + int multiplier = DEFENSIVE_MULTIPLIER; + + if (contractType.isRaidType() || contractType.isPirateHunting()) { + multiplier = OFFENSIVE_MULTIPLIER; + } else if (contract.getContractType().isPlanetaryAssault()) { + multiplier = OFFENSIVE_MULTIPLIER / 2; + } + + int preDeployedScenarios = track.getSize() / multiplier; + + for (int i = 0; i < preDeployedScenarios; i++) { + addHiddenExternalScenario(campaign, contract, track, null); + } + } + // clean up objectives for integrated command: // we're still going to have all the objective facilities and scenarios // but the player has no control over where they go, so they're @@ -194,8 +227,6 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai for (StratconTrackState track : campaignState.getTracks()) { track.getStrategicObjectives().clear(); } - } else { - // Initialize non-objective scenarios } // now we're done From 127d15d548a811afa1ad882fb108300876bd792b Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 15:19:19 -0600 Subject: [PATCH 05/22] Update contract initializers for pirate and guerrilla warfare Modified contract generation to prevent full-scale invasions for pirate hunting contracts. Adjusted multiplier settings to treat guerrilla warfare similarly to raid types. These changes enhance the accuracy and realism of mission deployment scenarios. --- .../campaign/stratcon/StratconContractInitializer.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index afc2221731..3f5cee9193 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -193,8 +193,9 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai AtBContractType contractType = contract.getContractType(); // If the contract is a garrison type, we don't want to generate what will appear to be - // a full-scale invasion on day one. - if (contractType.isGarrisonType()) { + // a full-scale invasion on day one. Furthermore, Pirates do not have enough resources + // to deploy standing forces in this manner. + if (contractType.isGarrisonType() || contractType.isPirateHunting()) { break; } @@ -205,7 +206,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai int multiplier = DEFENSIVE_MULTIPLIER; - if (contractType.isRaidType() || contractType.isPirateHunting()) { + if (contractType.isRaidType() || contractType.isGuerrillaWarfare()) { multiplier = OFFENSIVE_MULTIPLIER; } else if (contract.getContractType().isPlanetaryAssault()) { multiplier = OFFENSIVE_MULTIPLIER / 2; From 01a83090a527b981b33e81cca874c35f4f3f6554 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 18:24:27 -0600 Subject: [PATCH 06/22] Refactored scenario generation logic in Stratcon modules Removed redundant scenario generation checks and refactored pre-deployment probability calculations. Simplified conditionals in StratconRulesManager, and integrated scenario odds computation into StratconContractInitializer. This enhances code clarity and consistency in scenario management. --- .../campaign/stratcon/StratconContractInitializer.java | 6 +++++- .../mekhq/campaign/stratcon/StratconRulesManager.java | 10 +--------- .../mekhq/gui/stratcon/CampaignManagementDialog.java | 2 +- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 3f5cee9193..2db5df01f9 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -34,7 +34,9 @@ import java.util.Collections; import java.util.List; +import static java.lang.Math.round; import static mekhq.campaign.stratcon.StratconRulesManager.addHiddenExternalScenario; +import static mekhq.campaign.stratcon.StratconRulesManager.calculateScenarioOdds; /** * This class handles StratCon state initialization when a contract is signed. @@ -213,6 +215,8 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai } int preDeployedScenarios = track.getSize() / multiplier; + preDeployedScenarios = (int) round(preDeployedScenarios + * ((double) calculateScenarioOdds(track, contract, false) / 100)); for (int i = 0; i < preDeployedScenarios; i++) { addHiddenExternalScenario(campaign, contract, track, null); @@ -255,7 +259,7 @@ public static StratconTrackState initializeTrackState(int numLances, int scenari planetSurfaceArea /= 1000000; // set width and height - int numHexes = (int) Math.round(planetSurfaceArea); + int numHexes = (int) round(planetSurfaceArea); int height = (int) Math.floor(Math.sqrt(numHexes)); int width = numHexes / height; retVal.setWidth(width); diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index 59e3f2d96e..22bcc26096 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -649,22 +649,14 @@ public static void deployForceToCoords(StratconCoords coords, int forceID, Campa // don't create a scenario on top of allied facilities StratconFacility facility = track.getFacility(coords); boolean isNonAlliedFacility = (facility != null) && (facility.getOwner() != ForceAlignment.Allied); - int targetNum = calculateScenarioOdds(track, contract, true); - boolean spawnScenario = (facility == null) && (Compute.randomInt(100) <= targetNum); - if (isNonAlliedFacility || spawnScenario) { + if (isNonAlliedFacility) { StratconScenario scenario = setupScenario(coords, forceID, campaign, contract, track); // we deploy immediately in this case, since we deployed the force manually setScenarioDates(0, track, campaign, scenario); AtBDynamicScenarioFactory.finalizeScenario(scenario.getBackingScenario(), contract, campaign); setScenarioParametersFromBiome(track, scenario); - // if we wound up with a field scenario, we may sub in dropships carrying - // units of the force in question - if (spawnScenario && !isNonAlliedFacility) { - swapInPlayerUnits(scenario, campaign, forceID); - } - commitPrimaryForces(campaign, scenario, track); } } diff --git a/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java b/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java index 89522fe938..60de457509 100644 --- a/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java +++ b/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java @@ -55,7 +55,7 @@ public void display(StratconCampaignState campaignState, StratconTrackState curr lblTrackScenarioOdds.setVisible(gmMode); if (gmMode) { - lblTrackScenarioOdds.setText(String.format("Track Scenario Odds: %d%%", + lblTrackScenarioOdds.setText(String.format("Track Reinforcement Odds: %d%%", StratconRulesManager.calculateScenarioOdds(currentTrack, campaignState.getContract(), false))); } } From 278f10a63232e2592da26c980e993b80b64ed6f0 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 19:06:05 -0600 Subject: [PATCH 07/22] Add option for scenarios to spawn on player facilities Modified scenario generation to include an option for allowing scenarios to spawn on top of player-allied facilities. Updated function signatures and added logic to accommodate this new parameter, ensuring that scenarios can now be placed more flexibly based on provided configurations. --- .../stratcon/StratconContractInitializer.java | 72 +++++++++++++------ .../stratcon/StratconRulesManager.java | 19 +++-- 2 files changed, 63 insertions(+), 28 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 2db5df01f9..d51f345fb2 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -19,6 +19,7 @@ package mekhq.campaign.stratcon; import megamek.common.Compute; +import megamek.common.annotations.Nullable; import megamek.logging.MMLogger; import mekhq.campaign.Campaign; import mekhq.campaign.force.Force; @@ -33,6 +34,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Random; import static java.lang.Math.round; import static mekhq.campaign.stratcon.StratconRulesManager.addHiddenExternalScenario; @@ -219,7 +221,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai * ((double) calculateScenarioOdds(track, contract, false) / 100)); for (int i = 0; i < preDeployedScenarios; i++) { - addHiddenExternalScenario(campaign, contract, track, null); + addHiddenExternalScenario(campaign, contract, track, null, false); } } @@ -330,7 +332,7 @@ private static void initializeTrackFacilities(StratconTrackState trackState, int sf.setStrategicObjective(strategicObjective); sf.getLocalModifiers().addAll(modifiers); - StratconCoords coords = getUnoccupiedCoords(trackState); + StratconCoords coords = getUnoccupiedCoords(trackState, false); if (coords == null) { logger.warn(String.format("Unable to place facility on track %s," + @@ -384,7 +386,7 @@ private static void initializeObjectiveScenarios(Campaign campaign, AtBContract ScenarioTemplate template = StratconScenarioFactory.getSpecificScenario( objectiveScenarios.get(Compute.randomInt(objectiveScenarios.size()))); - StratconCoords coords = getUnoccupiedCoords(trackState); + StratconCoords coords = getUnoccupiedCoords(trackState, false); if (coords == null) { logger.error(String.format("Unable to place objective scenario on track %s," + @@ -430,30 +432,56 @@ private static void initializeObjectiveScenarios(Campaign campaign, AtBContract } /** - * Utility function that, given a track state, picks a random set of unoccupied - * coordinates. + * Searches for a suitable coordinate on the given {@link StratconTrackState}. + * The suitability of a coordinate is determined by the absence of a scenario in the coordinate + * and the absence of a facility or the presence of a player-allied facility (determined by the + * value of allowPlayerFacilities). + *

+ * The method iterates through all possible coordinates and shuffles them to ensure randomness. + * A random coordinate is then selected from the list of suitable coordinates and returned. + * + * @param trackState the {@link StratconTrackState} object on which to perform the search + * @param allowPlayerFacilities a {@link boolean} value indicating whether player-owned facilities + * should be considered suitable + * @return a {@link StratconCoords} object representing the coordinates of a suitable location, + * or {@code null} if no suitable location was found */ - public static StratconCoords getUnoccupiedCoords(StratconTrackState trackState) { - // Maximum number of attempts - int maxAttempts = trackState.getWidth() * trackState.getHeight(); - int attempts = 0; - - int x = Compute.randomInt(trackState.getWidth()); - int y = Compute.randomInt(trackState.getHeight()); - StratconCoords coords = new StratconCoords(x, y); - - while ((trackState.getFacility(coords) != null || trackState.getScenario(coords) != null) && attempts < maxAttempts) { - x = Compute.randomInt(trackState.getWidth()); - y = Compute.randomInt(trackState.getHeight()); - coords = new StratconCoords(x, y); - attempts++; + public static @Nullable StratconCoords getUnoccupiedCoords(StratconTrackState trackState, boolean allowPlayerFacilities) { + int trackHeight = trackState.getHeight(); + int trackWidth = trackState.getWidth(); + + List suitableCoords = new ArrayList<>(); + + for (int y = 0; y < trackHeight; y++) { + for (int x = 0; x < trackWidth; x++) { + StratconCoords coords = new StratconCoords(x, y); + + if (trackState.getScenario(coords) == null) { + suitableCoords.add(coords); + continue; + } + + if (trackState.getFacility(coords) == null) { + suitableCoords.add(coords); + continue; + } + + if (trackState.getFacility(coords).getOwner() != ForceAlignment.Opposing) { + if (allowPlayerFacilities) { + suitableCoords.add(coords); + } + } + } } - if (attempts == maxAttempts) { + Collections.shuffle(suitableCoords); + + if (suitableCoords.isEmpty()) { return null; + } else { + int randomIndex = new Random().nextInt(suitableCoords.size()); + return suitableCoords.get(randomIndex); } - - return coords; } /** diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index 22bcc26096..bf5455ba70 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -120,6 +120,7 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont } else if (contract.getMoraleLevel().isOverwhelming()) { scenarioRolls += 2; } + for (int scenarioIndex = 0; scenarioIndex < scenarioRolls; scenarioIndex++) { int targetNum = calculateScenarioOdds(track, contract, false); @@ -127,7 +128,7 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont // generate a scenario if (!availableForceIDs.isEmpty() && (Compute.randomInt(100) < targetNum)) { // pick random coordinates and force to drive the scenario - StratconCoords scenarioCoords = getUnoccupiedCoords(track); + StratconCoords scenarioCoords = getUnoccupiedCoords(track, true); if (scenarioCoords == null) { logger.warn("Target track is full, skipping scenario generation"); @@ -206,7 +207,8 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont * @return A newly generated {@link StratconScenario}, or {@code null} if scenario creation fails. */ public static @Nullable StratconScenario generateExternalScenario(Campaign campaign, AtBContract contract) { - return generateExternalScenario(campaign, contract, null, null, null); + return generateExternalScenario(campaign, contract, null, null, + null, false); } /** @@ -223,11 +225,13 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont * {@code null} * @param template A specific {@link ScenarioTemplate} to use for scenario generation, * or {@code null} to select scenario template randomly. + * @param allowPlayerFacilities Whether the scenario is allowed to spawn on top of + * player-allied facilities. * @return A newly generated {@link StratconScenario}, or {@code null} if scenario creation fails. */ public static @Nullable StratconScenario generateExternalScenario(Campaign campaign, AtBContract contract, @Nullable StratconTrackState track, @Nullable StratconCoords scenarioCoords, - @Nullable ScenarioTemplate template) { + @Nullable ScenarioTemplate template, boolean allowPlayerFacilities) { // If we're not generating for a specific track, randomly pick one. if (track == null) { track = getRandomTrack(contract); @@ -247,7 +251,7 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont // Select the target coords. if (scenarioCoords == null) { - scenarioCoords = getUnoccupiedCoords(track); + scenarioCoords = getUnoccupiedCoords(track, allowPlayerFacilities); } if (scenarioCoords == null) { @@ -322,6 +326,8 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont * If {@code null}, a random trackState is selected. * @param template The {@link ScenarioTemplate} for the scenario. * If {@code null}, the default template is used. + * @param allowPlayerFacilities Whether the scenario is allowed to spawn on top of + * player-allied facilities. * * @return The created {@link StratconScenario} or @code null}, * if no {@link ScenarioTemplate} is found or if all coordinates in the provided @@ -329,7 +335,8 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont */ public static @Nullable StratconScenario addHiddenExternalScenario(Campaign campaign, AtBContract contract, @Nullable StratconTrackState trackState, - @Nullable ScenarioTemplate template) { + @Nullable ScenarioTemplate template, + boolean allowPlayerFacilities) { // If we're not generating for a specific track, randomly pick one. if (trackState == null) { trackState = getRandomTrack(contract); @@ -340,7 +347,7 @@ public static void generateScenariosForTrack(Campaign campaign, AtBContract cont } } - StratconCoords coords = getUnoccupiedCoords(trackState); + StratconCoords coords = getUnoccupiedCoords(trackState, allowPlayerFacilities); if (coords == null) { logger.error(String.format("Unable to place objective scenario on track %s," + From 19ad22066aeb50938e78a3772cd9515e5a0a8fe5 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 21:58:43 -0600 Subject: [PATCH 08/22] Refactor scenario odds and add daily movement processing Refactored the calculation of scenario odds for better readability and maintainability. Also added a new method to handle daily movement processing for scenarios in each track. Expanded pre-deployment logic and cleaned up code to enhance functionality. --- .../mekhq/campaign/mission/AtBContract.java | 16 ++- .../stratcon/StratconContractInitializer.java | 107 +++++++++++----- .../stratcon/StratconRulesManager.java | 115 ++++++++++++------ .../stratcon/CampaignManagementDialog.java | 3 +- 4 files changed, 172 insertions(+), 69 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/mission/AtBContract.java b/MekHQ/src/mekhq/campaign/mission/AtBContract.java index 9b45452716..82c298ddf7 100644 --- a/MekHQ/src/mekhq/campaign/mission/AtBContract.java +++ b/MekHQ/src/mekhq/campaign/mission/AtBContract.java @@ -52,6 +52,7 @@ import mekhq.campaign.stratcon.StratconCampaignState; import mekhq.campaign.stratcon.StratconContractDefinition; import mekhq.campaign.stratcon.StratconContractInitializer; +import mekhq.campaign.stratcon.StratconTrackState; import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.Factions; @@ -431,6 +432,7 @@ public void checkMorale(Campaign campaign, LocalDate today) { if (today.isAfter(routEnd)) { setMoraleLevel(AtBMoraleLevel.STALEMATE); routEnd = null; + updateEnemy(campaign, today); // mix it up a little } else { setMoraleLevel(AtBMoraleLevel.ROUTED); @@ -493,8 +495,20 @@ public void checkMorale(Campaign campaign, LocalDate today) { miscModifiers += 2; } + int balanceOfPower = 0; + if (campaign.getCampaignOptions().isUseStratCon()) { + balanceOfPower = -campaign.getLanceList().size() * 5; + + int enemyForceCount = 0; + for (StratconTrackState track : getStratconCampaignState().getTracks()) { + enemyForceCount = track.getScenarios().size(); + } + + balanceOfPower += enemyForceCount; + } + // Total morale modifier calculation - int totalModifier = enemySkillModifier - allySkillModifier + performanceModifier + miscModifiers; + int totalModifier = enemySkillModifier - allySkillModifier + performanceModifier + miscModifiers + balanceOfPower; int roll = Compute.d6(2) + totalModifier; // Morale level determination based on roll value diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index d51f345fb2..5718e62004 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -37,6 +37,7 @@ import java.util.Random; import static java.lang.Math.round; +import static megamek.common.Coords.ALL_DIRECTIONS; import static mekhq.campaign.stratcon.StratconRulesManager.addHiddenExternalScenario; import static mekhq.campaign.stratcon.StratconRulesManager.calculateScenarioOdds; @@ -194,35 +195,9 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai // Initialize non-objective scenarios for (StratconTrackState track : campaignState.getTracks()) { - AtBContractType contractType = contract.getContractType(); - - // If the contract is a garrison type, we don't want to generate what will appear to be - // a full-scale invasion on day one. Furthermore, Pirates do not have enough resources - // to deploy standing forces in this manner. - if (contractType.isGarrisonType() || contractType.isPirateHunting()) { + if (seedPreDeployedForces(contract, campaign, track)) { break; } - - // otherwise, seed each sector with hidden forces. - // the number of hidden forces is dependent on the type of contract. - final int OFFENSIVE_MULTIPLIER = 10; - final int DEFENSIVE_MULTIPLIER = 20; - - int multiplier = DEFENSIVE_MULTIPLIER; - - if (contractType.isRaidType() || contractType.isGuerrillaWarfare()) { - multiplier = OFFENSIVE_MULTIPLIER; - } else if (contract.getContractType().isPlanetaryAssault()) { - multiplier = OFFENSIVE_MULTIPLIER / 2; - } - - int preDeployedScenarios = track.getSize() / multiplier; - preDeployedScenarios = (int) round(preDeployedScenarios - * ((double) calculateScenarioOdds(track, contract, false) / 100)); - - for (int i = 0; i < preDeployedScenarios; i++) { - addHiddenExternalScenario(campaign, contract, track, null, false); - } } // clean up objectives for integrated command: @@ -239,6 +214,39 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai // now we're done } + public static boolean seedPreDeployedForces(AtBContract contract, Campaign campaign, StratconTrackState track) { + AtBContractType contractType = contract.getContractType(); + + // If the contract is a garrison type, we don't want to generate what will appear to be + // a full-scale invasion on day one. Furthermore, Pirates do not have enough resources + // to deploy standing forces in this manner. + if (contractType.isGarrisonType() || contractType.isPirateHunting()) { + return true; + } + + // otherwise, seed each sector with hidden forces. + // the number of hidden forces is dependent on the type of contract. + final int OFFENSIVE_MULTIPLIER = 10; + final int DEFENSIVE_MULTIPLIER = 20; + + int multiplier = DEFENSIVE_MULTIPLIER; + + if (contractType.isRaidType() || contractType.isGuerrillaWarfare()) { + multiplier = OFFENSIVE_MULTIPLIER; + } else if (contract.getContractType().isPlanetaryAssault()) { + multiplier = OFFENSIVE_MULTIPLIER / 2; + } + + int preDeployedScenarios = track.getSize() / multiplier; + preDeployedScenarios = (int) round(preDeployedScenarios + * ((double) calculateScenarioOdds(track, contract, false) / 100)); + + for (int i = 0; i < preDeployedScenarios; i++) { + addHiddenExternalScenario(campaign, contract, track, null, false); + } + return false; + } + /** * Set up initial state of a track, dimensions are based on number of assigned * lances. @@ -456,8 +464,7 @@ private static void initializeObjectiveScenarios(Campaign campaign, AtBContract for (int x = 0; x < trackWidth; x++) { StratconCoords coords = new StratconCoords(x, y); - if (trackState.getScenario(coords) == null) { - suitableCoords.add(coords); + if (trackState.getScenario(coords) != null) { continue; } @@ -484,6 +491,48 @@ private static void initializeObjectiveScenarios(Campaign campaign, AtBContract } } + /** + * Searches for and returns a suitable adjacent coordinate to the given origin coordinates on + * the provided {@link StratconTrackState}. + * The method checks all the possible directions and considers a coordinate suitable if it + * doesn't contain a scenario and if it either doesn't contain a facility or contains a + * player-allied one. + * If there are multiple suitable coordinates, one is chosen at random. + * + * @param originCoords the {@link StratconCoords} around which to search for a suitable coordinate + * @param trackState the {@link StratconTrackState} on which to perform the search + * @return a {@link StratconCoords} object representing the coordinates of a suitable adjacent + * location, or {code null} if no suitable location was found. + */ + public static @Nullable StratconCoords getUnoccupiedAdjacentCoords(StratconCoords originCoords, + StratconTrackState trackState) { + List suitableCoords = new ArrayList<>(); + + for (int direction : ALL_DIRECTIONS) { + StratconCoords newCoords = originCoords.translate(direction); + + if (trackState.getScenario(newCoords) != null) { + continue; + } + + if (trackState.getFacility(newCoords) == null) { + suitableCoords.add(newCoords); + continue; + } + + if (trackState.getFacility(newCoords).getOwner() != ForceAlignment.Opposing) { + suitableCoords.add(newCoords); + } + } + + if (suitableCoords.isEmpty()) { + return null; + } + + int randomIndex = new Random().nextInt(suitableCoords.size()); + return suitableCoords.get(randomIndex); + } + /** * Given a mission (that's an AtB contract), restore track state information, * such as pointers from StratCon scenario objects to AtB scenario objects. diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index bf5455ba70..70295c0c81 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -57,6 +57,7 @@ import static mekhq.campaign.mission.ScenarioMapParameters.MapLocation.LowAtmosphere; import static mekhq.campaign.mission.ScenarioMapParameters.MapLocation.Space; import static mekhq.campaign.mission.ScenarioMapParameters.MapLocation.SpecificGroundTerrain; +import static mekhq.campaign.stratcon.StratconContractInitializer.getUnoccupiedAdjacentCoords; import static mekhq.campaign.stratcon.StratconContractInitializer.getUnoccupiedCoords; /** @@ -1709,49 +1710,37 @@ public static boolean canManuallyDeployAnyForce(StratconCoords coords, * figure out the odds of a scenario occurring. */ public static int calculateScenarioOdds(StratconTrackState track, AtBContract contract, - boolean playerDeployingForce) { - // rules: - // ROUTED: 0% - // CRITICAL: -10% when deploying forces to track, 0% attack - // WEAKENED: -5% - // ADVANCING: +5% - // DOMINATING: +10% - // OVERWHELMING: +100% - int moraleModifier = 0; - - switch (contract.getMoraleLevel()) { - case ROUTED: - return 0; - case CRITICAL: - if (playerDeployingForce) { - moraleModifier = -10; + boolean isReinforcements) { + if (contract.getMoraleLevel().isRouted()) { + return 0; + } + + int moraleModifier = switch (contract.getMoraleLevel()) { + case CRITICAL -> { + if (isReinforcements) { + yield -10; } else { - return 0; + yield 0; } - break; - case WEAKENED: - moraleModifier = -5; - break; - case ADVANCING: - moraleModifier = 5; - break; - case DOMINATING: - if (playerDeployingForce) { - moraleModifier = 20; + } + case WEAKENED -> -5; + case ADVANCING -> 5; + case DOMINATING -> { + if (isReinforcements) { + yield 20; } else { - return 10; + yield 10; } - break; - case OVERWHELMING: - if (playerDeployingForce) { - moraleModifier = 50; + } + case OVERWHELMING -> { + if (isReinforcements) { + yield 50; } else { - return 25; + yield 25; } - break; - default: - break; - } + } + default -> 0; + }; int dataCenterModifier = track.getScenarioOddsAdjustment(); @@ -2031,6 +2020,48 @@ public static boolean processIgnoredScenario(StratconScenario scenario, Stratcon return true; } + /** + * Performs the daily movement processing for each active scenario in every track of the given + * {@link StratconCampaignState}. + * This processing involves evaluating each scenario and, if it is not yet deployed, attempting + * to move it to an unoccupied coordinate. + * If movement is possible, the scenario is updated with the new coordinates and parameters are + * set based on the new location's biome. + * If the new location contains a facility, the scenario is replaced with a facility scenario. + * + * @param campaign the current campaign + * @param campaignState the relevant {@link StratconCampaignState} + */ + public static void processDailyMovement(Campaign campaign, StratconCampaignState campaignState) { + for (StratconTrackState track : campaignState.getTracks()) { + List allScenarios = new ArrayList<>(track.getScenarios().values()); + + for (StratconScenario scenario : allScenarios) { + StratconCoords scenarioCoords = scenario.getCoords(); + + if (scenario.getDeploymentDate() == null) { + StratconCoords newCoords = getUnoccupiedAdjacentCoords(scenarioCoords, track); + + if (newCoords == null) { + continue; + } + + track.removeScenario(scenario); + track.updateScenario(scenario); + + if (track.getFacility(newCoords) == null) { + scenario.setCoords(newCoords); + setScenarioParametersFromBiome(track, scenario); + track.addScenario(scenario); + } else { + generateExternalScenario(campaign, campaignState.getContract(), track, newCoords, + null, true); + } + } + } + } + } + public void startup() { MekHQ.registerHandler(this); } @@ -2074,9 +2105,17 @@ public void handleNewDay(NewDayEvent ev) { } } - // on monday, generate new scenarios + processDailyMovement(ev.getCampaign(), campaignState); + + // on monday, generate new scenarios and reinforce existing enemy forces if (isMonday) { generateScenariosForTrack(ev.getCampaign(), contract, track); + + int reinforcementOdds = calculateScenarioOdds(track, contract, true); + + while (Compute.randomInt(100) < reinforcementOdds) { + addHiddenExternalScenario(ev.getCampaign(), contract, track, null, false); + } } } } diff --git a/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java b/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java index 60de457509..30d75d17eb 100644 --- a/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java +++ b/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java @@ -56,7 +56,8 @@ public void display(StratconCampaignState campaignState, StratconTrackState curr lblTrackScenarioOdds.setVisible(gmMode); if (gmMode) { lblTrackScenarioOdds.setText(String.format("Track Reinforcement Odds: %d%%", - StratconRulesManager.calculateScenarioOdds(currentTrack, campaignState.getContract(), false))); + StratconRulesManager.calculateScenarioOdds(currentTrack, campaignState.getContract(), + true))); } } From 363b2972103e483d4c64c22e67e7ee4a01a1dc5a Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 22:00:37 -0600 Subject: [PATCH 09/22] Update copyright years and license information Updated the copyright years to 2024 and revised the license information for consistency and accuracy. This ensures the codebase reflects the correct legal information and adheres to the project's licensing guidelines. --- .../campaign/stratcon/StratconTrackState.java | 2 +- .../stratcon/CampaignManagementDialog.java | 29 +++++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconTrackState.java b/MekHQ/src/mekhq/campaign/stratcon/StratconTrackState.java index 622dd4c2ca..322bea7a4f 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconTrackState.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconTrackState.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2022 - The MegaMek Team. All Rights Reserved. + * Copyright (c) 2020-2024 - The MegaMek Team. All Rights Reserved. * * This file is part of MekHQ. * diff --git a/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java b/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java index 30d75d17eb..b10de2352f 100644 --- a/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java +++ b/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java @@ -1,16 +1,21 @@ /* -* MegaMek - Copyright (C) 2021 - The MegaMek Team -* -* This program is free software; you can redistribute it and/or modify it under -* the terms of the GNU General Public License as published by the Free Software -* Foundation; either version 2 of the License, or (at your option) any later -* version. -* -* This program is distributed in the hope that it will be useful, but WITHOUT -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -* details. -*/ + * Copyright (c) 2021-2024 - The MegaMek Team. All Rights Reserved. + * + * This file is part of MekHQ. + * + * MekHQ is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * MekHQ is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MekHQ. If not, see . + */ package mekhq.gui.stratcon; From 11ba6b54feab96b41d5116498ca50bcb64e54624 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 22:04:10 -0600 Subject: [PATCH 10/22] Refactored seedPreDeployedForces method to be private Changed the visibility of the seedPreDeployedForces method to private and added a detailed Javadoc comment explaining its functionality. Removed redundant comments from the initializeTrackState method to improve code readability. --- .../stratcon/StratconContractInitializer.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 5718e62004..865e321374 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -214,7 +214,18 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai // now we're done } - public static boolean seedPreDeployedForces(AtBContract contract, Campaign campaign, StratconTrackState track) { + /** + * Seeds pre-deployed (hidden) forces in a {@link StratconTrackState}, taking into account + * contract type and intensity. + * + * @param contract the current contract + * @param campaign the current campaign. + * @param track the relevant {@link StratconTrackState} + * + * @return a boolean where {@code true} means forces were not deployed due to being garrison + * type or pirate hunting and {@code false} implies forces have been deployed successfully. + */ + private static boolean seedPreDeployedForces(AtBContract contract, Campaign campaign, StratconTrackState track) { AtBContractType contractType = contract.getContractType(); // If the contract is a garrison type, we don't want to generate what will appear to be @@ -254,11 +265,6 @@ public static boolean seedPreDeployedForces(AtBContract contract, Campaign campa public static StratconTrackState initializeTrackState(int numLances, int scenarioOdds, int deploymentTime, int planetaryTemp, double planetaryDiameter) { - // to initialize a track, - // 1. we set the # of required lances - // 2. set the track size to a total of numlances * 84 hexes, a rectangle that is - // wider than it is taller - StratconTrackState retVal = new StratconTrackState(); retVal.setRequiredLanceCount(numLances); From 74aa6d4244c3d59add0e98d3d72a17bec95953a4 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 22:10:26 -0600 Subject: [PATCH 11/22] Enable pre-deployed forces seeding in StratCon missions Made `seedPreDeployedForces` method public to allow seeding of pre-deployed forces in StratCon tracks. Also added logic to handle pre-deployment for garrison and pirate hunting contract types. --- MekHQ/src/mekhq/campaign/mission/AtBContract.java | 7 +++++++ .../campaign/stratcon/StratconContractInitializer.java | 6 ++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/mission/AtBContract.java b/MekHQ/src/mekhq/campaign/mission/AtBContract.java index 82c298ddf7..5ad9381a89 100644 --- a/MekHQ/src/mekhq/campaign/mission/AtBContract.java +++ b/MekHQ/src/mekhq/campaign/mission/AtBContract.java @@ -85,6 +85,7 @@ import static megamek.common.enums.SkillLevel.parseFromString; import static mekhq.campaign.mission.AtBDynamicScenarioFactory.getEntity; import static mekhq.campaign.mission.BotForceRandomizer.UNIT_WEIGHT_UNSPECIFIED; +import static mekhq.campaign.stratcon.StratconContractInitializer.seedPreDeployedForces; import static mekhq.campaign.universe.Factions.getFactionLogo; import static mekhq.campaign.universe.fameAndInfamy.BatchallFactions.BATCHALL_FACTIONS; import static mekhq.gui.dialog.HireBulkPersonnelDialog.overrideSkills; @@ -434,6 +435,12 @@ public void checkMorale(Campaign campaign, LocalDate today) { routEnd = null; updateEnemy(campaign, today); // mix it up a little + + if (campaign.getCampaignOptions().isUseStratCon()) { + for (StratconTrackState track : getStratconCampaignState().getTracks()) { + seedPreDeployedForces(this, campaign, track); + } + } } else { setMoraleLevel(AtBMoraleLevel.ROUTED); } diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 865e321374..45e05ba3c8 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -225,7 +225,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai * @return a boolean where {@code true} means forces were not deployed due to being garrison * type or pirate hunting and {@code false} implies forces have been deployed successfully. */ - private static boolean seedPreDeployedForces(AtBContract contract, Campaign campaign, StratconTrackState track) { + public static boolean seedPreDeployedForces(AtBContract contract, Campaign campaign, StratconTrackState track) { AtBContractType contractType = contract.getContractType(); // If the contract is a garrison type, we don't want to generate what will appear to be @@ -242,7 +242,9 @@ private static boolean seedPreDeployedForces(AtBContract contract, Campaign camp int multiplier = DEFENSIVE_MULTIPLIER; - if (contractType.isRaidType() || contractType.isGuerrillaWarfare()) { + if (contractType.isGarrisonType() || contractType.isPirateHunting()) { + multiplier = (int) (DEFENSIVE_MULTIPLIER * 1.5); + } else if (contractType.isRaidType() || contractType.isGuerrillaWarfare()) { multiplier = OFFENSIVE_MULTIPLIER; } else if (contract.getContractType().isPlanetaryAssault()) { multiplier = OFFENSIVE_MULTIPLIER / 2; From bad48661eea6e6e15bcc56766a5b75ecf4789ee3 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Wed, 20 Nov 2024 22:52:46 -0600 Subject: [PATCH 12/22] Fixed infinite loop in weekly enemy reinforcements. --- MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index 70295c0c81..17ab3451eb 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -2113,8 +2113,12 @@ public void handleNewDay(NewDayEvent ev) { int reinforcementOdds = calculateScenarioOdds(track, contract, true); - while (Compute.randomInt(100) < reinforcementOdds) { + int roll = Compute.randomInt(100); + while (roll < reinforcementOdds) { addHiddenExternalScenario(ev.getCampaign(), contract, track, null, false); + + reinforcementOdds -= roll; + roll = Compute.randomInt(100); } } } From 8877ecbcc7565992e177e42711a85a1cdcea6960 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Thu, 21 Nov 2024 11:19:58 -0600 Subject: [PATCH 13/22] Updated PreSeeded Enemy Forces Spawn PreSeeded enemy force count is now based on enemy quality and faction. --- .../mission/enums/AtBContractType.java | 14 ++++- .../stratcon/StratconContractInitializer.java | 63 ++++++++++--------- 2 files changed, 44 insertions(+), 33 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java b/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java index 155507eb8e..16b5ea8d47 100644 --- a/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java +++ b/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java @@ -18,8 +18,6 @@ */ package mekhq.campaign.mission.enums; -import java.util.ResourceBundle; - import megamek.common.Compute; import megamek.logging.MMLogger; import mekhq.MekHQ; @@ -28,6 +26,8 @@ import mekhq.campaign.mission.AtBScenario; import mekhq.campaign.universe.enums.EraFlag; +import java.util.ResourceBundle; + public enum AtBContractType { // TODO: Missing Camops Mission Types: ASSASSINATION, ESPIONAGE, MOLE_HUNTING, OBSERVATION_RAID, // RETAINER, SABOTAGE, TERRORISM, HIGH_RISK @@ -138,6 +138,16 @@ public boolean isGarrisonType() { public boolean isRaidType() { return isDiversionaryRaid() || isObjectiveRaid() || isReconRaid() || isExtractionRaid(); } + + /** + * Checks if the given contract is offensive. + * + * @return {@code true} if the contract is of raid type, pirate hunting, or guerrilla warfare; + * {@code false} otherwise + */ + public boolean isOffensive() { + return isRaidType() || isPirateHunting() || isGuerrillaWarfare(); + } // endregion Boolean Comparison Methods public int calculateLength(final boolean variable, final AtBContract contract) { diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 45e05ba3c8..46de53b82a 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -38,8 +38,8 @@ import static java.lang.Math.round; import static megamek.common.Coords.ALL_DIRECTIONS; +import static mekhq.campaign.rating.IUnitRating.*; import static mekhq.campaign.stratcon.StratconRulesManager.addHiddenExternalScenario; -import static mekhq.campaign.stratcon.StratconRulesManager.calculateScenarioOdds; /** * This class handles StratCon state initialization when a contract is signed. @@ -195,9 +195,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai // Initialize non-objective scenarios for (StratconTrackState track : campaignState.getTracks()) { - if (seedPreDeployedForces(contract, campaign, track)) { - break; - } + seedPreDeployedForces(contract, campaign, track); } // clean up objectives for integrated command: @@ -216,48 +214,51 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai /** * Seeds pre-deployed (hidden) forces in a {@link StratconTrackState}, taking into account - * contract type and intensity. + * contract type, enemy quality, and enemy faction. * * @param contract the current contract * @param campaign the current campaign. * @param track the relevant {@link StratconTrackState} - * - * @return a boolean where {@code true} means forces were not deployed due to being garrison - * type or pirate hunting and {@code false} implies forces have been deployed successfully. */ - public static boolean seedPreDeployedForces(AtBContract contract, Campaign campaign, StratconTrackState track) { + public static void seedPreDeployedForces(AtBContract contract, Campaign campaign, StratconTrackState track) { + final int CLAN_CLUSTER = 27; // Stars + final int IS_BATTALION = 27; // Lances + final int COMSTAR_LEVEL_IV = 36; // Level IIs + + double multiplier = switch (contract.getEnemyQuality()) { + case DRAGOON_F -> 0.25; + case DRAGOON_D -> 0.5; + case DRAGOON_C -> 0.75; + case DRAGOON_B -> 1; + case DRAGOON_A -> 1.5; + case DRAGOON_ASTAR -> 2; + default -> + throw new IllegalStateException( + "Unexpected value in mekhq/campaign/stratcon/StratconContractInitializer.java/seedPreDeployedForces: " + + contract.getEnemyQuality()); + }; + AtBContractType contractType = contract.getContractType(); - // If the contract is a garrison type, we don't want to generate what will appear to be - // a full-scale invasion on day one. Furthermore, Pirates do not have enough resources - // to deploy standing forces in this manner. - if (contractType.isGarrisonType() || contractType.isPirateHunting()) { - return true; + if (contractType.isPirateHunting() || contractType.isGarrisonType()) { + multiplier *= 0.5; + } else if (contractType.isOffensive()) { + multiplier *= 2; } - // otherwise, seed each sector with hidden forces. - // the number of hidden forces is dependent on the type of contract. - final int OFFENSIVE_MULTIPLIER = 10; - final int DEFENSIVE_MULTIPLIER = 20; - - int multiplier = DEFENSIVE_MULTIPLIER; + int elementCount = IS_BATTALION; - if (contractType.isGarrisonType() || contractType.isPirateHunting()) { - multiplier = (int) (DEFENSIVE_MULTIPLIER * 1.5); - } else if (contractType.isRaidType() || contractType.isGuerrillaWarfare()) { - multiplier = OFFENSIVE_MULTIPLIER; - } else if (contract.getContractType().isPlanetaryAssault()) { - multiplier = OFFENSIVE_MULTIPLIER / 2; + if (contract.getEnemy().isClan()) { + elementCount = CLAN_CLUSTER; + } else if (contract.getEnemy().isComStarOrWoB()) { + elementCount = COMSTAR_LEVEL_IV; } - int preDeployedScenarios = track.getSize() / multiplier; - preDeployedScenarios = (int) round(preDeployedScenarios - * ((double) calculateScenarioOdds(track, contract, false) / 100)); + elementCount = (int) round(elementCount * multiplier); - for (int i = 0; i < preDeployedScenarios; i++) { + for (int i = 0; i < elementCount; i++) { addHiddenExternalScenario(campaign, contract, track, null, false); } - return false; } /** From 6450289ccdf002fa7e1beeef4e572ccb9f9d9fc7 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Thu, 21 Nov 2024 11:27:58 -0600 Subject: [PATCH 14/22] Add mass rout processing to Stratcon campaign Introduced a new method, `processMassRout`, in `StratconRulesManager` to handle scenarios without deployment dates. Integrated this method into `AtBContract` to ensure these scenarios are removed and updated appropriately. --- .../mekhq/campaign/mission/AtBContract.java | 3 +++ .../stratcon/StratconRulesManager.java | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/MekHQ/src/mekhq/campaign/mission/AtBContract.java b/MekHQ/src/mekhq/campaign/mission/AtBContract.java index 5ad9381a89..36e3dbbe4f 100644 --- a/MekHQ/src/mekhq/campaign/mission/AtBContract.java +++ b/MekHQ/src/mekhq/campaign/mission/AtBContract.java @@ -86,6 +86,7 @@ import static mekhq.campaign.mission.AtBDynamicScenarioFactory.getEntity; import static mekhq.campaign.mission.BotForceRandomizer.UNIT_WEIGHT_UNSPECIFIED; import static mekhq.campaign.stratcon.StratconContractInitializer.seedPreDeployedForces; +import static mekhq.campaign.stratcon.StratconRulesManager.processMassRout; import static mekhq.campaign.universe.Factions.getFactionLogo; import static mekhq.campaign.universe.fameAndInfamy.BatchallFactions.BATCHALL_FACTIONS; import static mekhq.gui.dialog.HireBulkPersonnelDialog.overrideSkills; @@ -540,6 +541,8 @@ public void checkMorale(Campaign campaign, LocalDate today) { " The contract will conclude tomorrow."); setEndDate(today.plusDays(1)); } + + processMassRout(campaign, getStratconCampaignState()); } // Process the results of the reinforcement roll diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index 17ab3451eb..1b6232175e 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -2062,6 +2062,30 @@ public static void processDailyMovement(Campaign campaign, StratconCampaignState } } + /** + * Processes a mass rout in the given campaign state. + *

+ * Loops through all tracks in the campaign state. + * For each track, it retrieves all scenarios. + * If scenario's deployment date is {@code null} and scenario is not a strategic objective, + * it is removed from the track and then updated. + * + * @param campaign the current campaign. + * @param campaignState the relevant StratCon campaign state. + */ + public static void processMassRout(Campaign campaign, StratconCampaignState campaignState) { + for (StratconTrackState track : campaignState.getTracks()) { + List allScenarios = new ArrayList<>(track.getScenarios().values()); + + for (StratconScenario scenario : allScenarios) { + if (scenario.getDeploymentDate() == null && !scenario.isStrategicObjective()) { + track.removeScenario(scenario); + track.updateScenario(scenario); + } + } + } + } + public void startup() { MekHQ.registerHandler(this); } From b961d1f2793cc6fe02edc0ab64543f19c94379e6 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Thu, 21 Nov 2024 11:28:20 -0600 Subject: [PATCH 15/22] Add conditional check for StratCon before processing mass rout Ensured that mass rout processing in AtBContract only occurs when StratCon is enabled in campaign options. This change prevents unnecessary operations and aligns with the intended functionality of user-defined campaign options. --- MekHQ/src/mekhq/campaign/mission/AtBContract.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/mission/AtBContract.java b/MekHQ/src/mekhq/campaign/mission/AtBContract.java index 36e3dbbe4f..5871ae60b9 100644 --- a/MekHQ/src/mekhq/campaign/mission/AtBContract.java +++ b/MekHQ/src/mekhq/campaign/mission/AtBContract.java @@ -542,7 +542,9 @@ public void checkMorale(Campaign campaign, LocalDate today) { setEndDate(today.plusDays(1)); } - processMassRout(campaign, getStratconCampaignState()); + if (campaign.getCampaignOptions().isUseStratCon()) { + processMassRout(campaign, getStratconCampaignState()); + } } // Process the results of the reinforcement roll From 9db18601b9d892693abf0c2c65601ab9cab8280e Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Thu, 21 Nov 2024 12:03:17 -0600 Subject: [PATCH 16/22] Optimize StratCon handling and improve offensive definition Updated isOffensive method to include planetary assaults, modified processMassRout to streamline parameters, and adjusted seeding logic with revised multipliers. This enhances the clarity and efficiency of the StratCon campaign state management and scenario processing. --- .../mekhq/campaign/mission/AtBContract.java | 2 +- .../mission/enums/AtBContractType.java | 2 +- .../stratcon/StratconContractInitializer.java | 18 ++++++++---------- .../stratcon/StratconRulesManager.java | 3 +-- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/mission/AtBContract.java b/MekHQ/src/mekhq/campaign/mission/AtBContract.java index 5871ae60b9..15aca7fb34 100644 --- a/MekHQ/src/mekhq/campaign/mission/AtBContract.java +++ b/MekHQ/src/mekhq/campaign/mission/AtBContract.java @@ -543,7 +543,7 @@ public void checkMorale(Campaign campaign, LocalDate today) { } if (campaign.getCampaignOptions().isUseStratCon()) { - processMassRout(campaign, getStratconCampaignState()); + processMassRout(getStratconCampaignState()); } } diff --git a/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java b/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java index 16b5ea8d47..442e386053 100644 --- a/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java +++ b/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java @@ -146,7 +146,7 @@ public boolean isRaidType() { * {@code false} otherwise */ public boolean isOffensive() { - return isRaidType() || isPirateHunting() || isGuerrillaWarfare(); + return isRaidType() || isPirateHunting() || isGuerrillaWarfare() || isPlanetaryAssault(); } // endregion Boolean Comparison Methods diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 46de53b82a..a5ef1b5373 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -36,6 +36,7 @@ import java.util.List; import java.util.Random; +import static java.lang.Math.ceil; import static java.lang.Math.round; import static megamek.common.Coords.ALL_DIRECTIONS; import static mekhq.campaign.rating.IUnitRating.*; @@ -221,28 +222,25 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai * @param track the relevant {@link StratconTrackState} */ public static void seedPreDeployedForces(AtBContract contract, Campaign campaign, StratconTrackState track) { - final int CLAN_CLUSTER = 27; // Stars - final int IS_BATTALION = 27; // Lances - final int COMSTAR_LEVEL_IV = 36; // Level IIs + // TODO remove reductions once we have friendly forces deploying too + final int CLAN_CLUSTER = 11; // 22 Stars, reduced to 11 + final int IS_BATTALION = 14; // 27 Lances, reduced to 14 + final int COMSTAR_LEVEL_IV = 18; // 36 Level IIs, reduced to 18 double multiplier = switch (contract.getEnemyQuality()) { case DRAGOON_F -> 0.25; case DRAGOON_D -> 0.5; case DRAGOON_C -> 0.75; - case DRAGOON_B -> 1; case DRAGOON_A -> 1.5; case DRAGOON_ASTAR -> 2; - default -> - throw new IllegalStateException( - "Unexpected value in mekhq/campaign/stratcon/StratconContractInitializer.java/seedPreDeployedForces: " - + contract.getEnemyQuality()); + default -> 1; // DRAGOON_B }; AtBContractType contractType = contract.getContractType(); if (contractType.isPirateHunting() || contractType.isGarrisonType()) { multiplier *= 0.5; - } else if (contractType.isOffensive()) { + } else if (contractType.isPlanetaryAssault()) { multiplier *= 2; } @@ -254,7 +252,7 @@ public static void seedPreDeployedForces(AtBContract contract, Campaign campaign elementCount = COMSTAR_LEVEL_IV; } - elementCount = (int) round(elementCount * multiplier); + elementCount = (int) ceil(elementCount * multiplier); for (int i = 0; i < elementCount; i++) { addHiddenExternalScenario(campaign, contract, track, null, false); diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index 1b6232175e..4d327b34ed 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -2070,10 +2070,9 @@ public static void processDailyMovement(Campaign campaign, StratconCampaignState * If scenario's deployment date is {@code null} and scenario is not a strategic objective, * it is removed from the track and then updated. * - * @param campaign the current campaign. * @param campaignState the relevant StratCon campaign state. */ - public static void processMassRout(Campaign campaign, StratconCampaignState campaignState) { + public static void processMassRout(StratconCampaignState campaignState) { for (StratconTrackState track : campaignState.getTracks()) { List allScenarios = new ArrayList<>(track.getScenarios().values()); From d34b122837c023d5bbff2bda2427c0ab20fecb14 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Thu, 21 Nov 2024 12:40:05 -0600 Subject: [PATCH 17/22] Add player force weighting for adjacent coordinate selection Modified `getUnoccupiedAdjacentCoords` method to include an optional boolean parameter `weightPlayerForces` which prioritizes player-allied forces and facilities when determining suitable adjacent coordinates. Updated `StratconRulesManager` to leverage this new parameter for enhanced scenario deployment logic. --- .../stratcon/StratconContractInitializer.java | 30 +++++++++++++++++-- .../stratcon/StratconRulesManager.java | 5 ++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index a5ef1b5373..02830bc8dc 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -508,12 +508,16 @@ private static void initializeObjectiveScenarios(Campaign campaign, AtBContract * * @param originCoords the {@link StratconCoords} around which to search for a suitable coordinate * @param trackState the {@link StratconTrackState} on which to perform the search + * @param weightPlayerForces whether to place greater emphasis on player-allied forces and facilities. * @return a {@link StratconCoords} object representing the coordinates of a suitable adjacent * location, or {code null} if no suitable location was found. */ public static @Nullable StratconCoords getUnoccupiedAdjacentCoords(StratconCoords originCoords, - StratconTrackState trackState) { + StratconTrackState trackState, + boolean weightPlayerForces) { List suitableCoords = new ArrayList<>(); + List playerForceCoords = new ArrayList<>(); + List playerFacilityCoords = new ArrayList<>(); for (int direction : ALL_DIRECTIONS) { StratconCoords newCoords = originCoords.translate(direction); @@ -529,6 +533,14 @@ private static void initializeObjectiveScenarios(Campaign campaign, AtBContract if (trackState.getFacility(newCoords).getOwner() != ForceAlignment.Opposing) { suitableCoords.add(newCoords); + + if (weightPlayerForces) { + playerFacilityCoords.add(newCoords); + } + } + + if (trackState.getAssignedForceCoords().containsValue(newCoords)) { + playerForceCoords.add(newCoords); } } @@ -536,7 +548,21 @@ private static void initializeObjectiveScenarios(Campaign campaign, AtBContract return null; } - int randomIndex = new Random().nextInt(suitableCoords.size()); + Random random = new Random(); + + if (weightPlayerForces) { + if (!playerFacilityCoords.isEmpty()) { + int randomIndex = random.nextInt(playerFacilityCoords.size()); + return playerFacilityCoords.get(randomIndex); + } + + if (!playerForceCoords.isEmpty()) { + int randomIndex = random.nextInt(playerForceCoords.size()); + return playerForceCoords.get(randomIndex); + } + } + + int randomIndex = random.nextInt(suitableCoords.size()); return suitableCoords.get(randomIndex); } diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index 4d327b34ed..abbc5d5fe1 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -2037,10 +2037,9 @@ public static void processDailyMovement(Campaign campaign, StratconCampaignState List allScenarios = new ArrayList<>(track.getScenarios().values()); for (StratconScenario scenario : allScenarios) { - StratconCoords scenarioCoords = scenario.getCoords(); - if (scenario.getDeploymentDate() == null) { - StratconCoords newCoords = getUnoccupiedAdjacentCoords(scenarioCoords, track); + StratconCoords scenarioCoords = scenario.getCoords(); + StratconCoords newCoords = getUnoccupiedAdjacentCoords(scenarioCoords, track, true); if (newCoords == null) { continue; From ded864f851bddc4b29f8d2de6eca19033552a191 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Thu, 21 Nov 2024 12:41:21 -0600 Subject: [PATCH 18/22] Fixed deployment issue for scenarios without a deployment date. Updated the condition to exclude strategic objectives when checking for null deployment dates in scenarios. This ensures that only relevant scenarios get new coordinates, preventing strategic objectives from being relocated erroneously. --- MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index abbc5d5fe1..e61e3ed5cd 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -2037,7 +2037,7 @@ public static void processDailyMovement(Campaign campaign, StratconCampaignState List allScenarios = new ArrayList<>(track.getScenarios().values()); for (StratconScenario scenario : allScenarios) { - if (scenario.getDeploymentDate() == null) { + if (scenario.getDeploymentDate() == null && !scenario.isStrategicObjective()) { StratconCoords scenarioCoords = scenario.getCoords(); StratconCoords newCoords = getUnoccupiedAdjacentCoords(scenarioCoords, track, true); From 626a527efd5457f1d7da9e15486ac48c2bc05a7e Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Fri, 22 Nov 2024 14:54:49 -0600 Subject: [PATCH 19/22] Add morale handling and routing logic to contracts Improved the morale calculation and routing logic when handling contracts, especially garrison duties. Updated methods to factor in enemy skill, weapon reliability, and included a more sophisticated approach to determining balance of power. Minor refactoring was also done for code clarity and efficiency. --- .../MekHQ Morale.pdf | Bin 44814 -> 76454 bytes .../mekhq/resources/Campaign.properties | 4 + .../resources/ContractMarketDialog.properties | 13 ++ MekHQ/src/mekhq/campaign/Campaign.java | 26 ++- .../mekhq/campaign/mission/AtBContract.java | 179 ++++++++++++++---- .../stratcon/StratconContractInitializer.java | 37 +++- .../stratcon/StratconRulesManager.java | 6 +- .../gui/dialog/ContractMarketDialog.java | 10 +- 8 files changed, 222 insertions(+), 53 deletions(-) diff --git a/MekHQ/docs/Stratcon and Against the Bot/MekHQ Morale.pdf b/MekHQ/docs/Stratcon and Against the Bot/MekHQ Morale.pdf index 5a504c5560173677acce77d0fef4b6e1d84103c5..c62599e1f0b88ffc3a61c12b968379f87857fc3d 100644 GIT binary patch delta 71593 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%0DEV!GbdtU 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 SqJTmWKy)TvUKK4Q*?$3#TB2|O diff --git a/MekHQ/resources/mekhq/resources/Campaign.properties b/MekHQ/resources/mekhq/resources/Campaign.properties index f83243e46a..a1fcdde7df 100644 --- a/MekHQ/resources/mekhq/resources/Campaign.properties +++ b/MekHQ/resources/mekhq/resources/Campaign.properties @@ -84,3 +84,7 @@ newAtBScenario.format=New scenario "{0}" will occur on {1}. atbScenarioToday.format=Scenario "{0}" is today, deploy a force from your TOE! atbScenarioTodayWithForce.format=Scenario "{0}" is today, {1} has been deployed! generalFallbackAddress.text=Commander +garrisonDutyRouted.text=Long-ranged sensors detect no enemy activity in the AO. +contractMoraleReport.text=Current enemy condition is %s on contract %s.\ +
\ +
%s \ No newline at end of file diff --git a/MekHQ/resources/mekhq/resources/ContractMarketDialog.properties b/MekHQ/resources/mekhq/resources/ContractMarketDialog.properties index b8f7b3021d..5a4d46bfec 100644 --- a/MekHQ/resources/mekhq/resources/ContractMarketDialog.properties +++ b/MekHQ/resources/mekhq/resources/ContractMarketDialog.properties @@ -99,3 +99,16 @@ messageChallengeVeryHard.text=We've reviewed the mission details, and it's our d
\
If you are committed to this course of action, confirm your deployment.\
Otherwise, you may return to review more suitable assignments.
+messageChallengeGarrison.text=You have selected a garrison assignment. As part of this contract,\ + \ your unit will be responsible for maintaining a defensive presence in your assigned Sectors.\ + \ However, we cannot predict when - or even if - you will be called to fight. Furthermore, we\ + \ have no reliable intelligence on potential adversaries or the scale of any engagement that may\ + \ arise.\ +
The provided data is for estimation purposes only. Situational developments may occur\ + \ without warning, and you should be prepared for anything - from prolonged quiet to sudden,\ + \ large-scale conflict. Flexibility and readiness will be essential for the success of this\ + \ contract.\ +
\ +
If you are prepared to assume this role, confirm your deployment.\ +
Otherwise, you may return to review other opportunities.
diff --git a/MekHQ/src/mekhq/campaign/Campaign.java b/MekHQ/src/mekhq/campaign/Campaign.java index 2d7aa84b72..ced9b4ef54 100644 --- a/MekHQ/src/mekhq/campaign/Campaign.java +++ b/MekHQ/src/mekhq/campaign/Campaign.java @@ -3648,6 +3648,14 @@ && getLocation().getJumpPath().getLastSystem().getId().equals(contract.getSystem contract.setStartAndEndDate(getLocalDate().plusDays((int) Math.ceil(getLocation().getTransitTime()))); addReport("The start and end dates of " + contract.getName() + " have been shifted to reflect the current ETA."); + + if (campaignOptions.isUseStratCon() && contract.getMoraleLevel().isRouted()) { + LocalDate newRoutEndDate = contract.getStartDate() + .plusMonths(Math.max(1, Compute.d6() - 3)) + .minusDays(1); + contract.setRoutEndDate(newRoutEndDate); + } + continue; } @@ -3782,14 +3790,22 @@ private void processNewDayATB() { } for (AtBContract contract : getActiveAtBContracts()) { - contract.checkMorale(this, getLocalDate()); + AtBMoraleLevel oldMorale = contract.getMoraleLevel(); - AtBMoraleLevel morale = contract.getMoraleLevel(); + contract.checkMorale(this, getLocalDate()); + AtBMoraleLevel newMorale = contract.getMoraleLevel(); - String report = "Current enemy condition is " + morale + " on contract " - + contract.getName() + "

" + morale.getToolTipText(); + String report = ""; + if (contract.getContractType().isGarrisonDuty()) { + report = resources.getString("garrisonDutyRouted.text"); + } else if (oldMorale != newMorale) { + report = String.format(resources.getString("contractMoraleReport.text"), + newMorale, contract.getName(), newMorale.getToolTipText()); + } - addReport(report); + if (!report.isBlank()) { + addReport(report); + } } } diff --git a/MekHQ/src/mekhq/campaign/mission/AtBContract.java b/MekHQ/src/mekhq/campaign/mission/AtBContract.java index 15aca7fb34..da8806c288 100644 --- a/MekHQ/src/mekhq/campaign/mission/AtBContract.java +++ b/MekHQ/src/mekhq/campaign/mission/AtBContract.java @@ -29,6 +29,7 @@ import megamek.client.ui.swing.util.PlayerColour; import megamek.common.Compute; import megamek.common.Entity; +import megamek.common.TargetRoll; import megamek.common.UnitType; import megamek.common.enums.Gender; import megamek.common.enums.SkillLevel; @@ -39,6 +40,7 @@ import mekhq.campaign.event.MissionChangedEvent; import mekhq.campaign.finances.Money; import mekhq.campaign.force.Force; +import mekhq.campaign.force.Lance; import mekhq.campaign.market.enums.UnitMarketType; import mekhq.campaign.mission.atb.AtBScenarioFactory; import mekhq.campaign.mission.enums.AtBContractType; @@ -48,7 +50,6 @@ import mekhq.campaign.personnel.backgrounds.BackgroundsController; import mekhq.campaign.personnel.enums.PersonnelRole; import mekhq.campaign.personnel.enums.Phenotype; -import mekhq.campaign.rating.IUnitRating; import mekhq.campaign.stratcon.StratconCampaignState; import mekhq.campaign.stratcon.StratconContractDefinition; import mekhq.campaign.stratcon.StratconContractInitializer; @@ -75,6 +76,7 @@ import java.util.List; import java.util.*; +import static java.lang.Math.ceil; import static java.lang.Math.round; import static megamek.client.ratgenerator.ModelRecord.NETWORK_NONE; import static megamek.client.ratgenerator.UnitTable.findTable; @@ -85,6 +87,7 @@ import static megamek.common.enums.SkillLevel.parseFromString; import static mekhq.campaign.mission.AtBDynamicScenarioFactory.getEntity; import static mekhq.campaign.mission.BotForceRandomizer.UNIT_WEIGHT_UNSPECIFIED; +import static mekhq.campaign.rating.IUnitRating.*; import static mekhq.campaign.stratcon.StratconContractInitializer.seedPreDeployedForces; import static mekhq.campaign.stratcon.StratconRulesManager.processMassRout; import static mekhq.campaign.universe.Factions.getFactionLogo; @@ -184,6 +187,16 @@ protected AtBContract() { this(null); } + /** + * Sets the end date of the rout. + * This should only be applied on contracts whose morale equals ROUTED + * + * @param routEnd the {@code LocalDate} representing the end date of the rout + */ + public void setRoutEndDate(LocalDate routEnd) { + this.routEnd = routEnd; + } + public AtBContract(String name) { super(name, "Independent"); employerCode = "IND"; @@ -196,9 +209,9 @@ public AtBContract(String name) { setContractType(AtBContractType.GARRISON_DUTY); setAllySkill(REGULAR); - allyQuality = IUnitRating.DRAGOON_C; + allyQuality = DRAGOON_C; setEnemySkill(REGULAR); - enemyQuality = IUnitRating.DRAGOON_C; + enemyQuality = DRAGOON_C; allyBotName = "Ally"; enemyBotName = "Enemy"; setAllyCamouflage(new Camouflage(Camouflage.COLOUR_CAMOUFLAGE, PlayerColour.RED.name())); @@ -427,7 +440,7 @@ public static boolean isMinorPower(final String factionCode) { public void checkMorale(Campaign campaign, LocalDate today) { // Check whether enemy forces have been reinforced, and whether any current rout continues // beyond its expected date - boolean routContinue = Compute.randomInt(4) < 3; + boolean routContinue = Compute.randomInt(4) == 0; // If there is a rout end date, and it's past today, update morale and enemy state accordingly if (routEnd != null && !routContinue) { @@ -439,7 +452,7 @@ public void checkMorale(Campaign campaign, LocalDate today) { if (campaign.getCampaignOptions().isUseStratCon()) { for (StratconTrackState track : getStratconCampaignState().getTracks()) { - seedPreDeployedForces(this, campaign, track); + seedPreDeployedForces(this, campaign, track, true); } } } else { @@ -448,7 +461,84 @@ public void checkMorale(Campaign campaign, LocalDate today) { return; } - // Initialize counters for victories and defeats + TargetRoll targetNumber = new TargetRoll(); + + // Confidence: + int enemySkillRating = getEnemySkill().getAdjustedValue() - 2; + int allySkillRating = getAllySkill().getAdjustedValue() - 2; + + if (getCommandRights().isIndependent()) { + allySkillRating = (campaign.getCampaignOptions().getUnitRatingMethod().isFMMR() ? getAllySkill() + : campaign.getReputation().getAverageSkillLevel()).getAdjustedValue(); + allySkillRating -= 2; + } + + final LocalDate THE_GREAT_REFUSAL = LocalDate.of(3060, 4, 12); + + if (campaign.getLocalDate().isBefore(THE_GREAT_REFUSAL)) { + if (getEnemy().isClan() && !getEmployerFaction().isClan()) { + enemySkillRating++; + } else if (!getEnemy().isClan() && getEmployerFaction().isClan()) { + allySkillRating++; + } + } + + int confidence = enemySkillRating - allySkillRating; + targetNumber.addModifier(confidence, "confidence"); + + // Reliability: + int reliability = getEnemyQuality(); + + Faction enemy = getEnemy(); + if (enemy.isClan()) { + reliability = Math.max(5, reliability + 1); + } + + reliability = switch (reliability) { + case DRAGOON_F -> -1; + case DRAGOON_D -> { + if (Compute.randomInt(1) == 0) { + yield -1; + } else { + yield 0; + } + } + case DRAGOON_C -> 0; + case DRAGOON_B -> { + if (Compute.randomInt(1) == 0) { + yield 0; + } else { + yield +1; + } + } + case DRAGOON_A -> +1; + default -> { // DRAGOON_ASTAR + if (Compute.randomInt(1) == 0) { + yield +1; + } else { + yield +2; + } + } + }; + + if (enemy.isRebel() + || enemy.isMinorPower() + || enemy.isMercenary() + || enemy.isPirate()) { + reliability--; + } else if (enemy.isClan()) { + reliability++; + } + + targetNumber.addModifier(reliability, "reliability"); + + // Force Type (unimplemented) + // TODO once we have force types defined on the StratCon map, we should handle modifiers here. + // 'Mek or Aircraft == +1 + // Vehicle == +0 + // Infantry == -1 (if unsupported) + + // Performance int victories = 0; int defeats = 0; LocalDate lastMonth = today.minusMonths(1); @@ -474,10 +564,6 @@ public void checkMorale(Campaign campaign, LocalDate today) { } } - // Calculate various modifiers for morale - int enemySkillModifier = getEnemySkill().getAdjustedValue() - REGULAR.getAdjustedValue(); - int allySkillModifier = getAllySkill().getAdjustedValue() - REGULAR.getAdjustedValue(); - int performanceModifier = 0; if (victories > (defeats * 2)) { @@ -490,34 +576,58 @@ public void checkMorale(Campaign campaign, LocalDate today) { performanceModifier++; } - int miscModifiers = moraleMod; - - // Additional morale modifications depending on faction properties - if (Factions.getInstance().getFaction(enemyCode).isPirate()) { - miscModifiers -= 2; - } else if (Factions.getInstance().getFaction(enemyCode).isRebel() - || isMinorPower(enemyCode) - || Factions.getInstance().getFaction(enemyCode).isMercenary()) { - miscModifiers -= 1; - } else if (Factions.getInstance().getFaction(enemyCode).isClan()) { - miscModifiers += 2; - } + targetNumber.addModifier(performanceModifier, "performanceModifier"); + // Balance of Power int balanceOfPower = 0; if (campaign.getCampaignOptions().isUseStratCon()) { - balanceOfPower = -campaign.getLanceList().size() * 5; + int playerForceCount = 0; + + for (Lance lance : campaign.getLances().values()) { + try { + Force force = campaign.getForce(lance.getForceId()); + + if (force.isCombatForce()) { + playerForceCount++; + } + } catch (Exception ex) { + logger.error(String.format("Failed to fetch force %s: %s", + lance.getForceId(), ex.getMessage())); + } + } + + playerForceCount = (int) ceil((double) playerForceCount / campaign.getActiveContracts().size()); + + if (getCommandRights().isHouse() || getCommandRights().isLiaison()) { + playerForceCount = (int) round(playerForceCount * 1.25); + } else if (getCommandRights().isIntegrated()) { + playerForceCount = (int) round(playerForceCount * 1.5); + } int enemyForceCount = 0; for (StratconTrackState track : getStratconCampaignState().getTracks()) { - enemyForceCount = track.getScenarios().size(); + enemyForceCount += track.getScenarios().size(); } - balanceOfPower += enemyForceCount; + if (playerForceCount >= (enemyForceCount * 3)) { + balanceOfPower = -6; + } else if (playerForceCount >= (enemyForceCount * 2)) { + balanceOfPower = -4; + } else if (playerForceCount > enemyForceCount) { + balanceOfPower = -2; + } else if (enemyForceCount >= (playerForceCount * 3)) { + balanceOfPower = 6; + } else if (enemyForceCount >= (playerForceCount * 2)) { + balanceOfPower = 4; + } else if (enemyForceCount > playerForceCount) { + balanceOfPower = 2; + } } + targetNumber.addModifier(balanceOfPower, "balanceOfPower"); + // Total morale modifier calculation - int totalModifier = enemySkillModifier - allySkillModifier + performanceModifier + miscModifiers + balanceOfPower; - int roll = Compute.d6(2) + totalModifier; + int roll = Compute.d6(2) + targetNumber.getValue(); // Morale level determination based on roll value final AtBMoraleLevel[] moraleLevels = AtBMoraleLevel.values(); @@ -543,17 +653,10 @@ public void checkMorale(Campaign campaign, LocalDate today) { } if (campaign.getCampaignOptions().isUseStratCon()) { - processMassRout(getStratconCampaignState()); + processMassRout(getStratconCampaignState(), true); } } - // Process the results of the reinforcement roll - if (!getMoraleLevel().isRouted() && !routContinue) { - setMoraleLevel(moraleLevels[Math.min(getMoraleLevel().ordinal() + 1, moraleLevels.length - 1)]); - campaign.addReport("Long ranged scans have detected the arrival of additional enemy forces."); - return; - } - // Reset external morale modifier moraleMod = 0; } @@ -611,7 +714,7 @@ public int getRepairLocation(final int unitRating) { repairLocation = Unit.SITE_FACILITY_MAINTENANCE; } - if (unitRating >= IUnitRating.DRAGOON_B) { + if (unitRating >= DRAGOON_B) { repairLocation++; } @@ -892,7 +995,7 @@ public void checkEvents(Campaign c) { case 6: final String unitName = c.getUnitMarket().addSingleUnit(c, UnitMarketType.EMPLOYER, MEK, getEmployerFaction(), - IUnitRating.DRAGOON_F, 50); + DRAGOON_F, 50); if (unitName != null) { text += String.format( "Surplus Sale: %s offered by employer on the unit market", @@ -1840,7 +1943,7 @@ public int calculateContractDifficulty(Campaign campaign) { double difference = enemyPower - playerPower; double percentDifference = (difference / playerPower) * 100; - int mappedValue = (int) Math.ceil(Math.abs(percentDifference) / 20); + int mappedValue = (int) ceil(Math.abs(percentDifference) / 20); if (percentDifference < 0) { mappedValue = 5 - mappedValue; } else { diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 02830bc8dc..5158a35a45 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -27,10 +27,13 @@ import mekhq.campaign.mission.ScenarioForceTemplate.ForceAlignment; import mekhq.campaign.mission.atb.AtBScenarioModifier; import mekhq.campaign.mission.enums.AtBContractType; +import mekhq.campaign.mission.enums.AtBMoraleLevel; import mekhq.campaign.mission.enums.ContractCommandRights; import mekhq.campaign.stratcon.StratconContractDefinition.ObjectiveParameters; import mekhq.campaign.stratcon.StratconContractDefinition.StrategicObjectiveType; +import mekhq.campaign.universe.Faction; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -41,6 +44,7 @@ import static megamek.common.Coords.ALL_DIRECTIONS; import static mekhq.campaign.rating.IUnitRating.*; import static mekhq.campaign.stratcon.StratconRulesManager.addHiddenExternalScenario; +import static mekhq.campaign.stratcon.StratconRulesManager.processMassRout; /** * This class handles StratCon state initialization when a contract is signed. @@ -196,7 +200,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai // Initialize non-objective scenarios for (StratconTrackState track : campaignState.getTracks()) { - seedPreDeployedForces(contract, campaign, track); + seedPreDeployedForces(contract, campaign, track, true); } // clean up objectives for integrated command: @@ -210,6 +214,22 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai } } + // Determine starting morale + if (contract.getContractType().isGarrisonDuty()) { + contract.setMoraleLevel(AtBMoraleLevel.ROUTED); + + LocalDate routEnd = contract.getStartDate().plusMonths(Math.max(1, Compute.d6() - 3)).minusDays(1); + contract.setRoutEndDate(routEnd); + + processMassRout(campaignState, true); + } else { + contract.checkMorale(campaign, campaign.getLocalDate()); + + if (contract.getMoraleLevel().isRouted()) { + contract.setMoraleLevel(AtBMoraleLevel.CRITICAL); + } + } + // now we're done } @@ -220,14 +240,17 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai * @param contract the current contract * @param campaign the current campaign. * @param track the relevant {@link StratconTrackState} + * @param isEnemy whether we are seeding forces for the enemy, or player's allies */ - public static void seedPreDeployedForces(AtBContract contract, Campaign campaign, StratconTrackState track) { + public static int seedPreDeployedForces(AtBContract contract, Campaign campaign, + StratconTrackState track, boolean isEnemy) { // TODO remove reductions once we have friendly forces deploying too final int CLAN_CLUSTER = 11; // 22 Stars, reduced to 11 final int IS_BATTALION = 14; // 27 Lances, reduced to 14 final int COMSTAR_LEVEL_IV = 18; // 36 Level IIs, reduced to 18 - double multiplier = switch (contract.getEnemyQuality()) { + int quality = isEnemy ? contract.getEnemyQuality() : contract.getAllyQuality(); + double multiplier = switch (quality) { case DRAGOON_F -> 0.25; case DRAGOON_D -> 0.5; case DRAGOON_C -> 0.75; @@ -246,9 +269,11 @@ public static void seedPreDeployedForces(AtBContract contract, Campaign campaign int elementCount = IS_BATTALION; - if (contract.getEnemy().isClan()) { + Faction faction = isEnemy ? contract.getEnemy() : contract.getEmployerFaction(); + + if (faction.isClan()) { elementCount = CLAN_CLUSTER; - } else if (contract.getEnemy().isComStarOrWoB()) { + } else if (faction.isComStarOrWoB()) { elementCount = COMSTAR_LEVEL_IV; } @@ -257,6 +282,8 @@ public static void seedPreDeployedForces(AtBContract contract, Campaign campaign for (int i = 0; i < elementCount; i++) { addHiddenExternalScenario(campaign, contract, track, null, false); } + + return elementCount; } /** diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index e61e3ed5cd..1af1c3f5f7 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -2070,13 +2070,15 @@ public static void processDailyMovement(Campaign campaign, StratconCampaignState * it is removed from the track and then updated. * * @param campaignState the relevant StratCon campaign state. + * @param removeAll whether to remove all scenarios, including those with dates or + * strategic objectives. This should be used sparingly. */ - public static void processMassRout(StratconCampaignState campaignState) { + public static void processMassRout(StratconCampaignState campaignState, boolean removeAll) { for (StratconTrackState track : campaignState.getTracks()) { List allScenarios = new ArrayList<>(track.getScenarios().values()); for (StratconScenario scenario : allScenarios) { - if (scenario.getDeploymentDate() == null && !scenario.isStrategicObjective()) { + if (removeAll || (scenario.getDeploymentDate() == null && !scenario.isStrategicObjective())) { track.removeScenario(scenario); track.updateScenario(scenario); } diff --git a/MekHQ/src/mekhq/gui/dialog/ContractMarketDialog.java b/MekHQ/src/mekhq/gui/dialog/ContractMarketDialog.java index a9d580796f..2edd56216f 100644 --- a/MekHQ/src/mekhq/gui/dialog/ContractMarketDialog.java +++ b/MekHQ/src/mekhq/gui/dialog/ContractMarketDialog.java @@ -482,8 +482,6 @@ private void acceptContract(ActionEvent evt) { } } - contractStartPrompt(campaign, selectedContract); - selectedContract.setName(contractView.getContractName()); campaign.getFinances().credit(TransactionType.CONTRACT_PAYMENT, campaign.getLocalDate(), selectedContract.getTotalAdvanceAmount(), @@ -491,9 +489,11 @@ private void acceptContract(ActionEvent evt) { campaign.addMission(selectedContract); // must be invoked after campaign.addMission to ensure presence of mission ID selectedContract.acceptContract(campaign); + contractStartPrompt(campaign, selectedContract); + contractMarket.removeContract(selectedContract); ((DefaultTableModel) tableContracts.getModel()).removeRow(tableContracts - .convertRowIndexToModel(tableContracts.getSelectedRow())); + .convertRowIndexToModel(tableContracts.getSelectedRow())); refreshContractView(); } } @@ -529,6 +529,10 @@ private boolean triggerConfirmationDialog() { resourceKey = "messageChallengeHard.text"; } + if (((AtBContract) selectedContract).getContractType().isGarrisonDuty()) { + resourceKey = "messageChallengeGarrison.text"; + } + // If resourceKey is not found, just return true, acting as if the player had accepted the mission if (resourceKey.isEmpty()) { return true; From 50ee550a44304b71ff9fe12a6f67e611eadfdf0a Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Sun, 24 Nov 2024 17:27:06 -0600 Subject: [PATCH 20/22] Removed persistent opfor --- .../MekHQ Morale.pdf | Bin 76454 -> 65003 bytes .../mekhq/campaign/mission/AtBContract.java | 62 ------- .../mission/enums/AtBContractType.java | 10 -- .../stratcon/StratconContractInitializer.java | 161 ++---------------- .../stratcon/StratconRulesManager.java | 91 ++-------- .../stratcon/CampaignManagementDialog.java | 5 +- 6 files changed, 24 insertions(+), 305 deletions(-) diff --git a/MekHQ/docs/Stratcon and Against the Bot/MekHQ Morale.pdf b/MekHQ/docs/Stratcon and Against the Bot/MekHQ Morale.pdf index c62599e1f0b88ffc3a61c12b968379f87857fc3d..eea552fd03f920edc5debf0dff90907378a3194c 100644 GIT binary patch delta 54212 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 FzX5xqo;Uyi delta 65372 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%0Aq$gqvNhvsChH7TGWe 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 diff --git a/MekHQ/src/mekhq/campaign/mission/AtBContract.java b/MekHQ/src/mekhq/campaign/mission/AtBContract.java index da8806c288..d1b69feda9 100644 --- a/MekHQ/src/mekhq/campaign/mission/AtBContract.java +++ b/MekHQ/src/mekhq/campaign/mission/AtBContract.java @@ -40,7 +40,6 @@ import mekhq.campaign.event.MissionChangedEvent; import mekhq.campaign.finances.Money; import mekhq.campaign.force.Force; -import mekhq.campaign.force.Lance; import mekhq.campaign.market.enums.UnitMarketType; import mekhq.campaign.mission.atb.AtBScenarioFactory; import mekhq.campaign.mission.enums.AtBContractType; @@ -53,7 +52,6 @@ import mekhq.campaign.stratcon.StratconCampaignState; import mekhq.campaign.stratcon.StratconContractDefinition; import mekhq.campaign.stratcon.StratconContractInitializer; -import mekhq.campaign.stratcon.StratconTrackState; import mekhq.campaign.unit.Unit; import mekhq.campaign.universe.Faction; import mekhq.campaign.universe.Factions; @@ -88,8 +86,6 @@ import static mekhq.campaign.mission.AtBDynamicScenarioFactory.getEntity; import static mekhq.campaign.mission.BotForceRandomizer.UNIT_WEIGHT_UNSPECIFIED; import static mekhq.campaign.rating.IUnitRating.*; -import static mekhq.campaign.stratcon.StratconContractInitializer.seedPreDeployedForces; -import static mekhq.campaign.stratcon.StratconRulesManager.processMassRout; import static mekhq.campaign.universe.Factions.getFactionLogo; import static mekhq.campaign.universe.fameAndInfamy.BatchallFactions.BATCHALL_FACTIONS; import static mekhq.gui.dialog.HireBulkPersonnelDialog.overrideSkills; @@ -449,12 +445,6 @@ public void checkMorale(Campaign campaign, LocalDate today) { routEnd = null; updateEnemy(campaign, today); // mix it up a little - - if (campaign.getCampaignOptions().isUseStratCon()) { - for (StratconTrackState track : getStratconCampaignState().getTracks()) { - seedPreDeployedForces(this, campaign, track, true); - } - } } else { setMoraleLevel(AtBMoraleLevel.ROUTED); } @@ -578,54 +568,6 @@ public void checkMorale(Campaign campaign, LocalDate today) { targetNumber.addModifier(performanceModifier, "performanceModifier"); - // Balance of Power - int balanceOfPower = 0; - if (campaign.getCampaignOptions().isUseStratCon()) { - int playerForceCount = 0; - - for (Lance lance : campaign.getLances().values()) { - try { - Force force = campaign.getForce(lance.getForceId()); - - if (force.isCombatForce()) { - playerForceCount++; - } - } catch (Exception ex) { - logger.error(String.format("Failed to fetch force %s: %s", - lance.getForceId(), ex.getMessage())); - } - } - - playerForceCount = (int) ceil((double) playerForceCount / campaign.getActiveContracts().size()); - - if (getCommandRights().isHouse() || getCommandRights().isLiaison()) { - playerForceCount = (int) round(playerForceCount * 1.25); - } else if (getCommandRights().isIntegrated()) { - playerForceCount = (int) round(playerForceCount * 1.5); - } - - int enemyForceCount = 0; - for (StratconTrackState track : getStratconCampaignState().getTracks()) { - enemyForceCount += track.getScenarios().size(); - } - - if (playerForceCount >= (enemyForceCount * 3)) { - balanceOfPower = -6; - } else if (playerForceCount >= (enemyForceCount * 2)) { - balanceOfPower = -4; - } else if (playerForceCount > enemyForceCount) { - balanceOfPower = -2; - } else if (enemyForceCount >= (playerForceCount * 3)) { - balanceOfPower = 6; - } else if (enemyForceCount >= (playerForceCount * 2)) { - balanceOfPower = 4; - } else if (enemyForceCount > playerForceCount) { - balanceOfPower = 2; - } - } - - targetNumber.addModifier(balanceOfPower, "balanceOfPower"); - // Total morale modifier calculation int roll = Compute.d6(2) + targetNumber.getValue(); @@ -651,10 +593,6 @@ public void checkMorale(Campaign campaign, LocalDate today) { " The contract will conclude tomorrow."); setEndDate(today.plusDays(1)); } - - if (campaign.getCampaignOptions().isUseStratCon()) { - processMassRout(getStratconCampaignState(), true); - } } // Reset external morale modifier diff --git a/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java b/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java index 442e386053..44235bf5e1 100644 --- a/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java +++ b/MekHQ/src/mekhq/campaign/mission/enums/AtBContractType.java @@ -138,16 +138,6 @@ public boolean isGarrisonType() { public boolean isRaidType() { return isDiversionaryRaid() || isObjectiveRaid() || isReconRaid() || isExtractionRaid(); } - - /** - * Checks if the given contract is offensive. - * - * @return {@code true} if the contract is of raid type, pirate hunting, or guerrilla warfare; - * {@code false} otherwise - */ - public boolean isOffensive() { - return isRaidType() || isPirateHunting() || isGuerrillaWarfare() || isPlanetaryAssault(); - } // endregion Boolean Comparison Methods public int calculateLength(final boolean variable, final AtBContract contract) { diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index 5158a35a45..ccd59223ea 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -26,12 +26,10 @@ import mekhq.campaign.mission.*; import mekhq.campaign.mission.ScenarioForceTemplate.ForceAlignment; import mekhq.campaign.mission.atb.AtBScenarioModifier; -import mekhq.campaign.mission.enums.AtBContractType; import mekhq.campaign.mission.enums.AtBMoraleLevel; import mekhq.campaign.mission.enums.ContractCommandRights; import mekhq.campaign.stratcon.StratconContractDefinition.ObjectiveParameters; import mekhq.campaign.stratcon.StratconContractDefinition.StrategicObjectiveType; -import mekhq.campaign.universe.Faction; import java.time.LocalDate; import java.util.ArrayList; @@ -39,13 +37,6 @@ import java.util.List; import java.util.Random; -import static java.lang.Math.ceil; -import static java.lang.Math.round; -import static megamek.common.Coords.ALL_DIRECTIONS; -import static mekhq.campaign.rating.IUnitRating.*; -import static mekhq.campaign.stratcon.StratconRulesManager.addHiddenExternalScenario; -import static mekhq.campaign.stratcon.StratconRulesManager.processMassRout; - /** * This class handles StratCon state initialization when a contract is signed. */ @@ -83,7 +74,6 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai int maximumTrackIndex = Math.max(0, contract.getRequiredLances() / NUM_LANCES_PER_TRACK); int planetaryTemperature = campaign.getLocation().getPlanet().getTemperature(campaign.getLocalDate()); - double planetaryDiameter = campaign.getLocation().getPlanet().getDiameter(); for (int x = 0; x < maximumTrackIndex; x++) { int scenarioOdds = contractDefinition.getScenarioOdds() @@ -92,7 +82,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai .get(Compute.randomInt(contractDefinition.getDeploymentTimes().size())); StratconTrackState track = initializeTrackState(NUM_LANCES_PER_TRACK, scenarioOdds, deploymentTime, - planetaryTemperature, planetaryDiameter); + planetaryTemperature); track.setDisplayableName(String.format("Sector %d", x)); campaignState.addTrack(track); } @@ -108,7 +98,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai .get(Compute.randomInt(contractDefinition.getDeploymentTimes().size())); StratconTrackState track = initializeTrackState(oddLanceCount, scenarioOdds, deploymentTime, - planetaryTemperature, planetaryDiameter); + planetaryTemperature); track.setDisplayableName(String.format("Sector %d", campaignState.getTracks().size())); campaignState.addTrack(track); } @@ -198,11 +188,6 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai false, Collections.emptyList()); } - // Initialize non-objective scenarios - for (StratconTrackState track : campaignState.getTracks()) { - seedPreDeployedForces(contract, campaign, track, true); - } - // clean up objectives for integrated command: // we're still going to have all the objective facilities and scenarios // but the player has no control over where they go, so they're @@ -220,8 +205,6 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai LocalDate routEnd = contract.getStartDate().plusMonths(Math.max(1, Compute.d6() - 3)).minusDays(1); contract.setRoutEndDate(routEnd); - - processMassRout(campaignState, true); } else { contract.checkMorale(campaign, campaign.getLocalDate()); @@ -233,77 +216,25 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai // now we're done } - /** - * Seeds pre-deployed (hidden) forces in a {@link StratconTrackState}, taking into account - * contract type, enemy quality, and enemy faction. - * - * @param contract the current contract - * @param campaign the current campaign. - * @param track the relevant {@link StratconTrackState} - * @param isEnemy whether we are seeding forces for the enemy, or player's allies - */ - public static int seedPreDeployedForces(AtBContract contract, Campaign campaign, - StratconTrackState track, boolean isEnemy) { - // TODO remove reductions once we have friendly forces deploying too - final int CLAN_CLUSTER = 11; // 22 Stars, reduced to 11 - final int IS_BATTALION = 14; // 27 Lances, reduced to 14 - final int COMSTAR_LEVEL_IV = 18; // 36 Level IIs, reduced to 18 - - int quality = isEnemy ? contract.getEnemyQuality() : contract.getAllyQuality(); - double multiplier = switch (quality) { - case DRAGOON_F -> 0.25; - case DRAGOON_D -> 0.5; - case DRAGOON_C -> 0.75; - case DRAGOON_A -> 1.5; - case DRAGOON_ASTAR -> 2; - default -> 1; // DRAGOON_B - }; - - AtBContractType contractType = contract.getContractType(); - - if (contractType.isPirateHunting() || contractType.isGarrisonType()) { - multiplier *= 0.5; - } else if (contractType.isPlanetaryAssault()) { - multiplier *= 2; - } - - int elementCount = IS_BATTALION; - - Faction faction = isEnemy ? contract.getEnemy() : contract.getEmployerFaction(); - - if (faction.isClan()) { - elementCount = CLAN_CLUSTER; - } else if (faction.isComStarOrWoB()) { - elementCount = COMSTAR_LEVEL_IV; - } - - elementCount = (int) ceil(elementCount * multiplier); - - for (int i = 0; i < elementCount; i++) { - addHiddenExternalScenario(campaign, contract, track, null, false); - } - - return elementCount; - } - /** * Set up initial state of a track, dimensions are based on number of assigned * lances. */ public static StratconTrackState initializeTrackState(int numLances, int scenarioOdds, - int deploymentTime, int planetaryTemp, - double planetaryDiameter) { + int deploymentTime, int planetaryTemp) { + // to initialize a track, + // 1. we set the # of required lances + // 2. set the track size to a total of numlances * 28 hexes, a rectangle that is + // wider than it is taller + // the idea being to create a roughly rectangular playing field that, + // if one deploys a scout lance each week to a different spot, can be more or + // less fully covered + StratconTrackState retVal = new StratconTrackState(); retVal.setRequiredLanceCount(numLances); - // calculate planet surface area - double radius = planetaryDiameter / 2; - double planetSurfaceArea = 4 * Math.PI * Math.pow(radius, 2); - // This gives us a decently sized track, without it feeling too large - planetSurfaceArea /= 1000000; - // set width and height - int numHexes = (int) round(planetSurfaceArea); + int numHexes = numLances * 28; int height = (int) Math.floor(Math.sqrt(numHexes)); int width = numHexes / height; retVal.setWidth(width); @@ -525,74 +456,6 @@ private static void initializeObjectiveScenarios(Campaign campaign, AtBContract } } - /** - * Searches for and returns a suitable adjacent coordinate to the given origin coordinates on - * the provided {@link StratconTrackState}. - * The method checks all the possible directions and considers a coordinate suitable if it - * doesn't contain a scenario and if it either doesn't contain a facility or contains a - * player-allied one. - * If there are multiple suitable coordinates, one is chosen at random. - * - * @param originCoords the {@link StratconCoords} around which to search for a suitable coordinate - * @param trackState the {@link StratconTrackState} on which to perform the search - * @param weightPlayerForces whether to place greater emphasis on player-allied forces and facilities. - * @return a {@link StratconCoords} object representing the coordinates of a suitable adjacent - * location, or {code null} if no suitable location was found. - */ - public static @Nullable StratconCoords getUnoccupiedAdjacentCoords(StratconCoords originCoords, - StratconTrackState trackState, - boolean weightPlayerForces) { - List suitableCoords = new ArrayList<>(); - List playerForceCoords = new ArrayList<>(); - List playerFacilityCoords = new ArrayList<>(); - - for (int direction : ALL_DIRECTIONS) { - StratconCoords newCoords = originCoords.translate(direction); - - if (trackState.getScenario(newCoords) != null) { - continue; - } - - if (trackState.getFacility(newCoords) == null) { - suitableCoords.add(newCoords); - continue; - } - - if (trackState.getFacility(newCoords).getOwner() != ForceAlignment.Opposing) { - suitableCoords.add(newCoords); - - if (weightPlayerForces) { - playerFacilityCoords.add(newCoords); - } - } - - if (trackState.getAssignedForceCoords().containsValue(newCoords)) { - playerForceCoords.add(newCoords); - } - } - - if (suitableCoords.isEmpty()) { - return null; - } - - Random random = new Random(); - - if (weightPlayerForces) { - if (!playerFacilityCoords.isEmpty()) { - int randomIndex = random.nextInt(playerFacilityCoords.size()); - return playerFacilityCoords.get(randomIndex); - } - - if (!playerForceCoords.isEmpty()) { - int randomIndex = random.nextInt(playerForceCoords.size()); - return playerForceCoords.get(randomIndex); - } - } - - int randomIndex = random.nextInt(suitableCoords.size()); - return suitableCoords.get(randomIndex); - } - /** * Given a mission (that's an AtB contract), restore track state information, * such as pointers from StratCon scenario objects to AtB scenario objects. diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java index 1af1c3f5f7..65ad62de22 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java @@ -57,7 +57,6 @@ import static mekhq.campaign.mission.ScenarioMapParameters.MapLocation.LowAtmosphere; import static mekhq.campaign.mission.ScenarioMapParameters.MapLocation.Space; import static mekhq.campaign.mission.ScenarioMapParameters.MapLocation.SpecificGroundTerrain; -import static mekhq.campaign.stratcon.StratconContractInitializer.getUnoccupiedAdjacentCoords; import static mekhq.campaign.stratcon.StratconContractInitializer.getUnoccupiedCoords; /** @@ -657,14 +656,22 @@ public static void deployForceToCoords(StratconCoords coords, int forceID, Campa // don't create a scenario on top of allied facilities StratconFacility facility = track.getFacility(coords); boolean isNonAlliedFacility = (facility != null) && (facility.getOwner() != ForceAlignment.Allied); + int targetNum = calculateScenarioOdds(track, contract, true); + boolean spawnScenario = (facility == null) && (Compute.randomInt(100) <= targetNum); - if (isNonAlliedFacility) { + if (isNonAlliedFacility || spawnScenario) { StratconScenario scenario = setupScenario(coords, forceID, campaign, contract, track); // we deploy immediately in this case, since we deployed the force manually setScenarioDates(0, track, campaign, scenario); AtBDynamicScenarioFactory.finalizeScenario(scenario.getBackingScenario(), contract, campaign); setScenarioParametersFromBiome(track, scenario); + // if we wound up with a field scenario, we may sub in dropships carrying + // units of the force in question + if (spawnScenario && !isNonAlliedFacility) { + swapInPlayerUnits(scenario, campaign, forceID); + } + commitPrimaryForces(campaign, scenario, track); } } @@ -2020,72 +2027,6 @@ public static boolean processIgnoredScenario(StratconScenario scenario, Stratcon return true; } - /** - * Performs the daily movement processing for each active scenario in every track of the given - * {@link StratconCampaignState}. - * This processing involves evaluating each scenario and, if it is not yet deployed, attempting - * to move it to an unoccupied coordinate. - * If movement is possible, the scenario is updated with the new coordinates and parameters are - * set based on the new location's biome. - * If the new location contains a facility, the scenario is replaced with a facility scenario. - * - * @param campaign the current campaign - * @param campaignState the relevant {@link StratconCampaignState} - */ - public static void processDailyMovement(Campaign campaign, StratconCampaignState campaignState) { - for (StratconTrackState track : campaignState.getTracks()) { - List allScenarios = new ArrayList<>(track.getScenarios().values()); - - for (StratconScenario scenario : allScenarios) { - if (scenario.getDeploymentDate() == null && !scenario.isStrategicObjective()) { - StratconCoords scenarioCoords = scenario.getCoords(); - StratconCoords newCoords = getUnoccupiedAdjacentCoords(scenarioCoords, track, true); - - if (newCoords == null) { - continue; - } - - track.removeScenario(scenario); - track.updateScenario(scenario); - - if (track.getFacility(newCoords) == null) { - scenario.setCoords(newCoords); - setScenarioParametersFromBiome(track, scenario); - track.addScenario(scenario); - } else { - generateExternalScenario(campaign, campaignState.getContract(), track, newCoords, - null, true); - } - } - } - } - } - - /** - * Processes a mass rout in the given campaign state. - *

- * Loops through all tracks in the campaign state. - * For each track, it retrieves all scenarios. - * If scenario's deployment date is {@code null} and scenario is not a strategic objective, - * it is removed from the track and then updated. - * - * @param campaignState the relevant StratCon campaign state. - * @param removeAll whether to remove all scenarios, including those with dates or - * strategic objectives. This should be used sparingly. - */ - public static void processMassRout(StratconCampaignState campaignState, boolean removeAll) { - for (StratconTrackState track : campaignState.getTracks()) { - List allScenarios = new ArrayList<>(track.getScenarios().values()); - - for (StratconScenario scenario : allScenarios) { - if (removeAll || (scenario.getDeploymentDate() == null && !scenario.isStrategicObjective())) { - track.removeScenario(scenario); - track.updateScenario(scenario); - } - } - } - } - public void startup() { MekHQ.registerHandler(this); } @@ -2129,21 +2070,9 @@ public void handleNewDay(NewDayEvent ev) { } } - processDailyMovement(ev.getCampaign(), campaignState); - - // on monday, generate new scenarios and reinforce existing enemy forces + // on monday, generate new scenarios if (isMonday) { generateScenariosForTrack(ev.getCampaign(), contract, track); - - int reinforcementOdds = calculateScenarioOdds(track, contract, true); - - int roll = Compute.randomInt(100); - while (roll < reinforcementOdds) { - addHiddenExternalScenario(ev.getCampaign(), contract, track, null, false); - - reinforcementOdds -= roll; - roll = Compute.randomInt(100); - } } } } diff --git a/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java b/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java index b10de2352f..3c7178331b 100644 --- a/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java +++ b/MekHQ/src/mekhq/gui/stratcon/CampaignManagementDialog.java @@ -60,9 +60,8 @@ public void display(StratconCampaignState campaignState, StratconTrackState curr lblTrackScenarioOdds.setVisible(gmMode); if (gmMode) { - lblTrackScenarioOdds.setText(String.format("Track Reinforcement Odds: %d%%", - StratconRulesManager.calculateScenarioOdds(currentTrack, campaignState.getContract(), - true))); + lblTrackScenarioOdds.setText(String.format("Track Scenario Odds: %d%%", + StratconRulesManager.calculateScenarioOdds(currentTrack, campaignState.getContract(), false))); } } From 0a8c48f28f4f8da80b701ce42fb5cc69d42e0d60 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Sun, 24 Nov 2024 17:37:07 -0600 Subject: [PATCH 21/22] Refine performance modifier logic in AtBContract Adjusted performance modifier calculation to include tightened conditions for victory and defeat ratios. Modified the decrease and increase values to better reflect performance variability. --- .../MekHQ Morale.pdf | Bin 65003 -> 65063 bytes .../mekhq/campaign/mission/AtBContract.java | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MekHQ/docs/Stratcon and Against the Bot/MekHQ Morale.pdf b/MekHQ/docs/Stratcon and Against the Bot/MekHQ Morale.pdf index eea552fd03f920edc5debf0dff90907378a3194c..6bd1fee30b8ee83000ba96779de5630c1d79ef60 100644 GIT binary patch delta 6370 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 delta 6305 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 diff --git a/MekHQ/src/mekhq/campaign/mission/AtBContract.java b/MekHQ/src/mekhq/campaign/mission/AtBContract.java index 4f38bb3348..126de2d9ac 100644 --- a/MekHQ/src/mekhq/campaign/mission/AtBContract.java +++ b/MekHQ/src/mekhq/campaign/mission/AtBContract.java @@ -566,14 +566,14 @@ public void checkMorale(Campaign campaign, LocalDate today) { int performanceModifier = 0; - if (victories > (defeats * 2)) { - performanceModifier -= 2; + if (victories >= (defeats * 2)) { + performanceModifier -= 4; } else if (victories > defeats) { - performanceModifier--; - } else if (defeats > (victories * 2)) { + performanceModifier -= 2; + } else if (defeats >= (victories * 2)) { + performanceModifier += 4; + } else if (defeats > victories) { performanceModifier += 2; - } else { - performanceModifier++; } targetNumber.addModifier(performanceModifier, "performanceModifier"); From 519101fd9d19e987be75af19b68fd976a0cd3f97 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Sun, 24 Nov 2024 17:44:10 -0600 Subject: [PATCH 22/22] Refactored morale initialization for StratCon contracts Updated the morale initialization logic to differentiate between garrison and relief duty contracts. Utilized the 'min' function to adjust morale levels more accurately and corrected a typo in the contract type check. --- .../campaign/stratcon/StratconContractInitializer.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java index ccd59223ea..0c435b7222 100644 --- a/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java +++ b/MekHQ/src/mekhq/campaign/stratcon/StratconContractInitializer.java @@ -37,6 +37,8 @@ import java.util.List; import java.util.Random; +import static java.lang.Math.min; + /** * This class handles StratCon state initialization when a contract is signed. */ @@ -200,7 +202,7 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai } // Determine starting morale - if (contract.getContractType().isGarrisonDuty()) { + if (contract.getContractType().isGarrisonType()) { contract.setMoraleLevel(AtBMoraleLevel.ROUTED); LocalDate routEnd = contract.getStartDate().plusMonths(Math.max(1, Compute.d6() - 3)).minusDays(1); @@ -211,6 +213,12 @@ public static void initializeCampaignState(AtBContract contract, Campaign campai if (contract.getMoraleLevel().isRouted()) { contract.setMoraleLevel(AtBMoraleLevel.CRITICAL); } + + if (contract.getContractType().isReliefDuty()) { + int currentMoraleLevel = min(6, contract.getMoraleLevel().ordinal() + 1); + + contract.setMoraleLevel(AtBMoraleLevel.parseFromString(String.valueOf(currentMoraleLevel))); + } } // now we're done