From 554c44fd79ce83ba24c076d1732b54af5b341a82 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Mon, 27 May 2024 12:41:53 -0500 Subject: [PATCH 1/7] refactor: fixed string formatting and variable types in EducationController - Changed 'location' variable type from String to PlanetarySystem - Updated string formatting for event reports in multiple methods - Updated placeholders in Education.properties for proper string formatting use --- .../mekhq/resources/Education.properties | 10 ++++---- .../education/EducationController.java | 24 +++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Education.properties b/MekHQ/resources/mekhq/resources/Education.properties index 6567f69413..2241bc9118 100644 --- a/MekHQ/resources/mekhq/resources/Education.properties +++ b/MekHQ/resources/mekhq/resources/Education.properties @@ -14,7 +14,7 @@ facultySkill.text=Faculty Skill: #### Payment insufficientFunds.text=Not enough funds to cover %s's tuition. -payment.text=Tuition fee for 0 +payment.text=Tuition fee for %s #### Name Conjoiner conjoinerOf.text=of @@ -51,7 +51,7 @@ returningFromSchool.text=has begun their return journey, which will take approxi creche.text=has left their Crèche and is awaiting Sibko assignment. #### Events -eventAcademyMoved.text=has been moved to 0. +eventAcademyMoved.text=has been moved to %s. eventDestruction.text='s academy has been destroyed. Luckily, they survived the attack. Tomorrow they will begin their journey back to the unit. eventDestructionKilled.text='s academy has been destroyed. Sadly, they have been missing ever since the attack. eventClosure.text='s academy has been suddenly shutdown. Booted off campus, they will begin their journey back to the unit tomorrow. @@ -64,11 +64,11 @@ dropOut.text=has dropped out of their education or training. Tomorrow they will dropOutRejected.text=wanted to drop out of their education or training, but was convinced to stick it out. graduatedFailed.text=has failed to graduate. Tomorrow they will begin their journey back to the unit. graduatedBarely.text=has barely graduated. Tomorrow they will begin their journey back to the unit. -graduatedClassNeeded.text=still needs to complete one or more classes, and is unable to graduate. 0 days have been added to their education. +graduatedClassNeeded.text=still needs to complete one or more classes, and is unable to graduate. %s days have been added to their education. graduated.text=has attended their graduation ceremony %s. Tomorrow they will begin their journey back to the unit. -graduatedHonors.text=has attended their graduation ceremony%s. They have graduated with honors. Tomorrow they will begin their journey back to the unit. +graduatedHonors.text=has attended their graduation ceremony %s. They have graduated with honors. Tomorrow they will begin their journey back to the unit. graduatedHonorsLog.text=with honors -graduatedTop.text=has attended their graduation ceremony0. They have graduated top of their class. Tomorrow they will begin their journey back to the unit. +graduatedTop.text=has attended their graduation ceremony %s. They have graduated top of their class. Tomorrow they will begin their journey back to the unit. graduatedTopLog.text=top of their class graduatedMasters.text=has completed their Master's Degree. graduatedDoctorate.text=has completed their Doctorate. diff --git a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java index 7894bd520c..897d43c523 100644 --- a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java +++ b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java @@ -599,15 +599,16 @@ private static void processNewWeekChecks(Campaign campaign, Academy academy, Per // has the academy been moved alongside the faction capital? if ((academy.isClan()) && (!academy.isLocal())) { - String location; + PlanetarySystem location; try { - location = campaign.getFaction().getStartingPlanet(campaign, campaign.getLocalDate()).getId(); + location = campaign.getFaction().getStartingPlanet(campaign, campaign.getLocalDate()); - if (!person.getEduAcademySystem().equalsIgnoreCase(location)) { - person.setEduAcademySystem(location); + if (!person.getEduAcademySystem().equalsIgnoreCase(location.getId())) { + person.setEduAcademySystem(location.getId()); - campaign.addReport(person.getHyperlinkedName() + ' ' + resources.getString("eventAcademyMoved.text")); + campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("eventAcademyMoved.text"), + location.getName(campaign.getLocalDate()))); } } catch (Exception e) { // it'll only throw an exception if there isn't a starting planet for the faction, @@ -1024,8 +1025,7 @@ private static void graduateAdult(Campaign campaign, Person person, Academy acad // class resits required if (graduationRoll < 20) { roll = Compute.d6(3); - campaign.addReport(person.getHyperlinkedName() + ' ' + resources.getString("graduatedClassNeeded.text") - .replace("0", String.valueOf(roll))); + campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("graduatedClassNeeded.text"), roll)); person.setEduDaysOfEducation(roll); @@ -1034,8 +1034,8 @@ private static void graduateAdult(Campaign campaign, Person person, Academy acad if (graduationRoll == 99) { if (Compute.d6(1) > 5) { - campaign.addReport(person.getHyperlinkedName() + ' ' + resources.getString("graduatedTop.text") - .replace("0", ' ' + resources.getString(graduationEventPicker()))); + campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("graduatedTop.text"), + ' ' + resources.getString(graduationEventPicker()))); } else { campaign.addReport(person.getHyperlinkedName() + ' ' + resources.getString("graduatedTop.text")); } @@ -1084,8 +1084,7 @@ private static void graduateAdult(Campaign campaign, Person person, Academy acad campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("graduated.text"), ' ' + resources.getString(graduationEventPicker()))); } else { - campaign.addReport(person.getHyperlinkedName() + ' ' + resources.getString("graduated.text") - .replace("0", "")); + campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("graduated.text"), "")); } ServiceLogger.eduGraduated(person, campaign.getLocalDate(), person.getEduAcademyName()); @@ -1144,8 +1143,7 @@ private static void graduateChild(Campaign campaign, Person person, Academy acad } // default graduation - campaign.addReport(person.getHyperlinkedName() + ' ' + resources.getString("graduated.text") - .replace("0", "")); + campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("graduated.text"), "")); ServiceLogger.eduGraduated(person, campaign.getLocalDate(), person.getEduAcademyName()); From a1babd8599be40a9046f9dd2f0af007c47c65d0c Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Mon, 27 May 2024 13:00:45 -0500 Subject: [PATCH 2/7] feat(Academy.java): Converted multiple imports to wildcard imports and applied faction discount correctly --- .../campaign/personnel/education/Academy.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/personnel/education/Academy.java b/MekHQ/src/mekhq/campaign/personnel/education/Academy.java index 4193b56060..2f8c8e9dd4 100644 --- a/MekHQ/src/mekhq/campaign/personnel/education/Academy.java +++ b/MekHQ/src/mekhq/campaign/personnel/education/Academy.java @@ -30,10 +30,7 @@ import mekhq.campaign.universe.PlanetarySystem; import mekhq.campaign.universe.RandomFactionGenerator; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.ResourceBundle; +import java.util.*; /** * The Academy class represents an academy with various properties and methods. @@ -740,7 +737,15 @@ public Integer getTuitionAdjusted(Person person) { * @return the faction discount as a double value, between 0.00 and 1.00 */ public Double getFactionDiscountAdjusted(Campaign campaign, Person person) { - if (locationSystems.stream() + List locations; + + if (isLocal) { + locations = Collections.singletonList(campaign.getCurrentSystem().getId()); + } else { + locations = locationSystems; + } + + if (locations.stream() .flatMap(campus -> campaign.getSystemById(campus) .getFactions(campaign.getLocalDate()) .stream()) From 0b19863f0f57e3cbdb08539b5d96f3dd63efb255 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Mon, 27 May 2024 13:20:10 -0500 Subject: [PATCH 3/7] fix: corrected range for randomInt in EducationController --- .../mekhq/campaign/personnel/education/EducationController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java index 897d43c523..3d519b3852 100644 --- a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java +++ b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java @@ -1612,7 +1612,7 @@ private static void addBonus(Campaign campaign, Person person, Academy academy, .collect(Collectors.toList()); for (int i = 0; i < bonusCount; i++) { - int roll = Compute.randomInt(curriculum.size() - 1); + int roll = Compute.randomInt(curriculum.size()); try { String skillParsed = Academy.skillParser(curriculum.get(roll)); From c776f6c688f22d97a5bab4ce88ec8a36c1544c69 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Mon, 27 May 2024 13:26:24 -0500 Subject: [PATCH 4/7] fix: removed extra space in graduation message text in Education.properties --- MekHQ/resources/mekhq/resources/Education.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/Education.properties b/MekHQ/resources/mekhq/resources/Education.properties index 2241bc9118..5de4ec5a5f 100644 --- a/MekHQ/resources/mekhq/resources/Education.properties +++ b/MekHQ/resources/mekhq/resources/Education.properties @@ -65,10 +65,10 @@ dropOutRejected.text=wanted to drop out of their education or training, but was graduatedFailed.text=has failed to graduate. Tomorrow they will begin their journey back to the unit. graduatedBarely.text=has barely graduated. Tomorrow they will begin their journey back to the unit. graduatedClassNeeded.text=still needs to complete one or more classes, and is unable to graduate. %s days have been added to their education. -graduated.text=has attended their graduation ceremony %s. Tomorrow they will begin their journey back to the unit. -graduatedHonors.text=has attended their graduation ceremony %s. They have graduated with honors. Tomorrow they will begin their journey back to the unit. +graduated.text=has attended their graduation ceremony%s. Tomorrow they will begin their journey back to the unit. +graduatedHonors.text=has attended their graduation ceremony%s. They have graduated with honors. Tomorrow they will begin their journey back to the unit. graduatedHonorsLog.text=with honors -graduatedTop.text=has attended their graduation ceremony %s. They have graduated top of their class. Tomorrow they will begin their journey back to the unit. +graduatedTop.text=has attended their graduation ceremony%s. They have graduated top of their class. Tomorrow they will begin their journey back to the unit. graduatedTopLog.text=top of their class graduatedMasters.text=has completed their Master's Degree. graduatedDoctorate.text=has completed their Doctorate. From 16df74a23c3677400631efbfa2d1ffc58226d443 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Mon, 27 May 2024 14:17:42 -0500 Subject: [PATCH 5/7] refactor: streamlined processJourneyHome and beginJourneyHome functions in EducationController - Removed unnecessary parameters from processJourneyHome function - Simplified travel time computation in beginJourneyHome - Updated representation of travel duration in PersonViewPanel.properties and PersonViewPanel.java --- .../resources/PersonViewPanel.properties | 1 + .../education/EducationController.java | 81 +++++++------------ MekHQ/src/mekhq/gui/view/PersonViewPanel.java | 5 +- 3 files changed, 32 insertions(+), 55 deletions(-) diff --git a/MekHQ/resources/mekhq/resources/PersonViewPanel.properties b/MekHQ/resources/mekhq/resources/PersonViewPanel.properties index 2e59f81b96..f9eedbb8cb 100644 --- a/MekHQ/resources/mekhq/resources/PersonViewPanel.properties +++ b/MekHQ/resources/mekhq/resources/PersonViewPanel.properties @@ -23,6 +23,7 @@ lblInit1.text=Init Bonus:; lblTough1.text=Toughness:; lblEducationLevel1.text=Education Level:; lblEducationDurationDays.text=days +lblEducationTravelDuration.text=%s/%s days (travelling from %s) lblEducationDurationAge.text=years old lblEducationTravelTo1.text=Journey to Campus:; lblEducationDays1.text=Ongoing Education:; diff --git a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java index 3d519b3852..f3f2f9341a 100644 --- a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java +++ b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java @@ -329,7 +329,7 @@ public static void processNewDay(Campaign campaign) { } // if we reach this point it means Person is already in transit, so we continue their journey - processJourneyHome(campaign, person, daysOfEducation, daysOfTravelFrom); + processJourneyHome(campaign, person, daysOfTravelFrom); } } @@ -465,48 +465,33 @@ public static void completeEducation(Campaign campaign, Person person) { * previous travel days */ private static Integer beginJourneyHome(Campaign campaign, Person person, Academy academy, Integer daysOfEducation, ResourceBundle resources) { - int daysOfTravelFrom = person.getEduDaysOfTravelFromAcademy(); + int travelTime = 0; - int travelTime; - - if ((daysOfEducation == 0) && (daysOfTravelFrom == 0)) { + if ((daysOfEducation == 0) && (person.getEduDaysOfTravelFromAcademy() == 0)) { if ((academy.isClan()) && (academy.isPrepSchool()) && (person.getAge(campaign.getLocalDate()) < 10)) { // we do this to deliberately create an infinite loop, where the player is pestered // daily until the student is assigned to a Sibko - travelTime = 0; + person.setEduDaysOfTravelFromAcademy(travelTime); + + campaign.addReport(person.getHyperlinkedName() + ' ' + resources.getString("creche.text")); + + return null; } else if ((academy.isClan()) && (!academy.isLocal())) { try { - travelTime = campaign.getSimplifiedTravelTime(campaign.getFaction().getStartingPlanet(campaign, campaign.getLocalDate())); + travelTime = Math.max(2, campaign.getSimplifiedTravelTime(campaign.getFaction().getStartingPlanet(campaign, campaign.getLocalDate()))); } catch (Exception e) { - travelTime = campaign.getSimplifiedTravelTime(campaign.getSystemById("Strana Mechty")); - } - - // We use a minimum of 2 days travel to avoid awkward grammar in the report. - // This can be hand waved as being the time it takes for Person to get from campus and - // recover from their education. - if (travelTime < 2) { - travelTime = 2; + travelTime = Math.max(2, campaign.getSimplifiedTravelTime(campaign.getSystemById("Strana Mechty"))); } } else { - travelTime = campaign.getSimplifiedTravelTime(campaign.getSystemById(person.getEduAcademySystem())); - - if (travelTime < 2) { - travelTime = 2; - } + travelTime = Math.max(2, campaign.getSimplifiedTravelTime(campaign.getSystemById(person.getEduAcademySystem()))); } - person.setEduDaysOfTravelFromAcademy(travelTime); - - if ((academy.isClan()) && (academy.isPrepSchool()) && (person.getAge(campaign.getLocalDate()) < 10)) { - campaign.addReport(person.getHyperlinkedName() + ' ' + resources.getString("creche.text")); - } else { - campaign.addReport(person.getHyperlinkedName() + ' ' + campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("returningFromSchool.text"), travelTime)); - } return null; } - return daysOfTravelFrom; + return travelTime; } /** @@ -514,38 +499,26 @@ private static Integer beginJourneyHome(Campaign campaign, Person person, Academ * * @param campaign the campaign the person is in * @param person the person whose journey home is being processed - * @param daysOfEducation the number education days remaining * @param daysOfTravelFrom the number of days it takes for the person to travel from the campaign location to the unit */ - private static void processJourneyHome(Campaign campaign, Person person, Integer daysOfEducation, Integer daysOfTravelFrom) { - if ((daysOfEducation == 0) && (daysOfTravelFrom > 0)) { - int travelTime = 0; - boolean clanException = false; + private static void processJourneyHome(Campaign campaign, Person person, Integer daysOfTravelFrom) { + int travelTime = 0; + boolean clanException = false; - try { - travelTime = campaign.getSimplifiedTravelTime(campaign.getSystemById(person.getEduAcademySystem())); - } catch (Exception e) { - clanException = true; - } + try { + travelTime = Math.max(2, campaign.getSimplifiedTravelTime(campaign.getSystemById(person.getEduAcademySystem()))); - if (clanException) { - person.setEduDaysOfTravelFromAcademy(daysOfTravelFrom - 1); - person.setEduDaysOfTravel(person.getEduDaysOfTravel() + 1); - } else { - if (travelTime > daysOfTravelFrom) { - person.setEduDaysOfTravelFromAcademy(travelTime); - } else if (travelTime < daysOfTravelFrom) { - person.setEduDaysOfTravelFromAcademy(travelTime / 2); - person.setEduDaysOfTravel(0); - } else { - person.setEduDaysOfTravelFromAcademy(daysOfTravelFrom - 1); - person.setEduDaysOfTravel(person.getEduDaysOfTravel() + 1); - } + if (travelTime != daysOfTravelFrom) { + person.setEduDaysOfTravelFromAcademy(travelTime); } - if ((person.getEduDaysOfTravelFromAcademy()) == 0) { - person.changeStatus(campaign, campaign.getLocalDate(), PersonnelStatus.ACTIVE); - } + person.setEduDaysOfTravel(person.getEduDaysOfTravel() + 1); + } catch (Exception e) { + person.setEduDaysOfTravel(person.getEduDaysOfTravel() + 1); + } + + if ((travelTime - person.getEduDaysOfTravel()) < 1) { + person.changeStatus(campaign, campaign.getLocalDate(), PersonnelStatus.ACTIVE); } } diff --git a/MekHQ/src/mekhq/gui/view/PersonViewPanel.java b/MekHQ/src/mekhq/gui/view/PersonViewPanel.java index 6679300720..c128030526 100644 --- a/MekHQ/src/mekhq/gui/view/PersonViewPanel.java +++ b/MekHQ/src/mekhq/gui/view/PersonViewPanel.java @@ -1506,7 +1506,10 @@ private JPanel fillSkills() { pnlSkills.add(lblEducationTravelFrom1, gridBagConstraints); lblEducationTravelFrom2.setName("lblEducationTravelFrom2"); - lblEducationTravelFrom2.setText(String.valueOf(person.getEduDaysOfTravelFromAcademy()) + ' ' + resourceMap.getString("lblEducationDurationDays.text")); + lblEducationTravelFrom2.setText(String.format(resourceMap.getString("lblEducationTravelDuration.text"), + person.getEduDaysOfTravelFromAcademy() - person.getEduDaysOfTravel(), + person.getEduDaysOfTravelFromAcademy(), + campaign.getSystemById(person.getEduAcademySystem()).getName(campaign.getLocalDate()))); lblEducationTravelFrom2.setLabelFor(lblEducationTravelFrom2); gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 1; From f13b52dcd3c4dc265b55a5b8c61cfc7d4174c436 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Mon, 27 May 2024 14:24:57 -0500 Subject: [PATCH 6/7] feat: Updated Education and PersonViewPanel - Set days of travel from academy in EducationController - Removed unused clan exception from EducationController - Adjusted display of education travel duration in PersonViewPanel --- .../campaign/personnel/education/EducationController.java | 3 ++- MekHQ/src/mekhq/gui/view/PersonViewPanel.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java index f3f2f9341a..372a75f7bf 100644 --- a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java +++ b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java @@ -489,6 +489,8 @@ private static Integer beginJourneyHome(Campaign campaign, Person person, Academ campaign.addReport(person.getHyperlinkedName() + ' ' + String.format(resources.getString("returningFromSchool.text"), travelTime)); + person.setEduDaysOfTravelFromAcademy(travelTime); + return null; } return travelTime; @@ -503,7 +505,6 @@ private static Integer beginJourneyHome(Campaign campaign, Person person, Academ */ private static void processJourneyHome(Campaign campaign, Person person, Integer daysOfTravelFrom) { int travelTime = 0; - boolean clanException = false; try { travelTime = Math.max(2, campaign.getSimplifiedTravelTime(campaign.getSystemById(person.getEduAcademySystem()))); diff --git a/MekHQ/src/mekhq/gui/view/PersonViewPanel.java b/MekHQ/src/mekhq/gui/view/PersonViewPanel.java index c128030526..f1be7ea41a 100644 --- a/MekHQ/src/mekhq/gui/view/PersonViewPanel.java +++ b/MekHQ/src/mekhq/gui/view/PersonViewPanel.java @@ -1507,7 +1507,7 @@ private JPanel fillSkills() { lblEducationTravelFrom2.setName("lblEducationTravelFrom2"); lblEducationTravelFrom2.setText(String.format(resourceMap.getString("lblEducationTravelDuration.text"), - person.getEduDaysOfTravelFromAcademy() - person.getEduDaysOfTravel(), + person.getEduDaysOfTravel(), person.getEduDaysOfTravelFromAcademy(), campaign.getSystemById(person.getEduAcademySystem()).getName(campaign.getLocalDate()))); lblEducationTravelFrom2.setLabelFor(lblEducationTravelFrom2); From 56f9e8b4b3022bf9e4dff587730265c4d1695480 Mon Sep 17 00:00:00 2001 From: IllianiCBT Date: Mon, 27 May 2024 22:13:58 -0500 Subject: [PATCH 7/7] fix: ensured minimum education level for awardXP in EducationController --- .../mekhq/campaign/personnel/education/EducationController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java index 372a75f7bf..ff9a4e45a0 100644 --- a/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java +++ b/MekHQ/src/mekhq/campaign/personnel/education/EducationController.java @@ -1544,7 +1544,7 @@ private static void improveSkills(Campaign campaign, Person person, Academy acad for (String skill : curriculum) { if (skill.equalsIgnoreCase("bonus xp")) { - person.awardXP(campaign, Compute.d6(educationLevel)); + person.awardXP(campaign, Compute.d6(Math.max(1, educationLevel))); } else { String skillParsed = Academy.skillParser(skill); int bonus;