From 9d5332b95b6c8533c376dc58eee193baf1ad3622 Mon Sep 17 00:00:00 2001 From: swordshine Date: Sun, 7 Oct 2018 22:53:02 +0800 Subject: [PATCH] - Added Coveted Jewel --- .../main/java/forge/game/combat/Combat.java | 17 +++- .../java/forge/game/phase/PhaseHandler.java | 2 +- .../trigger/TriggerAttackerUnblockedOnce.java | 99 +++++++++++++++++++ .../java/forge/game/trigger/TriggerType.java | 1 + forge-gui/res/cardsfolder/c/coveted_jewel.txt | 10 ++ 5 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java create mode 100644 forge-gui/res/cardsfolder/c/coveted_jewel.txt diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index fb9c095306b..7bb0f1bda06 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -613,23 +613,36 @@ public class Combat { } // Call this method right after turn-based action of declare blockers has been performed - public final void fireTriggersForUnblockedAttackers() { + public final void fireTriggersForUnblockedAttackers(final Game game) { + boolean bFlag = false; + List defenders = Lists.newArrayList(); for (AttackingBand ab : attackedByBands.values()) { Collection blockers = blockedBands.get(ab); boolean isBlocked = blockers != null && !blockers.isEmpty(); ab.setBlocked(isBlocked); if (!isBlocked) { + bFlag = true; + defenders.add(getDefenderByAttacker(ab)); for (Card attacker : ab.getAttackers()) { // Run Unblocked Trigger final Map runParams = Maps.newHashMap(); runParams.put("Attacker", attacker); runParams.put("Defender",getDefenderByAttacker(attacker)); runParams.put("DefendingPlayer", getDefenderPlayerByAttacker(attacker)); - attacker.getGame().getTriggerHandler().runTrigger(TriggerType.AttackerUnblocked, runParams, false); + game.getTriggerHandler().runTrigger(TriggerType.AttackerUnblocked, runParams, false); } } } + if (bFlag) { + // triggers for Coveted Jewel + // currently there is only one attacking player + // should be updated when two-headed-giant is done + final Map runParams = Maps.newHashMap(); + runParams.put("AttackingPlayer", getAttackingPlayer()); + runParams.put("Defenders", defenders); + game.getTriggerHandler().runTrigger(TriggerType.AttackerUnblockedOnce, runParams, false); + } } private final boolean assignBlockersDamage(boolean firstStrikeDamage) { diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index 815b3a8c811..ba10cde1a85 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -666,7 +666,7 @@ public class PhaseHandler implements java.io.Serializable { combat.removeAbsentCombatants(); - combat.fireTriggersForUnblockedAttackers(); + combat.fireTriggersForUnblockedAttackers(game); final List declaredBlockers = combat.getAllBlockers(); if (!declaredBlockers.isEmpty()) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java new file mode 100644 index 00000000000..5e610b016de --- /dev/null +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java @@ -0,0 +1,99 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.game.trigger; + +import forge.game.GameEntity; +import forge.game.card.Card; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; + +import java.util.List; +import java.util.Map; + +/** + *

+ * Trigger_AttackerUnblockedOnce class. + *

+ * + * @author Forge + * @version $Id$ + */ +public class TriggerAttackerUnblockedOnce extends Trigger { + + /** + *

+ * Constructor for Trigger_AttackerUnblocked. + *

+ * + * @param params + * a {@link java.util.HashMap} object. + * @param host + * a {@link forge.game.card.Card} object. + * @param intrinsic + * the intrinsic + */ + public TriggerAttackerUnblockedOnce(final java.util.Map params, final Card host, final boolean intrinsic) { + super(params, host, intrinsic); + } + + /** {@inheritDoc} */ + @SuppressWarnings("unchecked") + @Override + public final boolean performTest(final Map runParams2) { + if (hasParam("ValidDefenders")) { + boolean valid = false; + + final List srcs = (List) runParams2.get("Defenders"); + for (GameEntity c : srcs) { + if (c.isValid(this.mapParams.get("ValidDefenders").split(","), this.getHostCard().getController(), this.getHostCard(), null)) { + valid = true; + } + } + if (!valid) { + return false; + } + /* + if (hasParam("ValidAttackers")) { + // should be updated if a creature of a specific type attackes a defender + } + */ + } + if (hasParam("ValidAttackingPlayer")) { + if (!matchesValid(runParams2.get("AttackingPlayer"), + this.mapParams.get("ValidAttackingPlayer").split(","), this.getHostCard())) { + return false; + } + } + return true; + } + + /** {@inheritDoc} */ + @Override + public final void setTriggeringObjects(final SpellAbility sa) { + sa.setTriggeringObject("AttackingPlayer", this.getRunParams().get("AttackingPlayer")); + sa.setTriggeringObject("Defenders", this.getRunParams().get("Defenders")); + } + + @Override + public String getImportantStackObjects(SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + sb.append("AttackingPlayer: ").append(sa.getTriggeringObject("AttackingPlayer")); + sb.append("Defenders: ").append(sa.getTriggeringObject("Defenders")); + return sb.toString(); + } +} diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerType.java b/forge-game/src/main/java/forge/game/trigger/TriggerType.java index ca2bb440d1e..f5119f70fd8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerType.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerType.java @@ -20,6 +20,7 @@ public enum TriggerType { AttackerBlockedByCreature(TriggerAttackerBlockedByCreature.class), AttackersDeclared(TriggerAttackersDeclared.class), AttackerUnblocked(TriggerAttackerUnblocked.class), + AttackerUnblockedOnce(TriggerAttackerUnblockedOnce.class), Attacks(TriggerAttacks.class), BecomeMonarch(TriggerBecomeMonarch.class), BecomeMonstrous(TriggerBecomeMonstrous.class), diff --git a/forge-gui/res/cardsfolder/c/coveted_jewel.txt b/forge-gui/res/cardsfolder/c/coveted_jewel.txt new file mode 100644 index 00000000000..54d69c9f8ea --- /dev/null +++ b/forge-gui/res/cardsfolder/c/coveted_jewel.txt @@ -0,0 +1,10 @@ +Name:Coveted Jewel +ManaCost:6 +Types:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw three cards. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 3 +A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 3 | SpellDescription$ Add three mana of any one color. +T:Mode$ AttackerUnblockedOnce | ValidAttackingPlayer$ Player.Opponent | ValidDefenders$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever one or more creatures an opponent controls attack you and aren't blocked, that player draws three cards and gains control of CARDNAME. Untap it. +SVar:TrigDraw:DB$ Draw | Defined$ TriggeredAttackingPlayer | NumCards$ 3 | SubAbility$ DBGainGontrol +SVar:DBGainGontrol:DB$ GainControl | NewController$ TriggeredAttackingPlayer | Untap$ True +Oracle:When Coveted Jewel enters the battlefield, draw three cards.\n{T}: Add three mana of any one color.\nWhenever one or more creatures an opponent controls attack you and aren't blocked, that player draws three cards and gains control of Coveted Jewel. Untap it.