예제 #1
0
  public synchronized boolean replaceDraftPlayer(
      Player oldPlayer, String name, String playerType, int skill) {
    Player newPlayer = createPlayer(name, playerType, skill);
    if (newPlayer == null || table.getState() != TableState.DRAFTING) {
      return false;
    }
    TournamentPlayer oldTournamentPlayer = tournament.getPlayer(oldPlayer.getId());
    tournament.removePlayer(oldPlayer.getId());
    tournament.addPlayer(newPlayer, playerType);

    TournamentPlayer newTournamentPlayer = tournament.getPlayer(newPlayer.getId());
    newTournamentPlayer.setState(oldTournamentPlayer.getState());
    newTournamentPlayer.setReplacedTournamentPlayer(oldTournamentPlayer);

    DraftManager.getInstance().getController(table.getId()).replacePlayer(oldPlayer, newPlayer);
    return true;
  }
예제 #2
0
 public void endDraft(Draft draft) {
   if (!draft.isAbort()) {
     for (DraftPlayer player : draft.getPlayers()) {
       player.prepareDeck();
       tournament.getPlayer(player.getPlayer().getId()).setDeck(player.getDeck());
     }
   }
   tournament.clearDraft(); // free the draft resources after draft step has ended
   tournament.nextStep();
 }
예제 #3
0
 public boolean isUserStillActive(UUID userId) {
   UUID playerId = userPlayerMap.get(userId);
   if (playerId != null) {
     if (tournament != null) {
       TournamentPlayer tournamentPlayer = tournament.getPlayer(playerId);
       if (tournamentPlayer != null) {
         return tournamentPlayer.isInTournament();
       }
     } else if (match != null) {
       MatchPlayer matchPlayer = match.getPlayer(playerId);
       return matchPlayer != null && !matchPlayer.hasQuit();
     }
   }
   return false;
 }
예제 #4
0
 public synchronized boolean submitDeck(UUID userId, DeckCardLists deckList) throws MageException {
   UUID playerId = userPlayerMap.get(userId);
   if (table.isTournament()) {
     TournamentPlayer player = tournament.getPlayer(playerId);
     if (player == null || player.hasQuit()) {
       return true; // so the construct panel closes after submit
     }
   } else if (table.getMatch() != null) {
     MatchPlayer mPlayer = table.getMatch().getPlayer(playerId);
     if (mPlayer == null || mPlayer.hasQuit()) {
       return true; // so the construct panel closes after submit
     }
     if (table.isTournamentSubTable()) {
       TournamentPlayer tournamentPlayer =
           table.getTournament().getPlayer(mPlayer.getPlayer().getId());
       if (tournamentPlayer != null) {
         tournamentPlayer.setStateInfo(""); // reset sideboarding state
       }
     }
   }
   if (table.getState() != TableState.SIDEBOARDING
       && table.getState() != TableState.CONSTRUCTING) {
     return false;
   }
   Deck deck = Deck.load(deckList, false, false);
   if (table.getState() == TableState.SIDEBOARDING && table.getMatch() != null) {
     MatchPlayer mPlayer = table.getMatch().getPlayer(playerId);
     if (mPlayer != null) {
       deck.setName(mPlayer.getDeck().getName());
     }
   }
   if (!Main.isTestMode() && !table.getValidator().validate(deck)) {
     throw new InvalidDeckException(
         "Invalid deck for this format", table.getValidator().getInvalid());
   }
   submitDeck(userId, playerId, deck);
   return true;
 }
예제 #5
0
  public synchronized boolean joinTournament(
      UUID userId,
      String name,
      String playerType,
      int skill,
      DeckCardLists deckList,
      String password)
      throws GameException {
    if (table.getState() != TableState.WAITING) {
      return false;
    }

    Seat seat = table.getNextAvailableSeat(playerType);
    if (seat == null) {
      throw new GameException("No available seats.");
    }
    User user = UserManager.getInstance().getUser(userId);
    if (user == null) {
      logger.fatal(
          new StringBuilder("couldn't get user ")
              .append(name)
              .append(" for join tournament userId = ")
              .append(userId)
              .toString());
      return false;
    }
    // check password
    if (!table.getTournament().getOptions().getPassword().isEmpty() && playerType.equals("Human")) {
      if (!table.getTournament().getOptions().getPassword().equals(password)) {
        user.showUserMessage("Join Table", "Wrong password.");
        return false;
      }
    }
    if (userPlayerMap.containsKey(userId) && playerType.equals("Human")) {
      user.showUserMessage("Join Table", "You can join a table only one time.");
      return false;
    }
    Deck deck = null;
    if (!table.getTournament().getTournamentType().isLimited()) {
      if (deckList != null) {
        deck = Deck.load(deckList, false, false);
      } else {
        user.showUserMessage("Join Table", "No valid deck selected!");
        return false;
      }
      if (!Main.isTestMode() && !table.getValidator().validate(deck)) {
        StringBuilder sb =
            new StringBuilder("You (")
                .append(name)
                .append(") have an invalid deck for the selected ")
                .append(table.getValidator().getName())
                .append(" Format. \n\n");
        for (Map.Entry<String, String> entry : table.getValidator().getInvalid().entrySet()) {
          sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n");
        }
        sb.append("\n\nSelect a deck that is appropriate for the selected format and try again!");
        user.showUserMessage("Join Table", sb.toString());
        if (isOwner(userId)) {
          logger.debug(
              "New table removed because owner submitted invalid deck tableId " + table.getId());
          TableManager.getInstance().removeTable(table.getId());
        }
        return false;
      }
    }
    // Check quit ratio.
    int quitRatio = table.getTournament().getOptions().getQuitRatio();
    if (quitRatio < user.getTourneyQuitRatio()) {
      String message =
          new StringBuilder("Your quit ratio ")
              .append(user.getTourneyQuitRatio())
              .append("% is higher than the table requirement ")
              .append(quitRatio)
              .append("%")
              .toString();
      user.showUserMessage("Join Table", message);
      return false;
    }

    Player player = createPlayer(name, seat.getPlayerType(), skill);
    if (player != null) {
      if (!player.canJoinTable(table)) {
        user.showUserMessage(
            "Join Table",
            new StringBuilder("A ")
                .append(seat.getPlayerType())
                .append(" player can't join this table.")
                .toString());
        return false;
      }
      tournament.addPlayer(player, seat.getPlayerType());
      TournamentPlayer tournamentPlayer = tournament.getPlayer(player.getId());
      if (deck != null && tournamentPlayer != null) {
        tournamentPlayer.submitDeck(deck);
      }
      table.joinTable(player, seat);
      logger.debug(
          "Player "
              + player.getName()
              + " id: "
              + player.getId()
              + " joined tableId: "
              + table.getId());
      // only inform human players and add them to sessionPlayerMap
      if (seat.getPlayer().isHuman()) {
        seat.getPlayer().setUserData(user.getUserData());
        user.addTable(player.getId(), table);
        user.ccJoinedTable(table.getRoomId(), table.getId(), true);
        userPlayerMap.put(userId, player.getId());
      }

      return true;
    } else {
      throw new GameException("Playertype " + seat.getPlayerType() + " could not be created.");
    }
  }