Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion forge-ai/src/main/java/forge/ai/ability/SetStateAi.java
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ private boolean shouldTurnFace(Card card, final Player ai, PhaseHandler ph, Stri
if (card.getState(CardStateName.Original).hasKeyword(Keyword.HIDDEN_AGENDA)
&& card.isInZone(ZoneType.Command)) {
final String chosenName = card.getNamedCard();
return ai.getGame().getStack().getSpellsCastThisTurn().stream().anyMatch(sp -> ai.equals(sp.getActivatingPlayer()) && sp.getHostCard().getName().equals(chosenName));
return ai.getGame().getStack().getSpellsCastThisTurn().get(ai).stream().anyMatch(sp -> sp.getHostCard().getName().equals(chosenName));
}

// non-permanent facedown can't be turned face up
Expand Down
1 change: 0 additions & 1 deletion forge-ai/src/main/java/forge/ai/simulation/GameCopier.java
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,6 @@ public Game makeCopy(PhaseType advanceToPhase, Player aiPlayer) {
newPlayer.setBlessing(origPlayer.hasBlessing(), null);
newPlayer.setDescended(origPlayer.getDescended());
newPlayer.setLibrarySearched(origPlayer.getLibrarySearched());
newPlayer.setSpellsCastLastTurn(origPlayer.getSpellsCastLastTurn());
for (int j = 0; j < origPlayer.getSpellsCastThisTurn(); j++) {
newPlayer.addSpellCastThisTurn();
}
Expand Down
4 changes: 2 additions & 2 deletions forge-game/src/main/java/forge/game/CardTraitBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -503,13 +503,13 @@ else if ("None".equalsIgnoreCase(params.get("Revolt"))) {
}

if (params.containsKey("WerewolfTransformCondition")) {
if (!game.getStack().getSpellsCastLastTurn().isEmpty()) {
if (!game.getStack().getSpellCardsCastLastTurn().isEmpty()) {
return false;
}
}

if (params.containsKey("WerewolfUntransformCondition")) {
final List<Card> casted = game.getStack().getSpellsCastLastTurn();
final List<Card> casted = game.getStack().getSpellCardsCastLastTurn();
if (game.getPlayers().stream().noneMatch(p -> CardLists.count(casted, CardPredicates.isController(p)) > 1)) {
return false;
}
Expand Down
2 changes: 1 addition & 1 deletion forge-game/src/main/java/forge/game/Game.java
Original file line number Diff line number Diff line change
Expand Up @@ -1416,7 +1416,7 @@ public void setDayTime(Boolean value) {

public boolean isVoid() {
return getLeftBattlefieldThisTurn().stream().anyMatch(c -> !c.isLand()) ||
getStack().getSpellsCastThisTurn().stream().anyMatch(SpellAbility::isWarp);
getStack().getSpellsCastThisTurn().values().stream().anyMatch(SpellAbility::isWarp);
}

public int getAITimeout() {
Expand Down
1 change: 0 additions & 1 deletion forge-game/src/main/java/forge/game/GameSnapshot.java
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@ public void assignPlayerState(Player origPlayer, Player newPlayer) {
newPlayer.setCounters(HashMultiset.create(origPlayer.getCounters()));
newPlayer.setBlessing(origPlayer.hasBlessing(), null);
newPlayer.setLibrarySearched(origPlayer.getLibrarySearched());
newPlayer.setSpellsCastLastTurn(origPlayer.getSpellsCastLastTurn());
newPlayer.setCommitedCrimeThisTurn(origPlayer.getCommittedCrimeThisTurn());
newPlayer.setExpentThisTurn(origPlayer.getExpentThisTurn());
for (int j = 0; j < origPlayer.getSpellsCastThisTurn(); j++) {
Expand Down
7 changes: 5 additions & 2 deletions forge-game/src/main/java/forge/game/ability/AbilityUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -2755,15 +2755,18 @@ public static int xCount(Card c, final String s, final CardTraitBase ctb) {
}

// Count$ThisTurnCast <Valid>
// Count$ThisGameCast <Valid>
// Count$LastTurnCast <Valid>
// Count$CastSinceBeginningOfYourLastTurn_<Valid>
if (sq[0].startsWith("ThisTurnCast") || sq[0].startsWith("LastTurnCast")
if (sq[0].startsWith("ThisTurnCast") || sq[0].startsWith("ThisGameCast") || sq[0].startsWith("LastTurnCast")
|| sq[0].startsWith("CastSince")) {
final String[] workingCopy = paidparts[0].split("_");
final String validFilter = workingCopy[1];

if (workingCopy[0].contains("This")) {
if (workingCopy[0].contains("ThisTurn")) {
someCards = CardUtil.getThisTurnCast(validFilter, c, ctb, player);
} else if (workingCopy[0].contains("ThisGame")) {
someCards = CardUtil.getThisGameCast(validFilter, c, ctb, player);
} else if (workingCopy[0].contains("SinceBeginningOfYourLastTurn")) {
someCards = CardUtil.getCastSinceBeginningOfYourLastTurn(validFilter, c, ctb, player);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,8 @@ public void resolve(SpellAbility sa) {
for (Player p: players) {
p.setStartingLife(p.getStartingLife());
p.clearCounters();
p.resetSpellCastThisGame();
p.onCleanupPhase();
p.setLandsPlayedLastTurn(0);
p.setSpellsCastLastTurn(0);
p.setLifeLostLastTurn(0);
p.resetCommanderStats();
p.resetCompletedDungeons();
Expand Down
6 changes: 5 additions & 1 deletion forge-game/src/main/java/forge/game/card/CardUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,11 @@ public static List<Card> getThisTurnCast(final String valid, final Card src, fin
}

public static List<Card> getLastTurnCast(final String valid, final Card src, final CardTraitBase ctb, final Player controller) {
return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, controller, src, ctb);
return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellCardsCastLastTurn(), valid, controller, src, ctb);
}

public static List<Card> getThisGameCast(final String valid, final Card src, final CardTraitBase ctb, final Player controller) {
return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellCardsCastThisGame(), valid, controller, src, ctb);
}

public static List<SpellAbility> getThisTurnActivated(final String valid, final Card src, final CardTraitBase ctb, final Player controller) {
Expand Down
2 changes: 1 addition & 1 deletion forge-game/src/main/java/forge/game/phase/Untap.java
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ private static void doDayTime(final Player previous) {
return;
}
final Game game = previous.getGame();
List<Card> casted = game.getStack().getSpellsCastLastTurn();
List<Card> casted = game.getStack().getSpellCardsCastLastTurn();

if (game.isDay() && casted.stream().noneMatch(CardPredicates.isController(previous))) {
game.setDayTime(true);
Expand Down
18 changes: 4 additions & 14 deletions forge-game/src/main/java/forge/game/player/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,6 @@ public class Player extends GameEntity implements Comparable<Player> {
private int landsPlayedThisTurn;
private int landsPlayedLastTurn;
private int numPowerSurgeLands;
private int spellsCastThisGame;
private int spellsCastLastTurn;
private List<Card> spellsCastSinceBeginningOfLastTurn = Lists.newArrayList();
private int investigatedThisTurn;
private int surveilThisTurn;
Expand Down Expand Up @@ -2125,7 +2123,7 @@ public boolean hasFerocious() {

public final boolean hasSurge() {
PlayerCollection team = getYourTeam();
return game.getStack().getSpellsCastThisTurn().stream().anyMatch(sp -> team.contains(sp.getActivatingPlayer()));
return game.getStack().getSpellsCastThisTurn().keys().stream().anyMatch(team::contains);
}

public final boolean hasBloodthirst() {
Expand Down Expand Up @@ -2311,24 +2309,17 @@ public final void addSpellCastSinceBegOfYourLastTurn(List<Card> spells) {
}

public final int getSpellsCastThisTurn() {
return (int) getGame().getStack().getSpellsCastThisTurn().stream().filter(sp -> this.equals(sp.getActivatingPlayer())).count();
return getGame().getStack().getSpellsCastThisTurn().get(this).size();
}
public final int getSpellsCastLastTurn() {
return spellsCastLastTurn;
return getGame().getStack().getSpellsCastLastTurn().get(this).size();
}
public final void addSpellCastThisTurn() {
spellsCastThisGame++;
achievementTracker.spellsCast++;
achievementTracker.maxStormCount = Math.max(achievementTracker.maxStormCount, getSpellsCastThisTurn());
}
public final void setSpellsCastLastTurn(int num) {
spellsCastLastTurn = num;
}
public final int getSpellsCastThisGame() {
return spellsCastThisGame;
}
public final void resetSpellCastThisGame() {
spellsCastThisGame = 0;
return getGame().getStack().getSpellsCastThisGame().get(this).size();
}

public final int getLifeGainedByTeamThisTurn() {
Expand Down Expand Up @@ -2491,7 +2482,6 @@ public void onCleanupPhase() {
resetSacrificedThisTurn();
resetVenturedThisTurn();
setDescended(0);
setSpellsCastLastTurn(getSpellsCastThisTurn());
setLifeLostLastTurn(getLifeLostThisTurn());
setLifeLostThisTurn(0);
setLifeGainedThisTurn(0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ public Set<StaticAbilityLayer> getLayers() {
}

public int getMayPlayTurn() {
return mayPlayTurn + (int)this.hostCard.getGame().getStack().getSpellsCastThisTurn().stream().filter(sp -> this.equals(sp.getMayPlay())).count();
return mayPlayTurn + (int)this.hostCard.getGame().getStack().getSpellsCastThisTurn().values().stream().filter(sp -> this.equals(sp.getMayPlay())).count();
}

public void incMayPlayTurn() {
Expand Down
31 changes: 23 additions & 8 deletions forge-game/src/main/java/forge/game/zone/MagicStack.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
*/
package forge.game.zone;

import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;

Expand Down Expand Up @@ -71,8 +73,9 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
private boolean frozen = false;
private boolean bResolving = false;

private final List<SpellAbility> thisTurnCast = Lists.newArrayList();
private List<Card> lastTurnCast = Lists.newArrayList();
private final ListMultimap<Player, SpellAbility> thisTurnCast = LinkedListMultimap.create();
private final ListMultimap<Player, SpellAbility> thisGameCast = LinkedListMultimap.create();
private ListMultimap<Player, SpellAbility> lastTurnCast = LinkedListMultimap.create();
private final List<SpellAbility> thisTurnActivated = Lists.newArrayList();

private Card curResolvingCard = null;
Expand Down Expand Up @@ -101,6 +104,7 @@ public final void reset() {
primaryAbility = null;
lastTurnCast.clear();
thisTurnCast.clear();
thisGameCast.clear();
thisTurnActivated.clear();
curResolvingCard = null;
frozenStack.clear();
Expand Down Expand Up @@ -363,7 +367,9 @@ public final void add(SpellAbility sp, SpellAbilityStackInstance si, int id) {
if (sp.isSpell() && !sp.isCopied()) {
final Card lki = sp.equals(source.getCastSA()) ? source.getCastSA().getHostCard() : CardCopyService.getLKICopy(source);
runParams.put(AbilityKey.CardLKI, lki);
thisTurnCast.add(sp.equals(source.getCastSA()) ? source.getCastSA() : sp.copy(lki, true));
SpellAbility spLki = sp.equals(source.getCastSA()) ? source.getCastSA() : sp.copy(lki, true);
thisTurnCast.put(sp.getActivatingPlayer(), spLki);
thisGameCast.put(sp.getActivatingPlayer(), spLki);
sp.getActivatingPlayer().addSpellCastThisTurn();

// Add expend mana
Expand Down Expand Up @@ -916,30 +922,39 @@ public final boolean hasStateTrigger(final int triggerID) {
return false;
}

public final List<SpellAbility> getSpellsCastThisTurn() {
public final ListMultimap<Player, SpellAbility> getSpellsCastThisTurn() {
return thisTurnCast;
}
public final List<Card> getSpellCardsCastThisTurn() {
return thisTurnCast.stream().map(SpellAbility::getHostCard).collect(Collectors.toList());
return thisTurnCast.values().stream().map(SpellAbility::getHostCard).collect(Collectors.toList());
}
public final List<Card> getSpellsCastLastTurn() {
public final ListMultimap<Player, SpellAbility> getSpellsCastLastTurn() {
return lastTurnCast;
}
public final List<Card> getSpellCardsCastLastTurn() {
return lastTurnCast.values().stream().map(SpellAbility::getHostCard).collect(Collectors.toList());
}
public final ListMultimap<Player, SpellAbility> getSpellsCastThisGame() {
return thisGameCast;
}
public final List<Card> getSpellCardsCastThisGame() {
return thisGameCast.values().stream().map(SpellAbility::getHostCard).collect(Collectors.toList());
}

public final void onNextTurn() {
final Player active = game.getPhaseHandler().getPlayerTurn();
game.getStackZone().resetCardsAddedThisTurn();
this.thisTurnActivated.clear();
active.resetSpellCastSinceBegOfYourLastTurn();
if (thisTurnCast.isEmpty()) {
lastTurnCast = Lists.newArrayList();
lastTurnCast = LinkedListMultimap.create();
return;
}
List<Card> thisTurnCastCards = getSpellCardsCastThisTurn();
for (Player player : game.getPlayers()) {
player.addSpellCastSinceBegOfYourLastTurn(thisTurnCastCards);
}
lastTurnCast = Lists.newArrayList(thisTurnCastCards);
lastTurnCast = LinkedListMultimap.create(thisTurnCast);
this.thisTurnCast.clear();
game.updateStackForView();
}
Expand Down
4 changes: 1 addition & 3 deletions forge-gui/res/cardsfolder/a/approach_of_the_second_sun.txt
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
Name:Approach of the Second Sun
ManaCost:6 W
Types:Sorcery
T:Mode$ SpellCast | ValidCard$ Card.Self+namedApproach of the Second Sun | Static$ True | Execute$ ApproachingSuns
SVar:ApproachingSuns:DB$ Effect | Name$ ApproachingSuns | Duration$ Permanent
A:SP$ Branch | BranchConditionSVar$ X | BranchConditionSVarCompare$ EQ3 | TrueSubAbility$ WinGame | FalseSubAbility$ GainLife | SpellDescription$ If this spell was cast from your hand and you've cast another spell named Approach of the Second Sun this game, you win the game. Otherwise, put CARDNAME into its owner's library seventh from the top and you gain 7 life.
SVar:WinGame:DB$ WinsGame | Defined$ You
SVar:GainLife:DB$ GainLife | LifeAmount$ 7 | Defined$ You | SubAbility$ Reapproach
SVar:Reapproach:DB$ ChangeZone | Origin$ Stack | Destination$ Library | LibraryPosition$ 6 | Defined$ Parent
SVar:Y:Count$ValidCommand Effect.YouCtrl+namedApproachingSuns/LimitMax.2
SVar:Y:Count$ThisGameCast_Card.YouCtrl+namedApproach of the Second Sun/LimitMax.2
SVar:Z:Count$ValidStack Card.wasCastFromYourHand+Self/LimitMax.1
SVar:X:SVar$Y/Plus.Z
DeckNeeds:Name$Approach of the Second Sun
Expand Down
Loading