use of eidolons.ability.effects.oneshot.mechanic.DrainEffect in project Eidolons by IDemiurge.
the class PriorityManagerImpl method getParamModSpellPriority.
@Override
public int getParamModSpellPriority(Action action, Boolean buff) {
DC_ActiveObj spell = action.getActive();
DC_Obj target = action.getTarget();
if (buff == null) {
buff = EffectFinder.check(spell.getAbilities(), AddBuffEffect.class);
}
if (buff) {
if (!spell.checkBool(GenericEnums.STD_BOOLS.STACKING)) {
try {
List<ObjType> buffsFromSpell = BuffMaster.getBuffsFromSpell(spell);
if (buffsFromSpell.isEmpty()) {
priority = 0;
return 0;
}
ObjType objType = buffsFromSpell.get(0);
if (!objType.checkBool(GenericEnums.STD_BOOLS.STACKING)) {
if (target.hasBuff(objType.getName())) {
priority = 0;
return 0;
}
}
} catch (Exception e) {
}
}
}
int priority = (getUnitPriority(target, false));
boolean ally = target.getOwner().equals(getUnit().getOwner());
// boolean mod = EffectMaster.preCheck(spell.getAbilities(),
// ModifyValueEffect.class);
List<Effect> effects = EffectFinder.getEffectsOfClass(spell.getAbilities(), (buff) ? AddBuffEffect.class : ModifyValueEffect.class);
if (buff) {
List<Effect> list = new ArrayList<>();
for (Effect e : effects) {
list.addAll(EffectFinder.getBuffEffects(e, ModifyValueEffect.class));
}
// TODO count the duration from buffEffect
effects = list;
}
initRollMap(spell, effects);
boolean valid = false;
for (Effect e : effects) {
ModifyValueEffect valueEffect = (ModifyValueEffect) e;
for (String sparam : StringMaster.open(valueEffect.getParamString())) {
for (PARAMETER param : DC_ContentManager.getParams(sparam)) {
// TODO apply generic fix!
if (param == PARAMS.C_INITIATIVE_BONUS)
param = PARAMS.C_INITIATIVE;
if (TextParser.checkHasValueRefs(valueEffect.getFormula().toString())) {
String parsed = TextParser.parse(valueEffect.getFormula().toString(), action.getRef(), TextParser.ACTIVE_PARSING_CODE);
parsed = TextParser.replaceCodes(parsed);
valueEffect.setFormula(new Formula(parsed));
}
int amount = valueEffect.getFormula().getInt(action.getRef());
if (valueEffect.getMod_type() == MOD.MODIFY_BY_PERCENT) {
amount = MathMaster.getFractionValueCentimal(target.getIntParam(param, valueEffect.getFormula().toString().contains(StringMaster.BASE_CHAR)), amount);
}
boolean drain = (e instanceof DrainEffect);
int final_value = target.getIntParam(param) + amount;
int min_max = valueEffect.initMinMaxAmount(target, amount);
if (min_max != Integer.MAX_VALUE && min_max != Integer.MIN_VALUE) {
if (amount >= 0) {
if (final_value > min_max) {
amount = min_max - target.getIntParam(param);
}
} else {
if (amount < min_max) {
amount = target.getIntParam(param) - min_max;
}
}
}
if (!ally && !drain) {
amount = -amount;
}
priority = (int) (priority * getParamModFactor(target, e, param, amount));
if (drain) {
// TODO limit the amount!
priority = (int) (priority * getParamModFactor(getUnit(), null, param, amount));
}
}
}
if (!buff) {
if (!ally && valid) {
applyResistPenalty(action);
}
} else {
priority = priority * (getDurationMultiplier(action)) / 100;
}
}
if (!valid) {
return 0;
// applyMultiplier(0, "Empty");
}
return priority;
}
Aggregations