diff --git a/.gitattributes b/.gitattributes index 3f0b46f98db..f99a91b6f8e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -147,6 +147,7 @@ forge-core/.settings/org.eclipse.jdt.core.prefs -text forge-core/.settings/org.eclipse.m2e.core.prefs -text forge-core/pom.xml -text forge-core/src/main/java/forge/CardStorageReader.java -text +forge-core/src/main/java/forge/LobbyPlayer.java -text forge-core/src/main/java/forge/StaticData.java -text forge-core/src/main/java/forge/card/BoosterGenerator.java svneol=native#text/plain forge-core/src/main/java/forge/card/BoosterSlots.java -text @@ -515,6 +516,7 @@ forge-game/src/main/java/forge/game/phase/Untap.java -text forge-game/src/main/java/forge/game/phase/Upkeep.java svneol=native#text/plain forge-game/src/main/java/forge/game/phase/package-info.java svneol=native#text/plain forge-game/src/main/java/forge/game/player/GameLossReason.java -text +forge-game/src/main/java/forge/game/player/IGameEntitiesFactory.java -text forge-game/src/main/java/forge/game/player/LobbyPlayer.java -text forge-game/src/main/java/forge/game/player/Player.java svneol=native#text/plain forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java -text @@ -996,6 +998,7 @@ forge-gui-desktop/src/main/java/forge/view/FTitleBarBase.java -text forge-gui-desktop/src/main/java/forge/view/FView.java -text forge-gui-desktop/src/main/java/forge/view/ITitleBarOwner.java -text forge-gui-desktop/src/main/java/forge/view/Main.java -text +forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java -text forge-gui-desktop/src/main/java/forge/view/SplashFrame.java -text forge-gui-desktop/src/main/java/forge/view/arcane/CardArea.java -text forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java -text @@ -16380,22 +16383,6 @@ forge-gui/src/main/java/forge/model/MetaSet.java -text forge-gui/src/main/java/forge/model/MultipleForgeJarsFoundError.java -text forge-gui/src/main/java/forge/model/UnOpenedMeta.java -text forge-gui/src/main/java/forge/model/package-info.java svneol=native#text/plain -forge-gui/src/main/java/forge/net/FServer.java -text -forge-gui/src/main/java/forge/net/IClientSocket.java -text -forge-gui/src/main/java/forge/net/IConnectionObserver.java -text -forge-gui/src/main/java/forge/net/Lobby.java -text -forge-gui/src/main/java/forge/net/LobbyPlayerRemote.java -text -forge-gui/src/main/java/forge/net/NetServer.java -text -forge-gui/src/main/java/forge/net/client/INetClient.java -text -forge-gui/src/main/java/forge/net/client/InvalidFieldInPacketException.java -text -forge-gui/src/main/java/forge/net/client/NetClient.java -text -forge-gui/src/main/java/forge/net/client/package-info.java -text -forge-gui/src/main/java/forge/net/client/state/ConnectedClientState.java -text -forge-gui/src/main/java/forge/net/client/state/IClientState.java -text -forge-gui/src/main/java/forge/net/client/state/InLobbyClientState.java -text -forge-gui/src/main/java/forge/net/client/state/UnauthorizedClientState.java -text -forge-gui/src/main/java/forge/net/client/state/package-info.java -text -forge-gui/src/main/java/forge/net/package-info.java -text forge-gui/src/main/java/forge/player/GamePlayerUtil.java -text forge-gui/src/main/java/forge/player/HumanCostDecision.java -text forge-gui/src/main/java/forge/player/HumanPlay.java -text @@ -16497,6 +16484,22 @@ forge-net/.settings/org.eclipse.core.resources.prefs -text forge-net/.settings/org.eclipse.jdt.core.prefs -text forge-net/.settings/org.eclipse.m2e.core.prefs -text forge-net/pom.xml -text +forge-net/src/main/java/forge/net/FServer.java -text +forge-net/src/main/java/forge/net/IClientSocket.java -text +forge-net/src/main/java/forge/net/IConnectionObserver.java -text +forge-net/src/main/java/forge/net/Lobby.java -text +forge-net/src/main/java/forge/net/LobbyPlayerRemote.java -text +forge-net/src/main/java/forge/net/NetServer.java -text +forge-net/src/main/java/forge/net/client/INetClient.java -text +forge-net/src/main/java/forge/net/client/InvalidFieldInPacketException.java -text +forge-net/src/main/java/forge/net/client/NetClient.java -text +forge-net/src/main/java/forge/net/client/package-info.java -text +forge-net/src/main/java/forge/net/client/state/ConnectedClientState.java -text +forge-net/src/main/java/forge/net/client/state/IClientState.java -text +forge-net/src/main/java/forge/net/client/state/InLobbyClientState.java -text +forge-net/src/main/java/forge/net/client/state/UnauthorizedClientState.java -text +forge-net/src/main/java/forge/net/client/state/package-info.java -text +forge-net/src/main/java/forge/net/package-info.java -text forge-net/src/main/java/forge/net/protocol/ClientProtocol.java -text forge-net/src/main/java/forge/net/protocol/ClientProtocolJson.java -text forge-net/src/main/java/forge/net/protocol/package-info.java -text diff --git a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java index cd7f5a1c8f9..1e71052ed9d 100644 --- a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java +++ b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java @@ -17,7 +17,7 @@ */ package forge.ai; -import forge.game.player.LobbyPlayer; +import forge.LobbyPlayer; import forge.util.Aggregates; import forge.util.FileUtil; diff --git a/forge-ai/src/main/java/forge/ai/LobbyPlayerAi.java b/forge-ai/src/main/java/forge/ai/LobbyPlayerAi.java index 86024a5612e..182d8b961af 100644 --- a/forge-ai/src/main/java/forge/ai/LobbyPlayerAi.java +++ b/forge-ai/src/main/java/forge/ai/LobbyPlayerAi.java @@ -1,10 +1,11 @@ package forge.ai; +import forge.LobbyPlayer; import forge.game.Game; -import forge.game.player.LobbyPlayer; +import forge.game.player.IGameEntitiesFactory; import forge.game.player.Player; -public class LobbyPlayerAi extends LobbyPlayer { +public class LobbyPlayerAi extends LobbyPlayer implements IGameEntitiesFactory { public LobbyPlayerAi(String name) { super(name); } @@ -34,11 +35,6 @@ public class LobbyPlayerAi extends LobbyPlayer { this.rotateProfileEachGame = rotateProfileEachGame; } - @Override - protected PlayerType getType() { - return PlayerType.COMPUTER; - } - @Override public PlayerControllerAi createControllerFor(Player ai) { PlayerControllerAi result = new PlayerControllerAi(ai.getGame(), ai, this); diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 18957806be2..59842bddb54 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -7,6 +7,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; +import forge.LobbyPlayer; import forge.ai.ability.ChangeZoneAi; import forge.ai.ability.CharmAi; import forge.ai.ability.ProtectAi; @@ -31,7 +32,6 @@ import forge.game.mana.Mana; import forge.game.mana.ManaCostBeingPaid; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerController; diff --git a/forge-core/src/main/java/forge/LobbyPlayer.java b/forge-core/src/main/java/forge/LobbyPlayer.java new file mode 100644 index 00000000000..6cce4d739e1 --- /dev/null +++ b/forge-core/src/main/java/forge/LobbyPlayer.java @@ -0,0 +1,63 @@ +package forge; + +/** + * This means a player's part unchanged for all games. + * + * May store player's assets here. + * + */ +public abstract class LobbyPlayer { + + protected final String name; + private int avatarIndex = -1; + + + public LobbyPlayer(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + name.hashCode(); + result = prime * result + getClass().hashCode(); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + LobbyPlayer other = (LobbyPlayer) obj; + if (name == null) { + if (other.name != null) { + return false; + } + } else if (!name.equals(other.name)) { + return false; + } + return true; + } + + public int getAvatarIndex() { + return avatarIndex; + } + + public void setAvatarIndex(int avatarIndex) { + this.avatarIndex = avatarIndex; + } + + public abstract void hear(LobbyPlayer player, String message); +} diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index 641bf8d5ff4..f27e1352bbe 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -47,6 +47,7 @@ import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.phase.Untap; import forge.game.phase.Upkeep; +import forge.game.player.IGameEntitiesFactory; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.game.replacement.ReplacementHandler; @@ -110,7 +111,8 @@ public class Game { } for (RegisteredPlayer psc : players0) { - Player pl = psc.getPlayer().createIngamePlayer(this); + IGameEntitiesFactory factory = (IGameEntitiesFactory)psc.getPlayer(); + Player pl = factory.createIngamePlayer(this); players.add(pl); ingamePlayers.add(pl); diff --git a/forge-game/src/main/java/forge/game/GameLogFormatter.java b/forge-game/src/main/java/forge/game/GameLogFormatter.java index f487d69c5be..df8f6919120 100644 --- a/forge-game/src/main/java/forge/game/GameLogFormatter.java +++ b/forge-game/src/main/java/forge/game/GameLogFormatter.java @@ -1,10 +1,11 @@ package forge.game; import com.google.common.eventbus.Subscribe; + +import forge.LobbyPlayer; import forge.game.card.Card; import forge.game.event.*; import forge.game.event.GameEventCardDamaged.DamageType; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.spellability.TargetChoices; import forge.game.zone.ZoneType; diff --git a/forge-game/src/main/java/forge/game/GameOutcome.java b/forge-game/src/main/java/forge/game/GameOutcome.java index 7fb864a6fa8..d1b0c874771 100644 --- a/forge-game/src/main/java/forge/game/GameOutcome.java +++ b/forge-game/src/main/java/forge/game/GameOutcome.java @@ -17,11 +17,12 @@ */ package forge.game; -import forge.game.player.LobbyPlayer; +import forge.LobbyPlayer; import forge.game.player.Player; import forge.game.player.PlayerOutcome; import forge.game.player.PlayerStatistics; import forge.item.PaperCard; + import org.apache.commons.lang3.tuple.Pair; import java.util.*; diff --git a/forge-game/src/main/java/forge/game/Match.java b/forge-game/src/main/java/forge/game/Match.java index 45b99c78d32..b57695e7c77 100644 --- a/forge-game/src/main/java/forge/game/Match.java +++ b/forge-game/src/main/java/forge/game/Match.java @@ -1,13 +1,14 @@ package forge.game; import com.google.common.collect.*; + +import forge.LobbyPlayer; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; import forge.game.card.Card; import forge.game.event.GameEventAnteCardsSelected; import forge.game.event.GameEventGameFinished; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.game.trigger.Trigger; diff --git a/forge-game/src/main/java/forge/game/event/GameEventPlayerControl.java b/forge-game/src/main/java/forge/game/event/GameEventPlayerControl.java index 5b3ab47ff22..4840f2a3643 100644 --- a/forge-game/src/main/java/forge/game/event/GameEventPlayerControl.java +++ b/forge-game/src/main/java/forge/game/event/GameEventPlayerControl.java @@ -1,6 +1,6 @@ package forge.game.event; -import forge.game.player.LobbyPlayer; +import forge.LobbyPlayer; import forge.game.player.Player; public class GameEventPlayerControl extends GameEvent { diff --git a/forge-game/src/main/java/forge/game/player/IGameEntitiesFactory.java b/forge-game/src/main/java/forge/game/player/IGameEntitiesFactory.java new file mode 100644 index 00000000000..ae65ff2c700 --- /dev/null +++ b/forge-game/src/main/java/forge/game/player/IGameEntitiesFactory.java @@ -0,0 +1,11 @@ +package forge.game.player; + +import forge.game.Game; + + + +public interface IGameEntitiesFactory +{ + PlayerController createControllerFor(Player p); + Player createIngamePlayer(Game game); +} 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 60abbf39ea7..0abeb1a3b20 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -22,6 +22,7 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import forge.LobbyPlayer; import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.game.*; @@ -2724,7 +2725,8 @@ public class Player extends GameEntity implements Comparable { if (mindSlaveMaster != null) { LobbyPlayer oldLobbyPlayer = getLobbyPlayer(); - controller = mindSlaveMaster.getLobbyPlayer().createControllerFor(this); + IGameEntitiesFactory master = (IGameEntitiesFactory)mindSlaveMaster.getLobbyPlayer(); + controller = master.createControllerFor(this); game.fireEvent(new GameEventPlayerControl(this, oldLobbyPlayer, getLobbyPlayer())); } else { diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index 1fab58869f8..0a66df230c2 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -3,6 +3,7 @@ package forge.game.player; import com.google.common.base.Predicate; import com.google.common.collect.Multimap; +import forge.LobbyPlayer; import forge.card.ColorSet; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; 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 0d3e24e4502..32fb58a56ea 100644 --- a/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java +++ b/forge-game/src/main/java/forge/game/player/RegisteredPlayer.java @@ -1,5 +1,6 @@ package forge.game.player; +import forge.LobbyPlayer; import forge.deck.Deck; import forge.deck.DeckSection; import forge.game.GameType; diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index df8bcbb4d1e..179d5210e80 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -38,7 +38,6 @@ import forge.game.combat.Combat; import forge.game.event.GameEventTurnBegan; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.game.spellability.SpellAbility; @@ -54,7 +53,6 @@ import forge.interfaces.IButton; import forge.interfaces.IGuiBase; import forge.item.PaperCard; import forge.match.input.InputQueue; -import forge.net.FServer; import forge.screens.match.CMatchUI; import forge.screens.match.VMatchUI; import forge.screens.match.ViewWinLose; @@ -202,7 +200,7 @@ public class GuiDesktop implements IGuiBase { @Override public void updatePlayerControl() { - CMatchUI.SINGLETON_INSTANCE.initHandViews(FServer.getLobby().getGuiPlayer()); + CMatchUI.SINGLETON_INSTANCE.initHandViews(getGuiPlayer()); SLayoutIO.loadLayout(null); VMatchUI.SINGLETON_INSTANCE.populate(); for (VHand h : VMatchUI.SINGLETON_INSTANCE.getHands()) { @@ -415,4 +413,28 @@ public class GuiDesktop implements IGuiBase { public void browseToUrl(String url) throws Exception { Desktop.getDesktop().browse(new URI(url)); } + + @Override + public LobbyPlayer getGuiPlayer() { + // TODO Auto-generated method stub + return FControl.instance.getGuiPlayer(); + } + + @Override + public LobbyPlayer createAiPlayer() { + // TODO Auto-generated method stub + return FControl.instance.getAiPlayer(); + } + + @Override + public LobbyPlayer createAiPlayer(String name, int avatarIndex) { + // TODO Auto-generated method stub + return FControl.instance.getAiPlayer(name, avatarIndex); + } + + @Override + public LobbyPlayer getQuestPlayer() { + // TODO Auto-generated method stub + return getGuiPlayer(); + } } diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index 28322332e4e..db9e4421fc8 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -25,7 +25,6 @@ import com.mortennobel.imagescaling.ResampleOp; import forge.assets.FSkinProp; import forge.assets.ImageUtil; import forge.game.card.Card; -import forge.game.player.IHasIcon; import forge.item.InventoryItem; import forge.properties.ForgeConstants; import forge.toolbox.FSkin; @@ -103,11 +102,10 @@ public class ImageCache { * retrieve an icon from the cache. returns the current skin's ICO_UNKNOWN if the icon image is not found * in the cache and cannot be loaded from disk. */ - public static SkinIcon getIcon(IHasIcon ihi) { - String imageKey = ihi.getIconImageKey(); + public static SkinIcon getIcon(String imageKey) { final BufferedImage i; if (_missingIconKeys.contains(imageKey) || - null == (i = scaleImage(ihi.getIconImageKey(), -1, -1, false))) { + null == (i = scaleImage(imageKey, -1, -1, false))) { _missingIconKeys.add(imageKey); return FSkin.getIcon(FSkinProp.ICO_UNKNOWN); } diff --git a/forge-gui-desktop/src/main/java/forge/control/FControl.java b/forge-gui-desktop/src/main/java/forge/control/FControl.java index a8a228193a6..1f682086d38 100644 --- a/forge-gui-desktop/src/main/java/forge/control/FControl.java +++ b/forge-gui-desktop/src/main/java/forge/control/FControl.java @@ -18,8 +18,11 @@ package forge.control; import forge.FThreads; +import forge.GuiBase; import forge.ImageCache; +import forge.LobbyPlayer; import forge.Singletons; +import forge.ai.AiProfileUtil; import forge.ai.LobbyPlayerAi; import forge.assets.FSkinProp; import forge.control.KeyboardShortcuts.Shortcut; @@ -28,7 +31,6 @@ import forge.game.GameRules; import forge.game.GameType; import forge.game.Match; import forge.game.card.Card; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.gui.GuiDialog; @@ -39,7 +41,6 @@ import forge.player.LobbyPlayerHuman; import forge.match.input.InputQueue; import forge.menus.ForgeMenu; import forge.model.FModel; -import forge.net.FServer; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.properties.ForgeConstants; @@ -60,6 +61,9 @@ import forge.sound.SoundSystem; import forge.toolbox.FOptionPane; import forge.toolbox.FSkin; import forge.toolbox.special.PhaseIndicator; +import forge.util.GuiDisplayUtil; +import forge.util.MyRandom; +import forge.util.NameGenerator; import forge.view.FFrame; import forge.view.FView; @@ -348,13 +352,13 @@ public enum FControl implements KeyEventDispatcher { public Player getCurrentPlayer() { // try current priority Player currentPriority = game.getPhaseHandler().getPriorityPlayer(); - if (null != currentPriority && currentPriority.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (null != currentPriority && currentPriority.getLobbyPlayer() == getGuiPlayer()) { return currentPriority; } // otherwise find just any player, belonging to this lobbyplayer for (Player p : game.getPlayers()) { - if (p.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (p.getLobbyPlayer() == getGuiPlayer()) { return p; } } @@ -384,7 +388,7 @@ public enum FControl implements KeyEventDispatcher { public final void stopGame() { List pp = new ArrayList(); for (Player p : game.getPlayers()) { - if (p.getOriginalLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (p.getOriginalLobbyPlayer() == getGuiPlayer()) { pp.add(p); } } @@ -399,7 +403,7 @@ public enum FControl implements KeyEventDispatcher { } Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer(); - boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == FServer.getLobby().getGuiPlayer(); + boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == getGuiPlayer(); if (hasHuman && humanHasPriority) { game.getAction().checkGameOverCondition(); @@ -462,7 +466,7 @@ public enum FControl implements KeyEventDispatcher { this.game = game0; game.subscribeToEvents(Singletons.getControl().getSoundSystem()); - LobbyPlayer humanLobbyPlayer = FServer.getLobby().getGuiPlayer(); + LobbyPlayer humanLobbyPlayer = getGuiPlayer(); // The UI controls should use these game data as models CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer); @@ -483,7 +487,7 @@ public enum FControl implements KeyEventDispatcher { // Add playback controls to match if needed gameHasHumanPlayer = false; for (Player p : game.getPlayers()) { - if (p.getController().getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) + if (p.getController().getLobbyPlayer() == getGuiPlayer()) gameHasHumanPlayer = true; } @@ -671,5 +675,39 @@ public enum FControl implements KeyEventDispatcher { //Singletons.getView().getViewMatch().setLayoutParams(prefs.getPref(FPref.UI_LAYOUT_PARAMS)); } + + // Ai player creation, will stay here for a while + + /** Returns a random name from the supplied list. */ + public String getRandomName() { + String playerName = GuiDisplayUtil.getPlayerName(); + String aiName = NameGenerator.getRandomName("Any", "Generic", playerName); + return aiName; + } + + public final LobbyPlayer getAiPlayer() { return getAiPlayer(getRandomName()); } + public final LobbyPlayer getAiPlayer(String name) { + int avatarCount = GuiBase.getInterface().getAvatarCount(); + return getAiPlayer(name, avatarCount == 0 ? 0 : MyRandom.getRandom().nextInt(avatarCount)); + } + public final LobbyPlayer getAiPlayer(String name, int avatarIndex) { + LobbyPlayerAi player = new LobbyPlayerAi(name); + + // TODO: implement specific AI profiles for quest mode. + String lastProfileChosen = FModel.getPreferences().getPref(FPref.UI_CURRENT_AI_PROFILE); + player.setRotateProfileEachGame(lastProfileChosen.equals(AiProfileUtil.AI_PROFILE_RANDOM_DUEL)); + if(lastProfileChosen.equals(AiProfileUtil.AI_PROFILE_RANDOM_MATCH)) { + lastProfileChosen = AiProfileUtil.getRandomProfile(); + System.out.println(String.format("AI profile %s was chosen for the lobby player %s.", lastProfileChosen, player.getName())); + } + player.setAiProfile(lastProfileChosen); + player.setAvatarIndex(avatarIndex); + return player; + } + + private final LobbyPlayer guiPlayer = new LobbyPlayerHuman("Human"); + public final LobbyPlayer getGuiPlayer() { + return guiPlayer; + } } diff --git a/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java b/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java index 4ce1062cb7c..f1aa9ccbac5 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java @@ -1,8 +1,5 @@ package forge.gui; -import forge.control.ChatArea; -import forge.net.FServer; -import forge.net.Lobby; import forge.toolbox.*; import forge.toolbox.FSkin.SkinnedPanel; import net.miginfocom.swing.MigLayout; @@ -48,8 +45,7 @@ public enum FNetOverlay { if ( StringUtils.isBlank(message) ) return; - Lobby lobby = FServer.getLobby(); - lobby.speak(ChatArea.Room, lobby.getGuiPlayer(), message); + // lobby.speak(ChatArea.Room, lobby.getGuiPlayer(), message); } }; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java index 6b8399cf05e..53a3187bf75 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletContests.java @@ -1,7 +1,7 @@ package forge.screens.home.gauntlet; +import forge.GuiBase; import forge.UiCommand; -import forge.Singletons; import forge.deck.Deck; import forge.game.GameType; import forge.game.player.RegisteredPlayer; @@ -9,10 +9,8 @@ import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; +import forge.interfaces.IGuiBase; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; - import javax.swing.*; import java.awt.event.ActionEvent; @@ -104,12 +102,12 @@ public enum CSubmenuGauntletContests implements ICDoc { Deck aiDeck = gd.getDecks().get(gd.getCompleted()); List starter = new ArrayList(); - Lobby lobby = FServer.getLobby(); - starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); - starter.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); + IGuiBase fc = GuiBase.getInterface(); + starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer())); + starter.add(new RegisteredPlayer(aiDeck).setPlayer(fc.createAiPlayer())); - Singletons.getControl().startMatch(GameType.Gauntlet, starter); + fc.startMatch(GameType.Gauntlet, starter); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java index 1b37a4ab4fc..f86f46a87ba 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletLoad.java @@ -1,7 +1,7 @@ package forge.screens.home.gauntlet; +import forge.GuiBase; import forge.UiCommand; -import forge.Singletons; import forge.deck.Deck; import forge.game.GameType; import forge.game.player.RegisteredPlayer; @@ -9,10 +9,8 @@ import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; +import forge.interfaces.IGuiBase; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; - import javax.swing.*; import java.awt.event.ActionEvent; @@ -106,11 +104,11 @@ public enum CSubmenuGauntletLoad implements ICDoc { final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); List starter = new ArrayList(); - Lobby lobby = FServer.getLobby(); - starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); - starter.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); + IGuiBase fc = GuiBase.getInterface(); + starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer())); + starter.add(new RegisteredPlayer(aiDeck).setPlayer(fc.createAiPlayer())); - Singletons.getControl().startMatch(GameType.Gauntlet, starter); + fc.startMatch(GameType.Gauntlet, starter); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java index 0587f04265c..aba21a31455 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/gauntlet/CSubmenuGauntletQuick.java @@ -2,6 +2,7 @@ package forge.screens.home.gauntlet; import forge.UiCommand; import forge.Singletons; +import forge.control.FControl; import forge.deck.Deck; import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil.DeckTypes; @@ -12,9 +13,6 @@ import forge.gauntlet.GauntletIO; import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; - import javax.swing.*; import java.awt.event.ActionEvent; @@ -140,11 +138,11 @@ public enum CSubmenuGauntletQuick implements ICDoc { final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); List starter = new ArrayList(); - Lobby lobby = FServer.getLobby(); - starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); - starter.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); + FControl fc = Singletons.getControl(); + starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer())); + starter.add(new RegisteredPlayer(aiDeck).setPlayer(fc.getAiPlayer())); - Singletons.getControl().startMatch(GameType.Gauntlet, starter); + fc.startMatch(GameType.Gauntlet, starter); } /* (non-Javadoc) diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/PnlEvent.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/PnlEvent.java index 8b2f9de016c..835fcaf79bd 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/PnlEvent.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/PnlEvent.java @@ -45,7 +45,7 @@ class PnlEvent extends JPanel { public PnlEvent(final QuestEvent e0) { super(); this.event = e0; - img = ImageCache.getIcon(e0); + img = ImageCache.getIcon(e0.getIconImageKey()); // Title and description this.rad = new FRadioButton(event.getTitle() + " (" + event.getDifficulty().getTitle() + ")"); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/SSubmenuQuestUtil.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/SSubmenuQuestUtil.java index be8a2306df7..1a89dd15bb4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/SSubmenuQuestUtil.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/SSubmenuQuestUtil.java @@ -1,20 +1,20 @@ package forge.screens.home.quest; import forge.FThreads; +import forge.GuiBase; +import forge.LobbyPlayer; import forge.Singletons; import forge.card.CardEdition; +import forge.control.FControl; import forge.deck.Deck; import forge.game.GameRules; import forge.game.GameType; import forge.game.Match; -import forge.game.player.LobbyPlayer; import forge.game.player.RegisteredPlayer; import forge.gui.GuiChoose; import forge.gui.SOverlayUtils; import forge.gui.framework.FScreen; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; import forge.properties.ForgePreferences.FPref; import forge.quest.*; import forge.quest.bazaar.QuestItemType; @@ -24,6 +24,7 @@ import forge.quest.data.QuestAssets; import forge.quest.data.QuestPreferences.QPref; import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.deckeditor.controllers.CEditorQuestCardShop; +import forge.screens.match.CMatchUI; import forge.toolbox.FOptionPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedLabel; @@ -441,11 +442,10 @@ public class SSubmenuQuestUtil { } List starter = new ArrayList(); - Lobby lobby = FServer.getLobby(); - starter.add(humanStart.setPlayer(lobby.getQuestPlayer())); + starter.add(humanStart.setPlayer(GuiBase.getInterface().getQuestPlayer())); - LobbyPlayer aiPlayer = FServer.getLobby().getAiPlayer(event.getOpponent() == null ? event.getTitle() : event.getOpponent()); - aiPlayer.setIconImageKey(event.getIconImageKey()); + LobbyPlayer aiPlayer = FControl.instance.getAiPlayer(event.getOpponent() == null ? event.getTitle() : event.getOpponent()); + CMatchUI.SINGLETON_INSTANCE.avatarImages.put(aiPlayer, event.getIconImageKey()); starter.add(aiStart.setPlayer(aiPlayer)); boolean useRandomFoil = FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java index be0526f2592..e9a89812295 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuConstructed.java @@ -1,5 +1,7 @@ package forge.screens.home.sanctioned; +import forge.GuiBase; +import forge.LobbyPlayer; import forge.UiCommand; import forge.Singletons; import forge.deck.CardPool; @@ -8,17 +10,15 @@ import forge.deck.DeckSection; import forge.deck.DeckType; import forge.deck.DeckgenUtil; import forge.game.GameType; -import forge.game.player.LobbyPlayer; import forge.game.player.RegisteredPlayer; import forge.gui.GuiDialog; import forge.gui.framework.ICDoc; +import forge.interfaces.IGuiBase; import forge.item.PaperCard; import forge.menus.IMenuProvider; import forge.menus.MenuUtil; import forge.model.CardCollections; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.toolbox.FList; @@ -208,12 +208,13 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider { } } - Lobby lobby = FServer.getLobby(); + IGuiBase fc = GuiBase.getInterface(); List players = new ArrayList(); for (final int i : view.getParticipants()) { String name = view.getPlayerName(i); - LobbyPlayer lobbyPlayer = view.isPlayerAI(i) ? lobby.getAiPlayer(name, - view.getPlayerAvatar(i)) : lobby.getGuiPlayer(); + LobbyPlayer lobbyPlayer = view.isPlayerAI(i) + ? fc.createAiPlayer(name, view.getPlayerAvatar(i)) + : fc.getGuiPlayer(); RegisteredPlayer rp = view.getDeckChooser(i).getPlayer(); if (variantTypes.isEmpty()) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java index 33f1bdb35b0..794ffa2156b 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/CSubmenuDraft.java @@ -1,5 +1,6 @@ package forge.screens.home.sanctioned; +import forge.GuiBase; import forge.UiCommand; import forge.Singletons; import forge.deck.Deck; @@ -15,8 +16,6 @@ import forge.itemmanager.ItemManagerConfig; import forge.limited.BoosterDraft; import forge.limited.LimitedPoolType; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; import forge.properties.ForgePreferences.FPref; import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.deckeditor.controllers.CEditorDraftingProcess; @@ -138,11 +137,10 @@ public enum CSubmenuDraft implements ICDoc { } List starter = new ArrayList(); - Lobby lobby = FServer.getLobby(); - starter.add(new RegisteredPlayer(humanDeck.getDeck()).setPlayer(lobby.getGuiPlayer())); - starter.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); + starter.add(new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GuiBase.getInterface().getGuiPlayer())); + starter.add(new RegisteredPlayer(aiDeck).setPlayer(GuiBase.getInterface().createAiPlayer())); - Singletons.getControl().startMatch(GameType.Draft, starter); + GuiBase.getInterface().startMatch(GameType.Draft, starter); } /** */ diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java index e0a4ffc4fe3..6469802d6cc 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java @@ -9,7 +9,6 @@ import forge.deck.DeckSection; import forge.deck.DeckType; import forge.game.GameType; import forge.game.card.Card; -import forge.game.player.LobbyPlayer.PlayerType; import forge.gui.CardDetailPanel; import forge.deck.DeckProxy; import forge.deckchooser.DecksComboBoxEvent; @@ -442,7 +441,7 @@ public enum VSubmenuConstructed implements IVSubmenu { public FCheckBox getCbArtifacts() { return cbArtifacts; } public boolean isPlayerAI(int playernum) { - return playerPanels.get(playernum).getPlayerType() == PlayerType.COMPUTER; + return playerPanels.get(playernum).isAi(); } public int getNumPlayers() { @@ -685,8 +684,8 @@ public enum VSubmenuConstructed implements IVSubmenu { } } - public PlayerType getPlayerType() { - return radioAi.isSelected() ? PlayerType.COMPUTER : PlayerType.HUMAN; + public Boolean isAi() { + return radioAi.isSelected(); } public void setVanguardButtonText(String text) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 5b405162278..a5a31c1b8b8 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -21,6 +21,8 @@ import com.google.common.collect.Lists; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; +import forge.GuiBase; +import forge.LobbyPlayer; import forge.UiCommand; import forge.FThreads; import forge.ImageCache; @@ -34,7 +36,6 @@ import forge.game.GameEntity; import forge.game.card.Card; import forge.game.combat.Combat; import forge.game.phase.PhaseType; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.zone.Zone; import forge.game.zone.ZoneType; @@ -42,7 +43,6 @@ import forge.gui.framework.*; import forge.item.InventoryItem; import forge.menus.IMenuProvider; import forge.model.FModel; -import forge.net.FServer; import forge.properties.ForgePreferences.FPref; import forge.screens.match.controllers.*; import forge.screens.match.menus.CMatchUIMenus; @@ -78,6 +78,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider { private EventBus uiEvents; private IVDoc selectedDocBeforeCombat; private MatchUiEventVisitor visitor = new MatchUiEventVisitor(); + public final Map avatarImages = new HashMap(); private CMatchUI() { uiEvents = new EventBus("ui events"); @@ -87,8 +88,9 @@ public enum CMatchUI implements ICDoc, IMenuProvider { private SkinImage getPlayerAvatar(final Player p, final int defaultIndex) { LobbyPlayer lp = p.getLobbyPlayer(); - if (lp.getIconImageKey() != null) { - return ImageCache.getIcon(lp); + + if (avatarImages.containsKey(lp)) { + return ImageCache.getIcon(avatarImages.get(lp)); } int avatarIdx = lp.getAvatarIndex(); @@ -467,7 +469,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider { public void undo() { Game game = Singletons.getControl().getObservedGame(); Player player = game.getPhaseHandler().getPriorityPlayer(); - if (player != null && player.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (player != null && player.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer()) { game.stack.undo(); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java index f8519555a8c..3b2699366b1 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java @@ -19,19 +19,19 @@ package forge.screens.match; import com.google.common.collect.Lists; +import forge.GuiBase; +import forge.LobbyPlayer; import forge.Singletons; import forge.assets.FSkinProp; +import forge.control.FControl; import forge.deck.Deck; import forge.game.Game; import forge.game.GameType; import forge.game.Match; -import forge.game.player.LobbyPlayer; import forge.game.player.RegisteredPlayer; import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; @@ -88,7 +88,7 @@ public class GauntletWinLose extends ControlWinLose { // the player can restart Forge to replay a match. // Pretty sure this can't be fixed until in-game states can be // saved. Doublestrike 07-10-12 - LobbyPlayer questPlayer = FServer.getLobby().getQuestPlayer(); + LobbyPlayer questPlayer = GuiBase.getInterface().getQuestPlayer(); // In all cases, update stats. lstEventRecords.set(gd.getCompleted(), match.getGamesWonBy(questPlayer) + " - " @@ -202,14 +202,14 @@ public class GauntletWinLose extends ControlWinLose { GauntletData gd = FModel.getGauntletData(); Deck aiDeck = gd.getDecks().get(gd.getCompleted()); List players = Lists.newArrayList(); - Lobby lobby = FServer.getLobby(); - players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); - players.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); + FControl fc = Singletons.getControl(); + players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer())); + players.add(new RegisteredPlayer(aiDeck).setPlayer(fc.getAiPlayer())); saveOptions(); - Singletons.getControl().endCurrentGame(); + fc.endCurrentGame(); - Singletons.getControl().startMatch(GameType.Gauntlet, players); + fc.startMatch(GameType.Gauntlet, players); } else { super.actionOnContinue(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java index cad536df979..94f94d0a1aa 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java @@ -17,11 +17,12 @@ package forge.screens.match; * along with this program. If not, see . */ +import forge.GuiBase; +import forge.LobbyPlayer; import forge.game.Game; import forge.gui.SOverlayUtils; import forge.limited.GauntletMini; import forge.model.FModel; -import forge.net.FServer; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedLabel; @@ -46,6 +47,7 @@ public class LimitedWinLose extends ControlWinLose { private SkinnedLabel lblTemp1; private SkinnedLabel lblTemp2; + private LobbyPlayer guiPlayer; /** * Instantiates a new limited mode win/lose handler. @@ -57,7 +59,8 @@ public class LimitedWinLose extends ControlWinLose { super(view0, lastGame); this.view = view0; gauntlet = FModel.getGauntletMini(); - this.wonMatch = lastGame.getMatch().isWonBy(FServer.getLobby().getGuiPlayer()); + guiPlayer = GuiBase.getInterface().getGuiPlayer(); + this.wonMatch = lastGame.getMatch().isWonBy(guiPlayer); } @@ -78,7 +81,7 @@ public class LimitedWinLose extends ControlWinLose { resetView(); nextRound = false; - if (lastGame.getOutcome().isWinner(FServer.getLobby().getGuiPlayer())) { + if (lastGame.getOutcome().isWinner(guiPlayer)) { gauntlet.addWin(); } else { gauntlet.addLoss(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java index 7bfb6e979a3..468195b305c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java @@ -16,6 +16,8 @@ */ package forge.screens.match; +import forge.GuiBase; +import forge.LobbyPlayer; import forge.Singletons; import forge.assets.FSkinProp; import forge.card.CardEdition; @@ -31,7 +33,6 @@ import forge.gui.SOverlayUtils; import forge.gui.framework.FScreen; import forge.item.*; import forge.model.FModel; -import forge.net.FServer; import forge.properties.ForgePreferences.FPref; import forge.quest.*; import forge.quest.bazaar.QuestItemType; @@ -92,7 +93,7 @@ public class QuestWinLose extends ControlWinLose { this.view = view0; qData = FModel.getQuest(); qEvent = qData.getCurrentEvent(); - this.wonMatch = lastGame.getMatch().isWonBy(FServer.getLobby().getQuestPlayer()); + this.wonMatch = lastGame.getMatch().isWonBy(GuiBase.getInterface().getQuestPlayer()); this.isAnte = FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE); } @@ -117,7 +118,7 @@ public class QuestWinLose extends ControlWinLose { qc.getCards().getShopList(); } - final LobbyPlayer questLobbyPlayer = FServer.getLobby().getQuestPlayer(); + final LobbyPlayer questLobbyPlayer = GuiBase.getInterface().getQuestPlayer(); Player questPlayer = null; for (Player p : lastGame.getRegisteredPlayers()) { if (p.getLobbyPlayer().equals(questLobbyPlayer)) { @@ -321,7 +322,7 @@ public class QuestWinLose extends ControlWinLose { boolean hasNeverLost = true; int lifeDifferenceCredits = 0; - LobbyPlayer localHuman = FServer.getLobby().getQuestPlayer(); + LobbyPlayer localHuman = GuiBase.getInterface().getQuestPlayer(); for (final GameOutcome game : lastGame.getMatch().getPlayedGames()) { if (!game.isWinner(localHuman)) { hasNeverLost = false; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java index 017ca84181b..7a78f4000f6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java @@ -194,7 +194,7 @@ public class VAssignDamage { fakeCard.setName(this.defender.getName()); fakeCard.setOwner((Player)defender); Player p = (Player)defender; - fakeCard.setImageKey(p.getLobbyPlayer().getIconImageKey()); + fakeCard.setImageKey(CMatchUI.SINGLETON_INSTANCE.avatarImages.get(p.getOriginalLobbyPlayer())); } else { fakeCard = new Card(-2); fakeCard.setName(this.defender.getName()); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java index 5e24a983e50..b198b8103e6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java @@ -1,11 +1,11 @@ package forge.screens.match.controllers; +import forge.GuiBase; import forge.UiCommand; import forge.Singletons; import forge.game.player.Player; import forge.gui.framework.ICDoc; import forge.model.FModel; -import forge.net.FServer; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.match.views.VDev; @@ -46,7 +46,7 @@ public enum CDev implements ICDoc { FModel.getPreferences().setPref(FPref.DEV_UNLIMITED_LAND, String.valueOf(newValue)); for(Player p : Singletons.getControl().getObservedGame().getPlayers()) { - if( p.getLobbyPlayer() == FServer.getLobby().getGuiPlayer() ) + if( p.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer() ) p.canCheatPlayUnlimitedLands = newValue; } // probably will need to call a synchronized method to have the game thread see changed value of the variable diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java index 09c95e6a958..7738cd58d38 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java @@ -17,6 +17,7 @@ */ package forge.screens.match.controllers; +import forge.LobbyPlayer; import forge.UiCommand; import forge.FThreads; import forge.Singletons; @@ -30,7 +31,6 @@ import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.SOverlayUtils; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java index 5a577fd88de..98252c1b3db 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java @@ -19,10 +19,10 @@ package forge.screens.match.controllers; import com.google.common.base.Function; +import forge.LobbyPlayer; import forge.UiCommand; import forge.Singletons; import forge.game.card.Card; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.framework.ICDoc; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CStack.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CStack.java index daadcffc915..39edc11cb23 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CStack.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CStack.java @@ -1,7 +1,7 @@ package forge.screens.match.controllers; +import forge.LobbyPlayer; import forge.UiCommand; -import forge.game.player.LobbyPlayer; import forge.game.zone.MagicStack; import forge.gui.framework.EDocID; import forge.gui.framework.ICDoc; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java index 1457154eff2..b3f969fffd6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java @@ -17,7 +17,7 @@ */ package forge.screens.match.views; -import forge.game.player.LobbyPlayer; +import forge.LobbyPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.framework.DragCell; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java index d85ff170c2a..eaa18855993 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java @@ -20,8 +20,8 @@ package forge.screens.match.views; import forge.ImageCache; import forge.card.CardDetailUtil; import forge.card.CardDetailUtil.DetailColors; +import forge.LobbyPlayer; import forge.game.card.Card; -import forge.game.player.LobbyPlayer; import forge.game.player.PlayerController; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.zone.MagicStack; diff --git a/forge-gui-desktop/src/main/java/forge/view/Main.java b/forge-gui-desktop/src/main/java/forge/view/Main.java index 0469278f631..ca19b442df5 100644 --- a/forge-gui-desktop/src/main/java/forge/view/Main.java +++ b/forge-gui-desktop/src/main/java/forge/view/Main.java @@ -22,7 +22,6 @@ import forge.GuiDesktop; import forge.Singletons; import forge.card.CardReaderExperiments; import forge.model.FModel; -import forge.net.FServer; /** * Main class for Forge's swing application view. @@ -55,7 +54,7 @@ public final class Main { switch(mode) { case "sim": - FServer.simulateMatches(args); + SimulateMatch.simulate(args); break; case "parse": diff --git a/forge-gui/src/main/java/forge/net/FServer.java b/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java similarity index 65% rename from forge-gui/src/main/java/forge/net/FServer.java rename to forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java index 707cf6e2334..df75eb573f4 100644 --- a/forge-gui/src/main/java/forge/net/FServer.java +++ b/forge-gui-desktop/src/main/java/forge/view/SimulateMatch.java @@ -1,124 +1,86 @@ -package forge.net; - -import com.google.common.base.Supplier; - -import forge.deck.Deck; -import forge.deck.io.DeckSerializer; -import forge.game.*; -import forge.game.player.LobbyPlayer; -import forge.game.player.RegisteredPlayer; -import forge.model.FModel; -import forge.player.LobbyPlayerHuman; -import forge.util.Lang; - -import org.apache.commons.lang3.time.StopWatch; - -import java.io.File; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - - -public class FServer { - private FServer() { - - } - - private static boolean interactiveMode = true; - private static Lobby lobby = null; - - public static Lobby getLobby() { - if (lobby == null) { - //not a very good solution still - lobby = new Lobby(new Supplier() { - @Override - public LobbyPlayer get() { - // TODO Auto-generated method stub - return new LobbyPlayerHuman("Human"); - } - }); - } - return lobby; - } - - /** - * TODO: Write javadoc for this method. - * @return - */ - private static final NetServer server = new NetServer(); - public static NetServer getServer() { - // TODO Auto-generated method stub - return server; - } - - public static void simulateMatches(String[] args) { - FModel.initialize(null); - - interactiveMode = false; - System.out.println("Simulation mode"); - if(args.length < 3 ) { - System.out.println("Syntax: forge.exe sim [N]"); - System.out.println("\tsim - stands for simulation mode"); - System.out.println("\tdeck1 (or deck2) - constructed deck name or filename (has to be quoted when contains multiple words)"); - System.out.println("\tdeck is treated as file if it ends with a dot followed by three numbers or letters"); - System.out.println("\tN - number of games, defaults to 1"); - return; - } - Deck d1 = deckFromCommandLineParameter(args[1]); - Deck d2 = deckFromCommandLineParameter(args[2]); - if(d1 == null || d2 == null) { - System.out.println("One of decks could not be loaded, match cannot start"); - return; - } - - int nGames = args.length >= 4 ? Integer.parseInt(args[3]) : 1; - - System.out.println(String.format("Ai-%s vs Ai_%s - %s", d1.getName(), d2.getName(), Lang.nounWithNumeral(nGames, "game"))); - - List pp = new ArrayList(); - pp.add(new RegisteredPlayer(d1).setPlayer(getLobby().getAiPlayer("Ai-" + d1.getName()))); - pp.add(new RegisteredPlayer(d2).setPlayer(getLobby().getAiPlayer("Ai_" + d2.getName()))); - GameRules rules = new GameRules(GameType.Constructed); - Match mc = new Match(rules, pp); - for(int iGame = 0; iGame < nGames; iGame++) - simulateSingleMatch(mc, iGame); - System.out.flush(); - } - /** - * TODO: Write javadoc for this method. - * @param sw - * @param pp - */ - private static void simulateSingleMatch(Match mc, int iGame) { - StopWatch sw = new StopWatch(); - sw.start(); - - Game g1 = mc.createGame(); - // will run match in the same thread - mc.startGame(g1); - sw.stop(); - - List log = g1.getGameLog().getLogEntries(null); - Collections.reverse(log); - - for(GameLogEntry l : log) - System.out.println(l); - - System.out.println(String.format("\nGame %d ended in %d ms. %s has won!\n", 1+iGame, sw.getTime(), g1.getOutcome().getWinningLobbyPlayer().getName())); - } - - - private static Deck deckFromCommandLineParameter(String deckname) { - int dotpos = deckname.lastIndexOf('.'); - if(dotpos > 0 && dotpos == deckname.length()-4) - return DeckSerializer.fromFile(new File(deckname)); - return FModel.getDecks().getConstructed().get(deckname); - } - /** - * TODO: Write javadoc for this method. - * @return - */ - public static boolean isInteractiveMode() { - return interactiveMode; - } -} +package forge.view; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.lang3.time.StopWatch; + +import forge.GuiBase; +import forge.deck.Deck; +import forge.deck.io.DeckSerializer; +import forge.game.Game; +import forge.game.GameLogEntry; +import forge.game.GameRules; +import forge.game.GameType; +import forge.game.Match; +import forge.game.player.RegisteredPlayer; +import forge.model.FModel; +import forge.util.Lang; + +public class SimulateMatch { + public static void simulate(String[] args) { + FModel.initialize(null); + + System.out.println("Simulation mode"); + if(args.length < 3 ) { + System.out.println("Syntax: forge.exe sim [N]"); + System.out.println("\tsim - stands for simulation mode"); + System.out.println("\tdeck1 (or deck2) - constructed deck name or filename (has to be quoted when contains multiple words)"); + System.out.println("\tdeck is treated as file if it ends with a dot followed by three numbers or letters"); + System.out.println("\tN - number of games, defaults to 1"); + return; + } + Deck d1 = deckFromCommandLineParameter(args[1]); + Deck d2 = deckFromCommandLineParameter(args[2]); + if(d1 == null || d2 == null) { + System.out.println("One of decks could not be loaded, match cannot start"); + return; + } + + int nGames = args.length >= 4 ? Integer.parseInt(args[3]) : 1; + + System.out.println(String.format("Ai-%s vs Ai_%s - %s", d1.getName(), d2.getName(), Lang.nounWithNumeral(nGames, "game"))); + + List pp = new ArrayList(); + pp.add(new RegisteredPlayer(d1).setPlayer(GuiBase.getInterface().createAiPlayer("Ai-" + d1.getName(), 0))); + pp.add(new RegisteredPlayer(d2).setPlayer(GuiBase.getInterface().createAiPlayer("Ai_" + d2.getName(), 1))); + GameRules rules = new GameRules(GameType.Constructed); + Match mc = new Match(rules, pp); + for(int iGame = 0; iGame < nGames; iGame++) + simulateSingleMatch(mc, iGame); + System.out.flush(); + } + /** + * TODO: Write javadoc for this method. + * @param sw + * @param pp + */ + private static void simulateSingleMatch(Match mc, int iGame) { + StopWatch sw = new StopWatch(); + sw.start(); + + Game g1 = mc.createGame(); + // will run match in the same thread + mc.startGame(g1); + sw.stop(); + + List log = g1.getGameLog().getLogEntries(null); + Collections.reverse(log); + + for(GameLogEntry l : log) + System.out.println(l); + + System.out.println(String.format("\nGame %d ended in %d ms. %s has won!\n", 1+iGame, sw.getTime(), g1.getOutcome().getWinningLobbyPlayer().getName())); + } + + + private static Deck deckFromCommandLineParameter(String deckname) { + int dotpos = deckname.lastIndexOf('.'); + if(dotpos > 0 && dotpos == deckname.length()-4) + return DeckSerializer.fromFile(new File(deckname)); + return FModel.getDecks().getConstructed().get(deckname); + } + +} diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java index 1c9099896c7..e65d0aa47c2 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/LobbyPlayerForTests.java @@ -1,10 +1,12 @@ package forge.gamesimulationtests.util; +import forge.LobbyPlayer; import forge.game.Game; -import forge.game.player.LobbyPlayer; +import forge.game.player.IGameEntitiesFactory; import forge.game.player.Player; import forge.game.player.PlayerController; import forge.gamesimulationtests.util.playeractions.PlayerActions; + import org.apache.commons.lang3.StringUtils; import java.util.HashMap; @@ -14,7 +16,7 @@ import java.util.Map; * Default harmless implementation for tests. * Test-specific behaviour can easily be added by mocking (parts of) this class. */ -public class LobbyPlayerForTests extends LobbyPlayer { +public class LobbyPlayerForTests extends LobbyPlayer implements IGameEntitiesFactory { private final Map playerControllers; private final PlayerActions playerActions; @@ -24,12 +26,6 @@ public class LobbyPlayerForTests extends LobbyPlayer { this.playerActions = playerActions; } - @Override - protected PlayerType getType() { - //Don't really want to use COMPUTER here, as that might cause to much automatic behaviour by AI code embedded in the current rules code - //Trying HUMAN for now, which might cause issues if it triggers GUI from the rules code. If that happens, we'll need to refactor or use something else - return PlayerType.HUMAN; - } @Override public Player createIngamePlayer( Game gameState ) { diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index 74c1164f358..05da108b20b 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -4,6 +4,7 @@ import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Multimap; +import forge.LobbyPlayer; import forge.ai.ComputerUtil; import forge.ai.ComputerUtilMana; import forge.ai.SpellAbilityAi; @@ -31,7 +32,6 @@ import forge.game.cost.CostPart; import forge.game.cost.CostPartMana; import forge.game.mana.Mana; import forge.game.mana.ManaCostBeingPaid; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerController; diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index 0bd516b4fca..5603ab11d63 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -28,7 +28,6 @@ import forge.game.combat.Combat; import forge.game.event.GameEventTurnBegan; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.game.spellability.SpellAbility; @@ -215,6 +214,8 @@ public class GuiMobile implements IGuiBase { public void startMatch(GameType gameType, List players) { FControl.startMatch(gameType, players); } + + @Override public void setPanelSelection(Card c) { @@ -341,4 +342,27 @@ public class GuiMobile implements IGuiBase { public void browseToUrl(String url) throws Exception { Gdx.net.openURI(url); } + @Override + public LobbyPlayer getGuiPlayer() { + // TODO Auto-generated method stub + return FControl.getGuiPlayer(); + } + + @Override + public LobbyPlayer createAiPlayer() { + // TODO Auto-generated method stub + return FControl.getAiPlayer(); + } + + @Override + public LobbyPlayer createAiPlayer(String name, int avatarIndex) { + // TODO Auto-generated method stub + return FControl.getAiPlayer(name, avatarIndex); + } + + @Override + public LobbyPlayer getQuestPlayer() { + // TODO Auto-generated method stub + return getGuiPlayer(); + } } diff --git a/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java b/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java index 5dfdd3c9853..aa9195750ab 100644 --- a/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java +++ b/forge-gui-mobile/src/forge/screens/constructed/ConstructedScreen.java @@ -7,6 +7,8 @@ import org.apache.commons.lang3.StringUtils; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import forge.Forge; +import forge.GuiBase; +import forge.LobbyPlayer; import forge.Forge.Graphics; import forge.assets.FSkin; import forge.assets.FSkinColor; @@ -22,13 +24,10 @@ import forge.deck.DeckType; import forge.deck.DeckgenUtil; import forge.deck.FDeckChooser; import forge.game.GameType; -import forge.game.player.LobbyPlayer; import forge.game.player.RegisteredPlayer; import forge.item.PaperCard; import forge.model.CardCollections; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.FScreen; @@ -261,12 +260,11 @@ public class ConstructedScreen extends LaunchScreen { } } - Lobby lobby = FServer.getLobby(); for (int i = 0; i < getNumPlayers(); i++) { PlayerPanel playerPanel = playerPanels.get(i); String name = getPlayerName(i); - LobbyPlayer lobbyPlayer = playerPanel.isPlayerAI() ? lobby.getAiPlayer(name, - getPlayerAvatar(i)) : lobby.getGuiPlayer(); + LobbyPlayer lobbyPlayer = playerPanel.isPlayerAI() ? GuiBase.getInterface().createAiPlayer(name, + getPlayerAvatar(i)) : GuiBase.getInterface().getGuiPlayer(); RegisteredPlayer rp = playerPanel.deckChooser.getPlayer(); if (appliedVariants.isEmpty()) { diff --git a/forge-gui-mobile/src/forge/screens/match/FControl.java b/forge-gui-mobile/src/forge/screens/match/FControl.java index 3d042079b0d..992c83353fd 100644 --- a/forge-gui-mobile/src/forge/screens/match/FControl.java +++ b/forge-gui-mobile/src/forge/screens/match/FControl.java @@ -21,6 +21,10 @@ import com.google.common.eventbus.Subscribe; import forge.FThreads; import forge.Forge; +import forge.GuiBase; +import forge.LobbyPlayer; +import forge.ai.AiProfileUtil; +import forge.ai.LobbyPlayerAi; import forge.card.CardCharacteristicName; import forge.control.FControlGameEventHandler; import forge.control.FControlGamePlayback; @@ -41,7 +45,6 @@ import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.game.trigger.TriggerType; @@ -50,7 +53,7 @@ import forge.game.zone.ZoneType; import forge.match.input.InputProxy; import forge.match.input.InputQueue; import forge.model.FModel; -import forge.net.FServer; +import forge.player.LobbyPlayerHuman; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.match.views.VAssignDamage; @@ -61,6 +64,9 @@ import forge.screens.match.views.VPlayerPanel; import forge.toolbox.FCardPanel; import forge.toolbox.FOptionPane; import forge.util.Callback; +import forge.util.GuiDisplayUtil; +import forge.util.MyRandom; +import forge.util.NameGenerator; public class FControl { private FControl() { } //don't allow creating instance @@ -136,7 +142,7 @@ public class FControl { // Add playback controls to match if needed gameHasHumanPlayer = false; for (Player p : game.getPlayers()) { - if (p.getController().getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (p.getController().getLobbyPlayer() == getGuiPlayer()) { gameHasHumanPlayer = true; } } @@ -281,13 +287,13 @@ public class FControl { public static Player getCurrentPlayer() { // try current priority Player currentPriority = game.getPhaseHandler().getPriorityPlayer(); - if (null != currentPriority && currentPriority.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (null != currentPriority && currentPriority.getLobbyPlayer() == getGuiPlayer()) { return currentPriority; } // otherwise find just any player, belonging to this lobbyplayer for (Player p : game.getPlayers()) { - if (p.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (p.getLobbyPlayer() == getGuiPlayer()) { return p; } } @@ -434,7 +440,7 @@ public class FControl { public static void undoLastAction() { Game game = getGame(); Player player = game.getPhaseHandler().getPriorityPlayer(); - if (player != null && player.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (player != null && player.getLobbyPlayer() == getGuiPlayer()) { game.stack.undo(); } } @@ -457,7 +463,7 @@ public class FControl { public static void stopGame() { List pp = new ArrayList(); for (Player p : game.getPlayers()) { - if (p.getOriginalLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (p.getOriginalLobbyPlayer() == getGuiPlayer()) { pp.add(p); } } @@ -472,7 +478,7 @@ public class FControl { } Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer(); - boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == FServer.getLobby().getGuiPlayer(); + boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == getGuiPlayer(); if (hasHuman && humanHasPriority) { game.getAction().checkGameOverCondition(); @@ -760,4 +766,37 @@ public class FControl { fvHuman.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT)); fvHuman.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP)); } + + /** Returns a random name from the supplied list. */ + public static String getRandomName() { + String playerName = GuiDisplayUtil.getPlayerName(); + String aiName = NameGenerator.getRandomName("Any", "Generic", playerName); + return aiName; + } + + public final static LobbyPlayer getAiPlayer() { return getAiPlayer(getRandomName()); } + public final static LobbyPlayer getAiPlayer(String name) { + int avatarCount = GuiBase.getInterface().getAvatarCount(); + return getAiPlayer(name, avatarCount == 0 ? 0 : MyRandom.getRandom().nextInt(avatarCount)); + } + public final static LobbyPlayer getAiPlayer(String name, int avatarIndex) { + LobbyPlayerAi player = new LobbyPlayerAi(name); + + // TODO: implement specific AI profiles for quest mode. + String lastProfileChosen = FModel.getPreferences().getPref(FPref.UI_CURRENT_AI_PROFILE); + player.setRotateProfileEachGame(lastProfileChosen.equals(AiProfileUtil.AI_PROFILE_RANDOM_DUEL)); + if(lastProfileChosen.equals(AiProfileUtil.AI_PROFILE_RANDOM_MATCH)) { + lastProfileChosen = AiProfileUtil.getRandomProfile(); + System.out.println(String.format("AI profile %s was chosen for the lobby player %s.", lastProfileChosen, player.getName())); + } + player.setAiProfile(lastProfileChosen); + player.setAvatarIndex(avatarIndex); + return player; + } + + private final static LobbyPlayer guiPlayer = new LobbyPlayerHuman("Human"); + public final static LobbyPlayer getGuiPlayer() { + return guiPlayer; + } + } diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 10bb918fdf5..22900d6f943 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import forge.LobbyPlayer; import forge.menu.FMenuBar; import forge.screens.FScreen; import forge.screens.match.views.VAvatar; @@ -20,7 +21,6 @@ import forge.assets.FSkinColor; import forge.assets.FSkinTexture; import forge.assets.FSkinColor.Colors; import forge.game.Game; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.toolbox.FEvent; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java index fdbba127986..002e4d65273 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java @@ -1,10 +1,10 @@ package forge.screens.match.views; +import forge.GuiBase; import forge.game.player.Player; import forge.menu.FDropDownMenu; import forge.menu.FMenuItem; import forge.model.FModel; -import forge.net.FServer; import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.match.FControl; @@ -90,7 +90,7 @@ public class VDevMenu extends FDropDownMenu { boolean unlimitedLands = !prefs.getPrefBoolean(FPref.DEV_UNLIMITED_LAND); for (Player p : FControl.getGame().getPlayers()) { - if (p.getLobbyPlayer() == FServer.getLobby().getGuiPlayer() ) { + if (p.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer() ) { p.canCheatPlayUnlimitedLands = unlimitedLands; } } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java index a6d71619fe6..f50ad18e3a0 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java @@ -5,6 +5,7 @@ import java.util.List; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; +import forge.GuiBase; import forge.Forge.Graphics; import forge.assets.FSkinColor; import forge.assets.FSkinFont; @@ -15,7 +16,6 @@ import forge.game.mana.ManaPool; import forge.game.player.Player; import forge.match.input.Input; import forge.match.input.InputPayMana; -import forge.net.FServer; import forge.screens.match.FControl; import forge.toolbox.FDisplayObject; @@ -85,7 +85,7 @@ public class VManaPool extends VDisplayArea { @Override public boolean tap(float x, float y, int count) { - if (player.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (player.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer()) { final Input input = FControl.getInputQueue().getInput(); if (input instanceof InputPayMana) { // Do something diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index 11f8729c36e..ec5517f651c 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -3,6 +3,7 @@ package forge.screens.match.views; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; +import forge.LobbyPlayer; import forge.Forge.Graphics; import forge.assets.FSkinColor; import forge.assets.FSkinFont; @@ -10,7 +11,6 @@ import forge.assets.ImageCache; import forge.card.CardDetailUtil; import forge.card.CardDetailUtil.DetailColors; import forge.game.card.Card; -import forge.game.player.LobbyPlayer; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.zone.MagicStack; import forge.menu.FDropDown; diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java index f0a8c1b4195..615463202bd 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java @@ -21,6 +21,8 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import com.google.common.collect.Lists; +import forge.GuiBase; +import forge.LobbyPlayer; import forge.assets.FSkinColor; import forge.assets.FSkinColor.Colors; import forge.assets.FSkinImage; @@ -28,13 +30,11 @@ import forge.deck.Deck; import forge.game.Game; import forge.game.GameType; import forge.game.Match; -import forge.game.player.LobbyPlayer; import forge.game.player.RegisteredPlayer; import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletIO; +import forge.interfaces.IGuiBase; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; import forge.screens.match.FControl; import forge.toolbox.FLabel; import forge.toolbox.FPanel; @@ -87,7 +87,7 @@ public class GauntletWinLose extends ControlWinLose { // the player can restart Forge to replay a match. // Pretty sure this can't be fixed until in-game states can be // saved. Doublestrike 07-10-12 - LobbyPlayer questPlayer = FServer.getLobby().getQuestPlayer(); + LobbyPlayer questPlayer = GuiBase.getInterface().getQuestPlayer(); // In all cases, update stats. lstEventRecords.set(gd.getCompleted(), match.getGamesWonBy(questPlayer) + " - " @@ -192,9 +192,9 @@ public class GauntletWinLose extends ControlWinLose { GauntletData gd = FModel.getGauntletData(); Deck aiDeck = gd.getDecks().get(gd.getCompleted()); List players = Lists.newArrayList(); - Lobby lobby = FServer.getLobby(); - players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); - players.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); + IGuiBase fc = GuiBase.getInterface(); + players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer())); + players.add(new RegisteredPlayer(aiDeck).setPlayer(fc.createAiPlayer())); saveOptions(); FControl.endCurrentGame(); diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/LimitedWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/LimitedWinLose.java index e811202cf3a..398666d2414 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/LimitedWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/LimitedWinLose.java @@ -19,10 +19,10 @@ package forge.screens.match.winlose; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; +import forge.GuiBase; import forge.game.Game; import forge.limited.GauntletMini; import forge.model.FModel; -import forge.net.FServer; import forge.toolbox.FLabel; /** @@ -46,7 +46,7 @@ public class LimitedWinLose extends ControlWinLose { super(view0, lastGame); this.view = view0; gauntlet = FModel.getGauntletMini(); - this.wonMatch = lastGame.getMatch().isWonBy(FServer.getLobby().getGuiPlayer()); + this.wonMatch = lastGame.getMatch().isWonBy(GuiBase.getInterface().getGuiPlayer()); } /** @@ -65,7 +65,7 @@ public class LimitedWinLose extends ControlWinLose { resetView(); nextRound = false; - if (lastGame.getOutcome().isWinner(FServer.getLobby().getGuiPlayer())) { + if (lastGame.getOutcome().isWinner(GuiBase.getInterface().getGuiPlayer())) { gauntlet.addWin(); } else { diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index dea6fd1fd96..e3046e142f1 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -51,20 +51,5 @@ freemarker 2.3.20 - - org.eclipse.jetty - jetty-websocket - ${jettyVersion} - - - org.eclipse.jetty - jetty-server - ${jettyVersion} - - - org.eclipse.jetty - jetty-servlet - ${jettyVersion} - diff --git a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java index c37579a5c76..a09f137df8c 100644 --- a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java +++ b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java @@ -12,7 +12,6 @@ import forge.game.player.Player; import forge.game.zone.PlayerZone; import forge.game.zone.Zone; import forge.game.zone.ZoneType; -import forge.net.FServer; import forge.util.Lang; import forge.util.maps.MapOfLists; @@ -254,7 +253,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public Void visit(GameEventAttackersDeclared event) { // Skip redraw for GUI player? - if (event.player.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { + if (event.player.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer()) { return null; } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java index ac57d42e17e..960882ea0aa 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java @@ -10,6 +10,7 @@ import org.apache.commons.lang3.tuple.Pair; import com.google.common.base.Function; +import forge.LobbyPlayer; import forge.assets.FSkinProp; import forge.assets.ISkinImage; import forge.events.UiEvent; @@ -20,7 +21,6 @@ import forge.game.card.Card; import forge.game.combat.Combat; import forge.game.event.GameEventTurnBegan; import forge.game.phase.PhaseType; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.RegisteredPlayer; import forge.game.spellability.SpellAbility; @@ -79,4 +79,8 @@ public interface IGuiBase { int getAvatarCount(); void copyToClipboard(String text); void browseToUrl(String url) throws Exception; + LobbyPlayer getGuiPlayer(); + LobbyPlayer createAiPlayer(); + LobbyPlayer createAiPlayer(String name, int avatarIndex); + LobbyPlayer getQuestPlayer(); } \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/limited/GauntletMini.java b/forge-gui/src/main/java/forge/limited/GauntletMini.java index eff70351b63..338c6a723ca 100644 --- a/forge-gui/src/main/java/forge/limited/GauntletMini.java +++ b/forge-gui/src/main/java/forge/limited/GauntletMini.java @@ -21,9 +21,8 @@ import forge.GuiBase; import forge.deck.Deck; import forge.game.GameType; import forge.game.player.RegisteredPlayer; +import forge.interfaces.IGuiBase; import forge.model.FModel; -import forge.net.FServer; -import forge.net.Lobby; import java.util.ArrayList; import java.util.List; @@ -152,11 +151,11 @@ public class GauntletMini { */ private void startRound() { List starter = new ArrayList(); - Lobby lobby = FServer.getLobby(); - starter.add(new RegisteredPlayer(humanDeck).setPlayer(lobby.getGuiPlayer())); - starter.add(aiOpponents.get(currentRound - 1).setPlayer(lobby.getAiPlayer())); + IGuiBase fc = GuiBase.getInterface(); + starter.add(new RegisteredPlayer(humanDeck).setPlayer(fc.getGuiPlayer())); + starter.add(aiOpponents.get(currentRound - 1).setPlayer(fc.createAiPlayer())); - GuiBase.getInterface().startMatch(gauntletType, starter); + fc.startMatch(gauntletType, starter); } /** diff --git a/forge-gui/src/main/java/forge/net/Lobby.java b/forge-gui/src/main/java/forge/net/Lobby.java deleted file mode 100644 index 5b042d34474..00000000000 --- a/forge-gui/src/main/java/forge/net/Lobby.java +++ /dev/null @@ -1,103 +0,0 @@ -package forge.net; - -import com.google.common.base.Supplier; - -import forge.GuiBase; -import forge.ai.AiProfileUtil; -import forge.ai.LobbyPlayerAi; -import forge.control.ChatArea; -import forge.game.player.LobbyPlayer; -import forge.model.FModel; -import forge.net.client.INetClient; -import forge.properties.ForgePreferences.FPref; -import forge.util.GuiDisplayUtil; -import forge.util.MyRandom; -import forge.util.NameGenerator; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * TODO: Write javadoc for this type. - * - */ -public class Lobby { - - private final LobbyPlayer guiPlayer; - public Lobby(Supplier humanFactory){ - guiPlayer = humanFactory.get(); - } - - - private Map remotePlayers = new ConcurrentHashMap(); - - private final LobbyPlayerAi system = new LobbyPlayerAi("System"); - - public final LobbyPlayer getGuiPlayer() { - return guiPlayer; - } - - public final LobbyPlayer getAiPlayer() { return getAiPlayer(getRandomName()); } - public final LobbyPlayer getAiPlayer(String name) { - int avatarCount = GuiBase.getInterface().getAvatarCount(); - return getAiPlayer(name, avatarCount == 0 ? 0 : MyRandom.getRandom().nextInt(avatarCount)); - } - public final LobbyPlayer getAiPlayer(String name, int avatarIndex) { - LobbyPlayerAi player = new LobbyPlayerAi(name); - - // TODO: implement specific AI profiles for quest mode. - String lastProfileChosen = FModel.getPreferences().getPref(FPref.UI_CURRENT_AI_PROFILE); - player.setRotateProfileEachGame(lastProfileChosen.equals(AiProfileUtil.AI_PROFILE_RANDOM_DUEL)); - if(lastProfileChosen.equals(AiProfileUtil.AI_PROFILE_RANDOM_MATCH)) { - lastProfileChosen = AiProfileUtil.getRandomProfile(); - System.out.println(String.format("AI profile %s was chosen for the lobby player %s.", lastProfileChosen, player.getName())); - } - player.setAiProfile(lastProfileChosen); - player.setAvatarIndex(avatarIndex); - return player; - } - - /** Returns a random name from the supplied list. */ - private String getRandomName() { - String playerName = GuiDisplayUtil.getPlayerName(); - String aiName = NameGenerator.getRandomName("Any", "Generic", playerName); - return aiName; - } - - /** - * TODO: Write javadoc for this method. - * @return - */ - public LobbyPlayer getQuestPlayer() { - return guiPlayer; - } - - /** - * TODO: Write javadoc for this method. - * @param name - * @return - */ - public synchronized LobbyPlayer findOrCreateRemotePlayer(String name, INetClient client) { - if (remotePlayers.containsKey(name)) - return remotePlayers.get(name); - - LobbyPlayerRemote res = new LobbyPlayerRemote(name, client); - speak(ChatArea.Room, system, res.getName() + " has joined the server."); - // have to load avatar from remote user's preferences here - remotePlayers.put(name, res); - - return res; - } - - public void disconnectPlayer(LobbyPlayer player) { - // Should set up a timer here to discard player and all of his games after 20 minutes of being offline - } - - - public void speak(ChatArea room, LobbyPlayer player, String message) { - getGuiPlayer().hear(player, message); - for(LobbyPlayer remote : remotePlayers.values()) { - remote.hear(player, message); - } - } -} diff --git a/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java b/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java index d5d89f5cb2a..b08b8dde611 100644 --- a/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java +++ b/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java @@ -1,8 +1,9 @@ package forge.player; import forge.GuiBase; +import forge.LobbyPlayer; import forge.game.Game; -import forge.game.player.LobbyPlayer; +import forge.game.player.IGameEntitiesFactory; import forge.game.player.Player; import forge.game.player.PlayerController; import forge.model.FModel; @@ -10,15 +11,11 @@ import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.util.GuiDisplayUtil; -public class LobbyPlayerHuman extends LobbyPlayer { +public class LobbyPlayerHuman extends LobbyPlayer implements IGameEntitiesFactory { public LobbyPlayerHuman(String name) { super(name); } - @Override - protected PlayerType getType() { - return PlayerType.HUMAN; - } @Override public PlayerController createControllerFor(Player human) { diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index e05af662d5c..08de92f161a 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -6,6 +6,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; +import forge.LobbyPlayer; import forge.SOptionPane; import forge.GuiBase; import forge.SGuiChoose; @@ -32,7 +33,6 @@ import forge.game.cost.CostPart; import forge.game.cost.CostPartMana; import forge.game.mana.Mana; import forge.game.phase.PhaseType; -import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerController; diff --git a/forge-gui/src/main/java/forge/quest/QuestController.java b/forge-gui/src/main/java/forge/quest/QuestController.java index 6ed697abd2e..fe3280a50d8 100644 --- a/forge-gui/src/main/java/forge/quest/QuestController.java +++ b/forge-gui/src/main/java/forge/quest/QuestController.java @@ -21,6 +21,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.eventbus.Subscribe; +import forge.GuiBase; import forge.deck.Deck; import forge.game.GameFormat; import forge.game.event.GameEvent; @@ -28,7 +29,6 @@ import forge.game.event.GameEventMulligan; import forge.item.PaperCard; import forge.item.PreconDeck; import forge.model.FModel; -import forge.net.FServer; import forge.properties.ForgeConstants; import forge.quest.bazaar.QuestBazaarManager; import forge.quest.bazaar.QuestItemType; @@ -448,7 +448,7 @@ public class QuestController { if (ev instanceof GameEventMulligan) { GameEventMulligan mev = (GameEventMulligan) ev; // First mulligan is free - if (mev.player.getLobbyPlayer() == FServer.getLobby().getQuestPlayer() + if (mev.player.getLobbyPlayer() == GuiBase.getInterface().getQuestPlayer() && getAssets().hasItem(QuestItemType.SLEIGHT) && mev.player.getStats().getMulliganCount() == 0) { mev.player.drawCard(); } diff --git a/forge-gui/src/main/java/forge/sound/EventVisualizer.java b/forge-gui/src/main/java/forge/sound/EventVisualizer.java index bf9849e1d46..5733b8bc4b1 100644 --- a/forge-gui/src/main/java/forge/sound/EventVisualizer.java +++ b/forge-gui/src/main/java/forge/sound/EventVisualizer.java @@ -1,5 +1,6 @@ package forge.sound; +import forge.GuiBase; import forge.events.IUiEventVisitor; import forge.events.UiEventAttackerDeclared; import forge.events.UiEventBlockerAssigned; @@ -7,7 +8,6 @@ import forge.game.card.Card; import forge.game.event.*; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; -import forge.net.FServer; import forge.util.maps.MapOfLists; import java.util.Collection; @@ -41,7 +41,7 @@ public class EventVisualizer extends IGameEventVisitor.Base imp public SoundEffectType visit(GameEventShuffle event) { return SoundEffectType.Shuffle; } public SoundEffectType visit(GameEventTokenCreated event) { return SoundEffectType.Token; } public SoundEffectType visit(GameEventBlockersDeclared event) { - boolean isLocalHuman = event.defendingPlayer.getLobbyPlayer() == FServer.getLobby().getGuiPlayer(); + boolean isLocalHuman = event.defendingPlayer.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer(); if (isLocalHuman) return null; // already played sounds in interactive mode @@ -60,7 +60,7 @@ public class EventVisualizer extends IGameEventVisitor.Base imp * Plays the sound corresponding to the outcome of the duel. */ public SoundEffectType visit(GameEventGameOutcome event) { - boolean humanWonTheDuel = event.result.getWinningLobbyPlayer() == FServer.getLobby().getGuiPlayer(); + boolean humanWonTheDuel = event.result.getWinningLobbyPlayer() == GuiBase.getInterface().getGuiPlayer(); return humanWonTheDuel ? SoundEffectType.WinDuel : SoundEffectType.LoseDuel; } diff --git a/forge-net/pom.xml b/forge-net/pom.xml index 21c4dc2fe29..b59ea288992 100644 --- a/forge-net/pom.xml +++ b/forge-net/pom.xml @@ -27,6 +27,21 @@ com.google.code.gson gson 2.2.4 + + + org.eclipse.jetty + jetty-websocket + ${jettyVersion} + + + org.eclipse.jetty + jetty-server + ${jettyVersion} + + + org.eclipse.jetty + jetty-servlet + ${jettyVersion} diff --git a/forge-net/src/main/java/forge/net/FServer.java b/forge-net/src/main/java/forge/net/FServer.java new file mode 100644 index 00000000000..7dcc6f2a40e --- /dev/null +++ b/forge-net/src/main/java/forge/net/FServer.java @@ -0,0 +1,25 @@ +package forge.net; + + +public class FServer { + private FServer() { + + } + + private static Lobby lobby = new Lobby(); + + public static Lobby getLobby() { + return lobby; + } + + /** + * TODO: Write javadoc for this method. + * @return + */ + private static final NetServer server = new NetServer(); + public static NetServer getServer() { + // TODO Auto-generated method stub + return server; + } + +} diff --git a/forge-gui/src/main/java/forge/net/IClientSocket.java b/forge-net/src/main/java/forge/net/IClientSocket.java similarity index 100% rename from forge-gui/src/main/java/forge/net/IClientSocket.java rename to forge-net/src/main/java/forge/net/IClientSocket.java diff --git a/forge-gui/src/main/java/forge/net/IConnectionObserver.java b/forge-net/src/main/java/forge/net/IConnectionObserver.java similarity index 100% rename from forge-gui/src/main/java/forge/net/IConnectionObserver.java rename to forge-net/src/main/java/forge/net/IConnectionObserver.java diff --git a/forge-net/src/main/java/forge/net/Lobby.java b/forge-net/src/main/java/forge/net/Lobby.java new file mode 100644 index 00000000000..be35d3d7a8e --- /dev/null +++ b/forge-net/src/main/java/forge/net/Lobby.java @@ -0,0 +1,38 @@ +package forge.net; + +import forge.LobbyPlayer; +import forge.net.client.INetClient; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * TODO: Write javadoc for this type. + * + */ +public class Lobby { + + + private Map remotePlayers = new ConcurrentHashMap(); + + /** + * TODO: Write javadoc for this method. + * @param name + * @return + */ + public synchronized LobbyPlayer findOrCreateRemotePlayer(String name, INetClient client) { + if (remotePlayers.containsKey(name)) + return remotePlayers.get(name); + + LobbyPlayerRemote res = new LobbyPlayerRemote(name, client); + // speak(ChatArea.Room, system, res.getName() + " has joined the server."); + // have to load avatar from remote user's preferences here + remotePlayers.put(name, res); + + return res; + } + + public void disconnectPlayer(LobbyPlayer player) { + // Should set up a timer here to discard player and all of his games after 20 minutes of being offline + } +} diff --git a/forge-gui/src/main/java/forge/net/LobbyPlayerRemote.java b/forge-net/src/main/java/forge/net/LobbyPlayerRemote.java similarity index 84% rename from forge-gui/src/main/java/forge/net/LobbyPlayerRemote.java rename to forge-net/src/main/java/forge/net/LobbyPlayerRemote.java index 2812e7906d1..7e00e671127 100644 --- a/forge-gui/src/main/java/forge/net/LobbyPlayerRemote.java +++ b/forge-net/src/main/java/forge/net/LobbyPlayerRemote.java @@ -1,13 +1,14 @@ package forge.net; +import forge.LobbyPlayer; import forge.game.Game; -import forge.game.player.LobbyPlayer; +import forge.game.player.IGameEntitiesFactory; import forge.game.player.Player; import forge.game.player.PlayerController; import forge.net.client.INetClient; import forge.net.protocol.toclient.ChatPacketClt; -public class LobbyPlayerRemote extends LobbyPlayer { +public class LobbyPlayerRemote extends LobbyPlayer implements IGameEntitiesFactory { private final INetClient connection; @@ -16,11 +17,6 @@ public class LobbyPlayerRemote extends LobbyPlayer { connection = netClient; } - @Override - protected PlayerType getType() { - return PlayerType.REMOTE; - } - /* (non-Javadoc) * @see forge.game.player.LobbyPlayer#getPlayer(forge.game.GameState) */ diff --git a/forge-gui/src/main/java/forge/net/NetServer.java b/forge-net/src/main/java/forge/net/NetServer.java similarity index 92% rename from forge-gui/src/main/java/forge/net/NetServer.java rename to forge-net/src/main/java/forge/net/NetServer.java index b605c2123bd..a5c1ae76af7 100644 --- a/forge-gui/src/main/java/forge/net/NetServer.java +++ b/forge-net/src/main/java/forge/net/NetServer.java @@ -1,6 +1,5 @@ package forge.net; -import forge.error.BugReporter; import forge.net.client.NetClient; import org.eclipse.jetty.server.Connector; @@ -71,7 +70,7 @@ public class NetServer { _connection.sendMessage(data); } catch (IOException e) { - BugReporter.reportException(e); + throw new RuntimeException(e); } } @@ -110,7 +109,7 @@ public class NetServer { String host = connector.getHost(); serverUri = new URI(String.format("ws://%s:%d/", host == null ? "localhost" : host ,port)); } catch (Exception e) { - BugReporter.reportException(e); + throw new RuntimeException(e); } System.out.println("Server started @ " + serverUri); @@ -125,7 +124,7 @@ public class NetServer { srv.stop(); portNumber = -1; } catch (Exception e) { - BugReporter.reportException(e); + throw new RuntimeException(e); } } diff --git a/forge-gui/src/main/java/forge/net/client/INetClient.java b/forge-net/src/main/java/forge/net/client/INetClient.java similarity index 88% rename from forge-gui/src/main/java/forge/net/client/INetClient.java rename to forge-net/src/main/java/forge/net/client/INetClient.java index 4140fd3642e..6db1489f8b4 100644 --- a/forge-gui/src/main/java/forge/net/client/INetClient.java +++ b/forge-net/src/main/java/forge/net/client/INetClient.java @@ -1,6 +1,6 @@ package forge.net.client; -import forge.game.player.LobbyPlayer; +import forge.LobbyPlayer; import forge.net.client.state.IClientState; import forge.net.protocol.toclient.IPacketClt; diff --git a/forge-gui/src/main/java/forge/net/client/InvalidFieldInPacketException.java b/forge-net/src/main/java/forge/net/client/InvalidFieldInPacketException.java similarity index 100% rename from forge-gui/src/main/java/forge/net/client/InvalidFieldInPacketException.java rename to forge-net/src/main/java/forge/net/client/InvalidFieldInPacketException.java diff --git a/forge-gui/src/main/java/forge/net/client/NetClient.java b/forge-net/src/main/java/forge/net/client/NetClient.java similarity index 95% rename from forge-gui/src/main/java/forge/net/client/NetClient.java rename to forge-net/src/main/java/forge/net/client/NetClient.java index 5eff06e9f6e..6ca0f756d0b 100644 --- a/forge-gui/src/main/java/forge/net/client/NetClient.java +++ b/forge-net/src/main/java/forge/net/client/NetClient.java @@ -1,6 +1,6 @@ package forge.net.client; -import forge.game.player.LobbyPlayer; +import forge.LobbyPlayer; import forge.net.FServer; import forge.net.IClientSocket; import forge.net.IConnectionObserver; diff --git a/forge-gui/src/main/java/forge/net/client/package-info.java b/forge-net/src/main/java/forge/net/client/package-info.java similarity index 100% rename from forge-gui/src/main/java/forge/net/client/package-info.java rename to forge-net/src/main/java/forge/net/client/package-info.java diff --git a/forge-gui/src/main/java/forge/net/client/state/ConnectedClientState.java b/forge-net/src/main/java/forge/net/client/state/ConnectedClientState.java similarity index 100% rename from forge-gui/src/main/java/forge/net/client/state/ConnectedClientState.java rename to forge-net/src/main/java/forge/net/client/state/ConnectedClientState.java diff --git a/forge-gui/src/main/java/forge/net/client/state/IClientState.java b/forge-net/src/main/java/forge/net/client/state/IClientState.java similarity index 100% rename from forge-gui/src/main/java/forge/net/client/state/IClientState.java rename to forge-net/src/main/java/forge/net/client/state/IClientState.java diff --git a/forge-gui/src/main/java/forge/net/client/state/InLobbyClientState.java b/forge-net/src/main/java/forge/net/client/state/InLobbyClientState.java similarity index 80% rename from forge-gui/src/main/java/forge/net/client/state/InLobbyClientState.java rename to forge-net/src/main/java/forge/net/client/state/InLobbyClientState.java index be6dc65cebd..f43de2d1ef4 100644 --- a/forge-gui/src/main/java/forge/net/client/state/InLobbyClientState.java +++ b/forge-net/src/main/java/forge/net/client/state/InLobbyClientState.java @@ -1,7 +1,5 @@ package forge.net.client.state; -import forge.control.ChatArea; -import forge.net.FServer; import forge.net.client.INetClient; import forge.net.protocol.toserver.ChatPacketSrv; import forge.net.protocol.toserver.IPacketSrv; @@ -22,7 +20,7 @@ public class InLobbyClientState implements IClientState { if( data instanceof ChatPacketSrv) { ChatPacketSrv cp = (ChatPacketSrv) data; // if ( not muted ) - FServer.getLobby().speak(ChatArea.Room, client.getPlayer(), cp.getMessage()); + // FServer.getLobby().speak(ChatArea.Room, client.getPlayer(), cp.getMessage()); // else // client.send("You are banned and cannot speak"); return true; diff --git a/forge-gui/src/main/java/forge/net/client/state/UnauthorizedClientState.java b/forge-net/src/main/java/forge/net/client/state/UnauthorizedClientState.java similarity index 100% rename from forge-gui/src/main/java/forge/net/client/state/UnauthorizedClientState.java rename to forge-net/src/main/java/forge/net/client/state/UnauthorizedClientState.java diff --git a/forge-gui/src/main/java/forge/net/client/state/package-info.java b/forge-net/src/main/java/forge/net/client/state/package-info.java similarity index 100% rename from forge-gui/src/main/java/forge/net/client/state/package-info.java rename to forge-net/src/main/java/forge/net/client/state/package-info.java diff --git a/forge-gui/src/main/java/forge/net/package-info.java b/forge-net/src/main/java/forge/net/package-info.java similarity index 100% rename from forge-gui/src/main/java/forge/net/package-info.java rename to forge-net/src/main/java/forge/net/package-info.java