@Override public void resolve(SpellAbility sa) { final Card host = sa.getHostCard(); final String[] choices = sa.getParam("Choices").split(","); final List<SpellAbility> abilities = new ArrayList<SpellAbility>(); for (String s : choices) { abilities.add(AbilityFactory.getAbility(host.getSVar(s), host)); } final List<Player> tgtPlayers = getDefinedPlayersOrTargeted(sa); final TargetRestrictions tgt = sa.getTargetRestrictions(); for (final Player p : tgtPlayers) { if (tgt != null && !p.canBeTargetedBy(sa)) { continue; } int idxChosen = 0; String chosenName; if (sa.hasParam("AtRandom")) { idxChosen = MyRandom.getRandom().nextInt(choices.length); chosenName = choices[idxChosen]; } else { SpellAbility saChosen = p.getController().chooseSingleSpellForEffect(abilities, sa, "Choose one"); idxChosen = abilities.indexOf(saChosen); chosenName = choices[idxChosen]; } SpellAbility chosenSA = AbilityFactory.getAbility(host.getSVar(chosenName), host); if (sa.hasParam("ShowChoice")) { p.getGame() .getAction() .nofityOfValue(sa, p, abilities.get(idxChosen).getDescription(), null); } chosenSA.setActivatingPlayer(sa.getActivatingPlayer()); ((AbilitySub) chosenSA).setParent(sa); AbilityUtils.resolve(chosenSA); } }
@Override public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); // final int min = sa.containsKey("Min") ? Integer.parseInt(sa.get("Min")) : 0; // final int max = sa.containsKey("Max") ? Integer.parseInt(sa.get("Max")) : 99; final boolean random = sa.hasParam("Random"); final boolean anyNumber = sa.hasParam("ChooseAnyNumber"); final boolean secretlyChoose = sa.hasParam("SecretlyChoose"); final String sMin = sa.getParamOrDefault("Min", "0"); final int min = AbilityUtils.calculateAmount(card, sMin, sa); final String sMax = sa.getParamOrDefault("Max", "99"); final int max = AbilityUtils.calculateAmount(card, sMax, sa); final List<Player> tgtPlayers = getTargetPlayers(sa); final TargetRestrictions tgt = sa.getTargetRestrictions(); final Map<Player, Integer> chooseMap = new HashMap<Player, Integer>(); for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { int chosen; if (random) { final Random randomGen = new Random(); chosen = randomGen.nextInt(max - min) + min; p.getGame().getAction().nofityOfValue(sa, p, Integer.toString(chosen), null); } else { String title = sa.hasParam("ListTitle") ? sa.getParam("ListTitle") : "Choose a number"; if (anyNumber) { chosen = p.getController().announceRequirements(sa, title, true); } else { chosen = p.getController().chooseNumber(sa, title, min, max); } // don't notify here, because most scripts I've seen don't store that number in a long // term } if (secretlyChoose) { chooseMap.put(p, chosen); } else { card.setChosenNumber(chosen); } if (sa.hasParam("Notify")) { p.getGame().getAction().nofityOfValue(sa, card, p.getName() + " picked " + chosen, p); } } } if (secretlyChoose) { StringBuilder sb = new StringBuilder(); List<Player> highestNum = new ArrayList<Player>(); List<Player> lowestNum = new ArrayList<Player>(); int highest = 0; int lowest = Integer.MAX_VALUE; for (Entry<Player, Integer> ev : chooseMap.entrySet()) { int num = ev.getValue(); Player player = ev.getKey(); sb.append(player).append(" chose ").append(num); sb.append("\r\n"); if (num > highest) { highestNum.clear(); highest = num; } if (num == highest) { highestNum.add(player); } if (num < lowest) { lowestNum.clear(); lowest = num; } if (num == lowest) { lowestNum.add(player); } } card.getGame().getAction().nofityOfValue(sa, card, sb.toString(), null); if (sa.hasParam("ChooseNumberSubAbility")) { SpellAbility sub = AbilityFactory.getAbility(card.getSVar(sa.getParam("ChooseNumberSubAbility")), card); sub.setActivatingPlayer(sa.getActivatingPlayer()); ((AbilitySub) sub).setParent(sa); for (Player p : chooseMap.keySet()) { card.addRemembered(p); card.setChosenNumber(chooseMap.get(p)); AbilityUtils.resolve(sub); card.clearRemembered(); } } if (sa.hasParam("Lowest")) { SpellAbility action = AbilityFactory.getAbility(card.getSVar(sa.getParam("Lowest")), card); action.setActivatingPlayer(sa.getActivatingPlayer()); ((AbilitySub) action).setParent(sa); for (Player p : lowestNum) { card.addRemembered(p); card.setChosenNumber(lowest); AbilityUtils.resolve(action); card.clearRemembered(); } } if (sa.hasParam("Highest")) { SpellAbility action = AbilityFactory.getAbility(card.getSVar(sa.getParam("Highest")), card); action.setActivatingPlayer(sa.getActivatingPlayer()); ((AbilitySub) action).setParent(sa); for (Player p : highestNum) { card.addRemembered(p); card.setChosenNumber(highest); AbilityUtils.resolve(action); card.clearRemembered(); } if (sa.hasParam("RememberHighest")) { card.addRemembered(highestNum); } } } }