Starsector API
Loading...
Searching...
No Matches
ShipQuality.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.campaign.econ.impl;
2
3import java.util.HashMap;
4import java.util.Map;
5
6import com.fs.starfarer.api.Global;
7import com.fs.starfarer.api.campaign.FactionAPI;
8import com.fs.starfarer.api.campaign.econ.CommodityOnMarketAPI;
9import com.fs.starfarer.api.campaign.econ.EconomyAPI.EconomyUpdateListener;
10import com.fs.starfarer.api.campaign.econ.MarketAPI;
11import com.fs.starfarer.api.combat.StatBonus;
12import com.fs.starfarer.api.impl.campaign.ids.Commodities;
13import com.fs.starfarer.api.impl.campaign.ids.Stats;
14
15public class ShipQuality implements EconomyUpdateListener {
16
17 public static final String KEY = "$core_shipQualityManager";
18
19 public static ShipQuality getInstance() {
20 Object test = Global.getSector().getMemoryWithoutUpdate().get(KEY);
21 if (test == null) {
22 test = new ShipQuality();
23 Global.getSector().getMemoryWithoutUpdate().set(KEY, test);
24 }
25 return (ShipQuality) test;
26 }
27
28
29 public static class QualityData {
30 public String econGroup;
31 public FactionAPI faction;
32 public StatBonus quality = new StatBonus();
33
34
35 public MarketAPI market;
36 public int prod;
37 public float qMod = 0f;
38 public QualityData(String econGroup, FactionAPI faction) {
39 this.econGroup = econGroup;
40 this.faction = faction;
41 }
42 }
43
44 protected transient Map<String, QualityData> data = new HashMap<String, QualityData>();
45
46 protected Object readResolve() {
47 data = new HashMap<String, QualityData>();
48 return this;
49 }
50
51 public ShipQuality() {
52 Global.getSector().getEconomy().addUpdateListener(this);
53 }
54
55 public String getKey(MarketAPI market) {
56 return market.getFactionId() + "_" + market.getEconGroup();
57 }
58
59 public void economyUpdated() {
60 // use highest in-faction export, tie-break with quality
61 // need to consider different econ groups separately CommodityMarketDataAPI
62 // even a ship production of 1 unit in-faction is enough
63 // to get in-faction rather than imported hulls and quality
64
65 data.clear();
66
67 for (MarketAPI market : Global.getSector().getEconomy().getMarketsCopy()) {
68// if (market.getName().equals("Stral")) {
69// System.out.println("wefwef");
70// }
71
72 QualityData d = getQualityData(market);
73
74 CommodityOnMarketAPI com = market.getCommodityData(Commodities.SHIPS);
75 int prod = Math.min(com.getAvailable(), com.getMaxSupply());
76// if (com.getCommodityMarketData() == null) {
77// System.out.println("wfwefew");
78// }
79// if (market.isPlayerOwned()) {
80// System.out.println("wefwefwe");
81// }
82// if (market.getName().contains("Kapteyn")) {
83// System.out.println("wefwefwe");
84// }
85 int inFactionShipping = com.getCommodityMarketData().getMaxShipping(market, true);
86 prod = Math.min(prod, inFactionShipping);
87 prod = Math.max(Math.min(com.getAvailable(), com.getMaxSupply()), prod);
88 if (prod >= d.prod && prod > 0) {
89 float q = market.getStats().getDynamic().getMod(Stats.PRODUCTION_QUALITY_MOD).computeEffective(0f);
90 if (q >= d.qMod || prod > d.prod) {
91 d.prod = prod;
92 d.qMod = q;
93 d.market = market;
94 d.quality = market.getStats().getDynamic().getMod(Stats.PRODUCTION_QUALITY_MOD);
95 }
96 }
97 }
98 }
99
100 public static float IMPORT_PENALTY = Global.getSettings().getFloat("qualityPenaltyForImports");
101
102 public QualityData getQualityData(MarketAPI market) {
103 String key = getKey(market);
104 QualityData d = data.get(key);
105 if (d == null) {
106// if (market.getName().equals("Rosas")) {
107// System.out.println("wefwef");
108// }
109 d = new QualityData(market.getEconGroup(), market.getFaction());
110 if (!market.isHidden()) {
111 d.quality.modifyFlat("no_prod_penalty", IMPORT_PENALTY, "Cross-faction imports");
112 }
113 //d.market = market; // doesn't matter which market, just needs to have a market to show up in tooltip
114 d.prod = -1;
115 d.qMod = -1;
116 data.put(key, d);
117 }
118 return d;
119 }
120
121 public void commodityUpdated(String commodityId) {
122
123 }
124
125 public boolean isEconomyListenerExpired() {
126 return false;
127 }
128
129
130 public static float getShipQuality(MarketAPI market, String factionId) {
131 float quality = 0f;
132
133 if (market != null) {
134 QualityData d = getInstance().getQualityData(market);
135 quality = d.quality.computeEffective(0f);
136 quality += market.getStats().getDynamic().getMod(Stats.FLEET_QUALITY_MOD).computeEffective(0f);
137 }
138
139 if (factionId != null) {
140 if (market != null) {
141 quality -= market.getFaction().getDoctrine().getShipQualityContribution();
142 }
143 quality += Global.getSector().getFaction(factionId).getDoctrine().getShipQualityContribution();
144 }
145
146 return quality;
147 }
148}
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
static SettingsAPI getSettings()
Definition Global.java:51
static SectorAPI getSector()
Definition Global.java:59
static float getShipQuality(MarketAPI market, String factionId)