diff --git a/.gitattributes b/.gitattributes index 743a38e3abb..2191d384526 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5595,6 +5595,7 @@ forge-gui/res/cardsfolder/f/flash.txt -text forge-gui/res/cardsfolder/f/flash_conscription.txt -text svneol=unset#text/plain forge-gui/res/cardsfolder/f/flash_counter.txt svneol=native#text/plain forge-gui/res/cardsfolder/f/flash_flood.txt svneol=native#text/plain +forge-gui/res/cardsfolder/f/flash_foliage.txt -text forge-gui/res/cardsfolder/f/flash_of_defiance.txt svneol=native#text/plain forge-gui/res/cardsfolder/f/flash_of_insight.txt -text forge-gui/res/cardsfolder/f/flashfires.txt svneol=native#text/plain diff --git a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java index c10a2ec67e0..93cecaf07b1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TokenEffect.java @@ -17,6 +17,12 @@ */ package forge.game.ability.effects; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import com.google.common.collect.ImmutableMap.Builder; import com.google.common.collect.Iterables; import forge.game.Game; @@ -33,14 +39,11 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerHandler; +import forge.game.trigger.TriggerType; import forge.item.PaperToken; import forge.util.FCollectionView; import forge.util.MyRandom; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - public class TokenEffect extends SpellAbilityEffect { private String tokenOwner; @@ -303,22 +306,28 @@ public class TokenEffect extends SpellAbilityEffect { final Game game = controller.getGame(); for (final Card c : tokens) { if (this.tokenAttacking && game.getPhaseHandler().inCombat()) { - Combat combat = game.getPhaseHandler().getCombat(); + final Combat combat = game.getPhaseHandler().getCombat(); final FCollectionView defs = combat.getDefenders(); final GameEntity defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c, false); combat.addAttacker(c, defender); combatChanged = true; } if (this.tokenBlocking != null && game.getPhaseHandler().inCombat()) { - Combat combat = game.getPhaseHandler().getCombat(); + final Combat combat = game.getPhaseHandler().getCombat(); final Card attacker = Iterables.getFirst(AbilityUtils.getDefinedCards(host, this.tokenBlocking, sa), null); if (attacker != null) { - if (combat.isBlocked(attacker)) { - combat.addBlocker(attacker, c); - combat.orderAttackersForDamageAssignment(c); - } else { - // TODO Flash Foliage: set blocked; attackerBlocked trigger; damage + final boolean wasBlocked = combat.isBlocked(attacker); + combat.addBlocker(attacker, c); + combat.orderAttackersForDamageAssignment(c); + + // Run triggers for new blocker and add it to damage assignment order + if (!wasBlocked) { + combat.setBlocked(attacker, true); + combat.addBlockerToDamageAssignmentOrder(attacker, c); + game.getTriggerHandler().runTrigger(TriggerType.AttackerBlocked, new Builder().put("Attacker", attacker).put("Blockers", Collections.singleton(c)).put("NumBlockers", 1).build(), true); } + game.getTriggerHandler().runTrigger(TriggerType.AttackerBlockedByCreature, new Builder().put("Attacker", attacker).put("Blocker", c).build(), true); + combatChanged = true; } } @@ -341,6 +350,7 @@ public class TokenEffect extends SpellAbilityEffect { } if (combatChanged) { + game.updateCombatForView(); game.fireEvent(new GameEventCombatChanged()); } } diff --git a/forge-gui/CHANGES.txt b/forge-gui/CHANGES.txt index 0b0f67a0f70..acfbd476eaf 100644 --- a/forge-gui/CHANGES.txt +++ b/forge-gui/CHANGES.txt @@ -15,8 +15,9 @@ Release Notes New Cards --------- -Siege Behemoth +Flash Foliage Myriad Landscape +Siege Behemoth ------------ diff --git a/forge-gui/res/cardsfolder/f/flash_foliage.txt b/forge-gui/res/cardsfolder/f/flash_foliage.txt new file mode 100644 index 00000000000..5a7144a9231 --- /dev/null +++ b/forge-gui/res/cardsfolder/f/flash_foliage.txt @@ -0,0 +1,7 @@ +Name:Flash Foliage +ManaCost:2 G +Types:Instant +A:SP$ Token | Cost$ 2 G | ValidTgts$ Creature.attackingYou | TgtPrompt$ Select target creature attacking you | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenBlocking$ Targeted | ActivationPhases$ Declare Blockers->EndCombat | SubAbility$ DBDraw | StackDescription$ SpellDescription | SpellDescription$ Cast CARDNAME only during combat after blockers are declared. Put a 1/1 green Saproling creature token onto the battlefield blocking target creature attacking you. Draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/flash_foliage.jpg