305 lines
8.8 KiB
JavaScript
305 lines
8.8 KiB
JavaScript
|
const Discord = require("discord.js");
|
||
|
module.exports = {
|
||
|
name: "blackjack",
|
||
|
usage: "(Number)",
|
||
|
description: "Play a blackjack game to win money",
|
||
|
category: "Economy",
|
||
|
timeout: 10000,
|
||
|
options: [
|
||
|
{
|
||
|
type: 4,
|
||
|
name: "cp",
|
||
|
description: "The number of CP you want to give",
|
||
|
required: true,
|
||
|
},
|
||
|
],
|
||
|
run: async (client, interaction, args) => {
|
||
|
let money = args[0];
|
||
|
const max = 100000;
|
||
|
if (money > max) money = max;
|
||
|
const user = interaction.user;
|
||
|
if (money < 100) {
|
||
|
interaction.followUp({
|
||
|
content: `You need to blackjack at least 100 ${client.currency}`,
|
||
|
});
|
||
|
} else if ((await client.bal(user.id)) < money) {
|
||
|
interaction.followUp({ content: "You don't have enough balance" });
|
||
|
} else {
|
||
|
let numCardsPulled = 0;
|
||
|
let gameOver = false;
|
||
|
const player = {
|
||
|
cards: [],
|
||
|
score: 0,
|
||
|
};
|
||
|
const dealer = {
|
||
|
cards: [],
|
||
|
score: 0,
|
||
|
};
|
||
|
function getCardsValue(a) {
|
||
|
let cardArray = [],
|
||
|
sum = 0,
|
||
|
i = 0,
|
||
|
dk = 10.5,
|
||
|
doubleking = "QQ",
|
||
|
aceCount = 0;
|
||
|
cardArray = a;
|
||
|
for (i; i < cardArray.length; i += 1) {
|
||
|
if (
|
||
|
cardArray[i].rank === "J" ||
|
||
|
cardArray[i].rank === "Q" ||
|
||
|
cardArray[i].rank === "K"
|
||
|
) {
|
||
|
sum += 10;
|
||
|
} else if (cardArray[i].rank === "A") {
|
||
|
sum += 11;
|
||
|
aceCount += 1;
|
||
|
} else if (cardArray[i].rank === doubleking) {
|
||
|
sum += dk;
|
||
|
} else {
|
||
|
sum += cardArray[i].rank;
|
||
|
}
|
||
|
}
|
||
|
while (aceCount > 0 && sum > 21) {
|
||
|
sum -= 10;
|
||
|
aceCount -= 1;
|
||
|
}
|
||
|
return sum;
|
||
|
}
|
||
|
|
||
|
const deck = {
|
||
|
deckArray: [],
|
||
|
initialize: function () {
|
||
|
let suitArray, rankArray, s, r, n;
|
||
|
suitArray = ["b", "d", "g", "s"];
|
||
|
rankArray = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"];
|
||
|
n = 13;
|
||
|
|
||
|
for (s = 0; s < suitArray.length; s += 1) {
|
||
|
for (r = 0; r < rankArray.length; r += 1) {
|
||
|
this.deckArray[s * n + r] = {
|
||
|
rank: rankArray[r],
|
||
|
suit: suitArray[s],
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
shuffle: function () {
|
||
|
let temp, i, rnd;
|
||
|
for (i = 0; i < this.deckArray.length; i += 1) {
|
||
|
rnd = Math.floor(Math.random() * this.deckArray.length);
|
||
|
temp = this.deckArray[i];
|
||
|
this.deckArray[i] = this.deckArray[rnd];
|
||
|
this.deckArray[rnd] = temp;
|
||
|
}
|
||
|
},
|
||
|
};
|
||
|
deck.initialize();
|
||
|
deck.shuffle();
|
||
|
async function bet(outcome) {
|
||
|
if (outcome === "win") {
|
||
|
await client.add(user.id, money, interaction);
|
||
|
await client.ADDBJWin(interaction.user.id);
|
||
|
}
|
||
|
if (outcome === "lose") {
|
||
|
await client.rmv(user.id, money);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function endMsg(f, msg, cl, dealerC) {
|
||
|
let cardsMsg = "";
|
||
|
player.cards.forEach(function (card) {
|
||
|
const emAR = ["♥", "♦", "♠", "♣"];
|
||
|
const t = emAR[Math.floor(Math.random() * emAR.length)];
|
||
|
cardsMsg += "[`" + t + card.rank.toString();
|
||
|
if (card.suit == "d1") cardsMsg += "♥";
|
||
|
if (card.suit == "d2") cardsMsg += "♦";
|
||
|
if (card.suit == "d3") cardsMsg += "♠";
|
||
|
if (card.suit == "d4") cardsMsg += "♣";
|
||
|
cardsMsg += "`](https://cath.gq/) ";
|
||
|
});
|
||
|
cardsMsg += " > " + player.score.toString();
|
||
|
|
||
|
let dealerMsg = "";
|
||
|
if (!dealerC) {
|
||
|
const emAR = ["♥", "♦", "♠", "♣"];
|
||
|
const t = emAR[Math.floor(Math.random() * emAR.length)];
|
||
|
dealerMsg = "[`" + t + dealer.cards[0].rank.toString();
|
||
|
if (dealer.cards[0].suit == "d1") dealerMsg += "♥";
|
||
|
if (dealer.cards[0].suit == "d2") dealerMsg += "♦";
|
||
|
if (dealer.cards[0].suit == "d3") dealerMsg += "♠";
|
||
|
if (dealer.cards[0].suit == "d4") dealerMsg += "♣";
|
||
|
dealerMsg += " ? ?`](https://cath.gq/)";
|
||
|
} else {
|
||
|
dealerMsg = "";
|
||
|
dealer.cards.forEach(function (card) {
|
||
|
const emAR = ["♥", "♦", "♠", "♣"];
|
||
|
const t = emAR[Math.floor(Math.random() * emAR.length)];
|
||
|
dealerMsg += "[`" + t + card.rank.toString();
|
||
|
if (card.suit == "d1") dealerMsg += "♥";
|
||
|
if (card.suit == "d2") dealerMsg += "♦";
|
||
|
if (card.suit == "d3") dealerMsg += "♠";
|
||
|
if (card.suit == "d4") dealerMsg += "♣";
|
||
|
dealerMsg += "`](https://cath.gq/) ";
|
||
|
});
|
||
|
dealerMsg += " > " + dealer.score.toString();
|
||
|
}
|
||
|
|
||
|
const gambleEmbed = new Discord.MessageEmbed()
|
||
|
.setColor(cl || client.color)
|
||
|
.setTimestamp()
|
||
|
.setFooter(`Made by ${client.author}`, client.user.displayAvatarURL())
|
||
|
.setTitle(interaction.user.username + `'s Blackjack game`)
|
||
|
.addField("You", cardsMsg, true)
|
||
|
.addField("NYX", dealerMsg, true)
|
||
|
.addField(f, msg);
|
||
|
interaction.followUp({ embeds: [gambleEmbed] });
|
||
|
}
|
||
|
|
||
|
async function endGame() {
|
||
|
if (player.score === 21) {
|
||
|
bet("win");
|
||
|
gameOver = true;
|
||
|
await endMsg(
|
||
|
`Win! You got 21!`,
|
||
|
`NYX had ${dealer.score.toString()}`,
|
||
|
`GREEN`
|
||
|
);
|
||
|
}
|
||
|
if (player.score > 21) {
|
||
|
bet("lose");
|
||
|
gameOver = true;
|
||
|
await endMsg(
|
||
|
`Lost! You reached over 21!`,
|
||
|
`NYX had ${dealer.score.toString()}`,
|
||
|
`RED`
|
||
|
);
|
||
|
}
|
||
|
if (dealer.score === 21) {
|
||
|
bet("lose");
|
||
|
gameOver = true;
|
||
|
await endMsg(
|
||
|
`Lost! The dealer got 21!`,
|
||
|
`NYX had ${dealer.score.toString()}`,
|
||
|
`RED`
|
||
|
);
|
||
|
}
|
||
|
if (dealer.score > 21) {
|
||
|
bet("win");
|
||
|
gameOver = true;
|
||
|
await endMsg(
|
||
|
`Win! NYX reached over 21!`,
|
||
|
`NYX had ${dealer.score.toString()}`,
|
||
|
`GREEN`
|
||
|
);
|
||
|
}
|
||
|
if (
|
||
|
dealer.score >= 17 &&
|
||
|
player.score > dealer.score &&
|
||
|
player.score < 21
|
||
|
) {
|
||
|
bet("win");
|
||
|
gameOver = true;
|
||
|
await endMsg(
|
||
|
`Win! You defeated NYX!`,
|
||
|
`NYX had ${dealer.score.toString()}`,
|
||
|
`GREEN`
|
||
|
);
|
||
|
}
|
||
|
if (
|
||
|
dealer.score >= 17 &&
|
||
|
player.score < dealer.score &&
|
||
|
dealer.score < 21
|
||
|
) {
|
||
|
bet("lose");
|
||
|
gameOver = true;
|
||
|
await endMsg(
|
||
|
`Lost! NYX won!`,
|
||
|
`NYX had ${dealer.score.toString()}`,
|
||
|
`RED`
|
||
|
);
|
||
|
}
|
||
|
if (
|
||
|
dealer.score >= 17 &&
|
||
|
player.score === dealer.score &&
|
||
|
dealer.score < 21
|
||
|
) {
|
||
|
gameOver = true;
|
||
|
await endMsg(`Tie!`, `NYX had ${dealer.score.toString()}`, `RED`);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function dealerDraw() {
|
||
|
dealer.cards.push(deck.deckArray[numCardsPulled]);
|
||
|
dealer.score = getCardsValue(dealer.cards);
|
||
|
numCardsPulled += 1;
|
||
|
}
|
||
|
|
||
|
function newGame() {
|
||
|
hit();
|
||
|
hit();
|
||
|
dealerDraw();
|
||
|
endGame();
|
||
|
}
|
||
|
|
||
|
function hit() {
|
||
|
player.cards.push(deck.deckArray[numCardsPulled]);
|
||
|
player.score = getCardsValue(player.cards);
|
||
|
|
||
|
numCardsPulled += 1;
|
||
|
if (numCardsPulled > 2) {
|
||
|
endGame();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function stand() {
|
||
|
while (dealer.score < 17) {
|
||
|
dealerDraw();
|
||
|
}
|
||
|
endGame();
|
||
|
}
|
||
|
newGame();
|
||
|
async function loop() {
|
||
|
if (gameOver) return;
|
||
|
|
||
|
endMsg(
|
||
|
"To hit type `h`, for stand type `s`",
|
||
|
`GoodLuck ;)`,
|
||
|
client.color
|
||
|
);
|
||
|
|
||
|
const filter = m => m.author.id === interaction.user.id;
|
||
|
interaction.channel
|
||
|
.awaitMessages({ filter, max: 1, time: 1200000, errors: ["time"] })
|
||
|
.then(interaction => {
|
||
|
interaction = interaction.first();
|
||
|
if (
|
||
|
interaction.content.toLowerCase() === "h" ||
|
||
|
interaction.content.toLowerCase() === "hit"
|
||
|
) {
|
||
|
hit();
|
||
|
loop();
|
||
|
return;
|
||
|
} else if (
|
||
|
interaction.content.toLowerCase() === "s" ||
|
||
|
interaction.content.toLowerCase() === "stand"
|
||
|
) {
|
||
|
stand();
|
||
|
loop();
|
||
|
return;
|
||
|
} else {
|
||
|
bet("lose");
|
||
|
endMsg("Invalid response", `You lost ${money}`, "RED");
|
||
|
return;
|
||
|
}
|
||
|
})
|
||
|
.catch(_ => {
|
||
|
interaction.channel.send({ content: "Lost!!" });
|
||
|
bet("lose");
|
||
|
return;
|
||
|
});
|
||
|
}
|
||
|
await loop();
|
||
|
}
|
||
|
},
|
||
|
};
|