mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
set up trackable ControlOppSearchLib
This commit is contained in:
@@ -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()) {
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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++;
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user