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/.settings/org.eclipse.m2e.core.prefs -text
forge-core/pom.xml -text forge-core/pom.xml -text
forge-core/src/main/java/forge/CardStorageReader.java -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/StaticData.java -text
forge-core/src/main/java/forge/card/BoosterGenerator.java svneol=native#text/plain forge-core/src/main/java/forge/card/BoosterGenerator.java svneol=native#text/plain
forge-core/src/main/java/forge/card/BoosterSlots.java -text 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/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/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/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/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/Player.java svneol=native#text/plain
forge-game/src/main/java/forge/game/player/PlayerActionConfirmMode.java -text 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/FView.java -text
forge-gui-desktop/src/main/java/forge/view/ITitleBarOwner.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/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/SplashFrame.java -text
forge-gui-desktop/src/main/java/forge/view/arcane/CardArea.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 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/MultipleForgeJarsFoundError.java -text
forge-gui/src/main/java/forge/model/UnOpenedMeta.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/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/GamePlayerUtil.java -text
forge-gui/src/main/java/forge/player/HumanCostDecision.java -text forge-gui/src/main/java/forge/player/HumanCostDecision.java -text
forge-gui/src/main/java/forge/player/HumanPlay.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.jdt.core.prefs -text
forge-net/.settings/org.eclipse.m2e.core.prefs -text forge-net/.settings/org.eclipse.m2e.core.prefs -text
forge-net/pom.xml -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/ClientProtocol.java -text
forge-net/src/main/java/forge/net/protocol/ClientProtocolJson.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 forge-net/src/main/java/forge/net/protocol/package-info.java -text

View File

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

View File

