forked from External/mage
Costs Tag Tracking part 2: Tag system and X values, reworked deep copy code (#11406)
* Implement Costs Tag Map system * Use Costs Tag Map system to store X value for spells, abilities, and resolving permanents * Store Bestow without target's tags Change functions for getting tags and storing the tags of a new permanent * Create and use deep copy function in CardUtil, add Copyable<T> to many classes * Fix Hall Of the Bandit Lord infinite loop * Add additional comments * Don't store null/empty costs tags maps (saves memory) * Fix two more Watchers with Ability variable * Add check for exact collection types during deep copy * Use generics instead of pure type erasure during deep copy * convert more code to using deep copy helper, everything use Object copier, add EnumMap * fix documentation * Don't need the separate null checks anymore (handled in deepCopyObject) * Minor cleanup
This commit is contained in:
parent
72e30f1574
commit
bea33c7493
29 changed files with 458 additions and 338 deletions
|
|
@ -4,10 +4,11 @@ import mage.abilities.Ability;
|
|||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.game.Game;
|
||||
import mage.watchers.common.ManaSpentToCastWatcher;
|
||||
import mage.util.CardUtil;
|
||||
|
||||
public enum ManacostVariableValue implements DynamicValue {
|
||||
|
||||
//TODO: all three of these variants plus GetXValue, GetKickerXValue, and GetXLoyaltyValue use the same logic
|
||||
// and should be consolidated into a single instance
|
||||
REGULAR, // if you need X on cast/activate (in stack) - reset each turn
|
||||
ETB, // if you need X after ETB (in battlefield) - reset each turn
|
||||
END_GAME; // if you need X until end game - keep data forever
|
||||
|
|
@ -15,18 +16,7 @@ public enum ManacostVariableValue implements DynamicValue {
|
|||
|
||||
@Override
|
||||
public int calculate(Game game, Ability sourceAbility, Effect effect) {
|
||||
if (this == REGULAR) {
|
||||
return sourceAbility.getManaCostsToPay().getX();
|
||||
}
|
||||
ManaSpentToCastWatcher watcher = game.getState().getWatcher(ManaSpentToCastWatcher.class);
|
||||
if (watcher != null) {
|
||||
if (this == END_GAME) {
|
||||
return watcher.getLastXValue(sourceAbility, true);
|
||||
} else {
|
||||
return watcher.getLastXValue(sourceAbility, false);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
return (int) CardUtil.getSourceCostsTag(game, sourceAbility, "X", 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue