mirror of
https://github.com/magefree/mage.git
synced 2025-12-25 13:02:06 -08:00
Merge remote-tracking branch 'production/master' into production_master
This commit is contained in:
commit
35a950dc80
13 changed files with 526 additions and 34 deletions
|
|
@ -19,14 +19,29 @@ import mage.target.targetpointer.FixedTarget;
|
|||
|
||||
/**
|
||||
*
|
||||
* @author Ludwig.Hirth
|
||||
* @author LevelX2
|
||||
*/
|
||||
public class DealsDamageToACreatureAllTriggeredAbility extends TriggeredAbilityImpl {
|
||||
|
||||
private final boolean combatDamageOnly;
|
||||
private final FilterPermanent filterPermanent;
|
||||
private final SetTargetPointer setTargetPointer;
|
||||
|
||||
|
||||
/**
|
||||
* This ability works only for permanents doing damage.
|
||||
*
|
||||
* @param effect
|
||||
* @param optional
|
||||
* @param filterPermanent The filter that restricts which permanets have to
|
||||
* trigger
|
||||
* @param setTargetPointer The target to be set to target pointer of the
|
||||
* effect.<br>
|
||||
* - PLAYER = player controlling the damage source.<br>
|
||||
* - PERMANENT = source permanent.<br>
|
||||
* - PERMANENT_TARGET = damaged creature.
|
||||
* @param combatDamageOnly The flag to determine if only combat damage has
|
||||
* to trigger
|
||||
*/
|
||||
public DealsDamageToACreatureAllTriggeredAbility(Effect effect, boolean optional, FilterPermanent filterPermanent, SetTargetPointer setTargetPointer, boolean combatDamageOnly) {
|
||||
super(Zone.BATTLEFIELD, effect, optional);
|
||||
this.combatDamageOnly = combatDamageOnly;
|
||||
|
|
@ -64,7 +79,13 @@ public class DealsDamageToACreatureAllTriggeredAbility extends TriggeredAbilityI
|
|||
effect.setTargetPointer(new FixedTarget(permanent.getControllerId()));
|
||||
break;
|
||||
case PERMANENT:
|
||||
effect.setTargetPointer(new FixedTarget(permanent.getId(), permanent.getZoneChangeCounter(game)));
|
||||
effect.setTargetPointer(new FixedTarget(permanent, game));
|
||||
break;
|
||||
case PERMANENT_TARGET:
|
||||
Permanent permanent_target = game.getPermanentOrLKIBattlefield(event.getTargetId());
|
||||
if (permanent_target != null) {
|
||||
effect.setTargetPointer(new FixedTarget(permanent_target, game));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -77,7 +98,7 @@ public class DealsDamageToACreatureAllTriggeredAbility extends TriggeredAbilityI
|
|||
|
||||
@Override
|
||||
public String getRule() {
|
||||
return "Whenever " + filterPermanent.getMessage() + " deals "
|
||||
+ (combatDamageOnly ? "combat ":"") + "damage to a creature, " + super.getRule();
|
||||
return "Whenever " + filterPermanent.getMessage() + " deals "
|
||||
+ (combatDamageOnly ? "combat " : "") + "damage to a creature, " + super.getRule();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,5 +33,11 @@ package mage.constants;
|
|||
*/
|
||||
public enum SetTargetPointer {
|
||||
|
||||
NONE, PLAYER, SPELL, CARD, PERMANENT, ATTACHED_TO_CONTROLLER
|
||||
NONE,
|
||||
PLAYER,
|
||||
SPELL,
|
||||
CARD,
|
||||
PERMANENT,
|
||||
PERMANENT_TARGET,
|
||||
ATTACHED_TO_CONTROLLER
|
||||
}
|
||||
|
|
|
|||
|
|
@ -256,7 +256,7 @@ public class CombatGroup implements Serializable, Copyable<CombatGroup> {
|
|||
if (attacker.getAbilities().containsKey(DeathtouchAbility.getInstance().getId())) {
|
||||
lethalDamage = 1;
|
||||
} else {
|
||||
lethalDamage = blocker.getToughness().getValue() - blocker.getDamage();
|
||||
lethalDamage = Math.max(blocker.getToughness().getValue() - blocker.getDamage(), 0);
|
||||
}
|
||||
if (lethalDamage >= damage) {
|
||||
blocker.markDamage(damage, attacker.getId(), game, true, true);
|
||||
|
|
@ -311,7 +311,7 @@ public class CombatGroup implements Serializable, Copyable<CombatGroup> {
|
|||
if (attacker.getAbilities().containsKey(DeathtouchAbility.getInstance().getId())) {
|
||||
lethalDamage = 1;
|
||||
} else {
|
||||
lethalDamage = blocker.getToughness().getValue() - blocker.getDamage();
|
||||
lethalDamage = Math.max(blocker.getToughness().getValue() - blocker.getDamage(), 0);
|
||||
}
|
||||
if (lethalDamage >= damage) {
|
||||
if (!oldRuleDamage) {
|
||||
|
|
@ -483,7 +483,7 @@ public class CombatGroup implements Serializable, Copyable<CombatGroup> {
|
|||
if (blocker.getAbilities().containsKey(DeathtouchAbility.getInstance().getId())) {
|
||||
lethalDamage = 1;
|
||||
} else {
|
||||
lethalDamage = attacker.getToughness().getValue() - attacker.getDamage();
|
||||
lethalDamage = Math.max(attacker.getToughness().getValue() - attacker.getDamage(), 0);
|
||||
}
|
||||
if (lethalDamage >= damage) {
|
||||
assigned.put(attackerId, damage);
|
||||
|
|
|
|||
|
|
@ -28,9 +28,12 @@
|
|||
package mage.watchers.common;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import mage.MageObjectReference;
|
||||
import mage.cards.Card;
|
||||
import mage.cards.Cards;
|
||||
import mage.cards.CardsImpl;
|
||||
|
|
@ -47,6 +50,7 @@ import mage.watchers.Watcher;
|
|||
public class CardsCycledOrDiscardedThisTurnWatcher extends Watcher {
|
||||
|
||||
private final Map<UUID, Cards> cycledOrDiscardedCardsThisTurn = new HashMap<>();
|
||||
private final Map<UUID, Set<MageObjectReference>> numberOfCycledOrDiscardedCardsThisTurn = new HashMap<>();
|
||||
|
||||
public CardsCycledOrDiscardedThisTurnWatcher() {
|
||||
super(CardsCycledOrDiscardedThisTurnWatcher.class.getSimpleName(), WatcherScope.GAME);
|
||||
|
|
@ -57,11 +61,17 @@ public class CardsCycledOrDiscardedThisTurnWatcher extends Watcher {
|
|||
for (Entry<UUID, Cards> entry : watcher.cycledOrDiscardedCardsThisTurn.entrySet()) {
|
||||
cycledOrDiscardedCardsThisTurn.put(entry.getKey(), entry.getValue().copy());
|
||||
}
|
||||
for (Entry<UUID, Set<MageObjectReference>> entry : watcher.numberOfCycledOrDiscardedCardsThisTurn.entrySet()) {
|
||||
Set<MageObjectReference> cycledOrDiscardedCards = new HashSet<>();
|
||||
cycledOrDiscardedCards.addAll(entry.getValue());
|
||||
numberOfCycledOrDiscardedCardsThisTurn.put(entry.getKey(), cycledOrDiscardedCards);
|
||||
}
|
||||
numberOfCycledOrDiscardedCardsThisTurn.putAll(watcher.numberOfCycledOrDiscardedCardsThisTurn);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void watch(GameEvent event, Game game) {
|
||||
if (event.getType() == GameEvent.EventType.DISCARDED_CARD
|
||||
if (event.getType() == GameEvent.EventType.DISCARDED_CARD
|
||||
|| event.getType() == GameEvent.EventType.CYCLED_CARD
|
||||
&& event.getPlayerId() != null) {
|
||||
Card card = game.getCard(event.getTargetId());
|
||||
|
|
@ -69,6 +79,12 @@ public class CardsCycledOrDiscardedThisTurnWatcher extends Watcher {
|
|||
Cards c = getCardsCycledOrDiscardedThisTurn(event.getPlayerId());
|
||||
c.add(card);
|
||||
cycledOrDiscardedCardsThisTurn.put(event.getPlayerId(), c);
|
||||
Set<MageObjectReference> cycledOrDiscardedCards = numberOfCycledOrDiscardedCardsThisTurn.get(event.getPlayerId());
|
||||
if (cycledOrDiscardedCards == null) {
|
||||
cycledOrDiscardedCards = new HashSet<>();
|
||||
numberOfCycledOrDiscardedCardsThisTurn.put(event.getPlayerId(), cycledOrDiscardedCards);
|
||||
}
|
||||
cycledOrDiscardedCards.add(new MageObjectReference(card, game));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -77,10 +93,18 @@ public class CardsCycledOrDiscardedThisTurnWatcher extends Watcher {
|
|||
return cycledOrDiscardedCardsThisTurn.getOrDefault(playerId, new CardsImpl());
|
||||
}
|
||||
|
||||
public int getNumberOfCardsCycledOrDiscardedThisTurn(UUID playerId) {
|
||||
if (numberOfCycledOrDiscardedCardsThisTurn.containsKey(playerId)) {
|
||||
return numberOfCycledOrDiscardedCardsThisTurn.get(playerId).size();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void reset() {
|
||||
super.reset();
|
||||
cycledOrDiscardedCardsThisTurn.clear();
|
||||
numberOfCycledOrDiscardedCardsThisTurn.clear();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue