mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
added deck construction to draft
This commit is contained in:
parent
d62b512a72
commit
c79758f0e5
19 changed files with 154 additions and 25 deletions
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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> () {
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ public class BoosterDraft extends DraftImpl<BoosterDraft> {
|
|||
fireUpdatePlayersEvent();
|
||||
}
|
||||
}
|
||||
startTournament();
|
||||
this.fireEndDraftEvent();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -221,6 +221,7 @@ public final class Constants {
|
|||
DRAFTING ("Drafting"),
|
||||
DUELING ("Dueling"),
|
||||
SIDEBOARDING ("Sideboarding"),
|
||||
CONSTRUCTING ("Constructing"),
|
||||
FINISHED ("Finished");
|
||||
|
||||
private String text;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue