public Set<Ability> getLayeredEffectAbilities(ContinuousEffect effect) { return layeredEffects.getAbility(effect.getId()); }
public Map<RestrictionEffect, Set<Ability>> getApplicableRestrictionEffects(Permanent permanent, Game game) { Map<RestrictionEffect, Set<Ability>> effects = new HashMap<>(); for (RestrictionEffect effect : restrictionEffects) { Set<Ability> abilities = restrictionEffects.getAbility(effect.getId()); Set<Ability> applicableAbilities = new HashSet<>(); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, ability instanceof MageSingleton ? permanent : null, null)) { if (effect.applies(permanent, ability, game)) { applicableAbilities.add(ability); } } } if (!applicableAbilities.isEmpty()) { effects.put(effect, abilities); } } return effects; }
public Map<RestrictionUntapNotMoreThanEffect, Set<Ability>> getApplicableRestrictionUntapNotMoreThanEffects(Player player, Game game) { Map<RestrictionUntapNotMoreThanEffect, Set<Ability>> effects = new HashMap<>(); for (RestrictionUntapNotMoreThanEffect effect : restrictionUntapNotMoreThanEffects) { Set<Ability> abilities = restrictionUntapNotMoreThanEffects.getAbility(effect.getId()); Set<Ability> applicableAbilities = new HashSet<>(); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, null)) { if (effect.applies(player, ability, game)) { applicableAbilities.add(ability); } } } if (!applicableAbilities.isEmpty()) { effects.put(effect, abilities); } } return effects; }
public Map<RequirementEffect, Set<Ability>> getApplicableRequirementEffects(Permanent permanent, boolean playerRealted, Game game) { Map<RequirementEffect, Set<Ability>> effects = new HashMap<>(); for (RequirementEffect effect : requirementEffects) { if (playerRealted == effect.isPlayerRelated()) { Set<Ability> abilities = requirementEffects.getAbility(effect.getId()); Set<Ability> applicableAbilities = new HashSet<>(); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, ability instanceof MageSingleton ? permanent : null, null)) { if (effect.applies(permanent, ability, game)) { applicableAbilities.add(ability); } } } if (!applicableAbilities.isEmpty()) { effects.put(effect, abilities); } } } return effects; }
public synchronized List<ContinuousEffect> getLayeredEffects(Game game) { List<ContinuousEffect> layerEffects = new ArrayList<>(); for (ContinuousEffect effect : layeredEffects) { switch (effect.getDuration()) { case WhileOnBattlefield: case WhileOnStack: case WhileInGraveyard: Set<Ability> abilities = layeredEffects.getAbility(effect.getId()); if (!abilities.isEmpty()) { for (Ability ability : abilities) { // If e.g. triggerd abilities (non static) created the effect, the ability must not be in usable zone (e.g. Unearth giving Haste effect) if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, null)) { layerEffects.add(effect); break; } } } else { logger.error("No abilities for continuous effect: " + effect.toString()); } break; default: layerEffects.add(effect); } } updateTimestamps(layerEffects); Collections.sort(layerEffects, Comparator.comparingLong(ContinuousEffect::getOrder)); return layerEffects; }
/** * Filters out asThough effects that are not active. * * @param type type * @param game * @return */ public List<AsThoughEffect> getApplicableAsThoughEffects(AsThoughEffectType type, Game game) { List<AsThoughEffect> asThoughEffectsList = new ArrayList<>(); if (asThoughEffectsMap.containsKey(type)) { for (AsThoughEffect effect : asThoughEffectsMap.get(type)) { Set<Ability> abilities = asThoughEffectsMap.get(type).getAbility(effect.getId()); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, null)) { if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) { asThoughEffectsList.add(effect); break; } } } } } return asThoughEffectsList; }
private void applyContinuousEffect(ContinuousEffect effect, Layer currentLayer, Game game) { Set<Ability> abilities = layeredEffects.getAbility(effect.getId()); for (Ability ability : abilities) { //effect.apply(currentLayer, SubLayer.NA, ability, game); if (isAbilityStillExists(game, ability, effect)) { effect.apply(currentLayer, SubLayer.NA, ability, game); } } }
private void setControllerForEffect(ContinuousEffectsList<?> effects, UUID sourceId, UUID controllerId) { for (Effect effect : effects) { Set<Ability> abilities = effects.getAbility(effect.getId()); for (Ability ability : abilities) { if (ability.getSourceId() != null) { if (ability.getSourceId().equals(sourceId)) { ability.setControllerId(controllerId); } } else if (ability.getZone() != Zone.COMMAND) { logger.fatal("Continuous effect for ability with no sourceId Ability: " + ability); } } } }
/** * Filters out cost modification effects that are not active. * * @param game * @return */ private List<CostModificationEffect> getApplicableCostModificationEffects(Game game) { List<CostModificationEffect> costEffects = new ArrayList<>(); for (CostModificationEffect effect : costModificationEffects) { Set<Ability> abilities = costModificationEffects.getAbility(effect.getId()); for (Ability ability : abilities) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, null)) { if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) { costEffects.add(effect); break; } } } } return costEffects; }
/** * Filters out splice effects that are not active. * * @param game * @return */ private List<SpliceCardEffect> getApplicableSpliceCardEffects(Game game, UUID playerId) { List<SpliceCardEffect> spliceEffects = new ArrayList<>(); for (SpliceCardEffect effect : spliceCardEffects) { Set<Ability> abilities = spliceCardEffects.getAbility(effect.getId()); for (Ability ability : abilities) { if (ability.isControlledBy(playerId) && (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, null))) { if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) { spliceEffects.add(effect); break; } } } } return spliceEffects; }
private static void traceForPermanent(Game game, Permanent permanent, String uuid, ContinuousEffectsList<RestrictionEffect> restrictionEffects) { for (RestrictionEffect effect: restrictionEffects) { log.error(uuid+" effect=" + effect.toString() + " id=" + effect.getId()); for (Ability ability : restrictionEffects.getAbility(effect.getId())) { if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, permanent, null)) { log.error(uuid+" ability=" + ability + ", applies_to_attacker=" + effect.applies(permanent, ability, game)); } else { boolean usable = ability.isInUseableZone(game, permanent, null); log.error(uuid+" instanceof StaticAbility: " + (ability instanceof StaticAbility) + ", ability=" + ability); log.error(uuid+" usable zone: " + usable + ", ability=" + ability); if (!usable) { Zone zone = ability.getZone(); log.error(uuid+" zone: " + zone); MageObject object = game.getObject(ability.getSourceId()); log.error(uuid+" object: " + object); if (object != null) { log.error(uuid + " contains ability: " + object.getAbilities().contains(ability)); } Zone test = game.getState().getZone(ability.getSourceId()); log.error(uuid+" test_zone: " + test); } } } } }
public UUID getControllerOfSourceId(UUID sourceId) { UUID controllerFound = null; for (PreventionEffect effect : preventionEffects) { Set<Ability> abilities = preventionEffects.getAbility(effect.getId()); for (Ability ability : abilities) { if (ability.getSourceId().equals(sourceId)) { Set<Ability> abilities = replacementEffects.getAbility(effect.getId()); for (Ability ability : abilities) { if (ability.getSourceId() != null) {
Set<Ability> abilities; if (effect.getEffectType() == EffectType.REPLACEMENT) { abilities = replacementEffects.getAbility(effect.getId()); } else { abilities = preventionEffects.getAbility(effect.getId());
public ManaType asThoughMana(ManaType manaType, ManaPoolItem mana, UUID objectId, Ability affectedAbility, UUID controllerId, Game game) { // First check existing only effects List<AsThoughEffect> asThoughEffectsList = getApplicableAsThoughEffects(AsThoughEffectType.SPEND_ONLY_MANA, game); for (AsThoughEffect effect : asThoughEffectsList) { Set<Ability> abilities = asThoughEffectsMap.get(AsThoughEffectType.SPEND_ONLY_MANA).getAbility(effect.getId()); for (Ability ability : abilities) { if ((affectedAbility == null && effect.applies(objectId, ability, controllerId, game)) || effect.applies(objectId, affectedAbility, ability, game, controllerId)) { if (((AsThoughManaEffect) effect).getAsThoughManaType(manaType, mana, controllerId, ability, game) == null) { return null; } } } } // then check effects that allow to use other mana types to pay the current mana type to pay asThoughEffectsList = getApplicableAsThoughEffects(AsThoughEffectType.SPEND_OTHER_MANA, game); for (AsThoughEffect effect : asThoughEffectsList) { Set<Ability> abilities = asThoughEffectsMap.get(AsThoughEffectType.SPEND_OTHER_MANA).getAbility(effect.getId()); for (Ability ability : abilities) { if ((affectedAbility == null && effect.applies(objectId, ability, controllerId, game)) || effect.applies(objectId, affectedAbility, ability, game, controllerId)) { ManaType usableManaType = ((AsThoughManaEffect) effect).getAsThoughManaType(manaType, mana, controllerId, ability, game); if (usableManaType != null) { return usableManaType; } } } } return manaType; }
Set<Ability> abilities = replacementEffects.getAbility(effect.getId()); Set<Ability> applicableAbilities = new HashSet<>(); for (Ability ability : abilities) { Set<Ability> abilities = preventionEffects.getAbility(effect.getId()); Set<Ability> applicableAbilities = new HashSet<>(); for (Ability ability : abilities) {
Set<Ability> abilities = costModificationEffects.getAbility(effect.getId()); for (Ability ability : abilities) { if (effect.applies(abilityToModify, ability, game)) { Set<Ability> abilities = costModificationEffects.getAbility(effect.getId()); for (Ability ability : abilities) { if (effect.applies(abilityToModify, ability, game)) { Set<Ability> abilities = costModificationEffects.getAbility(effect.getId()); for (Ability ability : abilities) { if (effect.applies(abilityToModify, ability, game)) {
Set<Ability> abilities = spliceCardEffects.getAbility(effect.getId()); for (Ability ability : abilities) { if (effect.applies(abilityToModify, ability, game)) {
public boolean checkIfThereArePayCostToAttackBlockEffects(GameEvent event, Game game) { for (ReplacementEffect effect : replacementEffects) { if (!effect.checksEventType(event, game)) { continue; } if (effect instanceof PayCostToAttackBlockEffect) { Set<Ability> abilities = replacementEffects.getAbility(effect.getId()); 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) && !((PayCostToAttackBlockEffect) effect).isCostless(event, ability, game)) { return true; } } } } } } } return false; }
Set<Ability> abilities = asThoughEffectsMap.get(type).getAbility(effect.getId()); for (Ability ability : abilities) { if (affectedAbility == null) {
continue; for (Ability sourceAbility : continuousRuleModifyingEffects.getAbility(effect.getId())) { if (!(sourceAbility instanceof StaticAbility) || sourceAbility.isInUseableZone(game, null, event)) { if (checkAbilityStillExists(sourceAbility, effect, event, game)) {