Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Additional Education Module Bug Fixes #4114

Merged
merged 6 commits into from
May 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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 @@ -445,6 +445,8 @@ chkEduEnableAutoAwardsIntegration.toolTip=Enables the automatic tracking of awar

lblMaximumJumpCount.text=Maximum Jump Radius
lblMaximumJumpCount.toolTip=The maximum distance when searching for academies.
chkUseTruebornTravelException.text=Enable Trueborn Travel
chkUseTruebornTravelException.toolTip=Travel to trueborn creches or sibkos is reduced to 2 days, to simulate traveling straight from the Iron Womb facilities, or creche.
chkShowIneligibleAcademies.text=Show Ineligible Academies
chkShowIneligibleAcademies.toolTip=Displays academies a character is ineligible to attend.

Expand All @@ -454,7 +456,7 @@ chkEnableLocalAcademies.toolTip=Allows personnel to enroll in local, planet-side
chkEnablePrestigiousAcademies.text=Enable Prestigious Academies
chkEnablePrestigiousAcademies.toolTip=Allows personnel to enroll in named, canonical, academies.
chkEnableClanEducation.text=Enable Clan Education
chkEnableClanEducation.toolTip=Allows personnel to enroll in Cr�ches, Sibkos, and Re-Education Camps.
chkEnableClanEducation.toolTip=Allows personnel to enroll in Creches, Sibkos, and Re-Education Camps.

showIneligible.title=Eligibility Criteria
chkShowAgeConflict.text=Too Old/Young
Expand Down
2 changes: 1 addition & 1 deletion MekHQ/resources/mekhq/resources/Education.properties
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ graduatedWarriorTwoKills.text=fought during their Trial of Position and scored t
graduatedWarriorTwoKillsLog.text=two kills
graduatedWarriorThreeKills.text=fought during their Trial of Position and scored three kills. Tomorrow they will begin their journey to the unit.
graduatedWarriorThreeKillsLog.text=three kills
washout.text=has washed out of the %s Caste
washout.text=has washed out of the %s Caste%s
washoutLabor.text=, and has no further place in Clan society.
graduatedWarrior.text=Warrior
graduatedScientist.text=Science
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 @@ -248,7 +248,7 @@ public static String getTransitUnitName(final int unit) {
private double salarySpecialistInfantryMultiplier;
private Map<SkillLevel, Double> salaryXPMultipliers;
private Money[] roleBaseSalaries;

// Awards
private AwardBonus awardBonusStyle;
private boolean enableAutoAwards;
Expand Down Expand Up @@ -337,6 +337,7 @@ public static String getTransitUnitName(final int unit) {
private boolean useEducationModule;
private boolean eduEnableAutoAwardsIntegration;
private Integer maximumJumpCount;
private boolean useTruebornTravelException;
private boolean enableLocalAcademies;
private boolean enablePrestigiousAcademies;
private boolean enableClanEducation;
Expand Down Expand Up @@ -740,7 +741,7 @@ public CampaignOptions() {
setRoleBaseSalary(PersonnelRole.ADMINISTRATOR_HR, 500);
setRoleBaseSalary(PersonnelRole.DEPENDENT, 0);
setRoleBaseSalary(PersonnelRole.NONE, 0);

// Awards
setAwardBonusStyle(AwardBonus.BOTH);
setEnableAutoAwards(true);
Expand Down Expand Up @@ -846,6 +847,7 @@ public CampaignOptions() {
setUseEducationModule(true);
setEduEnableAutoAwardsIntegration(true);
setMaximumJumpCount(5);
setUseTruebornTravelException(true);
setEnableLocalAcademies(true);
setEnablePrestigiousAcademies(true);
setEnableClanEducation(true);
Expand Down Expand Up @@ -2298,6 +2300,14 @@ public void setMaximumJumpCount(Integer maximumJumpCount) {
this.maximumJumpCount = maximumJumpCount;
}

public boolean isUseTruebornTravelException() {
return useTruebornTravelException;
}

public void setUseTruebornTravelException(boolean useTruebornTravelException) {
this.useTruebornTravelException = useTruebornTravelException;
}

public boolean isEnableLocalAcademies() {
return enableLocalAcademies;
}
Expand Down Expand Up @@ -4160,7 +4170,7 @@ public void writeToXml(final PrintWriter pw, int indent) {
MHQXMLUtility.writeSimpleXMLCloseTag(pw, --indent, "salaryXPMultipliers");
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "salaryTypeBase", Utilities.printMoneyArray(getRoleBaseSalaries()));
//endregion Salary

//region Awards
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "awardBonusStyle", getAwardBonusStyle().name());
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "enableAutoAwards", isEnableAutoAwards());
Expand Down Expand Up @@ -4264,6 +4274,7 @@ public void writeToXml(final PrintWriter pw, int indent) {
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "useEducationModule", isUseEducationModule());
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "eduEnableAutoAwardsIntegration", isEduEnableAutoAwardsIntegration());
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "maximumJumpCount", getMaximumJumpCount());
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "useTruebornTravelException", isUseTruebornTravelException());
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "enableLocalAcademies", isEnableLocalAcademies());
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "enablePrestigiousAcademies", isEnablePrestigiousAcademies());
MHQXMLUtility.writeSimpleXMLTag(pw, indent, "enableClanEducation", isEnableClanEducation());
Expand Down Expand Up @@ -4809,7 +4820,7 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node wn, Version ve
retVal.setRoleBaseSalaries(Utilities.readMoneyArray(wn2, retVal.getRoleBaseSalaries().length));
}
//endregion Salary

