Added - draft json files may contain timer preference (to allow hobbit draft to be slower)

This commit is contained in:
jakub.salavec
2025-04-24 12:57:13 +02:00
parent 813c447111
commit 5a3020857c
12 changed files with 77 additions and 126 deletions

View File

@@ -12,7 +12,7 @@ import com.gempukku.lotro.db.vo.CollectionType;
import com.gempukku.lotro.db.vo.League; import com.gempukku.lotro.db.vo.League;
import com.gempukku.lotro.draft2.SoloDraftDefinitions; import com.gempukku.lotro.draft2.SoloDraftDefinitions;
import com.gempukku.lotro.draft3.TableDraftDefinitions; import com.gempukku.lotro.draft3.TableDraftDefinitions;
import com.gempukku.lotro.draft3.timer.DraftTimerFactory; import com.gempukku.lotro.draft3.timer.DraftTimer;
import com.gempukku.lotro.game.CardCollection; import com.gempukku.lotro.game.CardCollection;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
import com.gempukku.lotro.game.Player; import com.gempukku.lotro.game.Player;
@@ -1049,7 +1049,7 @@ public class AdminRequestHandler extends LotroServerRequestHandler implements Ur
tableDraftParams.tableDraftFormatCode = tableDraftFormatCodeStr; tableDraftParams.tableDraftFormatCode = tableDraftFormatCodeStr;
tableDraftParams.format = tableDraftDefinition.getFormat(); tableDraftParams.format = tableDraftDefinition.getFormat();
tableDraftParams.requiresDeck = false; tableDraftParams.requiresDeck = false;
tableDraftParams.draftTimerType = DraftTimerFactory.getTypeFromString(tableDraftTimer); tableDraftParams.draftTimerType = DraftTimer.getTypeFromString(tableDraftTimer);
tableDraftParams.maximumPlayers = tableDraftDefinition.getMaxPlayers(); tableDraftParams.maximumPlayers = tableDraftDefinition.getMaxPlayers();
params = tableDraftParams; params = tableDraftParams;
} }

View File

@@ -10,7 +10,7 @@ import com.gempukku.lotro.db.DeckDAO;
import com.gempukku.lotro.db.DeckSerialization; import com.gempukku.lotro.db.DeckSerialization;
import com.gempukku.lotro.draft2.SoloDraftDefinitions; import com.gempukku.lotro.draft2.SoloDraftDefinitions;
import com.gempukku.lotro.draft3.TableDraftDefinitions; import com.gempukku.lotro.draft3.TableDraftDefinitions;
import com.gempukku.lotro.draft3.timer.DraftTimerFactory; import com.gempukku.lotro.draft3.timer.DraftTimer;
import com.gempukku.lotro.game.*; import com.gempukku.lotro.game.*;
import com.gempukku.lotro.game.formats.LotroFormatLibrary; import com.gempukku.lotro.game.formats.LotroFormatLibrary;
import com.gempukku.lotro.league.SealedEventDefinition; import com.gempukku.lotro.league.SealedEventDefinition;
@@ -120,7 +120,7 @@ public class DeckRequestHandler extends LotroServerRequestHandler implements Uri
data.TableDraftTemplates = _tableDraftDefinitions.getAllTableDrafts().stream() data.TableDraftTemplates = _tableDraftDefinitions.getAllTableDrafts().stream()
.map(tableDraftDefinition -> new JSONDefs.ItemStub(tableDraftDefinition.getCode(), tableDraftDefinition.getName())) .map(tableDraftDefinition -> new JSONDefs.ItemStub(tableDraftDefinition.getCode(), tableDraftDefinition.getName()))
.collect(Collectors.toMap(itemStub -> itemStub.name, itemStub -> itemStub)); .collect(Collectors.toMap(itemStub -> itemStub.name, itemStub -> itemStub));
data.TableDraftTimerTypes = DraftTimerFactory.getAllTypes(); data.TableDraftTimerTypes = DraftTimer.getAllTypes();
json = JsonUtils.Serialize(data); json = JsonUtils.Serialize(data);
} }

