mirror of
https://github.com/arthur-pbty/xiao.git
synced 2026-06-21 05:54:33 +02:00
Playing Card Commands structure system
This commit is contained in:
@@ -1,8 +1,7 @@
|
|||||||
const Command = require('../../structures/Command');
|
const Command = require('../../structures/Command');
|
||||||
const { stripIndents } = require('common-tags');
|
const { stripIndents } = require('common-tags');
|
||||||
const { shuffle, verify } = require('../../util/Util');
|
const { verify } = require('../../util/Util');
|
||||||
const suits = ['♣', '♥', '♦', '♠'];
|
const Deck = require('../../structures/cards/Deck');
|
||||||
const faces = ['Jack', 'Queen', 'King'];
|
|
||||||
const hitWords = ['hit', 'hit me'];
|
const hitWords = ['hit', 'hit me'];
|
||||||
const standWords = ['stand'];
|
const standWords = ['stand'];
|
||||||
|
|
||||||
@@ -32,7 +31,7 @@ module.exports = class BlackjackCommand extends Command {
|
|||||||
const current = this.client.games.get(msg.channel.id);
|
const current = this.client.games.get(msg.channel.id);
|
||||||
if (current) return msg.reply(`Please wait until the current game of \`${current.name}\` is finished.`);
|
if (current) return msg.reply(`Please wait until the current game of \`${current.name}\` is finished.`);
|
||||||
try {
|
try {
|
||||||
this.client.games.set(msg.channel.id, { name: this.name, data: this.generateDeck(deckCount) });
|
this.client.games.set(msg.channel.id, { name: this.name, data: new Deck({ deckCount }) });
|
||||||
const dealerHand = [];
|
const dealerHand = [];
|
||||||
this.draw(msg.channel, dealerHand);
|
this.draw(msg.channel, dealerHand);
|
||||||
this.draw(msg.channel, dealerHand);
|
this.draw(msg.channel, dealerHand);
|
||||||
@@ -114,44 +113,18 @@ module.exports = class BlackjackCommand extends Command {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
generateDeck(deckCount) {
|
|
||||||
const deck = [];
|
|
||||||
for (let i = 0; i < deckCount; i++) {
|
|
||||||
for (const suit of suits) {
|
|
||||||
deck.push({
|
|
||||||
value: 11,
|
|
||||||
display: `${suit} Ace`
|
|
||||||
});
|
|
||||||
for (let j = 2; j <= 10; j++) {
|
|
||||||
deck.push({
|
|
||||||
value: j,
|
|
||||||
display: `${suit} ${j}`
|
|
||||||
});
|
|
||||||
}
|
|
||||||
for (const face of faces) {
|
|
||||||
deck.push({
|
|
||||||
value: 10,
|
|
||||||
display: `${suit} ${face}`
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return shuffle(deck);
|
|
||||||
}
|
|
||||||
|
|
||||||
draw(channel, hand) {
|
draw(channel, hand) {
|
||||||
const deck = this.client.games.get(channel.id).data;
|
const { deck } = this.client.games.get(channel.id).data;
|
||||||
const card = deck[0];
|
const card = deck.draw();
|
||||||
deck.shift();
|
|
||||||
hand.push(card);
|
hand.push(card);
|
||||||
return card;
|
return card;
|
||||||
}
|
}
|
||||||
|
|
||||||
calculate(hand) {
|
calculate(hand) {
|
||||||
return hand.sort((a, b) => a.value - b.value).reduce((a, b) => {
|
return hand.sort((a, b) => a.blackjackValue - b.blackjackValue).reduce((a, b) => {
|
||||||
let { value } = b;
|
let { blackjackValue } = b;
|
||||||
if (value === 11 && a + value > 21) value = 1;
|
if (blackjackValue === 11 && a + blackjackValue > 21) blackjackValue = 1;
|
||||||
return a + value;
|
return a + blackjackValue;
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
const Command = require('../../structures/Command');
|
const Command = require('../../structures/Command');
|
||||||
const { shuffle } = require('../../util/Util');
|
const Deck = require('../../structures/cards/Deck');
|
||||||
const suits = ['♣', '♥', '♦', '♠'];
|
|
||||||
const faces = ['Jack', 'Queen', 'King'];
|
|
||||||
|
|
||||||
module.exports = class DrawCardsCommand extends Command {
|
module.exports = class DrawCardsCommand extends Command {
|
||||||
constructor(client) {
|
constructor(client) {
|
||||||
@@ -28,26 +26,11 @@ module.exports = class DrawCardsCommand extends Command {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
this.deck = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
run(msg, { amount, jokers }) {
|
run(msg, { amount, jokers }) {
|
||||||
if (!this.deck) this.deck = this.generateDeck();
|
const deck = new Deck({ includeJokers: jokers });
|
||||||
let cards = this.deck;
|
const cards = deck.draw(amount);
|
||||||
if (!jokers) cards = cards.filter(card => !card.includes('Joker'));
|
return msg.reply(`${amount === 1 ? '' : '\n'}${Array.isArray(cards) ? cards.join('\n') : cards}`);
|
||||||
return msg.reply(`${amount === 1 ? '' : '\n'}${shuffle(cards).slice(0, amount).join('\n')}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
generateDeck() {
|
|
||||||
const deck = [];
|
|
||||||
for (const suit of suits) {
|
|
||||||
deck.push(`${suit} Ace`);
|
|
||||||
for (let i = 2; i <= 10; i++) deck.push(`${suit} ${i}`);
|
|
||||||
for (const face of faces) deck.push(`${suit} ${face}`);
|
|
||||||
}
|
|
||||||
deck.push('⭐ Joker');
|
|
||||||
deck.push('⭐ Joker');
|
|
||||||
return deck;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "xiao",
|
"name": "xiao",
|
||||||
"version": "114.8.7",
|
"version": "114.8.8",
|
||||||
"description": "Your personal server companion.",
|
"description": "Your personal server companion.",
|
||||||
"main": "Xiao.js",
|
"main": "Xiao.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -49,6 +49,7 @@
|
|||||||
"moment-duration-format": "^2.3.2",
|
"moment-duration-format": "^2.3.2",
|
||||||
"moment-timezone": "^0.5.28",
|
"moment-timezone": "^0.5.28",
|
||||||
"node-superfetch": "^0.1.10",
|
"node-superfetch": "^0.1.10",
|
||||||
|
"pokersolver": "^2.1.3",
|
||||||
"random-js": "^2.1.0",
|
"random-js": "^2.1.0",
|
||||||
"rss-parser": "^3.8.0",
|
"rss-parser": "^3.8.0",
|
||||||
"soap": "^0.31.0",
|
"soap": "^0.31.0",
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
const displaySuits = {
|
||||||
|
spades: '♠',
|
||||||
|
diamonds: '♦',
|
||||||
|
hearts: '♥',
|
||||||
|
clubs: '♣',
|
||||||
|
joker: '⭐'
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = class Card {
|
||||||
|
constructor(value, suit) {
|
||||||
|
this.value = value;
|
||||||
|
this.suit = suit;
|
||||||
|
}
|
||||||
|
|
||||||
|
get blackjackValue() {
|
||||||
|
if (this.value === 'Joker') return 0;
|
||||||
|
if (this.value === 'King' || this.value === 'Queen' || this.value === 'Jack') return 10;
|
||||||
|
if (this.value === 'Ace') return 11;
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
get display() {
|
||||||
|
return `${displaySuits[this.suit]} ${this.value}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
get pokersolverKey() {
|
||||||
|
if (this.value === 'Joker') return null;
|
||||||
|
let suitLetter;
|
||||||
|
switch (this.suit) {
|
||||||
|
case 'clubs': suitLetter = 'c'; break;
|
||||||
|
case 'hearts': suitLetter = 'h'; break;
|
||||||
|
case 'diamonds': suitLetter = 'd'; break;
|
||||||
|
case 'spades': suitLetter = 's'; break;
|
||||||
|
}
|
||||||
|
let value;
|
||||||
|
switch (this.value) {
|
||||||
|
case 'King': value = 'K'; break;
|
||||||
|
case 'Queen': value = 'Q'; break;
|
||||||
|
case 'Jack': value = 'J'; break;
|
||||||
|
case 'Ace': value = 'A'; break;
|
||||||
|
case 10: value = 'T'; break;
|
||||||
|
default: value = this.value; break;
|
||||||
|
}
|
||||||
|
return `${value}${suitLetter}`;
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
const Card = require('./Card');
|
||||||
|
const suits = ['spades', 'hearts', 'diamonds', 'clubs'];
|
||||||
|
const faces = ['Jack', 'Queen', 'King'];
|
||||||
|
const { shuffle } = require('../../util/Util');
|
||||||
|
|
||||||
|
module.exports = class Deck {
|
||||||
|
constructor(options) {
|
||||||
|
this.deckCount = options.deckCount || 1;
|
||||||
|
this.includeJokers = options.includeJokers || false;
|
||||||
|
this.deck = [];
|
||||||
|
this.makeCards(this.deckCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
makeCards(deckCount) {
|
||||||
|
for (let i = 0; i < deckCount; i++) {
|
||||||
|
for (const suit of suits) {
|
||||||
|
this.deck.push(new Card('Ace', suit));
|
||||||
|
for (let j = 2; j <= 10; j++) this.deck.push(new Card(j, suit));
|
||||||
|
for (const face of faces) this.deck.push(new Card(face, suit));
|
||||||
|
}
|
||||||
|
if (this.includeJokers) {
|
||||||
|
this.deck.push(new Card('Joker', 'joker'));
|
||||||
|
this.deck.push(new Card('Joker', 'joker'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.deck = shuffle(this.deck);
|
||||||
|
return this.deck;
|
||||||
|
}
|
||||||
|
|
||||||
|
draw(amount = 1) {
|
||||||
|
const cards = [];
|
||||||
|
for (let i = 0; i < amount; i++) {
|
||||||
|
const card = this.deck[0];
|
||||||
|
this.deck.shift();
|
||||||
|
cards.push(card);
|
||||||
|
}
|
||||||
|
return amount === 1 ? cards[0] : cards;
|
||||||
|
}
|
||||||
|
|
||||||
|
reset() {
|
||||||
|
this.deck = this.makeCards(this.deckCount);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user