diff --git a/Mage.Sets/src/mage/cards/f/FightWithFire.java b/Mage.Sets/src/mage/cards/f/FightWithFire.java
new file mode 100644
index 00000000000..099186f56b5
--- /dev/null
+++ b/Mage.Sets/src/mage/cards/f/FightWithFire.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.cards.f;
+
+import java.util.UUID;
+import mage.abilities.Ability;
+import mage.abilities.SpellAbility;
+import mage.abilities.condition.common.KickedCondition;
+import mage.abilities.decorator.ConditionalOneShotEffect;
+import mage.abilities.effects.common.DamageMultiEffect;
+import mage.abilities.effects.common.DamageTargetEffect;
+import mage.abilities.keyword.KickerAbility;
+import mage.cards.CardImpl;
+import mage.cards.CardSetInfo;
+import mage.constants.CardType;
+import mage.game.Game;
+import mage.target.common.TargetAnyTargetAmount;
+
+/**
+ *
+ * @author TheElk801
+ */
+public class FightWithFire extends CardImpl {
+
+ public FightWithFire(UUID ownerId, CardSetInfo setInfo) {
+ super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{2}{R}");
+
+ // Kicker {5}{R}
+ this.addAbility(new KickerAbility("{5}{R}"));
+
+ // Fight with Fire deals 5 damage to target creature. If this spell was kicked, it deals 10 damage divided as you choose among any number of targets instead. (Those targets can include players and planeswalkers.)
+ this.getSpellAbility().addEffect(new ConditionalOneShotEffect(
+ new DamageMultiEffect(10),
+ new DamageTargetEffect(5),
+ KickedCondition.instance,
+ "{this} deals 5 damage to target creature. If this spell was kicked, "
+ + "it deals 10 damage divided as you choose among any number of targets instead."
+ + " (Those targets can include players and planeswalkers.)"
+ ));
+ }
+
+ public FightWithFire(final FightWithFire card) {
+ super(card);
+ }
+
+ @Override
+ public void adjustTargets(Ability ability, Game game) {
+ if (ability instanceof SpellAbility) {
+ if (KickedCondition.instance.apply(game, ability)) {
+ ability.getTargets().clear();
+ getSpellAbility().addTarget(new TargetAnyTargetAmount(10));
+ }
+ }
+ }
+
+ @Override
+ public FightWithFire copy() {
+ return new FightWithFire(this);
+ }
+}
diff --git a/Mage.Sets/src/mage/sets/Dominaria.java b/Mage.Sets/src/mage/sets/Dominaria.java
index 291a7d94431..510a47c24f8 100644
--- a/Mage.Sets/src/mage/sets/Dominaria.java
+++ b/Mage.Sets/src/mage/sets/Dominaria.java
@@ -115,6 +115,7 @@ public class Dominaria extends ExpansionSet {
cards.add(new SetCardInfo("Feral Abomination", 92, Rarity.COMMON, mage.cards.f.FeralAbomination.class));
cards.add(new SetCardInfo("Fervent Strike", 117, Rarity.COMMON, mage.cards.f.FerventStrike.class));
cards.add(new SetCardInfo("Fiery Intervention", 118, Rarity.COMMON, mage.cards.f.FieryIntervention.class));
+ cards.add(new SetCardInfo("Fight with Fire", 119, Rarity.UNCOMMON, mage.cards.f.FightWithFire.class));
cards.add(new SetCardInfo("Final Parting", 93, Rarity.UNCOMMON, mage.cards.f.FinalParting.class));
cards.add(new SetCardInfo("Fire Elemental", 120, Rarity.COMMON, mage.cards.f.FireElemental.class));
cards.add(new SetCardInfo("Firefist Adept", 121, Rarity.UNCOMMON, mage.cards.f.FirefistAdept.class));
diff --git a/Mage/src/main/java/mage/target/common/TargetAnyTargetAmount.java b/Mage/src/main/java/mage/target/common/TargetAnyTargetAmount.java
new file mode 100644
index 00000000000..f5e95cd7772
--- /dev/null
+++ b/Mage/src/main/java/mage/target/common/TargetAnyTargetAmount.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of BetaSteward_at_googlemail.com.
+ */
+package mage.target.common;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+import mage.MageObject;
+import mage.abilities.Ability;
+import mage.abilities.dynamicvalue.DynamicValue;
+import mage.abilities.dynamicvalue.common.StaticValue;
+import mage.constants.Zone;
+import mage.filter.Filter;
+import mage.filter.StaticFilters;
+import mage.filter.common.FilterCreaturePlayerOrPlaneswalker;
+import mage.game.Game;
+import mage.game.permanent.Permanent;
+import mage.players.Player;
+import mage.target.TargetAmount;
+
+/**
+ *
+ * @author BetaSteward_at_googlemail.com
+ */
+public class TargetAnyTargetAmount extends TargetAmount {
+
+ protected final FilterCreaturePlayerOrPlaneswalker filter;
+
+ public TargetAnyTargetAmount(int amount) {
+ // 107.1c If a rule or ability instructs a player to choose “any number,” that player may choose
+ // any positive number or zero, unless something (such as damage or counters) is being divided
+ // or distributed among “any number” of players and/or objects. In that case, a nonzero number
+ // of players and/or objects must be chosen if possible.
+ this(new StaticValue(amount));
+ this.minNumberOfTargets = 1;
+ }
+
+ public TargetAnyTargetAmount(DynamicValue amount) {
+ super(amount);
+ this.zone = Zone.ALL;
+ this.filter = new FilterCreaturePlayerOrPlaneswalker("targets");
+ this.targetName = filter.getMessage();
+ }
+
+ public TargetAnyTargetAmount(final TargetAnyTargetAmount target) {
+ super(target);
+ this.filter = target.filter.copy();
+ }
+
+ @Override
+ public Filter getFilter() {
+ return this.filter;
+ }
+
+ @Override
+ public boolean canTarget(UUID objectId, Game game) {
+ Permanent permanent = game.getPermanent(objectId);
+ if (permanent != null) {
+ return filter.match(permanent, game);
+ }
+ Player player = game.getPlayer(objectId);
+ return player != null && filter.match(player, game);
+ }
+
+ @Override
+ public boolean canTarget(UUID objectId, Ability source, Game game) {
+ Permanent permanent = game.getPermanent(objectId);
+ Player player = game.getPlayer(objectId);
+
+ if (source != null) {
+ MageObject targetSource = source.getSourceObject(game);
+ if (permanent != null) {
+ return permanent.canBeTargetedBy(targetSource, source.getControllerId(), game) && filter.match(permanent, source.getSourceId(), source.getControllerId(), game);
+ }
+ if (player != null) {
+ return player.canBeTargetedBy(targetSource, source.getControllerId(), game) && filter.match(player, game);
+ }
+ }
+
+ if (permanent != null) {
+ return filter.match(permanent, game);
+ }
+ return player != null && filter.match(player, game);
+ }
+
+ @Override
+ public boolean canTarget(UUID playerId, UUID objectId, Ability source, Game game) {
+ return canTarget(objectId, source, game);
+ }
+
+ @Override
+ public boolean canChoose(UUID sourceId, UUID sourceControllerId, Game game) {
+ int count = 0;
+ MageObject targetSource = game.getObject(sourceId);
+ for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null && player.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(player, game)) {
+ count++;
+ if (count >= this.minNumberOfTargets) {
+ return true;
+ }
+ }
+ }
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT, sourceControllerId, game)) {
+ if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(permanent, sourceId, sourceControllerId, game)) {
+ count++;
+ if (count >= this.minNumberOfTargets) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean canChoose(UUID sourceControllerId, Game game) {
+ int count = 0;
+ for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null && filter.match(player, game)) {
+ count++;
+ if (count >= this.minNumberOfTargets) {
+ return true;
+ }
+ }
+ }
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT, sourceControllerId, game)) {
+ if (filter.match(permanent, null, sourceControllerId, game)) {
+ count++;
+ if (count >= this.minNumberOfTargets) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public Set possibleTargets(UUID sourceId, UUID sourceControllerId, Game game) {
+ Set possibleTargets = new HashSet<>();
+ MageObject targetSource = game.getObject(sourceId);
+ for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null && player.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(player, game)) {
+ possibleTargets.add(playerId);
+ }
+ }
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT, sourceControllerId, game)) {
+ if (permanent.canBeTargetedBy(targetSource, sourceControllerId, game) && filter.match(permanent, sourceId, sourceControllerId, game)) {
+ possibleTargets.add(permanent.getId());
+ }
+ }
+ return possibleTargets;
+ }
+
+ @Override
+ public Set possibleTargets(UUID sourceControllerId, Game game) {
+ Set possibleTargets = new HashSet<>();
+ for (UUID playerId : game.getState().getPlayersInRange(sourceControllerId, game)) {
+ Player player = game.getPlayer(playerId);
+ if (player != null && filter.match(player, game)) {
+ possibleTargets.add(playerId);
+ }
+ }
+ for (Permanent permanent : game.getBattlefield().getActivePermanents(StaticFilters.FILTER_PERMANENT, sourceControllerId, game)) {
+ if (filter.match(permanent, null, sourceControllerId, game)) {
+ possibleTargets.add(permanent.getId());
+ }
+ }
+ return possibleTargets;
+ }
+
+ @Override
+ public String getTargetedName(Game game) {
+ StringBuilder sb = new StringBuilder();
+ for (UUID targetId : getTargets()) {
+ Permanent permanent = game.getPermanent(targetId);
+ if (permanent != null) {
+ sb.append(permanent.getLogName()).append('(').append(getTargetAmount(targetId)).append(") ");
+ } else {
+ Player player = game.getPlayer(targetId);
+ sb.append(player.getLogName()).append('(').append(getTargetAmount(targetId)).append(") ");
+ }
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public TargetAnyTargetAmount copy() {
+ return new TargetAnyTargetAmount(this);
+ }
+
+}