You can now cast more than one placed spell at a time (for any type of placed spell, not just portals)

This commit is contained in:
Sollace 2022-09-16 22:13:55 +02:00
parent ab017ded6e
commit 0250d8875a
3 changed files with 17 additions and 6 deletions

View file

@ -106,7 +106,9 @@ public class UnicornCastingAbility implements Ability<Hit> {
if (newSpell.getResult() != ActionResult.FAIL) {
CustomisedSpellType<?> spell = newSpell.getValue();
boolean removed = player.getSpellSlot().removeIf(spell.isEmpty() ? spell : SpellType.PORTAL.negate().and(spell), true);
boolean removed = player.getSpellSlot().removeWhere(s -> {
return s.findMatches(spell).findAny().isPresent() && (spell.isEmpty() || !SpellType.PLACED_SPELL.test(s));
}, true);
player.subtractEnergyCost(removed ? 2 : 4);
if (!removed) {
Spell s = spell.apply(player);

View file

@ -40,11 +40,20 @@ public interface SpellContainer {
void put(@Nullable Spell effect);
/**
* Removes all matching active effects.
* Removes all active effects that match or contain a matching effect.
*
* @return True if the collection was changed
*/
boolean removeIf(Predicate<Spell> test, boolean update);
default boolean removeIf(Predicate<Spell> test, boolean update) {
return removeWhere(spell -> spell.findMatches(test).findFirst().isPresent(), update);
}
/**
* Removes all matching top level active effects.
*
* @return True if the collection was changed
*/
boolean removeWhere(Predicate<Spell> test, boolean update);
/**
* Iterates active spells and optionally removes matching ones.

View file

@ -66,9 +66,9 @@ public class EffectSync implements SpellContainer {
}
@Override
public boolean removeIf(Predicate<Spell> test, boolean update) {
public boolean removeWhere(Predicate<Spell> test, boolean update) {
return reduce((initial, effect) -> {
if (!effect.findMatches(test).findFirst().isPresent()) {
if (!test.test(effect)) {
return initial;
}
spells.removeReference(effect);
@ -140,6 +140,6 @@ public class EffectSync implements SpellContainer {
}
private interface Alteration {
boolean apply(boolean initial, Spell item);
boolean apply(boolean initial, Spell spell);
}
}