From 34f2fa846d90ba246a610c5f83d15cc3e021e3f9 Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Sat, 23 Mar 2024 04:42:04 -0400 Subject: [PATCH] MKC: prisoners_dilemma + support (#4860) --- .../game/ability/effects/ChooseGenericEffect.java | 10 ++++++++++ .../forge/game/ability/effects/VoteEffect.java | 3 ++- .../src/main/java/forge/util/MessageUtil.java | 5 +++-- .../res/cardsfolder/c/cirdan_the_shipwright.txt | 2 +- .../cardsfolder/e/elrond_of_the_white_council.txt | 2 +- forge-gui/res/cardsfolder/p/prisoners_dilemma.txt | 15 +++++++++++++++ .../res/cardsfolder/t/trap_the_trespassers.txt | 2 +- .../res/cardsfolder/t/truth_or_consequences.txt | 2 +- .../upcoming/vault_11_voters_dilemma.txt | 2 +- forge-gui/res/languages/en-US.properties | 2 +- 10 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 forge-gui/res/cardsfolder/p/prisoners_dilemma.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java index ecad61562ac..8c681385749 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java @@ -19,6 +19,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Aggregates; import forge.util.Lang; +import forge.util.Localizer; public class ChooseGenericEffect extends SpellAbilityEffect { @@ -49,6 +50,8 @@ public class ChooseGenericEffect extends SpellAbilityEffect { final int amount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("ChoiceAmount", "1"), sa); final boolean tempRem = sa.hasParam("TempRemember"); + final boolean secretly = sa.hasParam("Secretly"); + final StringBuilder record = new StringBuilder(); final boolean changeZoneTable = sa.hasParam("ChangeZoneTable"); final boolean damageMap = sa.hasParam("DamageMap"); @@ -113,6 +116,10 @@ public class ChooseGenericEffect extends SpellAbilityEffect { if (sa.hasParam("ShowChoice")) { boolean dontNotifySelf = sa.getParam("ShowChoice").equals("ExceptSelf"); game.getAction().notifyOfValue(sa, p, chosenValue, dontNotifySelf ? p : null); + } else if (secretly) { + if (record.length() > 0) record.append("\r\n"); + record.append(Localizer.getInstance().getMessage("lblPlayerChooseValue", p, chosenValue)); + } if (sa.hasParam("SetChosenMode")) { sa.getHostCard().setChosenMode(chosenValue); @@ -137,6 +144,9 @@ public class ChooseGenericEffect extends SpellAbilityEffect { host.addRemembered(oldRem); } } + if (secretly) { + game.getAction().notifyOfValue(sa, host, record.toString(), null); + } if (damageMap) game.getAction().dealDamage(false, sa.getDamageMap(), sa.getPreventMap(), sa.getCounterTable(), sa); if (changeZoneTable) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java b/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java index 307740a2b0b..626368b2c9f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java @@ -57,7 +57,8 @@ public class VoteEffect extends SpellAbilityEffect { final Card host = sa.getHostCard(); final Game game = host.getGame(); final Player activator = sa.getActivatingPlayer(); - final boolean secret = sa.hasParam("Secret"); + + final boolean secret = sa.hasParam("Secretly"); final boolean other = sa.hasParam("VotePlayer") & sa.getParam("VotePlayer").equals("Other"); final StringBuilder record = new StringBuilder(); diff --git a/forge-game/src/main/java/forge/util/MessageUtil.java b/forge-game/src/main/java/forge/util/MessageUtil.java index 331b675f4c7..b08d7d97a58 100644 --- a/forge-game/src/main/java/forge/util/MessageUtil.java +++ b/forge-game/src/main/java/forge/util/MessageUtil.java @@ -63,7 +63,8 @@ public class MessageUtil { ? Localizer.getInstance().getMessage("lblPlayerFlipComesUpValue", Lang.getInstance().getPossesive(flipper), value) : Localizer.getInstance().getMessage("lblPlayerActionFlip", flipper, Lang.joinVerb(flipper, value)); case GenericChoice: - if (sa.hasParam("ShowChoice") && sa.getParam("ShowChoice").equals("Description")) { + if ((sa.hasParam("Secretly")) || + (sa.hasParam("ShowChoice") && sa.getParam("ShowChoice").equals("Description"))) { return value; } case Protection: @@ -73,7 +74,7 @@ public class MessageUtil { case PutCounter:// For Clay Golem cost text return value; case Vote: - if (sa.hasParam("Secret")) { + if (sa.hasParam("Secretly")) { return value; } else { String chooser = StringUtils.capitalize(mayBeYou(player, target)); diff --git a/forge-gui/res/cardsfolder/c/cirdan_the_shipwright.txt b/forge-gui/res/cardsfolder/c/cirdan_the_shipwright.txt index 67eeaffda27..d2b52bc51d8 100644 --- a/forge-gui/res/cardsfolder/c/cirdan_the_shipwright.txt +++ b/forge-gui/res/cardsfolder/c/cirdan_the_shipwright.txt @@ -5,7 +5,7 @@ PT:3/4 K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigVote | TriggerDescription$ Secret council — Whenever CARDNAME enters the battlefield or attacks, each player secretly votes for a player, then those votes are revealed. Each player draws a card for each vote they received. Each player who received no votes may put a permanent card from their hand onto the battlefield. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigVote | Secondary$ True | TriggerZones$ Battlefield | TriggerDescription$ Secret council — Whenever CARDNAME enters the battlefield or attacks, each player secretly votes for a player, then those votes are revealed. Each player draws a card for each vote they received. Each player who received no votes may put a permanent card from their hand onto the battlefield. -SVar:TrigVote:DB$ Vote | Defined$ Player | Secret$ True | VotePlayer$ Player | StoreVoteNum$ True | SubAbility$ DBRepeatDraw +SVar:TrigVote:DB$ Vote | Defined$ Player | Secretly$ True | VotePlayer$ Player | StoreVoteNum$ True | SubAbility$ DBRepeatDraw SVar:DBRepeatDraw:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBDraw | AmountFromVotes$ True | SubAbility$ DBRepeatPut SVar:DBDraw:DB$ Draw | Defined$ Remembered | NumCards$ Votes SVar:DBRepeatPut:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChangeZone | AmountFromVotes$ True | SubAbility$ DBChangeZone diff --git a/forge-gui/res/cardsfolder/e/elrond_of_the_white_council.txt b/forge-gui/res/cardsfolder/e/elrond_of_the_white_council.txt index 63c4c50d54b..ddaa28356cb 100644 --- a/forge-gui/res/cardsfolder/e/elrond_of_the_white_council.txt +++ b/forge-gui/res/cardsfolder/e/elrond_of_the_white_council.txt @@ -3,7 +3,7 @@ ManaCost:3 G U Types:Legendary Creature Elf Noble PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigVote | TriggerDescription$ Secret council — When CARDNAME enters the battlefield, each player secretly votes for fellowship or aid, then those votes are revealed. For each fellowship vote, the voter chooses a creature they control. You gain control of each creature chosen this way, and they gain "This creature can't attack its owner." Then for each aid vote, put a +1/+1 counter on each creature you control. -SVar:TrigVote:DB$ Vote | Defined$ Player | Secret$ True | VoteType$ Fellowship,Aid | VoteFellowship$ Fellowship | VoteAid$ AidPlus | EachVote$ True | SubAbility$ DBGainControl +SVar:TrigVote:DB$ Vote | Defined$ Player | Secretly$ True | VoteType$ Fellowship,Aid | VoteFellowship$ Fellowship | VoteAid$ AidPlus | EachVote$ True | SubAbility$ DBGainControl SVar:Fellowship:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature you control | ImprintChosen$ True | Mandatory$ True SVar:AidPlus:DB$ StoreSVar | SVar$ Aid | Type$ CountSVar | Expression$ Aid/Plus.1 SVar:DBGainControl:DB$ GainControl | Defined$ Imprinted | NewController$ You | SubAbility$ DBAnimate diff --git a/forge-gui/res/cardsfolder/p/prisoners_dilemma.txt b/forge-gui/res/cardsfolder/p/prisoners_dilemma.txt new file mode 100644 index 00000000000..9ad04acd866 --- /dev/null +++ b/forge-gui/res/cardsfolder/p/prisoners_dilemma.txt @@ -0,0 +1,15 @@ +Name:Prisoner's Dilemma +ManaCost:3 R R +Types:Sorcery +A:SP$ GenericChoice | Defined$ Opponent | TempRemember$ Chooser | Secretly$ True | Choices$ Silence,Snitch | SubAbility$ DBSilenceBranch | StackDescription$ SpellDescription | SpellDescription$ Each opponent secretly chooses silence or snitch, then the choices are revealed. If each opponent chose silence, CARDNAME deals 4 damage to each of them. If each opponent chose snitch, CARDNAME deals 8 damage to each of them. Otherwise, CARDNAME deals 12 damage to each opponent who chose silence. +SVar:Silence:DB$ Pump | Defined$ Remembered | NoteCards$ Self | NoteCardsFor$ Silence | SpellDescription$ Silence +SVar:Snitch:DB$ Pump | Defined$ Remembered | NoteCards$ Self | NoteCardsFor$ Snitch | SpellDescription$ Snitch +SVar:DBSilenceBranch:DB$ Branch | BranchConditionSVar$ PlayerCountPropertyOpponents$HasPropertyNotedForSilence | BranchConditionSVarCompare$ EQPlayerCountOpponents$Amount | TrueSubAbility$ Damage4 | FalseSubAbility$ DBSnitchBranch +SVar:DBSnitchBranch:DB$ Branch | BranchConditionSVar$ PlayerCountPropertyOpponents$HasPropertyNotedForSnitch | BranchConditionSVarCompare$ EQPlayerCountOpponents$Amount | TrueSubAbility$ Damage8 | FalseSubAbility$ Damage12 +SVar:Damage4:DB$ DealDamage | Defined$ Opponent | NumDmg$ 4 | SubAbility$ DBCleanup +SVar:Damage8:DB$ DealDamage | Defined$ Opponent | NumDmg$ 8 | SubAbility$ DBCleanup +SVar:Damage12:DB$ DealDamage | Defined$ Opponent.NotedForSilence | NumDmg$ 12 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Pump | Defined$ Player | ClearNotedCardsFor$ Silence,Snitch +K:Flashback:5 R R +DeckHas:Ability$Graveyard +Oracle:Each opponent secretly chooses silence or snitch, then the choices are revealed. If each opponent chose silence, Prisoner's Dilemma deals 4 damage to each of them. If each opponent chose snitch, Prisoner's Dilemma deals 8 damage to each of them. Otherwise, Prisoner's Dilemma deals 12 damage to each opponent who chose silence.\nFlashback {5}{R}{R} diff --git a/forge-gui/res/cardsfolder/t/trap_the_trespassers.txt b/forge-gui/res/cardsfolder/t/trap_the_trespassers.txt index 6381098e1d2..8de35a3d8ab 100644 --- a/forge-gui/res/cardsfolder/t/trap_the_trespassers.txt +++ b/forge-gui/res/cardsfolder/t/trap_the_trespassers.txt @@ -1,7 +1,7 @@ Name:Trap the Trespassers ManaCost:2 U Types:Instant -A:SP$ Vote | Defined$ Player | Secret$ True | StoreVoteNum$ True | VoteCard$ Creature.YouDontCtrl | RememberVotedObjects$ True | AILogic$ Judgment | SubAbility$ DBRepeatStun | StackDescription$ SpellDescription | SpellDescription$ Secret council — Each player secretly votes for a creature you don't control, then those votes are revealed. +A:SP$ Vote | Defined$ Player | Secretly$ True | StoreVoteNum$ True | VoteCard$ Creature.YouDontCtrl | RememberVotedObjects$ True | AILogic$ Judgment | SubAbility$ DBRepeatStun | StackDescription$ SpellDescription | SpellDescription$ Secret council — Each player secretly votes for a creature you don't control, then those votes are revealed. SVar:DBRepeatStun:DB$ RepeatEach | UseImprinted$ True | DefinedCards$ Remembered | RepeatSubAbility$ DBPutCounter | AmountFromVotes$ True | SubAbility$ DBCleanup | SpellDescription$ For each creature with one or more votes, put that many stun counters on it, then tap it. (If a permanent with a stun counter would become untapped, remove one from it instead.) SVar:DBPutCounter:DB$ PutCounter | Defined$ Imprinted | CounterType$ STUN | CounterNum$ Votes | SubAbility$ DBTap SVar:DBTap:DB$ Tap | Defined$ Imprinted diff --git a/forge-gui/res/cardsfolder/t/truth_or_consequences.txt b/forge-gui/res/cardsfolder/t/truth_or_consequences.txt index e984cad632d..95b1ce380a7 100644 --- a/forge-gui/res/cardsfolder/t/truth_or_consequences.txt +++ b/forge-gui/res/cardsfolder/t/truth_or_consequences.txt @@ -1,7 +1,7 @@ Name:Truth or Consequences ManaCost:2 U R Types:Sorcery -A:SP$ Vote | Defined$ Player | Secret$ True | VoteType$ Truth,Consequences | StoreVoteNum$ True | SubAbility$ DBDraw | SpellDescription$ Secret council — Each player secretly votes for truth or consequences, then those votes are revealed. You draw cards equal to the number of truth votes. Then choose an opponent at random. CARDNAME deals 3 damage to that player for each consequences vote. +A:SP$ Vote | Defined$ Player | Secretly$ True | VoteType$ Truth,Consequences | StoreVoteNum$ True | SubAbility$ DBDraw | SpellDescription$ Secret council — Each player secretly votes for truth or consequences, then those votes are revealed. You draw cards equal to the number of truth votes. Then choose an opponent at random. CARDNAME deals 3 damage to that player for each consequences vote. SVar:DBDraw:DB$ Draw | NumCards$ VoteNumTruth | SubAbility$ DBChoose SVar:DBChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Opponent | Random$ True | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | Defined$ ChosenPlayer | NumDmg$ X diff --git a/forge-gui/res/cardsfolder/upcoming/vault_11_voters_dilemma.txt b/forge-gui/res/cardsfolder/upcoming/vault_11_voters_dilemma.txt index 144233628aa..054b86810e8 100644 --- a/forge-gui/res/cardsfolder/upcoming/vault_11_voters_dilemma.txt +++ b/forge-gui/res/cardsfolder/upcoming/vault_11_voters_dilemma.txt @@ -4,7 +4,7 @@ Types:Enchantment Saga K:Chapter:3:DBToken,DBVote,DBVote SVar:DBToken:DB$ Token | TokenAmount$ OneEach | TokenScript$ w_1_1_human_soldier SVar:OneEach:PlayerCountOpponents$Amount -SVar:DBVote:DB$ Vote | Defined$ Player | Secret$ True | VoteCard$ Creature | VoteMessage$ for a creature | UpTo$ True | VoteSubAbility$ DBDestroyAll | SubAbility$ DBBranch | SpellDescription$ Each player secretly votes for up to one creature, then those votes are revealed. If no creature got votes, each player draws a card. Otherwise, destroy each creature with the most votes or tied for most votes. +SVar:DBVote:DB$ Vote | Defined$ Player | Secretly$ True | VoteCard$ Creature | VoteMessage$ for a creature | UpTo$ True | VoteSubAbility$ DBDestroyAll | SubAbility$ DBBranch | SpellDescription$ Each player secretly votes for up to one creature, then those votes are revealed. If no creature got votes, each player draws a card. Otherwise, destroy each creature with the most votes or tied for most votes. SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.IsRemembered | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | Defined$ Player | NumCards$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 SVar:X:Remembered$Amount diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 21b5e0585c5..ae8e022a4db 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2261,7 +2261,7 @@ lblRandomTypeChosen=Randomly chosen type: {0} lblPlayerChooseValueOfEffectOfCard={0} chose {1} for effect of {2} lblPlayerFlipComesUpValue={0} flip comes up {1} lblPlayerActionFlip={0} {1} the flip -lblPlayerChooseValue={0} choose {1} +lblPlayerChooseValue={0} chose {1} lblPlayerVoteValue={0} vote {1} lblCardEffectValueIs={0} effect''s value is {1} lblCardEffectToTargetValueIs={0} effect''s value for {1} is {2}