Sealed tournament fixes

- Fixed sealed tournaments swallowing deck registration during the deck registration phase
- Removed the "all players have registered" short-circuit condition, so that players don't get rug-pulled if making last-minute adjustments
This commit is contained in:
Christian 'ketura' McCarty
2024-09-23 21:42:46 -05:00
parent 429b4d092a
commit 6b2af8fa75
6 changed files with 35 additions and 21 deletions

View File

@@ -542,7 +542,7 @@ var GempLotrHallUI = Class.extend({
if (joined == "true") {
that.inTournament = true;
debugger;
if(type === "sealed" && (stage === "deck-building" || stage === "registering decks")) {
if(type === "sealed" && (stage === "deck-building" || stage === "registering decks" || stage === "awaiting kickoff" || stage === "paused between rounds")) {
var but = $("<button>Register Deck</button>");
$(but).button().click((
function(tourneyInfo) {

View File

@@ -528,19 +528,26 @@ public class HallServer extends AbstractServer {
String result = "";
var tournament = _tournamentService.getTournamentById(tournamentId);
if (tournament != null) {
var stage = tournament.getInfo().Stage;
if(stage == Tournament.Stage.STARTING || stage == Tournament.Stage.DECK_BUILDING ||
stage == Tournament.Stage.PAUSED || stage == Tournament.Stage.AWAITING_KICKOFF) {
LotroDeck lotroDeck = validateUserAndDeck(_formatLibrary.getFormat(tournament.getFormatCode()), player, deckName, tournament.getCollectionType());
LotroDeck lotroDeck = validateUserAndDeck(_formatLibrary.getFormat(tournament.getFormatCode()), player, deckName, tournament.getCollectionType());
var submitted = tournament.playerSubmittedDeck(player.getName(), lotroDeck);
tournament.playerSubmittedDeck(player.getName(), lotroDeck);
if(submitted) {
result = "Registered deck '" + deckName + "' with tournament <b>" + tournament.getTournamentName() + "</b> successfully."
+ "<br/><br/>If you make an update to your deck, you will need to register it here again for any changes to take effect.";
_log.trace("Player '" + player.getName() + "' registered deck '" + deckName + "' for tournament '" + tournament.getTournamentName() + "' successfully.");
}
result = "Registered deck '" + deckName + "' with tournament <b>" + tournament.getTournamentName() + "</b> successfully."
+ "<br/><br/>If you make an update to your deck, you will need to register it here again for any changes to take effect.";
else {
result = "Could not register deck with tournament <b>" + tournament.getTournamentName() + "</b>."
+ "<br/><br/>Please contact an administrator if you think this was in error.";
_log.trace("Player '" + player.getName() + "' failed to register deck '" + deckName + "' for tournament '" + tournament.getTournamentName() + "'.");
}
hallChanged();
}
else {
result = "Registration for that tournament has already closed.";
_log.trace("Player '" + player.getName() + "' attempted to register deck '" + deckName + "' for tournament '" + tournament.getTournamentName() + "' after registration closed.");
}
return result;

View File

@@ -39,8 +39,9 @@ public class ConstructedTournament extends BaseTournament implements Tournament
}
@Override
public void playerSubmittedDeck(String player, LotroDeck deck) {
public boolean playerSubmittedDeck(String player, LotroDeck deck) {
//Constructed has all decks submitted upon signup, so nothing to do here
return false;
}

View File

@@ -37,13 +37,18 @@ public class SealedTournament extends BaseTournament implements Tournament {
@Override
public void playerSubmittedDeck(String player, LotroDeck deck) {
public boolean playerSubmittedDeck(String player, LotroDeck deck) {
writeLock.lock();
try {
if (getTournamentStage() == Stage.DECK_BUILDING && _players.contains(player)) {
var stage = getTournamentStage();
if ((stage == Stage.DECK_BUILDING || stage == Stage.DECK_REGISTRATION ||
stage == Tournament.Stage.PAUSED || stage == Tournament.Stage.AWAITING_KICKOFF)
&& _players.contains(player)) {
_tournamentService.updateRecordedPlayerDeck(_tournamentId, player, deck);
_playerDecks.put(player, deck);
return true;
}
return false;
} finally {
writeLock.unlock();
}
@@ -150,7 +155,7 @@ public class SealedTournament extends BaseTournament implements Tournament {
+ "<br/><br/>Remember to return to the game hall and register your deck before " + DateUtils.FormatTime(_sealedInfo.RegistrationDeadline) + "."));
}
else if (getTournamentStage() == Stage.DECK_BUILDING) {
if (DateUtils.Now().isAfter(_sealedInfo.DeckbuildingDeadline) && _playerDecks.values().stream().anyMatch(x -> StringUtils.isEmpty(x.getDeckName()))) {
if (DateUtils.Now().isAfter(_sealedInfo.DeckbuildingDeadline)) {
_tournamentInfo.Stage = Stage.DECK_REGISTRATION;
_tournamentService.recordTournamentStage(_tournamentId, getTournamentStage());
@@ -158,16 +163,12 @@ public class SealedTournament extends BaseTournament implements Tournament {
result.add(new BroadcastAction("Deck building in tournament <b>" + getTournamentName() + "</b> has finished. Players now have "
+ duration + " to finish registering their decks. Any player who has not turned in their deck by the deadline at "
+ DateUtils.FormatTime(_sealedInfo.RegistrationDeadline) + " will be auto-disqualified."
+ "<br/><br/>Once all players have turned in decks or the deadline has passed, the tournament will begin."));
}
else if (DateUtils.Now().isAfter(_sealedInfo.DeckbuildingDeadline) && _playerDecks.values().stream().noneMatch(x -> StringUtils.isEmpty(x.getDeckName()))) {
_tournamentInfo.Stage = _sealedInfo.PostRegistrationStage();
_tournamentService.recordTournamentStage(_tournamentId, getTournamentStage());
+ "<br/><br/>Once the deadline has passed, the tournament will begin."));
}
}
if (getTournamentStage() == Stage.DECK_REGISTRATION) {
if (DateUtils.Now().isAfter(_sealedInfo.RegistrationDeadline) || _playerDecks.values().stream().noneMatch(x -> StringUtils.isEmpty(x.getDeckName()))) {
if (DateUtils.Now().isAfter(_sealedInfo.RegistrationDeadline)) {
disqualifyUnregisteredPlayers();
_tournamentInfo.Stage = _sealedInfo.PostRegistrationStage();

View File

@@ -35,13 +35,18 @@ public class SoloDraftTournament extends BaseTournament implements Tournament {
@Override
public void playerSubmittedDeck(String player, LotroDeck deck) {
public boolean playerSubmittedDeck(String player, LotroDeck deck) {
writeLock.lock();
try {
if (getTournamentStage() == Stage.DECK_BUILDING && _players.contains(player)) {
var stage = getTournamentStage();
if ((stage == Tournament.Stage.DECK_BUILDING || stage == Tournament.Stage.DECK_REGISTRATION ||
stage == Tournament.Stage.PAUSED || stage == Tournament.Stage.AWAITING_KICKOFF)
&& _players.contains(player)) {
_tournamentService.updateRecordedPlayerDeck(_tournamentId, player, deck);
_playerDecks.put(player, deck);
return true;
}
return false;
} finally {
writeLock.unlock();
}

View File

@@ -180,7 +180,7 @@ public interface Tournament {
void reportGameFinished(String winner, String loser);
void playerChosenCard(String playerName, String cardId);
void playerSubmittedDeck(String player, LotroDeck deck);
boolean playerSubmittedDeck(String player, LotroDeck deck);
void issuePlayerMaterial(String player);
LotroDeck getPlayerDeck(String player);
String dropPlayer(String player);