Skip to content

Commit

Permalink
improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
Northmoc committed Dec 3, 2023
1 parent 91cf1fa commit 437869f
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import forge.util.Lang;
import forge.util.Localizer;
import forge.util.MyRandom;
import forge.util.collect.FCollectionView;

import org.apache.commons.lang3.tuple.Pair;

public class ChooseNumberEffect extends SpellAbilityEffect {
Expand Down Expand Up @@ -50,18 +52,16 @@ public void resolve(SpellAbility sa) {
final Map<Player, Integer> chooseMap = Maps.newHashMap();

// defined guesser must try to guess the chosen - currently only on "The Toymaker's Trap"
boolean guessedCorrect = false;
Pair<Player, Integer> guessPair = null;
// may need future work to ensure chooser and guesser get same choices even in absence of RemoveChoices param
List<Integer> choices = new ArrayList<>();
final Player guesser = sa.hasParam("Guesser") ?
AbilityUtils.getDefinedPlayers(card, sa.getParam("Guesser"), sa).get(0) : null;
boolean guessedCorrect = false;

for (final Player p : getTargetPlayers(sa)) {
if (!p.isInGame()) {
continue;
}
int chosen;
Integer chosen;
if (random) {
chosen = MyRandom.getRandom().nextInt((max - min) + 1) + min;
//TODO more useful notify for RepeatEach -> ChooseNumber with random
Expand All @@ -79,6 +79,7 @@ public void resolve(SpellAbility sa) {
for (Object o : card.getRemembered()) {
if (o instanceof Integer) choices.remove((Integer) o);
}
if (choices.isEmpty()) continue;
chosen = p.getController().chooseNumber(sa, title, choices, null);
} else {
chosen = p.getController().chooseNumber(sa, title, min, max);
Expand All @@ -91,18 +92,25 @@ public void resolve(SpellAbility sa) {
card.setChosenNumber(chosen);
}
if (sa.hasParam("Notify")) {
p.getGame().getAction().notifyOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), chosen), p);
p.getGame().getAction().notifyOfValue(sa, card, Localizer.getInstance().
getMessage("lblPlayerPickedChosen", p.getName(), chosen), p);
}
}

if (guesser != null) {
guessPair = Pair.of(guesser, guesser.getController().chooseNumber(sa,
if (sa.hasParam("Guesser") && chosen != null) { // if nothing was chosen, there is nothing to guess
final FCollectionView<Player> gChoices =
AbilityUtils.getDefinedPlayers(card, sa.getParam("Guesser"), sa);
final Player guesser = choices.isEmpty() ? null : p.getController().
chooseSingleEntityForEffect(gChoices, sa, Localizer.getInstance().getMessage("lblChoosePlayer"),
false, null);
if (guesser != null) {
guessPair = Pair.of(guesser, guesser.getController().chooseNumber(sa,
Localizer.getInstance().getMessage("lblChooseNumber"), choices, null));
// if more complicated effects require this in the future it may be worth a unique message
if (chooseMap.containsValue(guessPair.getValue())) guessedCorrect = true;
// if more complicated effects require this in the future it may be worth a unique message
if (chooseMap.containsValue(guessPair.getValue())) guessedCorrect = true;
}
}
}

if (secretlyChoose) {
if (secretlyChoose && !chooseMap.isEmpty()) {
StringBuilder sb = new StringBuilder();
List<Player> highestNum = Lists.newArrayList();
List<Player> lowestNum = Lists.newArrayList();
Expand Down Expand Up @@ -191,11 +199,14 @@ public void resolve(SpellAbility sa) {
AbilityUtils.resolve(sub);
}

if (sa.hasParam("GuessWrong") && !guessedCorrect) {
if (sa.hasParam("GuessWrong") && guessPair != null && !guessedCorrect) {
SpellAbility sub = sa.getAdditionalAbility("GuessWrong");
card.setChosenNumber(guessPair.getRight()); // wrong currently uses the guess, not the chosen
// wrong currently uses the guess, not the chosen
card.setChosenNumber(guessPair.getValue());
card.addRemembered(guessPair.getKey());
AbilityUtils.resolve(sub);
card.clearChosenNumber();
card.removeRemembered(guessPair.getKey());
}
}

Expand Down
12 changes: 5 additions & 7 deletions forge-gui/res/cardsfolder/upcoming/the_toymakers_trap.txt
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
Name:The Toymaker's Trap
ManaCost:2 B
Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChooseGuesser | TriggerDescription$ At the beginning of your upkeep, secretly choose a number between 1 and 5 that hasn't been chosen. If you do, an opponent guesses which number you chose, then you reveal the number you chose. If they guessed wrong, they lose life equal to the number they guessed and you draw a card. If they guessed right, sacrifice The Toymaker's Trap.
SVar:TrigChooseGuesser:DB$ ChoosePlayer | Choices$ Opponent | ChoiceTitle$ Choose an opponent to guess the number | SubAbility$ DBChooseNumber
SVar:DBChooseNumber:DB$ ChooseNumber | SecretlyChoose$ True | Min$ 1 | Max$ 5 | RemoveChoices$ Remembered | Guesser$ ChosenPlayer | GuessWrong$ DBLoseLife | GuessCorrect$ DBSac | RememberChosen$ True | SubAbility$ DBCleanup
SVar:DBLoseLife:DB$ LoseLife | Defined$ ChosenPlayer | LifeAmount$ Count$ChosenNumber | SubAbility$ DBDraw
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChooseNumber | TriggerDescription$ At the beginning of your upkeep, secretly choose a number between 1 and 5 that hasn't been chosen. If you do, an opponent guesses which number you chose, then you reveal the number you chose. If they guessed wrong, they lose life equal to the number they guessed and you draw a card. If they guessed right, sacrifice The Toymaker's Trap.
SVar:TrigChooseNumber:DB$ ChooseNumber | SecretlyChoose$ True | Min$ 1 | Max$ 5 | RemoveChoices$ Remembered | Guesser$ Opponent | GuessWrong$ DBLoseLife | GuessCorrect$ DBSac | RememberChosen$ True | SubAbility$ DBCleanup
SVar:DBLoseLife:DB$ LoseLife | Defined$ RememberedPlayer | LifeAmount$ Count$ChosenNumber | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw
SVar:DBSac:DB$ Sacrifice
SVar:DBCleanup:DB$ Cleanup | ClearChosenPlayer$ True
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup2
SVar:DBCleanup2:DB$ Cleanup | ClearRemembered$ True
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Sacrifice
Oracle:At the beginning of your upkeep, secretly choose a number between 1 and 5 that hasn't been chosen. If you do, an opponent guesses which number you chose, then you reveal the number you chose. If they guessed wrong, they lose life equal to the number they guessed and you draw a card. If they guessed right, sacrifice The Toymaker's Trap.

0 comments on commit 437869f

Please sign in to comment.