* Draft improves:

* added additional and improved timing options for pick timeouts (x1.0, x1.5, x2.0, see #8033);
 * added pick timing info in tables list (info column);
 * fixed that booster draft starts with wrong pick timeout (#8036);
This commit is contained in:
Oleg Agafonov 2021-07-22 23:14:08 +04:00
parent 214b688fdb
commit 400acae0c1
9 changed files with 71 additions and 37 deletions

View file

@ -545,7 +545,7 @@
<Group type="102" alignment="0" attributes="0"> <Group type="102" alignment="0" attributes="0">
<Component id="jLabel6" min="-2" pref="49" max="-2" attributes="0"/> <Component id="jLabel6" min="-2" pref="49" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="cbDraftTiming" min="-2" pref="107" max="-2" attributes="0"/> <Component id="cbDraftTiming" min="-2" pref="140" max="-2" attributes="0"/>
<EmptySpace pref="19" max="32767" attributes="0"/> <EmptySpace pref="19" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>

View file

@ -344,7 +344,7 @@ public class NewTournamentDialog extends MageDialog {
.addGroup(pnlDraftOptionsLayout.createSequentialGroup() .addGroup(pnlDraftOptionsLayout.createSequentialGroup()
.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cbDraftTiming, javax.swing.GroupLayout.PREFERRED_SIZE, 107, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(cbDraftTiming, javax.swing.GroupLayout.PREFERRED_SIZE, 140, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(19, Short.MAX_VALUE)) .addContainerGap(19, Short.MAX_VALUE))
); );
pnlDraftOptionsLayout.setVerticalGroup( pnlDraftOptionsLayout.setVerticalGroup(
@ -1224,7 +1224,6 @@ public class NewTournamentDialog extends MageDialog {
} }
if (tournamentType.isDraft()) { if (tournamentType.isDraft()) {
DraftOptions options = new DraftOptions(); DraftOptions options = new DraftOptions();
options.setDraftType("");
options.setTiming((TimingOption) this.cbDraftTiming.getSelectedItem()); options.setTiming((TimingOption) this.cbDraftTiming.getSelectedItem());
tOptions.setLimitedOptions(options); tOptions.setLimitedOptions(options);
} }

View file

@ -6,6 +6,7 @@ import mage.game.Game;
import mage.game.Seat; import mage.game.Seat;
import mage.game.Table; import mage.game.Table;
import mage.game.draft.Draft; import mage.game.draft.Draft;
import mage.game.draft.DraftOptions;
import mage.game.match.MatchPlayer; import mage.game.match.MatchPlayer;
import mage.game.tournament.TournamentPlayer; import mage.game.tournament.TournamentPlayer;
@ -155,6 +156,10 @@ public class TableView implements Serializable {
if (table.getTournament().getTournamentType().isLimited()) { if (table.getTournament().getTournamentType().isLimited()) {
infoText.append(" Constr.: ").append(table.getTournament().getOptions().getLimitedOptions().getConstructionTime() / 60).append(" Min."); infoText.append(" Constr.: ").append(table.getTournament().getOptions().getLimitedOptions().getConstructionTime() / 60).append(" Min.");
} }
if (table.getTournament().getOptions().getLimitedOptions() instanceof DraftOptions) {
DraftOptions draftOptions = (DraftOptions) table.getTournament().getOptions().getLimitedOptions();
infoText.append(" Pick time: ").append(draftOptions.getTiming().getShortName());
}
if (table.getTournament().getOptions().getMatchOptions().isRollbackTurnsAllowed()) { if (table.getTournament().getOptions().getMatchOptions().isRollbackTurnsAllowed()) {
infoText.append(" RB"); infoText.append(" RB");
} }

View file

@ -17,8 +17,10 @@ public class BoosterDraft extends DraftImpl {
@Override @Override
public void start() { public void start() {
cardNum = 0;
while (!isAbort() && boosterNum < numberBoosters) { while (!isAbort() && boosterNum < numberBoosters) {
openBooster(); openBooster();
cardNum = 0;
while (!isAbort() && pickCards()) { while (!isAbort() && pickCards()) {
if (boosterNum % 2 == 1) { if (boosterNum % 2 == 1) {
passLeft(); passLeft();

View file

@ -1,4 +1,3 @@
package mage.game.draft; package mage.game.draft;
import java.util.*; import java.util.*;
@ -24,9 +23,8 @@ public abstract class DraftImpl implements Draft {
protected List<ExpansionSet> sets; protected List<ExpansionSet> sets;
protected List<String> setCodes; protected List<String> setCodes;
protected int boosterNum = 0; protected int boosterNum = 0;
protected int cardNum = 0; protected int cardNum = 0; // increases +1 on first picking (so draft get 1 as first card number)
protected TimingOption timing; protected TimingOption timing;
protected int[] times = {75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10, 5};
protected boolean abort = false; protected boolean abort = false;
protected boolean started = false; protected boolean started = false;
@ -204,7 +202,6 @@ public abstract class DraftImpl implements Draft {
} }
} }
boosterNum++; boosterNum++;
cardNum = 1;
fireUpdatePlayersEvent(); fireUpdatePlayersEvent();
} }
@ -270,7 +267,7 @@ public abstract class DraftImpl implements Draft {
if (cardNum > 15) { if (cardNum > 15) {
cardNum = 15; cardNum = 15;
} }
int time = times[cardNum - 1] * timing.getFactor(); int time = timing.getPickTimeout(cardNum);
playerQueryEventSource.pickCard(playerId, "Pick card", player.getBooster(), time); playerQueryEventSource.pickCard(playerId, "Pick card", player.getBooster(), time);
} }

View file

@ -1,41 +1,69 @@
package mage.game.draft; package mage.game.draft;
import java.io.Serializable;
import mage.game.tournament.LimitedOptions; import mage.game.tournament.LimitedOptions;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
/** /**
* * @author BetaSteward_at_googlemail.com, JayDi85
* @author BetaSteward_at_googlemail.com
*/ */
public class DraftOptions extends LimitedOptions implements Serializable { public class DraftOptions extends LimitedOptions implements Serializable {
protected String draftType;
protected TimingOption timing; protected TimingOption timing;
public enum TimingOption { public enum TimingOption {
REGULAR (1),
BEGINNER (2),
NONE (0);
private int factor; // seconds per card's pick
BEGINNER("x2.0", "Beginner (x2.0)", 2.0,
Arrays.asList(150, 140, 130, 120, 110, 100, 90, 80, 45, 35, 30, 25, 20, 15, 10)
),
REGULAR("x1.5", "Regular (x1.5)", 1.5,
Arrays.asList(113, 105, 98, 90, 83, 75, 68, 60, 35, 30, 25, 20, 15, 10, 8)
),
PROFI("x1.0", "Profi (x1.0)", 1.0,
Arrays.asList(75, 70, 65, 60, 55, 50, 45, 40, 30, 25, 20, 15, 12, 10, 7)
),
NONE("ERROR", "", 0,
Arrays.asList(0)
);
TimingOption(int factor) { private final String shortName;
this.factor = factor; private final String name;
private final double customTimeoutFactor; // profi as x1.0, other modes increases by factor from x1.5 to x2.0
private final List<Integer> times;
TimingOption(String shortName, String name, double customTimeoutFactor, List<Integer> times) {
this.shortName = shortName;
this.name = name;
this.customTimeoutFactor = customTimeoutFactor;
this.times = times;
} }
public int getFactor() { public String getShortName() {
return this.factor; return shortName;
}
} }
public String getDraftType() { public String getName() {
return draftType; return name;
} }
public void setDraftType(String draftType) { public double getCustomTimeoutFactor() {
this.draftType = draftType; return customTimeoutFactor;
}
public int getPickTimeout(int cardNum) {
if (cardNum > 15) {
cardNum = 15;
}
return times.get(cardNum - 1);
}
@Override
public String toString() {
return name;
}
} }
public TimingOption getTiming() { public TimingOption getTiming() {

View file

@ -32,7 +32,6 @@ public class RandomBoosterDraft extends BoosterDraft {
} }
} }
boosterNum++; boosterNum++;
cardNum = 1;
fireUpdatePlayersEvent(); fireUpdatePlayersEvent();
} }

View file

@ -16,8 +16,8 @@ public class RichManBoosterDraft extends DraftImpl {
private static final Logger logger = Logger.getLogger(RichManBoosterDraft.class); private static final Logger logger = Logger.getLogger(RichManBoosterDraft.class);
//protected int[] richManTimes = {75, 70, 65, 60, 55, 50, 45, 40, 35, 35, 35, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}; // custom timeouts per pick on profi timing
protected int[] richManTimes = {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}; protected int[] customProfiTimes = {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40};
public RichManBoosterDraft(DraftOptions options, List<ExpansionSet> sets) { public RichManBoosterDraft(DraftOptions options, List<ExpansionSet> sets) {
super(options, sets); super(options, sets);
@ -87,7 +87,9 @@ public class RichManBoosterDraft extends DraftImpl {
if (cardNum <= 0) { if (cardNum <= 0) {
cardNum = 1; cardNum = 1;
} }
int time = richManTimes[cardNum - 1] * timing.getFactor();
// richman uses custom times
int time = (int) Math.ceil(customProfiTimes[cardNum - 1] * timing.getCustomTimeoutFactor());
playerQueryEventSource.pickCard(playerId, "Pick card", player.getBooster(), time); playerQueryEventSource.pickCard(playerId, "Pick card", player.getBooster(), time);
} }
} }

View file

@ -1,4 +1,3 @@
package mage.game.draft; package mage.game.draft;
import java.util.*; import java.util.*;
@ -13,8 +12,9 @@ import mage.game.draft.DraftCube.CardIdentity;
*/ */
public class RichManCubeBoosterDraft extends DraftImpl { public class RichManCubeBoosterDraft extends DraftImpl {
//protected int[] richManTimes = {75, 70, 65, 60, 55, 50, 45, 40, 35, 35, 35, 35, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25}; // custom timeouts per pick on profi timing
protected int[] richManTimes = {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40}; protected int[] customProfiTimes = {70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40};
protected final Map<String, CardIdentity> cardsInCube = new LinkedHashMap<>(); protected final Map<String, CardIdentity> cardsInCube = new LinkedHashMap<>();
public RichManCubeBoosterDraft(DraftOptions options, List<ExpansionSet> sets) { public RichManCubeBoosterDraft(DraftOptions options, List<ExpansionSet> sets) {
@ -102,7 +102,9 @@ public class RichManCubeBoosterDraft extends DraftImpl {
if (cardNum <= 0) { if (cardNum <= 0) {
cardNum = 1; cardNum = 1;
} }
int time = richManTimes[cardNum - 1] * timing.getFactor();
// richman uses custom times
int time = (int) Math.ceil(customProfiTimes[cardNum - 1] * timing.getCustomTimeoutFactor());
playerQueryEventSource.pickCard(playerId, "Pick card", player.getBooster(), time); playerQueryEventSource.pickCard(playerId, "Pick card", player.getBooster(), time);
} }
} }