import random import json import math from shutil import copyfile from funcs import logThis, replaceMultiple from . import money, blackjackDraw deckAmount = 4 def shuffle(): logThis("Shuffling the blackjack deck") with open("resources/games/deckofCards.txt","r") as f: deck = f.read() allDecks = deck.split("\n") * 4 random.shuffle(allDecks) data = "\n".join(allDecks) with open("resources/games/blackjackCards.txt","w") as f: f.write(data) return def calcHandValue(hand : list): logThis("Calculating hand value") values = [0] for card in hand: cardValue = card[0] cardValue = replaceMultiple(cardValue,["0","k","q","j"],"10") if cardValue == "a": length = len(values) for x in range(length): values.append(values[x] + 11) values[x] += 1 else: for x in range(len(values)): values[x] += int(cardValue) values.sort() handValue = values[0] for value in values: if value <= 21: handValue = value return handValue def drawCard(): logThis("drawing a card") with open("resources/games/blackjackCards.txt","r") as f: cards = f.read().split("\n") drawnCard = cards[0] cards = cards[1:] data = "\n".join(cards) with open("resources/games/blackjackCards.txt","w") as f: f.write(data) return drawnCard def dealerDraw(channel): with open("resources/games/games.json", "r") as f: data = json.load(f) done = False if calcHandValue(data["blackjack games"][channel]["dealer hand"]) < 17: data["blackjack games"][channel]["dealer hand"].append(drawCard()) else: done = True if calcHandValue(data["blackjack games"][channel]["dealer hand"]) > 21: data["blackjack games"][channel]["dealer busted"] = True with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) return done def blackjackContinue(channel): with open("resources/games/games.json", "r") as f: data = json.load(f) done = False if data["blackjack games"][channel]["open for bets"]: data["blackjack games"][channel]["open for bets"] = False allStanding = True message = "All players are standing. The dealer now shows his cards and draws." if data["blackjack games"][channel]["all standing"]: with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) done = dealerDraw(channel) message = "The dealer draws a card." with open("resources/games/games.json", "r") as f: data = json.load(f) for user in data["blackjack games"][channel]["user hands"]: if data["blackjack games"][channel]["user hands"][user]["hit"] == False: data["blackjack games"][channel]["user hands"][user]["standing"] = True if data["blackjack games"][channel]["user hands"][user]["standing"] == False: allStanding = False data["blackjack games"][channel]["user hands"][user]["hit"] = False if allStanding: data["blackjack games"][channel]["all standing"] = True with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) else: with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) blackjackDraw.drawImage(channel) if allStanding: if done == False: return message, True, done else: return "The dealer is done drawing cards", True, done else: return "You have 20 seconds to either hit or stand with \"!blackjack hit\" or \"!blackjack stand\". It's assumed you're standing if you don't make a choice.", False, done def blackjackHit(channel,user): with open("resources/games/games.json", "r") as f: data = json.load(f) if data["blackjack games"][channel]["open for bets"] == False: if data["blackjack games"][channel]["user hands"][user]["hit"] == False: if data["blackjack games"][channel]["user hands"][user]["standing"] == False: data["blackjack games"][channel]["user hands"][user]["hand"].append(drawCard()) data["blackjack games"][channel]["user hands"][user]["hit"] = True handValue = calcHandValue(data["blackjack games"][channel]["user hands"][user]["hand"]) if handValue == 21: data["blackjack games"][channel]["user hands"][user]["standing"] = True elif handValue > 21: data["blackjack games"][channel]["user hands"][user]["standing"] = True data["blackjack games"][channel]["user hands"][user]["busted"] = True with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) return "accept" else: logThis(user+" is already standing") return "You can't hit when you're standing" else: logThis(user+" has already hit this round") return "You've already hit this round" else: logThis(user+" tried to hit on the first round") return "You can't hit before you see your cards" def blackjackStand(channel,user): with open("resources/games/games.json", "r") as f: data = json.load(f) if data["blackjack games"][channel]["open for bets"] == False: if data["blackjack games"][channel]["user hands"][user]["hit"] == False: if data["blackjack games"][channel]["user hands"][user]["standing"] == False: data["blackjack games"][channel]["user hands"][user]["standing"] = True with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) return "accept" else: logThis(user+" is already standing") return "You're already standing" else: logThis(user+" has already hit this round") return "You've already hit this round" else: logThis(user+" tried to stand on the first round") return "You can't stand before you see your cards" def blackjackPlayerDrawHand(channel,user,bet): with open("resources/games/games.json", "r") as f: data = json.load(f) logThis(user+" is trying to join the game in "+channel) if channel in data["blackjack games"]: if user not in data["blackjack games"][channel]["user hands"]: if len(data["blackjack games"][channel]["user hands"]) < 5: if data["blackjack games"][channel]["open for bets"]: if money.checkBalance(user) >= bet: money.addMoney(user,-1 * bet) playerHand = [drawCard(),drawCard()] handValue = calcHandValue(playerHand) with open("resources/games/games.json", "r") as f: data = json.load(f) if handValue == 21: data["blackjack games"][channel]["user hands"][user] = {"hand":playerHand,"bet":bet,"standing":True,"busted":False,"blackjack":True,"hit":True} else: data["blackjack games"][channel]["user hands"][user] = {"hand":playerHand,"bet":bet,"standing":False,"busted":False,"blackjack":False,"hit":True} with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) logThis(user+" entered the game") return user+" entered the game" else: logThis(user+" doesn't have enough GwendoBucks") return "You don't have enough GwendoBucks to place that bet" else: logThis("The table is no longer open for bets") return "The table is no longer open for bets" else: logThis("There are already 5 players in the game.") return "There's already a maximum of players at the table." else: logThis(user+" is already in the game") return "You've already entered this game" else: logThis("There is no game going on in "+channel) return "There is no game going on in this channel" def blackjackStart(channel:str): with open("resources/games/games.json", "r") as f: data = json.load(f) logThis("Trying to start a blackjack game in "+channel) if channel not in data["blackjack games"]: dealerHand = [drawCard(),drawCard()] data["blackjack games"][channel] = {"dealer hand": dealerHand,"dealer busted":False,"user hands": {},"open for bets":True,"all standing":False} with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) copyfile("resources/games/blackjackTable.png","resources/games/tables/blackjackTable"+channel+".png") return "started" else: logThis("There is already a blackjack game going on in "+channel) return "There's already a blackjack game going on. Try again in a few minutes." def blackjackFinish(channel): finalWinnings = "*Final Winnings:*\n" with open("resources/games/games.json", "r") as f: data = json.load(f) dealerValue = calcHandValue(data["blackjack games"][channel]["dealer hand"]) reason = "" for user in data["blackjack games"][channel]["user hands"]: winnings = -1 * data["blackjack games"][channel]["user hands"][user]["bet"] if data["blackjack games"][channel]["user hands"][user]["blackjack"]: reason = "(blackjack)" winnings += math.floor(2.5 * data["blackjack games"][channel]["user hands"][user]["bet"]) else: if data["blackjack games"][channel]["user hands"][user]["busted"] == False: if data["blackjack games"][channel]["dealer busted"]: reason = "(dealer busted)" winnings += 2 * data["blackjack games"][channel]["user hands"][user]["bet"] elif calcHandValue(data["blackjack games"][channel]["user hands"][user]["hand"]) > dealerValue: winnings += 2 * data["blackjack games"][channel]["user hands"][user]["bet"] elif calcHandValue(data["blackjack games"][channel]["user hands"][user]["hand"]) == dealerValue: winnings += data["blackjack games"][channel]["user hands"][user]["bet"] else: reason = "(busted)" if winnings < 0: if winnings == -1: finalWinnings += user+" lost "+str(-1 * winnings)+" GwendoBuck "+reason+"\n" else: finalWinnings += user+" lost "+str(-1 * winnings)+" GwendoBucks "+reason+"\n" else: if winnings == 1: finalWinnings += user+" won "+str(winnings)+" GwendoBuck "+reason+"\n" else: finalWinnings += user+" won "+str(winnings)+" GwendoBucks "+reason+"\n" netWinnings = winnings + data["blackjack games"][channel]["user hands"][user]["bet"] money.addMoney(user,netWinnings) with open("resources/games/games.json", "r") as f: data = json.load(f) del data["blackjack games"][channel] with open("resources/games/games.json", "w") as f: json.dump(data,f,indent=4) return finalWinnings