mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-11 16:26:22 +00:00
add TriggerDamageDealOnce
This commit is contained in:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user