added deck construction to draft

This commit is contained in:
BetaSteward 2011-01-09 23:33:22 -05:00
parent d62b512a72
commit c79758f0e5
19 changed files with 154 additions and 25 deletions

View file

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<?xml version="1.1" encoding="UTF-8" ?>
<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>

View file

@ -70,8 +70,22 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
jScrollPane1.getViewport().setOpaque(false);
}
public void loadCards(List<Card> cards, BigCard bigCard) {
this.bigCard = bigCard;
this.btnBooster.setVisible(false);
this.btnClear.setVisible(false);
this.cbExpansionSet.setVisible(false);
cards.clear();
for (Card card: cards) {
cards.add(card);
}
}
public void loadCards(BigCard bigCard) {
this.bigCard = bigCard;
this.btnBooster.setVisible(true);
this.btnClear.setVisible(true);
this.cbExpansionSet.setVisible(true);
Object[] l = Sets.getInstance().values().toArray();
Arrays.sort(l, new Comparator<Object>() {
@Override
@ -106,13 +120,21 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
private void filterCards() {
try {
List<Card> filteredCards = new ArrayList<Card>();
setCursor(new Cursor(Cursor.WAIT_CURSOR));
cards.clear();
for (Card card: CardsStorage.getAllCards()) {
if (filter.match(card))
cards.add(card);
if (!cards.isEmpty()) {
for (Card card: cards) {
if (filter.match(card))
filteredCards.add(card);
}
}
this.cardGrid.loadCards(new CardsView(cards), bigCard, null);
else {
for (Card card: CardsStorage.getAllCards()) {
if (filter.match(card))
filteredCards.add(card);
}
}
this.cardGrid.loadCards(new CardsView(filteredCards), bigCard, null);
}
finally {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
@ -466,7 +488,8 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnClearActionPerformed
cards.clear();
this.cardGrid.loadCards(new CardsView(cards), bigCard, null);
filterCards();
// this.cardGrid.loadCards(new CardsView(cards), bigCard, null);
}//GEN-LAST:event_btnClearActionPerformed
private void btnBoosterActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBoosterActionPerformed
@ -474,7 +497,8 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene
for (Card card: booster) {
cards.add(card);
}
this.cardGrid.loadCards(new CardsView(cards), bigCard, null);
filterCards();
// this.cardGrid.loadCards(new CardsView(cards), bigCard, null);
}//GEN-LAST:event_btnBoosterActionPerformed

View file

@ -52,6 +52,7 @@ import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -70,6 +71,7 @@ public class DeckEditorPanel extends javax.swing.JPanel {
private boolean isShowCardInfo = false;
private UUID tableId;
/** Creates new form DeckEditorPanel */
public DeckEditorPanel() {
initComponents();
@ -86,17 +88,21 @@ public class DeckEditorPanel extends javax.swing.JPanel {
}
public void showDeckEditor(DeckEditorMode mode, Deck deck, UUID tableId) {
if (deck != null)
if (deck != null) {
this.deck = deck;
this.tableId = tableId;
showDeckEditor(mode);
this.tableId = tableId;
this.btnSubmit.setVisible(mode == DeckEditorMode.Sideboard || mode == DeckEditorMode.Limited);
this.cardSelector.loadCards(new ArrayList<Card>(deck.getSideboard()), this.bigCard);
}
else {
this.cardSelector.loadCards(this.bigCard);
}
init();
}
public void showDeckEditor(DeckEditorMode mode) {
this.cardSelector.loadCards(this.bigCard);
private void init() {
this.cardSelector.setVisible(true);
this.jPanel1.setVisible(true);
this.btnSubmit.setVisible(mode == DeckEditorMode.Sideboard);
this.cardSelector.getCardsList().clearCardEventListeners();
this.cardSelector.getCardsList().addCardEventListener(
new Listener<Event> () {

View file

@ -53,7 +53,7 @@ public class BoosterDraft extends DraftImpl<BoosterDraft> {
fireUpdatePlayersEvent();
}
}
startTournament();
this.fireEndDraftEvent();
}
}

View file

@ -774,6 +774,19 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
table.fireSubmitDeckEvent(playerId, deck);
}
@Override
public void construct(Table table, Deck deck) {
//TODO: improve this
if (deck.getCards().size() < 40) {
while (deck.getCards().size() < 40) {
Card card = deck.getSideboard().iterator().next();
deck.getCards().add(card);
deck.getSideboard().remove(card);
}
}
table.fireSubmitDeckEvent(playerId, deck);
}
@Override
public void pickCard(List<Card> cards, Deck deck, Draft draft) {
//TODO: improve this

View file

@ -479,6 +479,11 @@ public class HumanPlayer extends PlayerImpl<HumanPlayer> {
table.fireSideboardEvent(playerId, deck);
}
@Override
public void construct(Table table, Deck deck) {
table.fireConstructEvent(playerId, deck);
}
@Override
public void pickCard(List<Card> cards, Deck deck, Draft draft) {
draft.firePickCardEvent(playerId);

View file

@ -53,12 +53,10 @@ import mage.view.DraftView;
*/
public class DraftController {
// private static ExecutorService gameExecutor = ThreadExecutor.getInstance().getGameExecutor();
private final static Logger logger = Logging.getLogger(GameController.class.getName());
public static final String INIT_FILE_PATH = "config" + File.separator + "init.txt";
private ConcurrentHashMap<UUID, DraftSession> draftSessions = new ConcurrentHashMap<UUID, DraftSession>();
// private ConcurrentHashMap<UUID, GameWatcher> watchers = new ConcurrentHashMap<UUID, GameWatcher>();
private ConcurrentHashMap<UUID, UUID> sessionPlayerMap;
private UUID draftSessionId;
private Draft draft;
@ -83,6 +81,9 @@ public class DraftController {
case UPDATE:
updateDraft();
break;
case END:
endDraft();
break;
}
}
}
@ -146,6 +147,10 @@ public class DraftController {
draft.leave(getPlayerId(sessionId));
}
private void endDraft() {
TableManager.getInstance().endDraft(tableId);
}
public void kill(UUID sessionId) {
if (sessionPlayerMap.containsKey(sessionId)) {
draftSessions.get(sessionPlayerMap.get(sessionId)).setKilled();
@ -166,7 +171,7 @@ public class DraftController {
for (final DraftSession draftSession: draftSessions.values()) {
draftSession.gameOver(message);
}
TableManager.getInstance().endGame(tableId);
TableManager.getInstance().endDraft(tableId);
}
public UUID getSessionId() {

View file

@ -57,6 +57,7 @@ import mage.game.match.Match;
import mage.game.Seat;
import mage.game.draft.Draft;
import mage.game.draft.DraftOptions;
import mage.game.draft.DraftPlayer;
import mage.game.events.Listener;
import mage.game.events.TableEvent;
import mage.game.match.MatchOptions;
@ -112,6 +113,9 @@ public class TableController {
case SIDEBOARD:
sideboard(event.getPlayerId(), event.getDeck());
break;
case CONSTRUCT:
construct(event.getPlayerId(), event.getDeck());
break;
case SUBMIT_DECK:
submitDeck(event.getPlayerId(), event.getDeck());
break;
@ -167,21 +171,35 @@ public class TableController {
}
public synchronized boolean submitDeck(UUID sessionId, DeckCardLists deckList) throws GameException {
if (table.getState() != TableState.SIDEBOARDING) {
if (table.getState() != TableState.SIDEBOARDING && table.getState() != TableState.CONSTRUCTING) {
return false;
}
MatchPlayer player = match.getPlayer(sessionPlayerMap.get(sessionId));
String playerName;
if (table.getState() == TableState.SIDEBOARDING) {
MatchPlayer player = match.getPlayer(sessionPlayerMap.get(sessionId));
playerName = player.getPlayer().getName();
}
else {
DraftPlayer player = draft.getPlayer(sessionPlayerMap.get(sessionId));
playerName = player.getPlayer().getName();
}
Deck deck = Deck.load(deckList);
if (!Main.server.isTestMode() && !validDeck(deck)) {
throw new GameException(player.getPlayer().getName() + " has an invalid deck for this format");
throw new GameException(playerName + " has an invalid deck for this format");
}
submitDeck(sessionPlayerMap.get(sessionId), deck);
return true;
}
private void submitDeck(UUID playerId, Deck deck) {
MatchPlayer player = match.getPlayer(playerId);
player.submitDeck(deck);
if (table.getState() == TableState.SIDEBOARDING) {
MatchPlayer player = match.getPlayer(playerId);
player.submitDeck(deck);
}
else if (table.getState() == TableState.CONSTRUCTING) {
DraftPlayer player = draft.getPlayer(playerId);
player.submitDeck(deck);
}
}
public boolean watchTable(UUID sessionId) {
@ -199,7 +217,6 @@ public class TableController {
return null;
}
public boolean replayTable(UUID sessionId) {
if (table.getState() != TableState.FINISHED) {
return false;
@ -280,6 +297,15 @@ public class TableController {
}
}
private void construct() {
table.construct();
for (DraftPlayer player: draft.getPlayers()) {
player.setConstructing();
player.getPlayer().construct(table, player.getDeck());
}
while (!draft.isDoneConstructing()){}
}
private void construct(UUID playerId, Deck deck) {
SessionManager sessionManager = SessionManager.getInstance();
for (Entry<UUID, UUID> entry: sessionPlayerMap.entrySet()) {
@ -306,6 +332,11 @@ public class TableController {
}
}
public void endDraft() {
construct();
}
public void swapSeats(int seatNum1, int seatNum2) {
if (table.getState() == TableState.STARTING) {
if (seatNum1 >= 0 && seatNum2 >= 0 && seatNum1 < table.getSeats().length && seatNum2 < table.getSeats().length) {

View file

@ -134,6 +134,10 @@ public class TableManager {
controllers.get(tableId).endGame();
}
public void endDraft(UUID tableId) {
controllers.get(tableId).endDraft();
}
public GameReplay createReplay(UUID tableId) {
return controllers.get(tableId).createReplay();
}

View file

@ -221,6 +221,7 @@ public final class Constants {
DRAFTING ("Drafting"),
DUELING ("Dueling"),
SIDEBOARDING ("Sideboarding"),
CONSTRUCTING ("Constructing"),
FINISHED ("Finished");
private String text;

View file

@ -147,6 +147,10 @@ public class Table implements Serializable {
state = TableState.SIDEBOARDING;
}
public void construct() {
state = TableState.CONSTRUCTING;
}
public String getName() {
return this.name;
}
@ -155,6 +159,10 @@ public class Table implements Serializable {
tableEventSource.fireTableEvent(EventType.SIDEBOARD, playerId, deck);
}
public void fireConstructEvent(UUID playerId, Deck deck) {
tableEventSource.fireTableEvent(EventType.CONSTRUCT, playerId, deck);
}
public void fireSubmitDeckEvent(UUID playerId, Deck deck) {
tableEventSource.fireTableEvent(EventType.SUBMIT_DECK, playerId, deck);
}
@ -162,4 +170,5 @@ public class Table implements Serializable {
public void addTableEventListener(Listener<TableEvent> listener) {
tableEventSource.addListener(listener);
}
}

View file

@ -50,9 +50,11 @@ public interface Draft extends MageItem, Serializable {
public void start();
public void leave(UUID playerId);
public void autoPick(UUID playerId);
public boolean isDoneConstructing();
public void addTableEventListener(Listener<TableEvent> listener);
public void fireUpdatePlayersEvent();
public void fireEndDraftEvent();
public void addPlayerQueryEventListener(Listener<PlayerQueryEvent> listener);
public void firePickCardEvent(UUID playerId);

View file

@ -183,6 +183,11 @@ public abstract class DraftImpl<T extends DraftImpl<T>> implements Draft {
tableEventSource.fireTableEvent(EventType.UPDATE, null, this);
}
@Override
public void fireEndDraftEvent() {
tableEventSource.fireTableEvent(EventType.END, null, this);
}
@Override
public void addPlayerQueryEventListener(Listener<PlayerQueryEvent> listener) {
playerQueryEventSource.addListener(listener);
@ -209,4 +214,13 @@ public abstract class DraftImpl<T extends DraftImpl<T>> implements Draft {
//TODO: implement this
}
@Override
public boolean isDoneConstructing() {
for (DraftPlayer player: this.players.values()) {
if (!player.isDoneConstructing())
return false;
}
return true;
}
}

View file

@ -46,6 +46,7 @@ public class DraftPlayer {
protected Deck deck;
protected List<Card> booster;
protected boolean picking;
protected boolean doneConstructing;
public DraftPlayer(Player player) {
id = UUID.randomUUID();
@ -91,4 +92,17 @@ public class DraftPlayer {
return picking;
}
public void setConstructing() {
this.doneConstructing = false;
}
public void submitDeck(Deck deck) {
this.deck = deck;
this.doneConstructing = true;
}
public boolean isDoneConstructing() {
return this.doneConstructing;
}
}

View file

@ -43,7 +43,7 @@ import mage.game.draft.Draft;
public class TableEvent extends EventObject implements ExternalEvent, Serializable {
public enum EventType {
UPDATE, INFO, REVEAL, LOOK, SIDEBOARD, SUBMIT_DECK
UPDATE, INFO, REVEAL, LOOK, SIDEBOARD, CONSTRUCT, SUBMIT_DECK, END
}
private Game game;

View file

@ -149,6 +149,7 @@ public interface Player extends MageItem, Copyable<Player> {
public abstract void assignDamage(int damage, List<UUID> targets, UUID sourceId, Game game);
public abstract int getAmount(int min, int max, String message, Game game);
public abstract void sideboard(Table table, Deck deck);
public abstract void construct(Table table, Deck deck);
public abstract void pickCard(List<Card> cards, Deck deck, Draft draft);
public void declareAttacker(UUID attackerId, UUID defenderId, Game game);