Merge branch 'master' into newmaster

This commit is contained in:
Anthony Calosa
2022-07-25 07:51:43 +08:00
21 changed files with 128 additions and 23 deletions

View File

@@ -297,6 +297,7 @@ public class PumpEffect extends SpellAbilityEffect {
if (sa.hasParam("DefinedKW")) {
String defined = sa.getParam("DefinedKW");
String replaced = "";
String name = "";
if (defined.equals("ChosenType")) {
replaced = host.getChosenType();
} else if (defined.equals("ActivatorName")) {
@@ -307,12 +308,28 @@ public class PumpEffect extends SpellAbilityEffect {
PlayerCollection players = AbilityUtils.getDefinedPlayers(host, defined, sa);
if (players.isEmpty()) return;
replaced = "PlayerUID_" + players.get(0).getId();
name = players.get(0).getName();
} else if (defined.equals("ChosenColor")) {
String color = host.getChosenColor();
replaced = color.substring(0, 1).toUpperCase() + color.substring(1);
}
for (int i = 0; i < keywords.size(); i++) {
keywords.set(i, TextUtil.fastReplace(keywords.get(i), defined, replaced));
if (keywords.get(i).startsWith("Protection:") && !name.equals("")) {
List<String> parts = Arrays.asList(keywords.get(i).split(":"));
String desc = parts.get(2);
if (desc.contains("PlayerUID")) {
parts.set(2, TextUtil.fastReplace(desc, replaced, name));
StringBuilder mod = new StringBuilder();
for (int n = 0; n < parts.size(); n++) {
mod.append(parts.get(n));
if (n + 1 < parts.size()) {
mod.append(":");
}
}
keywords.set(i, mod.toString());
}
}
}
}
if (sa.hasParam("DefinedLandwalk")) {

View File

@@ -3630,6 +3630,9 @@ public class CardFactoryUtil {
if (kws.length > 3) {
effect += "| Exceptions$ " + kws[3];
}
if (kws.length > 4) {
effect += " | ExceptionSBA$ True";
}
}
effect += " | Description$ " + desc;
inst.addStaticAbility(StaticAbility.create(effect, state.getCard(), state, intrinsic));

View File

@@ -3232,6 +3232,17 @@ public class Player extends GameEntity implements Comparable<Player> {
this.updateZoneForView(com);
}
public String trimKeywords(String keywordTexts) {
if (keywordTexts.contains("Protection:")) {
List <String> lines = Arrays.asList(keywordTexts.split("\n"));
for (int i = 0; i < lines.size(); i++) {
if (lines.get(i).startsWith("Protection:")) {
List<String> parts = Arrays.asList(lines.get(i).split(":"));
if (parts.size() > 2) {
keywordTexts = TextUtil.fastReplace(keywordTexts, lines.get(i), parts.get(2));
}
}
}
}
keywordTexts = TextUtil.fastReplace(keywordTexts,":Card.named", " from ");
keywordTexts = TextUtil.fastReplace(keywordTexts, ":Card.Black:", " from ");
keywordTexts = TextUtil.fastReplace(keywordTexts, ":Card.Blue:", " from ");

View File

@@ -44,7 +44,7 @@ public class StaticAbilityCantAttach {
}
}
if (checkSBA && stAb.hasParam("Exceptions") && stAb.matchesValidParam("Exceptions", card)) {
if ((checkSBA || !stAb.hasParam("ExceptionSBA")) && stAb.hasParam("Exceptions") && stAb.matchesValidParam("Exceptions", card)) {
return false;
}

View File

@@ -229,7 +229,10 @@ public class ImageCache {
if (card != null)
imageKey = altState ? card.getCardAltImageKey() : card.getCardImageKey();
if (StringUtils.isBlank(imageKey)) {
if (useDefaultIfNotFound)
return defaultImage;
else
return null;
}
}

View File

@@ -24,7 +24,7 @@ User data files, like decks, saved gauntlets, and card pictures, are now stored
userDir=$HOME/.forge/
cacheDir=$HOME/.cache/forge/
The appdata directory is hidden by default in Win7. Open a Windows Explorer window (or double-click on My Computer] and in the address field type "%appdata%/forge/" (without the quotes). If that doesn't work, type "%appdata"/roaming/forge".
The appdata directory is hidden by default in Windows 7 and above versions. Open a Windows Explorer window (or double-click on My Computer] and in the address field type "%appdata%/forge/" (without the quotes). If that doesn't work, type "%appdata"/roaming/forge".
cardPicsDir is defined as <cacheDir>/pics/cards/ by default. If you wish to use a non-default directory, please see the forge.profile.preferences.example file located in the Forge installation directory root. You can use this file to, for example, share the card pics directory with another program, such as Magic Workstation.
@@ -108,8 +108,9 @@ If you're trying to run Forge for the first time, but it doesn't open up, you ca
- Current versions of Forge no longer include a launcher script for Mac OS, proceed to step three.
3) Run Forge
- On Windows, just type "forge.exe", Enter
- On Linux, just type "forge.sh", Enter
- On Windows, just type "forge.exe", Enter (If you have Java 8 installed, use forge-java8.exe)
if you want to run mobile/adventure instead of the desktop interface, type "forge-adventure.exe", Enter (If you have Java 8 installed, use forge-adventure-java8.exe)
- On Linux, just type "forge.sh", Enter (if you want to run mobile/adventure interface use forge-adventure.sh)
- Launch the Forge application bundle by double clicking on the program named "Forge.app".
Now you will probably see some sort of Error in the console. the first few lines contain a message that might help you. If you can't fix the problem yourself, please take the complete output and report your problem on the Forum.
@@ -124,9 +125,7 @@ if you're running Windows 7, make sure you're running the program as an admin, o
Java Issues:
------------
Forge is likely to be compatible with Java 7 at this time. Some people have used forge with Java 7 and have not reported any problems that are related to Java 7. If you would like to upgrade to Java 7 and have held off because of Forge then you may upgrade as we do not think that it will cause an incompatibility type of problem. We will continue to try to maintain compatibility with Java 6 for the foreseeable future.
Forge requires Java 6 and will not run if you have an earlier version of Java. You will need to update to Java 6.
Forge requires Java 8 as minimum installed and will not run if you have an earlier version of Java. You will need to update to Java 8. (Java 11 is recommended)
Card Picture Issues:
@@ -148,11 +147,7 @@ This should save enough bandwidth that everyone will be able to download the new
Reporting Bugs:
---------------
To report a bug with an official beta release, please follow the instructions at http://www.slightlymagic.net/wiki/Forge#I_think_I_found_a_bug_in_Forge._What_do_I_do.3F .
To report a bug (1) with an alpha test, (2) with a nightly build, (3) with something compiled from the official Forge software repository, or (4) with the leading edge (formerly "SVN Bug Reports"), please do not submit your bugs to the forum. Instead, please follow the instructions at http://www.slightlymagic.net/wiki/How_to_File_a_Bug_Report_with_Mantis.
Forge will now allow you to upload a crash report to the Forge forum at CCGH.
If you haven't join Forge discord server, you can join at https://discord.gg/3v9JCVr, to report bugs in the help channel.
A new very hard tier category in Quest mode:
@@ -511,6 +506,10 @@ We have a forge forum topic at the Collectible Card Games Headquarters web site
http://www.slightlymagic.net/forum/viewtopic.php?f=26&t=8570
Much better to join Forge discord server as most Devs are active here:
https://discord.gg/3v9JCVr
Notes about the second Quest World, Jamuraa:
--------------------------------------------
@@ -1551,7 +1550,7 @@ Desktop Forge UI has been updated a little bit. In the deck editor, the +/- butt
- Android Updates -
Some work went into porting the remaining features from desktop version of the game to mobile Forge. In particular, it is now possible to start a match against a particular opponent in Sealed Deck and Booster Draft modes in addition to the gauntlet mode which is still default. The work to enable quest draft tournaments in mobile Forge is ongoing and should not be considered complete at the moment, draft tournaments in quest mode are still not fully functional in mobile Forge and you will not be able to complete a draft tournament yet.
The mobile port of Forge now features an option "Battlefield Texture Filtering" which smoothes out card art on the battlefield. This can help make the graphics smoother on larger tablet screens (e.g. 12") or when connected to an external monitor. This option, however, comes with a performance penalty and may blur the card art too much on smaller screens. It is disabled by default.
The mobile port of Forge now features an option "Battlefield Texture Filtering" which smoothes out card art on the battlefield. This can help make the graphics smoother on larger tablet screens (e.g. 12") or when connected to an external monitor. This option, however, comes with a performance penalty and may blur the card art too much on smaller screens. If you have 3GB RAM or less, disabling this option is recommended (as of Forge 1.6.53 and above versions).
v1.5.59 Changes
===============

View File

@@ -6,5 +6,5 @@ K:Enchant creature
K:ETBReplacement:Other:ChooseColor
SVar:ChooseColor:DB$ ChooseColor | Defined$ You | AILogic$ MostProminentInHumanDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a color.
A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Pump
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.ChosenColor:Protection from chosenColor:Aura.YouCtrl,Equipment.YouCtrl | Description$ Enchanted creature has protection from the chosen color. This effect doesn't remove Auras and Equipment you control that are already attached to it.
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Protection:Card.ChosenColor:Protection from chosenColor:Aura.YouCtrl,Equipment.YouCtrl:SBA | Description$ Enchanted creature has protection from the chosen color. This effect doesn't remove Auras and Equipment you control that are already attached to it.
Oracle:Flash\nEnchant creature\nAs Benevolent Blessing enters the battlefield, choose a color.\nEnchanted creature has protection from the chosen color. This effect doesn't remove Auras and Equipment you control that are already attached to it.

View File

@@ -1,6 +1,6 @@
Name:Confound
ManaCost:1 U
Types:Instant
A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature | SubAbility$ DBDraw | SpellDescription$ Counter target spell that targets a creature. Draw a card.
A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature.inZoneBattlefield | SubAbility$ DBDraw | SpellDescription$ Counter target spell that targets a creature. Draw a card.
SVar:DBDraw:DB$ Draw | NumCards$ 1
Oracle:Counter target spell that targets a creature.\nDraw a card.

View File

@@ -6,5 +6,5 @@ K:Flying
K:Haste
K:ETBReplacement:Other:ChooseP
SVar:ChooseP:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent | Secretly$ True | SpellDescription$ As CARDNAME enters the battlefield, secretly choose an opponent.
A:AB$ ChangeTargets | Cost$ RevealChosenPlayer | TargetType$ Spell,Activated,Triggered | ValidTgts$ Card | ConditionTargetValidTargeting$ Permanent.YouCtrl,You | ConditionPlayerDefined$ TargetedController | ConditionPlayerContains$ Player.Chosen | GameActivationLimit$ 1 | SpellDescription$ Choose new targets for target spell or ability if it's controlled by the chosen player and if it targets you or a permanent you control. Activate only once.
A:AB$ ChangeTargets | Cost$ RevealChosenPlayer | TargetType$ Spell,Activated,Triggered | ValidTgts$ Card | ConditionTargetValidTargeting$ Permanent.YouCtrl+inZoneBattlefield,You | ConditionPlayerDefined$ TargetedController | ConditionPlayerContains$ Player.Chosen | GameActivationLimit$ 1 | SpellDescription$ Choose new targets for target spell or ability if it's controlled by the chosen player and if it targets you or a permanent you control. Activate only once.
Oracle:Flying, haste\nAs Emissary of Grudges enters the battlefield, secretly choose an opponent.\nReveal the player you chose: Choose new targets for target spell or ability if it's controlled by the chosen player and if it targets you or a permanent you control. Activate only once.

View File

@@ -5,6 +5,6 @@ PT:5/5
K:Flying
T:Mode$ ChangesZone | ValidCard$ Card.wasCast+Self | Destination$ Battlefield | Execute$ DBAddTurn | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it, target opponent takes an extra turn after this one. Until your next turn, you and planeswalkers you control gain protection from that player. (You and planeswalkers you control can't be targeted, dealt damage, or enchanted by anything controlled by that player.)
SVar:DBAddTurn:DB$ AddTurn | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumTurns$ 1 | SubAbility$ DBPump
SVar:DBPump:DB$ Pump | Defined$ You | KW$ Protection:Player.TargetedPlayer:Protection from the target opponent | DefinedKW$ TargetedPlayer | Duration$ UntilYourNextTurn | SubAbility$ DBPumpWalkers
SVar:DBPumpWalkers:DB$ Pump | Defined$ Valid Planeswalker.YouCtrl | KW$ Protection:Player.TargetedPlayer:Protection from the target opponent | DefinedKW$ TargetedPlayer | Duration$ UntilYourNextTurn
SVar:DBPump:DB$ Pump | Defined$ You | KW$ Protection:Player.TargetedPlayer:Protection from TargetedPlayer | DefinedKW$ TargetedPlayer | Duration$ UntilYourNextTurn | SubAbility$ DBPumpWalkers
SVar:DBPumpWalkers:DB$ Pump | Defined$ Valid Planeswalker.YouCtrl | KW$ Protection:Player.TargetedPlayer:Protection from TargetedPlayer | DefinedKW$ TargetedPlayer | Duration$ UntilYourNextTurn
Oracle:Flying\nWhen Eon Frolicker enters the battlefield, if you cast it, target opponent takes an extra turn after this one. Until your next turn, you and planeswalkers you control gain protection from that player. (You and planeswalkers you control can't be targeted, dealt damage, or enchanted by anything controlled by that player.)

View File

@@ -1,6 +1,6 @@
Name:Hindering Light
ManaCost:W U
Types:Instant
A:SP$ Counter | Cost$ W U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Permanent.YouCtrl,You | SpellDescription$ Counter target spell that targets you or a permanent you control. Draw a card. | SubAbility$ DB
A:SP$ Counter | Cost$ W U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Permanent.YouCtrl+inZoneBattlefield,You | SpellDescription$ Counter target spell that targets you or a permanent you control. Draw a card. | SubAbility$ DB
SVar:DB:DB$ Draw | NumCards$ 1
Oracle:Counter target spell that targets you or a permanent you control.\nDraw a card.

View File

@@ -2,6 +2,6 @@ Name:Hydromorph Guardian
ManaCost:2 U
Types:Creature Elemental
PT:2/2
A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature.YouCtrl | SpellDescription$ Counter target spell that targets a creature you control.
A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature.YouCtrl+inZoneBattlefield | SpellDescription$ Counter target spell that targets a creature you control.
AI:RemoveDeck:All
Oracle:{U}, Sacrifice Hydromorph Guardian: Counter target spell that targets a creature you control.

View File

@@ -3,6 +3,6 @@ ManaCost:3 U U
Types:Creature Elemental Bird
PT:3/3
K:Flying
A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature.YouCtrl | SpellDescription$ Counter target spell that targets a creature you control.
A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature.YouCtrl+inZoneBattlefield | SpellDescription$ Counter target spell that targets a creature you control.
AI:RemoveDeck:All
Oracle:Flying\n{U}, Sacrifice Hydromorph Gull: Counter target spell that targets a creature you control.

View File

@@ -0,0 +1,10 @@
Name:From the Catacombs
ManaCost:3 B B
Types:Sorcery
A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | RememberChanged$ True | GainControl$ True | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature | WithCountersType$ CORPSE | LeaveBattlefield$ Exile | SubAbility$ DBInitiative | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control with a corpse counter on it. If that creature would leave the battlefield, exile it instead of putting it anywhere else.
SVar:DBInitiative:DB$ TakeInitiative | SpellDescription$ You take the initiative.
K:Escape:3 B B ExileFromGrave<5/Card.Other/other>
SVar:AIPreference:ExileFromGraveCost$Card.YouOwn+Other+inZoneGraveyard
DeckHas:Ability$Graveyard
DeckHints:Ability$Discard
Oracle:Put target creature card from a graveyard onto the battlefield under your control with a corpse counter on it. If that creature would leave the battlefield, exile it instead of putting it anywhere else.\nYou take the initiative.\nEscape—{3}{B}{B}, Exile five other cards from your graveyard. (You may cast this card from your graveyard for its escape cost.)

View File

@@ -0,0 +1,8 @@
Name:Guildsworn Prowler
ManaCost:1 B
Types:Creature Tiefling Rogue Assassin
PT:2/1
K:Deathtouch
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+notblocking | Execute$ TrigDraw | TriggerDescription$ When CARDNAME dies, if it wasn't blocking, draw a card.
SVar:TrigDraw:DB$ Draw
Oracle:Deathtouch\nWhen Guildsworn Prowler dies, if it wasn't blocking, draw a card.

View File

@@ -0,0 +1,19 @@
Name:Horn of Valhalla
ManaCost:1 W
Types:Artifact Equipment
S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ X | Description$ Equipped creature gets +1/+1 for each creature you control.
SVar:X:Count$Valid Creature.YouCtrl
SVar:BuffedBy:Creature
K:Equip:3
AlternateMode:Adventure
Oracle:Equipped creature gets +1/+1 for each creature you control.\nEquip {3}
ALTERNATE
Name:Ysgard's Call
ManaCost:X W W
Types:Sorcery Adventure
A:SP$ Token | TokenAmount$ X | TokenScript$ w_1_1_soldier | SpellDescription$ Create X 1/1 white Soldier creature tokens. (Then exile this card. You may cast the artifact later from exile.)
SVar:X:Count$xPaid
DeckHas:Ability$Token & Type$Soldier
Oracle:Create X 1/1 white Soldier creature tokens. (Then exile this card. You may cast the artifact later from exile.)

View File

@@ -0,0 +1,8 @@
Name:Inspiring Leader
ManaCost:2 W
Types:Legendary Enchantment Background
S:Mode$ Continuous | Affected$ Creature.IsCommander+YouOwn | AddStaticAbility$ BuffTokens | Description$ Commander creatures you own have "Creature tokens you control get +2/+2."
SVar:BuffTokens:Mode$ Continuous | Affected$ Creature.token+YouCtrl | AddPower$ 2 | AddToughness$ 2 | Description$ Creature tokens you control get +2/+2.
DeckNeeds:Ability$Token
AI:RemoveDeck:NonCommander
Oracle:Commander creatures you own have "Creature tokens you control get +2/+2."

View File

@@ -0,0 +1,12 @@
Name:Intellect Devourer
ManaCost:3 B
Types:Creature Horror
PT:2/4
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ Devour Intellect — When CARDNAME enters the battlefield, each opponent exiles a card from their hand until CARDNAME leaves the battlefield.
SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ChangeType$ Card | DefinedPlayer$ Opponent | Mandatory$ True | ChangeType$ Card | Hidden$ True | Duration$ UntilHostLeavesPlay | IsCurse$ True | RememberChanged$ True
S:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ Body Thief — You may play lands and cast spells from among cards exiled with CARDNAME. If you cast a spell this way, you may spend mana as though it were mana of any color to cast it.
T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget
SVar:DBForget:DB$ Pump | Defined$ TriggeredCard | ForgetObjects$ TriggeredCard
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:Devour Intellect — When Intellect Devourer enters the battlefield, each opponent exiles a card from their hand until Intellect Devourer leaves the battlefield.\nBody Thief — You may play lands and cast spells from among cards exiled with Intellect Devourer. If you cast a spell this way, you may spend mana as though it were mana of any color to cast it.

View File

@@ -10,5 +10,6 @@ SVar:EOTSac:Mode$ Phase | Phase$ End of Turn | Execute$ TrigSac | TriggerDescrip
SVar:TrigSac:DB$ Sacrifice
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Token|Sacrifice
DeckHints:Type$Adventure & Keyword$Foretell
AI:RemoveDeck:Random
Oracle:Flying/nWhenever you cast a spell from exile, copy it. You may choose new targets for the copy. If it's a permanent spell, the copy gains haste and "At the beginning of the end step, sacrifice this permanent." (A copy of a permanent spell becomes a token.)

View File

@@ -0,0 +1,14 @@
Name:Noble Heritage
ManaCost:1 W
Types:Legendary Enchantment Background
S:Mode$ Continuous | Affected$ Creature.IsCommander+YouOwn | AddTrigger$ ETB & Upkeep | Description$ Commander creatures you own have "When this creature enters the battlefield and at the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. For each opponent who does, you gain protection from that player until your next turn." (You can't be targeted, dealt damage, or enchanted by anything controlled by that player.)
SVar:ETB:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ When this creature enters the battlefield and at the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. For each opponent who does, you gain protection from that player until your next turn.
SVar:Upkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoose | Secondary$ True | TriggerDescription$ When this creature enters the battlefield and at the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. For each opponent who does, you gain protection from that player until your next turn.
SVar:TrigChoose:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoice | SubAbility$ DBPutCounter
SVar:DBChoice:DB$ ChooseCard | Defined$ Player.IsRemembered | Amount$ 1 | MinAmount$ 0 | Choices$ Creature.RememberedPlayerCtrl | RememberChosen$ True
SVar:DBPutCounter:DB$ PutCounterAll | ValidCards$ Creature.IsRemembered | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBRememberPlayer
SVar:DBRememberPlayer:DB$ Pump | RememberObjects$ RememberedController | SubAbility$ DBRepeatEach
SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Opponent.IsRemembered | RepeatSubAbility$ DBPump | SubAbility$ DBCleanup
SVar:DBPump:DB$ Pump | Defined$ You | KW$ Protection:Player.RememberedPlayer:Protection from RememberedPlayer | DefinedKW$ RememberedPlayer | Duration$ UntilYourNextTurn
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | ClearRemembered$ True
Oracle:Commander creatures you own have "When this creature enters the battlefield and at the beginning of your upkeep, each player may put two +1/+1 counters on a creature they control. For each opponent who does, you gain protection from that player until your next turn." (You can't be targeted, dealt damage, or enchanted by anything controlled by that player.)