Fix roll ordering at start
This commit is contained in:
parent
bc5a928da6
commit
ecfcb0476b
@ -60,7 +60,12 @@ const processTies = (players: Player[]): boolean => {
|
|||||||
/* Sort the players into buckets based on their
|
/* Sort the players into buckets based on their
|
||||||
* order, and their current roll. If a resulting
|
* order, and their current roll. If a resulting
|
||||||
* roll array has more than one element, then there
|
* roll array has more than one element, then there
|
||||||
* is a tie that must be resolved */
|
* is a tie that must be resolved. To ensure that
|
||||||
|
* earlier rolls remain more significant across
|
||||||
|
* subsequent tie-break rounds, we pad singleton
|
||||||
|
* players' numeric `order` when ties are detected so
|
||||||
|
* their earlier digits don't get outranked by extra
|
||||||
|
* digits appended to tied players. */
|
||||||
let slots: Player[][] = [];
|
let slots: Player[][] = [];
|
||||||
players.forEach((player: Player) => {
|
players.forEach((player: Player) => {
|
||||||
if (!slots[player.order]) {
|
if (!slots[player.order]) {
|
||||||
@ -87,6 +92,37 @@ const processTies = (players: Player[]): boolean => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// First detect whether any ties exist at all. If so, we need to pad
|
||||||
|
// singleton players' `order` values (multiply by 6) so that their
|
||||||
|
// existing rolls remain more significant than any additional digits
|
||||||
|
// that will be appended by tied players when they re-roll.
|
||||||
|
for (const slot of slots) {
|
||||||
|
if (slot && slot.length > 1) {
|
||||||
|
ties = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ties) {
|
||||||
|
// Pad singleton players by shifting their order a digit left in base-6
|
||||||
|
players.forEach((player: Player) => {
|
||||||
|
const slot = slots[player.order];
|
||||||
|
if (slot && slot.length === 1) {
|
||||||
|
player.order = (player.order || 0) * 6;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Rebuild slots based on the newly padded orders so we can assign
|
||||||
|
// positions correctly below.
|
||||||
|
slots = [];
|
||||||
|
players.forEach((player: Player) => {
|
||||||
|
if (!slots[player.order]) {
|
||||||
|
slots[player.order] = [];
|
||||||
|
}
|
||||||
|
slots[player.order]!.push(player);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/* Reverse from high to low */
|
/* Reverse from high to low */
|
||||||
const rev = slots.slice().reverse();
|
const rev = slots.slice().reverse();
|
||||||
for (const slot of rev) {
|
for (const slot of rev) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user