* 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">
<Component id="jLabel6" min="-2" pref="49" 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"/>
</Group>
</Group>

View file

@ -344,7 +344,7 @@ public class NewTournamentDialog extends MageDialog {
.addGroup(pnlDraftOptionsLayout.createSequentialGroup()
.addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE)
.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))
);
pnlDraftOptionsLayout.setVerticalGroup(
@ -1224,7 +1224,6 @@ public class NewTournamentDialog extends MageDialog {
}
if (tournamentType.isDraft()) {
DraftOptions options = new DraftOptions();
options.setDraftType("");
options.setTiming((TimingOption) this.cbDraftTiming.getSelectedItem());
tOptions.setLimitedOptions(options);
}

View file

@ -6,6 +6,7 @@ import mage.game.Game;
import mage.game.Seat;
import mage.game.Table;
import mage.game.draft.Draft;
import mage.game.draft.DraftOptions;
import mage.game.match.MatchPlayer;
import mage.game.tournament.TournamentPlayer;
@ -155,6 +156,10 @@ public class TableView implements Serializable {
if (table.getTournament().getTournamentType().isLimited()) {
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()) {
infoText.append(" RB");
}

View file

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

View file

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

View file

@ -1,41 +1,69 @@
package mage.game.draft;
import java.io.Serializable;
import mage.game.tournament.LimitedOptions;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
/**
*
* @author BetaSteward_at_googlemail.com
* @author BetaSteward_at_googlemail.com, JayDi85
*/
public class DraftOptions extends LimitedOptions implements Serializable {
protected String draftType;
protected TimingOption timing;
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) {
this.factor = factor;
private final String shortName;
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() {
return this.factor;
public String getShortName() {
return shortName;
}
}
public String getDraftType() {
return draftType;
}
public String getName() {
return name;
}
public void setDraftType(String draftType) {
this.draftType = draftType;
public double getCustomTimeoutFactor() {
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() {

View file

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

View file

@ -16,8 +16,8 @@ public class RichManBoosterDraft extends DraftImpl {
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};
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};
// custom timeouts per pick on profi timing
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) {
super(options, sets);
@ -87,7 +87,9 @@ public class RichManBoosterDraft extends DraftImpl {
if (cardNum <= 0) {
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);
}
}

View file

@ -1,4 +1,3 @@
package mage.game.draft;
import java.util.*;
@ -13,8 +12,9 @@ import mage.game.draft.DraftCube.CardIdentity;
*/
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};
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};
// custom timeouts per pick on profi timing
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<>();
public RichManCubeBoosterDraft(DraftOptions options, List<ExpansionSet> sets) {
@ -102,7 +102,9 @@ public class RichManCubeBoosterDraft extends DraftImpl {
if (cardNum <= 0) {
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);
}
}