Skip to content

Commit 9dee8e6

Browse files
authored
Merge pull request #8225 from IllianiBird/combatTechnicianRemoval
2 parents a950398 + ba20c7e commit 9dee8e6

File tree

18 files changed

+43
-188
lines changed

18 files changed

+43
-188
lines changed

MekHQ/docs/Windchilds Guides/Windchilds_Guide_to_MekHQ_Portrait_Generation.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ Vehicle Crew/Ground: /Vehicle Crew/Ground /Vehicle Driver
3434
Vehicle Crew/Naval: /Vehicle Crew/Naval /Naval Driver
3535
Vehicle Crew/VTOL: /Vehicle Crew/VTOL /VTOL Pilot
3636
Vehicle Gunner: MOVED TO /Vehicle Crew/Ground /Vehicle Gunner
37-
Combat Engineer: /Combat Technician /Vehicle Crewmember
37+
None /Vehicle Crew/Generic /Vehicle Crewmember
3838
Aerospace Pilot: /Aerospace Pilot
39-
Conventional Aircraft Pilot: /Conventional Aircraft Crew /Conventional Aircraft Pilot
39+
Conventional Aircraft Pilot: /Conventional Aircraft Crew /Conventional Aircraft Pilot
4040
ProtoMek Pilot: /ProtoMek Pilot
4141
Battle Armour: /Battle Armor Pilot
4242
Battle Armour (Clan): /Elemental

MekHQ/resources/mekhq/resources/CampaignXmlParser.properties

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,12 @@
3131
CampaignXmlParser.compatibility.edge={0}<b>WARNING:</b>{1} In an attempt to bring our current implementation \
3232
closer to the official rules a cap has been placed on <b>Edge</b>. {2} had {3} more Edge than possible, they have \
3333
received an XP Rebate for a total of {4} additional XP.
34-
vehicleCrewProfessionSkillChange={0}<b>WARNING:</b>{1} starting in version 50.10, vehicle crews were changed to Combat \
35-
Engineers. Combat Engineers use the Tech/Mechanic, Tech/Mek & (depending on campaign options) the Administration \
36-
skills. However, {2} did not have one or more of those skills. They have been given any missing skills for free \
37-
at level 3. Combat Engineers are a hybrid of Mechanic and MekTech, slower to level, but able to handle both unit \
38-
types. An excellent choice for the salvage operations added in 50.10. For Reputation purposes (to avoid \
39-
double-dipping) Combat Engineers count as Mechanics.
40-
vehicleProfessionSkillChange={0}<b>WARNING:</b>{1} starting in version 50.10, the distinction between Vehicle Drivers \
41-
and Vehicle Gunners has been relaxed. This was done as part of work towards the long-requested 'Commanders Only' \
42-
mode. {2}'s profession now requires both gunnery and piloting skills. If the character was missing gunnery, they \
43-
were given gunnery for free. The level will match their piloting skill. If the character was missing piloting, they \
44-
were given piloting for free. The level will match their gunnery skill. If the character was missing both, they were \
45-
given both for free at level 3.
34+
vehicleProfessionSkillChange={0}<b>WARNING:</b>{1} starting in version 50.10, the distinction between Vehicle \
35+
Drivers, Vehicle Gunners, and Vehicle Crewmembers has been relaxed. This was done as part of work towards the \
36+
long-requested 'Commanders Only' mode (see Campaign Options). {2}'s profession now requires both gunnery and \
37+
piloting skills. If the character was missing gunnery, they were given gunnery for free. The level will match their\
38+
\ piloting skill. If the character was missing piloting, they were given piloting for free. The level will match \
39+
their gunnery skill. If the character was missing both, they were given both for free at level 1.
4640
# Loading Errors
4741
ineligibleForPrimaryRole={0}<b>WARNING:</b>{1} {2} was found to be ineligible for their <b>Primary</b> role. That role \
4842
has been removed, and they were assigned the <b>DEPENDENT</b> role.

