public void setActiveMode(Mode mode) { if (selectedModes.contains(mode.getId())) { this.currentMode = mode; } }
public void addMode(Mode mode) { this.put(mode.getId(), mode); }
/** * 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; }
/** * Adds a mode as selected. If the mode is already selected, it copies the * mode and adds it to the duplicate modes * * @param modeId */ private void addSelectedMode(UUID modeId) { if (selectedModes.contains(modeId) && eachModeMoreThanOnce) { Mode duplicateMode = get(modeId).copy(); duplicateMode.setRandomId(); modeId = duplicateMode.getId(); duplicateModes.put(modeId, duplicateMode); } this.selectedModes.add(modeId); }
/** * 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; }
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 }
@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; }
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); } } }
for (UUID selectedModeId : modes.getSelectedModes()) { Mode selectedMode = modes.get(selectedModeId); if (mode.getId().equals(selectedMode.getId())) { if (modes.isEachModeMoreThanOnce()) { timesSelected++; modeMap.put(mode.getId(), modeText); if (response.getUUID() != null) { for (Mode mode : modes.getAvailableModes(source, game)) { if (mode.getId().equals(response.getUUID())) { return mode;
if ((!isEachModeOnlyOnce() || onceSelectedModes == null || !onceSelectedModes.contains(mode.getId())) && mode.getTargets().canChoose(source.getSourceId(), source.getControllerId(), game)) { this.addSelectedMode(mode.getId()); this.addSelectedMode(choice.getId()); if (currentMode == null) { currentMode = choice; this.selectedModes.clear(); Mode mode = this.values().iterator().next(); this.addSelectedMode(mode.getId()); this.setActiveMode(mode);