|
|
@@ -1,9 +1,10 @@
|
|
|
-import { factions, messages } from "./constants.js"
|
|
|
-import {shuffle, splitArray, checkRemovedCount, annotateArray, getRandomItem } from "./utils.js"
|
|
|
+import { factions, messages, voidPlayer } from "./constants.js"
|
|
|
+import {shuffle, splitArray, checkRemovedCount, annotateArray, getRandomItem, removeFromArray, insertEntriesRandomlyIntoArray } from "./utils.js"
|
|
|
|
|
|
// Game options
|
|
|
-const players = ["Fletch", "Al", "Mike", "Ash", "Maddie"]
|
|
|
-const binnedFactions = ["Argent Flight"]
|
|
|
+const players = ["Fletch", "Al", "Mouse", "Ash", "Maddie"]
|
|
|
+const binnedFactions = ["Clan of Saar", "Xxcha Kingdom"]
|
|
|
+const voidPlayerCount = 1;
|
|
|
|
|
|
// Remove any binned factions
|
|
|
const factionsToUse = factions.filter(faction => !binnedFactions.includes(faction))
|
|
|
@@ -13,8 +14,19 @@ if (!checkRemovedCount(factions, factionsToUse, binnedFactions)) {
|
|
|
throw new Error(messages.badBinnedFaction)
|
|
|
}
|
|
|
|
|
|
-// Shuffle/randomise the factions then split them into groups equal to the number of players
|
|
|
-const groupedFactions = splitArray(shuffle(factionsToUse), players.length)
|
|
|
+// Ensure all players get an equal number of choices by calculating the number
|
|
|
+// of factions that should be removed for an even split
|
|
|
+const numFactionsToBin = factionsToUse.length % players.length
|
|
|
+
|
|
|
+// Shuffle/randomise the factions, use the number from above to make it an even
|
|
|
+// split, then split them into groups equal to the number of players
|
|
|
+const groupedFactions = splitArray(
|
|
|
+ removeFromArray(
|
|
|
+ shuffle(factionsToUse),
|
|
|
+ numFactionsToBin
|
|
|
+ ),
|
|
|
+ players.length
|
|
|
+)
|
|
|
|
|
|
// Shuffle/randomise the order of players
|
|
|
const orderedPlayers = shuffle(players)
|
|
|
@@ -25,13 +37,16 @@ const selections = annotateArray(orderedPlayers, groupedFactions)
|
|
|
// Pick speaker
|
|
|
const speaker = getRandomItem(orderedPlayers)
|
|
|
|
|
|
+// Insert Void player(s) when required (to keep an even map)
|
|
|
+const playerLayout = insertEntriesRandomlyIntoArray(orderedPlayers, voidPlayerCount, voidPlayer)
|
|
|
// Output all this to console
|
|
|
-orderedPlayers.forEach(player => {
|
|
|
- const playerFactions = selections[player].join(", ");
|
|
|
- console.log(`Player: ${player}`)
|
|
|
- if (speaker === player) {
|
|
|
- console.log("[SPEAKER]")
|
|
|
- }
|
|
|
+playerLayout.forEach((player, index) => {
|
|
|
+ const isSpeaker = player === speaker ? messages.speaker : messages.blank
|
|
|
+ const isVoid = player === voidPlayer ? messages.voidPlayer : messages.blank
|
|
|
+ const playerNumber = index + 1
|
|
|
+ const playerFactions = (selections[player] || []).join(", ");
|
|
|
+
|
|
|
+ console.log(`Player ${playerNumber}: ${player} ${[isSpeaker, isVoid].join(" ")}`)
|
|
|
console.log(`Factions: ${playerFactions}`)
|
|
|
console.log(messages.divider)
|
|
|
})
|