binmat
Version:
binmat simulator
65 lines (64 loc) • 2.71 kB
JavaScript
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 }