//region Awards
} else if (wn2.getNodeName().equalsIgnoreCase("awardBonusStyle")) {
retVal.setAwardBonusStyle(AwardBonus.valueOf(wn2.getTextContent().trim()));
Expand Down Expand Up @@ -5014,6 +5025,8 @@ public static CampaignOptions generateCampaignOptionsFromXml(Node wn, Version ve
retVal.setEduEnableAutoAwardsIntegration(Boolean.parseBoolean(wn2.getTextContent().trim()));
} else if (wn2.getNodeName().equalsIgnoreCase("maximumJumpCount")) {
retVal.setMaximumJumpCount(Integer.parseInt(wn2.getTextContent().trim()));
} else if (wn2.getNodeName().equalsIgnoreCase("useTruebornTravelException")) {
retVal.setUseTruebornTravelException(Boolean.parseBoolean(wn2.getTextContent().trim()));
} else if (wn2.getNodeName().equalsIgnoreCase("enableLocalAcademies")) {
retVal.setEnableLocalAcademies(Boolean.parseBoolean(wn2.getTextContent().trim()));
} else if (wn2.getNodeName().equalsIgnoreCase("enablePrestigiousAcademies")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import mekhq.campaign.log.ServiceLogger;
import mekhq.campaign.personnel.Person;
import mekhq.campaign.personnel.enums.PersonnelStatus;
import mekhq.campaign.universe.PlanetarySystem;
import org.apache.logging.log4j.LogManager;

import java.time.DayOfWeek;
Expand Down Expand Up @@ -99,20 +98,15 @@ public static void enrollPerson(Campaign campaign, Person person, Academy academ
person.setEduAcademyNameInSet(academy.getName());
person.setEduDaysOfEducation(academy.getDurationDays());
person.setEduAcademyFaction(faction);
person.setEduCourseIndex(courseIndex);

if (academy.isLocal()) {
person.setEduDaysOfTravelToAcademy(2);
person.setEduAcademySystem(campaign.getCurrentSystem().getId());
} else if (academy.isTrueborn()) {
person.setEduDaysOfTravelToAcademy(2);

PlanetarySystem location = campaign.getFaction().getStartingPlanet(campaign, campaign.getLocalDate());

try {
person.setEduAcademySystem(location.getId());
} catch (Exception e) {
person.setEduAcademySystem("Strana Mechty");
}
person.setEduAcademySystem(campaign.getSystemByName(campus).getId());
} else {
person.setEduDaysOfTravelToAcademy(campaign.getSimplifiedTravelTime(campaign.getSystemById(campus)));
person.setEduAcademySystem(campaign.getSystemById(campus).getName(campaign.getLocalDate()));
Expand Down Expand Up @@ -842,7 +836,8 @@ private static void processClanWashout(Campaign campaign, Person person, Integer
ServiceLogger.eduClanWashout(person, campaign.getLocalDate(), resources.getString("graduatedScientist.text"));

campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("washout.text"),
resources.getString("graduatedScientist.text") + resources.getString("graduatedWarriorLabor.text")));
resources.getString("graduatedScientist.text"),
resources.getString("graduatedWarriorLabor.text")));
person.setEduCourseIndex(10);
person.setEduAcademyName(generateClanEducationCode(campaign, person, 10, resources));

Expand All @@ -851,7 +846,8 @@ private static void processClanWashout(Campaign campaign, Person person, Integer
ServiceLogger.eduClanWashout(person, campaign.getLocalDate(), resources.getString("graduatedMerchant.text"));

campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("washout.text"),
resources.getString("graduatedMerchant.text") + resources.getString("graduatedWarriorLabor.text")));
resources.getString("graduatedMerchant.text"),
resources.getString("graduatedWarriorLabor.text")));
person.setEduCourseIndex(10);
person.setEduAcademyName(generateClanEducationCode(campaign, person, 10, resources));

