add TriggerDamageDealOnce

This commit is contained in:
Hanmac
2017-09-18 05:28:02 +00:00
parent 4569bca39d
commit 2ca05b5634
5 changed files with 144 additions and 58 deletions

1
.gitattributes vendored
View File

@@ -720,6 +720,7 @@ forge-game/src/main/java/forge/game/trigger/TriggerCountered.java -text
forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java -text
forge-game/src/main/java/forge/game/trigger/TriggerCycled.java svneol=native#text/plain
forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java svneol=native#text/plain
forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java -text svneol=unset#text/plain
forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java -text svneol=unset#text/plain
forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java -text svneol=unset#text/plain
forge-game/src/main/java/forge/game/trigger/TriggerDealtCombatDamageOnce.java -text

View File

@@ -117,17 +117,20 @@ public class DamageDealEffect extends DamageBaseEffect {
final boolean remember = sa.hasParam("RememberDamaged");
final List<Card> definedSources = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DamageSource"), sa);
if (definedSources == null || definedSources.isEmpty()) {
return;
}
final Card source = definedSources.get(0);
final Card sourceLKI = sa.getHostCard().getGame().getChangeZoneLKIInfo(definedSources.get(0));
// make a new damage map, combat damage will be applied later into combat map
CardDamageMap damageMap = new CardDamageMap();
CardDamageMap preventMap = new CardDamageMap();
final List<Card> definedSources = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DamageSource"), sa);
if (definedSources == null || definedSources.isEmpty()) {
return;
}
for (Card source : definedSources) {
final Card sourceLKI = sa.getHostCard().getGame().getChangeZoneLKIInfo(source);
if (divideOnResolution) {
// Dividing Damage up to multiple targets using combat damage box
// Currently only used for Master of the Wild Hunt
@@ -187,7 +190,7 @@ public class DamageDealEffect extends DamageBaseEffect {
if (remember) {
source.addRemembered(damageMap.row(sourceLKI).keySet());
}
}
// transport combat damage back into combat damage map
if (combatDmg) {
game.getCombat().getDamageMap().putAll(damageMap);
@@ -195,6 +198,7 @@ public class DamageDealEffect extends DamageBaseEffect {
preventMap.triggerPreventDamage(false);
// non combat damage cause lifegain there
damageMap.dealLifelinkDamage();
damageMap.triggerDamageDoneOnce(false);
}
replaceDying(sa);

View File

@@ -8,6 +8,7 @@ import java.util.Map;
import com.google.common.collect.ForwardingTable;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.common.collect.Table;
import forge.game.GameEntity;
@@ -48,6 +49,24 @@ public class CardDamageMap extends ForwardingTable<Card, GameEntity, Integer> {
}
}
public void triggerDamageDoneOnce(boolean isCombat) {
for (Map.Entry<GameEntity, Map<Card, Integer>> e : this.columnMap().entrySet()) {
int sum = 0;
for (final int i : e.getValue().values()) {
sum += i;
}
if (sum > 0) {
final GameEntity ge = e.getKey();
final Map<String, Object> runParams = Maps.newHashMap();
runParams.put("DamageTarget", ge);
runParams.put("DamageSources", Sets.newHashSet(e.getValue().keySet()));
runParams.put("DamageAmount", sum);
runParams.put("IsCombatDamage", isCombat);
ge.getGame().getTriggerHandler().runTrigger(TriggerType.DamageDoneOnce, runParams, false);
}
}
}
/**
* special put logic, sum the values
*/

View File

@@ -0,0 +1,61 @@
package forge.game.trigger;
import java.util.Map;
import forge.game.card.Card;
import forge.game.spellability.SpellAbility;
public class TriggerDamageDoneOnce extends Trigger {
public TriggerDamageDoneOnce(Map<String, String> params, Card host, boolean intrinsic) {
super(params, host, intrinsic);
}
@Override
public boolean performTest(Map<String, Object> runParams2) {
final Object tgt = runParams2.get("DamageTarget");
if (this.mapParams.containsKey("ValidTarget")) {
if (!matchesValid(tgt, this.mapParams.get("ValidTarget").split(","), this.getHostCard())) {
return false;
}
}
if (this.mapParams.containsKey("CombatDamage")) {
if (this.mapParams.get("CombatDamage").equals("True")) {
if (!((Boolean) runParams2.get("IsCombatDamage"))) {
return false;
}
} else if (this.mapParams.get("CombatDamage").equals("False")) {
if (((Boolean) runParams2.get("IsCombatDamage"))) {
return false;
}
}
}
return true;
}
@Override
public void setTriggeringObjects(SpellAbility sa) {
if (this.getRunParams().containsKey("DamageTarget")) {
sa.setTriggeringObject("Target", this.getRunParams().get("DamageTarget"));
}
sa.setTriggeringObject("DamageAmount", this.getRunParams().get("DamageAmount"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
if (sa.getTriggeringObject("Target") != null) {
sb.append("Damaged: ").append(sa.getTriggeringObject("Target")).append(", ");
}
sb.append("Amount: ").append(sa.getTriggeringObject("DamageAmount"));
return sb.toString();
}
}

View File

@@ -40,6 +40,7 @@ public enum TriggerType {
Crewed(TriggerCrewed.class),
Cycled(TriggerCycled.class),
DamageDone(TriggerDamageDone.class),
DamageDoneOnce(TriggerDamageDoneOnce.class),
DamagePrevented(TriggerDamagePrevented.class),
DamagePreventedOnce(TriggerDamagePreventedOnce.class),
DealtCombatDamageOnce(TriggerDealtCombatDamageOnce.class),