From 1f6c4a430d1ef5cd1bb88263ad6990b4ef753370 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Sun, 11 Dec 2022 20:14:22 +0100 Subject: [PATCH] Clean up --- .../deck/generation/DeckGeneratorBase.java | 6 +- forge-game/src/main/java/forge/game/Game.java | 2 +- .../ability/effects/ChangeZoneEffect.java | 4 +- .../ability/effects/DamageDealEffect.java | 7 +-- .../game/ability/effects/DraftEffect.java | 1 - .../game/ability/effects/MakeCardEffect.java | 9 ++- .../game/trigger/TriggerDamagePrevented.java | 5 -- .../trigger/TriggerDamagePreventedOnce.java | 5 -- .../SpellAbilityPickerSimulationTest.java | 60 +++++++++---------- .../a/ashcoat_of_the_shadow_swarm.txt | 2 +- .../res/cardsfolder/h/hunters_insight.txt | 2 +- .../res/cardsfolder/m/mandate_of_abaddon.txt | 2 +- .../cardsfolder/n/nicol_bolas_dragon_god.txt | 2 +- 13 files changed, 44 insertions(+), 63 deletions(-) diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java index 3bf67c08cb7..87bb8b48e0a 100644 --- a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java +++ b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java @@ -88,7 +88,7 @@ public abstract class DeckGeneratorBase { protected void addCreaturesAndSpells(int size, List> cmcLevels, boolean forAi) { trace.append("Building deck of ").append(size).append("cards\n"); - + final Iterable cards = selectCardsOfMatchingColorForPlayer(forAi); // build subsets based on type @@ -102,7 +102,7 @@ public abstract class DeckGeneratorBase { final int spellCnt = (int) Math.ceil(getSpellPercentage() * size); trace.append("Spells to add:").append(spellCnt).append("\n"); addCmcAdjusted(spells, spellCnt, cmcLevels); - + trace.append(String.format("Current deck size: %d... should be %f%n", tDeck.countAll(), size * (getCreaturePercentage() + getSpellPercentage()))); } @@ -258,7 +258,7 @@ public abstract class DeckGeneratorBase { for (ImmutablePair pair : cmcLevels) { totalWeight += pair.getRight(); } - + float variability = 0.6f; // if set to 1, you'll get minimum cards to choose from float desiredWeight = (float)cnt / ( maxDuplicates * variability ); float desiredOverTotal = desiredWeight / totalWeight; diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 59506328d64..8cb6acad942 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -184,7 +184,7 @@ public class Game { public Player getHasInitiative() { return initiative; } - public void setHasInitiative(final Player p ) { + public void setHasInitiative(final Player p) { initiative = p; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 7bf9039878c..2c8ca87cf51 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -606,7 +606,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (sa.hasParam("GainControl")) { final String g = sa.getParam("GainControl"); Player newController = g.equals("True") ? player : - AbilityUtils.getDefinedPlayers(sa.getHostCard(), g, sa).get(0); + AbilityUtils.getDefinedPlayers(hostCard, g, sa).get(0); if (newController != null) { if (newController != gameCard.getController()) { gameCard.runChangeControllerCommands(); @@ -1318,7 +1318,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (sa.hasParam("GainControl")) { final String g = sa.getParam("GainControl"); Player newController = g.equals("True") ? sa.getActivatingPlayer() : - AbilityUtils.getDefinedPlayers(sa.getHostCard(), g, sa).get(0); + AbilityUtils.getDefinedPlayers(source, g, sa).get(0); if (newController != c.getController()) { c.runChangeControllerCommands(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index f74cc649e8d..af7592e4830 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -39,12 +39,7 @@ public class DamageDealEffect extends DamageBaseEffect { // when damageStackDescription is called, just build exactly what is happening final StringBuilder stringBuilder = new StringBuilder(); final String damage = spellAbility.getParam("NumDmg"); - int dmg; - try { // try-catch to fix Volcano Hellion Crash - dmg = AbilityUtils.calculateAmount(spellAbility.getHostCard(), damage, spellAbility); - } catch (NullPointerException e) { - dmg = 0; - } + int dmg = AbilityUtils.calculateAmount(spellAbility.getHostCard(), damage, spellAbility); List targets = SpellAbilityEffect.getTargets(spellAbility); final List definedSources = AbilityUtils.getDefinedCards(spellAbility.getHostCard(), spellAbility.getParam("DamageSource"), spellAbility); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java index 45778fbfbff..9ae1331ed61 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DraftEffect.java @@ -63,7 +63,6 @@ import java.util.*; } Card chosenCard = player.getController().chooseSingleCardForZoneChange(ZoneType.None, new ArrayList(), sa, new CardCollection(draftOptions), null, Localizer.getInstance().getMessage("lblChooseCardDraft"), false, player); - chosenCard.setTokenCard(true); game.getAction().moveTo(ZoneType.None, chosenCard, sa, moveParams); drafted.add(chosenCard); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java index 0b4d242663e..444a5810d9b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java @@ -87,17 +87,16 @@ public class MakeCardEffect extends SpellAbilityEffect { int toMake = amount; if (!name.equals("")) { while (toMake > 0) { - Card card = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(name), - player); + Card card = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(name), player); if (sa.hasParam("TokenCard")) { card.setTokenCard(true); } game.getAction().moveTo(ZoneType.None, card, sa, moveParams); cards.add(card); toMake--; - if (sa.hasParam("Tapped")) { - card.setTapped(true); - } + if (sa.hasParam("Tapped")) { + card.setTapped(true); + } } } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java index f58dab78055..d3c0f00a10f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java @@ -80,11 +80,6 @@ public class TriggerDamagePrevented extends Trigger { if (!Expressions.compare(actualAmount, operator, operand)) { return false; } - - System.out.print("DamageDone Amount Operator: "); - System.out.println(operator); - System.out.print("DamageDone Amount Operand: "); - System.out.println(operand); } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java index d64c2ca41f6..6ade0a05ec8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java @@ -75,11 +75,6 @@ public class TriggerDamagePreventedOnce extends Trigger { if (!Expressions.compare(actualAmount, operator, operand)) { return false; } - - System.out.print("DamageDone Amount Operator: "); - System.out.println(operator); - System.out.print("DamageDone Amount Operand: "); - System.out.println(operand); } return true; diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java index 18fe2cad984..8aa56bc5053 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java @@ -440,7 +440,8 @@ public class SpellAbilityPickerSimulationTest extends SimulationTest { AssertJUnit.assertEquals(blocker, sa.getTargetCard()); } - @Test + // Run the test 100 times to ensure there's no flakiness. + @Test(invocationCount = 100) public void testChoicesResultingFromRandomEffects() { // Sometimes, the effect of a spell can be random, and as a result of that, new choices // could be selected during simulation. This test verifies that this doesn't cause problems. @@ -449,40 +450,37 @@ public class SpellAbilityPickerSimulationTest extends SimulationTest { // seed during choice evaluation, although in the future, it may make sense to handle it // some other way. - // Run the test 100 times to ensure there's no flakiness. - for (int i = 0; i < 100; i++) { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Player opponent = game.getPlayers().get(0); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Player opponent = game.getPlayers().get(0); - addCardToZone("Chaos Warp", p, ZoneType.Hand); - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); + addCardToZone("Chaos Warp", p, ZoneType.Hand); + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); - addCard("Plains", opponent); - addCard("Mountain", opponent); - addCard("Forest", opponent); - // Use a card that is worthwhile to target even if the shuffle ends up choosing it - // again. In this case, life loss on ETB and leaving. - Card expectedTarget = addCard("Raving Oni-Slave", opponent); + addCard("Plains", opponent); + addCard("Mountain", opponent); + addCard("Forest", opponent); + // Use a card that is worthwhile to target even if the shuffle ends up choosing it + // again. In this case, life loss on ETB and leaving. + Card expectedTarget = addCard("Raving Oni-Slave", opponent); - addCardToZone("Chaos Warp", opponent, ZoneType.Library); - addCardToZone("Island", opponent, ZoneType.Library); - addCardToZone("Swamp", opponent, ZoneType.Library); - // The presence of Pilgrim's Eye in the library is important for this test, as this - // will result in sub-choices (which land to pick) if this card ends up being the top - // of the library during simulation. - addCardToZone("Pilgrim's Eye", opponent, ZoneType.Library); + addCardToZone("Chaos Warp", opponent, ZoneType.Library); + addCardToZone("Island", opponent, ZoneType.Library); + addCardToZone("Swamp", opponent, ZoneType.Library); + // The presence of Pilgrim's Eye in the library is important for this test, as this + // will result in sub-choices (which land to pick) if this card ends up being the top + // of the library during simulation. + addCardToZone("Pilgrim's Eye", opponent, ZoneType.Library); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertEquals("Chaos Warp", sa.getHostCard().getName()); - AssertJUnit.assertEquals(expectedTarget, sa.getTargetCard()); - } + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals("Chaos Warp", sa.getHostCard().getName()); + AssertJUnit.assertEquals(expectedTarget, sa.getTargetCard()); } } diff --git a/forge-gui/res/cardsfolder/a/ashcoat_of_the_shadow_swarm.txt b/forge-gui/res/cardsfolder/a/ashcoat_of_the_shadow_swarm.txt index 1d808fc1103..af54e6306ac 100644 --- a/forge-gui/res/cardsfolder/a/ashcoat_of_the_shadow_swarm.txt +++ b/forge-gui/res/cardsfolder/a/ashcoat_of_the_shadow_swarm.txt @@ -7,7 +7,7 @@ T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | Tr SVar:TrigPump:DB$ PumpAll | ValidCards$ Rat.Other+YouCtrl | NumAtt$ +X | NumDef$ +X SVar:X:Count$Valid Rat.YouCtrl T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ At the beginning of your end step, you may mill four cards. If you do, return up to two Rat creature cards from your graveyard to your hand. (To mill a card, put the top card of your library into your graveyard.) -SVar:TrigChange:AB$ ChangeZone | Cost$ Mill<4> | Origin$ Graveyard | Destination$ Hand | ChangeType$ Rat.Creature+YouOwn | ChangeNum$ 2 | SelectPrompt$ Select up to two Rat creature cards +SVar:TrigChange:AB$ ChangeZone | Cost$ Mill<4> | Origin$ Graveyard | Destination$ Hand | ChangeType$ Rat.Creature+YouOwn | ChangeNum$ 2 | Hidden$ True | SelectPrompt$ Select up to two Rat creature cards SVar:HasAttackEffect:TRUE SVar:HasBlockEffect:TRUE DeckNeeds:Type$Rat diff --git a/forge-gui/res/cardsfolder/h/hunters_insight.txt b/forge-gui/res/cardsfolder/h/hunters_insight.txt index 1a4865e5cd7..b8b1a609362 100644 --- a/forge-gui/res/cardsfolder/h/hunters_insight.txt +++ b/forge-gui/res/cardsfolder/h/hunters_insight.txt @@ -1,7 +1,7 @@ Name:Hunter's Insight ManaCost:2 G Types:Instant -A:SP$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature | Triggers$ TrigDamage | RememberObjects$ Targeted | SpellDescription$ Choose target creature you control. Whenever that creature deals combat damage to a player or planeswalker this turn, draw that many cards. +A:SP$ Effect | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | Triggers$ TrigDamage | RememberObjects$ Targeted | SpellDescription$ Choose target creature you control. Whenever that creature deals combat damage to a player or planeswalker this turn, draw that many cards. SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Creature.IsRemembered | ValidTarget$ Player,Planeswalker | Execute$ TrigDraw | CombatDamage$ True | TriggerDescription$ Whenever that creature deals combat damage to a player or planeswalker this turn, draw that many cards. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ X SVar:X:TriggerCount$DamageAmount diff --git a/forge-gui/res/cardsfolder/m/mandate_of_abaddon.txt b/forge-gui/res/cardsfolder/m/mandate_of_abaddon.txt index 9036d835c98..7ac1feed5b2 100644 --- a/forge-gui/res/cardsfolder/m/mandate_of_abaddon.txt +++ b/forge-gui/res/cardsfolder/m/mandate_of_abaddon.txt @@ -1,7 +1,7 @@ Name:Mandate of Abaddon ManaCost:3 B Types:Sorcery -A:SP$ ChooseCard | Choices$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBDestroyAll | SpellDescription$ Choose target creature you control. Destroy all creatures with power less than that creature's power. +A:SP$ ChooseCard | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBDestroyAll | SpellDescription$ Choose target creature you control. Destroy all creatures with power less than that creature's power. SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.powerLTX SVar:X:Targeted$CardPower Oracle:Choose target creature you control. Destroy all creatures with power less than that creature's power. diff --git a/forge-gui/res/cardsfolder/n/nicol_bolas_dragon_god.txt b/forge-gui/res/cardsfolder/n/nicol_bolas_dragon_god.txt index 1da2899ce24..d947b80f1f8 100644 --- a/forge-gui/res/cardsfolder/n/nicol_bolas_dragon_god.txt +++ b/forge-gui/res/cardsfolder/n/nicol_bolas_dragon_god.txt @@ -5,7 +5,7 @@ Loyalty:4 S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Planeswalker.Other | GainsValidAbilities$ Activated.Loyalty | Description$ CARDNAME has all loyalty abilities of all other planeswalkers on the battlefield. A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | NumCards$ 1 | SubAbility$ DBChangeZone | Planeswalker$ True | SpellDescription$ You draw a card. Each opponent exiles a card from their hand or a permanent they control. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Battlefield,Hand | Destination$ Exile | DefinedPlayer$ Player.Opponent | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True -AI:RemoveDeck:Random A:AB$ Destroy | Cost$ SubCounter<3/LOYALTY> | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | Planeswalker$ True | SpellDescription$ Destroy target creature or planeswalker. A:AB$ LosesGame | Cost$ SubCounter<8/LOYALTY> | Defined$ Player.Opponent+controlsLegendary.Creature_EQ0+controlsPlaneswalker_LE0 | Planeswalker$ True | Ultimate$ True | SpellDescription$ Each opponent who doesn't control a legendary creature or planeswalker loses the game. +AI:RemoveDeck:Random Oracle:Nicol Bolas, Dragon-God has all loyalty abilities of all other planeswalkers on the battlefield.\n[+1]: You draw a card. Each opponent exiles a card from their hand or a permanent they control.\n[-3]: Destroy target creature or planeswalker.\n[-8]: Each opponent who doesn't control a legendary creature or planeswalker loses the game.