private boolean hasTargets(SpellAbility spellAbility, Game game) { if (spellAbility.getModes().getSelectedModes().size() > 1) { for (UUID modeId : spellAbility.getModes().getSelectedModes()) { Mode mode = spellAbility.getModes().get(modeId); if (!mode.getTargets().isEmpty()) { return true; } } return false; } else { return !spellAbility.getTargets().isEmpty(); } }
public Modes(final Modes modes) { for (Map.Entry<UUID, Mode> entry : modes.entrySet()) { this.put(entry.getKey(), entry.getValue().copy()); } for (Map.Entry<UUID, Mode> entry : modes.duplicateModes.entrySet()) { this.put(entry.getKey(), entry.getValue().copy()); } this.minModes = modes.minModes; this.maxModes = modes.maxModes; this.selectedModes.addAll(modes.getSelectedModes()); if (modes.getSelectedModes().isEmpty()) { this.currentMode = values().iterator().next(); } else { this.currentMode = get(modes.getMode().getId()); } this.modeChooser = modes.modeChooser; this.eachModeOnlyOnce = modes.eachModeOnlyOnce; this.eachModeMoreThanOnce = modes.eachModeMoreThanOnce; this.optionalAdditionalModeSourceCosts = modes.optionalAdditionalModeSourceCosts; this.maxModesFilter = modes.maxModesFilter; // can't change so no copy needed }
public String getText() { if (this.size() <= 1) { return this.getMode().getEffects().getText(this.getMode()); if (this.getMaxModesFilter() != null) { sb.append("choose one or more. Each mode must target ").append(getMaxModesFilter().getMessage()); } else if (this.getMinModes() == 0 && this.getMaxModes() == 1) { sb.append("choose up to one "); } else if (this.getMinModes() == 1 && this.getMaxModes() > 2) { sb.append("choose one or more "); } else if (this.getMinModes() == 1 && this.getMaxModes() == 2) { sb.append("choose one or both "); } else if (this.getMinModes() == 2 && this.getMaxModes() == 2) { sb.append("choose two "); } else if (this.getMinModes() == 3 && this.getMaxModes() == 3) { sb.append("choose three "); } else { sb.append("choose one "); if (isEachModeOnlyOnce()) { sb.append("that hasn't been chosen "); if (isEachModeMoreThanOnce()) { sb.append(". You may choose the same mode more than once.<br>"); } else { sb.append("—<br>"); for (Mode mode : this.values()) { sb.append("&bull "); sb.append(mode.getEffects().getTextStartingUpperCase(mode));
/** * Returns all (still) available modes of the ability * * @param source * @param game * @return */ public List<Mode> getAvailableModes(Ability source, Game game) { List<Mode> availableModes = new ArrayList<>(); Set<UUID> nonAvailableModes; if (isEachModeMoreThanOnce()) { nonAvailableModes = new HashSet<>(); } else { nonAvailableModes = getAlreadySelectedModes(source, game); } for (Mode mode : this.values()) { if (isEachModeOnlyOnce() && nonAvailableModes != null && nonAvailableModes.contains(mode.getId())) { continue; } availableModes.add(mode); } return availableModes; }
@Override public Mode chooseMode(Modes modes, Ability source, Game game) { updateGameStatePriority("chooseMode", game); if (modes.size() > 1) { MageObject obj = game.getObject(source.getSourceId()); Map<UUID, String> modeMap = new LinkedHashMap<>(); AvailableModes: for (Mode mode : modes.getAvailableModes(source, game)) { int timesSelected = 0; for (UUID selectedModeId : modes.getSelectedModes()) { Mode selectedMode = modes.get(selectedModeId); if (mode.getId().equals(selectedMode.getId())) { if (modes.isEachModeMoreThanOnce()) { timesSelected++; } else { modeText = modeText.replace("{source}", obj.getName()).replace("{this}", obj.getName()); if (modes.isEachModeMoreThanOnce()) { if (timesSelected > 0) { modeText = "(selected " + timesSelected + "x) " + modeText; for (Mode mode : modes.getAvailableModes(source, game)) { if (mode.getId().equals(response.getUUID())) { return mode; return modes.getMode();
@Override public Mode chooseMode(Modes modes, Ability source, Game game) { log.debug("chooseMode"); if (modes.getMode() != null && modes.getMaxModes() == modes.getSelectedModes().size()) { // mode was already set by the AI return modes.getMode(); } //TODO: improve this; AvailableMode: for (Mode mode : modes.getAvailableModes(source, game)) { for (UUID selectedModeId : modes.getSelectedModes()) { Mode selectedMode = modes.get(selectedModeId); if (selectedMode.getId().equals(mode.getId())) { continue AvailableMode; } } if (mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { // and where targets are available return mode; } } return null; }
public boolean choose(Game game, Ability source) { if (this.size() > 1) { this.selectedModes.clear(); this.duplicateModes.clear(); if (this.size() == this.getMinModes() && !isEachModeMoreThanOnce()) { Set<UUID> onceSelectedModes = null; if (isEachModeOnlyOnce()) { onceSelectedModes = getAlreadySelectedModes(source, game); for (Mode mode : this.values()) { if ((!isEachModeOnlyOnce() || onceSelectedModes == null || !onceSelectedModes.contains(mode.getId())) && mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { this.addSelectedMode(mode.getId()); if (isEachModeOnlyOnce()) { setAlreadySelectedModes(selectedModes, source, game); int currentMaxModes = this.getMaxModes(); if (getMaxModesFilter() != null) { if (maxModesFilter instanceof FilterPlayer) { currentMaxModes = 0; if (currentMaxModes > this.getMaxModes()) { currentMaxModes = this.getMaxModes(); Mode choice = player.chooseMode(this, source, game); if (choice == null) { if (isEachModeOnlyOnce()) { setAlreadySelectedModes(selectedModes, source, game);
} else if (object instanceof Spell && ((Spell) object).getSpellAbility().getModes().size() > 1) { Modes spellModes = ((Spell) object).getSpellAbility().getModes(); for (UUID selectedModeId : spellModes.getSelectedModes()) { Mode selectedMode = spellModes.get(selectedModeId); int item = 0; for (Mode mode : spellModes.values()) { item++; if (mode.getId().equals(selectedMode.getId())) {
public PlungeIntoDarkness(UUID ownerId, CardSetInfo setInfo) { super(ownerId, setInfo, new CardType[]{CardType.INSTANT}, "{1}{B}"); // Choose one - this.getSpellAbility().getModes().setMinModes(1); this.getSpellAbility().getModes().setMaxModes(1); // Sacrifice any number of creatures, then you gain 3 life for each sacrificed creature; this.getSpellAbility().addEffect(new PlungeIntoDarknessLifeEffect()); // or pay X life, then look at the top X cards of your library, put one of those cards into your hand, and exile the rest. Mode mode = new Mode(); mode.addEffect(new PlungeIntoDarknessSearchEffect()); this.getSpellAbility().getModes().addMode(mode); // Entwine {B} this.addAbility(new EntwineAbility("{B}")); }
private void addModeOptions(List<Ability> options, Ability option, Game game) { // TODO: Support modal spells with more than one selectable mode for (Mode mode : option.getModes().values()) { Ability newOption = option.copy(); newOption.getModes().getSelectedModes().clear(); newOption.getModes().getSelectedModes().add(mode.getId()); newOption.getModes().setActiveMode(mode); if (!newOption.getTargets().getUnchosen().isEmpty()) { if (!newOption.getManaCosts().getVariableCosts().isEmpty()) { addVariableXOptions(options, newOption, 0, game); } else { addTargetOptions(options, newOption, 0, game); } } else if (!newOption.getCosts().getTargets().getUnchosen().isEmpty()) { addCostTargetOptions(options, newOption, 0, game); } else { options.add(newOption); } } }
public void setActiveMode(UUID modeId) { if (selectedModes.contains(modeId)) { this.currentMode = get(modeId); } }
@Override public Mode chooseMode(Modes modes, Ability source, Game game) { if (this.isHuman()) { Iterator<Mode> it = modes.getAvailableModes(source, game).iterator(); Mode mode = it.next(); if (modes.size() == 1) { return mode; } int modeNum = RandomUtil.nextInt(modes.getAvailableModes(source, game).size()); for (int i = 0; i < modeNum; i++) { mode = it.next(); } return mode; } return super.chooseMode(modes, source, game); }
@Override public boolean applies(Ability abilityToModify, Ability source, Game game) { if (abilityToModify.getSourceId().equals(source.getSourceId()) && (abilityToModify instanceof SpellAbility)) { return abilityToModify.getModes().getSelectedModes().size() > 1; } return false; }
private static boolean canChooseTargetAbility(Ability ability, Game game, UUID controllerId) { int found = 0; for (Mode mode : ability.getModes().values()) { if (mode.getTargets().canChoose(ability.getSourceId(), ability.getControllerId(), game)) { found++; if (ability.getModes().isEachModeMoreThanOnce()) { return true; } if (found >= ability.getModes().getMinModes()) { return true; } } } return false; }
/** * Returns the mode by index. For modal spells with eachModeMoreThanOnce, * the index returns the n selected mode * * @param index * @return */ public UUID getModeId(int index) { int idx = 0; if (eachModeMoreThanOnce) { for (UUID modeId : this.selectedModes) { idx++; if (idx == index) { return modeId; } } } else { for (Mode mode : this.values()) { idx++; if (idx == index) { return mode.getId(); } } } return null; }
@Override public boolean resolve(Game game) { boolean result = true; //20100716 - 117.12 if (checkIfClause(game)) { if (this instanceof TriggeredAbility) { for (UUID modeId : this.getModes().getSelectedModes()) { this.getModes().setActiveMode(modeId); result = resolveMode(game); } } else { result = resolveMode(game); } } return result; }
@Override public void addMode(Mode mode) { getModes().addMode(mode); }
@Override public boolean isModal() { return getModes().size() > 1; }