binmat
Version:
binmat simulator
47 lines (46 loc) • 2.16 kB
JavaScript
import { shuffle } from "@samual/lib/shuffle"
import { StatusCode, Role, AttackerDiscardPile } from "./shared.js"
function doMoveDiscard(state, card, discardPile) {
if (state.turn >= state.turns) return { status: StatusCode.MadeMoveOnFinishedGame }
let cardDiscarded, cardsDrawn
if ((state.turn % 2) + 1 == Role.Defender) {
const index =
2 == card.length ?
state.defenderHand.indexOf(card)
: state.defenderHand.findIndex(([value]) => value == card)
if (-1 == index) return { status: StatusCode.PlayedUnownedCard }
if (discardPile == AttackerDiscardPile) return { status: StatusCode.DiscardedToOpponentDiscardPile }
;(cardDiscarded = state.defenderHand.splice(index, 1)[0]),
state.laneDiscardPiles[discardPile].push(cardDiscarded)
} else {
const index =
2 == card.length ?
state.attackerHand.indexOf(card)
: state.attackerHand.findIndex(([value]) => value == card)
if (-1 == index) return { status: StatusCode.PlayedUnownedCard }
if (discardPile != AttackerDiscardPile) return { status: StatusCode.DiscardedToOpponentDiscardPile }
if (!state.attackerDiscardPile.length && !state.attackerDeck.length)
return { status: StatusCode.AttackerDiscardedToEmptyDiscardAndDeck }
if (
((cardDiscarded = state.attackerHand.splice(index, 1)[0]),
state.attackerDiscardPile.push(cardDiscarded),
1 == state.attackerDeck.length)
) {
const firstCardDrawn = state.attackerDeck.pop()
state.attackerHand.push(firstCardDrawn),
state.attackerDeck.push(...shuffle(state.attackerDiscardPile.splice(0))),
(cardsDrawn = [firstCardDrawn, state.attackerDeck.pop()]),
state.attackerHand.push(cardsDrawn[1])
} else
state.attackerDeck.length || state.attackerDeck.push(...shuffle(state.attackerDiscardPile.splice(0))),
(cardsDrawn = [state.attackerDeck.pop(), state.attackerDeck.pop()]),
state.attackerHand.push(cardsDrawn[0], cardsDrawn[1])
}
return (
state.turn++,
state.turn == state.turns ?
{ status: StatusCode.DefenderWin, cardDiscarded: cardDiscarded, cardsDrawn: cardsDrawn }
: { status: StatusCode.Ok, cardDiscarded: cardDiscarded, cardsDrawn: cardsDrawn }
)
}
export { doMoveDiscard }