This mini-app is called Atom Stack! The goal is to show you how you can use MagiScript's database functions to work with cards and card stacks. You can also use this app to learn stacks. The Si Stebbins, Mnemonica, Aronson, and Memorandum stacks are currently supported, but we can add more on demand.
The idea is simple. Enter the position of a card in an AC->AK, AD->KD, AH->KH, and AS->KS card stack (we call this "simple"), and Atom will display this and the next two cards in your chosen card stack. AC is 1. 2C is 2. 9C is 9. AH is 27. 3H is 29. AK is 52.
You can also "move around" with the bottom left and bottom right buttons. You can use this to learn, try guessing the next cards.
If you need help, just enter 00, and you will get some. 🙂
const STACK = 'sistebbins';
/*
'simple': simple deck: clubs, diamonds, hearts, and spades from Ace to King
'new': a new deck order: AH->KH, AC->KC, KD->AD, KS->AS
'sistebbins': Si Stebbins stack
'mnemonica': Mnemonica by Juan Tamariz
'aronson': Aronson stack by Simon Aronson
'memorandum': Memorandum by Woody Aragón
*/
function main() {
ps.connect('*');
ps.print('AtomStack');
setTimeout(help, 2000);
}
let card = '';
let cardPosInStack = 0;
let mapping = [
'1', '2', '3',
'4', '5', '6',
'7', '8', '9',
'<', '0', '>'
];
function search() {
if (card === '') return;
let cardCode = parseInt(card);
card = ''; // reset the input
if (cardCode === 0) {
help();
return;
}
cardCode = (cardCode - 1) % 52; // 1st card has index 0
let simpleCard = db.query('card', 'simple', cardCode);
let cardInStack = db.query('card', STACK, simpleCard.name);
cardPosInStack = cardInStack.pos;
display();
}
function move(direction) {
if (direction === '<') {
cardPosInStack = cardPosInStack - 1;
if (cardPosInStack < 0) {
cardPosInStack = 51;
}
}
if (direction === '>') {
cardPosInStack = cardPosInStack + 1;
if (cardPosInStack > 51) {
cardPosInStack = 0;
}
}
display();
}
let timeout = 0;
function onButtonClick(buttonId) {
let key = mapping[buttonId];
if (key === '<' || key === '>') {
move(key);
return;
}
card = card + key;
ps.print(`<${card}>`);
clearTimeout(timeout);
if (strLen(card) === 2) {
search();
} else {
timeout = setTimeout(search, 3000);
}
}
function display() {
const card1 = db.query('card', STACK, cardPosInStack);
const card2 = db.query('card', STACK, cardPosInStack + 1);
const card3 = db.query('card', STACK, cardPosInStack + 2);
ps.print(`${card1.name} ${card2.name} ${card3.name}`);
}
function help() {
ps.print('♣ 0 ♦13\n♥26 ♠39');
}
function onEvent(e) {
if (e.type === 'click' && e.source === 'atom:button') {
onButtonClick(parseInt(e.value));
}
}
Let me explain how the code calculates the cards. Line 36, gets the representation of the card referred by the position number you have entered. Then using the name of this card (like 7D), it gets the representation of the card in the chosen stack. The important property is the "pos", we are storing it, and at line 75 in the display function, the three cards will be queried, and their string name will be used to display them. If PeekSmith 3's "Smart Text" is on, these will be displayed as color cards.
AtomStack
Si Stebbins
3S 6D 9C
QH 2S 5D