mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-13 17:27:46 +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/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/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/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/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/TriggerDamagePreventedOnce.java -text svneol=unset#text/plain
|
||||||
forge-game/src/main/java/forge/game/trigger/TriggerDealtCombatDamageOnce.java -text
|
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 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
|
// make a new damage map, combat damage will be applied later into combat map
|
||||||
CardDamageMap damageMap = new CardDamageMap();
|
CardDamageMap damageMap = new CardDamageMap();
|
||||||
CardDamageMap preventMap = 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) {
|
if (divideOnResolution) {
|
||||||
// Dividing Damage up to multiple targets using combat damage box
|
// Dividing Damage up to multiple targets using combat damage box
|
||||||
// Currently only used for Master of the Wild Hunt
|
// Currently only used for Master of the Wild Hunt
|
||||||
@@ -187,7 +190,7 @@ public class DamageDealEffect extends DamageBaseEffect {
|
|||||||
if (remember) {
|
if (remember) {
|
||||||
source.addRemembered(damageMap.row(sourceLKI).keySet());
|
source.addRemembered(damageMap.row(sourceLKI).keySet());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// transport combat damage back into combat damage map
|
// transport combat damage back into combat damage map
|
||||||
if (combatDmg) {
|
if (combatDmg) {
|
||||||
game.getCombat().getDamageMap().putAll(damageMap);
|
game.getCombat().getDamageMap().putAll(damageMap);
|
||||||
@@ -195,6 +198,7 @@ public class DamageDealEffect extends DamageBaseEffect {
|
|||||||
preventMap.triggerPreventDamage(false);
|
preventMap.triggerPreventDamage(false);
|
||||||
// non combat damage cause lifegain there
|
// non combat damage cause lifegain there
|
||||||
damageMap.dealLifelinkDamage();
|
damageMap.dealLifelinkDamage();
|
||||||
|
damageMap.triggerDamageDoneOnce(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
replaceDying(sa);
|
replaceDying(sa);
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import java.util.Map;
|
|||||||
import com.google.common.collect.ForwardingTable;
|
import com.google.common.collect.ForwardingTable;
|
||||||
import com.google.common.collect.HashBasedTable;
|
import com.google.common.collect.HashBasedTable;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
import com.google.common.collect.Table;
|
import com.google.common.collect.Table;
|
||||||
|
|
||||||
import forge.game.GameEntity;
|
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
|
* 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),
|
Crewed(TriggerCrewed.class),
|
||||||
Cycled(TriggerCycled.class),
|
Cycled(TriggerCycled.class),
|
||||||
DamageDone(TriggerDamageDone.class),
|
DamageDone(TriggerDamageDone.class),
|
||||||
|
DamageDoneOnce(TriggerDamageDoneOnce.class),
|
||||||
DamagePrevented(TriggerDamagePrevented.class),
|
DamagePrevented(TriggerDamagePrevented.class),
|
||||||
DamagePreventedOnce(TriggerDamagePreventedOnce.class),
|
DamagePreventedOnce(TriggerDamagePreventedOnce.class),
|
||||||
DealtCombatDamageOnce(TriggerDealtCombatDamageOnce.class),
|
DealtCombatDamageOnce(TriggerDealtCombatDamageOnce.class),
|
||||||
|
|||||||
Reference in New Issue
Block a user