Merge remote-tracking branch 'production/master' into production_master

This commit is contained in:
Oleg Agafonov 2017-12-29 04:03:45 +04:00
commit 35a950dc80
13 changed files with 526 additions and 34 deletions

View file

@ -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();
}
}
}

View file

@ -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
}

View file

@ -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);

View file

@ -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