From 8ae396ed4600651c317f5ca622cf470c8959989d Mon Sep 17 00:00:00 2001 From: Cees Timmerman Date: Sun, 10 Aug 2025 19:39:58 +0200 Subject: [PATCH] Don't search library while opponent controls Ob Nixilis, Unshackled (#8346) --- .../java/forge/ai/ability/ChangeZoneAi.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 6dc6a606b5e..f20bc53f91a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -22,7 +22,10 @@ import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; +import forge.game.staticability.StaticAbility; import forge.game.staticability.StaticAbilityMustTarget; +import forge.game.trigger.Trigger; +import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.util.Aggregates; import forge.util.MyRandom; @@ -346,7 +349,28 @@ private static AiAbilityDecision hiddenOriginCanPlayAI(final Player ai, final Sp return true; }); } - // TODO: prevent ai searching its own library when Ob Nixilis, Unshackled is in play + + // Searching own library + if (p == ai && origin != null && origin.size() == 1 && origin.get(0).equals(ZoneType.Library)) { + for (final Player op : ai.getOpponents()) { + for (Card c : op.getCardsIn(ZoneType.Battlefield)) { + // Ob Nixilis, Unshackled + for (Trigger trigger : c.getTriggers()) { + if (TriggerType.SearchedLibrary.equals(trigger.getMode()) + && "TrigSac".equals(trigger.getParam("Execute"))) { + return new AiAbilityDecision(0, AiPlayDecision.CantPlayAi); + } + } + // Opposition Agent + for (StaticAbility stAb : c.getStaticAbilities()) { + if ("You".equals(stAb.getParam("ControlOpponentsSearchingLibrary"))) { + return new AiAbilityDecision(0, AiPlayDecision.CantPlayAi); + } + } + } + } + } + if (origin != null && origin.size() == 1 && origin.get(0).isKnown()) { // FIXME: make this properly interact with several origin zones list = CardLists.getValidCards(list, type, source.getController(), source, sa);