From 4dd52e6f82150dbb4c87d39e7df1e1261256e242 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Sat, 10 Mar 2018 20:23:34 +0000 Subject: [PATCH] Fixes to ensure deckchooser AI status is set correctly before decks are generated and that the list of card-based decks is updated to show only AI playable cards as required. --- .../java/forge/deckchooser/FDeckChooser.java | 4 ++ .../main/java/forge/screens/home/VLobby.java | 48 ++++++++++++++++++- .../src/forge/deck/FDeckChooser.java | 4 ++ .../screens/constructed/LobbyScreen.java | 42 ++++++++++++++-- .../screens/constructed/PlayerPanel.java | 1 + .../java/forge/interfaces/IUpdateable.java | 5 +- .../src/main/java/forge/match/GameLobby.java | 7 +++ .../main/java/forge/net/NetConnectUtil.java | 3 ++ 8 files changed, 108 insertions(+), 6 deletions(-) diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java index e54f444b9bf..6e4340d13ac 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckChooser.java @@ -327,6 +327,10 @@ public class FDeckChooser extends JPanel implements IDecksComboBoxListener { refreshDecksList(ev.getDeckType(), false, ev); } + public void refreshDeckListForAI(){ + refreshDecksList(selectedDeckType,true,null); + } + private void refreshDecksList(final DeckType deckType, final boolean forceRefresh, final DecksComboBoxEvent ev) { if (decksComboBox == null) { return; } // Not yet populated if (selectedDeckType == deckType && !forceRefresh) { return; } 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 02732999231..af10d8824af 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 @@ -19,6 +19,7 @@ import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import forge.deckchooser.DecksComboBoxEvent; import net.miginfocom.swing.MigLayout; import com.google.common.collect.ImmutableList; @@ -233,6 +234,48 @@ public class VLobby implements ILobbyView { getPlayerPanelWithFocus().focusOnAvatar(); } + @Override + public void update(final int slot, final LobbySlotType type){ + final FDeckChooser deckChooser = getDeckChooser(slot); + deckChooser.setIsAi(type==LobbySlotType.AI); + DeckType selectedDeckType = deckChooser.getSelectedDeckType(); + switch (selectedDeckType){ + case STANDARD_CARDGEN_DECK: + case MODERN_CARDGEN_DECK: + case COLOR_DECK: + case STANDARD_COLOR_DECK: + case MODERN_COLOR_DECK: + String selectedName = deckChooser.getLstDecks().getSelectedItem().getName(); + deckChooser.refreshDeckListForAI(); + deckChooser.restoreSavedState(); + break; + default: + break; + } + final FDeckChooser commanderDeckChooser = getCommanderDeckChooser(slot); + commanderDeckChooser.setIsAi(type==LobbySlotType.AI); + selectedDeckType = commanderDeckChooser.getSelectedDeckType(); + switch (selectedDeckType){ + case RANDOM_CARDGEN_COMMANDER_DECK: + case RANDOM_COMMANDER_DECK: + commanderDeckChooser.refreshDeckListForAI(); + break; + default: + break; + } + final FDeckChooser tinyLeaderDeckChooser = getTinyLeaderDeckChooser(slot); + tinyLeaderDeckChooser.setIsAi(type==LobbySlotType.AI); + selectedDeckType = tinyLeaderDeckChooser.getSelectedDeckType(); + switch (selectedDeckType){ + case RANDOM_CARDGEN_COMMANDER_DECK: + case RANDOM_COMMANDER_DECK: + tinyLeaderDeckChooser.refreshDeckListForAI(); + break; + default: + break; + } + } + @Override public void update(final boolean fullUpdate) { activePlayersNum = lobby.getNumberOfSlots(); @@ -731,7 +774,10 @@ public class VLobby implements ILobbyView { } private boolean isPlayerAI(final int playernum) { - return playernum < activePlayersNum ? playerPanels.get(playernum).isAi() : false; + if(playernum < activePlayersNum){ + return playerPanels.get(playernum).isAi(); + } + return true; } public int getNumPlayers() { diff --git a/forge-gui-mobile/src/forge/deck/FDeckChooser.java b/forge-gui-mobile/src/forge/deck/FDeckChooser.java index 81ab2b910c9..44ccdf0ae2d 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckChooser.java +++ b/forge-gui-mobile/src/forge/deck/FDeckChooser.java @@ -530,6 +530,10 @@ public class FDeckChooser extends FScreen { } } + public void refreshDeckListForAI(){ + refreshDecksList(selectedDeckType,true,null); + } + private void refreshDecksList(DeckType deckType, boolean forceRefresh, FEvent e) { if (selectedDeckType == deckType && !forceRefresh) { return; } selectedDeckType = deckType; diff --git a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java index f8e05cafa2c..df77e2db75e 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/LobbyScreen.java @@ -2,6 +2,7 @@ package forge.screens.constructed; import java.util.*; +import forge.deck.*; import org.apache.commons.lang3.StringUtils; import com.badlogic.gdx.Gdx; @@ -14,10 +15,6 @@ import forge.Graphics; import forge.ai.AIOption; import forge.assets.FSkinColor; import forge.assets.FSkinFont; -import forge.deck.CardPool; -import forge.deck.Deck; -import forge.deck.DeckSection; -import forge.deck.DeckType; import forge.game.GameType; import forge.interfaces.ILobbyView; import forge.interfaces.IPlayerChangeListener; @@ -410,6 +407,43 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView { return playerPanels.get(playernum).isArchenemy(); } + @Override + public final void update(final int slot, final LobbySlotType type) { + final FDeckChooser deckChooser = playerPanels.get(slot).getDeckChooser(); + DeckType selectedDeckType = deckChooser.getSelectedDeckType(); + switch (selectedDeckType){ + case STANDARD_CARDGEN_DECK: + case MODERN_CARDGEN_DECK: + case COLOR_DECK: + case STANDARD_COLOR_DECK: + case MODERN_COLOR_DECK: + deckChooser.refreshDeckListForAI(); + break; + default: + break; + } + final FDeckChooser commanderDeckChooser = playerPanels.get(slot).getCommanderDeckChooser(); + selectedDeckType = commanderDeckChooser.getSelectedDeckType(); + switch (selectedDeckType){ + case RANDOM_CARDGEN_COMMANDER_DECK: + case RANDOM_COMMANDER_DECK: + commanderDeckChooser.refreshDeckListForAI(); + break; + default: + break; + } + final FDeckChooser tinyLeaderDeckChooser = playerPanels.get(slot).getTinyLeadersDeckChooser(); + selectedDeckType = tinyLeaderDeckChooser.getSelectedDeckType(); + switch (selectedDeckType){ + case RANDOM_CARDGEN_COMMANDER_DECK: + case RANDOM_COMMANDER_DECK: + tinyLeaderDeckChooser.refreshDeckListForAI(); + break; + default: + break; + } + } + @Override public void update(final boolean fullUpdate) { int playerCount = lobby.getNumberOfSlots(); diff --git a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java index 2cbab44ea67..2cf13216378 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/constructed/PlayerPanel.java @@ -339,6 +339,7 @@ public class PlayerPanel extends FContainer { LobbySlot slot = screen.getLobby().getSlot(index); slot.setType(type); + screen.update(index,type); //update may edit in-case it changed as a result of the AI change setMayEdit(screen.getLobby().mayEdit(index)); diff --git a/forge-gui/src/main/java/forge/interfaces/IUpdateable.java b/forge-gui/src/main/java/forge/interfaces/IUpdateable.java index 0685a64a988..0a1c7e1cff3 100644 --- a/forge-gui/src/main/java/forge/interfaces/IUpdateable.java +++ b/forge-gui/src/main/java/forge/interfaces/IUpdateable.java @@ -1,5 +1,8 @@ package forge.interfaces; -public interface IUpdateable { +import forge.match.LobbySlotType; + +public interface IUpdateable{ void update(boolean fullUpdate); + void update(int slot, LobbySlotType type); } diff --git a/forge-gui/src/main/java/forge/match/GameLobby.java b/forge-gui/src/main/java/forge/match/GameLobby.java index 4599efce415..b6a2369cc90 100644 --- a/forge-gui/src/main/java/forge/match/GameLobby.java +++ b/forge-gui/src/main/java/forge/match/GameLobby.java @@ -111,6 +111,7 @@ public abstract class GameLobby implements IHasGameType { final boolean archenemyRemoved = triesToChangeArchenemy && !event.getArchenemy().booleanValue(); final boolean hasArchenemyChanged = triesToChangeArchenemy && slot.isArchenemy() != event.getArchenemy().booleanValue(); + final boolean changed = slot.apply(event) || hasArchenemyChanged; // Change archenemy teams @@ -129,6 +130,12 @@ public abstract class GameLobby implements IHasGameType { } } + if (event.getType() != null) { + //refresh decklist for slot + listener.update(index,event.getType()); + } + + if (changed) { updateView(false); } diff --git a/forge-gui/src/main/java/forge/net/NetConnectUtil.java b/forge-gui/src/main/java/forge/net/NetConnectUtil.java index a11b91b4c99..cf1e624a423 100644 --- a/forge-gui/src/main/java/forge/net/NetConnectUtil.java +++ b/forge-gui/src/main/java/forge/net/NetConnectUtil.java @@ -1,5 +1,6 @@ package forge.net; +import forge.match.LobbySlotType; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -54,6 +55,8 @@ public class NetConnectUtil { view.update(fullUpdate); server.updateLobbyState(); } + @Override + public final void update(final int slot, final LobbySlotType type) {return;} }); view.setPlayerChangeListener(new IPlayerChangeListener() { @Override