39 public static class FactionTradeRepData {
42 public float [] getRepPointsAndVolumeUsedFor(
float volume) {
49 while (volume >= currVolumePerPoint) {
51 used += currVolumePerPoint;
52 volume -= currVolumePerPoint;
54 if (currVolumePerPoint < max) currVolumePerPoint += incr;
55 if (currVolumePerPoint > max) currVolumePerPoint = max;
57 return new float [] {points, used};
64 private Map<String, FactionTradeRepData> repData =
new HashMap<String, FactionTradeRepData>();
71 Object readResolve() {
72 if (repDecayTracker ==
null) {
75 if (tracker ==
null) {
88 data =
new FactionTradeRepData();
91 return data.getRepPointsAndVolumeUsedFor(volume);
101 if (tracker.intervalElapsed()) {
106 checkForTradeReputationChanges(
faction);
119 private void checkForXPGain() {
131 public static class MarketTradeInfo {
133 public float tradeTotal;
134 public float smugglingTotal;
138 float playerTradeVolume = 0;
139 float playerSmugglingVolume = 0;
141 final List<MarketTradeInfo> info =
new ArrayList<MarketTradeInfo>();
151 MarketTradeInfo curr =
new MarketTradeInfo();
155 SubmarketPlugin plugin = submarket.getPlugin();
156 if (!plugin.isParticipatesInEconomy())
continue;
160 PlayerTradeDataForSubmarket tradeData = SharedData.getData().getPlayerActivityTracker().getPlayerTradeData(submarket);
164 curr.smugglingTotal += tradeData.getAccumulatedPlayerTradeValueForNegative();
165 }
else if (submarket.getFaction() ==
faction) {
166 curr.tradeTotal += tradeData.getAccumulatedPlayerTradeValueForPositive();
171 if (curr.tradeTotal == 0 && curr.smugglingTotal == 0)
continue;
175 playerTradeVolume += curr.tradeTotal;
176 playerSmugglingVolume += curr.smugglingTotal;
183 float [] repPlus = getRepPointsAndVolumeUsedFor(playerTradeVolume,
faction);
184 float [] repMinus = getRepPointsAndVolumeUsedFor(playerSmugglingVolume,
faction);
185 final float repChange = repPlus[0] - repMinus[0];
187 if (Math.abs(repChange) < 1) {
194 float tradeUsed = repPlus[1];
195 float smugglingUsed = repMinus[1];
198 for (MarketAPI
market : Global.getSector().getEconomy().getMarketsCopy()) {
201 SubmarketPlugin plugin = submarket.getPlugin();
202 if (!plugin.isParticipatesInEconomy())
continue;
208 PlayerTradeDataForSubmarket tradeData = SharedData.getData().getPlayerActivityTracker().getPlayerTradeData(submarket);
211 if (playerSmugglingVolume > 0 &&
market.
getFaction() ==
faction && (submarket.getFaction().isHostileTo(
faction) || submarket.getPlugin().isBlackMarket())) {
212 float value = tradeData.getAccumulatedPlayerTradeValueForNegative();
213 tradeData.setAccumulatedPlayerTradeValueForNegative(value - smugglingUsed * value / playerSmugglingVolume);
214 }
else if (playerTradeVolume > 0 && submarket.getFaction() ==
faction) {
215 float value = tradeData.getAccumulatedPlayerTradeValueForPositive();
216 tradeData.setAccumulatedPlayerTradeValueForPositive(value - tradeUsed * value / playerTradeVolume);
222 CampaignFleetAPI playerFleet = Global.getSector().getPlayerFleet();
225 Collections.sort(info,
new Comparator<MarketTradeInfo>() {
226 public int compare(MarketTradeInfo o1, MarketTradeInfo o2) {
227 return (
int) (o2.tradeTotal - o1.tradeTotal);
231 RepActions action = RepActions.TRADE_EFFECT;
232 Global.getSector().adjustPlayerReputation(
233 new RepActionEnvelope(action,
new Float(Math.abs(repChange)),
null,
null,
false,
true,
"Change caused by trade with faction"),
237 }
else if (repChange < 0) {
238 Collections.sort(info,
new Comparator<MarketTradeInfo>() {
239 public int compare(MarketTradeInfo o1, MarketTradeInfo o2) {
240 return (
int) (o2.smugglingTotal - o1.smugglingTotal);
244 RepActions action = RepActions.SMUGGLING_EFFECT;
246 Global.getSector().adjustPlayerReputation(
247 new RepActionEnvelope(action,
new Float(Math.abs(repChange)),
null,
null,
false,
true,
"Change caused by black-market trade"),
259 for (
final MarketTradeInfo curr : info) {
260 float actionableTotal = curr.tradeTotal * 2f + curr.smugglingTotal * 0.5f;
263 Collections.shuffle(factions);
283 if (other ==
null)
continue;
290 float [] repMinus = getRepPointsAndVolumeUsedFor(actionableTotal,
faction);
291 if (repMinus[0] <= 0)
continue;
297 final float repChange = -repMinus[0];
300 " due to trade with enemy (" + curr.market.getFaction().getDisplayNameWithArticle() +
")");
302 RepActions action = RepActions.TRADE_WITH_ENEMY;
304 new RepActionEnvelope(action,
new Float(Math.abs(repChange)),
null,
null,
false,
true,
"Change caused by trade with enemies"),
308 if (sent >= maxToSend)
break;
310 if (sent >= maxToSend)
break;