@@ -1,10 +1,11 @@
package forge.ai; package forge.ai;
import forge.LobbyPlayer;
import forge.game.Game; import forge.game.Game;
import forge.game.player.LobbyPlayer; import forge.game.player.IGameEntitiesFactory;
import forge.game.player.Player; import forge.game.player.Player;
public class LobbyPlayerAi extends LobbyPlayer { public class LobbyPlayerAi extends LobbyPlayer implements IGameEntitiesFactory {
public LobbyPlayerAi(String name) { public LobbyPlayerAi(String name) {
super(name); super(name);
} }
@@ -34,11 +35,6 @@ public class LobbyPlayerAi extends LobbyPlayer {
this.rotateProfileEachGame = rotateProfileEachGame; this.rotateProfileEachGame = rotateProfileEachGame;
} }
@Override
protected PlayerType getType() {
return PlayerType.COMPUTER;
}
@Override @Override
public PlayerControllerAi createControllerFor(Player ai) { public PlayerControllerAi createControllerFor(Player ai) {
PlayerControllerAi result = new PlayerControllerAi(ai.getGame(), ai, this); 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.Lists;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import forge.LobbyPlayer;
import forge.ai.ability.ChangeZoneAi; import forge.ai.ability.ChangeZoneAi;
import forge.ai.ability.CharmAi; import forge.ai.ability.CharmAi;
import forge.ai.ability.ProtectAi; import forge.ai.ability.ProtectAi;
@@ -31,7 +32,6 @@ import forge.game.mana.Mana;
import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaCostBeingPaid;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerActionConfirmMode;
import forge.game.player.PlayerController; 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.PhaseType;
import forge.game.phase.Untap; import forge.game.phase.Untap;
import forge.game.phase.Upkeep; import forge.game.phase.Upkeep;
import forge.game.player.IGameEntitiesFactory;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementHandler;
@@ -110,7 +111,8 @@ public class Game {
} }
for (RegisteredPlayer psc : players0) { for (RegisteredPlayer psc : players0) {
Player pl = psc.getPlayer().createIngamePlayer(this); IGameEntitiesFactory factory = (IGameEntitiesFactory)psc.getPlayer();
Player pl = factory.createIngamePlayer(this);
players.add(pl); players.add(pl);
ingamePlayers.add(pl); ingamePlayers.add(pl);

View File

@@ -1,10 +1,11 @@
package forge.game; package forge.game;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import forge.LobbyPlayer;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.event.*; import forge.game.event.*;
import forge.game.event.GameEventCardDamaged.DamageType; import forge.game.event.GameEventCardDamaged.DamageType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.spellability.TargetChoices; import forge.game.spellability.TargetChoices;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;

View File

@@ -17,11 +17,12 @@
*/ */
package forge.game; package forge.game;
import forge.game.player.LobbyPlayer; import forge.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerOutcome; import forge.game.player.PlayerOutcome;
import forge.game.player.PlayerStatistics; import forge.game.player.PlayerStatistics;
import forge.item.PaperCard; import forge.item.PaperCard;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import java.util.*; import java.util.*;

View File

@@ -1,13 +1,14 @@
package forge.game; package forge.game;
import com.google.common.collect.*; import com.google.common.collect.*;
import forge.LobbyPlayer;
import forge.deck.CardPool; import forge.deck.CardPool;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckSection; import forge.deck.DeckSection;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.event.GameEventAnteCardsSelected; import forge.game.event.GameEventAnteCardsSelected;
import forge.game.event.GameEventGameFinished; import forge.game.event.GameEventGameFinished;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.game.trigger.Trigger; import forge.game.trigger.Trigger;

View File

@@ -1,6 +1,6 @@
package forge.game.event; package forge.game.event;
import forge.game.player.LobbyPlayer; import forge.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
public class GameEventPlayerControl extends GameEvent { 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.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.LobbyPlayer;
import forge.card.MagicColor; import forge.card.MagicColor;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.game.*; import forge.game.*;
@@ -2724,7 +2725,8 @@ public class Player extends GameEntity implements Comparable<Player> {
if (mindSlaveMaster != null) { if (mindSlaveMaster != null) {
LobbyPlayer oldLobbyPlayer = getLobbyPlayer(); LobbyPlayer oldLobbyPlayer = getLobbyPlayer();
controller = mindSlaveMaster.getLobbyPlayer().createControllerFor(this); IGameEntitiesFactory master = (IGameEntitiesFactory)mindSlaveMaster.getLobbyPlayer();
controller = master.createControllerFor(this);
game.fireEvent(new GameEventPlayerControl(this, oldLobbyPlayer, getLobbyPlayer())); game.fireEvent(new GameEventPlayerControl(this, oldLobbyPlayer, getLobbyPlayer()));
} }
else { else {

View File

@@ -3,6 +3,7 @@ package forge.game.player;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import forge.LobbyPlayer;
import forge.card.ColorSet; import forge.card.ColorSet;
import forge.card.mana.ManaCost; import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard; import forge.card.mana.ManaCostShard;

View File

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

View File

@@ -38,7 +38,6 @@ import forge.game.combat.Combat;
import forge.game.event.GameEventTurnBegan; import forge.game.event.GameEventTurnBegan;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -54,7 +53,6 @@ import forge.interfaces.IButton;
import forge.interfaces.IGuiBase; import forge.interfaces.IGuiBase;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.match.input.InputQueue; import forge.match.input.InputQueue;
import forge.net.FServer;
import forge.screens.match.CMatchUI; import forge.screens.match.CMatchUI;
import forge.screens.match.VMatchUI; import forge.screens.match.VMatchUI;
import forge.screens.match.ViewWinLose; import forge.screens.match.ViewWinLose;
@@ -202,7 +200,7 @@ public class GuiDesktop implements IGuiBase {
@Override @Override
public void updatePlayerControl() { public void updatePlayerControl() {
CMatchUI.SINGLETON_INSTANCE.initHandViews(FServer.getLobby().getGuiPlayer()); CMatchUI.SINGLETON_INSTANCE.initHandViews(getGuiPlayer());
SLayoutIO.loadLayout(null); SLayoutIO.loadLayout(null);
VMatchUI.SINGLETON_INSTANCE.populate(); VMatchUI.SINGLETON_INSTANCE.populate();
for (VHand h : VMatchUI.SINGLETON_INSTANCE.getHands()) { for (VHand h : VMatchUI.SINGLETON_INSTANCE.getHands()) {
@@ -415,4 +413,28 @@ public class GuiDesktop implements IGuiBase {
public void browseToUrl(String url) throws Exception { public void browseToUrl(String url) throws Exception {
Desktop.getDesktop().browse(new URI(url)); 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.FSkinProp;
import forge.assets.ImageUtil; import forge.assets.ImageUtil;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.player.IHasIcon;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.properties.ForgeConstants; import forge.properties.ForgeConstants;
import forge.toolbox.FSkin; 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 * 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. * in the cache and cannot be loaded from disk.
*/ */
public static SkinIcon getIcon(IHasIcon ihi) { public static SkinIcon getIcon(String imageKey) {
String imageKey = ihi.getIconImageKey();
final BufferedImage i; final BufferedImage i;
if (_missingIconKeys.contains(imageKey) || if (_missingIconKeys.contains(imageKey) ||
null == (i = scaleImage(ihi.getIconImageKey(), -1, -1, false))) { null == (i = scaleImage(imageKey, -1, -1, false))) {
_missingIconKeys.add(imageKey); _missingIconKeys.add(imageKey);
return FSkin.getIcon(FSkinProp.ICO_UNKNOWN); return FSkin.getIcon(FSkinProp.ICO_UNKNOWN);
} }

View File

@@ -18,8 +18,11 @@
package forge.control; package forge.control;
import forge.FThreads; import forge.FThreads;
import forge.GuiBase;
import forge.ImageCache; import forge.ImageCache;
import forge.LobbyPlayer;
import forge.Singletons; import forge.Singletons;
import forge.ai.AiProfileUtil;
import forge.ai.LobbyPlayerAi; import forge.ai.LobbyPlayerAi;
import forge.assets.FSkinProp; import forge.assets.FSkinProp;
import forge.control.KeyboardShortcuts.Shortcut; import forge.control.KeyboardShortcuts.Shortcut;
@@ -28,7 +31,6 @@ import forge.game.GameRules;
import forge.game.GameType; import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
@@ -39,7 +41,6 @@ import forge.player.LobbyPlayerHuman;
import forge.match.input.InputQueue; import forge.match.input.InputQueue;
import forge.menus.ForgeMenu; import forge.menus.ForgeMenu;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.properties.ForgeConstants; import forge.properties.ForgeConstants;
@@ -60,6 +61,9 @@ import forge.sound.SoundSystem;
import forge.toolbox.FOptionPane; import forge.toolbox.FOptionPane;
import forge.toolbox.FSkin; import forge.toolbox.FSkin;
import forge.toolbox.special.PhaseIndicator; import forge.toolbox.special.PhaseIndicator;
import forge.util.GuiDisplayUtil;
import forge.util.MyRandom;
import forge.util.NameGenerator;
import forge.view.FFrame; import forge.view.FFrame;
import forge.view.FView; import forge.view.FView;
@@ -348,13 +352,13 @@ public enum FControl implements KeyEventDispatcher {
public Player getCurrentPlayer() { public Player getCurrentPlayer() {
// try current priority // try current priority
Player currentPriority = game.getPhaseHandler().getPriorityPlayer(); Player currentPriority = game.getPhaseHandler().getPriorityPlayer();
if (null != currentPriority && currentPriority.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (null != currentPriority && currentPriority.getLobbyPlayer() == getGuiPlayer()) {
return currentPriority; return currentPriority;
} }
// otherwise find just any player, belonging to this lobbyplayer // otherwise find just any player, belonging to this lobbyplayer
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
if (p.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (p.getLobbyPlayer() == getGuiPlayer()) {
return p; return p;
} }
} }
@@ -384,7 +388,7 @@ public enum FControl implements KeyEventDispatcher {
public final void stopGame() { public final void stopGame() {
List<Player> pp = new ArrayList<Player>(); List<Player> pp = new ArrayList<Player>();
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
if (p.getOriginalLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (p.getOriginalLobbyPlayer() == getGuiPlayer()) {
pp.add(p); pp.add(p);
} }
} }
@@ -399,7 +403,7 @@ public enum FControl implements KeyEventDispatcher {
} }
Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer(); Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer();
boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == FServer.getLobby().getGuiPlayer(); boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == getGuiPlayer();
if (hasHuman && humanHasPriority) { if (hasHuman && humanHasPriority) {
game.getAction().checkGameOverCondition(); game.getAction().checkGameOverCondition();
@@ -462,7 +466,7 @@ public enum FControl implements KeyEventDispatcher {
this.game = game0; this.game = game0;
game.subscribeToEvents(Singletons.getControl().getSoundSystem()); game.subscribeToEvents(Singletons.getControl().getSoundSystem());
LobbyPlayer humanLobbyPlayer = FServer.getLobby().getGuiPlayer(); LobbyPlayer humanLobbyPlayer = getGuiPlayer();
// The UI controls should use these game data as models // The UI controls should use these game data as models
CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer);
CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer); CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer);
@@ -483,7 +487,7 @@ public enum FControl implements KeyEventDispatcher {
// Add playback controls to match if needed // Add playback controls to match if needed
gameHasHumanPlayer = false; gameHasHumanPlayer = false;
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
if (p.getController().getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) if (p.getController().getLobbyPlayer() == getGuiPlayer())
gameHasHumanPlayer = true; gameHasHumanPlayer = true;
} }
@@ -671,5 +675,39 @@ public enum FControl implements KeyEventDispatcher {
//Singletons.getView().getViewMatch().setLayoutParams(prefs.getPref(FPref.UI_LAYOUT_PARAMS)); //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; package forge.gui;
import forge.control.ChatArea;
import forge.net.FServer;
import forge.net.Lobby;
import forge.toolbox.*; import forge.toolbox.*;
import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.FSkin.SkinnedPanel;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
@@ -48,8 +45,7 @@ public enum FNetOverlay {
if ( StringUtils.isBlank(message) ) if ( StringUtils.isBlank(message) )
return; 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; package forge.screens.home.gauntlet;
import forge.GuiBase;
import forge.UiCommand; import forge.UiCommand;
import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameType; import forge.game.GameType;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
@@ -9,10 +9,8 @@ import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.interfaces.IGuiBase;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import javax.swing.*; import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@@ -104,12 +102,12 @@ public enum CSubmenuGauntletContests implements ICDoc {
Deck aiDeck = gd.getDecks().get(gd.getCompleted()); Deck aiDeck = gd.getDecks().get(gd.getCompleted());
List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>(); List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
Lobby lobby = FServer.getLobby();
starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); IGuiBase fc = GuiBase.getInterface();
starter.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); 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; package forge.screens.home.gauntlet;
import forge.GuiBase;
import forge.UiCommand; import forge.UiCommand;
import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameType; import forge.game.GameType;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
@@ -9,10 +9,8 @@ import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.interfaces.IGuiBase;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import javax.swing.*; import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@@ -106,11 +104,11 @@ public enum CSubmenuGauntletLoad implements ICDoc {
final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); final Deck aiDeck = gd.getDecks().get(gd.getCompleted());
List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>(); List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
Lobby lobby = FServer.getLobby(); IGuiBase fc = GuiBase.getInterface();
starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer()));
starter.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); starter.add(new RegisteredPlayer(aiDeck).setPlayer(fc.createAiPlayer()));
Singletons.getControl().startMatch(GameType.Gauntlet, starter); fc.startMatch(GameType.Gauntlet, starter);
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -2,6 +2,7 @@ package forge.screens.home.gauntlet;
import forge.UiCommand; import forge.UiCommand;
import forge.Singletons; import forge.Singletons;
import forge.control.FControl;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil;
import forge.deck.DeckgenUtil.DeckTypes; import forge.deck.DeckgenUtil.DeckTypes;
@@ -12,9 +13,6 @@ import forge.gauntlet.GauntletIO;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import javax.swing.*; import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@@ -140,11 +138,11 @@ public enum CSubmenuGauntletQuick implements ICDoc {
final Deck aiDeck = gd.getDecks().get(gd.getCompleted()); final Deck aiDeck = gd.getDecks().get(gd.getCompleted());
List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>(); List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
Lobby lobby = FServer.getLobby(); FControl fc = Singletons.getControl();
starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer()));
starter.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); starter.add(new RegisteredPlayer(aiDeck).setPlayer(fc.getAiPlayer()));
Singletons.getControl().startMatch(GameType.Gauntlet, starter); fc.startMatch(GameType.Gauntlet, starter);
} }
/* (non-Javadoc) /* (non-Javadoc)

View File

@@ -45,7 +45,7 @@ class PnlEvent extends JPanel {
public PnlEvent(final QuestEvent e0) { public PnlEvent(final QuestEvent e0) {
super(); super();
this.event = e0; this.event = e0;
img = ImageCache.getIcon(e0); img = ImageCache.getIcon(e0.getIconImageKey());
// Title and description // Title and description
this.rad = new FRadioButton(event.getTitle() + " (" + event.getDifficulty().getTitle() + ")"); this.rad = new FRadioButton(event.getTitle() + " (" + event.getDifficulty().getTitle() + ")");

View File

@@ -1,20 +1,20 @@
package forge.screens.home.quest; package forge.screens.home.quest;
import forge.FThreads; import forge.FThreads;
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.Singletons; import forge.Singletons;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.control.FControl;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameRules; import forge.game.GameRules;
import forge.game.GameType; import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.player.LobbyPlayer;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.framework.FScreen; import forge.gui.framework.FScreen;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.quest.*; import forge.quest.*;
import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestItemType;
@@ -24,6 +24,7 @@ import forge.quest.data.QuestAssets;
import forge.quest.data.QuestPreferences.QPref; import forge.quest.data.QuestPreferences.QPref;
import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.deckeditor.CDeckEditorUI;
import forge.screens.deckeditor.controllers.CEditorQuestCardShop; import forge.screens.deckeditor.controllers.CEditorQuestCardShop;
import forge.screens.match.CMatchUI;
import forge.toolbox.FOptionPane; import forge.toolbox.FOptionPane;
import forge.toolbox.FSkin; import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinnedLabel; import forge.toolbox.FSkin.SkinnedLabel;
@@ -441,11 +442,10 @@ public class SSubmenuQuestUtil {
} }
List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>(); List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
Lobby lobby = FServer.getLobby(); starter.add(humanStart.setPlayer(GuiBase.getInterface().getQuestPlayer()));
starter.add(humanStart.setPlayer(lobby.getQuestPlayer()));
LobbyPlayer aiPlayer = FServer.getLobby().getAiPlayer(event.getOpponent() == null ? event.getTitle() : event.getOpponent()); LobbyPlayer aiPlayer = FControl.instance.getAiPlayer(event.getOpponent() == null ? event.getTitle() : event.getOpponent());
aiPlayer.setIconImageKey(event.getIconImageKey()); CMatchUI.SINGLETON_INSTANCE.avatarImages.put(aiPlayer, event.getIconImageKey());
starter.add(aiStart.setPlayer(aiPlayer)); starter.add(aiStart.setPlayer(aiPlayer));
boolean useRandomFoil = FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL); boolean useRandomFoil = FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL);

View File

@@ -1,5 +1,7 @@
package forge.screens.home.sanctioned; package forge.screens.home.sanctioned;
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.UiCommand; import forge.UiCommand;
import forge.Singletons; import forge.Singletons;
import forge.deck.CardPool; import forge.deck.CardPool;
@@ -8,17 +10,15 @@ import forge.deck.DeckSection;
import forge.deck.DeckType; import forge.deck.DeckType;
import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil;
import forge.game.GameType; import forge.game.GameType;
import forge.game.player.LobbyPlayer;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.interfaces.IGuiBase;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.menus.IMenuProvider; import forge.menus.IMenuProvider;
import forge.menus.MenuUtil; import forge.menus.MenuUtil;
import forge.model.CardCollections; import forge.model.CardCollections;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.toolbox.FList; 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>(); List<RegisteredPlayer> players = new ArrayList<RegisteredPlayer>();
for (final int i : view.getParticipants()) { for (final int i : view.getParticipants()) {
String name = view.getPlayerName(i); String name = view.getPlayerName(i);
LobbyPlayer lobbyPlayer = view.isPlayerAI(i) ? lobby.getAiPlayer(name, LobbyPlayer lobbyPlayer = view.isPlayerAI(i)
view.getPlayerAvatar(i)) : lobby.getGuiPlayer(); ? fc.createAiPlayer(name, view.getPlayerAvatar(i))
: fc.getGuiPlayer();
RegisteredPlayer rp = view.getDeckChooser(i).getPlayer(); RegisteredPlayer rp = view.getDeckChooser(i).getPlayer();
if (variantTypes.isEmpty()) { if (variantTypes.isEmpty()) {

View File

@@ -1,5 +1,6 @@
package forge.screens.home.sanctioned; package forge.screens.home.sanctioned;
import forge.GuiBase;
import forge.UiCommand; import forge.UiCommand;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
@@ -15,8 +16,6 @@ import forge.itemmanager.ItemManagerConfig;
import forge.limited.BoosterDraft; import forge.limited.BoosterDraft;
import forge.limited.LimitedPoolType; import forge.limited.LimitedPoolType;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.screens.deckeditor.CDeckEditorUI; import forge.screens.deckeditor.CDeckEditorUI;
import forge.screens.deckeditor.controllers.CEditorDraftingProcess; import forge.screens.deckeditor.controllers.CEditorDraftingProcess;
@@ -138,11 +137,10 @@ public enum CSubmenuDraft implements ICDoc {
} }
List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>(); List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
Lobby lobby = FServer.getLobby(); starter.add(new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GuiBase.getInterface().getGuiPlayer()));
starter.add(new RegisteredPlayer(humanDeck.getDeck()).setPlayer(lobby.getGuiPlayer())); starter.add(new RegisteredPlayer(aiDeck).setPlayer(GuiBase.getInterface().createAiPlayer()));
starter.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer()));
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.deck.DeckType;
import forge.game.GameType; import forge.game.GameType;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.player.LobbyPlayer.PlayerType;
import forge.gui.CardDetailPanel; import forge.gui.CardDetailPanel;
import forge.deck.DeckProxy; import forge.deck.DeckProxy;
import forge.deckchooser.DecksComboBoxEvent; import forge.deckchooser.DecksComboBoxEvent;
@@ -442,7 +441,7 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
public FCheckBox getCbArtifacts() { return cbArtifacts; } public FCheckBox getCbArtifacts() { return cbArtifacts; }
public boolean isPlayerAI(int playernum) { public boolean isPlayerAI(int playernum) {
return playerPanels.get(playernum).getPlayerType() == PlayerType.COMPUTER; return playerPanels.get(playernum).isAi();
} }
public int getNumPlayers() { public int getNumPlayers() {
@@ -685,8 +684,8 @@ public enum VSubmenuConstructed implements IVSubmenu<CSubmenuConstructed> {
} }
} }
public PlayerType getPlayerType() { public Boolean isAi() {
return radioAi.isSelected() ? PlayerType.COMPUTER : PlayerType.HUMAN; return radioAi.isSelected();
} }
public void setVanguardButtonText(String text) { 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.EventBus;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.UiCommand; import forge.UiCommand;
import forge.FThreads; import forge.FThreads;
import forge.ImageCache; import forge.ImageCache;
@@ -34,7 +36,6 @@ import forge.game.GameEntity;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.combat.Combat; import forge.game.combat.Combat;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
@@ -42,7 +43,6 @@ import forge.gui.framework.*;
import forge.item.InventoryItem; import forge.item.InventoryItem;
import forge.menus.IMenuProvider; import forge.menus.IMenuProvider;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.screens.match.controllers.*; import forge.screens.match.controllers.*;
import forge.screens.match.menus.CMatchUIMenus; import forge.screens.match.menus.CMatchUIMenus;
@@ -78,6 +78,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
private EventBus uiEvents; private EventBus uiEvents;
private IVDoc<? extends ICDoc> selectedDocBeforeCombat; private IVDoc<? extends ICDoc> selectedDocBeforeCombat;
private MatchUiEventVisitor visitor = new MatchUiEventVisitor(); private MatchUiEventVisitor visitor = new MatchUiEventVisitor();
public final Map<LobbyPlayer, String> avatarImages = new HashMap<LobbyPlayer, String>();
private CMatchUI() { private CMatchUI() {
uiEvents = new EventBus("ui events"); uiEvents = new EventBus("ui events");
@@ -87,8 +88,9 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
private SkinImage getPlayerAvatar(final Player p, final int defaultIndex) { private SkinImage getPlayerAvatar(final Player p, final int defaultIndex) {
LobbyPlayer lp = p.getLobbyPlayer(); 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(); int avatarIdx = lp.getAvatarIndex();
@@ -467,7 +469,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
public void undo() { public void undo() {
Game game = Singletons.getControl().getObservedGame(); Game game = Singletons.getControl().getObservedGame();
Player player = game.getPhaseHandler().getPriorityPlayer(); Player player = game.getPhaseHandler().getPriorityPlayer();
if (player != null && player.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (player != null && player.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer()) {
game.stack.undo(); game.stack.undo();
} }
} }

View File

@@ -19,19 +19,19 @@ package forge.screens.match;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.Singletons; import forge.Singletons;
import forge.assets.FSkinProp; import forge.assets.FSkinProp;
import forge.control.FControl;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.Game; import forge.game.Game;
import forge.game.GameType; import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.player.LobbyPlayer;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import forge.toolbox.FLabel; import forge.toolbox.FLabel;
import forge.toolbox.FSkin; import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.FSkin.SkinnedPanel;
@@ -88,7 +88,7 @@ public class GauntletWinLose extends ControlWinLose {
// the player can restart Forge to replay a match. // the player can restart Forge to replay a match.
// Pretty sure this can't be fixed until in-game states can be // Pretty sure this can't be fixed until in-game states can be
// saved. Doublestrike 07-10-12 // saved. Doublestrike 07-10-12
LobbyPlayer questPlayer = FServer.getLobby().getQuestPlayer(); LobbyPlayer questPlayer = GuiBase.getInterface().getQuestPlayer();
// In all cases, update stats. // In all cases, update stats.
lstEventRecords.set(gd.getCompleted(), match.getGamesWonBy(questPlayer) + " - " lstEventRecords.set(gd.getCompleted(), match.getGamesWonBy(questPlayer) + " - "
@@ -202,14 +202,14 @@ public class GauntletWinLose extends ControlWinLose {
GauntletData gd = FModel.getGauntletData(); GauntletData gd = FModel.getGauntletData();
Deck aiDeck = gd.getDecks().get(gd.getCompleted()); Deck aiDeck = gd.getDecks().get(gd.getCompleted());
List<RegisteredPlayer> players = Lists.newArrayList(); List<RegisteredPlayer> players = Lists.newArrayList();
Lobby lobby = FServer.getLobby(); FControl fc = Singletons.getControl();
players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer()));
players.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); players.add(new RegisteredPlayer(aiDeck).setPlayer(fc.getAiPlayer()));
saveOptions(); saveOptions();
Singletons.getControl().endCurrentGame(); fc.endCurrentGame();
Singletons.getControl().startMatch(GameType.Gauntlet, players); fc.startMatch(GameType.Gauntlet, players);
} else { } else {
super.actionOnContinue(); super.actionOnContinue();
} }

View File

@@ -17,11 +17,12 @@ package forge.screens.match;
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.game.Game; import forge.game.Game;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.limited.GauntletMini; import forge.limited.GauntletMini;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.toolbox.FSkin; import forge.toolbox.FSkin;
import forge.toolbox.FSkin.SkinnedLabel; import forge.toolbox.FSkin.SkinnedLabel;
@@ -46,6 +47,7 @@ public class LimitedWinLose extends ControlWinLose {
private SkinnedLabel lblTemp1; private SkinnedLabel lblTemp1;
private SkinnedLabel lblTemp2; private SkinnedLabel lblTemp2;
private LobbyPlayer guiPlayer;
/** /**
* Instantiates a new limited mode win/lose handler. * Instantiates a new limited mode win/lose handler.
@@ -57,7 +59,8 @@ public class LimitedWinLose extends ControlWinLose {
super(view0, lastGame); super(view0, lastGame);
this.view = view0; this.view = view0;
gauntlet = FModel.getGauntletMini(); 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(); resetView();
nextRound = false; nextRound = false;
if (lastGame.getOutcome().isWinner(FServer.getLobby().getGuiPlayer())) { if (lastGame.getOutcome().isWinner(guiPlayer)) {
gauntlet.addWin(); gauntlet.addWin();
} else { } else {
gauntlet.addLoss(); gauntlet.addLoss();

View File

@@ -16,6 +16,8 @@
*/ */
package forge.screens.match; package forge.screens.match;
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.Singletons; import forge.Singletons;
import forge.assets.FSkinProp; import forge.assets.FSkinProp;
import forge.card.CardEdition; import forge.card.CardEdition;
@@ -31,7 +33,6 @@ import forge.gui.SOverlayUtils;
import forge.gui.framework.FScreen; import forge.gui.framework.FScreen;
import forge.item.*; import forge.item.*;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.quest.*; import forge.quest.*;
import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestItemType;
@@ -92,7 +93,7 @@ public class QuestWinLose extends ControlWinLose {
this.view = view0; this.view = view0;
qData = FModel.getQuest(); qData = FModel.getQuest();
qEvent = qData.getCurrentEvent(); 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); this.isAnte = FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE);
} }
@@ -117,7 +118,7 @@ public class QuestWinLose extends ControlWinLose {
qc.getCards().getShopList(); qc.getCards().getShopList();
} }
final LobbyPlayer questLobbyPlayer = FServer.getLobby().getQuestPlayer(); final LobbyPlayer questLobbyPlayer = GuiBase.getInterface().getQuestPlayer();
Player questPlayer = null; Player questPlayer = null;
for (Player p : lastGame.getRegisteredPlayers()) { for (Player p : lastGame.getRegisteredPlayers()) {
if (p.getLobbyPlayer().equals(questLobbyPlayer)) { if (p.getLobbyPlayer().equals(questLobbyPlayer)) {
@@ -321,7 +322,7 @@ public class QuestWinLose extends ControlWinLose {
boolean hasNeverLost = true; boolean hasNeverLost = true;
int lifeDifferenceCredits = 0; int lifeDifferenceCredits = 0;
LobbyPlayer localHuman = FServer.getLobby().getQuestPlayer(); LobbyPlayer localHuman = GuiBase.getInterface().getQuestPlayer();
for (final GameOutcome game : lastGame.getMatch().getPlayedGames()) { for (final GameOutcome game : lastGame.getMatch().getPlayedGames()) {
if (!game.isWinner(localHuman)) { if (!game.isWinner(localHuman)) {
hasNeverLost = false; hasNeverLost = false;

View File

@@ -194,7 +194,7 @@ public class VAssignDamage {
fakeCard.setName(this.defender.getName()); fakeCard.setName(this.defender.getName());
fakeCard.setOwner((Player)defender); fakeCard.setOwner((Player)defender);
Player p = (Player)defender; Player p = (Player)defender;
fakeCard.setImageKey(p.getLobbyPlayer().getIconImageKey()); fakeCard.setImageKey(CMatchUI.SINGLETON_INSTANCE.avatarImages.get(p.getOriginalLobbyPlayer()));
} else { } else {
fakeCard = new Card(-2); fakeCard = new Card(-2);
fakeCard.setName(this.defender.getName()); fakeCard.setName(this.defender.getName());

View File

@@ -1,11 +1,11 @@
package forge.screens.match.controllers; package forge.screens.match.controllers;
import forge.GuiBase;
import forge.UiCommand; import forge.UiCommand;
import forge.Singletons; import forge.Singletons;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.screens.match.views.VDev; 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)); FModel.getPreferences().setPref(FPref.DEV_UNLIMITED_LAND, String.valueOf(newValue));
for(Player p : Singletons.getControl().getObservedGame().getPlayers()) { for(Player p : Singletons.getControl().getObservedGame().getPlayers()) {
if( p.getLobbyPlayer() == FServer.getLobby().getGuiPlayer() ) if( p.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer() )
p.canCheatPlayUnlimitedLands = newValue; p.canCheatPlayUnlimitedLands = newValue;
} }
// probably will need to call a synchronized method to have the game thread see changed value of the variable // 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; package forge.screens.match.controllers;
import forge.LobbyPlayer;
import forge.UiCommand; import forge.UiCommand;
import forge.FThreads; import forge.FThreads;
import forge.Singletons; import forge.Singletons;
@@ -30,7 +31,6 @@ import forge.game.combat.Combat;
import forge.game.combat.CombatUtil; import forge.game.combat.CombatUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;

View File

@@ -19,10 +19,10 @@ package forge.screens.match.controllers;
import com.google.common.base.Function; import com.google.common.base.Function;
import forge.LobbyPlayer;
import forge.UiCommand; import forge.UiCommand;
import forge.Singletons; import forge.Singletons;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;

View File

@@ -1,7 +1,7 @@
package forge.screens.match.controllers; package forge.screens.match.controllers;
import forge.LobbyPlayer;
import forge.UiCommand; import forge.UiCommand;
import forge.game.player.LobbyPlayer;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;

View File

@@ -17,7 +17,7 @@
*/ */
package forge.screens.match.views; package forge.screens.match.views;
import forge.game.player.LobbyPlayer; import forge.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.framework.DragCell; import forge.gui.framework.DragCell;

View File

@@ -20,8 +20,8 @@ package forge.screens.match.views;
import forge.ImageCache; import forge.ImageCache;
import forge.card.CardDetailUtil; import forge.card.CardDetailUtil;
import forge.card.CardDetailUtil.DetailColors; import forge.card.CardDetailUtil.DetailColors;
import forge.LobbyPlayer;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;

View File

@@ -22,7 +22,6 @@ import forge.GuiDesktop;
import forge.Singletons; import forge.Singletons;
import forge.card.CardReaderExperiments; import forge.card.CardReaderExperiments;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
/** /**
* Main class for Forge's swing application view. * Main class for Forge's swing application view.
@@ -55,7 +54,7 @@ public final class Main {
switch(mode) { switch(mode) {
case "sim": case "sim":
FServer.simulateMatches(args); SimulateMatch.simulate(args);
break; break;
case "parse": case "parse":

View File

@@ -1,124 +1,86 @@
package forge.net; package forge.view;
import com.google.common.base.Supplier; import java.io.File;
import java.util.ArrayList;
import forge.deck.Deck; import java.util.Collections;
import forge.deck.io.DeckSerializer; import java.util.List;
import forge.game.*;
import forge.game.player.LobbyPlayer; import org.apache.commons.lang3.time.StopWatch;
import forge.game.player.RegisteredPlayer;
import forge.model.FModel; import forge.GuiBase;
import forge.player.LobbyPlayerHuman; import forge.deck.Deck;
import forge.util.Lang; import forge.deck.io.DeckSerializer;
import forge.game.Game;
import org.apache.commons.lang3.time.StopWatch; import forge.game.GameLogEntry;
import forge.game.GameRules;
import java.io.File; import forge.game.GameType;
import java.util.ArrayList; import forge.game.Match;
import java.util.Collections; import forge.game.player.RegisteredPlayer;
import java.util.List; import forge.model.FModel;
import forge.util.Lang;
public class FServer { public class SimulateMatch {
private FServer() { public static void simulate(String[] args) {
FModel.initialize(null);
}
System.out.println("Simulation mode");
private static boolean interactiveMode = true; if(args.length < 3 ) {
private static Lobby lobby = null; System.out.println("Syntax: forge.exe sim <deck1[.dck]> <deck2[.dck]> [N]");
System.out.println("\tsim - stands for simulation mode");
public static Lobby getLobby() { System.out.println("\tdeck1 (or deck2) - constructed deck name or filename (has to be quoted when contains multiple words)");
if (lobby == null) { System.out.println("\tdeck is treated as file if it ends with a dot followed by three numbers or letters");
//not a very good solution still System.out.println("\tN - number of games, defaults to 1");
lobby = new Lobby(new Supplier<LobbyPlayer>() { return;
@Override }
public LobbyPlayer get() { Deck d1 = deckFromCommandLineParameter(args[1]);
// TODO Auto-generated method stub Deck d2 = deckFromCommandLineParameter(args[2]);
return new LobbyPlayerHuman("Human"); if(d1 == null || d2 == null) {
} System.out.println("One of decks could not be loaded, match cannot start");
}); return;
} }
return lobby;
} 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")));
* TODO: Write javadoc for this method.
* @return List<RegisteredPlayer> pp = new ArrayList<RegisteredPlayer>();
*/ pp.add(new RegisteredPlayer(d1).setPlayer(GuiBase.getInterface().createAiPlayer("Ai-" + d1.getName(), 0)));
private static final NetServer server = new NetServer(); pp.add(new RegisteredPlayer(d2).setPlayer(GuiBase.getInterface().createAiPlayer("Ai_" + d2.getName(), 1)));
public static NetServer getServer() { GameRules rules = new GameRules(GameType.Constructed);
// TODO Auto-generated method stub Match mc = new Match(rules, pp);
return server; for(int iGame = 0; iGame < nGames; iGame++)
} simulateSingleMatch(mc, iGame);
System.out.flush();
public static void simulateMatches(String[] args) { }
FModel.initialize(null); /**
* TODO: Write javadoc for this method.
interactiveMode = false; * @param sw
System.out.println("Simulation mode"); * @param pp
if(args.length < 3 ) { */
System.out.println("Syntax: forge.exe sim <deck1[.dck]> <deck2[.dck]> [N]"); private static void simulateSingleMatch(Match mc, int iGame) {
System.out.println("\tsim - stands for simulation mode"); StopWatch sw = new StopWatch();
System.out.println("\tdeck1 (or deck2) - constructed deck name or filename (has to be quoted when contains multiple words)"); sw.start();
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"); Game g1 = mc.createGame();
return; // will run match in the same thread
} mc.startGame(g1);
Deck d1 = deckFromCommandLineParameter(args[1]); sw.stop();
Deck d2 = deckFromCommandLineParameter(args[2]);
if(d1 == null || d2 == null) { List<GameLogEntry> log = g1.getGameLog().getLogEntries(null);
System.out.println("One of decks could not be loaded, match cannot start"); Collections.reverse(log);
return;
} for(GameLogEntry l : log)
System.out.println(l);
int nGames = args.length >= 4 ? Integer.parseInt(args[3]) : 1;
System.out.println(String.format("\nGame %d ended in %d ms. %s has won!\n", 1+iGame, sw.getTime(), g1.getOutcome().getWinningLobbyPlayer().getName()));
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()))); private static Deck deckFromCommandLineParameter(String deckname) {
pp.add(new RegisteredPlayer(d2).setPlayer(getLobby().getAiPlayer("Ai_" + d2.getName()))); int dotpos = deckname.lastIndexOf('.');
GameRules rules = new GameRules(GameType.Constructed); if(dotpos > 0 && dotpos == deckname.length()-4)
Match mc = new Match(rules, pp); return DeckSerializer.fromFile(new File(deckname));
for(int iGame = 0; iGame < nGames; iGame++) return FModel.getDecks().getConstructed().get(deckname);
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<GameLogEntry> 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;
}
}

View File

@@ -1,10 +1,12 @@
package forge.gamesimulationtests.util; package forge.gamesimulationtests.util;
import forge.LobbyPlayer;
import forge.game.Game; import forge.game.Game;
import forge.game.player.LobbyPlayer; import forge.game.player.IGameEntitiesFactory;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;
import forge.gamesimulationtests.util.playeractions.PlayerActions; import forge.gamesimulationtests.util.playeractions.PlayerActions;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.HashMap; import java.util.HashMap;
@@ -14,7 +16,7 @@ import java.util.Map;
* Default harmless implementation for tests. * Default harmless implementation for tests.
* Test-specific behaviour can easily be added by mocking (parts of) this class. * 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 Map<Player, PlayerControllerForTests> playerControllers;
private final PlayerActions playerActions; private final PlayerActions playerActions;
@@ -24,12 +26,6 @@ public class LobbyPlayerForTests extends LobbyPlayer {
this.playerActions = playerActions; 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 @Override
public Player createIngamePlayer( Game gameState ) { 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.Iterables;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import forge.LobbyPlayer;
import forge.ai.ComputerUtil; import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilMana; import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi; import forge.ai.SpellAbilityAi;
@@ -31,7 +32,6 @@ import forge.game.cost.CostPart;
import forge.game.cost.CostPartMana; import forge.game.cost.CostPartMana;
import forge.game.mana.Mana; import forge.game.mana.Mana;
import forge.game.mana.ManaCostBeingPaid; import forge.game.mana.ManaCostBeingPaid;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerActionConfirmMode;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;

View File

@@ -28,7 +28,6 @@ import forge.game.combat.Combat;
import forge.game.event.GameEventTurnBegan; import forge.game.event.GameEventTurnBegan;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -215,6 +214,8 @@ public class GuiMobile implements IGuiBase {
public void startMatch(GameType gameType, List<RegisteredPlayer> players) { public void startMatch(GameType gameType, List<RegisteredPlayer> players) {
FControl.startMatch(gameType, players); FControl.startMatch(gameType, players);
} }
@Override @Override
public void setPanelSelection(Card c) { public void setPanelSelection(Card c) {
@@ -341,4 +342,27 @@ public class GuiMobile implements IGuiBase {
public void browseToUrl(String url) throws Exception { public void browseToUrl(String url) throws Exception {
Gdx.net.openURI(url); 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 com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import forge.Forge; import forge.Forge;
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.Forge.Graphics; import forge.Forge.Graphics;
import forge.assets.FSkin; import forge.assets.FSkin;
import forge.assets.FSkinColor; import forge.assets.FSkinColor;
@@ -22,13 +24,10 @@ import forge.deck.DeckType;
import forge.deck.DeckgenUtil; import forge.deck.DeckgenUtil;
import forge.deck.FDeckChooser; import forge.deck.FDeckChooser;
import forge.game.GameType; import forge.game.GameType;
import forge.game.player.LobbyPlayer;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.model.CardCollections; import forge.model.CardCollections;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.screens.FScreen; import forge.screens.FScreen;
@@ -261,12 +260,11 @@ public class ConstructedScreen extends LaunchScreen {
} }
} }
Lobby lobby = FServer.getLobby();
for (int i = 0; i < getNumPlayers(); i++) { for (int i = 0; i < getNumPlayers(); i++) {
PlayerPanel playerPanel = playerPanels.get(i); PlayerPanel playerPanel = playerPanels.get(i);
String name = getPlayerName(i); String name = getPlayerName(i);
LobbyPlayer lobbyPlayer = playerPanel.isPlayerAI() ? lobby.getAiPlayer(name, LobbyPlayer lobbyPlayer = playerPanel.isPlayerAI() ? GuiBase.getInterface().createAiPlayer(name,
getPlayerAvatar(i)) : lobby.getGuiPlayer(); getPlayerAvatar(i)) : GuiBase.getInterface().getGuiPlayer();
RegisteredPlayer rp = playerPanel.deckChooser.getPlayer(); RegisteredPlayer rp = playerPanel.deckChooser.getPlayer();
if (appliedVariants.isEmpty()) { if (appliedVariants.isEmpty()) {

View File

@@ -21,6 +21,10 @@ import com.google.common.eventbus.Subscribe;
import forge.FThreads; import forge.FThreads;
import forge.Forge; import forge.Forge;
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.ai.AiProfileUtil;
import forge.ai.LobbyPlayerAi;
import forge.card.CardCharacteristicName; import forge.card.CardCharacteristicName;
import forge.control.FControlGameEventHandler; import forge.control.FControlGameEventHandler;
import forge.control.FControlGamePlayback; import forge.control.FControlGamePlayback;
@@ -41,7 +45,6 @@ import forge.game.combat.Combat;
import forge.game.combat.CombatUtil; import forge.game.combat.CombatUtil;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.game.trigger.TriggerType; import forge.game.trigger.TriggerType;
@@ -50,7 +53,7 @@ import forge.game.zone.ZoneType;
import forge.match.input.InputProxy; import forge.match.input.InputProxy;
import forge.match.input.InputQueue; import forge.match.input.InputQueue;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer; import forge.player.LobbyPlayerHuman;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.screens.match.views.VAssignDamage; import forge.screens.match.views.VAssignDamage;
@@ -61,6 +64,9 @@ import forge.screens.match.views.VPlayerPanel;
import forge.toolbox.FCardPanel; import forge.toolbox.FCardPanel;
import forge.toolbox.FOptionPane; import forge.toolbox.FOptionPane;
import forge.util.Callback; import forge.util.Callback;
import forge.util.GuiDisplayUtil;
import forge.util.MyRandom;
import forge.util.NameGenerator;
public class FControl { public class FControl {
private FControl() { } //don't allow creating instance private FControl() { } //don't allow creating instance
@@ -136,7 +142,7 @@ public class FControl {
// Add playback controls to match if needed // Add playback controls to match if needed
gameHasHumanPlayer = false; gameHasHumanPlayer = false;
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
if (p.getController().getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (p.getController().getLobbyPlayer() == getGuiPlayer()) {
gameHasHumanPlayer = true; gameHasHumanPlayer = true;
} }
} }
@@ -281,13 +287,13 @@ public class FControl {
public static Player getCurrentPlayer() { public static Player getCurrentPlayer() {
// try current priority // try current priority
Player currentPriority = game.getPhaseHandler().getPriorityPlayer(); Player currentPriority = game.getPhaseHandler().getPriorityPlayer();
if (null != currentPriority && currentPriority.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (null != currentPriority && currentPriority.getLobbyPlayer() == getGuiPlayer()) {
return currentPriority; return currentPriority;
} }
// otherwise find just any player, belonging to this lobbyplayer // otherwise find just any player, belonging to this lobbyplayer
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
if (p.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (p.getLobbyPlayer() == getGuiPlayer()) {
return p; return p;
} }
} }
@@ -434,7 +440,7 @@ public class FControl {
public static void undoLastAction() { public static void undoLastAction() {
Game game = getGame(); Game game = getGame();
Player player = game.getPhaseHandler().getPriorityPlayer(); Player player = game.getPhaseHandler().getPriorityPlayer();
if (player != null && player.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (player != null && player.getLobbyPlayer() == getGuiPlayer()) {
game.stack.undo(); game.stack.undo();
} }
} }
@@ -457,7 +463,7 @@ public class FControl {
public static void stopGame() { public static void stopGame() {
List<Player> pp = new ArrayList<Player>(); List<Player> pp = new ArrayList<Player>();
for (Player p : game.getPlayers()) { for (Player p : game.getPlayers()) {
if (p.getOriginalLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (p.getOriginalLobbyPlayer() == getGuiPlayer()) {
pp.add(p); pp.add(p);
} }
} }
@@ -472,7 +478,7 @@ public class FControl {
} }
Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer(); Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer();
boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == FServer.getLobby().getGuiPlayer(); boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == getGuiPlayer();
if (hasHuman && humanHasPriority) { if (hasHuman && humanHasPriority) {
game.getAction().checkGameOverCondition(); 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.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT));
fvHuman.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP)); 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.List;
import java.util.Map; import java.util.Map;
import forge.LobbyPlayer;
import forge.menu.FMenuBar; import forge.menu.FMenuBar;
import forge.screens.FScreen; import forge.screens.FScreen;
import forge.screens.match.views.VAvatar; import forge.screens.match.views.VAvatar;
@@ -20,7 +21,6 @@ import forge.assets.FSkinColor;
import forge.assets.FSkinTexture; import forge.assets.FSkinTexture;
import forge.assets.FSkinColor.Colors; import forge.assets.FSkinColor.Colors;
import forge.game.Game; import forge.game.Game;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.toolbox.FEvent; import forge.toolbox.FEvent;

View File

@@ -1,10 +1,10 @@
package forge.screens.match.views; package forge.screens.match.views;
import forge.GuiBase;
import forge.game.player.Player; import forge.game.player.Player;
import forge.menu.FDropDownMenu; import forge.menu.FDropDownMenu;
import forge.menu.FMenuItem; import forge.menu.FMenuItem;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.screens.match.FControl; import forge.screens.match.FControl;
@@ -90,7 +90,7 @@ public class VDevMenu extends FDropDownMenu {
boolean unlimitedLands = !prefs.getPrefBoolean(FPref.DEV_UNLIMITED_LAND); boolean unlimitedLands = !prefs.getPrefBoolean(FPref.DEV_UNLIMITED_LAND);
for (Player p : FControl.getGame().getPlayers()) { for (Player p : FControl.getGame().getPlayers()) {
if (p.getLobbyPlayer() == FServer.getLobby().getGuiPlayer() ) { if (p.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer() ) {
p.canCheatPlayUnlimitedLands = unlimitedLands; p.canCheatPlayUnlimitedLands = unlimitedLands;
} }
} }

View File

@@ -5,6 +5,7 @@ import java.util.List;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import forge.GuiBase;
import forge.Forge.Graphics; import forge.Forge.Graphics;
import forge.assets.FSkinColor; import forge.assets.FSkinColor;
import forge.assets.FSkinFont; import forge.assets.FSkinFont;
@@ -15,7 +16,6 @@ import forge.game.mana.ManaPool;
import forge.game.player.Player; import forge.game.player.Player;
import forge.match.input.Input; import forge.match.input.Input;
import forge.match.input.InputPayMana; import forge.match.input.InputPayMana;
import forge.net.FServer;
import forge.screens.match.FControl; import forge.screens.match.FControl;
import forge.toolbox.FDisplayObject; import forge.toolbox.FDisplayObject;
@@ -85,7 +85,7 @@ public class VManaPool extends VDisplayArea {
@Override @Override
public boolean tap(float x, float y, int count) { 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(); final Input input = FControl.getInputQueue().getInput();
if (input instanceof InputPayMana) { if (input instanceof InputPayMana) {
// Do something // Do something

View File

@@ -3,6 +3,7 @@ package forge.screens.match.views;
import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import forge.LobbyPlayer;
import forge.Forge.Graphics; import forge.Forge.Graphics;
import forge.assets.FSkinColor; import forge.assets.FSkinColor;
import forge.assets.FSkinFont; import forge.assets.FSkinFont;
@@ -10,7 +11,6 @@ import forge.assets.ImageCache;
import forge.card.CardDetailUtil; import forge.card.CardDetailUtil;
import forge.card.CardDetailUtil.DetailColors; import forge.card.CardDetailUtil.DetailColors;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.player.LobbyPlayer;
import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;
import forge.menu.FDropDown; 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.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.GuiBase;
import forge.LobbyPlayer;
import forge.assets.FSkinColor; import forge.assets.FSkinColor;
import forge.assets.FSkinColor.Colors; import forge.assets.FSkinColor.Colors;
import forge.assets.FSkinImage; import forge.assets.FSkinImage;
@@ -28,13 +30,11 @@ import forge.deck.Deck;
import forge.game.Game; import forge.game.Game;
import forge.game.GameType; import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.player.LobbyPlayer;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.gauntlet.GauntletData; import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO; import forge.gauntlet.GauntletIO;
import forge.interfaces.IGuiBase;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import forge.screens.match.FControl; import forge.screens.match.FControl;
import forge.toolbox.FLabel; import forge.toolbox.FLabel;
import forge.toolbox.FPanel; import forge.toolbox.FPanel;
@@ -87,7 +87,7 @@ public class GauntletWinLose extends ControlWinLose {
// the player can restart Forge to replay a match. // the player can restart Forge to replay a match.
// Pretty sure this can't be fixed until in-game states can be // Pretty sure this can't be fixed until in-game states can be
// saved. Doublestrike 07-10-12 // saved. Doublestrike 07-10-12
LobbyPlayer questPlayer = FServer.getLobby().getQuestPlayer(); LobbyPlayer questPlayer = GuiBase.getInterface().getQuestPlayer();
// In all cases, update stats. // In all cases, update stats.
lstEventRecords.set(gd.getCompleted(), match.getGamesWonBy(questPlayer) + " - " lstEventRecords.set(gd.getCompleted(), match.getGamesWonBy(questPlayer) + " - "
@@ -192,9 +192,9 @@ public class GauntletWinLose extends ControlWinLose {
GauntletData gd = FModel.getGauntletData(); GauntletData gd = FModel.getGauntletData();
Deck aiDeck = gd.getDecks().get(gd.getCompleted()); Deck aiDeck = gd.getDecks().get(gd.getCompleted());
List<RegisteredPlayer> players = Lists.newArrayList(); List<RegisteredPlayer> players = Lists.newArrayList();
Lobby lobby = FServer.getLobby(); IGuiBase fc = GuiBase.getInterface();
players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(lobby.getGuiPlayer())); players.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(fc.getGuiPlayer()));
players.add(new RegisteredPlayer(aiDeck).setPlayer(lobby.getAiPlayer())); players.add(new RegisteredPlayer(aiDeck).setPlayer(fc.createAiPlayer()));
saveOptions(); saveOptions();
FControl.endCurrentGame(); FControl.endCurrentGame();

View File

@@ -19,10 +19,10 @@ package forge.screens.match.winlose;
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
import forge.GuiBase;
import forge.game.Game; import forge.game.Game;
import forge.limited.GauntletMini; import forge.limited.GauntletMini;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.toolbox.FLabel; import forge.toolbox.FLabel;
/** /**
@@ -46,7 +46,7 @@ public class LimitedWinLose extends ControlWinLose {
super(view0, lastGame); super(view0, lastGame);
this.view = view0; this.view = view0;
gauntlet = FModel.getGauntletMini(); 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(); resetView();
nextRound = false; nextRound = false;
if (lastGame.getOutcome().isWinner(FServer.getLobby().getGuiPlayer())) { if (lastGame.getOutcome().isWinner(GuiBase.getInterface().getGuiPlayer())) {
gauntlet.addWin(); gauntlet.addWin();
} }
else { else {

View File

@@ -51,20 +51,5 @@
<artifactId>freemarker</artifactId> <artifactId>freemarker</artifactId>
<version>2.3.20</version> <version>2.3.20</version>
</dependency> </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> </dependencies>
</project> </project>

View File

@@ -12,7 +12,6 @@ import forge.game.player.Player;
import forge.game.zone.PlayerZone; import forge.game.zone.PlayerZone;
import forge.game.zone.Zone; import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.net.FServer;
import forge.util.Lang; import forge.util.Lang;
import forge.util.maps.MapOfLists; import forge.util.maps.MapOfLists;
@@ -254,7 +253,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
@Override @Override
public Void visit(GameEventAttackersDeclared event) { public Void visit(GameEventAttackersDeclared event) {
// Skip redraw for GUI player? // Skip redraw for GUI player?
if (event.player.getLobbyPlayer() == FServer.getLobby().getGuiPlayer()) { if (event.player.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer()) {
return null; return null;
} }

View File

@@ -10,6 +10,7 @@ import org.apache.commons.lang3.tuple.Pair;
import com.google.common.base.Function; import com.google.common.base.Function;
import forge.LobbyPlayer;
import forge.assets.FSkinProp; import forge.assets.FSkinProp;
import forge.assets.ISkinImage; import forge.assets.ISkinImage;
import forge.events.UiEvent; import forge.events.UiEvent;
@@ -20,7 +21,6 @@ import forge.game.card.Card;
import forge.game.combat.Combat; import forge.game.combat.Combat;
import forge.game.event.GameEventTurnBegan; import forge.game.event.GameEventTurnBegan;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
@@ -79,4 +79,8 @@ public interface IGuiBase {
int getAvatarCount(); int getAvatarCount();
void copyToClipboard(String text); void copyToClipboard(String text);
void browseToUrl(String url) throws Exception; 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.deck.Deck;
import forge.game.GameType; import forge.game.GameType;
import forge.game.player.RegisteredPlayer; import forge.game.player.RegisteredPlayer;
import forge.interfaces.IGuiBase;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.net.Lobby;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -152,11 +151,11 @@ public class GauntletMini {
*/ */
private void startRound() { private void startRound() {
List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>(); List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
Lobby lobby = FServer.getLobby(); IGuiBase fc = GuiBase.getInterface();
starter.add(new RegisteredPlayer(humanDeck).setPlayer(lobby.getGuiPlayer())); starter.add(new RegisteredPlayer(humanDeck).setPlayer(fc.getGuiPlayer()));
starter.add(aiOpponents.get(currentRound - 1).setPlayer(lobby.getAiPlayer())); 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; package forge.player;
import forge.GuiBase; import forge.GuiBase;
import forge.LobbyPlayer;
import forge.game.Game; import forge.game.Game;
import forge.game.player.LobbyPlayer; import forge.game.player.IGameEntitiesFactory;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;
import forge.model.FModel; import forge.model.FModel;
@@ -10,15 +11,11 @@ import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.util.GuiDisplayUtil; import forge.util.GuiDisplayUtil;
public class LobbyPlayerHuman extends LobbyPlayer { public class LobbyPlayerHuman extends LobbyPlayer implements IGameEntitiesFactory {
public LobbyPlayerHuman(String name) { public LobbyPlayerHuman(String name) {
super(name); super(name);
} }
@Override
protected PlayerType getType() {
return PlayerType.HUMAN;
}
@Override @Override
public PlayerController createControllerFor(Player human) { 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.Lists;
import com.google.common.collect.Multimap; import com.google.common.collect.Multimap;
import forge.LobbyPlayer;
import forge.SOptionPane; import forge.SOptionPane;
import forge.GuiBase; import forge.GuiBase;
import forge.SGuiChoose; import forge.SGuiChoose;
@@ -32,7 +33,6 @@ import forge.game.cost.CostPart;
import forge.game.cost.CostPartMana; import forge.game.cost.CostPartMana;
import forge.game.mana.Mana; import forge.game.mana.Mana;
import forge.game.phase.PhaseType; import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerActionConfirmMode;
import forge.game.player.PlayerController; 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.base.Predicates;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import forge.GuiBase;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameFormat; import forge.game.GameFormat;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
@@ -28,7 +29,6 @@ import forge.game.event.GameEventMulligan;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.item.PreconDeck; import forge.item.PreconDeck;
import forge.model.FModel; import forge.model.FModel;
import forge.net.FServer;
import forge.properties.ForgeConstants; import forge.properties.ForgeConstants;
import forge.quest.bazaar.QuestBazaarManager; import forge.quest.bazaar.QuestBazaarManager;
import forge.quest.bazaar.QuestItemType; import forge.quest.bazaar.QuestItemType;
@@ -448,7 +448,7 @@ public class QuestController {
if (ev instanceof GameEventMulligan) { if (ev instanceof GameEventMulligan) {
GameEventMulligan mev = (GameEventMulligan) ev; GameEventMulligan mev = (GameEventMulligan) ev;
// First mulligan is free // 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) { && getAssets().hasItem(QuestItemType.SLEIGHT) && mev.player.getStats().getMulliganCount() == 0) {
mev.player.drawCard(); mev.player.drawCard();
} }

View File

@@ -1,5 +1,6 @@
package forge.sound; package forge.sound;
import forge.GuiBase;
import forge.events.IUiEventVisitor; import forge.events.IUiEventVisitor;
import forge.events.UiEventAttackerDeclared; import forge.events.UiEventAttackerDeclared;
import forge.events.UiEventBlockerAssigned; import forge.events.UiEventBlockerAssigned;
@@ -7,7 +8,6 @@ import forge.game.card.Card;
import forge.game.event.*; import forge.game.event.*;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.net.FServer;
import forge.util.maps.MapOfLists; import forge.util.maps.MapOfLists;
import java.util.Collection; 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(GameEventShuffle event) { return SoundEffectType.Shuffle; }
public SoundEffectType visit(GameEventTokenCreated event) { return SoundEffectType.Token; } public SoundEffectType visit(GameEventTokenCreated event) { return SoundEffectType.Token; }
public SoundEffectType visit(GameEventBlockersDeclared event) { public SoundEffectType visit(GameEventBlockersDeclared event) {
boolean isLocalHuman = event.defendingPlayer.getLobbyPlayer() == FServer.getLobby().getGuiPlayer(); boolean isLocalHuman = event.defendingPlayer.getLobbyPlayer() == GuiBase.getInterface().getGuiPlayer();
if (isLocalHuman) if (isLocalHuman)
return null; // already played sounds in interactive mode 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. * Plays the sound corresponding to the outcome of the duel.
*/ */
public SoundEffectType visit(GameEventGameOutcome event) { 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; return humanWonTheDuel ? SoundEffectType.WinDuel : SoundEffectType.LoseDuel;
} }

View File

@@ -27,6 +27,21 @@
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
<version>2.2.4</version> <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> </dependency>
</dependencies> </dependencies>
</project> </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; package forge.net;
import forge.LobbyPlayer;
import forge.game.Game; import forge.game.Game;
import forge.game.player.LobbyPlayer; import forge.game.player.IGameEntitiesFactory;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;
import forge.net.client.INetClient; import forge.net.client.INetClient;
import forge.net.protocol.toclient.ChatPacketClt; import forge.net.protocol.toclient.ChatPacketClt;
public class LobbyPlayerRemote extends LobbyPlayer { public class LobbyPlayerRemote extends LobbyPlayer implements IGameEntitiesFactory {
private final INetClient connection; private final INetClient connection;
@@ -16,11 +17,6 @@ public class LobbyPlayerRemote extends LobbyPlayer {
connection = netClient; connection = netClient;
} }
@Override
protected PlayerType getType() {
return PlayerType.REMOTE;
}
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.game.player.LobbyPlayer#getPlayer(forge.game.GameState) * @see forge.game.player.LobbyPlayer#getPlayer(forge.game.GameState)
*/ */

View File

@@ -1,6 +1,5 @@
package forge.net; package forge.net;
import forge.error.BugReporter;
import forge.net.client.NetClient; import forge.net.client.NetClient;
import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Connector;
@@ -71,7 +70,7 @@ public class NetServer {
_connection.sendMessage(data); _connection.sendMessage(data);
} }
catch (IOException e) { catch (IOException e) {
BugReporter.reportException(e); throw new RuntimeException(e);
} }
} }
@@ -110,7 +109,7 @@ public class NetServer {
String host = connector.getHost(); String host = connector.getHost();
serverUri = new URI(String.format("ws://%s:%d/", host == null ? "localhost" : host ,port)); serverUri = new URI(String.format("ws://%s:%d/", host == null ? "localhost" : host ,port));
} catch (Exception e) { } catch (Exception e) {
BugReporter.reportException(e); throw new RuntimeException(e);
} }
System.out.println("Server started @ " + serverUri); System.out.println("Server started @ " + serverUri);
@@ -125,7 +124,7 @@ public class NetServer {
srv.stop(); srv.stop();
portNumber = -1; portNumber = -1;
} catch (Exception e) { } catch (Exception e) {
BugReporter.reportException(e); throw new RuntimeException(e);
} }
} }

View File

@@ -1,6 +1,6 @@
package forge.net.client; package forge.net.client;
import forge.game.player.LobbyPlayer; import forge.LobbyPlayer;
import forge.net.client.state.IClientState; import forge.net.client.state.IClientState;
import forge.net.protocol.toclient.IPacketClt; import forge.net.protocol.toclient.IPacketClt;

View File

@@ -1,6 +1,6 @@
package forge.net.client; package forge.net.client;
import forge.game.player.LobbyPlayer; import forge.LobbyPlayer;
import forge.net.FServer; import forge.net.FServer;
import forge.net.IClientSocket; import forge.net.IClientSocket;
import forge.net.IConnectionObserver; import forge.net.IConnectionObserver;

View File

@@ -1,7 +1,5 @@
package forge.net.client.state; package forge.net.client.state;
import forge.control.ChatArea;
import forge.net.FServer;
import forge.net.client.INetClient; import forge.net.client.INetClient;
import forge.net.protocol.toserver.ChatPacketSrv; import forge.net.protocol.toserver.ChatPacketSrv;
import forge.net.protocol.toserver.IPacketSrv; import forge.net.protocol.toserver.IPacketSrv;
@@ -22,7 +20,7 @@ public class InLobbyClientState implements IClientState {
if( data instanceof ChatPacketSrv) { if( data instanceof ChatPacketSrv) {
ChatPacketSrv cp = (ChatPacketSrv) data; ChatPacketSrv cp = (ChatPacketSrv) data;
// if ( not muted ) // if ( not muted )
FServer.getLobby().speak(ChatArea.Room, client.getPlayer(), cp.getMessage()); // FServer.getLobby().speak(ChatArea.Room, client.getPlayer(), cp.getMessage());
// else // else
// client.send("You are banned and cannot speak"); // client.send("You are banned and cannot speak");
return true; return true;