1package com.fs.starfarer.api.combat;
3import java.util.HashMap;
4import java.util.LinkedHashMap;
6import com.fs.starfarer.api.combat.MutableStat.StatMod;
7import com.fs.starfarer.api.combat.MutableStat.StatModType;
18 if (
this == obj)
return true;
19 if (obj ==
null)
return false;
20 if (getClass() != obj.getClass())
return false;
23 if (Float.floatToIntBits(
flatBonus) != Float.floatToIntBits(other.
flatBonus))
return false;
24 if (needsRecompute != other.needsRecompute)
return false;
26 if (Float.floatToIntBits(
mult) != Float.floatToIntBits(other.
mult))
return false;
28 if (flatBonuses ==
null) {
29 if (other.flatBonuses !=
null)
return false;
31 if (flatBonuses.size() != other.flatBonuses.size())
return false;
32 for (String key : flatBonuses.keySet()) {
33 if (!other.flatBonuses.containsKey(key))
return false;
34 StatMod mod = flatBonuses.get(key);
35 StatMod otherMod = other.flatBonuses.get(key);
36 if (!mod.source.equals(otherMod.source))
return false;
37 if (Float.floatToIntBits(mod.value) != Float.floatToIntBits(otherMod.value))
return false;
41 if (multBonuses ==
null) {
42 if (other.multBonuses !=
null)
return false;
43 }
else if (!multBonuses.equals(other.multBonuses)) {
44 if (multBonuses.size() != other.multBonuses.size())
return false;
45 for (String key : multBonuses.keySet()) {
46 if (!other.multBonuses.containsKey(key))
return false;
47 StatMod mod = multBonuses.get(key);
48 StatMod otherMod = other.multBonuses.get(key);
49 if (!mod.source.equals(otherMod.source))
return false;
50 if (Float.floatToIntBits(mod.value) != Float.floatToIntBits(otherMod.value))
return false;
54 if (percentBonuses ==
null) {
55 if (other.percentBonuses !=
null)
return false;
56 }
else if (!percentBonuses.equals(other.percentBonuses)) {
57 if (percentBonuses.size() != other.percentBonuses.size())
return false;
58 for (String key : percentBonuses.keySet()) {
59 if (!other.percentBonuses.containsKey(key))
return false;
60 StatMod mod = percentBonuses.get(key);
61 StatMod otherMod = other.percentBonuses.get(key);
62 if (!mod.source.equals(otherMod.source))
return false;
63 if (Float.floatToIntBits(mod.value) != Float.floatToIntBits(otherMod.value))
return false;
82 private LinkedHashMap<String, StatMod> flatBonuses;
83 private LinkedHashMap<String, StatMod> percentBonuses;
84 private LinkedHashMap<String, StatMod> multBonuses;
86 private boolean needsRecompute =
false;
90 Object readResolve() {
91 if (flatBonuses ==
null) {
92 flatBonuses =
new LinkedHashMap<String, StatMod>();
94 if (percentBonuses ==
null) {
95 percentBonuses =
new LinkedHashMap<String, StatMod>();
97 if (multBonuses ==
null) {
98 multBonuses =
new LinkedHashMap<String, StatMod>();
124 public void modifyFlat(String source,
float value, String desc) {
126 if (mod ==
null && value == 0)
return;
127 if (mod !=
null && mod.value == value) {
132 mod =
new StatMod(source, StatModType.FLAT, value, desc);
134 needsRecompute =
true;
143 if (mod ==
null && value == 0)
return;
144 if (mod !=
null && mod.value == value) {
149 mod =
new StatMod(source, StatModType.PERCENT, value, desc);
151 needsRecompute =
true;
155 StatMod mod =
new StatMod(source, StatModType.PERCENT, value, desc);
157 needsRecompute =
true;
163 public void modifyMult(String source,
float value, String desc) {
165 if (mod ==
null && value == 1)
return;
166 if (mod !=
null && mod.value == value) {
171 mod =
new StatMod(source, StatModType.MULT, value, desc);
173 needsRecompute =
true;
177 StatMod mod =
new StatMod(source, StatModType.MULT, value, desc);
179 needsRecompute =
true;
183 StatMod mod =
new StatMod(source, StatModType.FLAT, value, desc);
185 needsRecompute =
true;
189 if (flatBonuses !=
null) flatBonuses.clear();
190 if (percentBonuses !=
null) percentBonuses.clear();
191 if (multBonuses !=
null) multBonuses.clear();
192 needsRecompute =
true;
196 if (flatBonuses !=
null) {
197 StatMod mod = flatBonuses.remove(source);
198 if (mod !=
null && mod.value != 0) needsRecompute =
true;
200 if (percentBonuses !=
null) {
201 StatMod mod = percentBonuses.remove(source);
202 if (mod !=
null && mod.value != 0) needsRecompute =
true;
205 if (multBonuses !=
null) {
206 StatMod mod = multBonuses.remove(source);
207 if (mod !=
null && mod.value != 1) needsRecompute =
true;
212 if (flatBonuses ==
null)
return;
213 StatMod mod = flatBonuses.remove(source);
214 if (mod !=
null && mod.value != 0) needsRecompute =
true;
218 if (percentBonuses ==
null)
return;
219 StatMod mod = percentBonuses.remove(source);
220 if (mod !=
null && mod.value != 0) needsRecompute =
true;
224 if (multBonuses ==
null)
return;
225 StatMod mod = multBonuses.remove(source);
226 if (mod !=
null && mod.value != 1) needsRecompute =
true;
229 private void recompute() {
231 float multBonus = 1f;
233 if (percentBonuses !=
null) {
234 for (StatMod mod : percentBonuses.values()) {
239 if (flatBonuses !=
null) {
240 for (StatMod mod : flatBonuses.values()) {
241 flatMod += mod.value;
245 if (multBonuses !=
null) {
246 for (StatMod mod : multBonuses.values()) {
247 multBonus *= mod.value;
256 needsRecompute =
false;
260 if (needsRecompute) recompute();
266 if (needsRecompute) recompute();
275 if (needsRecompute) recompute();
280 if (needsRecompute) recompute();
285 if (needsRecompute) recompute();
298 if (flatBonuses ==
null) {
299 flatBonuses =
new LinkedHashMap<String, StatMod>();
305 if (percentBonuses ==
null) {
306 percentBonuses =
new LinkedHashMap<String, StatMod>();
308 return percentBonuses;
312 if (multBonuses ==
null) {
313 multBonuses =
new LinkedHashMap<String, StatMod>();
322 needsRecompute =
true;
329 needsRecompute =
true;
HashMap< String, StatMod > getPercentMods()
HashMap< String, StatMod > getFlatMods()
HashMap< String, StatMod > getMultMods()
void applyMods(StatBonus other)
void modifyMult(String source, float value)
HashMap< String, StatMod > getFlatBonuses()
HashMap< String, StatMod > getMultBonuses()
StatMod getMultBonus(String source)
void unmodify(String source)
void applyMods(MutableStat other)
StatMod getFlatBonus(String source)
void modifyMultAlways(String source, float value, String desc)
void modifyPercent(String source, float value, String desc)
void modifyPercentAlways(String source, float value, String desc)
void modifyPercent(String source, float value)
boolean equals(Object obj)
void unmodifyMult(String source)
void modifyFlatAlways(String source, float value, String desc)
void modifyMult(String source, float value, String desc)
HashMap< String, StatMod > getPercentBonuses()
void unmodifyPercent(String source)
void modifyFlat(String source, float value)
void modifyFlat(String source, float value, String desc)
boolean isNegative(float baseValue)
boolean isPositive(float baseValue)
float computeEffective(float baseValue)
StatMod getPercentBonus(String source)
void unmodifyFlat(String source)