use of main.entity.Ref in project Eidolons by IDemiurge.
the class GuardRule method checkDefenderTakesAttack.
private static boolean checkDefenderTakesAttack(Attack attack, Unit guard) {
Ref ref = Ref.getCopy(attack.getRef());
ref.setTarget(guard.getId());
String success = StringMaster.getValueRef(KEYS.TARGET, PARAMS.INITIATIVE_MODIFIER) + "*(100+" + RollMaster.getVigilanceModifier(guard, attack.getAction()) + ")/100/3 ";
String fail = StringMaster.getValueRef(KEYS.SOURCE, PARAMS.INITIATIVE_MODIFIER) + "*(100+" + RollMaster.getDexterousModifier(guard, attack.getAction()) + ")/100/" + attack.getAction().getIntParam(PARAMS.AP_COST);
String log = " to defend " + attack.getAttackedUnit().getName() + " against " + attack.getAction().getName();
boolean result = !RollMaster.roll(ROLL_TYPES.REACTION, success, fail, ref, log);
return result;
}
use of main.entity.Ref in project Eidolons by IDemiurge.
the class CadenceRule method checkDualAttackCadence.
public static void checkDualAttackCadence(DC_UnitAction action, Unit unit) {
if (action.getActionGroup() != ActionEnums.ACTION_TYPE_GROUPS.ATTACK) {
return;
}
boolean singleCadence = checkSingleWeaponCadence(unit, action);
if (!UnitAnalyzer.checkDualWielding(unit) && !UnitAnalyzer.checkDualNaturalWeapons(unit) && !singleCadence) // || checkSingleCadence(action)
{
return;
}
Boolean offhand = null;
if (action.checkProperty(PROP, MAIN_HAND)) {
offhand = false;
} else if (action.checkProperty(PROP, OFF_HAND)) {
offhand = true;
} else if (singleCadence) // offhand = !action.isOffhand();
{
offhand = false;
}
if (offhand == null) {
return;
}
Ref ref = new Ref(unit.getGame(), unit.getId());
DC_WeaponObj weapon = unit.getActiveWeapon(offhand);
List<Obj> targets = new ArrayList<>();
if (unit.getWeapon(!offhand) != null) {
targets.add(unit.getWeapon(!offhand));
}
if (unit.getNaturalWeapon(!offhand) != null) {
targets.add(unit.getNaturalWeapon(!offhand));
}
GroupImpl group = new GroupImpl(targets);
LogMaster.log(LogMaster.RULES_DEBUG, "Cadence Rule applies to " + group);
ref.setGroup(group);
if (checkFocusBonusApplies(unit, action, singleCadence)) {
Integer amount = action.getOwnerObj().getIntParam(PARAMS.CADENCE_FOCUS_BOOST);
amount += action.getIntParam(PARAMS.CADENCE_FOCUS_BOOST);
amount += action.getOwnerObj().getActiveWeapon(!offhand).getIntParam(PARAMS.CADENCE_FOCUS_BOOST);
action.getOwnerObj().modifyParameter(PARAMS.C_FOCUS, amount, 100);
}
// INIT COST CADENCE EFFECTS
Effects effects = new Effects();
String cadence = unit.getParam(PARAMS.CADENCE_AP_MOD);
if (cadence.isEmpty()) {
cadence = DC_Formulas.DEFAULT_CADENCE_AP_MOD + "";
}
ModifyValueEffect valueEffect = new ModifyValueEffect(PARAMS.ATTACK_AP_PENALTY, MOD.MODIFY_BY_CONST, cadence);
valueEffect.appendFormulaByMod(100 + weapon.getIntParam(PARAMS.CADENCE_BONUS));
effects.add(valueEffect);
cadence = unit.getParam(PARAMS.CADENCE_STA_MOD);
if (cadence.isEmpty()) {
cadence = DC_Formulas.DEFAULT_CADENCE_STA_MOD + "";
}
valueEffect = new ModifyValueEffect(PARAMS.ATTACK_STA_PENALTY, MOD.MODIFY_BY_CONST, cadence);
valueEffect.appendFormulaByMod(100 + weapon.getIntParam(PARAMS.CADENCE_BONUS));
effects.add(valueEffect);
if (unit.getIntParam(PARAMS.CADENCE_DAMAGE_MOD) > 0) {
effects.add(new ModifyValueEffect(PARAMS.DAMAGE_MOD, MOD.MODIFY_BY_CONST, unit.getParam(PARAMS.CADENCE_DAMAGE_MOD)));
}
if (unit.getIntParam(PARAMS.CADENCE_ATTACK_MOD) > 0) {
effects.add(new ModifyValueEffect(PARAMS.ATTACK_MOD, MOD.MODIFY_BY_CONST, unit.getParam(PARAMS.CADENCE_ATTACK_MOD)));
}
String buffTypeName = (!offhand) ? buffTypeNameOffHand : buffTypeNameMainHand;
// ADD REMOVE TRIGGER
int percentage = 100 - unit.getIntParam(PARAMS.CADENCE_RETAINMENT_CHANCE) - action.getIntParam(PARAMS.CADENCE_RETAINMENT_CHANCE) - weapon.getIntParam(PARAMS.CADENCE_RETAINMENT_CHANCE);
Conditions conditions = new Conditions(new RefCondition(KEYS.EVENT_SOURCE, KEYS.SOURCE));
if (percentage != 100) {
conditions.add(new ChanceCondition(new Formula("" + percentage)));
}
effects.add(new AddTriggerEffect(STANDARD_EVENT_TYPE.UNIT_ACTION_COMPLETE, conditions, new ActiveAbility(new FixedTargeting(KEYS.BASIS), new RemoveBuffEffect(buffTypeName))));
// effect = new AddBuffEffect(buffTypeName, effects, DURATION);
// Condition condition = new StringComparison(StringMaster.getValueRef(KEYS.MATCH, PROP),
// (offhand) ? MAIN_HAND : OFF_HAND, false);
// retain condition - hero hasBuff()
// add remove trigger on attack? either off/main hand, so there is no
// stacking...
// linked buffs?
// effect.setIrresistible(false);
AddBuffEffect addBuffEffect = new AddBuffEffect(buffTypeName, // new TemplateAutoTargeting(AUTO_TARGETING_TEMPLATES.ACTIONS, condition),
effects, DURATION);
// preCheck perk
addBuffEffect.addEffect(new // what about
AddTriggerEffect(// counters/AoO?
STANDARD_EVENT_TYPE.UNIT_ACTION_COMPLETE, new RefCondition(KEYS.EVENT_SOURCE, KEYS.SOURCE), new ActiveAbility(new FixedTargeting(KEYS.SOURCE), new RemoveBuffEffect(buffTypeName))));
Integer param = unit.getIntParam(PARAMS.CADENCE_DEFENSE_MOD);
if (param != 0) {
addBuffEffect.addEffect(new ModifyValueEffect(PARAMS.DEFENSE_MOD, MOD.MODIFY_BY_CONST, "" + param));
}
addBuffEffect.setIrresistible(true);
addBuffEffect.apply(ref);
// TODO defense mod effect
}
use of main.entity.Ref in project Eidolons by IDemiurge.
the class StackingRule method actionMissed.
public static void actionMissed(DC_ActiveObj action) {
if (RuleMaster.isRuleOn(RULE.MISSED_ATTACK_REDIRECTION))
return;
Ref ref = action.getRef();
Obj target = ref.getTargetObj();
List<BattleFieldObject> units = action.getGame().getObjectsAt(action.getOwnerObj().getCoordinates());
units.addAll(action.getGame().getObjectsAt(target.getCoordinates()));
units.remove(action.getOwnerObj());
units.remove(target);
if (units.isEmpty()) {
return;
}
Map<BattleFieldObject, Integer> map = new HashMap<>();
for (BattleFieldObject unit : units) {
map.put(unit, unit.getIntParam(PARAMS.GIRTH));
}
BattleFieldObject randomTarget = new RandomWizard<BattleFieldObject>().getObjectByWeight(map);
ref.setTarget(randomTarget.getId());
// action.addProperty(G_PROPS.DYNAMIC_BOOLS,
// DYNAMIC_BOOLS.MISSED_ALREADY); //NO RESTRAINTS! :)
action.activatedOn(ref);
}
use of main.entity.Ref in project Eidolons by IDemiurge.
the class WatchRule method updateWatchStatus.
public void updateWatchStatus(Unit watcher) {
List<DC_Obj> list = getWatchersMap().get(watcher);
boolean invalid = false;
if (list != null) {
if (!checkValidWatcher(watcher)) {
invalid = true;
removeWatcher(watcher);
} else {
for (DC_Obj watched : list) {
if (!checkValidWatchTarget(watched)) {
breakWatch(watcher, watched);
break;
} else if (!checkValidWatchPairTarget(watcher, watched)) {
breakWatch(watcher, watched);
break;
}
}
}
}
BuffObj buff = watcher.getBuff("Watching", false);
if (buff != null) {
watcher.getGame().getManager().buffRemoved(buff);
}
if (!invalid) {
if (watcher.getMode().equals(STD_MODES.ALERT)) {
Ref ref = watcher.getRef().getCopy();
try {
SpectrumEffect spectrumEffect = new SpectrumEffect(new OwnershipCondition(true, "match", "source"), new WatchActionEffect(true));
spectrumEffect.setRangeFormula(StringMaster.getValueRef(KEYS.SOURCE, PARAMS.SIGHT_RANGE));
// for now...
spectrumEffect.setApplyThrough(false);
spectrumEffect.apply(ref);
watcher.getBuff(STD_MODES.ALERT.getBuffName(), false).setOnDispelEffects(new RemoveBuffEffect("Watching ", false));
} catch (Exception e) {
main.system.ExceptionMaster.printStackTrace(e);
}
}
}
list = getWatchersMap().get(watcher);
if (ListMaster.isNotEmpty(list)) // TODO alert???
{
getWatchBuffEffect(watcher, list).apply(Ref.getSelfTargetingRefCopy(watcher));
}
}
use of main.entity.Ref in project Eidolons by IDemiurge.
the class DC_BuffRule method apply.
public boolean apply(Obj obj) {
target = (Unit) obj;
Ref ref = obj.getRef().getCopy();
ref.setMatch(obj.getId());
ref.setTarget(obj.getId());
ref.setBasis(obj.getId());
if (!check(obj)) {
return false;
}
// checkLogged(obj);
for (String buffName : getBuffNames()) {
BuffObj buff = obj.getBuff(buffName);
if (buff != null) {
// logged = false;
buff.kill();
}
}
if (getBuffConditions().preCheck(ref)) {
if (checkBuffLevel(ref)) {
if (checkLogged(obj)) {
log(obj);
}
apply(ref);
}
}
return true;
}
Aggregations