Skip to content

Commit

Permalink
WHO: the_toymakers_trap.txt + support
Browse files Browse the repository at this point in the history
  • Loading branch information
Northmoc committed Dec 3, 2023
1 parent a0ba5e3 commit 33d0fea
Show file tree
Hide file tree
Showing 14 changed files with 93 additions and 6 deletions.
2 changes: 2 additions & 0 deletions forge-ai/src/main/java/forge/ai/AiController.java
Original file line number Diff line number Diff line change
Expand Up @@ -1877,6 +1877,8 @@ public int chooseNumber(SpellAbility sa, String title, List<Integer> options, Pl
} else {
return options.get(0);
}
case ChooseNumber:
return Aggregates.random(options);
default:
return options.get(0);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public final class AbilityFactory {
public static final List<String> additionalAbilityKeys = Lists.newArrayList(
"WinSubAbility", "OtherwiseSubAbility", // Clash
"BidSubAbility", // BidLifeEffect
"ChooseNumberSubAbility", "Lowest", "Highest", "NotLowest", // ChooseNumber
"ChooseNumberSubAbility", "Lowest", "Highest", "NotLowest", "GuessCorrect", "GuessWrong", // ChooseNumber
"HeadsSubAbility", "TailsSubAbility", "LoseSubAbility", // FlipCoin
"TrueSubAbility", "FalseSubAbility", // Branch
"ChosenPile", "UnchosenPile", // MultiplePiles & TwoPiles
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package forge.game.ability.effects;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
Expand All @@ -15,6 +16,9 @@
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 @@ -47,11 +51,17 @@ 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<>();

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 @@ -61,6 +71,16 @@ public void resolve(SpellAbility sa) {
if (anyNumber) {
Integer value = p.getController().announceRequirements(sa, title);
chosen = value == null ? 0 : value;
} else if (sa.hasParam("RemoveChoices")) {
// currently we always remove remembered numbers, so the value is not really used yet
for (int i = min; i <= max; i++) {
choices.add(i);
}
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 @@ -72,15 +92,35 @@ 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 (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 (secretlyChoose) {

if (secretlyChoose && !chooseMap.isEmpty()) {
StringBuilder sb = new StringBuilder();
List<Player> highestNum = Lists.newArrayList();
List<Player> lowestNum = Lists.newArrayList();
int highest = 0;
int lowest = Integer.MAX_VALUE;
if (guessPair != null) {
sb.append(Localizer.getInstance().getMessage("lblPlayerGuessedNum", guessPair.getKey().getName(),
String.valueOf(guessPair.getValue())));
sb.append("\r\n");
}
for (Entry<Player, Integer> ev : chooseMap.entrySet()) {
int num = ev.getValue();
Player player = ev.getKey();
Expand Down Expand Up @@ -153,7 +193,24 @@ public void resolve(SpellAbility sa) {
card.addRemembered(highestNum);
}
}

if (sa.hasParam("GuessCorrect") && guessedCorrect) { // correct guess doesn't use any chosen num yet
SpellAbility sub = sa.getAdditionalAbility("GuessCorrect");
AbilityUtils.resolve(sub);
}

if (sa.hasParam("GuessWrong") && guessPair != null && !guessedCorrect) {
SpellAbility sub = sa.getAdditionalAbility("GuessWrong");
// 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());
}
}

if (sa.hasParam("RememberChosen")) card.addRemembered(chooseMap.values());
}

}
5 changes: 5 additions & 0 deletions forge-game/src/main/java/forge/game/card/Card.java
Original file line number Diff line number Diff line change
Expand Up @@ -1819,6 +1819,11 @@ public final void setChosenNumber(final int i) {
view.updateChosenNumber(this);
}

public final void clearChosenNumber() {
chosenNumber = null;
view.clearChosenNumber();
}

public final Card getExiledWith() {
return exiledWith;
}
Expand Down
3 changes: 3 additions & 0 deletions forge-game/src/main/java/forge/game/card/CardView.java
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,9 @@ public String getChosenNumber() {
void updateChosenNumber(Card c) {
set(TrackableProperty.ChosenNumber, c.getChosenNumber().toString());
}
void clearChosenNumber() {
set(TrackableProperty.ChosenNumber, "");
}

public List<String> getStoredRolls() {
return get(TrackableProperty.StoredRolls);
Expand Down
12 changes: 12 additions & 0 deletions forge-gui/res/cardsfolder/upcoming/the_toymakers_trap.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
Name:The Toymaker's Trap
ManaCost:2 B
Types:Enchantment
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
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.
1 change: 1 addition & 0 deletions forge-gui/res/languages/de-DE.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1905,6 +1905,7 @@ lblChooseOne=Wähle eines
#ChooseNumberEffect.java
lblChooseNumber=Wähle eine Zahl
lblPlayerChoseNum={0} wähle {1}
lblPlayerGuessedNum={0} hat {1} erraten
#ChoosePlayerEffect.java
lblChoosePlayer=Wähle einen Spieler
#ChooseSourceEffect.java
Expand Down
1 change: 1 addition & 0 deletions forge-gui/res/languages/en-US.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1910,6 +1910,7 @@ lblChooseOne=Choose one
#ChooseNumberEffect.java
lblChooseNumber=Choose a number
lblPlayerChoseNum={0} chose {1}
lblPlayerGuessedNum={0} guessed {1}
#ChoosePlayerEffect.java
lblChoosePlayer=Choose a player
#ChooseSourceEffect.java
Expand Down
1 change: 1 addition & 0 deletions forge-gui/res/languages/es-ES.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1906,6 +1906,7 @@ lblChooseOne=Elige uno
#ChooseNumberEffect.java
lblChooseNumber=Elige un número
lblPlayerChoseNum={0} eligió {1}
lblPlayerGuessedNum={0} adivinó {1}
#ChoosePlayerEffect.java
lblChoosePlayer=Elige un jugador
#ChooseSourceEffect.java
Expand Down
5 changes: 3 additions & 2 deletions forge-gui/res/languages/fr-FR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1342,7 +1342,7 @@ lblChooseOrderCards=Choisir l''ordre des cartes
lblDelveHowManyCards=Creusez combien de cartes ?
lblExileWhichCard=Exiler quelle carte({0}/{1}) ?
lblDestroy=détruire
lblSelectUpToNumTargetToAction=S\u00e9lectionnez jusqu''\u00e0 %d {0}(s) \u00e0 {1}.
lblSelectUpToNumTargetToAction=Sélectionnez jusqu''à %d {0}(s) à {1}.
lblSelectNumTargetToAction=Sélectionnez %d {0}(s) à {1}.
lblHighestBidder=Enchérisseur le plus élevé
lblUseTriggeredAbilityOf=Utiliser la capacité déclenchée de
Expand Down Expand Up @@ -1876,7 +1876,7 @@ lblLookingCardIn=Regarder les cartes dans
lblDoYouWantPlayCard=Voulez-vous jouer à {0} ?
lblDoYouWantPlayCardTransformed=Voulez-vous jouer à {0} transformée?
lblSelectCardFromPlayerZone=Sélectionnez une carte de {0} {1}
lblSelectUpToNumCardFromPlayerZone=S\u00e9lectionnez jusqu''\u00e0 {0} cartes de {1} {2}
lblSelectUpToNumCardFromPlayerZone=Sélectionnez jusqu''à {0} cartes de {1} {2}
lblSelectCardsFromPlayerZone=Sélectionner les cartes de {0} {1}
lblCancelSearchUpToSelectNumCards=Annuler la recherche ? Jusqu''à {0} carte(s) supplémentaire(s) peuvent être sélectionnées.
#ChangeZoneAllEffect.java
Expand Down Expand Up @@ -1909,6 +1909,7 @@ lblChooseOne=Choisissez-en un
#ChooseNumberEffect.java
lblChooseNumber=Choisissez un nombre
lblPlayerChoseNum={0} a choisi {1}
lblPlayerGuessedNum={0} deviné {1}
#ChoosePlayerEffect.java
lblChoosePlayer=Choisir un joueur
#ChooseSourceEffect.java
Expand Down
1 change: 1 addition & 0 deletions forge-gui/res/languages/it-IT.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1906,6 +1906,7 @@ lblChooseOne=Scegli uno
#ChooseNumberEffect.java
lblChooseNumber=Scegli un numero
lblPlayerChoseNum={0} ha scelto {1}
lblPlayerGuessedNum={0} ha indovinato {1}
#ChoosePlayerEffect.java
lblChoosePlayer=Scegli un giocatore
#ChooseSourceEffect.java
Expand Down
1 change: 1 addition & 0 deletions forge-gui/res/languages/ja-JP.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1905,6 +1905,7 @@ lblChooseOne=以下から 1つを選ぶ
#ChooseNumberEffect.java
lblChooseNumber=数字を 1つ選ぶ
lblPlayerChoseNum={0}が {1}を選んだ
lblPlayerGuessedNum={0}は {1}を推測しました
#ChoosePlayerEffect.java
lblChoosePlayer=プレイヤーを選ぶ
#ChooseSourceEffect.java
Expand Down
1 change: 1 addition & 0 deletions forge-gui/res/languages/pt-BR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1967,6 +1967,7 @@ lblChooseOne=Escolha um
#ChooseNumberEffect.java
lblChooseNumber=Escolha um número
lblPlayerChoseNum={0} escolheu {1}
lblPlayerGuessedNum={0} adivinhou {1}
#ChoosePlayerEffect.java
lblChoosePlayer=Escolha um jogador
#ChooseSourceEffect.java
Expand Down
1 change: 1 addition & 0 deletions forge-gui/res/languages/zh-CN.properties
Original file line number Diff line number Diff line change
Expand Up @@ -1910,6 +1910,7 @@ lblChooseOne=选择一个
#ChooseNumberEffect.java
lblChooseNumber=选择一个数
lblPlayerChoseNum={0}已选择{1}
lblPlayerGuessedNum={0}猜了{1}
#ChoosePlayerEffect.java
lblChoosePlayer=选择一个牌手
#ChooseSourceEffect.java
Expand Down

0 comments on commit 33d0fea

Please sign in to comment.