Expand All @@ -860,7 +856,8 @@ private static void processClanWashout(Campaign campaign, Person person, Integer
ServiceLogger.eduClanWashout(person, campaign.getLocalDate(), resources.getString("graduatedTechnician.text"));

campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("washout.text"),
resources.getString("graduatedTechnician.text") + resources.getString("graduatedWarriorLabor.text")));
resources.getString("graduatedTechnician.text"),
resources.getString("graduatedWarriorLabor.text")));
person.setEduCourseIndex(10);
person.setEduAcademyName(generateClanEducationCode(campaign, person, 10, resources));

Expand All @@ -869,7 +866,8 @@ private static void processClanWashout(Campaign campaign, Person person, Integer
ServiceLogger.eduClanWashout(person, campaign.getLocalDate(), resources.getString("graduatedLabor.text"));

campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("washout.text"),
resources.getString("graduatedLabor.text") + resources.getString("washoutLabor.text")));
resources.getString("graduatedLabor.text"),
resources.getString("washoutLabor.text")));

person.changeStatus(campaign, campaign.getLocalDate(), PersonnelStatus.MISSING);
person.setEduDaysOfEducation(0);
Expand Down Expand Up @@ -966,7 +964,8 @@ private static void processWarriorCasteWashout(Campaign campaign, Person person,

if (roll < fallbackScientist) {
campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("washout.text"),
resources.getString("graduatedWarrior.text") + resources.getString("graduatedWarriorScientist.text")));
resources.getString("graduatedWarrior.text"),
resources.getString("graduatedWarriorScientist.text")));
person.setEduCourseIndex(7);
person.setEduAcademyName(generateClanEducationCode(campaign, person, 7, resources));

Expand All @@ -975,7 +974,8 @@ private static void processWarriorCasteWashout(Campaign campaign, Person person,

if (roll < fallbackMerchant) {
campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("washout.text"),
resources.getString("graduatedWarrior.text") + resources.getString("graduatedWarriorMerchant.text")));
resources.getString("graduatedWarrior.text"),
resources.getString("graduatedWarriorMerchant.text")));
person.setEduCourseIndex(8);
person.setEduAcademyName(generateClanEducationCode(campaign, person, 8, resources));

Expand All @@ -984,7 +984,8 @@ private static void processWarriorCasteWashout(Campaign campaign, Person person,

if (roll < fallbackTechnician) {
campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("washout.text"),
resources.getString("graduatedWarrior.text") + resources.getString("graduatedWarriorTechnician.text")));
resources.getString("graduatedWarrior.text"),
resources.getString("graduatedWarriorTechnician.text")));
person.setEduCourseIndex(9);
person.setEduAcademyName(generateClanEducationCode(campaign, person, 9, resources));

