Merge branch 'revealhand' into 'master'

RevealHandEffect: fix not revealing to all players

See merge request core-developers/forge!6269
This commit is contained in:
Michael Kamensky
2022-02-20 20:21:22 +00:00
24 changed files with 34 additions and 26 deletions

View File

@@ -449,11 +449,13 @@ public class AiAttackController {
return false;
}
CardLists.sortByPowerDesc(oppList);
for (Card attacker : oppList) {
if (!ComputerUtilCombat.canAttackNextTurn(attacker)) {
continue;
}
if (blockersLeft > 0 && CombatUtil.canBeBlocked(attacker, ai)) {
// TODO doesn't take trample into account
blockersLeft--;
continue;
}
@@ -461,6 +463,8 @@ public class AiAttackController {
// Test for some special triggers that can change the creature in combat
Card effectiveAttacker = ComputerUtilCombat.applyPotentialAttackCloneTriggers(attacker);
// TODO commander
totalAttack += ComputerUtilCombat.damageIfUnblocked(effectiveAttacker, ai, null, false);
totalPoison += ComputerUtilCombat.poisonIfUnblocked(effectiveAttacker, ai);
}
@@ -878,7 +882,7 @@ public class AiAttackController {
if (ComputerUtilCombat.canAttackNextTurn(pCard) && pCard.getNetCombatDamage() > 0) {
candidateAttackers.add(pCard);
candidateUnblockedDamage += ComputerUtilCombat.damageIfUnblocked(pCard, opp, null, false);
computerForces += 1;
computerForces++;
}
}
@@ -897,13 +901,13 @@ public class AiAttackController {
if (pCard.getNetCombatDamage() > 0 && ComputerUtilCombat.canAttackNextTurn(pCard)) {
nextTurnAttackers.add(pCard);
candidateCounterAttackDamage += pCard.getNetCombatDamage();
humanForces += 1; // player forces they might use to attack
humanForces++; // player forces they might use to attack
}
// increment player forces that are relevant to an attritional attack - includes walls
Card potentialOppBlocker = getCardCanBlockAnAttacker(pCard, candidateAttackers, true);
if (potentialOppBlocker != null) {
humanForcesForAttritionalAttack += 1;
humanForcesForAttritionalAttack++;
if (predictEvasion) {
candidateAttackers.remove(potentialOppBlocker);
}

View File

@@ -181,7 +181,7 @@ public class DeckHints {
String[] typeParts = t.split("\\.");
op = Predicates.and(CardRulesPredicates.coreType(true, typeParts[0]), CardRulesPredicates.subType(typeParts[1]));
} else {
op = Predicates.or(CardRulesPredicates.coreType(true, t), CardRulesPredicates.subType(t));
op = CardRulesPredicates.joinedType(StringOp.CONTAINS_IC, t);
}
Iterables.addAll(cards, getMatchingItems(cardList, op, PaperCard.FN_GET_RULES));
}

View File

@@ -48,7 +48,11 @@ public class RevealHandEffect extends SpellAbilityEffect {
if (sa.hasParam("RevealType")) {
hand = CardLists.filter(hand, CardPredicates.isType(sa.getParam("RevealType")));
}
sa.getActivatingPlayer().getController().reveal(hand, ZoneType.Hand, p);
if (sa.hasParam("Look")) {
sa.getActivatingPlayer().getController().reveal(hand, ZoneType.Hand, p);
} else {
host.getGame().getAction().reveal(hand, p);
}
if (sa.hasParam("RememberRevealed")) {
host.addRemembered(hand);
}

View File

@@ -1,7 +1,7 @@
Name:Clairvoyance
ManaCost:U
Types:Instant
A:SP$ RevealHand | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DelTrigSlowtrip | SpellDescription$ Look at target player's hand. Draw a card at the beginning of next turn's upkeep.
A:SP$ RevealHand | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target player | Look$ True | SubAbility$ DelTrigSlowtrip | SpellDescription$ Look at target player's hand. Draw a card at the beginning of next turn's upkeep.
SVar:DelTrigSlowtrip:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ DrawSlowtrip | TriggerDescription$ Draw a card.
SVar:DrawSlowtrip:DB$ Draw | NumCards$ 1 | Defined$ You
AI:RemoveDeck:All

View File

@@ -4,5 +4,5 @@ Types:Creature Human Wizard
PT:0/6
K:Morph:Reveal<1/Card.Blue/blue>
T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigLook | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, look at target opponent's hand.
SVar:TrigLook:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent
SVar:TrigLook:DB$ RevealHand | ValidTgts$ Opponent | Look$ True | TgtPrompt$ Select target opponent
Oracle:Morph—Reveal a blue card in your hand. (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Dragon's Eye Savants is turned face up, look at target opponent's hand.

View File

@@ -4,7 +4,7 @@ Types:Creature Human Cleric
PT:3/1
K:Flying
T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigLook | TriggerDescription$ When CARDNAME enters the battlefield, look at target opponent's hand. You may exile a nonland card from it. For as long as that card remains exiled, its owner may play it. A spell cast this way costs {2} more to cast.
SVar:TrigLook:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | RememberRevealed$ True | SubAbility$ DBChooseCard
SVar:TrigLook:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Look$ True | RememberRevealed$ True | SubAbility$ DBChooseCard
SVar:DBChooseCard:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Card.nonLand+IsRemembered | ChoiceTitle$ You may exile a nonland card from it | MinAmount$ 0 | Amount$ 1 | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Hand | Destination$ Exile | Imprint$ True | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | Duration$ Permanent | StaticAbilities$ MayPlay,CostsMore | RememberObjects$ Imprinted | ForgetOnMoved$ Exile | SubAbility$ DBCleanup

View File

@@ -1,7 +1,7 @@
Name:Gitaxian Probe
ManaCost:PU
Types:Sorcery
A:SP$ RevealHand | Cost$ PU | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DBDraw | AIPhyrexianPayment$ Never | SpellDescription$ Look at target player's hand.
A:SP$ RevealHand | Cost$ PU | ValidTgts$ Player | TgtPrompt$ Select target player | Look$ True | SubAbility$ DBDraw | AIPhyrexianPayment$ Never | SpellDescription$ Look at target player's hand.
SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
AI:RemoveDeck:All
Oracle:({U/P} can be paid with either {U} or 2 life.)\nLook at target player's hand.\nDraw a card.

View File

@@ -1,6 +1,6 @@
Name:Glasses of Urza
ManaCost:1
Types:Artifact
A:AB$ RevealHand | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Look at target player's hand.
A:AB$ RevealHand | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select target player | Look$ True | SpellDescription$ Look at target player's hand.
AI:RemoveDeck:All
Oracle:{T}: Look at target player's hand.

View File

@@ -4,5 +4,5 @@ Types:Creature Human Rogue
PT:1/1
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target player's hand.
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Player | TgtPrompt$ Select target player
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Player | TgtPrompt$ Select target player | Look$ True
Oracle:Flying\nWhen Ingenious Thief enters the battlefield, look at target player's hand.

View File

@@ -2,5 +2,5 @@ Name:Lay Bare
ManaCost:2 U U
Types:Instant
A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ DBReveal | SpellDescription$ Counter target spell. Look at its controller's hand.
SVar:DBReveal:DB$ RevealHand | Defined$ TargetedController
SVar:DBReveal:DB$ RevealHand | Defined$ TargetedController | Look$ True
Oracle:Counter target spell. Look at its controller's hand.

View File

@@ -4,6 +4,6 @@ Types:Creature Horror
PT:6/6
K:Trample
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigReveal | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may look at that player's hand. If you do, you may cast a spell from among those cards without paying its mana cost.
SVar:TrigReveal:DB$ RevealHand | Defined$ TriggeredTarget | SubAbility$ TrigPlay
SVar:TrigReveal:DB$ RevealHand | Defined$ TriggeredTarget | SubAbility$ TrigPlay | Look$ True
SVar:TrigPlay:DB$ Play | Valid$ Card.ControlledBy TriggeredDefendingPlayer | ValidZone$ Hand | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True
Oracle:Trample\nWhenever Mindleech Mass deals combat damage to a player, you may look at that player's hand. If you do, you may cast a spell from among those cards without paying its mana cost.

View File

@@ -1,7 +1,7 @@
Name:Peek
ManaCost:U
Types:Instant
A:SP$ RevealHand | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ DBDraw | SpellDescription$ Look at target player's hand.
A:SP$ RevealHand | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target player | Look$ True | SubAbility$ DBDraw | SpellDescription$ Look at target player's hand.
SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
AI:RemoveDeck:All
Oracle:Look at target player's hand.\nDraw a card.

View File

@@ -3,5 +3,5 @@ ManaCost:1 U
Types:Creature Human
PT:1/2
T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ Whenever CARDNAME becomes blocked, you may look at defending player's hand.
SVar:TrigPeek:DB$ RevealHand | Defined$ TriggeredDefendingPlayer
SVar:TrigPeek:DB$ RevealHand | Defined$ TriggeredDefendingPlayer | Look$ True
Oracle:Whenever Port Inspector becomes blocked, you may look at defending player's hand.

View File

@@ -4,6 +4,6 @@ Types:Creature Demon Ninja
PT:6/5
K:Ninjutsu:4 U B
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigReveal | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, look at that player's hand. You may cast a spell from among those cards without paying its mana cost.
SVar:TrigReveal:DB$ RevealHand | Defined$ TriggeredTarget | SubAbility$ TrigPlay
SVar:TrigReveal:DB$ RevealHand | Defined$ TriggeredTarget | Look$ True | SubAbility$ TrigPlay
SVar:TrigPlay:DB$ Play | Valid$ Card.nonLand+DefenderCtrl | ValidZone$ Hand | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True
Oracle:Ninjutsu {4}{U}{B} ({4}{U}{B}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.)\nWhenever Silent-Blade Oni deals combat damage to a player, look at that player's hand. You may cast a spell from among those cards without paying its mana cost.

View File

@@ -2,7 +2,7 @@ Name:Slayer's Bounty
ManaCost:W
Types:Legendary Artifact Clue
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at the creature cards in target opponent's hand.
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | RevealType$ Creature
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Look$ True | RevealType$ Creature
T:Mode$ Sacrificed | ValidCard$ Clue.YouCtrl | Execute$ TrigDraft | TriggerZones$ Battlefield | TriggerDescription$ Whenever you CARDNAME or another Clue, draft a card from CARDNAME's spellbook.
SVar:TrigDraft:DB$ NameCard | Draft$ True | Defined$ You | ChooseFromList$ Bounty Agent,Outflank,Bound in Gold,Bring to Trial,Glass Casket,Reprobation,Collar the Culprit,Compulsory Rest,Expel,Fairgrounds Warden,Iron Verdict,Luminous Bonds,Raise the Alarm,Seal Away,Summary Judgment | SubAbility$ DBMakeCard
SVar:DBMakeCard:DB$ MakeCard | Name$ ChosenName | Zone$ Hand | SubAbility$ DBCleanup

View File

@@ -1,7 +1,7 @@
Name:Sorcerous Sight
ManaCost:U
Types:Sorcery
A:SP$ RevealHand | Cost$ U | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBDraw | SpellDescription$ Look at target opponent's hand.
A:SP$ RevealHand | Cost$ U | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Look$ True | SubAbility$ DBDraw | SpellDescription$ Look at target opponent's hand.
SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card.
AI:RemoveDeck:Random
Oracle:Look at target opponent's hand.\nDraw a card.

View File

@@ -3,7 +3,7 @@ ManaCost:2
Types:Artifact
K:ETBReplacement:Other:ChoosePlayer
SVar:ChoosePlayer:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent to look at the hand: | SubAbility$ DBLook | SpellDescription$ As CARDNAME enters the battlefield, look at an opponent's hand, then choose any card name.
SVar:DBLook:DB$ RevealHand | Defined$ ChosenPlayer | SubAbility$ DBNameCard
SVar:DBLook:DB$ RevealHand | Defined$ ChosenPlayer | Look$ True | SubAbility$ DBNameCard
SVar:DBNameCard:DB$ NameCard | Defined$ You | SubAbility$ DBClear
SVar:DBClear:DB$ Cleanup | ClearChosenPlayer$ True
S:Mode$ CantBeActivated | ValidCard$ Card.NamedCard | ValidSA$ Activated.nonManaAbility | Description$ Activated abilities of sources with the chosen name can't be activated unless they're mana abilities.

View File

@@ -4,5 +4,5 @@ Types:Creature Human Pirate Scout
PT:1/1
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target opponent's hand.
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Look$ True
Oracle:Flying\nWhen Talas Explorer enters the battlefield, look at target opponent's hand.

View File

@@ -3,5 +3,5 @@ ManaCost:2 U
Types:Creature Human Wizard
PT:2/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target opponent's hand.
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Look$ True
Oracle:When Telepathic Spies enters the battlefield, look at target opponent's hand.

View File

@@ -6,7 +6,7 @@ SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_1_1_bird_flying | Token
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2
SVar:DBEffect:DB$ Effect | Triggers$ TrigDamage | SpellDescription$ Whenever one or more creatures you control with flying deal combat damage to a player this turn, look at that player's hand and draw a card.
SVar:TrigDamage:Mode$ DamageDoneOnce | ValidSource$ Creature.YouCtrl+withFlying | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPeek | TriggerDescription$ Whenever one or more creatures you control with flying deal combat damage to a player this turn, look at that player's hand and draw a card.
SVar:TrigPeek:DB$ RevealHand | Defined$ TriggeredTarget | SubAbility$ DBDraw | SpellDescription$ Look at that player's hand.
SVar:TrigPeek:DB$ RevealHand | Defined$ TriggeredTarget | SubAbility$ DBDraw | Look$ True | SpellDescription$ Look at that player's hand.
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card.
SVar:DBWish:DB$ ChangeZone | Origin$ Sideboard | Destination$ Library | OptionalDecider$ You | ChangeType$ Card.YouOwn | ChangeNum$ 1 | Optional$ True | Hidden$ True | SpellDescription$ You may put a card you own from outside the game on top of your library.
DeckHas:Ability$Token

View File

@@ -4,7 +4,7 @@ Types:Creature Human Ninja
PT:1/2
K:Ninjutsu:1 U
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigReveal | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, look at that player's hand.
SVar:TrigReveal:DB$ RevealHand | Defined$ TriggeredTarget
SVar:TrigReveal:DB$ RevealHand | Defined$ TriggeredTarget | Look$ True
A:AB$ ChangeZone | Cost$ 1 U | ValidTgts$ Ninja.YouCtrl | TgtPrompt$ Select target Ninja you control | Origin$ Battlefield | Destination$ Hand | PlayerTurn$ True | SpellDescription$ Return target Ninja you control to its owner's hand. Activate only during your turn.
DeckHints:Type$Ninja
Oracle:Ninjutsu {1}{U} ({1}{U}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.)\nWhenever Walker of Secret Ways deals combat damage to a player, look at that player's hand.\n{1}{U}: Return target Ninja you control to its owner's hand. Activate only during your turn.

View File

@@ -3,5 +3,5 @@ ManaCost:4 U
Types:Creature Drone
PT:3/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target opponent's hand.
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Look$ True
Oracle:When Wanderguard Sentry enters the battlefield, look at target opponent's hand.

View File

@@ -1,7 +1,7 @@
Name:Word of Command
ManaCost:B B
Types:Instant
A:SP$ RevealHand | ValidTgts$ Opponent | RememberRevealed$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Look at target opponent's hand and choose a card from it. You control that player until CARDNAME finishes resolving. The player plays that card if able. While doing so, the player can activate mana abilities only if they're from lands that player controls and only if mana they produce is spent to activate other mana abilities of lands the player controls and/or to play that card. If the chosen card is cast as a spell, you control the player while that spell is resolving.
A:SP$ RevealHand | ValidTgts$ Opponent | RememberRevealed$ True | Look$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Look at target opponent's hand and choose a card from it. You control that player until CARDNAME finishes resolving. The player plays that card if able. While doing so, the player can activate mana abilities only if they're from lands that player controls and only if mana they produce is spent to activate other mana abilities of lands the player controls and/or to play that card. If the chosen card is cast as a spell, you control the player while that spell is resolving.
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Card.IsRemembered | ChoiceZone$ Hand | Amount$ 1 | Mandatory$ True | SubAbility$ DBManaLandOnlyEffect
SVar:DBManaLandOnlyEffect:DB$ Effect | EffectOwner$ TargetedPlayer | StaticAbilities$ DBLimitMana | ImprintOnHost$ True | Duration$ Permanent | SubAbility$ DBPlay
SVar:DBLimitMana:Mode$ CantBeActivated | ValidSA$ Activated.nonLand,Activated.ManaAbilityCantPaidFor | EffectZone$ Command | Description$ While doing so, the player can activate mana abilities only if they're from lands that player controls and only if mana they produce is spent to activate other mana abilities of lands the player controls and/or to play that card.

View File

@@ -4,5 +4,5 @@ Types:Creature Human Soldier Scout
PT:1/1
K:Horsemanship
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target opponent's hand.
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent
SVar:TrigPeek:DB$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Look$ True
Oracle:Horsemanship (This creature can't be blocked except by creatures with horsemanship.)\nWhen Wu Scout enters the battlefield, look at target opponent's hand.