mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 12:48:00 +00:00
- Added the player keyword "At the beginning of the end step, you lose the game.".
- Added Final Fortune, Last Chance and Warrior's Oath.
This commit is contained in:
4
.gitattributes
vendored
4
.gitattributes
vendored
@@ -3095,6 +3095,7 @@ res/cardsfolder/f/filigree_sages.txt svneol=native#text/plain
|
||||
res/cardsfolder/f/fill_with_fright.txt svneol=native#text/plain
|
||||
res/cardsfolder/f/filth.txt svneol=native#text/plain
|
||||
res/cardsfolder/f/filthy_cur.txt svneol=native#text/plain
|
||||
res/cardsfolder/f/final_fortune.txt -text
|
||||
res/cardsfolder/f/final_judgment.txt svneol=native#text/plain
|
||||
res/cardsfolder/f/final_revels.txt svneol=native#text/plain
|
||||
res/cardsfolder/f/final_sting_faerie.txt svneol=native#text/plain
|
||||
@@ -5096,6 +5097,7 @@ res/cardsfolder/l/lashknife_barrier.txt svneol=native#text/plain
|
||||
res/cardsfolder/l/lashwrithe.txt svneol=native#text/plain
|
||||
res/cardsfolder/l/last_breath.txt svneol=native#text/plain
|
||||
res/cardsfolder/l/last_caress.txt svneol=native#text/plain
|
||||
res/cardsfolder/l/last_chance.txt -text
|
||||
res/cardsfolder/l/last_gasp.txt svneol=native#text/plain
|
||||
res/cardsfolder/l/last_kiss.txt svneol=native#text/plain
|
||||
res/cardsfolder/l/last_laugh.txt svneol=native#text/plain
|
||||
@@ -10376,6 +10378,7 @@ res/cardsfolder/w/warren_scourge_elf.txt svneol=native#text/plain
|
||||
res/cardsfolder/w/warrior_angel.txt svneol=native#text/plain
|
||||
res/cardsfolder/w/warriors_charge.txt svneol=native#text/plain
|
||||
res/cardsfolder/w/warriors_honor.txt svneol=native#text/plain
|
||||
res/cardsfolder/w/warriors_oath.txt -text
|
||||
res/cardsfolder/w/warriors_stand.txt -text
|
||||
res/cardsfolder/w/warstorm_surge.txt svneol=native#text/plain
|
||||
res/cardsfolder/w/warthog.txt svneol=native#text/plain
|
||||
@@ -11845,6 +11848,7 @@ src/main/java/forge/game/phase/Combat.java svneol=native#text/plain
|
||||
src/main/java/forge/game/phase/CombatUtil.java svneol=native#text/plain
|
||||
src/main/java/forge/game/phase/EndOfCombat.java svneol=native#text/plain
|
||||
src/main/java/forge/game/phase/EndOfTurn.java svneol=native#text/plain
|
||||
src/main/java/forge/game/phase/ExtraTurn.java -text
|
||||
src/main/java/forge/game/phase/Phase.java svneol=native#text/plain
|
||||
src/main/java/forge/game/phase/PhaseHandler.java -text
|
||||
src/main/java/forge/game/phase/PhaseType.java -text
|
||||
|
||||
13
res/cardsfolder/f/final_fortune.txt
Normal file
13
res/cardsfolder/f/final_fortune.txt
Normal file
@@ -0,0 +1,13 @@
|
||||
Name:Final Fortune
|
||||
ManaCost:R R
|
||||
Types:Instant
|
||||
Text:no text
|
||||
A:SP$ AddTurn | Cost$ R R | NumTurns$ 1 | loseAtEndStep$ True | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.
|
||||
SVar:RemAIDeck:True
|
||||
SVar:Rarity:Rare
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/final_fortune.jpg
|
||||
SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/175.jpg
|
||||
SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/173.jpg
|
||||
SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/182.jpg
|
||||
Oracle:Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.
|
||||
End
|
||||
12
res/cardsfolder/l/last_chance.txt
Normal file
12
res/cardsfolder/l/last_chance.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
Name:Last Chance
|
||||
ManaCost:R R
|
||||
Types:Sorcery
|
||||
Text:no text
|
||||
A:SP$ AddTurn | Cost$ R R | NumTurns$ 1 | loseAtEndStep$ True | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.
|
||||
SVar:RemAIDeck:True
|
||||
SVar:Rarity:Rare
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/last_chance.jpg
|
||||
SetInfo:S99|Rare|http://magiccards.info/scans/en/st/110.jpg
|
||||
SetInfo:POR|Rare|http://magiccards.info/scans/en/po/141.jpg
|
||||
Oracle:Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.
|
||||
End
|
||||
11
res/cardsfolder/w/warriors_oath.txt
Normal file
11
res/cardsfolder/w/warriors_oath.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
Name:Warrior's Oath
|
||||
ManaCost:R R
|
||||
Types:Sorcery
|
||||
Text:no text
|
||||
A:SP$ AddTurn | Cost$ R R | NumTurns$ 1 | loseAtEndStep$ True | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.
|
||||
SVar:RemAIDeck:True
|
||||
SVar:Rarity:Rare
|
||||
SVar:Picture:http://www.wizards.com/global/images/magic/general/warriors_oath.jpg
|
||||
SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/124.jpg
|
||||
Oracle:Take an extra turn after this one. At the beginning of that turn's end step, you lose the game.
|
||||
End
|
||||
@@ -28,6 +28,7 @@ import forge.card.spellability.AbilitySub;
|
||||
import forge.card.spellability.Spell;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.card.spellability.Target;
|
||||
import forge.game.phase.ExtraTurn;
|
||||
import forge.game.phase.PhaseType;
|
||||
import forge.game.player.ComputerUtil;
|
||||
import forge.game.player.Player;
|
||||
@@ -319,7 +320,10 @@ public class AbilityFactoryTurns {
|
||||
for (final Player p : tgtPlayers) {
|
||||
if ((tgt == null) || p.canBeTargetedBy(sa)) {
|
||||
for (int i = 0; i < numTurns; i++) {
|
||||
Singletons.getModel().getGameState().getPhaseHandler().addExtraTurn(p);
|
||||
ExtraTurn extra = Singletons.getModel().getGameState().getPhaseHandler().addExtraTurn(p);
|
||||
if (params.containsKey("loseAtEndStep")) {
|
||||
extra.setLoseAtEndStep(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import forge.Counters;
|
||||
import forge.Singletons;
|
||||
import forge.card.spellability.Ability;
|
||||
import forge.card.spellability.SpellAbility;
|
||||
import forge.game.GameLossReason;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiUtils;
|
||||
@@ -53,7 +54,6 @@ public class EndOfTurn extends Phase implements java.io.Serializable {
|
||||
|
||||
// TODO - should this freeze the Stack?
|
||||
|
||||
// Pyrohemia and Pestilence
|
||||
final CardList all = AllZoneUtil.getCardsIn(ZoneType.Battlefield);
|
||||
|
||||
EndOfTurn.endOfTurnWallOfReverence();
|
||||
@@ -209,6 +209,21 @@ public class EndOfTurn extends Phase implements java.io.Serializable {
|
||||
}
|
||||
|
||||
}
|
||||
Player activePlayer = Singletons.getModel().getGameState().getPhaseHandler().getPlayerTurn();
|
||||
if (activePlayer.hasKeyword("At the beginning of the end step, you lose the game.")) {
|
||||
final Card source = new Card();
|
||||
final SpellAbility change = new Ability(source, "0") {
|
||||
@Override
|
||||
public void resolve() {
|
||||
this.getActivatingPlayer().loseConditionMet(GameLossReason.SpellEffect, "");
|
||||
}
|
||||
};
|
||||
change.setStackDescription("At the beginning of the end step, you lose the game.");
|
||||
change.setDescription("At the beginning of the end step, you lose the game.");
|
||||
change.setActivatingPlayer(activePlayer);
|
||||
|
||||
AllZone.getStack().addSimultaneousStackEntry(change);
|
||||
}
|
||||
|
||||
this.execute(this.getAt());
|
||||
|
||||
|
||||
86
src/main/java/forge/game/phase/ExtraTurn.java
Normal file
86
src/main/java/forge/game/phase/ExtraTurn.java
Normal file
@@ -0,0 +1,86 @@
|
||||
/*
|
||||
* Forge: Play Magic: the Gathering.
|
||||
* Copyright (C) 2011 Forge Team
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package forge.game.phase;
|
||||
|
||||
import forge.game.player.Player;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* ExtraTurn class.
|
||||
* Stores informations about extra turns
|
||||
* </p>
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id: ExtraTurn 12482 2011-12-06 11:14:11Z Sloth $
|
||||
*/
|
||||
public class ExtraTurn {
|
||||
|
||||
private Player player = null;
|
||||
private boolean loseAtEndStep = false;
|
||||
private boolean skipUntap = false;
|
||||
/**
|
||||
* TODO: Write javadoc for Constructor.
|
||||
* @param player
|
||||
*/
|
||||
public ExtraTurn(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the player
|
||||
*/
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param player the player to set
|
||||
*/
|
||||
public void setPlayer(Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the loseAtEndStep
|
||||
*/
|
||||
public boolean isLoseAtEndStep() {
|
||||
return loseAtEndStep;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param loseAtEndStep the loseAtEndStep to set
|
||||
*/
|
||||
public void setLoseAtEndStep(boolean loseAtEndStep) {
|
||||
this.loseAtEndStep = loseAtEndStep;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the skipUntap
|
||||
*/
|
||||
public boolean isSkipUntap() {
|
||||
return skipUntap;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param skipUntap the skipUntap to set
|
||||
*/
|
||||
public void setSkipUntap(boolean skipUntap) {
|
||||
this.skipUntap = skipUntap;
|
||||
}
|
||||
|
||||
} //end class Untap
|
||||
@@ -32,12 +32,8 @@ import forge.GameActionUtil;
|
||||
import forge.MyObservable;
|
||||
import forge.Singletons;
|
||||
import forge.card.trigger.TriggerType;
|
||||
import forge.control.input.Input;
|
||||
import forge.control.input.InputControl;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.framework.EDocID;
|
||||
import forge.gui.framework.SDisplayUtil;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
|
||||
/**
|
||||
@@ -61,7 +57,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
/** Constant <code>GameBegins=0</code>. */
|
||||
private static int gameBegins = 0;
|
||||
|
||||
private final Stack<Player> extraTurns = new Stack<Player>();
|
||||
private final Stack<ExtraTurn> extraTurns = new Stack<ExtraTurn>();
|
||||
|
||||
private int extraCombats;
|
||||
|
||||
@@ -608,7 +604,6 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
* @return a {@link forge.game.player.Player} object.
|
||||
*/
|
||||
private Player handleNextTurn() {
|
||||
final Player nextTurn = this.extraTurns.isEmpty() ? this.getPlayerTurn().getOpponent() : this.extraTurns.pop();
|
||||
|
||||
AllZone.getStack().setCardsCastLastTurn();
|
||||
AllZone.getStack().clearCardsCastThisTurn();
|
||||
@@ -618,7 +613,33 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
AllZone.getComputerPlayer().setLifeLostThisTurn(0);
|
||||
AllZone.getHumanPlayer().setLifeLostThisTurn(0);
|
||||
|
||||
return this.skipTurnTimeVault(nextTurn);
|
||||
return getNextActivePlayer();
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* getNextActivePlayer.
|
||||
* </p>
|
||||
*
|
||||
* @return a {@link forge.game.player.Player} object.
|
||||
*/
|
||||
private Player getNextActivePlayer() {
|
||||
Player nextTurn = this.getPlayerTurn().getOpponent();
|
||||
if (!this.extraTurns.isEmpty()) {
|
||||
ExtraTurn extraTurn = this.extraTurns.pop();
|
||||
nextTurn = extraTurn.getPlayer();
|
||||
if (skipTurnTimeVault(nextTurn)) {
|
||||
return getNextActivePlayer();
|
||||
}
|
||||
if (extraTurn.isLoseAtEndStep()) {
|
||||
nextTurn.addKeyword("At the beginning of the end step, you lose the game.");
|
||||
}
|
||||
return nextTurn;
|
||||
}
|
||||
if (skipTurnTimeVault(nextTurn)) {
|
||||
return getNextActivePlayer();
|
||||
}
|
||||
return nextTurn;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -630,7 +651,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
* a {@link forge.game.player.Player} object.
|
||||
* @return a {@link forge.game.player.Player} object.
|
||||
*/
|
||||
private Player skipTurnTimeVault(Player turn) {
|
||||
private boolean skipTurnTimeVault(Player turn) {
|
||||
// time vault:
|
||||
CardList vaults = turn.getCardsIn(ZoneType.Battlefield, "Time Vault");
|
||||
vaults = vaults.filter(new CardListFilter() {
|
||||
@@ -646,13 +667,13 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
if (turn.isHuman()) {
|
||||
if (GameActionUtil.showYesNoDialog(crd, "Untap " + crd + "?")) {
|
||||
crd.untap();
|
||||
turn = this.extraTurns.isEmpty() ? turn.getOpponent() : this.extraTurns.pop();
|
||||
return true;
|
||||
}
|
||||
} else {
|
||||
// TODO Should AI skip his turn for time vault?
|
||||
}
|
||||
}
|
||||
return turn;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -717,7 +738,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
return this.getPlayerTurn().getOpponent();
|
||||
}
|
||||
|
||||
return this.extraTurns.peek();
|
||||
return this.extraTurns.peek().getPlayer();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -742,14 +763,14 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
* @param player
|
||||
* a {@link forge.game.player.Player} object.
|
||||
*/
|
||||
public final void addExtraTurn(final Player player) {
|
||||
public final ExtraTurn addExtraTurn(final Player player) {
|
||||
// use a stack to handle extra turns, make sure the bottom of the stack
|
||||
// restores original turn order
|
||||
if (this.extraTurns.isEmpty()) {
|
||||
this.extraTurns.push(this.getPlayerTurn().getOpponent());
|
||||
this.extraTurns.push(new ExtraTurn(this.getPlayerTurn().getOpponent()));
|
||||
}
|
||||
|
||||
this.extraTurns.push(player);
|
||||
return this.extraTurns.push(new ExtraTurn(player));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user