Testing out some code I modified from Content Unlocking Missions (added to a simulator mission's MissionDefinition.json) for reporting skills added to ship captains in those missions, and setting Combat Readiness (up to a fixed limit of 100) if a hullmod or skill raises a ship's max CR above the default of 70:
api.addPlugin(new BaseEveryFrameCombatPlugin() {
public void init(CombatEngineAPI engine) {}
public void advance(float amount, List events) {
if (Global.getCombatEngine().isPaused()) {
return;
}
for (ShipAPI ship : Global.getCombatEngine().getShips()) {
if (ship.getCustomData().get("poopystinky") == null) {
if (ship.getCaptain() != null && ship.getOwner() == 0 && ship.getCaptain().getStats().getSkillsCopy().size() > 4) {
String text = "";
for (int u = 4; u < ship.getCaptain().getStats().getSkillsCopy().size(); u++) {
if (u < ship.getCaptain().getStats().getSkillsCopy().size()-1) {text = text+(((MutableCharacterStatsAPI.SkillLevelAPI) ship.getCaptain().getStats().getSkillsCopy().get(u)).getLevel() > 1 ? ((MutableCharacterStatsAPI.SkillLevelAPI) ship.getCaptain().getStats().getSkillsCopy().get(u)).getSkill().getName()+"+, " : ((MutableCharacterStatsAPI.SkillLevelAPI) ship.getCaptain().getStats().getSkillsCopy().get(u)).getSkill().getName()+", ");} else {text = text+(((MutableCharacterStatsAPI.SkillLevelAPI) ship.getCaptain().getStats().getSkillsCopy().get(u)).getLevel() > 1 ? ((MutableCharacterStatsAPI.SkillLevelAPI) ship.getCaptain().getStats().getSkillsCopy().get(u)).getSkill().getName()+"+." : ((MutableCharacterStatsAPI.SkillLevelAPI) ship.getCaptain().getStats().getSkillsCopy().get(u)).getSkill().getName()+".");}
}
if (ship.getFleetMember() != null && ship.getHullSize() != HullSize.FIGHTER) {
Global.getCombatEngine().getCombatUI().addMessage(1, ship.getFleetMember(), Misc.getPositiveHighlightColor(), ship.getName(), Misc.getTextColor(), "", Global.getSettings().getColor("standardTextColor"), "is skilled in "+text);
}
}
ship.setCurrentCR(ship.getCurrentCR()+ship.getMutableStats().getMaxCombatReadiness().getModifiedValue()); //Properly adds the max CR, for some reason it cannot be caught as FleetMemberAPI or this would have been easier...
ship.setCRAtDeployment(ship.getCRAtDeployment()+ship.getMutableStats().getMaxCombatReadiness().getModifiedValue()); //This only affects the "score" result of said mission, but the algorithm is mostly 100% since you have to basically LOSE ships to lose score. I don't think this needs setting, but eh couldn't help but tried.
if (ship.getCurrentCR() > 1.0f)
ship.setCRAtDeployment(1.0f);
ship.setCustomData("poopystinky", true); //Fires once per ship.
}
}
}
});
I managed to modify the code so that it doesn't CTD if fighter wings had skills of their own (test situation; some other mods' own hullmods which do that), but couldn't get it to
not CTD if skills were added to the captain of a super-capital (as in, ship entry in ship_data.csv has the 'SHIP_WITH_MODULES' tag, and its .variant file has a 'modules' field).
Commenting out the following line prevents the CTD, but also won't show any added skills as the trade-off:
Global.getCombatEngine().getCombatUI().addMessage(1, ship.getFleetMember(), Misc.getPositiveHighlightColor(), ship.getName(), Misc.getTextColor(), "", Global.getSettings().getColor("standardTextColor"), "is skilled in "+text);
And clues on how to avert that, other than just commenting out said line?
EDIT: Added relevant crash data from starsector.log:
87564 [Thread-3] ERROR com.fs.starfarer.combat.CombatMain - java.lang.NullPointerException
java.lang.NullPointerException
at com.fs.starfarer.E.D.ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.super(Unknown Source)
at com.fs.starfarer.E.D.ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.<init>(Unknown Source)
at com.fs.starfarer.E.C.super(Unknown Source)
at com.fs.starfarer.combat.CombatState.addMessage(Unknown Source)
at data.missions.ed_showcasewurg.MissionDefinition$1.advance(MissionDefinition.java:174)
at com.fs.starfarer.title.Object.L$Oo.o00000(Unknown Source)
at com.fs.starfarer.combat.A.new.o00000(Unknown Source)
at com.fs.starfarer.combat.CombatEngine.advanceInner(Unknown Source)
at com.fs.starfarer.combat.CombatEngine.advance(Unknown Source)
at com.fs.starfarer.combat.CombatState.traverse(Unknown Source)
at com.fs.state.AppDriver.begin(Unknown Source)
at com.fs.starfarer.combat.CombatMain.main(Unknown Source)
at com.fs.starfarer.StarfarerLauncher.o00000(Unknown Source)
at com.fs.starfarer.StarfarerLauncher$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)