Skip to content

Commit a9865ed

Browse files
authored
Merge pull request #6592 from IllianiBird/mineNow
Fix #6439: Fixed Turnover Unit Assignment for Characters Breaking Contract
2 parents 98dd78d + d1e0634 commit a9865ed

File tree

1 file changed

+88
-84
lines changed

1 file changed

+88
-84
lines changed

MekHQ/src/mekhq/gui/dialog/RetirementDefectionDialog.java

+88-84
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.awt.Toolkit;
3939
import java.awt.event.ActionEvent;
4040
import java.awt.event.ActionListener;
41+
import java.time.LocalDate;
4142
import java.time.temporal.ChronoUnit;
4243
import java.util.ArrayList;
4344
import java.util.HashMap;
@@ -64,6 +65,7 @@
6465
import megamek.logging.MMLogger;
6566
import mekhq.MekHQ;
6667
import mekhq.campaign.Campaign;
68+
import mekhq.campaign.CampaignOptions;
6769
import mekhq.campaign.finances.Money;
6870
import mekhq.campaign.finances.enums.TransactionType;
6971
import mekhq.campaign.mission.Mission;
@@ -87,47 +89,47 @@ public class RetirementDefectionDialog extends JDialog {
8789
private static final MMLogger logger = MMLogger.create(RetirementDefectionDialog.class);
8890

8991
private static final String PAN_OVERVIEW = "PanOverview";
90-
private static final String PAN_RESULTS = "PanResults";
92+
private static final String PAN_RESULTS = "PanResults";
9193

9294
private String currentPanel;
9395

94-
final private CampaignGUI hqView;
95-
final private Mission contract;
96+
final private CampaignGUI hqView;
97+
final private Mission contract;
9698
final private RetirementDefectionTracker rdTracker;
9799

98-
private Map<UUID, TargetRoll> targetRolls;
99-
final private Map<UUID, UUID> unitAssignments;
100+
private Map<UUID, TargetRoll> targetRolls;
101+
final private Map<UUID, UUID> unitAssignments;
100102

101-
private JPanel panMain;
102-
private JTextArea txtInstructions;
103+
private JPanel panMain;
104+
private JTextArea txtInstructions;
103105
private CardLayout cardLayout;
104106

105107
/* Overview Panel components */
106-
private JComboBox<PersonnelFilter> cbGroupOverview;
107-
private JSpinner spnGeneralMod;
108-
private JLabel lblTotal;
109-
private JLabel lblTotalShares;
110-
private RetirementTable personnelTable;
108+
private JComboBox<PersonnelFilter> cbGroupOverview;
109+
private JSpinner spnGeneralMod;
110+
private JLabel lblTotal;
111+
private JLabel lblTotalShares;
112+
private RetirementTable personnelTable;
111113
private TableRowSorter<RetirementTableModel> personnelSorter;
112114
private TableRowSorter<RetirementTableModel> retireeSorter;
113-
private JTextArea txtTargetDetails;
115+
private JTextArea txtTargetDetails;
114116

115117
/* Results Panel components */
116-
private JComboBox<PersonnelFilter> cbGroupResults;
117-
private JLabel lblPayment;
118-
private RetirementTable retireeTable;
119-
private JButton btnAddUnit;
120-
private JButton btnRemoveUnit;
121-
private JComboBox<String> cbUnitCategory;
122-
private JCheckBox chkShowAllUnits;
123-
private JTable unitAssignmentTable;
118+
private JComboBox<PersonnelFilter> cbGroupResults;
119+
private JLabel lblPayment;
120+
private RetirementTable retireeTable;
121+
private JButton btnAddUnit;
122+
private JButton btnRemoveUnit;
123+
private JComboBox<String> cbUnitCategory;
124+
private JCheckBox chkShowAllUnits;
125+
private JTable unitAssignmentTable;
124126
private TableRowSorter<UnitAssignmentTableModel> unitSorter;
125127

126128
/* Button Panel components */
127-
private JButton btnCancel;
129+
private JButton btnCancel;
128130
private JToggleButton btnEdit;
129-
private JButton btnRoll;
130-
private JButton btnDone;
131+
private JButton btnRoll;
132+
private JButton btnDone;
131133

132134
private boolean aborted = true;
133135

@@ -136,10 +138,10 @@ public class RetirementDefectionDialog extends JDialog {
136138

137139
public RetirementDefectionDialog(CampaignGUI gui, Mission mission, boolean doRetirement) {
138140
super(gui.getFrame(), true);
139-
hqView = gui;
141+
hqView = gui;
140142
unitAssignments = new HashMap<>();
141-
this.contract = mission;
142-
rdTracker = hqView.getCampaign().getRetirementDefectionTracker();
143+
this.contract = mission;
144+
rdTracker = hqView.getCampaign().getRetirementDefectionTracker();
143145
if (doRetirement) {
144146
targetRolls = rdTracker.getTargetNumbers(mission, hqView.getCampaign());
145147

@@ -168,15 +170,15 @@ public RetirementDefectionDialog(CampaignGUI gui, Mission mission, boolean doRet
168170
private void initComponents(boolean doRetirement) {
169171
setTitle(resourceMap.getString("title.text"));
170172

171-
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
172-
int screenWidth = (int) (screenSize.getWidth() * 0.75);
173-
int screenHeight = (int) (screenSize.getHeight() * 0.94);
173+
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
174+
int screenWidth = (int) (screenSize.getWidth() * 0.75);
175+
int screenHeight = (int) (screenSize.getHeight() * 0.94);
174176

175177
setSize(screenWidth, screenHeight);
176178

177179
setLayout(new BorderLayout());
178180
cardLayout = new CardLayout();
179-
panMain = new JPanel(cardLayout);
181+
panMain = new JPanel(cardLayout);
180182
add(panMain, BorderLayout.CENTER);
181183

182184
txtInstructions = new JTextArea();
@@ -190,8 +192,8 @@ private void initComponents(boolean doRetirement) {
190192
String instructions = resourceMap.getString("txtInstructions.Overview.text");
191193
if (null == contract) {
192194
instructions += "\n\nDays since last Employee Turnover check: " +
193-
ChronoUnit.DAYS.between(rdTracker.getLastRetirementRoll(),
194-
hqView.getCampaign().getLocalDate());
195+
ChronoUnit.DAYS.between(rdTracker.getLastRetirementRoll(),
196+
hqView.getCampaign().getLocalDate());
195197
}
196198
txtInstructions.setText(instructions);
197199
} else {
@@ -265,11 +267,11 @@ private void initComponents(boolean doRetirement) {
265267
if (personnelTable.getSelectedRow() < 0) {
266268
return;
267269
}
268-
int row = personnelTable.convertRowIndexToModel(personnelTable.getSelectedRow());
269-
UUID id = ((RetirementTableModel) (personnelTable.getModel())).getPerson(row).getId();
270+
int row = personnelTable.convertRowIndexToModel(personnelTable.getSelectedRow());
271+
UUID id = ((RetirementTableModel) (personnelTable.getModel())).getPerson(row).getId();
270272
txtTargetDetails.setText(targetRolls.get(id).getDesc() +
271-
(payBonus(id) ? " -2 (Bonus)" : " ") +
272-
((miscModifier(id) != 0) ? miscModifier(id) + " (Misc)" : ""));
273+
(payBonus(id) ? " -2 (Bonus)" : " ") +
274+
((miscModifier(id) != 0) ? miscModifier(id) + " (Misc)" : ""));
273275
});
274276

275277
personnelTable.getColumnModel()
@@ -351,7 +353,7 @@ private void initComponents(boolean doRetirement) {
351353
panRetirees.add(panTop, BorderLayout.PAGE_START);
352354

353355
RetirementTableModel model = new RetirementTableModel(hqView.getCampaign());
354-
retireeTable = new RetirementTable(model, hqView);
356+
retireeTable = new RetirementTable(model, hqView);
355357
retireeSorter = new TableRowSorter<>(model);
356358
retireeSorter.setComparator(RetirementTableModel.COL_PERSON, new PersonRankStringSorter(hqView.getCampaign()));
357359
retireeTable.setRowSorter(retireeSorter);
@@ -461,17 +463,17 @@ private void initComponents(boolean doRetirement) {
461463
private void setBonusAndShareTotals(Money totalBonuses) {
462464
if (totalBonuses.isGreaterThan(hqView.getCampaign().getFinances().getBalance())) {
463465
lblTotal.setText("<html>" +
464-
resourceMap.getString("lblTotalBonus.text") +
465-
' ' +
466-
"<font color='" +
467-
MekHQ.getMHQOptions().getFontColorNegativeHexColor() +
468-
"'>" +
469-
getTotalBonus().toAmountAndSymbolString() +
470-
"</font></html>");
466+
resourceMap.getString("lblTotalBonus.text") +
467+
' ' +
468+
"<font color='" +
469+
MekHQ.getMHQOptions().getFontColorNegativeHexColor() +
470+
"'>" +
471+
getTotalBonus().toAmountAndSymbolString() +
472+
"</font></html>");
471473
} else {
472474
lblTotal.setText(resourceMap.getString("lblTotalBonus.text") +
473-
' ' +
474-
getTotalBonus().toAmountAndSymbolString());
475+
' ' +
476+
getTotalBonus().toAmountAndSymbolString());
475477
}
476478

477479
if (hqView.getCampaign().getCampaignOptions().isUseShareSystem()) {
@@ -583,9 +585,9 @@ private void initResults() {
583585
* they go if it is still around
584586
*/
585587
if (hqView.getCampaign().getCampaignOptions().isTrackOriginalUnit() &&
586-
(null != person.getOriginalUnitId()) &&
587-
!unitAssignments.containsValue(person.getOriginalUnitId()) &&
588-
(hqView.getCampaign().getUnit(person.getOriginalUnitId()) != null)) {
588+
(null != person.getOriginalUnitId()) &&
589+
!unitAssignments.containsValue(person.getOriginalUnitId()) &&
590+
(hqView.getCampaign().getUnit(person.getOriginalUnitId()) != null)) {
589591
unitAssignments.put(id, person.getOriginalUnitId());
590592
if (hqView.getCampaign().getCampaignOptions().isUseShareSystem()) {
591593
Money temp = rdTracker.getPayout(id)
@@ -609,7 +611,8 @@ private void initResults() {
609611
lblPayment.setText(totalPayout().toAmountAndSymbolString());
610612
}
611613

612-
private void filterPersonnel(TableRowSorter<RetirementTableModel> sorter, JComboBox<PersonnelFilter> comboBox, boolean resultsView) {
614+
private void filterPersonnel(TableRowSorter<RetirementTableModel> sorter, JComboBox<PersonnelFilter> comboBox,
615+
boolean resultsView) {
613616
PersonnelFilter nGroup = (comboBox.getSelectedItem() != null) ?
614617
(PersonnelFilter) comboBox.getSelectedItem() :
615618
PersonnelFilter.ACTIVE;
@@ -619,8 +622,8 @@ private void filterPersonnel(TableRowSorter<RetirementTableModel> sorter, JCombo
619622
public boolean include(Entry<? extends RetirementTableModel, ? extends Integer> entry) {
620623
Person person = entry.getModel().getPerson(entry.getIdentifier());
621624
if (resultsView &&
622-
(rdTracker.getRetirees(contract) != null) &&
623-
!rdTracker.getRetirees(contract).contains(person.getId())) {
625+
(rdTracker.getRetirees(contract) != null) &&
626+
!rdTracker.getRetirees(contract).contains(person.getId())) {
624627
return false;
625628
} else {
626629
return nGroup.getFilteredInformation(person, hqView.getCampaign().getLocalDate());
@@ -635,19 +638,19 @@ public void filterUnits() {
635638
@Override
636639
public boolean include(Entry<? extends UnitAssignmentTableModel, ? extends Integer> entry) {
637640
UnitAssignmentTableModel unitModel = entry.getModel();
638-
Unit unit = unitModel.getUnit(entry.getIdentifier());
641+
Unit unit = unitModel.getUnit(entry.getIdentifier());
639642
if (!chkShowAllUnits.isSelected() && retireeTable.getSelectedRow() >= 0) {
640643
Person selectedPerson = ((RetirementTableModel) retireeTable.getModel()).getPerson(retireeTable.convertRowIndexToModel(
641644
retireeTable.getSelectedRow()));
642645
if (null != rdTracker.getPayout(selectedPerson.getId()) &&
643-
rdTracker.getPayout(selectedPerson.getId()).getWeightClass() > 0 &&
644-
weightClassIndex(unit) != rdTracker.getPayout(selectedPerson.getId()).getWeightClass()) {
646+
rdTracker.getPayout(selectedPerson.getId()).getWeightClass() > 0 &&
647+
weightClassIndex(unit) != rdTracker.getPayout(selectedPerson.getId()).getWeightClass()) {
645648
return false;
646649
}
647650
}
648651
/* Can't really give a platoon as payment */
649652
if ((unit.getEntity().getUnitType() == UnitType.BATTLE_ARMOR) ||
650-
(unit.getEntity().getUnitType() == UnitType.INFANTRY)) {
653+
(unit.getEntity().getUnitType() == UnitType.INFANTRY)) {
651654
return false;
652655
}
653656
if (unitAssignments.containsValue(unit.getId())) {
@@ -656,8 +659,8 @@ public boolean include(Entry<? extends UnitAssignmentTableModel, ? extends Integ
656659
if (nGroup < 0) {
657660
return true;
658661
}
659-
Entity en = unit.getEntity();
660-
int type = -1;
662+
Entity en = unit.getEntity();
663+
int type = -1;
661664
if (null != en) {
662665
type = unit.getEntity().getUnitType();
663666
}
@@ -709,8 +712,8 @@ public Money totalPayout() {
709712
* final payout.
710713
*/
711714
if ((rdTracker.getPayout(id).getWeightClass() == 0) &&
712-
(unitAssignments.get(id) != null) &&
713-
(hqView.getCampaign().getUnit(unitAssignments.get(id)) != null)) {
715+
(unitAssignments.get(id) != null) &&
716+
(hqView.getCampaign().getUnit(unitAssignments.get(id)) != null)) {
714717
payout = payout.minus(hqView.getCampaign().getUnit(unitAssignments.get(id)).getSellValue());
715718
}
716719

@@ -749,7 +752,7 @@ public boolean payBonus(UUID id) {
749752

750753
public int miscModifier(UUID id) {
751754
return ((RetirementTableModel) personnelTable.getModel()).getMiscModifier(id) +
752-
(Integer) spnGeneralMod.getValue();
755+
(Integer) spnGeneralMod.getValue();
753756
}
754757

755758
private int getTotalShares() {
@@ -840,16 +843,21 @@ private boolean unitAssignmentsComplete() {
840843
return true;
841844
}
842845

843-
boolean assignmentComplete = rdTracker.getRetirees()
844-
.stream()
845-
.filter(uuid -> isBreakingContract(hqView.getCampaign().getPerson(uuid),
846-
hqView.getCampaign().getLocalDate(),
847-
hqView.getCampaign()
848-
.getCampaignOptions()
849-
.getServiceContractDuration()))
850-
.findFirst()
851-
.map(uuid -> (!unitAssignments.containsKey(uuid)))
852-
.orElse(true);
846+
boolean assignmentComplete = true;
847+
LocalDate today = hqView.getCampaign().getLocalDate();
848+
CampaignOptions campaignOptions = hqView.getCampaign().getCampaignOptions();
849+
int serviceContractDuration = campaignOptions.getServiceContractDuration();
850+
for (UUID personId : rdTracker.getRetirees()) {
851+
Person retiree = hqView.getCampaign().getPerson(personId);
852+
UUID originalUnitId = retiree.getOriginalUnitId();
853+
854+
if (isBreakingContract(retiree, today, serviceContractDuration)) {
855+
if (!unitAssignments.containsKey(personId) && unitAssignments.containsValue(originalUnitId)) {
856+
assignmentComplete = false;
857+
break;
858+
}
859+
}
860+
}
853861

854862
return ((assignmentComplete) && (totalPayout.isLessThan(hqView.getCampaign().getFunds())));
855863
}
@@ -859,22 +867,17 @@ private void enableAddRemoveButtons() {
859867
btnAddUnit.setEnabled(false);
860868
btnRemoveUnit.setEnabled(false);
861869
} else {
862-
int retireeRow = retireeTable.convertRowIndexToModel(retireeTable.getSelectedRow());
863-
UUID pid = ((RetirementTableModel) (retireeTable.getModel())).getPerson(retireeRow).getId();
864-
if (isBreakingContract(hqView.getCampaign().getPerson(pid),
865-
hqView.getCampaign().getLocalDate(),
866-
hqView.getCampaign().getCampaignOptions().getServiceContractDuration())) {
870+
int retireeRow = retireeTable.convertRowIndexToModel(retireeTable.getSelectedRow());
871+
UUID pid = ((RetirementTableModel) (retireeTable.getModel())).getPerson(retireeRow).getId();
872+
if (null == rdTracker.getPayout(pid) &&
873+
isBreakingContract(hqView.getCampaign().getPerson(pid),
874+
hqView.getCampaign().getLocalDate(),
875+
hqView.getCampaign().getCampaignOptions().getServiceContractDuration())) {
867876
btnAddUnit.setEnabled(false);
868877
btnRemoveUnit.setEnabled(false);
869878
} else if (hqView.getCampaign().getPerson(pid).getPrimaryRole().isSoldierOrBattleArmour()) {
870879
btnAddUnit.setEnabled(false);
871880
btnRemoveUnit.setEnabled(false);
872-
} else if (unitAssignments.containsKey(pid)) {
873-
btnAddUnit.setEnabled(false);
874-
btnRemoveUnit.setEnabled((!hqView.getCampaign().getCampaignOptions().isTrackOriginalUnit() ||
875-
!unitAssignments.get(pid)
876-
.equals(hqView.getCampaign().getPerson(pid).getOriginalUnitId())) ||
877-
btnEdit.isSelected());
878881
} else if (null != rdTracker.getPayout(pid) && rdTracker.getPayout(pid).getWeightClass() > 0) {
879882
if (unitAssignmentTable.getSelectedRow() < 0) {
880883
btnAddUnit.setEnabled(false);
@@ -1012,7 +1015,8 @@ public Object getCellEditorValue() {
10121015
}
10131016

10141017
@Override
1015-
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
1018+
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row,
1019+
int column) {
10161020
spinner.setValue(value);
10171021
return spinner;
10181022
}

0 commit comments

Comments
 (0)