binmat
Version:
binmat simulator
30 lines (29 loc) • 1.39 kB
JavaScript
import { shuffle } from "@samual/lib/shuffle"
import { StatusCode, Role, AttackerDeck, AttackerDiscardPile } from "./shared.js"
function doMoveDraw(state, deckToDrawFrom) {
if (state.turn >= state.turns) return { status: StatusCode.MadeMoveOnFinishedGame }
const roleTurn = (state.turn % 2) + 1
if (roleTurn == Role.Defender) {
if (deckToDrawFrom == AttackerDeck) return { status: StatusCode.DefenderDrewFromAttackerDeck }
} else if (deckToDrawFrom != AttackerDeck && state.defenderStacks[deckToDrawFrom].cards.length)
return { status: StatusCode.AttackerDrewFromBlockedLane }
const deck = deckToDrawFrom == AttackerDeck ? state.attackerDeck : state.laneDecks[deckToDrawFrom]
if (!deck.length) {
const discardPile =
deckToDrawFrom == AttackerDiscardPile ? state.attackerDiscardPile : state.laneDiscardPiles[deckToDrawFrom]
if (!discardPile.length)
return deckToDrawFrom == AttackerDeck ?
{ status: StatusCode.AttackerDrewFromEmptyDiscardAndDeck }
: { status: StatusCode.AttackerWin }
deck.push(...shuffle(discardPile.splice(0)))
}
const cardDrawn = deck.pop()
return (
roleTurn == Role.Defender ? state.defenderHand.push(cardDrawn) : state.attackerHand.push(cardDrawn),
state.turn++,
state.turn == state.turns ?
{ status: StatusCode.DefenderWin, cardDrawn: cardDrawn }
: { status: StatusCode.Ok, cardDrawn: cardDrawn }
)
}
export { doMoveDraw }