Merge branch 'damageMapClear' into 'master'

DamageMap: add clear after being triggered

See merge request core-developers/forge!1290
This commit is contained in:
Hans Mackowiak
2019-01-20 09:12:04 +00:00
9 changed files with 42 additions and 7 deletions

View File

@@ -121,6 +121,9 @@ public class DamageAllEffect extends DamageBaseEffect {
if (!usedDamageMap) { if (!usedDamageMap) {
preventMap.triggerPreventDamage(false); preventMap.triggerPreventDamage(false);
damageMap.triggerDamageDoneOnce(false, sa); damageMap.triggerDamageDoneOnce(false, sa);
preventMap.clear();
damageMap.clear();
} }
replaceDying(sa); replaceDying(sa);

View File

@@ -30,7 +30,7 @@ public class DamageDealEffect extends DamageBaseEffect {
final int dmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa); final int dmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa);
List<GameObject> tgts = getTargets(sa); List<GameObject> tgts = getTargets(sa);
if (tgts.isEmpty()) if (tgts.isEmpty())
return ""; return "";
final List<Card> definedSources = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DamageSource"), sa); final List<Card> definedSources = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DamageSource"), sa);
@@ -131,15 +131,15 @@ public class DamageDealEffect extends DamageBaseEffect {
sa.setPreventMap(preventMap); sa.setPreventMap(preventMap);
usedDamageMap = true; usedDamageMap = true;
} }
final List<Card> definedSources = AbilityUtils.getDefinedCards(hostCard, sa.getParam("DamageSource"), sa); final List<Card> definedSources = AbilityUtils.getDefinedCards(hostCard, sa.getParam("DamageSource"), sa);
if (definedSources == null || definedSources.isEmpty()) { if (definedSources == null || definedSources.isEmpty()) {
return; return;
} }
for (Card source : definedSources) { for (Card source : definedSources) {
final Card sourceLKI = hostCard.getGame().getChangeZoneLKIInfo(source); final Card sourceLKI = hostCard.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
@@ -147,7 +147,7 @@ public class DamageDealEffect extends DamageBaseEffect {
if (players.isEmpty()) { if (players.isEmpty()) {
return; return;
} }
CardCollection assigneeCards = new CardCollection(); CardCollection assigneeCards = new CardCollection();
// Do we have a way of doing this in a better fashion? // Do we have a way of doing this in a better fashion?
for (GameObject obj : tgts) { for (GameObject obj : tgts) {
@@ -155,7 +155,7 @@ public class DamageDealEffect extends DamageBaseEffect {
assigneeCards.add((Card)obj); assigneeCards.add((Card)obj);
} }
} }
Player assigningPlayer = players.get(0); Player assigningPlayer = players.get(0);
Map<Card, Integer> map = assigningPlayer.getController().assignCombatDamage(sourceLKI, assigneeCards, dmg, null, true); Map<Card, Integer> map = assigningPlayer.getController().assignCombatDamage(sourceLKI, assigneeCards, dmg, null, true);
for (Entry<Card, Integer> dt : map.entrySet()) { for (Entry<Card, Integer> dt : map.entrySet()) {
@@ -166,6 +166,9 @@ public class DamageDealEffect extends DamageBaseEffect {
preventMap.triggerPreventDamage(false); preventMap.triggerPreventDamage(false);
// non combat damage cause lifegain there // non combat damage cause lifegain there
damageMap.triggerDamageDoneOnce(false, sa); damageMap.triggerDamageDoneOnce(false, sa);
preventMap.clear();
damageMap.clear();
} }
replaceDying(sa); replaceDying(sa);
return; return;
@@ -201,7 +204,7 @@ public class DamageDealEffect extends DamageBaseEffect {
} }
} }
} }
if (remember) { if (remember) {
source.addRemembered(damageMap.row(sourceLKI).keySet()); source.addRemembered(damageMap.row(sourceLKI).keySet());
} }
@@ -210,6 +213,9 @@ public class DamageDealEffect extends DamageBaseEffect {
preventMap.triggerPreventDamage(false); preventMap.triggerPreventDamage(false);
// non combat damage cause lifegain there // non combat damage cause lifegain there
damageMap.triggerDamageDoneOnce(false, sa); damageMap.triggerDamageDoneOnce(false, sa);
preventMap.clear();
damageMap.clear();
} }
replaceDying(sa); replaceDying(sa);
} }

