Detach network code from game and gui.

This commit is contained in:
Maxmtg
2014-05-02 05:40:50 +00:00
parent 876d333498
commit 74f9a5f722
76 changed files with 552 additions and 448 deletions

35
.gitattributes vendored
View File

@@ -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

View File

@@ -17,7 +17,7 @@
*/
package forge.ai;
import forge.game.player.LobbyPlayer;
import forge.LobbyPlayer;
import forge.util.Aggregates;
import forge.util.FileUtil;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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.*;

View File

@@ -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;

View File

@@ -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 {

View File

@@ -0,0 +1,11 @@
package forge.game.player;
import forge.game.Game;
public interface IGameEntitiesFactory
{
PlayerController createControllerFor(Player p);
Player createIngamePlayer(Game game);
}

View File

@@ -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<Player> {
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 {

View File

@@ -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;

View File

@@ -1,5 +1,6 @@
package forge.game.player;
import forge.LobbyPlayer;
import forge.deck.Deck;
import forge.deck.DeckSection;
import forge.game.GameType;

View File

@@ -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();
}
}

View File

@@ -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);
}

View File

@@ -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<Player> pp = new ArrayList<Player>();
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;
}
}

View File

@@ -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);
}
};

View File

@@ -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<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
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);
}

View File

@@ -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<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
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)

View File

@@ -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<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
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)

View File

@@ -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() + ")");

View File

@@ -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<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
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);

View File

@@ -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<RegisteredPlayer> players = new ArrayList<RegisteredPlayer>();
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()) {

View File

@@ -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<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
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);
}
/** */

View File

@@ -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<CSubmenuConstructed> {
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<CSubmenuConstructed> {
}
}
public PlayerType getPlayerType() {
return radioAi.isSelected() ? PlayerType.COMPUTER : PlayerType.HUMAN;
public Boolean isAi() {
return radioAi.isSelected();
}
public void setVanguardButtonText(String text) {

View File

@@ -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<? extends ICDoc> selectedDocBeforeCombat;
private MatchUiEventVisitor visitor = new MatchUiEventVisitor();
public final Map<LobbyPlayer, String> avatarImages = new HashMap<LobbyPlayer, String>();
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();
}
}

View File

@@ -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<RegisteredPlayer> 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();
}

View File

@@ -17,11 +17,12 @@ package forge.screens.match;
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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();

View File

@@ -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;

View File

@@ -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());

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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":

View File

@@ -1,60 +1,28 @@
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;
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;
public class FServer {
private FServer() {
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;
}
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<LobbyPlayer>() {
@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) {
public class SimulateMatch {
public static void simulate(String[] args) {
FModel.initialize(null);
interactiveMode = false;
System.out.println("Simulation mode");
if(args.length < 3 ) {
System.out.println("Syntax: forge.exe sim <deck1[.dck]> <deck2[.dck]> [N]");
@@ -76,8 +44,8 @@ public class FServer {
System.out.println(String.format("Ai-%s vs Ai_%s - %s", d1.getName(), d2.getName(), Lang.nounWithNumeral(nGames, "game")));
List<RegisteredPlayer> pp = new ArrayList<RegisteredPlayer>();
pp.add(new RegisteredPlayer(d1).setPlayer(getLobby().getAiPlayer("Ai-" + d1.getName())));
pp.add(new RegisteredPlayer(d2).setPlayer(getLobby().getAiPlayer("Ai_" + d2.getName())));
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++)
@@ -114,11 +82,5 @@ public class FServer {
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;
}
}

View File

@@ -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<Player, PlayerControllerForTests> 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 ) {

View File

@@ -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;

View File

@@ -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;
@@ -216,6 +215,8 @@ public class GuiMobile implements IGuiBase {
FControl.startMatch(gameType, players);
}
@Override
public void setPanelSelection(Card c) {
//GuiUtils.setPanelSelection(c); //TODO
@@ -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();
}
}

View File

@@ -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()) {

View File

@@ -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<Player> pp = new ArrayList<Player>();
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;
}
}

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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;

View File

@@ -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<RegisteredPlayer> 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();

View File

@@ -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 {

View File

@@ -51,20 +51,5 @@
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-websocket</artifactId>
<version>${jettyVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jettyVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jettyVersion}</version>
</dependency>
</dependencies>
</project>

View File

@@ -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<Void> {
@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;
}

View File

@@ -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();
}

View File

@@ -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<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
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);
}
/**

View File

@@ -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<LobbyPlayer> humanFactory){
guiPlayer = humanFactory.get();
}
private Map<String, LobbyPlayerRemote> remotePlayers = new ConcurrentHashMap<String, LobbyPlayerRemote>();
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);
}
}
}

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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<SoundEffectType> 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<SoundEffectType> 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;
}

View File

@@ -27,6 +27,21 @@
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.2.4</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-websocket</artifactId>
<version>${jettyVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
<version>${jettyVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
<version>${jettyVersion}</version>
</dependency>
</dependencies>
</project>

View File

@@ -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;
}
}

View File

@@ -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<String, LobbyPlayerRemote> remotePlayers = new ConcurrentHashMap<String, LobbyPlayerRemote>();
/**
* 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
}
}

View File

@@ -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)
*/

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;