Merge branch 'newBranch' into 'master'

Improve Online Lobby (Mobile Port)

Closes #659, #658, #172, and #914

See merge request core-developers/forge!2738
This commit is contained in:
Michael Kamensky
2020-04-22 04:24:19 +00:00
13 changed files with 422 additions and 105 deletions

View File

@@ -71,7 +71,7 @@ public class PhaseHandler implements java.io.Serializable {
private int turn = 0; private int turn = 0;
private final transient Stack<ExtraTurn> extraTurns = new Stack<>(); private final transient Stack<ExtraTurn> extraTurns = new Stack<>();
private final transient Map<PhaseType, Stack<PhaseType>> extraPhases = Maps.newEnumMap(PhaseType.class); private final transient Map<PhaseType, Deque<PhaseType>> DextraPhases = Maps.newEnumMap(PhaseType.class);
private int nUpkeepsThisTurn = 0; private int nUpkeepsThisTurn = 0;
private int nUpkeepsThisGame = 0; private int nUpkeepsThisGame = 0;
@@ -151,12 +151,12 @@ public class PhaseHandler implements java.io.Serializable {
else { else {
// If the phase that's ending has a stack of additional phases // If the phase that's ending has a stack of additional phases
// Take the LIFO one and move to that instead of the normal one // Take the LIFO one and move to that instead of the normal one
if (extraPhases.containsKey(phase)) { if (DextraPhases.containsKey(phase)) {
PhaseType nextPhase = extraPhases.get(phase).pop(); PhaseType nextPhase = DextraPhases.get(phase).removeFirst();
// If no more additional phases are available, remove it from the map // If no more additional phases are available, remove it from the map
// and let the next add, reput the key // and let the next add, reput the key
if (extraPhases.get(phase).isEmpty()) { if (DextraPhases.get(phase).isEmpty()) {
extraPhases.remove(phase); DextraPhases.remove(phase);
} }
setPhase(nextPhase); setPhase(nextPhase);
} }
@@ -918,10 +918,10 @@ public class PhaseHandler implements java.io.Serializable {
public final void addExtraPhase(final PhaseType afterPhase, final PhaseType extraPhase) { public final void addExtraPhase(final PhaseType afterPhase, final PhaseType extraPhase) {
// 500.8. Some effects can add phases to a turn. They do this by adding the phases directly after the specified phase. // 500.8. Some effects can add phases to a turn. They do this by adding the phases directly after the specified phase.
// If multiple extra phases are created after the same phase, the most recently created phase will occur first. // If multiple extra phases are created after the same phase, the most recently created phase will occur first.
if (!extraPhases.containsKey(afterPhase)) { if (!DextraPhases.containsKey(afterPhase)) {
extraPhases.put(afterPhase, new Stack<>()); DextraPhases.put(afterPhase, new ArrayDeque<>());
} }
extraPhases.get(afterPhase).push(extraPhase); DextraPhases.get(afterPhase).addFirst(extraPhase);
} }
public final boolean isFirstCombat() { public final boolean isFirstCombat() {
@@ -1159,7 +1159,7 @@ public class PhaseHandler implements java.io.Serializable {
public final void endTurnByEffect() { public final void endTurnByEffect() {
endCombat(); endCombat();
extraPhases.clear(); DextraPhases.clear();
setPhase(PhaseType.CLEANUP); setPhase(PhaseType.CLEANUP);
onPhaseBegin(); onPhaseBegin();
} }

View File

@@ -135,8 +135,8 @@ public class RegisteredPlayer {
start.planes = planes; start.planes = planes;
} }
if (appliedVariants.contains(GameType.Vanguard) || appliedVariants.contains(GameType.MomirBasic) if (appliedVariants.contains(GameType.Vanguard) || appliedVariants.contains(GameType.MomirBasic)
|| appliedVariants.contains(GameType.MoJhoSto)) { || appliedVariants.contains(GameType.MoJhoSto)) { //fix the crash, if somehow the avatar is null, get it directly from the deck
start.setVanguardAvatars(vanguardAvatar.toFlatList()); start.setVanguardAvatars(vanguardAvatar == null ? deck.get(DeckSection.Avatar).toFlatList():vanguardAvatar.toFlatList());
} }
return start; return start;
} }

View File

@@ -38,9 +38,10 @@ import forge.util.Utils;
import java.io.File; import java.io.File;
import java.io.FileFilter; import java.io.FileFilter;
import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Deque;
import java.util.List; import java.util.List;
import java.util.Stack;
public class Forge implements ApplicationListener { public class Forge implements ApplicationListener {
public static final String CURRENT_VERSION = "1.6.33.001"; public static final String CURRENT_VERSION = "1.6.33.001";
@@ -57,7 +58,7 @@ public class Forge implements ApplicationListener {
private static KeyInputAdapter keyInputAdapter; private static KeyInputAdapter keyInputAdapter;
private static boolean exited; private static boolean exited;
private static int continuousRenderingCount = 1; //initialize to 1 since continuous rendering is the default private static int continuousRenderingCount = 1; //initialize to 1 since continuous rendering is the default
private static final Stack<FScreen> screens = new Stack<>(); private static final Deque<FScreen> Dscreens = new ArrayDeque<>();
private static boolean textureFiltering = false; private static boolean textureFiltering = false;
private static boolean destroyThis = false; private static boolean destroyThis = false;
public static String extrawide = "default"; public static String extrawide = "default";
@@ -259,13 +260,13 @@ public class Forge implements ApplicationListener {
} }
public static boolean onHomeScreen() { public static boolean onHomeScreen() {
return screens.size() == 1; return Dscreens.size() == 1;
} }
public static void back() { public static void back() {
if(destroyThis && isLandscapeMode()) if(destroyThis && isLandscapeMode())
return; return;
if (screens.size() < 2) { if (Dscreens.size() < 2) {
exit(false); //prompt to exit if attempting to go back from home screen exit(false); //prompt to exit if attempting to go back from home screen
return; return;
} }
@@ -273,8 +274,8 @@ public class Forge implements ApplicationListener {
@Override @Override
public void run(Boolean result) { public void run(Boolean result) {
if (result) { if (result) {
screens.pop(); Dscreens.removeFirst();
setCurrentScreen(screens.lastElement()); setCurrentScreen(Dscreens.getFirst());
} }
} }
}); });
@@ -282,12 +283,12 @@ public class Forge implements ApplicationListener {
//set screen that will be gone to on pressing Back before going to current Back screen //set screen that will be gone to on pressing Back before going to current Back screen
public static void setBackScreen(final FScreen screen0, boolean replace) { public static void setBackScreen(final FScreen screen0, boolean replace) {
screens.remove(screen0); //remove screen from previous position in navigation history Dscreens.remove(screen0); //remove screen from previous position in navigation history
int index = screens.size() - 1; int index = Dscreens.size() - 1;
if (index > 0) { if (index > 0) {
screens.add(index, screen0); Dscreens.addLast(screen0);
if (replace) { //remove previous back screen if replacing back screen if (replace) { //remove previous back screen if replacing back screen
screens.remove(index - 1); Dscreens.removeFirst();
} }
} }
} }
@@ -349,7 +350,7 @@ public class Forge implements ApplicationListener {
if (currentScreen == screen0) { return; } if (currentScreen == screen0) { return; }
if (currentScreen == null) { if (currentScreen == null) {
screens.push(screen0); Dscreens.addFirst(screen0);
setCurrentScreen(screen0); setCurrentScreen(screen0);
return; return;
} }
@@ -358,11 +359,11 @@ public class Forge implements ApplicationListener {
@Override @Override
public void run(Boolean result) { public void run(Boolean result) {
if (result) { if (result) {
if (replaceBackScreen && !screens.isEmpty()) { if (replaceBackScreen && !Dscreens.isEmpty()) {
screens.pop(); Dscreens.removeFirst();
} }
if (screens.peek() != screen0) { //prevent screen being its own back screen if (Dscreens.peekFirst() != screen0) { //prevent screen being its own back screen
screens.push(screen0); Dscreens.addFirst(screen0);
} }
setCurrentScreen(screen0); setCurrentScreen(screen0);
} }
@@ -505,7 +506,7 @@ public class Forge implements ApplicationListener {
currentScreen.onClose(null); currentScreen.onClose(null);
currentScreen = null; currentScreen = null;
} }
screens.clear(); Dscreens.clear();
graphics.dispose(); graphics.dispose();
SoundSystem.instance.dispose(); SoundSystem.instance.dispose();
try { try {

View File

@@ -19,7 +19,9 @@ import forge.assets.FSkinFont;
import forge.toolbox.FDisplayObject; import forge.toolbox.FDisplayObject;
import forge.util.Utils; import forge.util.Utils;
import forge.util.TextBounds; import forge.util.TextBounds;
import java.util.Stack;
import java.util.ArrayDeque;
import java.util.Deque;
public class Graphics { public class Graphics {
private static final int GL_BLEND = GL20.GL_BLEND; private static final int GL_BLEND = GL20.GL_BLEND;
@@ -27,13 +29,14 @@ public class Graphics {
private final SpriteBatch batch = new SpriteBatch(); private final SpriteBatch batch = new SpriteBatch();
private final ShapeRenderer shapeRenderer = new ShapeRenderer(); private final ShapeRenderer shapeRenderer = new ShapeRenderer();
private final Stack<Matrix4> transforms = new Stack<>(); private final Deque<Matrix4> Dtransforms = new ArrayDeque<>();
private final Vector3 tmp = new Vector3(); private final Vector3 tmp = new Vector3();
private float regionHeight; private float regionHeight;
private Rectangle bounds; private Rectangle bounds;
private Rectangle visibleBounds; private Rectangle visibleBounds;
private int failedClipCount; private int failedClipCount;
private float alphaComposite = 1; private float alphaComposite = 1;
private int transformCount = 0;
public Graphics() { public Graphics() {
} }
@@ -70,7 +73,7 @@ public class Graphics {
batch.flush(); //must flush batch to prevent other things not rendering batch.flush(); //must flush batch to prevent other things not rendering
Rectangle clip = new Rectangle(adjustX(x), adjustY(y, h), w, h); Rectangle clip = new Rectangle(adjustX(x), adjustY(y, h), w, h);
if (!transforms.isEmpty()) { //transform position if needed if (!Dtransforms.isEmpty()) { //transform position if needed
tmp.set(clip.x, clip.y, 0); tmp.set(clip.x, clip.y, 0);
tmp.mul(batch.getTransformMatrix()); tmp.mul(batch.getTransformMatrix());
float minX = tmp.x; float minX = tmp.x;
@@ -121,7 +124,7 @@ public class Graphics {
final Rectangle parentBounds = bounds; final Rectangle parentBounds = bounds;
bounds = new Rectangle(parentBounds.x + displayObj.getLeft(), parentBounds.y + displayObj.getTop(), displayObj.getWidth(), displayObj.getHeight()); bounds = new Rectangle(parentBounds.x + displayObj.getLeft(), parentBounds.y + displayObj.getTop(), displayObj.getWidth(), displayObj.getHeight());
if (!transforms.isEmpty()) { //transform screen position if needed by applying transform matrix to rectangle if (!Dtransforms.isEmpty()) { //transform screen position if needed by applying transform matrix to rectangle
updateScreenPosForRotation(displayObj); updateScreenPosForRotation(displayObj);
} }
else { else {
@@ -542,7 +545,7 @@ public class Graphics {
} }
private void startShape(ShapeType shapeType) { private void startShape(ShapeType shapeType) {
if (!transforms.isEmpty()) { if (!Dtransforms.isEmpty()) {
//must copy matrix before starting shape if transformed //must copy matrix before starting shape if transformed
shapeRenderer.setTransformMatrix(batch.getTransformMatrix()); shapeRenderer.setTransformMatrix(batch.getTransformMatrix());
} }
@@ -624,7 +627,8 @@ public class Graphics {
public void startRotateTransform(float originX, float originY, float rotation) { public void startRotateTransform(float originX, float originY, float rotation) {
batch.end(); batch.end();
transforms.add(0, new Matrix4(batch.getTransformMatrix().idt())); //startshape is using this above as reference Dtransforms.addFirst(new Matrix4(batch.getTransformMatrix().idt())); //startshape is using this above as reference
transformCount++;
batch.getTransformMatrix().idt().translate(adjustX(originX), adjustY(originY, 0), 0).rotate(Vector3.Z, rotation).translate(-adjustX(originX), -adjustY(originY, 0), 0); batch.getTransformMatrix().idt().translate(adjustX(originX), adjustY(originY, 0), 0).rotate(Vector3.Z, rotation).translate(-adjustX(originX), -adjustY(originY, 0), 0);
batch.begin(); batch.begin();
} }
@@ -632,7 +636,13 @@ public class Graphics {
public void endTransform() { public void endTransform() {
batch.end(); batch.end();
shapeRenderer.setTransformMatrix(batch.getTransformMatrix().idt()); shapeRenderer.setTransformMatrix(batch.getTransformMatrix().idt());
transforms.pop(); Dtransforms.removeFirst();
transformCount--;
if(transformCount != Dtransforms.size()) {
System.err.println(String.format("Stack count: %d, transformCount: %d", Dtransforms.size(), transformCount));
transformCount = 0;
Dtransforms.clear();
}
batch.getTransformMatrix().idt(); //reset batch.getTransformMatrix().idt(); //reset
shapeRenderer.getTransformMatrix().idt(); //reset shapeRenderer.getTransformMatrix().idt(); //reset
batch.begin(); batch.begin();

View File

@@ -11,7 +11,7 @@ import forge.toolbox.FOptionPane;
import forge.util.Utils; import forge.util.Utils;
public abstract class LaunchScreen extends FScreen { public abstract class LaunchScreen extends FScreen {
private static final float MAX_START_BUTTON_HEIGHT = 2 * Utils.AVG_FINGER_HEIGHT; private static final float MAX_START_BUTTON_HEIGHT = 1.75f * Utils.AVG_FINGER_HEIGHT;
private float START_BUTTON_RATIO = 0.f; private float START_BUTTON_RATIO = 0.f;
private static final float PADDING = FOptionPane.PADDING; private static final float PADDING = FOptionPane.PADDING;

View File

@@ -14,6 +14,8 @@ import forge.deck.FDeckChooser;
import forge.net.server.FServerManager; import forge.net.server.FServerManager;
import forge.util.Localizer; import forge.util.Localizer;
import forge.util.MyRandom;
import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
@@ -281,7 +283,10 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
@Override @Override
protected void startMatch() { protected void startMatch() {
for (int i = 0; i < getNumPlayers(); i++) { for (int i = 0; i < getNumPlayers(); i++) {
updateDeck(i);//TODO: Investigate why AI names cannot be overriden? if(!lobby.isAllowNetworking()) //on networkplay, update deck will be handled differently
updateDeck(i);
//TODO: Investigate why AI names cannot be overriden?
updateName(i, getPlayerName(i)); updateName(i, getPlayerName(i));
} }
FThreads.invokeInBackgroundThread(new Runnable() { //must call startGame in background thread in case there are alerts FThreads.invokeInBackgroundThread(new Runnable() { //must call startGame in background thread in case there are alerts
@@ -326,6 +331,15 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
String[] avatarPrefs = prefs.getPref(FPref.UI_AVATARS).split(","); String[] avatarPrefs = prefs.getPref(FPref.UI_AVATARS).split(",");
for (int i = 0; i < avatarPrefs.length; i++) { for (int i = 0; i < avatarPrefs.length; i++) {
int avatarIndex = Integer.parseInt(avatarPrefs[i]); int avatarIndex = Integer.parseInt(avatarPrefs[i]);
if (avatarIndex < 0) {
int random = 0;
List<Integer> usedAvatars = getUsedAvatars();
do {
random = MyRandom.getRandom().nextInt(GuiBase.getInterface().getAvatarCount());
} while (usedAvatars.contains(random));
avatarIndex = random;
}
playerPanels.get(i).setAvatarIndex(avatarIndex); playerPanels.get(i).setAvatarIndex(avatarIndex);
} }
@@ -333,6 +347,15 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
String[] sleevePrefs = prefs.getPref(FPref.UI_SLEEVES).split(","); String[] sleevePrefs = prefs.getPref(FPref.UI_SLEEVES).split(",");
for (int i = 0; i < sleevePrefs.length; i++) { for (int i = 0; i < sleevePrefs.length; i++) {
int sleeveIndex = Integer.parseInt(sleevePrefs[i]); int sleeveIndex = Integer.parseInt(sleevePrefs[i]);
if (sleeveIndex < 0) {
int random = 0;
List<Integer> usedSleeves = getUsedSleeves();
do {
random = MyRandom.getRandom().nextInt(GuiBase.getInterface().getSleevesCount());
} while (usedSleeves.contains(random));
sleeveIndex = random;
}
playerPanels.get(i).setSleeveIndex(sleeveIndex); playerPanels.get(i).setSleeveIndex(sleeveIndex);
} }
@@ -557,7 +580,7 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
} }
if (i == 0) { if (i == 0) {
slot.setIsDevMode(prefs.getPrefBoolean(FPref.DEV_MODE_ENABLED)); slot.setIsDevMode(slot.isDevMode());
} }
final LobbySlotType type = slot.getType(); final LobbySlotType type = slot.getType();
@@ -582,8 +605,21 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
panel.setMayEdit(lobby.mayEdit(i)); panel.setMayEdit(lobby.mayEdit(i));
panel.setMayControl(lobby.mayControl(i)); panel.setMayControl(lobby.mayControl(i));
panel.setMayRemove(lobby.mayRemove(i)); panel.setMayRemove(lobby.mayRemove(i));
if(allowNetworking) {
if(slot.getDeckName() != null)
panel.setDeckSelectorButtonText(slot.getDeckName());
if (fullUpdate && (type == LobbySlotType.LOCAL || type == LobbySlotType.AI)) { if(slot.getPlanarDeckName()!= null)
panel.setPlanarDeckName(slot.getPlanarDeckName());
if(slot.getSchemeDeckName()!= null)
panel.setSchemeDeckName(slot.getSchemeDeckName());
if(slot.getAvatarVanguard()!= null)
panel.setVanguarAvatarName(slot.getAvatarVanguard());
}
if (fullUpdate && (type == LobbySlotType.LOCAL || type == LobbySlotType.AI) && !allowNetworking) {
updateDeck(i); updateDeck(i);
} }
if (isNewPanel) { if (isNewPanel) {
@@ -606,35 +642,46 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
if (playerIndex >= getNumPlayers()) { return; } if (playerIndex >= getNumPlayers()) { return; }
PlayerPanel playerPanel = playerPanels.get(playerIndex); PlayerPanel playerPanel = playerPanels.get(playerIndex);
String deckName = "";
Deck deck; Deck deck;
if (hasVariant(GameType.Commander)) { if (hasVariant(GameType.Commander)) {
deck = playerPanel.getCommanderDeck(); deck = playerPanel.getCommanderDeck();
if (deck != null) { if (deck != null) {
playerPanel.getCommanderDeckChooser().saveState(); playerPanel.getCommanderDeckChooser().saveState();
deckName = localizer.getMessage("lblCommanderDeck") + ": "
+ playerPanel.getCommanderDeckChooser().getDeck().getName();
} }
} }
else if (hasVariant(GameType.Oathbreaker)) { else if (hasVariant(GameType.Oathbreaker)) {
deck = playerPanel.getOathbreakerDeck(); deck = playerPanel.getOathbreakerDeck();
if (deck != null) { if (deck != null) {
playerPanel.getOathbreakerDeckChooser().saveState(); playerPanel.getOathbreakerDeckChooser().saveState();
deckName = localizer.getMessage("lblOathbreakerDeck") + ": "
+ playerPanel.getOathbreakerDeckChooser().getDeck().getName();
} }
} }
else if (hasVariant(GameType.TinyLeaders)) { else if (hasVariant(GameType.TinyLeaders)) {
deck = playerPanel.getTinyLeadersDeck(); deck = playerPanel.getTinyLeadersDeck();
if (deck != null) { if (deck != null) {
playerPanel.getTinyLeadersDeckChooser().saveState(); playerPanel.getTinyLeadersDeckChooser().saveState();
deckName = localizer.getMessage("lblTinyLeadersDeck") + ": "
+ playerPanel.getTinyLeadersDeckChooser().getDeck().getName();
} }
} }
else if (hasVariant(GameType.Brawl)) { else if (hasVariant(GameType.Brawl)) {
deck = playerPanel.getBrawlDeck(); deck = playerPanel.getBrawlDeck();
if (deck != null) { if (deck != null) {
playerPanel.getBrawlDeckChooser().saveState(); playerPanel.getBrawlDeckChooser().saveState();
deckName = localizer.getMessage("lblBrawlDeck") + ": "
+ playerPanel.getBrawlDeckChooser().getDeck().getName();
} }
}else { }else {
deck = playerPanel.getDeck(); deck = playerPanel.getDeck();
if (deck != null) { if (deck != null) {
playerPanel.getDeckChooser().saveState(); playerPanel.getDeckChooser().saveState();
deckName = playerPanel.getDeckChooser().getSelectedDeckType().toString() + ": "
+ playerPanel.getDeckChooser().getDeck().getName();
} }
} }
@@ -642,18 +689,31 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
return; return;
} }
//playerPanel.setDeckSelectorButtonText(deckName);
Deck playerDeck = deck; Deck playerDeck = deck;
String VanguardAvatar = null;
String SchemeDeckName= null;
String PlanarDeckname= null;
if (hasVariant(GameType.Archenemy) || hasVariant(GameType.ArchenemyRumble)) { if (hasVariant(GameType.Archenemy) || hasVariant(GameType.ArchenemyRumble)) {
if (playerDeck == deck) { if (playerDeck == deck) {
playerDeck = new Deck(deck); //create copy that can be modified playerDeck = new Deck(deck); //create copy that can be modified
} }
playerDeck.putSection(DeckSection.Schemes, playerPanel.getSchemeDeck().get(DeckSection.Schemes)); playerDeck.putSection(DeckSection.Schemes, playerPanel.getSchemeDeck().get(DeckSection.Schemes));
if (!playerPanel.getSchemeDeck().getName().isEmpty()) {
SchemeDeckName = localizer.getMessage("lblSchemeDeck") + ": " + playerPanel.getSchemeDeck().getName();
playerPanel.setSchemeDeckName(SchemeDeckName);
}
} }
if (hasVariant(GameType.Planechase)) { if (hasVariant(GameType.Planechase)) {
if (playerDeck == deck) { if (playerDeck == deck) {
playerDeck = new Deck(deck); //create copy that can be modified playerDeck = new Deck(deck); //create copy that can be modified
} }
playerDeck.putSection(DeckSection.Planes, playerPanel.getPlanarDeck().get(DeckSection.Planes)); playerDeck.putSection(DeckSection.Planes, playerPanel.getPlanarDeck().get(DeckSection.Planes));
if(!playerPanel.getPlanarDeck().getName().isEmpty()) {
PlanarDeckname = localizer.getMessage("lblPlanarDeck") + ": " + playerPanel.getPlanarDeck().getName();
playerPanel.setPlanarDeckName(PlanarDeckname);
}
} }
if (hasVariant(GameType.Vanguard)) { if (hasVariant(GameType.Vanguard)) {
if (playerDeck == deck) { if (playerDeck == deck) {
@@ -662,11 +722,14 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
CardPool avatarPool = new CardPool(); CardPool avatarPool = new CardPool();
avatarPool.add(playerPanel.getVanguardAvatar()); avatarPool.add(playerPanel.getVanguardAvatar());
playerDeck.putSection(DeckSection.Avatar, avatarPool); playerDeck.putSection(DeckSection.Avatar, avatarPool);
VanguardAvatar = localizer.getMessage("lblVanguard") + ": " + playerPanel.getVanguardAvatar().getName();
playerPanel.setVanguarAvatarName(VanguardAvatar);
} }
decks[playerIndex] = playerDeck; decks[playerIndex] = playerDeck;
if (playerChangeListener != null) { if (playerChangeListener != null) {
playerChangeListener.update(playerIndex, UpdateLobbyPlayerEvent.deckUpdate(playerDeck)); playerChangeListener.update(playerIndex, UpdateLobbyPlayerEvent.deckUpdate(playerDeck));
playerChangeListener.update(playerIndex, UpdateLobbyPlayerEvent.setDeckSchemePlaneVanguard(TextUtil.fastReplace(deckName," Generated Deck", ""), SchemeDeckName, PlanarDeckname, VanguardAvatar));
} }
} }
@@ -689,6 +752,11 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
} }
void setReady(final int index, final boolean ready) { void setReady(final int index, final boolean ready) {
if (lobby.isAllowNetworking()){
updateDeck(index);
fireReady(index, ready);
return;
}
if (ready) { if (ready) {
updateDeck(index); updateDeck(index);
if (decks[index] == null) { if (decks[index] == null) {
@@ -697,7 +765,6 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
return; return;
} }
} }
firePlayerChangeListener(index); firePlayerChangeListener(index);
} }
void setDevMode(final int index) { void setDevMode(final int index) {
@@ -714,7 +781,27 @@ public abstract class LobbyScreen extends LaunchScreen implements ILobbyView {
playerChangeListener.update(index, getSlot(index)); playerChangeListener.update(index, getSlot(index));
} }
} }
void fireReady(final int index, boolean ready){
playerPanels.get(index).setIsReady(ready);
if (playerChangeListener != null) {
playerChangeListener.update(index, UpdateLobbyPlayerEvent.isReadyUpdate(ready));
}
}
void updatemyTeam(int index, int team) {
if (playerChangeListener != null) {
playerChangeListener.update(index, UpdateLobbyPlayerEvent.teamUpdate(team));
}
}
void updateMyDeck(int index) {
/* updateMyDeck is called via button handler when the user set their deck on network play*/
//safety check
if(playerPanels.size() < 2)
return;
updateDeck(index);
//fireReady(index, playerPanels.get(index).isReady());
}
public void removePlayer(final int index) { public void removePlayer(final int index) {
lobby.removeSlot(index); lobby.removeSlot(index);
} }

View File

@@ -112,9 +112,12 @@ public class PlayerPanel extends FContainer {
deckChooser = new FDeckChooser(GameType.Constructed, isAi, new FEventHandler() { deckChooser = new FDeckChooser(GameType.Constructed, isAi, new FEventHandler() {
@Override @Override
public void handleEvent(FEvent e) { public void handleEvent(FEvent e) {
btnDeck.setEnabled(true); btnDeck.setEnabled(mayEdit);
btnDeck.setText(deckChooser.getSelectedDeckType().toString() + ": " + btnDeck.setText(deckChooser.getSelectedDeckType().toString() + ": " +
Lang.joinHomogenous(((DeckManager)e.getSource()).getSelectedItems(), DeckProxy.FN_GET_NAME)); Lang.joinHomogenous(((DeckManager)e.getSource()).getSelectedItems(), DeckProxy.FN_GET_NAME));
if (allowNetworking && btnDeck.isEnabled() && humanAiSwitch.isToggled()) { //if its ready but changed the deck, update it
screen.updateMyDeck(index);
}
} }
}); });
lstCommanderDecks = new FDeckChooser(GameType.Commander, isAi, new FEventHandler() { lstCommanderDecks = new FDeckChooser(GameType.Commander, isAi, new FEventHandler() {
@@ -123,6 +126,9 @@ public class PlayerPanel extends FContainer {
if( ((DeckManager)e.getSource()).getSelectedItem() != null) { if( ((DeckManager)e.getSource()).getSelectedItem() != null) {
btnCommanderDeck.setText(localizer.getMessage("lblCommanderDeck") + ": " + ((DeckManager) e.getSource()).getSelectedItem().getName()); btnCommanderDeck.setText(localizer.getMessage("lblCommanderDeck") + ": " + ((DeckManager) e.getSource()).getSelectedItem().getName());
lstCommanderDecks.saveState(); lstCommanderDecks.saveState();
if (allowNetworking && btnCommanderDeck.isEnabled() && humanAiSwitch.isToggled()) {
screen.updateMyDeck(index);
}
}else{ }else{
btnCommanderDeck.setText(localizer.getMessage("lblCommanderDeck")); btnCommanderDeck.setText(localizer.getMessage("lblCommanderDeck"));
} }
@@ -134,6 +140,9 @@ public class PlayerPanel extends FContainer {
if( ((DeckManager)e.getSource()).getSelectedItem() != null) { if( ((DeckManager)e.getSource()).getSelectedItem() != null) {
btnOathbreakDeck.setText(localizer.getMessage("lblOathbreakerDeck") + ": " + ((DeckManager) e.getSource()).getSelectedItem().getName()); btnOathbreakDeck.setText(localizer.getMessage("lblOathbreakerDeck") + ": " + ((DeckManager) e.getSource()).getSelectedItem().getName());
lstOathbreakerDecks.saveState(); lstOathbreakerDecks.saveState();
if (allowNetworking && btnOathbreakDeck.isEnabled() && humanAiSwitch.isToggled()) {
screen.updateMyDeck(index);
}
}else{ }else{
btnOathbreakDeck.setText(localizer.getMessage("lblOathbreakerDeck")); btnOathbreakDeck.setText(localizer.getMessage("lblOathbreakerDeck"));
} }
@@ -145,6 +154,9 @@ public class PlayerPanel extends FContainer {
if( ((DeckManager)e.getSource()).getSelectedItem() != null) { if( ((DeckManager)e.getSource()).getSelectedItem() != null) {
btnTinyLeadersDeck.setText(localizer.getMessage("lblTinyLeadersDeck") + ": " + ((DeckManager) e.getSource()).getSelectedItem().getName()); btnTinyLeadersDeck.setText(localizer.getMessage("lblTinyLeadersDeck") + ": " + ((DeckManager) e.getSource()).getSelectedItem().getName());
lstTinyLeadersDecks.saveState(); lstTinyLeadersDecks.saveState();
if (allowNetworking && btnTinyLeadersDeck.isEnabled() && humanAiSwitch.isToggled()) {
screen.updateMyDeck(index);
}
}else{ }else{
btnTinyLeadersDeck.setText(localizer.getMessage("lblTinyLeadersDeck")); btnTinyLeadersDeck.setText(localizer.getMessage("lblTinyLeadersDeck"));
} }
@@ -156,6 +168,9 @@ public class PlayerPanel extends FContainer {
if( ((DeckManager)e.getSource()).getSelectedItem() != null) { if( ((DeckManager)e.getSource()).getSelectedItem() != null) {
btnBrawlDeck.setText(localizer.getMessage("lblBrawlDeck") + ": " + ((DeckManager) e.getSource()).getSelectedItem().getName()); btnBrawlDeck.setText(localizer.getMessage("lblBrawlDeck") + ": " + ((DeckManager) e.getSource()).getSelectedItem().getName());
lstBrawlDecks.saveState(); lstBrawlDecks.saveState();
if (allowNetworking && btnBrawlDeck.isEnabled() && humanAiSwitch.isToggled()) {
screen.updateMyDeck(index);
}
}else{ }else{
btnBrawlDeck.setText(localizer.getMessage("lblBrawlDeck")); btnBrawlDeck.setText(localizer.getMessage("lblBrawlDeck"));
} }
@@ -166,6 +181,9 @@ public class PlayerPanel extends FContainer {
public void handleEvent(FEvent e) { public void handleEvent(FEvent e) {
if( ((DeckManager)e.getSource()).getSelectedItem() != null){ if( ((DeckManager)e.getSource()).getSelectedItem() != null){
btnSchemeDeck.setText(localizer.getMessage("lblSchemeDeck") + ": " + ((DeckManager)e.getSource()).getSelectedItem().getName()); btnSchemeDeck.setText(localizer.getMessage("lblSchemeDeck") + ": " + ((DeckManager)e.getSource()).getSelectedItem().getName());
if (allowNetworking && btnSchemeDeck.isEnabled() && humanAiSwitch.isToggled()) {
screen.updateMyDeck(index);
}
}else{ }else{
btnSchemeDeck.setText(localizer.getMessage("lblSchemeDeck")); btnSchemeDeck.setText(localizer.getMessage("lblSchemeDeck"));
} }
@@ -176,6 +194,9 @@ public class PlayerPanel extends FContainer {
public void handleEvent(FEvent e) { public void handleEvent(FEvent e) {
if( ((DeckManager)e.getSource()).getSelectedItem() != null){ if( ((DeckManager)e.getSource()).getSelectedItem() != null){
btnPlanarDeck.setText(localizer.getMessage("lblPlanarDeck") + ": " + ((DeckManager)e.getSource()).getSelectedItem().getName()); btnPlanarDeck.setText(localizer.getMessage("lblPlanarDeck") + ": " + ((DeckManager)e.getSource()).getSelectedItem().getName());
if (allowNetworking && btnPlanarDeck.isEnabled() && humanAiSwitch.isToggled()) {
screen.updateMyDeck(index);
}
}else{ }else{
btnPlanarDeck.setText(localizer.getMessage("lblPlanarDeck")); btnPlanarDeck.setText(localizer.getMessage("lblPlanarDeck"));
} }
@@ -185,6 +206,9 @@ public class PlayerPanel extends FContainer {
@Override @Override
public void handleEvent(FEvent e) { public void handleEvent(FEvent e) {
btnVanguardAvatar.setText(localizer.getMessage("lblVanguard") + ": " + ((CardManager)e.getSource()).getSelectedItem().getName()); btnVanguardAvatar.setText(localizer.getMessage("lblVanguard") + ": " + ((CardManager)e.getSource()).getSelectedItem().getName());
if (allowNetworking && btnVanguardAvatar.isEnabled() && humanAiSwitch.isToggled()) {
screen.updateMyDeck(index);
}
} }
}); });
@@ -512,7 +536,32 @@ public class PlayerPanel extends FContainer {
}; };
public void setDeckSelectorButtonText(String text) { public void setDeckSelectorButtonText(String text) {
if (btnDeck.isVisible())
btnDeck.setText(text); btnDeck.setText(text);
if (btnCommanderDeck.isVisible())
btnCommanderDeck.setText(text);
if (btnOathbreakDeck.isVisible())
btnOathbreakDeck.setText(text);
if (btnTinyLeadersDeck.isVisible())
btnTinyLeadersDeck.setText(text);
if (btnBrawlDeck.isVisible())
btnBrawlDeck.setText(text);
}
public void setVanguarAvatarName(String text) {
btnVanguardAvatar.setText(text);
}
public void setSchemeDeckName(String text) {
btnSchemeDeck.setText(text);
}
public void setPlanarDeckName(String text) {
btnPlanarDeck.setText(text);
} }
public void updateVariantControlsVisibility() { public void updateVariantControlsVisibility() {
@@ -525,6 +574,7 @@ public class PlayerPanel extends FContainer {
boolean isArchenemyApplied = false; boolean isArchenemyApplied = false;
boolean archenemyVisiblity = false; boolean archenemyVisiblity = false;
boolean isDeckBuildingAllowed = mayEdit; boolean isDeckBuildingAllowed = mayEdit;
boolean replacedbasicdeck = false;
for (GameType variant : screen.getLobby().getAppliedVariants()) { for (GameType variant : screen.getLobby().getAppliedVariants()) {
switch (variant) { switch (variant) {
@@ -540,18 +590,22 @@ public class PlayerPanel extends FContainer {
case Commander: case Commander:
isCommanderApplied = true; isCommanderApplied = true;
isDeckBuildingAllowed = false; //Commander deck replaces basic deck, so hide that isDeckBuildingAllowed = false; //Commander deck replaces basic deck, so hide that
replacedbasicdeck = true;
break; break;
case Oathbreaker: case Oathbreaker:
isOathbreakerApplied = true; isOathbreakerApplied = true;
isDeckBuildingAllowed = false; //Oathbreaker deck replaces basic deck, so hide that isDeckBuildingAllowed = false; //Oathbreaker deck replaces basic deck, so hide that
replacedbasicdeck = true;
break; break;
case TinyLeaders: case TinyLeaders:
isTinyLeadersApplied = true; isTinyLeadersApplied = true;
isDeckBuildingAllowed = false; //Tiny Leaders deck replaces basic deck, so hide that isDeckBuildingAllowed = false; //Tiny Leaders deck replaces basic deck, so hide that
replacedbasicdeck = true;
break; break;
case Brawl: case Brawl:
isBrawlApplied = true; isBrawlApplied = true;
isDeckBuildingAllowed = false; //Tiny Leaders deck replaces basic deck, so hide that isDeckBuildingAllowed = false; //Tiny Leaders deck replaces basic deck, so hide that
replacedbasicdeck = true;
break; break;
case Planechase: case Planechase:
isPlanechaseApplied = true; isPlanechaseApplied = true;
@@ -562,11 +616,71 @@ public class PlayerPanel extends FContainer {
default: default:
if (variant.isAutoGenerated()) { if (variant.isAutoGenerated()) {
isDeckBuildingAllowed = false; isDeckBuildingAllowed = false;
replacedbasicdeck = true;
} }
break; break;
} }
} }
if(allowNetworking) {
if (replacedbasicdeck) {
btnDeck.setVisible(false);
} else {
btnDeck.setVisible(true);
btnDeck.setEnabled(mayEdit);
}
if (isCommanderApplied) {
btnCommanderDeck.setVisible(true);
btnCommanderDeck.setEnabled(mayEdit);
} else {
btnCommanderDeck.setVisible(false);
}
if (isOathbreakerApplied) {
btnOathbreakDeck.setVisible(true);
btnOathbreakDeck.setEnabled(mayEdit);
} else {
btnOathbreakDeck.setVisible(false);
}
if (isTinyLeadersApplied) {
btnTinyLeadersDeck.setVisible(true);
btnTinyLeadersDeck.setEnabled(mayEdit);
} else {
btnTinyLeadersDeck.setVisible(false);
}
if (isBrawlApplied) {
btnBrawlDeck.setVisible(true);
btnBrawlDeck.setEnabled(mayEdit);
} else {
btnBrawlDeck.setVisible(false);
}
if (archenemyVisiblity) {
btnSchemeDeck.setVisible(true);
btnSchemeDeck.setEnabled(mayEdit);
} else {
btnSchemeDeck.setVisible(false);
}
if (!isArchenemyApplied) {
cbTeam.setVisible(true);
cbTeam.setEnabled(mayEdit);
cbArchenemyTeam.setVisible(false);
} else {
cbTeam.setVisible(false);
cbArchenemyTeam.setVisible(true);
cbArchenemyTeam.setEnabled(mayEdit);
}
if (isPlanechaseApplied) {
btnPlanarDeck.setVisible(true);
btnPlanarDeck.setEnabled(mayEdit);
} else {
btnPlanarDeck.setVisible(false);
}
if (isVanguardApplied) {
btnVanguardAvatar.setVisible(true);
btnVanguardAvatar.setEnabled(mayEdit);
} else {
btnVanguardAvatar.setVisible(false);
}
} else {
btnDeck.setVisible(isDeckBuildingAllowed); btnDeck.setVisible(isDeckBuildingAllowed);
btnCommanderDeck.setVisible(isCommanderApplied && mayEdit); btnCommanderDeck.setVisible(isCommanderApplied && mayEdit);
btnOathbreakDeck.setVisible(isOathbreakerApplied && mayEdit); btnOathbreakDeck.setVisible(isOathbreakerApplied && mayEdit);
@@ -581,6 +695,7 @@ public class PlayerPanel extends FContainer {
btnPlanarDeck.setVisible(isPlanechaseApplied && mayEdit); btnPlanarDeck.setVisible(isPlanechaseApplied && mayEdit);
btnVanguardAvatar.setVisible(isVanguardApplied && mayEdit); btnVanguardAvatar.setVisible(isVanguardApplied && mayEdit);
} }
}
public boolean isNetworkHost() { public boolean isNetworkHost() {
return allowNetworking && index == 0; return allowNetworking && index == 0;
@@ -626,6 +741,8 @@ public class PlayerPanel extends FContainer {
pp.toggleIsPlayerArchenemy(); pp.toggleIsPlayerArchenemy();
} }
} }
} else {
screen.updatemyTeam(index, getTeam());
} }
} }
}; };
@@ -823,6 +940,16 @@ public class PlayerPanel extends FContainer {
if (devModeSwitch != null) { if (devModeSwitch != null) {
devModeSwitch.setEnabled(mayEdit); devModeSwitch.setEnabled(mayEdit);
} }
if(allowNetworking) {
btnDeck.setEnabled(mayEdit);
btnCommanderDeck.setEnabled(mayEdit);
btnOathbreakDeck.setEnabled(mayEdit);
btnTinyLeadersDeck.setEnabled(mayEdit);
btnBrawlDeck.setEnabled(mayEdit);
btnSchemeDeck.setEnabled(mayEdit);
btnPlanarDeck.setEnabled(mayEdit);
cbArchenemyTeam.setEnabled(mayEdit);
}
updateVariantControlsVisibility(); updateVariantControlsVisibility();
//if panel has height already, ensure height updated to account for button visibility changes //if panel has height already, ensure height updated to account for button visibility changes

View File

@@ -146,6 +146,7 @@ public class MatchController extends AbstractGuiGame {
} }
} }
view = new MatchScreen(playerPanels); view = new MatchScreen(playerPanels);
view.resetFields();
if (noHumans) { if (noHumans) {
//add special object that pauses game if screen touched //add special object that pauses game if screen touched
@@ -215,6 +216,13 @@ public class MatchController extends AbstractGuiGame {
if (lbl != null) { if (lbl != null) {
lbl.setActive(true); lbl.setActive(true);
} }
if(GuiBase.isNetworkplay())
checkStack();
}
public void checkStack() {
view.getStack().checkEmptyStack();
} }
@Override @Override

View File

@@ -481,6 +481,20 @@ public class MatchScreen extends FScreen {
} }
} }
public void resetFields() {
for (VPlayerPanel playerPanel : getPlayerPanels().values()) {
for (CardAreaPanel p : playerPanel.getField().getCardPanels()){
p.resetForNewGame();
p.reset();
}
playerPanel.getZoneTab(ZoneType.Hand).getDisplayArea().clear();
playerPanel.getZoneTab(ZoneType.Library).getDisplayArea().clear();
playerPanel.getZoneTab(ZoneType.Graveyard).getDisplayArea().clear();
playerPanel.getZoneTab(ZoneType.Exile).getDisplayArea().clear();
}
}
public void updateZones(final Iterable<PlayerZoneUpdate> zonesToUpdate) { public void updateZones(final Iterable<PlayerZoneUpdate> zonesToUpdate) {
for (final PlayerZoneUpdate update : zonesToUpdate) { for (final PlayerZoneUpdate update : zonesToUpdate) {
final PlayerView owner = update.getPlayer(); final PlayerView owner = update.getPlayer();
@@ -566,6 +580,9 @@ public class MatchScreen extends FScreen {
float y; float y;
float w = getWidth(); float w = getWidth();
Color color = Color.CYAN; Color color = Color.CYAN;
GameView game = MatchController.instance.getGameView();
CombatView combat = game.getCombat();
PlayerView currentPlayer = MatchController.instance.getCurrentPlayer();
//field separator lines //field separator lines
if (!Forge.isLandscapeMode()) { if (!Forge.isLandscapeMode()) {
@@ -592,8 +609,7 @@ public class MatchScreen extends FScreen {
//Draw Priority Human Multiplayer 2 player //Draw Priority Human Multiplayer 2 player
float oldAlphaComposite = g.getfloatAlphaComposite(); float oldAlphaComposite = g.getfloatAlphaComposite();
//TODO: support up to 4 players
if ((getPlayerPanels().keySet().size() == 2) && (countHuman() == 2)){ if ((getPlayerPanels().keySet().size() == 2) && (countHuman() == 2)){
for (VPlayerPanel playerPanel: playerPanelsList){ for (VPlayerPanel playerPanel: playerPanelsList){
midField = playerPanel.getTop(); midField = playerPanel.getTop();
@@ -606,28 +622,22 @@ public class MatchScreen extends FScreen {
else else
g.setAlphaComposite(0f); g.setAlphaComposite(0f);
if(MatchController.instance.getGameView()!= null) { if(game!= null) {
if(MatchController.instance.getGameView().getPhase()!=null) if(combat!=null) {
{ //hide rectangle
if(MatchController.instance.getGameView().getPhase().isCombatPhase()){ if(playerPanel.getPlayer() == currentPlayer)
if(playerPanel.getPlayer() == MatchController.instance.getCurrentPlayer())
g.setAlphaComposite(0.8f); g.setAlphaComposite(0.8f);
else else
g.setAlphaComposite(0f); g.setAlphaComposite(0f);
} //color rectangle
} if(playerPanel.getPlayer() == game.getPlayerTurn())
color = Color.RED; //attacking player
if(MatchController.instance.getGameView().getCombat() != null) {
if(playerPanel.getPlayer() == MatchController.instance.getGameView().getPlayerTurn())
color = Color.RED;
else
color = Color.LIME;
}
else else
color = Color.LIME; //defending player
} else {
color = Color.CYAN; color = Color.CYAN;
} }
}
g.drawRect(4f, color, playerPanel.getField().getLeft(), adjustY, playerPanel.getField().getWidth(), adjustH); g.drawRect(4f, color, playerPanel.getField().getLeft(), adjustY, playerPanel.getField().getWidth(), adjustH);
g.setAlphaComposite(oldAlphaComposite); g.setAlphaComposite(oldAlphaComposite);
} }

View File

@@ -95,6 +95,15 @@ public class VStack extends FDropDown {
restorablePlayerZones = null; restorablePlayerZones = null;
} }
public void checkEmptyStack() { //sort the bug in client when desynch happens
final FCollectionView<StackItemView> stack = MatchController.instance.getGameView().getStack();
if(stack!=null)
if(isVisible() && stack.isEmpty()) { //visible stack but empty already
hide();
getMenuTab().setText(Localizer.getInstance().getMessage("lblStack") + " (" + 0 + ")");
}
}
@Override @Override
public void update() { public void update() {
activeItem = null; activeItem = null;

View File

@@ -240,6 +240,9 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override @Override
public Void visit(final GameEventSpellAbilityCast event) { public Void visit(final GameEventSpellAbilityCast event) {
needStackUpdate = true; needStackUpdate = true;
if(GuiBase.getInterface().isLibgdxPort()) {
return processEvent(); //mobile port don't have notify stack addition like the desktop
} else {
processEvent(); processEvent();
final Runnable notifyStackAddition = new Runnable() { final Runnable notifyStackAddition = new Runnable() {
@@ -249,7 +252,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
} }
}; };
GuiBase.getInterface().invokeInEdtLater(notifyStackAddition); GuiBase.getInterface().invokeInEdtLater(notifyStackAddition);
}
return null; return null;
} }
@@ -262,6 +265,9 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override @Override
public Void visit(final GameEventSpellRemovedFromStack event) { public Void visit(final GameEventSpellRemovedFromStack event) {
needStackUpdate = true; needStackUpdate = true;
if(GuiBase.getInterface().isLibgdxPort()) {
return processEvent(); //mobile port don't have notify stack addition like the desktop
} else {
processEvent(); processEvent();
final Runnable notifyStackAddition = new Runnable() { final Runnable notifyStackAddition = new Runnable() {
@@ -271,7 +277,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
} }
}; };
GuiBase.getInterface().invokeInEdtLater(notifyStackAddition); GuiBase.getInterface().invokeInEdtLater(notifyStackAddition);
}
return null; return null;
} }
@@ -357,14 +363,12 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override @Override
public Void visit(final GameEventCardChangeZone event) { public Void visit(final GameEventCardChangeZone event) {
if(event.to.getZoneType() == ZoneType.Battlefield) if(GuiBase.getInterface().isLibgdxPort()) {
refreshFieldUpdate = true; updateZone(event.from);
//pfps the change to the zones have already been performed with add and remove calls return updateZone(event.to);
// this is only for playing a sound } else {
// updateZone(event.from);
//return updateZone(event.to);
return processEvent(); return processEvent();
}
} }
@Override @Override
@@ -399,11 +403,12 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override @Override
public Void visit(final GameEventShuffle event) { public Void visit(final GameEventShuffle event) {
//pfps the change to the library has already been performed by a setCards call if (GuiBase.getInterface().isLibgdxPort()) {
// this is only for playing a sound return updateZone(event.player.getZone(ZoneType.Library));
// return updateZone(event.player.getZone(ZoneType.Library)); } else {
return processEvent(); return processEvent();
} }
}
@Override @Override
public Void visit(final GameEventManaPool event) { public Void visit(final GameEventManaPool event) {

View File

@@ -22,6 +22,10 @@ public final class LobbySlot implements Serializable {
private boolean isDevMode; private boolean isDevMode;
private Deck deck; private Deck deck;
private ImmutableSet<AIOption> aiOptions; private ImmutableSet<AIOption> aiOptions;
private String AvatarVanguard;
private String SchemeDeckName;
private String PlanarDeckName;
private String DeckName;
public LobbySlot(final LobbySlotType type, final String name, final int avatarIndex, final int sleeveIndex, final int team, final boolean isArchenemy, final boolean isReady, final Set<AIOption> aiOptions) { public LobbySlot(final LobbySlotType type, final String name, final int avatarIndex, final int sleeveIndex, final int team, final boolean isArchenemy, final boolean isReady, final Set<AIOption> aiOptions) {
this.type = type; this.type = type;
@@ -79,6 +83,22 @@ public final class LobbySlot implements Serializable {
} else if (oldDeck != null && data.getSection() != null && data.getCards() != null) { } else if (oldDeck != null && data.getSection() != null && data.getCards() != null) {
oldDeck.putSection(data.getSection(), data.getCards()); oldDeck.putSection(data.getSection(), data.getCards());
} }
if (data.getSchemeDeckName() != null) {
setSchemeDeckName(data.getSchemeDeckName());
changed = true;
}
if (data.getAvatarVanguard() != null) {
setAvatarVanguard(data.getAvatarVanguard());
changed = true;
}
if (data.getPlanarDeckName() != null) {
setPlanarDeckName(data.getPlanarDeckName());
changed = true;
}
if (data.getDeckName() != null) {
setDeckName(data.getDeckName());
changed = true;
}
return changed; return changed;
} }
@@ -116,6 +136,16 @@ public final class LobbySlot implements Serializable {
this.team = team; this.team = team;
} }
public String getSchemeDeckName() { return SchemeDeckName; }
public String getAvatarVanguard() { return AvatarVanguard; }
public String getPlanarDeckName() { return PlanarDeckName; }
public String getDeckName() { return DeckName; }
public void setSchemeDeckName(String schemeDeckName) { this.SchemeDeckName = schemeDeckName; }
public void setAvatarVanguard(String avatarVanguard) { this.AvatarVanguard = avatarVanguard; }
public void setPlanarDeckName(String planarDeckName) { this.PlanarDeckName = planarDeckName; }
public void setDeckName(String DeckName) { this.DeckName = DeckName; }
public boolean isArchenemy() { public boolean isArchenemy() {
return isArchenemy; return isArchenemy;
} }

View File

@@ -25,6 +25,10 @@ public final class UpdateLobbyPlayerEvent implements NetEvent {
private DeckSection section = null; private DeckSection section = null;
private CardPool cards = null; private CardPool cards = null;
private Set<AIOption> aiOptions = null; private Set<AIOption> aiOptions = null;
private String AvatarVanguard = null;
private String SchemeDeckName = null;
private String PlanarDeckName = null;
private String DeckName = null;
public static UpdateLobbyPlayerEvent create(final LobbySlotType type, final String name, final int avatarIndex, final int sleeveIndex, final int team, final boolean isArchenemy, final boolean isReady, final Set<AIOption> aiOptions) { public static UpdateLobbyPlayerEvent create(final LobbySlotType type, final String name, final int avatarIndex, final int sleeveIndex, final int team, final boolean isArchenemy, final boolean isReady, final Set<AIOption> aiOptions) {
@@ -53,17 +57,39 @@ public final class UpdateLobbyPlayerEvent implements NetEvent {
public static UpdateLobbyPlayerEvent sleeveUpdate(final int index) { public static UpdateLobbyPlayerEvent sleeveUpdate(final int index) {
return new UpdateLobbyPlayerEvent(index, false); return new UpdateLobbyPlayerEvent(index, false);
} }
private UpdateLobbyPlayerEvent(int index, boolean avatar) { public static UpdateLobbyPlayerEvent isReadyUpdate(final boolean isReady) {
return new UpdateLobbyPlayerEvent(isReady);
}
public static UpdateLobbyPlayerEvent teamUpdate(int team) {
return new UpdateLobbyPlayerEvent(team);
}
public static UpdateLobbyPlayerEvent setDeckSchemePlaneVanguard(final String DeckName, final String Scheme, final String Plane, final String Vanguard) {
return new UpdateLobbyPlayerEvent(DeckName, Scheme, Plane, Vanguard);
}
private UpdateLobbyPlayerEvent(final int index, final boolean avatar) {
if (avatar) if (avatar)
this.avatarIndex = index; this.avatarIndex = index;
else else
this.sleeveIndex = index; this.sleeveIndex = index;
} }
private UpdateLobbyPlayerEvent(final int team) {
this.team = team;
}
private UpdateLobbyPlayerEvent(final String DeckName, final String Scheme, final String Plane, final String Vanguard) {
this.SchemeDeckName = Scheme;
this.PlanarDeckName = Plane;
this.AvatarVanguard = Vanguard;
this.DeckName = DeckName;
}
private UpdateLobbyPlayerEvent(final Deck deck) { private UpdateLobbyPlayerEvent(final Deck deck) {
this.deck = deck; this.deck = deck;
} }
private UpdateLobbyPlayerEvent(final boolean isReady) {
this.isReady = isReady;
}
private UpdateLobbyPlayerEvent(final DeckSection section, final CardPool cards) { private UpdateLobbyPlayerEvent(final DeckSection section, final CardPool cards) {
this.section = section; this.section = section;
this.cards = cards; this.cards = cards;
@@ -149,4 +175,8 @@ public final class UpdateLobbyPlayerEvent implements NetEvent {
public Set<AIOption> getAiOptions() { public Set<AIOption> getAiOptions() {
return aiOptions == null ? null : Collections.unmodifiableSet(aiOptions); return aiOptions == null ? null : Collections.unmodifiableSet(aiOptions);
} }
public String getAvatarVanguard() { return AvatarVanguard; }
public String getSchemeDeckName() { return SchemeDeckName; }
public String getPlanarDeckName() { return PlanarDeckName; }
public String getDeckName() { return DeckName; }
} }