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; }
/** * @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; }