card-factory
Version:
A comprehensive library for card manipulation
72 lines (71 loc) • 2.65 kB
JavaScript
const s = {};
const d = {};
const c = {};
export const quickPassRules = {
alwaysPass: (_, __, ___) => true,
neverPass: (_, __, ___) => false,
onlyFaceUp: (_, __, card = c) => {
return card.card.faceUp;
},
onlyTopCard: (source = s, __, card = c) => {
return source.topCardElement === card;
},
redBlackAlternating: (source = s, __, card = c) => {
const cardIndex = source.cardElements.findIndex((element) => JSON.stringify(element) === JSON.stringify(card));
if (cardIndex === -1)
return false;
const cardsOnTop = source.cardElements.slice(cardIndex);
// To move a pile, must be in sequence
return cardsOnTop.every((cardElement, index, arr) => {
if (index === 0)
return true; // First card has nothing to compare with
const prevCard = arr[index - 1].card;
const currentCard = cardElement.card;
return (prevCard.color !== currentCard.color &&
prevCard.value === currentCard.value + 1);
});
},
};
export const quickReceiveRules = {
alwaysReceive: (_, __, ___) => true,
neverReceive: (_, __, ___) => false,
onlyIfEmpty: (_, dest = d, ___) => {
return dest.cardElements.length === 0;
},
emptyAndRedBlackAlternating: (_, dest = d, card = c) => {
// always must be willing to receive if no cards in the pile, this shortcut must be here for every rule
if (dest.cardElements.length === 0)
return true;
if (card.card.color === dest.topCardElement.card.color)
return false;
else
return true;
},
emptyAndOneLessThanTopCard: (_, dest = d, card = c) => {
if (dest.cardElements.length === 0)
return true;
if (card.card.value !== dest.topCardElement.card.value - 1)
return false;
else
return true;
},
emptyAndOneMoreThanTopCard: (_, dest = d, card = c) => {
if (dest.cardElements.length === 0)
return true;
if (card.card.value !== dest.topCardElement.card.value + 1)
return false;
else
return true;
},
onlySpecificCardValue: (_, __, card = c, specificValue) => {
return card.card.value === specificValue;
},
sameSuitPlusOneOrAce: (_, dest = d, card = c) => {
if (dest.cardElements.length > 0) {
const topCard = dest.topCardElement.card;
return (topCard.suit === card.card.suit && card.card.value - 1 === topCard.value);
}
else
return card.card.value === 1;
},
};