set up trackable ControlOppSearchLib

This commit is contained in:
Northmoc
2020-11-26 22:55:01 -05:00
parent 1ca31d6fab
commit db4ed8d27e
7 changed files with 56 additions and 16 deletions

View File

@@ -949,6 +949,19 @@ public class Game {
return result; return result;
} }
public Player getControlOppSearchLib() {
Player result = null;
long maxValue = 0;
for (Player p : getPlayers()) {
Long v = p.getHighestControlOppSearchLib();
if (v != null && v > maxValue) {
maxValue = v;
result = p;
}
}
return result;
}
public void onCleanupPhase() { public void onCleanupPhase() {
clearCounterAddedThisTurn(); clearCounterAddedThisTurn();
for (Player player : getPlayers()) { for (Player player : getPlayers()) {

View File

@@ -797,6 +797,8 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
} }
private static void changeZonePlayerInvariant(Player decider, SpellAbility sa, Player player) { private static void changeZonePlayerInvariant(Player decider, SpellAbility sa, Player player) {
final Game game = player.getGame();
if (sa.usesTargeting()) { if (sa.usesTargeting()) {
final List<Player> players = Lists.newArrayList(sa.getTargets().getTargetPlayers()); final List<Player> players = Lists.newArrayList(sa.getTargets().getTargetPlayers());
player = sa.hasParam("DefinedPlayer") ? player : players.get(0); player = sa.hasParam("DefinedPlayer") ? player : players.get(0);
@@ -872,20 +874,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
CardCollection fetchList; CardCollection fetchList;
Player originalDecider = decider; Player originalDecider = decider;
Player deciderControl = null; Player deciderControl = game.getControlOppSearchLib();
PlayerCollection opps = decider.getOpponents();
long dcts = 0;
for (Player o : opps) {
for (String k : o.getKeywords()) {
if (k.equals("You control your opponents while they're searching their libraries.")) {
long ts = o.getKeywordCard().getTimestamp();
if (deciderControl == null || ts > (dcts)) {
deciderControl = o;
dcts = ts;
}
}
}
}
boolean shuffleMandatory = true; boolean shuffleMandatory = true;
boolean searchedLibrary = false; boolean searchedLibrary = false;
if (defined) { if (defined) {
@@ -978,7 +967,6 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
shuffleMandatory = false; shuffleMandatory = false;
} }
final Game game = player.getGame();
if (sa.hasParam("Unimprint")) { if (sa.hasParam("Unimprint")) {
source.clearImprintedCards(); source.clearImprintedCards();
} }

View File

@@ -165,6 +165,8 @@ public class Player extends GameEntity implements Comparable<Player> {
private Map<Long, Integer> additionalOptionalVotes = Maps.newHashMap(); private Map<Long, Integer> additionalOptionalVotes = Maps.newHashMap();
private SortedSet<Long> controlVotes = Sets.newTreeSet(); private SortedSet<Long> controlVotes = Sets.newTreeSet();
private SortedSet<Long> controlOppSearchLib = Sets.newTreeSet();
private final AchievementTracker achievementTracker = new AchievementTracker(); private final AchievementTracker achievementTracker = new AchievementTracker();
private final PlayerView view; private final PlayerView view;
@@ -3412,6 +3414,33 @@ public class Player extends GameEntity implements Comparable<Player> {
return controlVotes.last(); return controlVotes.last();
} }
public boolean addControlOppSearchLib(long timestamp) {
if (controlOppSearchLib.add(timestamp)) {
updateControlOppSearchLib();
return true;
}
return false;
}
void updateControlOppSearchLib() { // needs to update all players
Player control = getGame().getControlOppSearchLib();
for (Player pl : getGame().getPlayers()) {
pl.getView().updateControlOppSearchLib(pl.equals(control));
getGame().fireEvent(new GameEventPlayerStatsChanged(pl, false));
}
}
public Set<Long> getControlOppSearchLib() {
return controlOppSearchLib;
}
public Long getHighestControlOppSearchLib() {
if (controlOppSearchLib.isEmpty()) {
return null;
}
return controlOppSearchLib.last();
}
public void addCycled(SpellAbility sp) { public void addCycled(SpellAbility sp) {
cycledThisTurn++; cycledThisTurn++;

View File

@@ -296,6 +296,9 @@ public class PlayerView extends GameEntityView {
set(TrackableProperty.ControlVotes, val); set(TrackableProperty.ControlVotes, val);
} }
public boolean getControlOppSearchLib() { return get(TrackableProperty.ControlOppSearchLib); }
public void updateControlOppSearchLib(boolean val) { set(TrackableProperty.ControlOppSearchLib, val); }
public ImmutableMultiset<String> getKeywords() { public ImmutableMultiset<String> getKeywords() {
return get(TrackableProperty.Keywords); return get(TrackableProperty.Keywords);
} }

View File

@@ -552,6 +552,12 @@ public final class StaticAbilityContinuous {
p.addMaxLandPlays(se.getTimestamp(), add); p.addMaxLandPlays(se.getTimestamp(), add);
} }
} }
if (params.containsKey("ControlOpponentsWhile")) {
String cow = params.get("ControlOpponentsWhile");
if (cow.equals("SearchingLibrary")) {
p.addControlOppSearchLib(se.getTimestamp());
}
}
if (params.containsKey("ControlVote")) { if (params.containsKey("ControlVote")) {
p.addControlVote(se.getTimestamp()); p.addControlVote(se.getTimestamp());

View File

@@ -149,6 +149,7 @@ public enum TrackableProperty {
AdditionalVote(TrackableTypes.IntegerType), AdditionalVote(TrackableTypes.IntegerType),
OptionalAdditionalVote(TrackableTypes.IntegerType), OptionalAdditionalVote(TrackableTypes.IntegerType),
ControlVotes(TrackableTypes.BooleanType), ControlVotes(TrackableTypes.BooleanType),
ControlOppSearchLib(TrackableTypes.BooleanType),
Keywords(TrackableTypes.KeywordCollectionViewType, FreezeMode.IgnoresFreeze), Keywords(TrackableTypes.KeywordCollectionViewType, FreezeMode.IgnoresFreeze),
Commander(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze), Commander(TrackableTypes.CardViewCollectionType, FreezeMode.IgnoresFreeze),
CommanderCast(TrackableTypes.IntegerMapType), CommanderCast(TrackableTypes.IntegerMapType),

View File

@@ -3,7 +3,7 @@ ManaCost:2 B
Types:Creature Human Rogue Types:Creature Human Rogue
PT:3/2 PT:3/2
K:Flash K:Flash
S:Mode$ Continuous | Affected$ You | AddKeyword$ You control your opponents while they're searching their libraries. | Description$ You control your opponents while they're searching their libraries. S:Mode$ Continuous | Affected$ You | ControlOpponentsWhile$ SearchingLibrary | Description$ You control your opponents while they're searching their libraries.
R:Event$ Moved | ValidCard$ Card.OppOwn | FoundSearchingLibrary$ True | Origin$ Library | ReplaceWith$ RepExile | ActiveZones$ Battlefield | Description$ While an opponent is searching their library, they exile each card they find. You may play those cards for as long as they remain exiled, and you may spend mana as though it were mana of any color to cast them. R:Event$ Moved | ValidCard$ Card.OppOwn | FoundSearchingLibrary$ True | Origin$ Library | ReplaceWith$ RepExile | ActiveZones$ Battlefield | Description$ While an opponent is searching their library, they exile each card they find. You may play those cards for as long as they remain exiled, and you may spend mana as though it were mana of any color to cast them.
SVar:RepExile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard | SubAbility$ DBEffect SVar:RepExile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | Duration$ Permanent | StaticAbilities$ MayPlay | RememberObjects$ ReplacedCard | ForgetOnMoved$ Exile SVar:DBEffect:DB$ Effect | Duration$ Permanent | StaticAbilities$ MayPlay | RememberObjects$ ReplacedCard | ForgetOnMoved$ Exile