MekHQ/resources/mekhq/resources/PersonnelRole.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ VEHICLE_CREW_NAVAL.description=Crews naval surface or submarine vehicles, typica
5353
VEHICLE_CREW_VTOL.label=Vehicle Crew/VTOL
5454
VEHICLE_CREW_VTOL.description=Crews Vertical Take-Off and Landing (VTOL) craft, providing rapid deployment, scouting, or \
5555
support roles on planetary surfaces.
56-
COMBAT_TECHNICIAN.label=Combat Engineer
57-
COMBAT_TECHNICIAN.description=A jack of all trades who uses extensive cross-discipline knowledge to skillfully oversee \
58-
salvage operations.
56+
COMBAT_TECHNICIAN.label=Combat Technician (Deprecated)
57+
COMBAT_TECHNICIAN.description=Scheduled for removal, use Vehicle Crew/Ground, Vehicle Crew/VTOL, or Vehicle Crew/Naval \
58+
instead.
5959
AEROSPACE_PILOT.label=Aerospace Pilot
6060
AEROSPACE_PILOT.description=Pilots high-speed aerospace fighters or bombers, capable of operating in planetary atmospheres or the vacuum of space.
6161
CONVENTIONAL_AIRCRAFT_PILOT.label=Conventional Aircraft Crew

MekHQ/src/mekhq/Utilities.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,7 @@ public static Map<CrewType, Collection<Person>> genRandomCrewWithCombinedSkill(C
740740
} else if (unit.getEntity().isConventionalFighter()) {
741741
role = PersonnelRole.CONVENTIONAL_AIRCRAFT_PILOT;
742742
} else {
743-
role = PersonnelRole.COMBAT_TECHNICIAN;
743+
role = PersonnelRole.ASTECH;
744744
}
745745
Person person = campaign.newPerson(role, factionCode, oldCrew.getGender(numberPeopleGenerated));
746746

