dies triggers improves:

* tests: added additional tests and verify/runtime checks for wrong die trigger settings;
* refactor: removed some usage of short LKI ;
* fixed dies events support in "or trigger" and "conditional trigger" (use cases like sacrifice cost);
* fixed dies events support in shared triggered abilities (use cases like sacrifice cost);
This commit is contained in:
Oleg Agafonov 2024-11-04 23:55:14 +04:00
parent a2ed52b8de
commit 66b338c6fc
18 changed files with 233 additions and 63 deletions

View file

@ -1,5 +1,6 @@
package mage.abilities.meta;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.TriggeredAbility;
import mage.abilities.TriggeredAbilityImpl;
@ -10,10 +11,7 @@ import mage.game.events.GameEvent;
import mage.util.CardUtil;
import mage.watchers.Watcher;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -46,6 +44,10 @@ public class OrTriggeredAbility extends TriggeredAbilityImpl {
for(Watcher watcher : ability.getWatchers()) {
super.addWatcher(watcher);
}
if (ability.isLeavesTheBattlefieldTrigger()) {
this.setLeavesTheBattlefieldTrigger(true);
}
}
setTriggerPhrase(generateTriggerPhrase());
}
@ -123,4 +125,19 @@ public class OrTriggeredAbility extends TriggeredAbilityImpl {
ability.addWatcher(watcher);
}
}
@Override
public boolean isInUseableZone(Game game, MageObject source, GameEvent event) {
boolean res = false;
for (TriggeredAbility ability : triggeredAbilities) {
// TODO: call full inner trigger instead like ability.isInUseableZone()?! Need research why it fails
if (ability.isLeavesTheBattlefieldTrigger()) {
// TODO: leaves battlefield and die are not same! Is it possible make a diff logic?
res |= TriggeredAbilityImpl.isInUseableZoneDiesTrigger(this, event, game);
} else {
res |= super.isInUseableZone(game, source, event);
}
}
return res;
}
}