Exemplo n.º 1
0
 public UUID getControllerOfSourceId(UUID sourceId) {
   UUID controllerFound = null;
   for (PreventionEffect effect : preventionEffects) {
     HashSet<Ability> abilities = preventionEffects.getAbility(effect.getId());
     for (Ability ability : abilities) {
       if (ability.getSourceId().equals(sourceId)) {
         if (controllerFound == null || controllerFound == ability.getControllerId()) {
           controllerFound = ability.getControllerId();
         } else {
           // not unique controller - No solution yet
           return null;
         }
       }
     }
   }
   for (ReplacementEffect effect : replacementEffects) {
     HashSet<Ability> abilities = replacementEffects.getAbility(effect.getId());
     for (Ability ability : abilities) {
       if (ability.getSourceId().equals(sourceId)) {
         if (controllerFound == null || controllerFound == ability.getControllerId()) {
           controllerFound = ability.getControllerId();
         } else {
           // not unique controller - No solution yet
           return null;
         }
       }
     }
   }
   return controllerFound;
 }
Exemplo n.º 2
0
 /**
  * @param event
  * @param game
  * @return a list of all {@link ReplacementEffect} that apply to the current event
  */
 private HashMap<ReplacementEffect, HashSet<Ability>> getApplicableReplacementEffects(
     GameEvent event, Game game) {
   HashMap<ReplacementEffect, HashSet<Ability>> replaceEffects = new HashMap<>();
   if (planeswalkerRedirectionEffect.checksEventType(event, game)
       && planeswalkerRedirectionEffect.applies(event, null, game)) {
     replaceEffects.put(planeswalkerRedirectionEffect, null);
   }
   if (auraReplacementEffect.checksEventType(event, game)
       && auraReplacementEffect.applies(event, null, game)) {
     replaceEffects.put(auraReplacementEffect, null);
   }
   // boolean checkLKI = event.getType().equals(EventType.ZONE_CHANGE) ||
   // event.getType().equals(EventType.DESTROYED_PERMANENT);
   // get all applicable transient Replacement effects
   for (ReplacementEffect effect : replacementEffects) {
     if (!effect.checksEventType(event, game)) {
       continue;
     }
     if (event.getAppliedEffects() != null && event.getAppliedEffects().contains(effect.getId())) {
       // Effect already applied to this event, ignore it
       // TODO: Handle also gained effect that are connected to different abilities.
       continue;
     }
     HashSet<Ability> abilities = replacementEffects.getAbility(effect.getId());
     HashSet<Ability> applicableAbilities = new HashSet<>();
     for (Ability ability : abilities) {
       // for replacment effects of static abilities do not use LKI to check if to apply
       if (ability.getAbilityType() != AbilityType.STATIC
           || ability.isInUseableZone(game, null, event)) {
         if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) {
           if (!game.getScopeRelevant()
               || effect.hasSelfScope()
               || !event.getTargetId().equals(ability.getSourceId())) {
             if (effect.applies(event, ability, game)) {
               applicableAbilities.add(ability);
             }
           }
         }
       }
     }
     if (!applicableAbilities.isEmpty()) {
       replaceEffects.put(effect, applicableAbilities);
     }
   }
   for (PreventionEffect effect : preventionEffects) {
     if (!effect.checksEventType(event, game)) {
       continue;
     }
     if (event.getAppliedEffects() != null && event.getAppliedEffects().contains(effect.getId())) {
       // Effect already applied to this event, ignore it
       // TODO: Handle also gained effect that are connected to different abilities.
       continue;
     }
     HashSet<Ability> abilities = preventionEffects.getAbility(effect.getId());
     HashSet<Ability> applicableAbilities = new HashSet<>();
     for (Ability ability : abilities) {
       if (ability.getAbilityType() != AbilityType.STATIC
           || ability.isInUseableZone(game, null, event)) {
         if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) {
           if (effect.applies(event, ability, game)) {
             applicableAbilities.add(ability);
           }
         }
       }
     }
     if (!applicableAbilities.isEmpty()) {
       replaceEffects.put((ReplacementEffect) effect, applicableAbilities);
     }
   }
   return replaceEffects;
 }