2021-06-12 12:53:51 +02:00
|
|
|
const Discord = require("discord.js");
|
|
|
|
module.exports = {
|
|
|
|
name: "blackjack",
|
|
|
|
aliases: ["bj"],
|
|
|
|
usage: "(Number)",
|
|
|
|
description: "Play a blackjack game to win money",
|
|
|
|
category: "Economy",
|
2021-07-13 05:17:39 +02:00
|
|
|
//timeout: 10000,
|
2021-06-12 12:53:51 +02:00
|
|
|
run: async (client, message, args) => {
|
|
|
|
const money = parseInt(args[0]);
|
|
|
|
const author = message.author;
|
|
|
|
if (isNaN(money) || !money) {
|
|
|
|
return client.err(message, "Economy", "blackjack", 101);
|
|
|
|
}
|
2021-07-13 05:17:39 +02:00
|
|
|
if ((await client.bal(author.id)) < bet) {
|
2021-06-12 12:53:51 +02:00
|
|
|
client.err(message, "Economy", "blackjack", 20);
|
|
|
|
}
|
|
|
|
var numCardsPulled = 0;
|
|
|
|
var gameOver = false;
|
|
|
|
var player = {
|
|
|
|
cards: [],
|
|
|
|
score: 0,
|
|
|
|
};
|
|
|
|
var dealer = {
|
|
|
|
cards: [],
|
|
|
|
score: 0,
|
|
|
|
};
|
|
|
|
function getCardsValue(a) {
|
|
|
|
var 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;
|
|
|
|
}
|
|
|
|
|
|
|
|
var deck = {
|
|
|
|
deckArray: [],
|
|
|
|
initialize: function () {
|
|
|
|
var 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 () {
|
|
|
|
var 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") {
|
2021-07-13 05:17:39 +02:00
|
|
|
await client.add(author.id, money, message);
|
|
|
|
await client.ADDBJWin(message.author.id);
|
2021-06-12 12:53:51 +02:00
|
|
|
}
|
|
|
|
if (outcome === "lose") {
|
2021-07-13 05:17:39 +02:00
|
|
|
await client.rmv(author.id, money);
|
2021-06-12 12:53:51 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function endMsg(f, msg, cl, dealerC) {
|
|
|
|
let cardsMsg = "";
|
|
|
|
player.cards.forEach(function (card) {
|
|
|
|
var emAR = ["♥", "♦", "♠", "♣"];
|
|
|
|
var 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();
|
|
|
|
|
|
|
|
var dealerMsg = "";
|
|
|
|
if (!dealerC) {
|
|
|
|
var emAR = ["♥", "♦", "♠", "♣"];
|
|
|
|
var 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) {
|
|
|
|
var emAR = ["♥", "♦", "♠", "♣"];
|
|
|
|
var 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()
|
2021-07-13 05:17:39 +02:00
|
|
|
.setColor(cl || client.color)
|
2021-06-12 12:53:51 +02:00
|
|
|
.setTitle(message.author.username + `'s Blackjack game`)
|
|
|
|
.addField("You", cardsMsg, true)
|
|
|
|
.addField("cath.exe", dealerMsg, true)
|
|
|
|
.addField(f, msg);
|
|
|
|
message.channel.send(gambleEmbed);
|
|
|
|
}
|
|
|
|
|
|
|
|
async function endGame() {
|
|
|
|
if (player.score === 21) {
|
|
|
|
bet("win");
|
|
|
|
gameOver = true;
|
|
|
|
await endMsg(
|
|
|
|
`Win! You got 21!`,
|
|
|
|
`cath.exe had ${dealer.score.toString()}`,
|
|
|
|
`GREEN`
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (player.score > 21) {
|
|
|
|
bet("lose");
|
|
|
|
gameOver = true;
|
|
|
|
await endMsg(
|
|
|
|
`Lost! You reached over 21!`,
|
|
|
|
`cath.exe had ${dealer.score.toString()}`,
|
|
|
|
`RED`
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (dealer.score === 21) {
|
|
|
|
bet("lose");
|
|
|
|
gameOver = true;
|
|
|
|
await endMsg(
|
|
|
|
`Lost! The dealer got 21!`,
|
|
|
|
`cath.exe had ${dealer.score.toString()}`,
|
|
|
|
`RED`
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (dealer.score > 21) {
|
|
|
|
bet("win");
|
|
|
|
gameOver = true;
|
|
|
|
await endMsg(
|
|
|
|
`Win! cath.exe reached over 21!`,
|
|
|
|
`cath.exe 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 cath.exe!`,
|
|
|
|
`cath.exe had ${dealer.score.toString()}`,
|
|
|
|
`GREEN`
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
dealer.score >= 17 &&
|
|
|
|
player.score < dealer.score &&
|
|
|
|
dealer.score < 21
|
|
|
|
) {
|
|
|
|
bet("lose");
|
|
|
|
gameOver = true;
|
|
|
|
await endMsg(
|
|
|
|
`Lost! cath.exe won!`,
|
|
|
|
`cath.exe had ${dealer.score.toString()}`,
|
|
|
|
`RED`
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (
|
|
|
|
dealer.score >= 17 &&
|
|
|
|
player.score === dealer.score &&
|
|
|
|
dealer.score < 21
|
|
|
|
) {
|
|
|
|
gameOver = true;
|
2021-07-13 05:17:39 +02:00
|
|
|
await endMsg(`Tie!`, `cath.exe had ${dealer.score.toString()}`, `RED`);
|
2021-06-12 12:53:51 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
2021-07-13 05:17:39 +02:00
|
|
|
endMsg(
|
|
|
|
"To hit type `h`, for stand type `s`",
|
|
|
|
`GoodLuck ;)`,
|
|
|
|
client.color
|
|
|
|
);
|
2021-06-12 12:53:51 +02:00
|
|
|
|
|
|
|
let filter = m => m.author.id === message.author.id;
|
|
|
|
message.channel
|
|
|
|
.awaitMessages(filter, {
|
|
|
|
max: 1,
|
|
|
|
time: 1200000,
|
|
|
|
errors: ["time"],
|
|
|
|
})
|
|
|
|
.then(message => {
|
|
|
|
message = message.first();
|
2021-07-13 05:17:39 +02:00
|
|
|
if (
|
|
|
|
message.content.toLowerCase() === "h" ||
|
|
|
|
message.content.toLowerCase() === "hit"
|
|
|
|
) {
|
2021-06-12 12:53:51 +02:00
|
|
|
hit();
|
|
|
|
loop();
|
|
|
|
return;
|
2021-07-13 05:17:39 +02:00
|
|
|
} else if (
|
|
|
|
message.content.toLowerCase() === "s" ||
|
|
|
|
message.content.toLowerCase() === "stand"
|
|
|
|
) {
|
2021-06-12 12:53:51 +02:00
|
|
|
stand();
|
|
|
|
loop();
|
|
|
|
return;
|
|
|
|
} else {
|
|
|
|
bet("lose");
|
|
|
|
endMsg("Invalid response", `You lost ${money}`, "RED");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(_ => {
|
|
|
|
message.channel.send("Lost!!");
|
|
|
|
bet("lose");
|
|
|
|
return;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
await loop();
|
|
|
|
},
|
|
|
|
};
|