View File

@@ -3,6 +3,7 @@
"code": "hobbit_table_draft", "code": "hobbit_table_draft",
"format": "limited_hobbit", "format": "limited_hobbit",
"max-players": 4, "max-players": 4,
"timer": "SLOW",
"starting-collection": [ "starting-collection": [
{ {
"size": 68, "size": 68,

View File

@@ -11,4 +11,6 @@ public interface TableDraftDefinition {
String getName(); String getName();
String getCode(); String getCode();
String getFormat(); String getFormat();
DraftTimer.Type getRecommendedTimer();
} }

View File

@@ -43,6 +43,7 @@ public class TableDraftDefinitionBuilder {
String name = (String) definition.get("name"); String name = (String) definition.get("name");
String code = (String) definition.get("code"); String code = (String) definition.get("code");
String format = (String) definition.get("format"); String format = (String) definition.get("format");
String timer = (String) definition.get("timer");
int maxPlayers = ((Number) definition.get("max-players")).intValue(); int maxPlayers = ((Number) definition.get("max-players")).intValue();
@@ -79,6 +80,15 @@ public class TableDraftDefinitionBuilder {
public String getFormat() { public String getFormat() {
return format; return format;
} }
@Override
public DraftTimer.Type getRecommendedTimer() {
if (timer == null) {
return DraftTimer.Type.CLASSIC;
} else {
return DraftTimer.getTypeFromString(timer);
}
}
}; };
} }

View File

@@ -1,5 +1,56 @@
package com.gempukku.lotro.draft3.timer; package com.gempukku.lotro.draft3.timer;
public interface DraftTimer {
int getSecondsAllotted(int cardsInPack); import java.util.ArrayList;
import java.util.List;
public class DraftTimer {
private static final int CLASSIC_SECS_PER_CARD = 6;
private static final int SLOW_SECS_PER_CARD = 10;
public enum Type {
CLASSIC, SLOW, NO_TIMER
}
private final int secsPerCard;
public static DraftTimer get(DraftTimer.Type type) {
if (type == DraftTimer.Type.CLASSIC) {
return new DraftTimer(CLASSIC_SECS_PER_CARD);
} else if (type == DraftTimer.Type.SLOW) {
return new DraftTimer(SLOW_SECS_PER_CARD);
} else {
return null;
}
}
private DraftTimer(int secsPerCard) {
this.secsPerCard = secsPerCard;
}
public int getSecondsAllotted(int cardsInPack) {
int tbr = secsPerCard * (cardsInPack - 1);
if (tbr <= 0) {
return secsPerCard;
} else {
return tbr;
}
}
public static DraftTimer.Type getTypeFromString(String type) {
try {
return DraftTimer.Type.valueOf(type);
} catch (IllegalArgumentException ignored) {
return DraftTimer.Type.NO_TIMER;
}
}
public static List<String> getAllTypes() {
List<String> tbr = new ArrayList<>();
for (DraftTimer.Type value : DraftTimer.Type.values()) {
tbr.add(value.name());
}
return tbr;
}
} }

View File

@@ -1,27 +0,0 @@
package com.gempukku.lotro.draft3.timer;
import java.util.HashMap;
import java.util.Map;
public class DraftTimerClassic implements DraftTimer{
private Map<Integer, Integer> durations = new HashMap<>();
private static final int SECS_PER_CARD = 6;
public DraftTimerClassic() {
durations.put(1, 5);
for (int i = 2; i <= 20; i++) {
durations.put(i, (i - 1) * SECS_PER_CARD);
}
}
@Override
public int getSecondsAllotted(int cardsInPack) {
// Unknown duration
if (!durations.containsKey(cardsInPack)) {
return -1;
}
// Look to map for info
return durations.get(cardsInPack);
}
}

View File

@@ -1,42 +0,0 @@
package com.gempukku.lotro.draft3.timer;
import java.util.ArrayList;
import java.util.List;
public class DraftTimerFactory {
private DraftTimerFactory() {
}
public enum Type {
CLASSIC, FAST, NO_TIMER
}
public static DraftTimer getDraftTimer(Type type) {
if (type == Type.FAST) {
return new DraftTimerFast();
} else if (type == Type.CLASSIC) {
return new DraftTimerClassic();
} else {
return null;
}
}
public static Type getTypeFromString(String type) {
try {
return Type.valueOf(type);
} catch (IllegalArgumentException ignored) {
return Type.NO_TIMER;
}
}
public static List<String> getAllTypes() {
List<String> tbr = new ArrayList<>();
for (Type value : Type.values()) {
tbr.add(value.name());
}
return tbr;
}
}

View File

@@ -1,43 +0,0 @@
package com.gempukku.lotro.draft3.timer;
import java.util.HashMap;
import java.util.Map;
public class DraftTimerFast implements DraftTimer{
private Map<Integer, Integer> durations = new HashMap<>();
public DraftTimerFast() {
// MtG timer from Tournament Guides until 15 cards, then extended to 20
durations.put(1, 5);
durations.put(2, 5);
durations.put(3, 5);
durations.put(4, 5);
durations.put(5, 10);
durations.put(6, 10);
durations.put(7, 15);
durations.put(8, 20);
durations.put(9, 20);
durations.put(10, 25);
durations.put(11, 25);
durations.put(12, 30);
durations.put(13, 35);
durations.put(14, 40);
durations.put(15, 40);
durations.put(16, 45);
durations.put(17, 45);
durations.put(18, 50);
durations.put(19, 50);
durations.put(20, 55);
}
@Override
public int getSecondsAllotted(int cardsInPack) {
// Unknown duration
if (!durations.containsKey(cardsInPack)) {
return -1;
}
// Look to map for info
return durations.get(cardsInPack);
}
}

View File

@@ -9,7 +9,7 @@ import com.gempukku.lotro.draft.Draft;
import com.gempukku.lotro.draft2.SoloDraftDefinitions; import com.gempukku.lotro.draft2.SoloDraftDefinitions;
import com.gempukku.lotro.draft3.TableDraft; import com.gempukku.lotro.draft3.TableDraft;
import com.gempukku.lotro.draft3.TableDraftDefinitions; import com.gempukku.lotro.draft3.TableDraftDefinitions;
import com.gempukku.lotro.draft3.timer.DraftTimerFactory; import com.gempukku.lotro.draft3.timer.DraftTimer;
import com.gempukku.lotro.game.formats.LotroFormatLibrary; import com.gempukku.lotro.game.formats.LotroFormatLibrary;
import com.gempukku.lotro.hall.TableHolder; import com.gempukku.lotro.hall.TableHolder;
import com.gempukku.lotro.logic.vo.LotroDeck; import com.gempukku.lotro.logic.vo.LotroDeck;
@@ -131,7 +131,7 @@ public class TableDraftTournament extends BaseTournament implements Tournament {
private void createTable() { private void createTable() {
// Create one table for all players and start // Create one table for all players and start
if (table == null) { if (table == null) {
table = _tableDraftLibrary.getTableDraftDefinition(tableDraftInfo.tableDraftParams.tableDraftFormatCode).getTableDraft(_collectionsManager, getCollectionType(), DraftTimerFactory.getDraftTimer(tableDraftInfo.tableDraftParams.draftTimerType)); table = _tableDraftLibrary.getTableDraftDefinition(tableDraftInfo.tableDraftParams.tableDraftFormatCode).getTableDraft(_collectionsManager, getCollectionType(), DraftTimer.get(tableDraftInfo.tableDraftParams.draftTimerType));
for (String playerName : _players) { for (String playerName : _players) {
table.registerPlayer(playerName); table.registerPlayer(playerName);
} }

View File

@@ -1,9 +1,9 @@
package com.gempukku.lotro.tournament; package com.gempukku.lotro.tournament;
import com.gempukku.lotro.draft3.timer.DraftTimerFactory; import com.gempukku.lotro.draft3.timer.DraftTimer;
public class TableDraftTournamentParams extends TournamentParams { public class TableDraftTournamentParams extends TournamentParams {
public DraftTimerFactory.Type draftTimerType; public DraftTimer.Type draftTimerType;
public int deckbuildingDuration; public int deckbuildingDuration;
public int turnInDuration; public int turnInDuration;
public String tableDraftFormatCode; public String tableDraftFormatCode;

View File

@@ -9,7 +9,6 @@ import com.gempukku.lotro.db.vo.CollectionType;
import com.gempukku.lotro.draft2.SoloDraftDefinitions; import com.gempukku.lotro.draft2.SoloDraftDefinitions;
import com.gempukku.lotro.draft3.TableDraftDefinition; import com.gempukku.lotro.draft3.TableDraftDefinition;
import com.gempukku.lotro.draft3.TableDraftDefinitions; import com.gempukku.lotro.draft3.TableDraftDefinitions;
import com.gempukku.lotro.draft3.timer.DraftTimerFactory;
import com.gempukku.lotro.game.LotroCardBlueprintLibrary; import com.gempukku.lotro.game.LotroCardBlueprintLibrary;
import com.gempukku.lotro.game.Player; import com.gempukku.lotro.game.Player;
import com.gempukku.lotro.game.formats.LotroFormatLibrary; import com.gempukku.lotro.game.formats.LotroFormatLibrary;
@@ -139,7 +138,7 @@ public class TournamentService {
); );
} }
private void addImmediateRecurringTableDraft(String queueId, String queueName, String prefix, String formatCode, int players, DraftTimerFactory.Type draftTimer) { private void addImmediateRecurringTableDraft(String queueId, String queueName, String prefix, String formatCode, int players) {
TournamentQueueCallback callback = tournament -> _activeTournaments.put(tournament.getTournamentId(), tournament); TournamentQueueCallback callback = tournament -> _activeTournaments.put(tournament.getTournamentId(), tournament);
TableDraftTournamentParams draftParams = new TableDraftTournamentParams(); TableDraftTournamentParams draftParams = new TableDraftTournamentParams();
@@ -147,11 +146,11 @@ public class TournamentService {
draftParams.deckbuildingDuration = 15; draftParams.deckbuildingDuration = 15;
draftParams.turnInDuration = 2; draftParams.turnInDuration = 2;
draftParams.draftTimerType = draftTimer;
TableDraftDefinition tableDraft = _tableDraftLibrary.getTableDraftDefinition(formatCode); TableDraftDefinition tableDraft = _tableDraftLibrary.getTableDraftDefinition(formatCode);
draftParams.tableDraftFormatCode = formatCode; draftParams.tableDraftFormatCode = formatCode;
draftParams.format = tableDraft.getFormat(); draftParams.format = tableDraft.getFormat();
draftParams.draftTimerType = tableDraft.getRecommendedTimer();
draftParams.requiresDeck = false; draftParams.requiresDeck = false;
draftParams.tournamentId = prefix; draftParams.tournamentId = prefix;
@@ -216,7 +215,7 @@ public class TournamentService {
_tableDraftLibrary.getAllTableDrafts().forEach(tableDraftDefinition -> { _tableDraftLibrary.getAllTableDrafts().forEach(tableDraftDefinition -> {
String code = tableDraftDefinition.getCode(); String code = tableDraftDefinition.getCode();
addImmediateRecurringTableDraft(code + "_queue", casual + tableDraftDefinition.getName(), code + "-", code, tableDraftDefinition.getMaxPlayers(), DraftTimerFactory.Type.CLASSIC); addImmediateRecurringTableDraft(code + "_queue", casual + tableDraftDefinition.getName(), code + "-", code, tableDraftDefinition.getMaxPlayers());
}); });
addImmediateRecurringDraft("fotr_solo_draft_queue", casual + "FotR Solo Draft", "fotrSoloDraft-", "fotr_draft"); addImmediateRecurringDraft("fotr_solo_draft_queue", casual + "FotR Solo Draft", "fotrSoloDraft-", "fotr_draft");