mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +00:00
- Improved TriggerCombatDamageDoneOnce to propagate the amount of damage dealt to targets.
- Corrected Armadillo Cloak and Fungusaur as implementation examples for simultaneous combat damage (simultaneous noncombat damage like Aura Barbs is still impossible as of yet, feel free to improve if you know how).
This commit is contained in:
@@ -17,26 +17,9 @@
|
|||||||
*/
|
*/
|
||||||
package forge.game.combat;
|
package forge.game.combat;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import forge.game.Game;
|
|
||||||
import forge.game.spellability.SpellAbilityStackInstance;
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.ArrayListMultimap;
|
import com.google.common.collect.*;
|
||||||
import com.google.common.collect.Iterables;
|
import forge.game.Game;
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import com.google.common.collect.Multimap;
|
|
||||||
import com.google.common.collect.Multimaps;
|
|
||||||
import com.google.common.collect.Table;
|
|
||||||
|
|
||||||
import forge.game.GameEntity;
|
import forge.game.GameEntity;
|
||||||
import forge.game.GameLogEntryType;
|
import forge.game.GameLogEntryType;
|
||||||
import forge.game.GameObjectMap;
|
import forge.game.GameObjectMap;
|
||||||
@@ -45,9 +28,14 @@ import forge.game.card.CardCollection;
|
|||||||
import forge.game.card.CardCollectionView;
|
import forge.game.card.CardCollectionView;
|
||||||
import forge.game.card.CardDamageMap;
|
import forge.game.card.CardDamageMap;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
|
import forge.game.spellability.SpellAbilityStackInstance;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
import forge.util.collect.FCollection;
|
import forge.util.collect.FCollection;
|
||||||
import forge.util.collect.FCollectionView;
|
import forge.util.collect.FCollectionView;
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -815,11 +803,17 @@ public class Combat {
|
|||||||
c.addCombatDamage(c.getAssignedDamageMap(), dealtDamageTo, preventMap);
|
c.addCombatDamage(c.getAssignedDamageMap(), dealtDamageTo, preventMap);
|
||||||
c.clearAssignedDamage();
|
c.clearAssignedDamage();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run triggers
|
// Run triggers
|
||||||
for (final GameEntity ge : dealtDamageTo.columnKeySet()) {
|
for (final GameEntity ge : dealtDamageTo.columnKeySet()) {
|
||||||
|
int totalDmg = 0;
|
||||||
|
for (Integer dmgEntry : dealtDamageTo.column(ge).values()) {
|
||||||
|
totalDmg += dmgEntry;
|
||||||
|
}
|
||||||
|
|
||||||
final Map<String, Object> runParams = Maps.newHashMap();
|
final Map<String, Object> runParams = Maps.newHashMap();
|
||||||
runParams.put("DamageSources", dealtDamageTo.column(ge).keySet());
|
runParams.put("DamageSources", dealtDamageTo.column(ge).keySet());
|
||||||
|
runParams.put("DamageAmount", totalDmg);
|
||||||
runParams.put("DamageTarget", ge);
|
runParams.put("DamageTarget", ge);
|
||||||
ge.getGame().getTriggerHandler().runTrigger(TriggerType.CombatDamageDoneOnce, runParams, false);
|
ge.getGame().getTriggerHandler().runTrigger(TriggerType.CombatDamageDoneOnce, runParams, false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,13 +82,15 @@ public class TriggerCombatDamageDoneOnce extends Trigger {
|
|||||||
public final void setTriggeringObjects(final SpellAbility sa) {
|
public final void setTriggeringObjects(final SpellAbility sa) {
|
||||||
sa.setTriggeringObject("Sources", this.getRunParams().get("DamageSources"));
|
sa.setTriggeringObject("Sources", this.getRunParams().get("DamageSources"));
|
||||||
sa.setTriggeringObject("Target", this.getRunParams().get("DamageTarget"));
|
sa.setTriggeringObject("Target", this.getRunParams().get("DamageTarget"));
|
||||||
|
sa.setTriggeringObject("DamageAmount", this.getRunParams().get("DamageAmount"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getImportantStackObjects(SpellAbility sa) {
|
public String getImportantStackObjects(SpellAbility sa) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
sb.append("Sources: ").append(sa.getTriggeringObject("Sources")).append(", ");
|
//sb.append("Sources: ").append(sa.getTriggeringObject("Sources")).append(", "); // FIXME: why does this end up empty at all times?
|
||||||
sb.append("Target: ").append(sa.getTriggeringObject("Target"));
|
sb.append("Target: ").append(sa.getTriggeringObject("Target"));
|
||||||
|
sb.append("Damage: ").append(sa.getTriggeringObject("DamageAmount"));
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ Types:Enchantment Aura
|
|||||||
K:Enchant creature
|
K:Enchant creature
|
||||||
A:SP$ Attach | Cost$ 1 G W | ValidTgts$ Creature | AILogic$ Pump
|
A:SP$ Attach | Cost$ 1 G W | ValidTgts$ Creature | AILogic$ Pump
|
||||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Trample | Description$ Enchanted creature gets +2/+2 and has trample.
|
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Trample | Description$ Enchanted creature gets +2/+2 and has trample.
|
||||||
T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, you gain that much life.
|
T:Mode$ DamageDone | CombatDamage$ False | ValidSource$ Card.AttachedBy | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, you gain that much life.
|
||||||
|
T:Mode$ DealtCombatDamageOnce | Secondary$ True | ValidSource$ Card.AttachedBy | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, you gain that much life.
|
||||||
SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X | References$ X
|
SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X | References$ X
|
||||||
SVar:X:TriggerCount$DamageAmount
|
SVar:X:TriggerCount$DamageAmount
|
||||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/armadillo_cloak.jpg
|
SVar:Picture:http://www.wizards.com/global/images/magic/general/armadillo_cloak.jpg
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ Name:Fungusaur
|
|||||||
ManaCost:3 G
|
ManaCost:3 G
|
||||||
Types:Creature Fungus Dinosaur
|
Types:Creature Fungus Dinosaur
|
||||||
PT:2/2
|
PT:2/2
|
||||||
T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME is dealt damage, put a +1/+1 counter on it.
|
T:Mode$ DamageDone | CombatDamage$ False | ValidTarget$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME is dealt damage, put a +1/+1 counter on it.
|
||||||
|
T:Mode$ CombatDamageDoneOnce | Secondary$ True | ValidTarget$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME is dealt damage, put a +1/+1 counter on it.
|
||||||
SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
|
SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
|
||||||
SVar:HasCombatEffect:TRUE
|
SVar:HasCombatEffect:TRUE
|
||||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/fungusaur.jpg
|
SVar:Picture:http://www.wizards.com/global/images/magic/general/fungusaur.jpg
|
||||||
|
|||||||
Reference in New Issue
Block a user