MekHQ/src/mekhq/campaign/campaignOptions/CampaignOptions.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -900,7 +900,6 @@ public CampaignOptions() {
900900
setRoleBaseSalary(PersonnelRole.VEHICLE_CREW_GROUND, 900);
901901
setRoleBaseSalary(PersonnelRole.VEHICLE_CREW_NAVAL, 900);
902902
setRoleBaseSalary(PersonnelRole.VEHICLE_CREW_VTOL, 900);
903-
setRoleBaseSalary(PersonnelRole.COMBAT_TECHNICIAN, 900);
904903
setRoleBaseSalary(PersonnelRole.AEROSPACE_PILOT, 1500);
905904
setRoleBaseSalary(PersonnelRole.CONVENTIONAL_AIRCRAFT_PILOT, 900);
906905
setRoleBaseSalary(PersonnelRole.PROTOMEK_PILOT, 960);

MekHQ/src/mekhq/campaign/io/CampaignXmlParser.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -541,24 +541,6 @@ public Campaign parse() throws CampaignXmlParseException, NullEntityException {
541541
campaign.addReport(report);
542542
}
543543

544-
boolean includeAdmin = campaign.getCampaignOptions().isTechsUseAdministration();
545-
if (Person.updateSkillsForVehicleCrewProfession(today,
546-
person,
547-
person.getPrimaryRole(),
548-
true,
549-
includeAdmin) ||
550-
Person.updateSkillsForVehicleCrewProfession(today,
551-
person,
552-
person.getSecondaryRole(),
553-
false,
554-
includeAdmin)) {
555-
String report = getFormattedTextAt(RESOURCE_BUNDLE, "vehicleCrewProfessionSkillChange",
556-
spanOpeningWithCustomColor(getWarningColor()),
557-
CLOSING_SPAN_TAG,
558-
person.getHyperlinkedFullTitle());
559-
campaign.addReport(report);
560-
}
561-
562544
// This resolves a bug squashed in 2025 (50.03) but lurked in our codebase
563545
// potentially as far back as 2014. The next two handlers should never be removed.
564546
if (!person.canPerformRole(today, person.getSecondaryRole(), false)) {

MekHQ/src/mekhq/campaign/personnel/Person.java

Lines changed: 8 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -4257,8 +4257,9 @@ private static void selfCorrectEducationCourseIndexes(Campaign campaign, Person
42574257
* <li>Updates the person's role (primary or secondary) to the new profession</li>
42584258
* </ul>
42594259
*
4260-
* <p>For {@link PersonnelRole#VEHICLE_GUNNER}, the new role is determined by examining the person's currently
4261-
* assigned entity. If no entity is assigned, defaults to ground vehicle crew.</p>
4260+
* <p>For {@link PersonnelRole#VEHICLE_GUNNER}, {@link PersonnelRole#COMBAT_TECHNICIAN} or
4261+
* {@link PersonnelRole#VEHICLE_CREW}, the new role is determined by examining the person's currently assigned
4262+
* entity. If no entity is assigned, defaults to ground vehicle crew.</p>
42624263
*
42634264
* <p>Skills are added at level 3 if the complementary skill is missing, otherwise they are added at the same
42644265
* level as the existing complementary skill.</p>
@@ -4292,7 +4293,7 @@ public static boolean updateSkillsForVehicleProfessions(LocalDate today, Person
42924293
newProfession = PersonnelRole.VEHICLE_CREW_GROUND;
42934294
drivingSkillType = S_PILOT_GVEE;
42944295
}
4295-
case VEHICLE_GUNNER -> {
4296+
case VEHICLE_GUNNER, VEHICLE_CREW, COMBAT_TECHNICIAN -> {
42964297
// Vehicle gunners need special handling to guesstimate what they should be. We base this on the unit
42974298
// they are currently assigned to.
42984299
Entity assignedEntity = person.getEntity();
@@ -4323,8 +4324,8 @@ public static boolean updateSkillsForVehicleProfessions(LocalDate today, Person
43234324
Skill drivingSkill = person.getSkill(drivingSkillType);
43244325
Skill gunnerySkill = person.getSkill(gunnerySkillType);
43254326

4326-
int drivingTargetLevel = gunnerySkill == null ? 3 : gunnerySkill.getLevel();
4327-
int gunneryTargetLevel = drivingSkill == null ? 3 : drivingSkill.getLevel();
4327+
int drivingTargetLevel = gunnerySkill == null ? 1 : gunnerySkill.getLevel();
4328+
int gunneryTargetLevel = drivingSkill == null ? 1 : drivingSkill.getLevel();
43284329

43294330
if (gunnerySkill == null) {
43304331
person.addSkill(gunnerySkillType, gunneryTargetLevel, 0);
@@ -4343,58 +4344,6 @@ public static boolean updateSkillsForVehicleProfessions(LocalDate today, Person
43434344
return true;
43444345
}
43454346

4346-
/**
4347-
* Updates skills for personnel with the Vehicle Crew profession by ensuring they have the Mechanic skill.
4348-
*
4349-
* <p>This method is used during XML loading to migrate legacy data. If the person lacks the
4350-
* {@link SkillType#S_TECH_MECHANIC} skill, it will be added at a level 3. This ensures backwards compatibility when
4351-
* loading older save files.</p>
4352-
*
4353-
* @param today the current date
4354-
* @param person the person whose skills should be updated
4355-
* @param currentRole the role to check
4356-
* @param isPrimary if the role is the characters' primary profession
4357-
*
4358-
* @return {@code true} if the Mechanic skill was added, {@code false} otherwise
4359-
*
4360-
* @author Illiani
4361-
* @since 0.50.10
4362-
*/
4363-
public static boolean updateSkillsForVehicleCrewProfession(LocalDate today, Person person,
4364-
PersonnelRole currentRole, boolean isPrimary, boolean includeAdmin) {
4365-
if (currentRole != PersonnelRole.VEHICLE_CREW && currentRole != PersonnelRole.COMBAT_TECHNICIAN) {
4366-
return false;
4367-
}
4368-
4369-
boolean didChangeOccur = false;
4370-
if (!person.hasSkill(S_TECH_MECHANIC)) {
4371-
person.addSkill(S_TECH_MECHANIC, 3, 0);
4372-
didChangeOccur = true;
4373-
}
4374-
4375-
if (includeAdmin && !person.hasSkill(S_ADMIN)) {
4376-
person.addSkill(S_ADMIN, 3, 0);
4377-
didChangeOccur = true;
4378-
}
4379-
4380-
if (!person.hasSkill(S_TECH_MEK)) {
4381-
person.addSkill(S_TECH_MEK, 3, 0);
4382-
didChangeOccur = true;
4383-
}
4384-
4385-
if (currentRole != PersonnelRole.COMBAT_TECHNICIAN) {
4386-
if (isPrimary) {
4387-
person.setPrimaryRole(today, PersonnelRole.COMBAT_TECHNICIAN);
4388-
didChangeOccur = true;
4389-
} else {
4390-
person.setSecondaryRole(PersonnelRole.COMBAT_TECHNICIAN);
4391-
didChangeOccur = true;
4392-
}
4393-
}
4394-
4395-
return didChangeOccur;
4396-
}
4397-
43984347
/**
43994348
* Configures a person's sexual orientation preferences based on their marriageability status and weighted random
44004349
* probabilities.
@@ -5813,7 +5762,7 @@ public boolean canTech(final Entity entity) {
58135762
} else if (entity instanceof BattleArmor) {
58145763
return hasSkill(S_TECH_BA) && isTechBA();
58155764
} else if (entity instanceof Tank) {
5816-
return hasSkill(S_TECH_MECHANIC) && (isTechMechanic() || isCombatTechnician());
5765+
return hasSkill(S_TECH_MECHANIC) && isTechMechanic();
58175766
} else {
58185767
return false;
58195768
}
@@ -6088,7 +6037,7 @@ public void resetMinutesLeft(boolean isTechsUseAdministration) {
60886037
}
60896038

60906039
public boolean isTech() {
6091-
return isTechMek() || isTechAero() || isTechMechanic() || isTechBA() || isCombatTechnician();
6040+
return isTechMek() || isTechAero() || isTechMechanic() || isTechBA();
60926041
}
60936042

60946043
/**
@@ -6100,7 +6049,6 @@ public boolean isTechExpanded() {
61006049
return isTechMek() ||
61016050
isTechAero() ||
61026051
isTechMechanic() ||
6103-
isCombatTechnician() ||
61046052
isTechBA() ||
61056053
isTechLargeVessel();
61066054
}
@@ -6130,11 +6078,6 @@ public boolean isTechBA() {
61306078
return hasSkill && (getPrimaryRole().isBATech() || getSecondaryRole().isBATech());
61316079
}
61326080

6133-
public boolean isCombatTechnician() {
6134-
boolean hasSkill = hasSkill(S_TECH_MECHANIC);
6135-
return hasSkill && (getPrimaryRole().isCombatTechnician() || getSecondaryRole().isCombatTechnician());
6136-
}
6137-
61386081
public boolean isAstech() {
61396082
boolean hasSkill = hasSkill(S_ASTECH);
61406083
return hasSkill && (getPrimaryRole().isAstech() || getSecondaryRole().isAstech());

MekHQ/src/mekhq/campaign/personnel/enums/PersonnelRole.java

Lines changed: 15 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ public enum PersonnelRole {
5656
// region Enum Declarations
5757
MEKWARRIOR(PersonnelRoleSubType.COMBAT, KeyEvent.VK_M, 4, 4, 5, 5, 4, 4, 4),
5858
LAM_PILOT(PersonnelRoleSubType.COMBAT, KeyEvent.VK_UNDEFINED, 4, 4, 5, 5, 4, 4, 4),
59-
COMBAT_TECHNICIAN(PersonnelRoleSubType.SUPPORT, KeyEvent.VK_UNDEFINED, 4, 4, 5, 3, 5, 5, 4),
6059
VEHICLE_CREW_GROUND(PersonnelRoleSubType.COMBAT, KeyEvent.VK_UNDEFINED, 4, 4, 5, 5, 4, 4, 4),
6160
VEHICLE_CREW_NAVAL(PersonnelRoleSubType.COMBAT, KeyEvent.VK_UNDEFINED, 4, 4, 5, 5, 4, 4, 4),
6261
VEHICLE_CREW_VTOL(PersonnelRoleSubType.COMBAT, KeyEvent.VK_UNDEFINED, 4, 4, 5, 5, 4, 4, 4),
@@ -354,16 +353,18 @@ public enum PersonnelRole {
354353
@Deprecated(since = "0.50.10", forRemoval = true)
355354
VEHICLE_GUNNER(KeyEvent.VK_UNDEFINED),
356355
@Deprecated(since = "0.50.10", forRemoval = true)
357-
VEHICLE_CREW(KeyEvent.VK_UNDEFINED);
356+
VEHICLE_CREW(KeyEvent.VK_UNDEFINED),
357+
@Deprecated(since = "0.50.10", forRemoval = true)
358+
COMBAT_TECHNICIAN(KeyEvent.VK_UNDEFINED);
358359
// endregion Enum Declarations
359360

360361
// region Variable Declarations
361362
private static final MMLogger logger = MMLogger.create(PersonnelRole.class);
362363
private static final String RESOURCE_BUNDLE = "mekhq.resources.PersonnelRole";
363364

364-
public static final List<PersonnelRole> VEHICLE_CREW_EXTENDED_ROLES = List.of(COMBAT_TECHNICIAN, MEK_TECH,
365-
AERO_TEK, MECHANIC, BA_TECH, ASTECH, DOCTOR, MEDIC, COMMS_OPERATOR, TECH_COMMUNICATIONS, SENSOR_TECHNICIAN,
366-
SOLDIER, ADMINISTRATOR_COMMAND, ADMINISTRATOR_TRANSPORT, ADMINISTRATOR_LOGISTICS, ADMINISTRATOR_HR, CHEF);
365+
public static final List<PersonnelRole> VEHICLE_CREW_EXTENDED_ROLES = List.of(MEK_TECH, AERO_TEK, MECHANIC,
366+
BA_TECH, ASTECH, DOCTOR, MEDIC, COMMS_OPERATOR, TECH_COMMUNICATIONS, SENSOR_TECHNICIAN, SOLDIER,
367+
ADMINISTRATOR_COMMAND, ADMINISTRATOR_TRANSPORT, ADMINISTRATOR_LOGISTICS, ADMINISTRATOR_HR, CHEF);
367368

368369
private final PersonnelRoleSubType subType;
369370
private final boolean hasClanName;
@@ -641,13 +642,6 @@ public List<String> getSkillsForProfession(boolean isAdminsHaveNegotiation, bool
641642
yield List.of(SkillType.S_TECH_MECHANIC);
642643
}
643644
}
644-
case COMBAT_TECHNICIAN -> {
645-
if (isTechsUseAdministration) {
646-
yield List.of(SkillType.S_TECH_MECHANIC, SkillType.S_TECH_MEK, SkillType.S_ADMIN);
647-
} else {
648-
yield List.of(SkillType.S_TECH_MECHANIC, SkillType.S_TECH_MEK);
649-
}
650-
}
651645
case AEROSPACE_PILOT -> List.of(SkillType.S_GUN_AERO, SkillType.S_PILOT_AERO);
652646
case CONVENTIONAL_AIRCRAFT_PILOT -> List.of(SkillType.S_GUN_JET, SkillType.S_PILOT_JET);
653647
case PROTOMEK_PILOT -> List.of(SkillType.S_GUN_PROTO);
@@ -1011,13 +1005,6 @@ public boolean isVehicleCrewVTOL() {
10111005
return this == VEHICLE_CREW_VTOL;
10121006
}
10131007

1014-
/**
1015-
* @return {@code true} if the personnel has the Combat Technician/Engineer role, {@code false} otherwise.
1016-
*/
1017-
public boolean isCombatTechnician() {
1018-
return this == COMBAT_TECHNICIAN;
1019-
}
1020-
10211008
/**
10221009
* Returns {@code true} if this profession is suitable for vehicle crew positions.
10231010
*
@@ -1219,31 +1206,28 @@ public boolean isAerospaceGrouping() {
12191206
}
12201207

12211208
/**
1222-
* @return {@code true} if the character is assigned to the Vehicle Crew/Ground, or the Combat Technician/Engineer
1223-
* role
1209+
* @return {@code true} if the character is assigned to Vehicle Crew/Ground
12241210
*/
12251211
public boolean isGroundVehicleCrew() {
1226-
return isVehicleCrewGround() || isCombatTechnician();
1212+
return isVehicleCrewGround();
12271213
}
12281214

12291215
/**
1230-
* @return {@code true} if the character is assigned to the Vehicle Crew/Naval, or the Combat Technician/Engineer
1231-
* role
1216+
* @return {@code true} if the character is assigned to Vehicle Crew/Naval
12321217
*/
12331218
public boolean isNavalVehicleCrew() {
1234-
return isVehicleCrewNaval() || isCombatTechnician();
1219+
return isVehicleCrewNaval();
12351220
}
12361221

12371222
/**
1238-
* @return {@code true} if the character is assigned to the Vehicle Crew/VTOL, or the Combat Technician/Engineer
1239-
* role
1223+
* @return {@code true} if the character is assigned to Vehicle Crew/VTOL
12401224
*/
12411225
public boolean isVTOLCrew() {
1242-
return isVehicleCrewVTOL() || isCombatTechnician();
1226+
return isVehicleCrewVTOL();
12431227
}
12441228

12451229
/**
1246-
* @return {@code true} if the character is assigned to the Vehicle Crew/x or Combat Technician/Engineer role
1230+
* @return {@code true} if the character is assigned to the Vehicle Crew/x role
12471231
*/
12481232
public boolean isVehicleCrewMember() {
12491233
return isGroundVehicleCrew() || isNavalVehicleCrew() || isVTOLCrew();
@@ -1289,7 +1273,7 @@ public boolean isSupport(final boolean excludeCivilian) {
12891273
* @return {@code true} if the character is assigned to a technician role, {@code false} otherwise.
12901274
*/
12911275
public boolean isTech() {
1292-
return isMekTech() || isMechanic() || isCombatTechnician() || isAeroTek() || isBATech() || isVesselCrew();
1276+
return isMekTech() || isMechanic() || isAeroTek() || isBATech() || isVesselCrew();
12931277
}
12941278

12951279
/**
@@ -1299,7 +1283,7 @@ public boolean isTech() {
12991283
* @return {@code true} if the character is assigned to a technician role, {@code false} otherwise.
13001284
*/
13011285
public boolean isTechSecondary() {
1302-
return isMekTech() || isMechanic() || isCombatTechnician() || isAeroTek() || isBATech();
1286+
return isMekTech() || isMechanic() || isAeroTek() || isBATech();
13031287
}
13041288

13051289
/**

MekHQ/src/mekhq/campaign/personnel/enums/Profession.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ public static Profession getProfessionFromPersonnelRole(final PersonnelRole role
262262
case VEHICLE_CREW_GROUND, VEHICLE_CREW_NAVAL, VEHICLE_CREW_VTOL -> VEHICLE;
263263
case BATTLE_ARMOUR, SOLDIER -> INFANTRY;
264264
case VESSEL_PILOT, VESSEL_CREW, VESSEL_GUNNER, VESSEL_NAVIGATOR -> NAVAL;
265-
case MEK_TECH, MECHANIC, AERO_TEK, BA_TECH, ASTECH, COMBAT_TECHNICIAN -> TECH;
265+
case MEK_TECH, MECHANIC, AERO_TEK, BA_TECH, ASTECH -> TECH;
266266
case DOCTOR, MEDIC -> MEDICAL;
267267
case ADMINISTRATOR_COMMAND, ADMINISTRATOR_LOGISTICS, ADMINISTRATOR_HR, ADMINISTRATOR_TRANSPORT ->
268268
ADMINISTRATOR;

MekHQ/src/mekhq/campaign/personnel/enums/ROMDesignation.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ private static String determineDesignationFromRole(final PersonnelRole role,
162162
case VEHICLE_CREW_GROUND,
163163
VEHICLE_CREW_NAVAL,
164164
VEHICLE_CREW_VTOL,
165-
COMBAT_TECHNICIAN,
166165
CONVENTIONAL_AIRCRAFT_PILOT -> LAMBDA.toString();
167166
case AEROSPACE_PILOT -> PI.toString();
168167
case BATTLE_ARMOUR, SOLDIER -> IOTA.toString();

0 commit comments

Comments
 (0)