Skip to content
Draft

Leases! #7043

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
65db58b
Fixes issue #7004. Gives buttons in the Purchase Unit dialog more con…
savanik May 14, 2025
0f7527e
Implements first part of lease object. Leases work, but implementatio…
savanik May 15, 2025
6e2dbd7
Implements first part of lease object. Leases work, but implementatio…
savanik May 15, 2025
1e7923e
Implements second part of leases, acquisition rolls are now more or l…
savanik May 16, 2025
1532687
Implements third part of leases, acquisition rolls now function appro…
savanik May 16, 2025
7eaf7b9
Implements third part of leases, acquisition rolls now function appro…
savanik May 16, 2025
53eaed5
Quick fix for Lease names in acquisition list.
savanik May 16, 2025
28983d7
Breaking Lease into Lease and LeaseOrder to separate procurement logi…
savanik May 17, 2025
fd02de2
Adding functionality for unleasing units to right-click context menu.
savanik May 17, 2025
4f1d45d
Implements first part of lease object. Leases work, but implementatio…
savanik May 15, 2025
7f3206c
Implements second part of leases, acquisition rolls are now more or l…
savanik May 16, 2025
a3502ca
Implements third part of leases, acquisition rolls now function appro…
savanik May 16, 2025
8b8dbb3
Implements third part of leases, acquisition rolls now function appro…
savanik May 16, 2025
e2bbd4b
Quick fix for Lease names in acquisition list.
savanik May 16, 2025
8594271
Breaking Lease into Lease and LeaseOrder to separate procurement logi…
savanik May 17, 2025
3a8075a
Adding functionality for unleasing units to right-click context menu.
savanik May 17, 2025
b498eb0
Merge remote-tracking branch 'origin/Leases' into Leases
savanik May 17, 2025
b8fefd2
Disambiguating functions.
savanik May 17, 2025
4cb7394
Engineering LeaseOrder to work correctly, cleanly, and with less code.
savanik May 18, 2025
28b2f75
Merge branch 'master' into Leases
HammerGS May 18, 2025
4c17059
Corrected bugs, added documentation, added a unit test.
savanik May 18, 2025
c5fb01d
Merge remote-tracking branch 'origin/Leases' into Leases
savanik May 18, 2025
b83126a
Code cleanup and proper copyrights.
savanik May 18, 2025
52735b3
Removing unwanted file inclusions
savanik May 18, 2025
edeab25
Corrections across many components to correct errors and bugs.
savanik May 19, 2025
a8282dd
Fixing GM Shopping list procure/add functions.
savanik May 19, 2025
c070a91
Lease cleanup and some updates to function names for understandability
savanik May 20, 2025
6ba628d
More descriptive variables names in generateInstanceFromXML
savanik May 20, 2025
3331ad0
More descriptive variables names in generateInstanceFromXML in LeaseO…
savanik May 20, 2025
d4d8286
Merge remote-tracking branch 'upstream/master' into Leases
savanik May 31, 2025
17775db
Update to latest, cleanup of button handling
savanik May 31, 2025
56247dc
Rewrote all unit tests and updated function permissions
savanik May 31, 2025
2d8bf57
Updated LeaseTest with copyright notice
savanik May 31, 2025
dd42c36
Unit tests for more branches, and finance / accountants now handle bi…
savanik Jun 1, 2025
4bf4518
Updates from review, internationalization, leased units don't start m…
savanik Jun 1, 2025
3d23cd2
Magic number update
savanik Jun 1, 2025
edbaf90
Magic number update (#2)
savanik Jun 1, 2025
9f21d2e
Logger update.
savanik Jun 1, 2025
e254644
Updating Lease cost multiplier to divisor for accuracy, updated metho…
savanik Jun 2, 2025
4b5f34e
Merge remote-tracking branch 'upstream/master' into Leases
savanik Jun 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1281,6 +1281,8 @@ lblPayForHousingBox.tooltip=Each month, while not in transit, funds are deducted
# createGeneralOptionsPanel
lblUseLoanLimitsBox.text=Available Loans Based on Unit Reputation \u270E
lblUseLoanLimitsBox.tooltip=Put limits on interest, collateral, and length.
lblTrackLeasesBox.text=Leases Available for Large Craft
lblTrackLeasesBox.tooltip=Allow leases to be obtained for Dropships and Jumpships instead of purchasing outright
lblUsePercentageMaintenanceBox.text=Enable Percentage-Based Maintenance Costs \u270E
lblUsePercentageMaintenanceBox.tooltip=Maintenance costs based upon the value of the unit instead\
\ of the unit type. This makes maintenance costs more impactful.
Expand Down
8 changes: 8 additions & 0 deletions MekHQ/resources/mekhq/resources/Finances.properties
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ TransactionType.FINANCIAL_TERM_END_CARRYOVER.text=Financial Term End Carryover
TransactionType.FINANCIAL_TERM_END_CARRYOVER.toolTipText=Funds carried over from the previous financial term.
TransactionType.FINE.text=Fine
TransactionType.FINE.toolTipText=A financial transaction where the force pays or is paid a fine.
TransactionType.LEASE_PAYMENT.text=Lease Payment
TransactionType.LEASE_PAYMENT.toolTipText=A financial transaction where a lease was being paid for.
TransactionType.LOAN_PAYMENT.text=Loan Payment
TransactionType.LOAN_PAYMENT.toolTipText=A financial transaction where a loan was being paid for.
TransactionType.LOAN_PRINCIPAL.text=Loan Principal
Expand Down Expand Up @@ -83,6 +85,8 @@ TransactionType.UNIT_PURCHASE.text=Unit Purchase(s)
TransactionType.UNIT_PURCHASE.toolTipText=A financial transaction where a unit was or multiple units were purchased.
TransactionType.UNIT_SALE.text=Unit Sale(s)
TransactionType.UNIT_SALE.toolTipText=A financial transaction where a unit was or multiple units were sold.
TransactionType.UNIT_CANCEL_LEASE.text=Cancel Unit Lease
TransactionType.UNIT_CANCEL_LEASE.toolTipText=A financial transaction where a unit's lease was finalized.
TransactionType.BONUS_EXCHANGE.text=Bonus Exchange
TransactionType.BONUS_EXCHANGE.toolTipText=A financial transaction where Bonus Parts were exchanged for money.
TransactionType.WEALTH.text=Reinvestment
Expand All @@ -109,6 +113,10 @@ Loan.title=loan payment to %s
Loan.text=Your account has been debited for %s in loan payment to %s
Loan.insufficient.report=<b>You have insufficient funds to service the debt on loan %s!</b>%s Funds required: %s
Loan.paid.report=You have fully paid off loan %s
# Leases
LeaseCosts.title=Lease payments
LeaseCosts.text=Your account has been debited for %s in lease payments.
LeaseCosts.insufficient.report=<b>You have insufficient funds to service your leases!</b> Funds Required: %s
# File Export
FinanceExport.format=%s financial transactions written to file.
## Unsorted General Finances
Expand Down
1 change: 1 addition & 0 deletions MekHQ/resources/mekhq/resources/UnitViewPanel.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ lblTonnage1.text=<html><nobr><b>Tonnage:</b></nobr></html>
lblBV1.text=<html><nobr><b>BV:</b></nobr></html>
lblCost1.text=<html><nobr><b>Cost:</b></nobr></html>
lblQuirk1.text=<html><nobr><b>Quirks:</b></nobr></html>
lblLease.text=(Monthly Lease)
54 changes: 28 additions & 26 deletions MekHQ/src/mekhq/campaign/Campaign.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@
import static mekhq.campaign.CampaignOptions.S_TECH;
import static mekhq.campaign.CampaignOptions.TRANSIT_UNIT_MONTH;
import static mekhq.campaign.CampaignOptions.TRANSIT_UNIT_WEEK;
import static mekhq.campaign.force.CombatTeam.getStandardForceSize;
import static mekhq.campaign.force.CombatTeam.recalculateCombatTeams;
import static mekhq.campaign.force.Force.FORCE_NONE;
import static mekhq.campaign.force.Force.FORCE_ORIGIN;
Expand Down Expand Up @@ -1795,6 +1794,10 @@ public Unit addNewUnit(Entity en, boolean allowNewPilots, int days) {
* @throws IllegalArgumentException If the quality is not within the valid range (0-5)
*/
public Unit addNewUnit(Entity en, boolean allowNewPilots, int days, PartQuality quality) {
return addNewUnit(en, allowNewPilots, days, quality, true);
}

public Unit addNewUnit(Entity en, boolean allowNewPilots, int days, PartQuality quality, boolean startMothballed) {
Unit unit = new Unit(en, this);
unit.setMaintenanceMultiplier(getCampaignOptions().getDefaultMaintenanceTime());
getHangar().addUnit(unit);
Expand All @@ -1815,7 +1818,7 @@ public Unit addNewUnit(Entity en, boolean allowNewPilots, int days, PartQuality

unit.setDaysToArrival(days);

if (days > 0) {
if (days > 0 && startMothballed) {
unit.setMothballed(campaignOptions.isMothballUnitMarketDeliveries());
}

Expand Down Expand Up @@ -2167,8 +2170,7 @@ public boolean recruitPerson(Person person, PrisonerStatus prisonerStatus, boole
personnel.put(person.getId(), person);

if (getCampaignOptions().isUseSimulatedRelationships()) {
if ((prisonerStatus.isFree()) &&
(!person.getOriginFaction().isClan()) &&
if ((prisonerStatus.isFree()) && (!person.getOriginFaction().isClan()) &&
// We don't simulate for civilians, otherwise MekHQ will try to simulate the entire
// relationship history of everyone the recruit has ever married or birthed. This will
// cause a StackOverflow. -- Illiani, May/21/2025
Expand Down Expand Up @@ -7696,29 +7698,29 @@ public TargetRoll getTargetForAcquisition(final IAcquisitionWork acquisition, fi
}

public PlanetaryConditions getCurrentPlanetaryConditions(Scenario scenario) {
PlanetaryConditions planetaryConditions = new PlanetaryConditions();
if (scenario instanceof AtBScenario atBScenario) {
if (getCampaignOptions().isUseLightConditions()) {
planetaryConditions.setLight(atBScenario.getLight());
}
if (getCampaignOptions().isUseWeatherConditions()) {
planetaryConditions.setWeather(atBScenario.getWeather());
planetaryConditions.setWind(atBScenario.getWind());
planetaryConditions.setFog(atBScenario.getFog());
planetaryConditions.setEMI(atBScenario.getEMI());
planetaryConditions.setBlowingSand(atBScenario.getBlowingSand());
planetaryConditions.setTemperature(atBScenario.getModifiedTemperature());
PlanetaryConditions planetaryConditions = new PlanetaryConditions();
if (scenario instanceof AtBScenario atBScenario) {
if (getCampaignOptions().isUseLightConditions()) {
planetaryConditions.setLight(atBScenario.getLight());
}
if (getCampaignOptions().isUseWeatherConditions()) {
planetaryConditions.setWeather(atBScenario.getWeather());
planetaryConditions.setWind(atBScenario.getWind());
planetaryConditions.setFog(atBScenario.getFog());
planetaryConditions.setEMI(atBScenario.getEMI());
planetaryConditions.setBlowingSand(atBScenario.getBlowingSand());
planetaryConditions.setTemperature(atBScenario.getModifiedTemperature());

}
if (getCampaignOptions().isUsePlanetaryConditions()) {
planetaryConditions.setAtmosphere(atBScenario.getAtmosphere());
planetaryConditions.setGravity(atBScenario.getGravity());
}
} else {
planetaryConditions = scenario.createPlanetaryConditions();
}
if (getCampaignOptions().isUsePlanetaryConditions()) {
planetaryConditions.setAtmosphere(atBScenario.getAtmosphere());
planetaryConditions.setGravity(atBScenario.getGravity());
}
} else {
planetaryConditions = scenario.createPlanetaryConditions();
}

return planetaryConditions;
return planetaryConditions;

}

Expand Down Expand Up @@ -8851,6 +8853,7 @@ public int calculatePartTransitTime(int availability) {

return Math.toIntExact(ChronoUnit.DAYS.between(getLocalDate(), arrivalDate));
}

/**
* Calculates the transit time for the arrival of parts or supplies based on the availability of the item, a random
* roll, and campaign-specific transit time settings.
Expand Down Expand Up @@ -9957,8 +9960,7 @@ public Planet getNewCampaignStartingPlanet() {
if (faction.getShortName().equalsIgnoreCase("PIR")) {
List<Faction> pirateFactions = new ArrayList<>();
for (Faction activeFaction : factions.getActiveFactions(currentDay)) {
if (activeFaction.isPirate() &&
!activeFaction.getShortName().equalsIgnoreCase("PIR")) {
if (activeFaction.isPirate() && !activeFaction.getShortName().equalsIgnoreCase("PIR")) {
pirateFactions.add(activeFaction);
}
}
Expand Down
21 changes: 17 additions & 4 deletions MekHQ/src/mekhq/campaign/CampaignOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -468,6 +468,7 @@ public static String getTechLevelName(final int techLevel) {
private boolean payForOverhead;
private boolean payForMaintain;
private boolean payForTransport;
private boolean trackLeases;
private boolean sellUnits;
private boolean sellParts;
private boolean payForRecruitment;
Expand Down Expand Up @@ -1088,6 +1089,7 @@ public CampaignOptions() {
payForOverhead = false;
payForMaintain = false;
payForTransport = false;
trackLeases = false;
sellUnits = false;
sellParts = false;
payForRecruitment = false;
Expand Down Expand Up @@ -3294,6 +3296,14 @@ public void setPayForTransport(final boolean payForTransport) {
this.payForTransport = payForTransport;
}

public boolean isTrackLeases() {
return trackLeases;
}

public void setTrackLeases(final boolean trackLeases) {
this.trackLeases = trackLeases;
}

public boolean isSellUnits() {
return sellUnits;
}
Expand Down Expand Up @@ -5317,6 +5327,7 @@ public void writeToXml(final PrintWriter pw, int indent) {
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "payForOverhead", payForOverhead);
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "payForMaintain", payForMaintain);
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "payForTransport", payForTransport);
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "trackLeases", trackLeases);
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "sellUnits", sellUnits);
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "sellParts", sellParts);
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "payForRecruitment", payForRecruitment);
Expand Down Expand Up @@ -6313,6 +6324,8 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node parentNod, Ver
campaignOptions.payForMaintain = Boolean.parseBoolean(nodeContents);
} else if (nodeName.equalsIgnoreCase("payForTransport")) {
campaignOptions.payForTransport = Boolean.parseBoolean(nodeContents);
} else if (nodeName.equalsIgnoreCase("trackLeases")) {
campaignOptions.trackLeases = Boolean.parseBoolean(nodeContents);
} else if (nodeName.equalsIgnoreCase("sellUnits")) {
campaignOptions.sellUnits = Boolean.parseBoolean(nodeContents);
} else if (nodeName.equalsIgnoreCase("sellParts")) {
Expand Down Expand Up @@ -6926,19 +6939,19 @@ public boolean isTrackFactionStanding() {
public void setTrackFactionStanding(boolean trackFactionStanding) {
this.trackFactionStanding = trackFactionStanding;
}

public boolean isAutoGenerateOpForCallsigns() {
return autoGenerateOpForCallsigns;
}

public void setAutoGenerateOpForCallsigns(boolean autoGenerateOpForCallsigns) {
this.autoGenerateOpForCallsigns = autoGenerateOpForCallsigns;
}

public SkillLevel getMinimumCallsignSkillLevel() {
return minimumCallsignSkillLevel;
}

public void setMinimumCallsignSkillLevel(SkillLevel skillLevel) {
this.minimumCallsignSkillLevel = skillLevel;
}
Expand Down
Loading
Loading