Skip to content

Commit

Permalink
Merge pull request #6029 from DM0000/ReinforcmentSelection
Browse files Browse the repository at this point in the history
Linked scenario unit selection
  • Loading branch information
HammerGS authored Feb 15, 2025
2 parents c2fb924 + 5f5f8b9 commit 6dc5f62
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 52 deletions.
35 changes: 22 additions & 13 deletions MekHQ/src/mekhq/campaign/stratcon/StratconRulesManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -2651,34 +2651,43 @@ public static void processScenarioCompletion(ResolveScenarioTracker tracker) {

/**
* Processes completion of a Stratcon scenario that is linked to another scenario
* pulls forces off completed scenario and moves them to linked one.
*
* pulls force off completed scenario, checks to see if entire force is moving on or subset of units
*
* Should only be used after a scenario is resolved
*/
public static void linkedScenarioProcessing(ResolveScenarioTracker tracker, List<Integer> forces) {
public static void linkedScenarioProcessing(ResolveScenarioTracker tracker, HashMap<Integer, List<UUID>> linkedForces) {
Scenario nextScenario = tracker.getCampaign().getScenario(tracker.getScenario().getLinkedScenario());

Campaign campaign = tracker.getCampaign();

if (nextScenario instanceof AtBScenario nextAtBScenario) {
StratconCampaignState campaignState = nextAtBScenario.getContract(tracker.getCampaign())
.getStratconCampaignState();

StratconCampaignState campaignState = nextAtBScenario.getContract(campaign).getStratconCampaignState();
if (campaignState == null) {
return;
}
}

for (StratconTrackState track : campaignState.getTracks()) {
if (track.getBackingScenariosMap().containsKey(nextScenario.getId())) {
StratconScenario scenario = track.getBackingScenariosMap().get(nextScenario.getId());
for (int forceID : forces) {
track.unassignForce(forceID);
nextScenario.addForces(forceID);
//Go through each force that was in previous scenario undeploy it and check to see if entire force is moving on
//if so deploy whole force. Otherwise just deploy selected units.
for(int forceId : linkedForces.keySet()){
track.unassignForce(forceId);

if(linkedForces.get(forceId).size() == campaign.getForce(forceId).getAllUnits(false).size()){
scenario.addForce(campaign.getForce(forceId), ScenarioForceTemplate.REINFORCEMENT_TEMPLATE_ID, campaign);
} else {
for( UUID unitId : linkedForces.get(forceId)){
scenario.addUnit(campaign.getUnit(unitId), ScenarioForceTemplate.REINFORCEMENT_TEMPLATE_ID, false);
}
}
}

}

}

}
}


/**
* Worker function that updates strategic objectives relevant to the passed in
* scenario, track and campaign state. For example, "win scenario A" or "win X
Expand Down
95 changes: 56 additions & 39 deletions MekHQ/src/mekhq/gui/dialog/ResolveScenarioWizardDialog.java
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public class ResolveScenarioWizardDialog extends JDialog {
private List<JButton> btnsEditUnit;
private List<UnitStatus> ustatuses;
private List<JLabel> lblsUnitName;
private JButton btnSendReinforcements;
private List<JCheckBox> chkReinforcements;
private boolean reinforcementsSent = false;

// maps objectives to list of associated entity checkboxes
Expand Down Expand Up @@ -363,25 +363,34 @@ private JPanel makeUnitStatusPanel() {
gridBagConstraints.insets = new Insets(5, 5, 0, 0);
pnlUnitStatus.add(new JLabel(resourceMap.getString("totaled")), gridBagConstraints);

boolean possibleReinforcment = (tracker.getScenario().getLinkedScenario() != 0);
if(possibleReinforcment){
gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 4;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = GridBagConstraints.CENTER;
gridBagConstraints.insets = new Insets(5, 5, 0, 0);
String linkedScenario = tracker.getCampaign().getScenario(tracker.getScenario().getLinkedScenario()).getName();
pnlUnitStatus.add(new JLabel( "<html><center>Continue to</center></br><b>"+ linkedScenario+"</b></html>"), gridBagConstraints);
}



chksTotaled = new ArrayList<>();
ustatuses = new ArrayList<>();
btnsEditUnit = new ArrayList<>();
lblsUnitName = new ArrayList<>();
chkReinforcements = new ArrayList<>();

JLabel nameLbl;
JCheckBox chkTotaled;
JButton btnViewUnit;
JButton btnEditUnit;
JCheckBox chkReinforced;

int gridy = 2;
int unitIndex = 0;

btnSendReinforcements = new JButton("Continue as Reinforcements");
btnSendReinforcements.setEnabled(tracker.getScenario().getLinkedScenario() != 0);
btnSendReinforcements.setName("Confirm Reinforcement");
btnSendReinforcements.addActionListener(new ReinforcementListener());


for (Unit unit : tracker.getUnits()) {
UnitStatus status = tracker.getUnitsStatus().get(unit.getId());
ustatuses.add(status);
Expand All @@ -408,27 +417,36 @@ private JPanel makeUnitStatusPanel() {
btnEditUnit.addActionListener(new EditUnitListener());
btnsEditUnit.add(btnEditUnit);


chkReinforced = new JCheckBox("");
chkReinforced.setVisible(possibleReinforcment);
chkReinforced.setEnabled(!status.isTotalLoss() && unit.isFunctional());
chkReinforced.setName(Integer.toString(unitIndex));
chkReinforced.setActionCommand(unit.getId().toString());
chkReinforcements.add(chkReinforced);


gridBagConstraints = new GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = gridy;
gridBagConstraints.anchor = GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new Insets(5, 5, 0, 0);
gridBagConstraints.weightx = 0.0;

if (unitIndex == tracker.getUnits().size() - 1) {
gridBagConstraints.weighty = 1.0;
}

pnlUnitStatus.add(nameLbl, gridBagConstraints);
gridBagConstraints.gridx = 1;
pnlUnitStatus.add(chkTotaled, gridBagConstraints);
gridBagConstraints.gridx = 2;
pnlUnitStatus.add(btnViewUnit, gridBagConstraints);
gridBagConstraints.gridx = 3;
pnlUnitStatus.add(btnEditUnit, gridBagConstraints);
gridBagConstraints.gridx = 4;
gridBagConstraints.anchor = GridBagConstraints.NORTH;
pnlUnitStatus.add(chkReinforced, gridBagConstraints);
gridy++;
if (unitIndex == tracker.getUnits().size() - 1) {
gridBagConstraints.weighty = 1.0;
gridBagConstraints.gridy= gridy;
gridBagConstraints.gridx = 1;
pnlUnitStatus.add(btnSendReinforcements, gridBagConstraints);
}
unitIndex++;
}

Expand Down Expand Up @@ -1588,8 +1606,24 @@ private void finish() {
}
}
}
List<Integer> forces = tracker.getScenario().getForceIDs();

//Collect forces and units selected as reinforcements
HashMap<Integer, List<UUID>> linkedForces = new HashMap<>();

for(JCheckBox box : chkReinforcements){
if(box.isSelected()){
UUID id = UUID.fromString(box.getActionCommand());

if(!linkedForces.containsKey(campaign.getUnit(id).getForceId())){
List<UUID> unitList = new ArrayList<UUID>();
linkedForces.put(campaign.getUnit(id).getForceId(), unitList);
reinforcementsSent = true;
}
linkedForces.get(campaign.getUnit(id).getForceId()).add(id);
}
}


//now process
tracker.resolveScenario((ScenarioStatus) choiceStatus.getSelectedItem(), txtReport.getText());

Expand Down Expand Up @@ -1617,9 +1651,12 @@ private void finish() {

StratconRulesManager.processScenarioCompletion(tracker);



if (reinforcementsSent && tracker.getScenario().getStatus().isOverallVictory()
&& tracker.getScenario().getLinkedScenario() != 0) {
StratconRulesManager.linkedScenarioProcessing(tracker, forces);

StratconRulesManager.linkedScenarioProcessing(tracker, linkedForces);
}


Expand Down Expand Up @@ -1868,6 +1905,7 @@ private void editUnit(UUID id, int unitIndex, boolean isSalvage) {
checkSalvageRights();
} else {
lblsUnitName.get(unitIndex).setText(ustatus.getDesc());
chkReinforcements.get(unitIndex).setEnabled(ustatus.getUnit().isFunctional());
}
}

Expand Down Expand Up @@ -1952,9 +1990,11 @@ private class CheckTotalListener implements ItemListener {
public void itemStateChanged(ItemEvent evt) {
int idx = Integer.parseInt(((JCheckBox) evt.getItem()).getName());
btnsEditUnit.get(idx).setEnabled(!chksTotaled.get(idx).isSelected());
chkReinforcements.get(idx).setEnabled(!chksTotaled.get(idx).isSelected());
}
}


/**
* Event handler for a KIA checkbox
* Manipulates other associated controls
Expand Down Expand Up @@ -2017,27 +2057,4 @@ public void actionPerformed(ActionEvent evt) {
}
}



/**
* Event handler for "Continue as Reinforcements" Button that
* adjusts boolean used after scenario resolution to signal
* player wants to send units to linked scenario
*/
private class ReinforcementListener implements ActionListener {

public ReinforcementListener() {
}

@Override
public void actionPerformed(ActionEvent evt) {
reinforcementsSent = (!reinforcementsSent);

if(reinforcementsSent){
((JButton)evt.getSource()).setBackground(new Color(6, 64, 43));
}else{
((JButton) evt.getSource()).setBackground(UIManager.getColor("Button.background"));
}
}
}
}

0 comments on commit 6dc5f62

Please sign in to comment.