Expand All @@ -993,7 +994,8 @@ private static void processWarriorCasteWashout(Campaign campaign, Person person,

// Labor
campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("washout.text"),
resources.getString("graduatedWarrior.text") + resources.getString("graduatedWarriorLabor.text")));
resources.getString("graduatedWarrior.text"),
resources.getString("graduatedWarriorLabor.text")));
person.setEduCourseIndex(10);
person.setEduAcademyName(generateClanEducationCode(campaign, person, 10, resources));
}
Expand Down Expand Up @@ -1187,21 +1189,29 @@ private static void graduateClanSibko(Campaign campaign, Person person, Academy
// [0]MechWarrior, [1]ProtoMech, [2]AreoSpace, [3]Space, [4]BA, [5]CI, [6]Vehicle
if (person.getEduCourseIndex() <= 6) {
graduateWarriorCaste(campaign, person, academy, resources);

return;
}

// [7]Scientist Caste
if (person.getEduCourseIndex() == 7) {
graduateScientistCaste(campaign, person, academy, resources);

return;
}

// [8]Merchant Caste
if (person.getEduCourseIndex() == 8) {
graduateMerchantCaste(campaign, person, academy, resources);

return;
}

// [9]Technician Caste
if (person.getEduCourseIndex() == 9) {
graduateTechnicianCaste(campaign, person, academy, resources);

return;
}

// [10]Laborer Caste
Expand Down Expand Up @@ -1233,6 +1243,7 @@ private static void graduateWarriorCaste(Campaign campaign, Person person, Acade
// process washout into fallback Caste.
if (graduationRoll < 50) {
ServiceLogger.eduClanWarriorFailed(person, campaign.getLocalDate());
campaign.addReport(person.getHyperlinkedName() + ' ' + resources.getString("graduatedWarriorFailed.text"));

processClanWashout(campaign, person, person.getEduCourseIndex(), resources);
graduateClanSibko(campaign, person, academy, resources);
Expand Down Expand Up @@ -1305,6 +1316,7 @@ private static void graduateReeducationCamp(Campaign campaign, Person person, Ac
graduateLaborCaste(campaign, person, academy, resources);
}
}

/**
* Graduates a person from the labor caste.
* Updates the person's education level and adds a report to the campaign.
Expand Down
4 changes: 2 additions & 2 deletions MekHQ/src/mekhq/gui/adapter/PersonnelTableMouseAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -2580,14 +2580,14 @@ private void buildEducationMenus(Campaign campaign, Person person, Academy acade

// Trueborn Clan Academies get a free pass, as applicants don't need to travel from the unit,
// they're just popped out of an Iron Womb
if (academy.isTrueborn()) {
if ((academy.isTrueborn()) && (campaign.getCampaignOptions().isUseTruebornTravelException())) {
JMenu academyOption = new JMenu(academy.getName());

educationJMenuAdder(academy, clanMenu, militaryMenu, civilianMenu, academyOption);

buildEducationSubMenus(campaign, academy, person, academyOption, campus, campaign.getFaction().getShortName());
} else {
if ((campaign.getSimplifiedTravelTime(campaign.getSystemById(campus)) / 7) <= campaign.getCampaignOptions().getMaximumJumpCount()) {
if ((campaign.getSimplifiedTravelTime(campaign.getSystemById(campus)) / 7) > campaign.getCampaignOptions().getMaximumJumpCount()) {
if ((showIneligibleAcademies) && (campaign.getCampaignOptions().isEnableShowRangeConflict())) {
JMenuItem academyOption = new JMenuItem("<html>" + academy.getName() + resources.getString("eduRangeConflict.text"));
educationJMenuItemAdder(academy, clanMenu, militaryMenu, civilianMenu, academyOption);
Expand Down
Loading
Loading