From a73667610b87feb12f9562c7883b7d803c1e5754 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Mon, 2 Apr 2018 07:19:09 +0100 Subject: [PATCH] Added MoJhoSto variant --- .../src/main/java/forge/game/GameType.java | 19 +++++++++++++ .../main/java/forge/game/player/Player.java | 6 +++-- .../forge/game/player/RegisteredPlayer.java | 27 ++++++++++--------- .../java/forge/screens/home/PlayerPanel.java | 3 ++- .../main/java/forge/screens/home/VLobby.java | 7 ++--- .../screens/constructed/LobbyScreen.java | 2 ++ .../java/forge/achievement/ArcaneMaster.java | 2 +- .../achievement/ChallengeAchievements.java | 2 +- .../achievement/ConstructedAchievements.java | 1 + .../main/java/forge/achievement/Domain.java | 2 +- .../java/forge/achievement/ManaFlooded.java | 2 +- .../src/main/java/forge/match/GameLobby.java | 20 +++++++++----- 12 files changed, 65 insertions(+), 28 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameType.java b/forge-game/src/main/java/forge/game/GameType.java index 4347bfdd8b9..bd3058af86a 100644 --- a/forge-game/src/main/java/forge/game/GameType.java +++ b/forge-game/src/main/java/forge/game/GameType.java @@ -42,6 +42,25 @@ public enum GameType { .getCard("Momir Vig, Simic Visionary Avatar"), 1); return deck; } + }), + MoJhoSto (DeckFormat.Constructed, false, false, false, "MoJhoSto", "Each player has a deck containing 60 basic lands and the Momir Vig, Jhoira of the Ghitu, and Stonehewer Giant avatars.", new Function() { + @Override + public Deck apply(RegisteredPlayer player) { + Deck deck = new Deck(); + CardPool mainDeck = deck.getMain(); + mainDeck.add("Plains", 12); + mainDeck.add("Island", 12); + mainDeck.add("Swamp", 12); + mainDeck.add("Mountain", 12); + mainDeck.add("Forest", 12); + deck.getOrCreate(DeckSection.Avatar).add(StaticData.instance().getVariantCards() + .getCard("Momir Vig, Simic Visionary Avatar"), 1); + deck.getOrCreate(DeckSection.Avatar).add(StaticData.instance().getVariantCards() + .getCard("Jhoira of the Ghitu Avatar"), 1); + deck.getOrCreate(DeckSection.Avatar).add(StaticData.instance().getVariantCards() + .getCard("Stonehewer Giant Avatar"), 1); + return deck; + } }); private final DeckFormat deckFormat; 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 87dbb585b97..5af9d6dda5e 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2591,8 +2591,10 @@ public class Player extends GameEntity implements Comparable { PlayerZone com = getZone(ZoneType.Command); // Vanguard - if (registeredPlayer.getVanguardAvatar() != null) { - com.add(Card.fromPaperCard(registeredPlayer.getVanguardAvatar(), this)); + if (registeredPlayer.getVanguardAvatars() != null) { + for(PaperCard avatar:registeredPlayer.getVanguardAvatars()) { + com.add(Card.fromPaperCard(avatar, this)); + } } // Schemes 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 fbf9ffef6fb..3084424a6df 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -30,7 +30,7 @@ public class RegisteredPlayer { private Iterable planes = null; private Iterable conspiracies = null; private List commanders = Lists.newArrayList(); - private PaperCard vanguardAvatar = null; + private List vanguardAvatars = null; private PaperCard planeswalker = null; private int teamNumber = -1; // members of teams with negative id will play FFA. private boolean randomFoil = false; @@ -104,7 +104,7 @@ public class RegisteredPlayer { public static RegisteredPlayer forVariants(final int playerCount, final Set appliedVariants, final Deck deck, //General vars final Iterable schemes, final boolean playerIsArchenemy, //Archenemy specific vars - final Iterable planes, final PaperCard vanguardAvatar) { //Planechase and Vanguard + final Iterable planes, final CardPool vanguardAvatar) { //Planechase and Vanguard RegisteredPlayer start = new RegisteredPlayer(deck); if (appliedVariants.contains(GameType.Archenemy) && playerIsArchenemy) { @@ -131,8 +131,9 @@ public class RegisteredPlayer { if (appliedVariants.contains(GameType.Planechase)) { start.planes = planes; } - if (appliedVariants.contains(GameType.Vanguard) || appliedVariants.contains(GameType.MomirBasic)) { - start.setVanguardAvatar(vanguardAvatar); + if (appliedVariants.contains(GameType.Vanguard) || appliedVariants.contains(GameType.MomirBasic) + || appliedVariants.contains(GameType.MoJhoSto)) { + start.setVanguardAvatars(vanguardAvatar.toFlatList()); } return start; } @@ -153,19 +154,21 @@ public class RegisteredPlayer { commanders = currentDeck.getCommanders(); } - public PaperCard getVanguardAvatar() { - return vanguardAvatar; + public List getVanguardAvatars() { + return vanguardAvatars; } public void assignVanguardAvatar() { CardPool section = currentDeck.get(DeckSection.Avatar); - setVanguardAvatar(section == null ? null : section.get(0)); + setVanguardAvatars(section == null ? null : section.toFlatList()); } - private void setVanguardAvatar(PaperCard vanguardAvatar0) { - vanguardAvatar = vanguardAvatar0; - if (vanguardAvatar == null) { return; } + private void setVanguardAvatars(List vanguardAvatars0) { + vanguardAvatars = vanguardAvatars0; + if (vanguardAvatars == null) { return; } + for(PaperCard avatar: vanguardAvatars){ + setStartingLife(getStartingLife() + avatar.getRules().getLife()); + setStartingHand(getStartingHand() + avatar.getRules().getHand()); + } - setStartingLife(getStartingLife() + vanguardAvatar.getRules().getLife()); - setStartingHand(getStartingHand() + vanguardAvatar.getRules().getHand()); } public PaperCard getPlaneswalker() { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java index aca3837935c..006487fa53a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/PlayerPanel.java @@ -342,7 +342,8 @@ public class PlayerPanel extends FPanel { final boolean isArchenemyApplied = mayEdit && lobby.hasVariant(GameType.Archenemy); final boolean archenemyVisiblity = mayEdit && lobby.hasVariant(GameType.ArchenemyRumble) || (isArchenemyApplied && isArchenemy()); // Commander deck building replaces normal one, so hide it - final boolean isDeckBuildingAllowed = mayEdit && !isCommanderApplied && !lobby.hasVariant(GameType.MomirBasic); + final boolean isDeckBuildingAllowed = mayEdit && !isCommanderApplied && !lobby.hasVariant(GameType.MomirBasic) + && !lobby.hasVariant(GameType.MoJhoSto); deckLabel.setVisible(isDeckBuildingAllowed); deckBtn.setVisible(isDeckBuildingAllowed); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index bacca8434e2..e5ad4e68e82 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -89,6 +89,7 @@ public class VLobby implements ILobbyView { private final FPanel variantsPanel = new FPanel(new MigLayout("insets 10, gapx 10")); private final VariantCheckBox vntVanguard = new VariantCheckBox(GameType.Vanguard); private final VariantCheckBox vntMomirBasic = new VariantCheckBox(GameType.MomirBasic); + private final VariantCheckBox vntMoJhoSto = new VariantCheckBox(GameType.MoJhoSto); private final VariantCheckBox vntCommander = new VariantCheckBox(GameType.Commander); private final VariantCheckBox vntTinyLeaders = new VariantCheckBox(GameType.TinyLeaders); private final VariantCheckBox vntBrawl = new VariantCheckBox(GameType.Brawl); @@ -96,9 +97,9 @@ public class VLobby implements ILobbyView { private final VariantCheckBox vntArchenemy = new VariantCheckBox(GameType.Archenemy); private final VariantCheckBox vntArchenemyRumble = new VariantCheckBox(GameType.ArchenemyRumble); private final ImmutableList vntBoxesLocal = - ImmutableList.of(vntVanguard, vntMomirBasic, vntCommander, vntTinyLeaders, vntBrawl, vntPlanechase, vntArchenemy, vntArchenemyRumble); + ImmutableList.of(vntVanguard, vntMomirBasic, vntMoJhoSto, vntCommander, vntTinyLeaders, vntBrawl, vntPlanechase, vntArchenemy, vntArchenemyRumble); private final ImmutableList vntBoxesNetwork = - ImmutableList.of(vntVanguard, vntMomirBasic, vntCommander, vntTinyLeaders, vntBrawl /*, vntPlanechase, vntArchenemy, vntArchenemyRumble */); + ImmutableList.of(vntVanguard, vntMomirBasic, vntMoJhoSto, vntCommander, vntTinyLeaders, vntBrawl /*, vntPlanechase, vntArchenemy, vntArchenemyRumble */); // Player frame elements private final JPanel playersFrame = new JPanel(new MigLayout("insets 0, gap 0 5, wrap, hidemode 3")); @@ -387,7 +388,7 @@ public class VLobby implements ILobbyView { } void setReady(final int index, final boolean ready) { - if (ready && decks[index] == null && !vntMomirBasic.isSelected()) { + if (ready && decks[index] == null && !vntMomirBasic.isSelected() && !vntMoJhoSto.isSelected()) { SOptionPane.showErrorDialog("Select a deck before readying!"); update(false); return; diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index d7cf3c109c6..3194d055666 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -120,6 +120,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { cbVariants.addItem("(None)"); cbVariants.addItem(GameType.Vanguard); cbVariants.addItem(GameType.MomirBasic); + cbVariants.addItem(GameType.MoJhoSto); cbVariants.addItem(GameType.Commander); cbVariants.addItem(GameType.TinyLeaders); cbVariants.addItem(GameType.Brawl); @@ -345,6 +346,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { lstVariants.setListItemRenderer(new VariantRenderer()); lstVariants.addItem(new Variant(GameType.Vanguard)); lstVariants.addItem(new Variant(GameType.MomirBasic)); + lstVariants.addItem(new Variant(GameType.MoJhoSto)); lstVariants.addItem(new Variant(GameType.Commander)); lstVariants.addItem(new Variant(GameType.TinyLeaders)); lstVariants.addItem(new Variant(GameType.Brawl)); diff --git a/forge-gui/src/main/java/forge/achievement/ArcaneMaster.java b/forge-gui/src/main/java/forge/achievement/ArcaneMaster.java index 97aa22686cb..7f39f857375 100644 --- a/forge-gui/src/main/java/forge/achievement/ArcaneMaster.java +++ b/forge-gui/src/main/java/forge/achievement/ArcaneMaster.java @@ -15,7 +15,7 @@ public class ArcaneMaster extends Achievement { @Override protected int evaluate(Player player, Game game) { - if (game.getRules().hasAppliedVariant(GameType.MomirBasic)) { + if (game.getRules().hasAppliedVariant(GameType.MomirBasic) || game.getRules().hasAppliedVariant(GameType.MoJhoSto)) { return defaultValue; // Momir Basic is exempt from this achievement (custom rules do not require any spellcasting by default) } if (player.getOutcome().hasWon()) { diff --git a/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java b/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java index da72243ace6..4765d8c9c1f 100644 --- a/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java +++ b/forge-gui/src/main/java/forge/achievement/ChallengeAchievements.java @@ -72,7 +72,7 @@ public class ChallengeAchievements extends AchievementCollection { } public static boolean checkValidGameMode(final Game game) { - if (game.getRules().hasAppliedVariant(GameType.MomirBasic) + if (game.getRules().hasAppliedVariant(GameType.MomirBasic) || game.getRules().hasAppliedVariant(GameType.MoJhoSto) || game.getRules().hasAppliedVariant(GameType.Puzzle)) { // these modes use a fixed pre-defined deck format, so challenge achievements don't apply in them return false; diff --git a/forge-gui/src/main/java/forge/achievement/ConstructedAchievements.java b/forge-gui/src/main/java/forge/achievement/ConstructedAchievements.java index f4f60c162ee..ba76a031eb9 100644 --- a/forge-gui/src/main/java/forge/achievement/ConstructedAchievements.java +++ b/forge-gui/src/main/java/forge/achievement/ConstructedAchievements.java @@ -13,6 +13,7 @@ public class ConstructedAchievements extends AchievementCollection { protected void addAchievements() { add(new VariantWins(GameType.Vanguard, 25, 50, 100)); add(new VariantWins(GameType.MomirBasic, 25, 50, 100)); + add(new VariantWins(GameType.MoJhoSto, 25, 50, 100)); add(new VariantWins(GameType.Commander, 25, 50, 100)); add(new VariantWins(GameType.TinyLeaders, 25, 50, 100)); add(new VariantWins(GameType.Brawl, 25, 50, 100)); diff --git a/forge-gui/src/main/java/forge/achievement/Domain.java b/forge-gui/src/main/java/forge/achievement/Domain.java index 516683753cd..2aa7c8da680 100644 --- a/forge-gui/src/main/java/forge/achievement/Domain.java +++ b/forge-gui/src/main/java/forge/achievement/Domain.java @@ -16,7 +16,7 @@ public class Domain extends ProgressiveAchievement { @Override protected boolean eval(Player player, Game game) { - if (game.getRules().hasAppliedVariant(GameType.MomirBasic)) { + if (game.getRules().hasAppliedVariant(GameType.MomirBasic) || game.getRules().hasAppliedVariant(GameType.MoJhoSto)) { // Not an achievement in Momir Basic (easy to get due to predefined deck contents) return false; } diff --git a/forge-gui/src/main/java/forge/achievement/ManaFlooded.java b/forge-gui/src/main/java/forge/achievement/ManaFlooded.java index b1a1ffd6d96..e6f495f0e72 100644 --- a/forge-gui/src/main/java/forge/achievement/ManaFlooded.java +++ b/forge-gui/src/main/java/forge/achievement/ManaFlooded.java @@ -17,7 +17,7 @@ public class ManaFlooded extends Achievement { @Override protected int evaluate(Player player, Game game) { - if (game.getRules().hasAppliedVariant(GameType.MomirBasic)) { + if (game.getRules().hasAppliedVariant(GameType.MomirBasic) || game.getRules().hasAppliedVariant(GameType.MoJhoSto)) { return 0; // in Momir Basic, getting a lot of lands out is not an achievement:w } if (player.getOutcome().hasWon()) { diff --git a/forge-gui/src/main/java/forge/match/GameLobby.java b/forge-gui/src/main/java/forge/match/GameLobby.java index 7867078cbb4..1401c33272f 100644 --- a/forge-gui/src/main/java/forge/match/GameLobby.java +++ b/forge-gui/src/main/java/forge/match/GameLobby.java @@ -234,25 +234,37 @@ public abstract class GameLobby implements IHasGameType { data.appliedVariants.remove(GameType.TinyLeaders); data.appliedVariants.remove(GameType.Brawl); data.appliedVariants.remove(GameType.MomirBasic); + data.appliedVariants.remove(GameType.MoJhoSto); break; case TinyLeaders: data.appliedVariants.remove(GameType.Commander); data.appliedVariants.remove(GameType.Brawl); data.appliedVariants.remove(GameType.MomirBasic); + data.appliedVariants.remove(GameType.MoJhoSto); break; case Brawl: data.appliedVariants.remove(GameType.Commander); data.appliedVariants.remove(GameType.TinyLeaders); data.appliedVariants.remove(GameType.MomirBasic); + data.appliedVariants.remove(GameType.MoJhoSto); break; case Vanguard: data.appliedVariants.remove(GameType.MomirBasic); + data.appliedVariants.remove(GameType.MoJhoSto); break; case MomirBasic: data.appliedVariants.remove(GameType.Commander); data.appliedVariants.remove(GameType.TinyLeaders); data.appliedVariants.remove(GameType.Brawl); data.appliedVariants.remove(GameType.Vanguard); + data.appliedVariants.remove(GameType.MoJhoSto); + break; + case MoJhoSto: + data.appliedVariants.remove(GameType.Commander); + data.appliedVariants.remove(GameType.TinyLeaders); + data.appliedVariants.remove(GameType.Brawl); + data.appliedVariants.remove(GameType.Vanguard); + data.appliedVariants.remove(GameType.MomirBasic); break; default: break; @@ -413,7 +425,6 @@ public abstract class GameLobby implements IHasGameType { players.add(rp.setPlayer(lobbyPlayer)); } else { - PaperCard vanguardAvatar = null; if (isCommanderMatch) { final GameType commanderGameType = isTinyLeadersMatch ? GameType.TinyLeaders : isBrawlMatch ? GameType.Brawl : GameType.Commander; if (checkLegality) { @@ -438,9 +449,6 @@ public abstract class GameLobby implements IHasGameType { deck = deck == null ? rp.getDeck() : deck; final CardPool avatarPool = deck.get(DeckSection.Avatar); - if (avatarPool != null && (hasVariant(GameType.Vanguard) || hasVariant(GameType.MomirBasic))) { - vanguardAvatar = avatarPool.get(0); - } Iterable schemes = null; Iterable planes = null; @@ -474,14 +482,14 @@ public abstract class GameLobby implements IHasGameType { //Vanguard if (variantTypes.contains(GameType.Vanguard)) { - if (vanguardAvatar == null) { //ERROR! null if avatar deselected on list + if (avatarPool == null || avatarPool.countAll() == 0) { //ERROR! null if avatar deselected on list SOptionPane.showMessageDialog("No Vanguard avatar selected for " + name + ". Please choose one or disable the Vanguard variant"); return null; } } - rp = RegisteredPlayer.forVariants(activeSlots.size(), variantTypes, deck, schemes, isArchenemy, planes, vanguardAvatar); + rp = RegisteredPlayer.forVariants(activeSlots.size(), variantTypes, deck, schemes, isArchenemy, planes, avatarPool); rp.setTeamNumber(team); players.add(rp.setPlayer(lobbyPlayer)); }