UNPKG

binmat

Version:
65 lines (64 loc) 2.71 kB
import { assert } from "@samual/lib/assert" import { doCombat } from "./doCombat.js" import { StatusCode, Role, CardModifier } from "./shared.js" import "@samual/lib/shuffle" function doMovePlayFaceUp(state, card, lane) { if (state.turn >= state.turns) return { status: StatusCode.MadeMoveOnFinishedGame } let cardPlayed, combat 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 (card[0] == CardModifier.Break) { if (!state.defenderStacks[lane].cards.length) return { status: StatusCode.PlayedBreakToEmptyStack } if (state.defenderStacks[lane].cards.some(card => card[0] == CardModifier.Break)) return { status: StatusCode.DefenderPlayedFaceUpBreakToStackWithBreak } let status if ( ((cardPlayed = state.defenderHand.splice(index, 1)[0]), state.defenderStacks[lane].cards.push(cardPlayed), ({ status: status, ...combat } = doCombat(state, lane)), status == StatusCode.AttackerWin) ) return { status: status, cardPlayed: cardPlayed, combat: combat } } else { if (!state.defenderStacks[lane].isFaceUp) return { status: StatusCode.PlayedCardFacedWrongWay } ;(cardPlayed = state.defenderHand.splice(index, 1)[0]), state.defenderStacks[lane].cards.push(cardPlayed) } } else { const index = 2 == card.length ? state.attackerHand.indexOf(card) : state.attackerHand.findIndex(([value]) => value == card) if (-1 == index) return { status: StatusCode.PlayedUnownedCard } if (card[0] == CardModifier.Break) { if (!state.attackerStacks[lane].length) return { status: StatusCode.PlayedBreakToEmptyStack } let status if ( ((cardPlayed = state.attackerHand.splice(index, 1)[0]), state.attackerStacks[lane].push(cardPlayed), ({ status: status, ...combat } = doCombat(state, lane)), status == StatusCode.AttackerWin) ) return { status: status, cardPlayed: cardPlayed, combat: combat } } else { if (card[0] != CardModifier.Bounce) return { status: StatusCode.PlayedCardFacedWrongWay } { let status ;(cardPlayed = state.attackerHand.splice(index, 1)[0]), state.attackerStacks[lane].push(cardPlayed), ({ status: status, ...combat } = doCombat(state, lane)), assert(status != StatusCode.AttackerWin, "attacker won when playing a face up bounce") } } } return ( state.turn++, state.turn == state.turns ? { status: StatusCode.DefenderWin, cardPlayed: cardPlayed, combat: combat } : { status: StatusCode.Ok, cardPlayed: cardPlayed, combat: combat } ) } export { doMovePlayFaceUp }