You don't implement Populate, you call it. For example, when generating the Lion's Guard:
*snip Java code*
Anyway, messing with those lines will cause problems for vanilla fleets that I've modded since it will include duplicates. I suggest adding a conditional statement there or rearranging the code to avoid that issue. The FleetManager is designed such that either a fleet uses all (or most) of its features or none of it, so as to maintain maximum compatibility.
Er, yeah... that was very poor choice of terminology on my part, there.
What I meant to say, is that I have little idea as to what appropriate numerical values to use for mods, when calling the Populate routine; determining EXP amount and aptitude prioritization were, by comparison, much more straightforward (re: just a lot of copy/pasting b/w the various '_Spawn.java' files, with minor tweaks here and there).
More to the point, I separated the leveling mechanism entirely from 'FleetManager.java' into a stand-alone file, that can be called independently of the Starsector+ implementation (e.g., enabling leveling for normally-unsupported mods in Uomoz's Sector for instance, without enabling SS+ and borking both mods to hell and back).
Ah hell, here's your original code that I butchered together, for said separated leveling mechanism:
package data.scripts.world.SSEPlus;
import com.fs.starfarer.api.campaign.CampaignFleetAPI;
import com.fs.starfarer.api.campaign.CargoAPI;
import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
import com.fs.starfarer.api.characters.PersonAPI;
import com.fs.starfarer.api.fleet.FleetMemberType;
import com.fs.starfarer.api.fleet.FleetMemberAPI;
import java.util.*;
public final class LevelUpperX {
public static final Map allSkills;
private static final Random rng = new Random();
static {
Map allSkillsTemp = new HashMap();
allSkillsTemp.put("combat",
createSkillList(new String[] {
"missile_specialization", "ordnance_expert", "damage_control", "target_analysis", "evasive_action", "helmsmanship", "flux_modulation"
})
);
allSkillsTemp.put("leadership",
createSkillList(new String[] {
//"advanced_tactics", "command_experience", "fleet_logistics", "small_unit_tactics", "wing_command", "logistical_oversight"
"advanced_tactics", "command_experience", "fleet_logistics"
})
);
allSkillsTemp.put("technology",
createSkillList(new String[] {
"gunnery_implants", "applied_physics", "flux_dynamics", "computer_systems", "construction", "mechanical_engineering", "field_repairs", "navigation"
})
);
allSkills = Collections.unmodifiableMap(allSkillsTemp);
}
private LevelUpperX() {}
private static List createSkillList(String[] skills) {
return Collections.unmodifiableList(Arrays.asList(skills));
}
public static String getRandomSkill(String aptitude) {
List tmp = (List) allSkills.get(aptitude);
return (String) tmp.get(rng.nextInt(tmp.size()));
}
public static void levelUp(PersonAPI commander, int combat, int leadership, int technology) {
MutableCharacterStatsAPI stats = commander.getStats();
int x = (int)stats.getAptitudeLevel("combat") + (int)stats.getAptitudeLevel("leadership") + (int)stats.getAptitudeLevel("technology");
while (stats.getAptitudePoints() > 0f) {
x++;
if (stats.getAptitudeLevel("combat") == 10 && stats.getAptitudeLevel("leadership") == 10 && stats.getAptitudeLevel("technology") == 10) {
break;
}
if (stats.getAptitudeLevel("combat") == 10 && combat > 0) {
combat = 0;
if (stats.getAptitudeLevel("leadership") < 10) {
leadership++;
}
if (stats.getAptitudeLevel("technology") < 10) {
technology++;
}
}
if (stats.getAptitudeLevel("leadership") == 10 && leadership > 0) {
leadership = 0;
if (stats.getAptitudeLevel("combat") < 10) {
combat++;
}
if (stats.getAptitudeLevel("technology") < 10) {
technology++;
}
}
if (stats.getAptitudeLevel("technology") == 10 && technology > 0) {
technology = 0;
if (stats.getAptitudeLevel("leadership") < 10) {
leadership++;
}
if (stats.getAptitudeLevel("combat") < 10) {
combat++;
}
}
if (x > 0 && x <= combat) {
stats.increaseAptitude("combat");
stats.addAptitudePoints(-1);
} else if (x > combat && x <= combat+leadership) {
stats.increaseAptitude("leadership");
stats.addAptitudePoints(-1);
} else if (x > combat+leadership && x <= combat+leadership+technology) {
stats.increaseAptitude("technology");
stats.addAptitudePoints(-1);
} else {
x -= combat+leadership+technology+1;
}
}
while (stats.getSkillPoints() > 0f) {
if ((int)stats.getSkillLevel("fleet_logistics") < (int)stats.getAptitudeLevel("leadership")) {
stats.increaseSkill("fleet_logistics");
stats.addSkillPoints(-1);
} else if ((int)stats.getSkillLevel("mechanical_engineering") < (int)stats.getAptitudeLevel("technology")) {
stats.increaseSkill("mechanical_engineering");
stats.addSkillPoints(-1);
} else if ((int)stats.getSkillLevel("computer_systems") < (int)stats.getAptitudeLevel("technology")) {
stats.increaseSkill("computer_systems");
stats.addSkillPoints(-1);
// } else if ((int)stats.getSkillLevel("wing_command") < (int)(stats.getAptitudeLevel("leadership")*0.75f)) {
// stats.increaseSkill("wing_command");
// stats.addSkillPoints(-1);
} else if ((int)stats.getSkillLevel("missile_specialization") < (int)(stats.getAptitudeLevel("combat")*0.75f)) {
stats.increaseSkill("missile_specialization");
stats.addSkillPoints(-1);
} else if ((int)stats.getSkillLevel("applied_physics") < (int)(stats.getAptitudeLevel("technology")*0.5f)) {
stats.increaseSkill("applied_physics");
stats.addSkillPoints(-1);
} else if ((int)stats.getSkillLevel("construction") < (int)(stats.getAptitudeLevel("technology")*0.5f)) {
stats.increaseSkill("construction");
stats.addSkillPoints(-1);
} else if ((int)stats.getSkillLevel("flux_dynamics") < (int)(stats.getAptitudeLevel("technology")*0.5f)) {
stats.increaseSkill("flux_dynamics");
stats.addSkillPoints(-1);
} else {
float rand = (float) Math.random() * 3f;
String aptitude;
if (rand >= 0f && rand < 1f) {
aptitude = "combat";
} else if (rand >= 1f && rand < 2f) {
aptitude = "leadership";
} else {
aptitude = "technology";
}
String skill = getRandomSkill(aptitude);
if ((int)stats.getSkillLevel(skill) < (int)stats.getAptitudeLevel(aptitude)) {
stats.increaseSkill(skill);
stats.addSkillPoints(-1);
}
}
}
String levelNote = (int)stats.getAptitudeLevel("combat") + "/" + (int)stats.getAptitudeLevel("leadership") + "/" + (int)stats.getAptitudeLevel("technology");
if (stats.getLevel() >= 1 && stats.getLevel() <= 5) {
commander.setRank("Junior Captain (" + levelNote + ")");
} else if (stats.getLevel() >= 6 && stats.getLevel() <= 10) {
commander.setRank("Captain (" + levelNote + ")");
} else if (stats.getLevel() >= 11 && stats.getLevel() <= 15) {
commander.setRank("Senior Captain (" + levelNote + ")");
} else if (stats.getLevel() >= 16 && stats.getLevel() <= 20) {
commander.setRank("Lt. Commander (" + levelNote + ")");
} else if (stats.getLevel() >= 21 && stats.getLevel() <= 25) {
commander.setRank("Commander (" + levelNote + ")");
} else if (stats.getLevel() >= 26 && stats.getLevel() <= 30) {
commander.setRank("Fleet Commander (" + levelNote + ")");
} else if (stats.getLevel() >= 31 && stats.getLevel() <= 40) {
commander.setRank("Rear Admiral (" + levelNote + ")");
} else if (stats.getLevel() >= 41 && stats.getLevel() <= 50) {
commander.setRank("Admiral (" + levelNote + ")");
} else if (stats.getLevel() >= 51 && stats.getLevel() <= 60) {
commander.setRank("Fleet Marshall (" + levelNote + ")");
} else {
commander.setRank("Supreme Commander (" + levelNote + ")");
}
}
public static void levelCrew(CampaignFleetAPI fleet, float green, float regular, float veteran, float elite) {
float eliteCrew = elite;
float veteranCrew = veteran;
float regularCrew = regular;
float greenCrew = green;
eliteCrew = eliteCrew / (greenCrew+regularCrew+veteranCrew+eliteCrew);
veteranCrew = veteranCrew / (greenCrew+regularCrew+veteranCrew+eliteCrew);
regularCrew = regularCrew / (greenCrew+regularCrew+veteranCrew+eliteCrew);
greenCrew = greenCrew / (greenCrew+regularCrew+veteranCrew+eliteCrew);
int totalCrew = fleet.getCargo().getCrew(CargoAPI.CrewXPLevel.REGULAR);
fleet.getCargo().removeCrew(CargoAPI.CrewXPLevel.REGULAR, (int)((float)totalCrew*(eliteCrew+veteranCrew+greenCrew)));
fleet.getCargo().addCrew(CargoAPI.CrewXPLevel.ELITE, (int)((float)totalCrew*eliteCrew));
fleet.getCargo().addCrew(CargoAPI.CrewXPLevel.VETERAN, (int)((float)totalCrew*veteranCrew));
fleet.getCargo().addCrew(CargoAPI.CrewXPLevel.GREEN, (int)((float)totalCrew*greenCrew));
fleet.setName(fleet.getName() + " [" + (int)fleet.getCommander().getStats().getLevel() + "]");
if (fleet.getFleetData().getMembersListCopy().size() > 0) {
List members = fleet.getFleetData().getMembersListCopy();
List sort = new ArrayList();
Iterator iter = members.iterator();
FleetMemberAPI ship;
while (iter.hasNext()) {
ship = (FleetMemberAPI) iter.next();
ship.getRepairTracker().setCR(ship.getRepairTracker().getMaxCR());
if (sort.size() > 0) {
Iterator iter2 = sort.iterator();
FleetMemberAPI ship2;
int i = 0;
while (iter2.hasNext()) {
ship2 = (FleetMemberAPI) iter2.next();
if (compare(ship, ship2)) {
break;
} else {
i++;
}
}
sort.add(i, ship);
} else {
sort.add(ship);
}
}
if (sort.size() > 0) {
iter = sort.iterator();
while (iter.hasNext()) {
ship = (FleetMemberAPI) iter.next();
fleet.getFleetData().removeFleetMember(ship);
fleet.getFleetData().addFleetMember(ship);
}
}
FleetMemberAPI flagship = (FleetMemberAPI)fleet.getFleetData().getMembersInPriorityOrder().get(0);
for (int i = 0; i < fleet.getFleetData().getMembersInPriorityOrder().size() - 1; i++) {
if (flagship.isFighterWing() == true) {
flagship = (FleetMemberAPI)fleet.getFleetData().getMembersInPriorityOrder().get(i + 1);
}
}
flagship.setFlagship(true);
}
}
private static boolean compare(FleetMemberAPI ship1, FleetMemberAPI ship2) {
if (ship1.isCivilian() == false) {
if (ship2.isCivilian() == true) {
return true;
}
} else {
if (ship2.isCivilian() == false) {
return false;
}
}
if (ship1.isFighterWing() == false) {
if (ship2.isFighterWing() == true) {
return true;
}
} else {
if (ship2.isFighterWing() == false) {
return false;
}
}
if (ship1.isFrigate() == false) {
if (ship2.isFrigate() == true) {
return true;
}
} else {
if (ship2.isFrigate() == false) {
return false;
}
}
if (ship1.isDestroyer() == false) {
if (ship2.isDestroyer() == true) {
return true;
}
} else {
if (ship2.isDestroyer() == false) {
return false;
}
}
if (ship1.isCruiser() == false) {
if (ship2.isCruiser() == true) {
return true;
}
} else {
if (ship2.isCruiser() == false) {
return false;
}
}
if (ship1.isCapital() == false) {
if (ship2.isCapital() == true) {
return true;
}
} else {
if (ship2.isCapital() == false) {
return false;
}
}
if (ship1.getFleetPointCost() > ship2.getFleetPointCost()) {
return true;
} else if (ship1.getFleetPointCost() < ship2.getFleetPointCost()) {
return false;
}
if (ship1.getRepairTracker().isLogisticalPriority() == true) {
if (ship2.getRepairTracker().isLogisticalPriority() == false) {
return true;
}
} else {
if (ship2.getRepairTracker().isLogisticalPriority() == true) {
return false;
}
}
if (ship1.getSpecId().compareTo(ship2.getSpecId()) <= 0) {
return true;
} else {
return false;
}
}
}
Note that the above example comments out SS+'s three added skills, and re-enables the Navigation skill in their place.
Then add the following (example) lines to a mod's _Spawn.java file(s) (including the appropriate 'import' statements):
import com.fs.starfarer.api.campaign.CargoAPI;
import com.fs.starfarer.api.characters.PersonAPI;
import com.fs.starfarer.api.characters.MutableCharacterStatsAPI;
import com.fs.starfarer.api.fleet.FleetMemberAPI;
import data.scripts.world.SSEPlus.LevelUpperX;
import java.util.*;
...
fleet.getCommanderStats().setAptitudePoints(3);
fleet.getCommanderStats().setSkillPoints(9);
fleet.getCommanderStats().addXP((long)((float)Math.random() * 600000f + 200000f));
LevelUpperX.levelUp(fleet.getCommander(), 2, 0, 3);
LevelUpperX.levelCrew(fleet,
(float)Math.random()*0.25f + 0f,
(float)Math.random()*0.5f + 0.25f,
(float)Math.random()*0.5f + 0.25f,
(float)Math.random()*0.5f + 0.25f);
Having typed all that, my worry is that by avoiding calling the Populate routine, any mod-based fleets that are spawned using my bastardized version of your leveling code, will do so with low-to-zero-quantity supply/fuel/crew/marine count(s)...
...unless, by omitting several specific lines from 'FleetManager.java''s 'createFleet' routine (specifically, lines #158-161) I avert that issue altogether, as I (poorly) attempted to request clarification in my previous post.