mirror of
https://github.com/magefree/mage.git
synced 2025-12-27 22:12:03 -08:00
* Mana pay to cast - fixed random values in games with AI (example: Marath, Will of the Wild, see #8204);
This commit is contained in:
parent
3a8e04f2bc
commit
473a81e13c
3 changed files with 73 additions and 1 deletions
|
|
@ -5,6 +5,7 @@ import mage.constants.WatcherScope;
|
|||
import mage.game.Game;
|
||||
import mage.game.events.GameEvent;
|
||||
import mage.players.PlayerList;
|
||||
import mage.util.Copyable;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
|
@ -142,6 +143,14 @@ public abstract class Watcher implements Serializable {
|
|||
Cards list = e.getValue().copy();
|
||||
target.put(e.getKey(), list);
|
||||
}
|
||||
} else if (Arrays.stream(((Class) valueType).getInterfaces()).anyMatch(c -> c.equals(Copyable.class))) {
|
||||
Map<Object, Copyable> source = (Map<Object, Copyable>) field.get(this);
|
||||
Map<Object, Copyable> target = (Map<Object, Copyable>) field.get(watcher);
|
||||
target.clear();
|
||||
for (Map.Entry<Object, Copyable> e : source.entrySet()) {
|
||||
Copyable object = (Copyable) e.getValue().copy();
|
||||
target.put(e.getKey(), object);
|
||||
}
|
||||
} else if (valueType.getTypeName().contains("List")) {
|
||||
Map<Object, List<Object>> source = (Map<Object, List<Object>>) field.get(this);
|
||||
Map<Object, List<Object>> target = (Map<Object, List<Object>>) field.get(watcher);
|
||||
|
|
@ -161,6 +170,8 @@ public abstract class Watcher implements Serializable {
|
|||
target.put(e.getKey(), map);
|
||||
}
|
||||
} else {
|
||||
// TODO: add additional tests to find unsupported watcher data
|
||||
|
||||
((Map) field.get(watcher)).putAll((Map) field.get(this));
|
||||
}
|
||||
} else if (field.getType() == List.class) {
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ import mage.game.events.GameEvent;
|
|||
import mage.game.events.ManaPaidEvent;
|
||||
import mage.game.events.ZoneChangeEvent;
|
||||
import mage.game.stack.Spell;
|
||||
import mage.util.Copyable;
|
||||
import mage.watchers.Watcher;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
|
@ -25,7 +26,8 @@ import java.util.UUID;
|
|||
*/
|
||||
public class ManaPaidSourceWatcher extends Watcher {
|
||||
|
||||
private static final class ManaPaidTracker implements Serializable {
|
||||
private static final class ManaPaidTracker implements Serializable, Copyable<ManaPaidTracker> {
|
||||
|
||||
private int total = 0;
|
||||
private int whiteSnow = 0;
|
||||
private int blueSnow = 0;
|
||||
|
|
@ -35,6 +37,26 @@ public class ManaPaidSourceWatcher extends Watcher {
|
|||
private int colorlessSnow = 0;
|
||||
private int treasure = 0;
|
||||
|
||||
private ManaPaidTracker() {
|
||||
super();
|
||||
}
|
||||
|
||||
private ManaPaidTracker(final ManaPaidTracker tracker) {
|
||||
this.total = tracker.total;
|
||||
this.whiteSnow = tracker.whiteSnow;
|
||||
this.blueSnow = tracker.blueSnow;
|
||||
this.blackSnow = tracker.blackSnow;
|
||||
this.redSnow = tracker.redSnow;
|
||||
this.greenSnow = tracker.greenSnow;
|
||||
this.colorlessSnow = tracker.colorlessSnow;
|
||||
this.treasure = tracker.treasure;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ManaPaidTracker copy() {
|
||||
return new ManaPaidTracker(this);
|
||||
}
|
||||
|
||||
private void increment(MageObject sourceObject, ManaType manaType, Game game) {
|
||||
total++;
|
||||
if (sourceObject.hasSubtype(SubType.TREASURE, game)) {
|
||||
|
|
@ -129,4 +151,14 @@ public class ManaPaidSourceWatcher extends Watcher {
|
|||
ManaPaidSourceWatcher watcher = game.getState().getWatcher(ManaPaidSourceWatcher.class);
|
||||
return watcher != null && watcher.manaMap.getOrDefault(spell.getSpellAbility().getId(), emptyTracker).checkSnowColor(spell, game);
|
||||
}
|
||||
|
||||
public void testsIncrementManaAmount(Game game, MageObject mageObject) {
|
||||
// for tests only (logic here: change data in tracker like real event do)
|
||||
this.manaMap.getOrDefault(mageObject.getId(), null).increment(mageObject, ManaType.RED, game);
|
||||
}
|
||||
|
||||
public int testsReturnTotal(MageObject mageObject) {
|
||||
// for tests only
|
||||
return this.manaMap.getOrDefault(mageObject.getId(), null).total;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue