diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index 21d5b770336..75f72153307 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2720,8 +2720,14 @@ public class Player extends GameEntity implements Comparable { } // Commander + Card cmd = null; if (registeredPlayer.getCommander() != null) { - Card cmd = Card.fromPaperCard(registeredPlayer.getCommander(), this); + cmd = Card.fromPaperCard(registeredPlayer.getCommander(), this); + } + else if (registeredPlayer.getPlaneswalker() != null) { // Planeswalker + cmd = Card.fromPaperCard(registeredPlayer.getPlaneswalker(), this); + } + if (cmd != null) { cmd.setCommander(true); com.add(cmd); setCommander(cmd); @@ -2756,7 +2762,11 @@ public class Player extends GameEntity implements Comparable { r = ReplacementHandler.parseReplacement("Event$ Moved | Destination$ Graveyard,Exile,Hand,Library | ValidCard$ Card.IsCommander+YouOwn | Secondary$ True | Optional$ True | OptionalDecider$ You | ReplaceWith$ CommanderMoveReplacement | Description$ If a commander would be exiled or put into hand, graveyard, or library from anywhere, that player may put it into the command zone instead.", eff, true); } eff.addReplacementEffect(r); - eff.addStaticAbility("Mode$ Continuous | EffectZone$ Command | AddKeyword$ May be played | Affected$ Card.YouOwn+IsCommander | AffectedZone$ Command"); + String mayBePlayedAbility = "Mode$ Continuous | EffectZone$ Command | AddKeyword$ May be played | Affected$ Card.YouOwn+IsCommander | AffectedZone$ Command"; + if (game.getRules().hasAppliedVariant(GameType.Planeswalker)) { //support paying for Planeswalker with any color mana + mayBePlayedAbility += " | AddHiddenKeyword$ May spend mana as though it were mana of any color to cast CARDNAME"; + } + eff.addStaticAbility(mayBePlayedAbility); eff.addStaticAbility("Mode$ RaiseCost | EffectZone$ Command | References$ CommanderCostRaise | Amount$ CommanderCostRaise | Type$ Spell | ValidCard$ Card.YouOwn+IsCommander+wasCastFromCommand | EffectZone$ All | AffectedZone$ Command,Stack"); return eff; } diff --git a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java index cdabfe6f545..1391253f379 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -29,7 +29,9 @@ public class RegisteredPlayer { private Iterable conspiracies = null; private PaperCard commander = null; private PaperCard vanguardAvatar = null; + private PaperCard planeswalker = null; private int teamNumber = -1; // members of teams with negative id will play FFA. + private boolean randomFoil = false; public RegisteredPlayer(Deck deck0) { originalDeck = deck0; @@ -136,7 +138,15 @@ public class RegisteredPlayer { return this; } - public IPaperCard getVanguardAvatar() { + public PaperCard getCommander() { + return commander; + } + public void assignCommander() { + CardPool section = currentDeck.get(DeckSection.Commander); + commander = section == null ? null : section.get(0); + } + + public PaperCard getVanguardAvatar() { return vanguardAvatar; } public void assignVanguardAvatar() { @@ -151,24 +161,24 @@ public class RegisteredPlayer { setStartingHand(getStartingHand() + vanguardAvatar.getRules().getHand()); } - public IPaperCard getCommander() { - return commander; + public PaperCard getPlaneswalker() { + return planeswalker; } - public void assignCommander() { - CardPool section = currentDeck.get(DeckSection.Commander); - commander = section == null ? null : section.get(0); + public void setPlaneswalker(PaperCard planeswalker0) { + planeswalker = planeswalker0; + if (planeswalker != null) { + currentDeck.getMain().remove(planeswalker); //ensure planeswalker removed from main deck + } } public void restoreDeck() { currentDeck = (Deck) originalDeck.copyTo(originalDeck.getName()); } - private boolean randomFoil = false; - public void setRandomFoil(boolean useRandomFoil) { - this.randomFoil = useRandomFoil; - } - public boolean useRandomFoil() { return randomFoil; } + public void setRandomFoil(boolean useRandomFoil) { + randomFoil = useRandomFoil; + } } diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java b/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java index 99907e9a44a..9b1e7cf1716 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestBattle.java @@ -9,6 +9,7 @@ import forge.game.GameView; import forge.interfaces.IButton; import forge.interfaces.IGuiGame; import forge.interfaces.IWinLoseView; +import forge.item.PaperCard; public abstract class ConquestBattle { private final ConquestLocation location; @@ -71,6 +72,7 @@ public abstract class ConquestBattle { public abstract String getEventName(); public abstract String getOpponentName(); + public abstract PaperCard getPlaneswalker(); public abstract void setOpponentAvatar(LobbyPlayer aiPlayer, IGuiGame gui); public abstract Set getVariants(); public abstract int gamesPerMatch(); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestChaosBattle.java b/forge-gui/src/main/java/forge/planarconquest/ConquestChaosBattle.java index d988ca05f14..2c2c67a270f 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestChaosBattle.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestChaosBattle.java @@ -11,6 +11,7 @@ import forge.game.GameView; import forge.interfaces.IButton; import forge.interfaces.IGuiGame; import forge.interfaces.IWinLoseView; +import forge.item.PaperCard; import forge.model.FModel; import forge.planarconquest.ConquestPreferences.CQPref; import forge.properties.ForgeConstants; @@ -67,6 +68,11 @@ public class ConquestChaosBattle extends ConquestBattle { return duel.getName(); } + @Override + public PaperCard getPlaneswalker() { + return null; + } + @Override public void setOpponentAvatar(LobbyPlayer aiPlayer, IGuiGame gui) { gui.setPlayerAvatar(aiPlayer, duel); diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java index 7cf50c1a300..03354e9c963 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestController.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestController.java @@ -84,8 +84,7 @@ public class ConquestController { public void startBattle(ConquestBattle battle) { if (activeBattle != null) { return; } - Set variants = battle.getVariants(); - + final Set variants = battle.getVariants(); final ConquestCommander commander = model.getSelectedCommander(); final RegisteredPlayer humanStart = new RegisteredPlayer(commander.getDeck()); final RegisteredPlayer aiStart = new RegisteredPlayer(battle.getOpponentDeck()); @@ -103,6 +102,10 @@ public class ConquestController { humanStart.assignVanguardAvatar(); aiStart.assignVanguardAvatar(); } + if (variants.contains(GameType.Planeswalker)) { //account for Planeswalker format + humanStart.setPlaneswalker(model.getPlaneswalker()); + aiStart.setPlaneswalker(battle.getPlaneswalker()); + } if (variants.contains(GameType.Planechase)) { //generate planar decks if planechase variant being applied List planes = generatePlanarPool(); humanStart.setPlanes(planes); @@ -137,7 +140,7 @@ public class ConquestController { FThreads.invokeInEdtNowOrLater(new Runnable(){ @Override public void run() { - hostedMatch.startMatch(rules, null, starter, humanStart, gui); + hostedMatch.startMatch(rules, variants, starter, humanStart, gui); } }); activeBattle = battle; diff --git a/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java b/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java index 6ccb71c9c9c..c67815a0fad 100644 --- a/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java +++ b/forge-gui/src/main/java/forge/planarconquest/ConquestEvent.java @@ -183,6 +183,15 @@ public class ConquestEvent { return ConquestEvent.this.getOpponentName(); } + @Override + public PaperCard getPlaneswalker() { + PaperCard avatarCard = ConquestEvent.this.getAvatarCard(); + if (avatarCard != null && avatarCard.getRules().getType().isPlaneswalker()) { + return avatarCard; + } + return null; + } + @Override public void setOpponentAvatar(LobbyPlayer aiPlayer, IGuiGame gui) { PaperCard avatarCard = ConquestEvent.this.getAvatarCard();