View File

@@ -132,6 +132,9 @@ public class DamageEachEffect extends DamageBaseEffect {
if (!usedDamageMap) { if (!usedDamageMap) {
preventMap.triggerPreventDamage(false); preventMap.triggerPreventDamage(false);
damageMap.triggerDamageDoneOnce(false, sa); damageMap.triggerDamageDoneOnce(false, sa);
preventMap.clear();
damageMap.clear();
} }
replaceDying(sa); replaceDying(sa);

View File

@@ -21,10 +21,12 @@ public class DamageResolveEffect extends SpellAbilityEffect {
if (preventMap != null) { if (preventMap != null) {
preventMap.triggerPreventDamage(false); preventMap.triggerPreventDamage(false);
preventMap.clear();
} }
// non combat damage cause lifegain there // non combat damage cause lifegain there
if (damageMap != null) { if (damageMap != null) {
damageMap.triggerDamageDoneOnce(false, sa); damageMap.triggerDamageDoneOnce(false, sa);
damageMap.clear();
} }
} }

View File

@@ -153,6 +153,9 @@ public class FightEffect extends DamageBaseEffect {
if (!usedDamageMap) { if (!usedDamageMap) {
preventMap.triggerPreventDamage(false); preventMap.triggerPreventDamage(false);
damageMap.triggerDamageDoneOnce(false, sa); damageMap.triggerDamageDoneOnce(false, sa);
preventMap.clear();
damageMap.clear();
} }
replaceDying(sa); replaceDying(sa);

View File

@@ -19,6 +19,13 @@ import forge.game.trigger.TriggerType;
public class CardDamageMap extends ForwardingTable<Card, GameEntity, Integer> { public class CardDamageMap extends ForwardingTable<Card, GameEntity, Integer> {
private Table<Card, GameEntity, Integer> dataMap = HashBasedTable.create(); private Table<Card, GameEntity, Integer> dataMap = HashBasedTable.create();
public CardDamageMap(Table<Card, GameEntity, Integer> damageMap) {
this.putAll(damageMap);
}
public CardDamageMap() {
}
public void triggerPreventDamage(boolean isCombat) { public void triggerPreventDamage(boolean isCombat) {
for (Map.Entry<GameEntity, Map<Card, Integer>> e : this.columnMap().entrySet()) { for (Map.Entry<GameEntity, Map<Card, Integer>> e : this.columnMap().entrySet()) {
int sum = 0; int sum = 0;

View File

@@ -816,6 +816,7 @@ public class Combat {
} }
preventMap.triggerPreventDamage(true); preventMap.triggerPreventDamage(true);
preventMap.clear();
// This was deeper before, but that resulted in the stack entry acting like before. // This was deeper before, but that resulted in the stack entry acting like before.
// Run the trigger to deal combat damage once // Run the trigger to deal combat damage once

View File

@@ -74,6 +74,8 @@ public class CostDamage extends CostPart {
preventMap.triggerPreventDamage(false); preventMap.triggerPreventDamage(false);
damageMap.triggerDamageDoneOnce(false, sa); damageMap.triggerDamageDoneOnce(false, sa);
preventMap.clear();
damageMap.clear();
return decision.c > 0; return decision.c > 0;
} }

View File

@@ -875,6 +875,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
clone.manaPart = new AbilityManaPart(host, mapParams); clone.manaPart = new AbilityManaPart(host, mapParams);
} }
// need to copy the damage tables
if (damageMap != null) {
clone.damageMap = new CardDamageMap(damageMap);
}
if (preventMap != null) {
clone.preventMap = new CardDamageMap(preventMap);
}
// clear maps for copy, the values will be added later // clear maps for copy, the values will be added later
clone.additionalAbilities = Maps.newHashMap(); clone.additionalAbilities = Maps.newHashMap();
clone.additionalAbilityLists = Maps.newHashMap(); clone.additionalAbilityLists = Maps.newHashMap();