Skip to content

Commit

Permalink
Reduce increase S-mod limit XP scaling from 2.5 to 2.25, include vari…
Browse files Browse the repository at this point in the history
…ants in DP cost penalty
  • Loading branch information
qcwxezda committed May 12, 2023
1 parent 5d191bd commit f73d6c4
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 16 deletions.
4 changes: 2 additions & 2 deletions src/progsmod/data/campaign/NPCFleetSModTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.fs.starfarer.api.campaign.*;
import com.fs.starfarer.api.fleet.FleetMemberAPI;
import com.fs.starfarer.api.util.Misc;
import util.SModUtils;

/** Tracks every fleet that's generated and adds an XP tracker to any ships that are over the normal S-mod limit, in order
* to apply the same DP cost penalty that the player faces. */
Expand All @@ -24,9 +25,8 @@ private void addXPTrackerToSModdedShips(CampaignFleetAPI fleet) {
return;
}
for (FleetMemberAPI fm : fleet.getBattle().getCombinedTwo().getMembersWithFightersCopy()) {
int baseSMods = Misc.getMaxPermanentMods(fm, fleet.getCommanderStats());
if (!fm.isFighterWing() && fm.getVariant() != null) {
int numOverLimit = fm.getVariant().getSMods().size() - baseSMods;
int numOverLimit = SModUtils.getSModsOverLimitIncludeModules(fm.getVariant(), fm.getStats());
if (numOverLimit > 0 && !fm.getVariant().hasHullMod("progsmod_xptracker")) {
fm.getVariant().addPermaMod("progsmod_xptracker", false);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public boolean execute(String ruleId, final InteractionDialogAPI dialog, List<To

// Add options to select ship modules
List<ShipVariantAPI> modulesWithOP = SModUtils.getModuleVariantsWithOP(fleetMember.getVariant());
if (modulesWithOP != null && !modulesWithOP.isEmpty()) {
if (!modulesWithOP.isEmpty()) {
dialog.getOptionPanel().addOption("Manage built-in hull mods for a different module", moduleOption);
}

Expand Down
2 changes: 1 addition & 1 deletion src/progsmod/data/campaign/rulecmd/PSM_SelectModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ public boolean execute(final String ruleId, final InteractionDialogAPI dialog, f
ShipVariantAPI selectedVariant = (ShipVariantAPI) memoryMap.get(MemKeys.LOCAL).get(params.get(1).string);
final List<ShipVariantAPI> modulesWithOP = SModUtils.getModuleVariantsWithOP(fleetMember.getVariant());

if (modulesWithOP == null) {
if (modulesWithOP.isEmpty()) {
return false;
}

Expand Down
17 changes: 8 additions & 9 deletions src/progsmod/data/hullmods/XPTracker.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@
import com.fs.starfarer.api.combat.MutableShipStatsAPI;
import com.fs.starfarer.api.combat.ShipAPI;
import com.fs.starfarer.api.combat.ShipAPI.HullSize;
import com.fs.starfarer.api.combat.ShipVariantAPI;
import com.fs.starfarer.api.impl.campaign.ids.Stats;
import com.fs.starfarer.api.ui.TooltipMakerAPI;
import com.fs.starfarer.api.util.Misc;

import util.SModUtils;

import java.util.List;

public class XPTracker extends BaseHullMod {
@Override
public String getDescriptionParam(int index, HullSize hullSize, ShipAPI ship) {
Expand All @@ -22,9 +25,10 @@ public String getDescriptionParam(int index, HullSize hullSize, ShipAPI ship) {

@Override
public void applyEffectsBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) {
if (SModUtils.Constants.DISABLE_MOD) return;
ShipVariantAPI variant = stats.getVariant();
if (SModUtils.Constants.DISABLE_MOD || SModUtils.Constants.DEPLOYMENT_COST_PENALTY <= 0f || variant == null) return;

int sModsOverLimit = getSModsOverLimit(stats);
int sModsOverLimit = SModUtils.getSModsOverLimitIncludeModules(variant, stats);

if (sModsOverLimit > 0) {
int dpMod = computeDPModifier(stats, sModsOverLimit);
Expand All @@ -34,8 +38,8 @@ public void applyEffectsBeforeShipCreation(HullSize hullSize, MutableShipStatsAP

@Override
public void addPostDescriptionSection(TooltipMakerAPI tooltip, HullSize hullSize, final ShipAPI ship, float width, boolean isForModSpec) {
if (ship == null || ship.getMutableStats() == null) return;
int sModsOverLimit = getSModsOverLimit(ship.getMutableStats());
if (ship == null || ship.getMutableStats() == null || ship.getVariant() == null) return;
int sModsOverLimit = SModUtils.getSModsOverLimitIncludeModules(ship.getVariant(), ship.getMutableStats());
int dpMod = computeDPModifier(ship.getMutableStats(), sModsOverLimit);
if (dpMod > 0) {
tooltip.addPara("Deployment point cost increased by %s due to the presence of additional S-mods over the standard limit.",
Expand All @@ -46,11 +50,6 @@ public void addPostDescriptionSection(TooltipMakerAPI tooltip, HullSize hullSize
}
}

private int getSModsOverLimit(MutableShipStatsAPI stats) {
if (stats == null || stats.getVariant() == null || spec == null) return 0;
return Math.max(0, stats.getVariant().getSMods().size() - SModUtils.getBaseSMods(stats));
}

private int computeDPModifier(MutableShipStatsAPI stats, int sModsOverLimit) {
if (stats == null || stats.getFleetMember() == null) return 0;

Expand Down
4 changes: 3 additions & 1 deletion src/progsmod/plugin/ProgSMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ public void onGameLoad(boolean newGame) {
listeners.addListener(new RefitTabListenerAndScript(), true);
}

Global.getSector().addTransientListener(new NPCFleetSModTracker(false));
if (SModUtils.Constants.DEPLOYMENT_COST_PENALTY > 0f) {
Global.getSector().addTransientListener(new NPCFleetSModTracker(false));
}
Global.getSector().addTransientListener(new EngagementListener(false));
Global.getSector().addTransientScript(new RefitTabListenerAndScript());
}
Expand Down
21 changes: 19 additions & 2 deletions src/util/SModUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -668,10 +668,10 @@ public static void addPostBattleXPGainToDialog(InteractionDialogAPI dialog, List

/** Returns a list of the module variants of a base variant that have positive OP. */
public static List<ShipVariantAPI> getModuleVariantsWithOP(ShipVariantAPI base) {
List<ShipVariantAPI> withOP = new ArrayList<>();
if (base.getModuleSlots() == null) {
return null;
return withOP;
}
List<ShipVariantAPI> withOP = new ArrayList<>();
for (int i = 0; i < base.getModuleSlots().size(); i++) {
ShipVariantAPI moduleVariant = base.getModuleVariant(base.getModuleSlots().get(i));
if (moduleVariant.getHullSpec().getOrdnancePoints(null) <= 0) {
Expand All @@ -682,6 +682,23 @@ public static List<ShipVariantAPI> getModuleVariantsWithOP(ShipVariantAPI base)
return withOP;
}

public static int getSModsOverLimit(ShipVariantAPI variant, MutableShipStatsAPI stats) {
if (variant == null) return 0;
return Math.max(0, variant.getSMods().size() - SModUtils.getBaseSMods(stats));
}

/** Computes maximum number of S-mods over the limit out of the variant and all of its module variants */
public static int getSModsOverLimitIncludeModules(ShipVariantAPI variant, MutableShipStatsAPI stats) {
int sModsOverLimit = getSModsOverLimit(variant, stats);

List<ShipVariantAPI> modules = SModUtils.getModuleVariantsWithOP(variant);
for (ShipVariantAPI module : modules) {
sModsOverLimit = Math.max(sModsOverLimit, getSModsOverLimit(module, stats));
}

return sModsOverLimit;
}

public static String shortenText(String text, LabelAPI label) {
if (text == null) {
return null;
Expand Down

0 comments on commit f73d6c4

Please sign in to comment.