From 652245941e457826b064299377fcb03f06b1c967 Mon Sep 17 00:00:00 2001 From: acidvegas Date: Mon, 24 Jun 2019 19:00:01 -0400 Subject: [PATCH] Initial commit --- LICENSE | 15 ++ README.md | 22 ++ blackjack/blackjack.py | 20 ++ blackjack/core/config.py | 34 ++++ blackjack/core/database.py | 27 +++ blackjack/core/debug.py | 63 ++++++ blackjack/core/irc.py | 398 +++++++++++++++++++++++++++++++++++++ blackjack/data/cheat.txt | 32 +++ blackjack/data/help.txt | 31 +++ screens/banner.png | Bin 0 -> 9111 bytes screens/cheat.png | Bin 0 -> 30389 bytes screens/game.png | Bin 0 -> 19796 bytes 12 files changed, 642 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 blackjack/blackjack.py create mode 100644 blackjack/core/config.py create mode 100644 blackjack/core/database.py create mode 100644 blackjack/core/debug.py create mode 100644 blackjack/core/irc.py create mode 100644 blackjack/data/cheat.txt create mode 100644 blackjack/data/help.txt create mode 100644 screens/banner.png create mode 100644 screens/cheat.png create mode 100644 screens/game.png diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..69997e8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,15 @@ +ISC License + +Copyright (c) 2019, acidvegas + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..69f62fe --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +![](screens/banner.png) + +###### Commands +| Command | Description | +| --- | --- | +| @help | Information about the commands. | +| @cheat | Betting cheat sheet. | +| .hit | Draw a card. | +| .mini | Toggle the mini deck. | +| .play | Start a game. | +| .stand | Stop drawing cards. | +| .stop | End the curent game. | + +##### Todo +- Add player database / chip system. +- Reward chips based on number of lines of chat in a channel. (Cap it to prevent flood.) +- Add a player versus player and a player versus computer system. +- Incorperate splits and double downs, etc. + +##### Screens +![](screens/game.png) +![](screens/cheat.png) \ No newline at end of file diff --git a/blackjack/blackjack.py b/blackjack/blackjack.py new file mode 100644 index 0000000..f164d38 --- /dev/null +++ b/blackjack/blackjack.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python +# BlackJack IRC Bot - Developed by acidvegas in Python (https://acid.vegas/blackjack) +# blackjack.py + +import os +import sys + +sys.dont_write_bytecode = True +os.chdir(sys.path[0] or '.') +sys.path += ('core',) + +import debug + +debug.info() +if not debug.check_version(3): + debug.error_exit('BlackJack requires Python 3!') +elif debug.check_privileges(): + debug.error_exit('Do not run BlackJack as admin/root!') +import irc +irc.BlackJack.connect() \ No newline at end of file diff --git a/blackjack/core/config.py b/blackjack/core/config.py new file mode 100644 index 0000000..135af5a --- /dev/null +++ b/blackjack/core/config.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python +# BlackJack IRC Bot - Developed by acidvegas in Python (https://acid.vegas/blackjack) +# config.py + +class connection: + server = 'irc.server.com' + port = 6667 + proxy = None + ipv6 = False + ssl = False + ssl_verify = False + vhost = None + channel = '#blackjack' + key = None + +class cert: + file = None + key = None + password = None + +class ident: + nickname = 'BlackJack' + username = 'blackjack' + realname = 'https://acid.vegas/blackjack' + +class login: + network = None + nickserv = None + operator = None + +class settings: + cmd_char = '!' + log = False + modes = None diff --git a/blackjack/core/database.py b/blackjack/core/database.py new file mode 100644 index 0000000..72653f1 --- /dev/null +++ b/blackjack/core/database.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# BlackJack IRC Bot - Developed by acidvegas in Python (https://acid.vegas/blackjack) +# functions.py + +import datetime +import os +import sqlite3 + +# Globals +db = sqlite3.connect(os.path.join('data', 'bot.db'), check_same_thread=False) +sql = db.cursor() + +def check(): + tables = sql.execute('SELECT name FROM sqlite_master WHERE type=\'table\'').fetchall() + if not len(tables): + sql.execute('CREATE TABLE IGNORE (IDENT TEXT NOT NULL);') + db.commit() + +class Player: + def register(nick, ident): + now = str(datetime.datetime.now()) + sql.execute('INSERT INTO PLAYERS (NICK,IDENT,MONEY,LAST) VALUES (\'{0}\', \'{1}\', \'{2}\', \'{3}\')'.format(nick, ident, '0', now)) + db.commit() + + def get_money(ident): + return sql.execute('SELECT MONEY FROM PLAYERS WHERE IDENT=\'{0}\''.format(ident)).fetchall()[0][0] + diff --git a/blackjack/core/debug.py b/blackjack/core/debug.py new file mode 100644 index 0000000..6594fb7 --- /dev/null +++ b/blackjack/core/debug.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# BlackJack IRC Bot - Developed by acidvegas in Python (https://acid.vegas/blackjack) +# debug.py + +import ctypes +import os +import sys +import time + +def check_privileges(): + if check_windows(): + if ctypes.windll.shell32.IsUserAnAdmin() != 0: + return True + else: + return False + else: + if os.getuid() == 0 or os.geteuid() == 0: + return True + else: + return False + +def check_version(major): + if sys.version_info.major == major: + return True + else: + return False + +def check_windows(): + if os.name == 'nt': + return True + else: + return False + +def clear(): + if check_windows(): + os.system('cls') + else: + os.system('clear') + +def error(msg, reason=None): + if reason: + print(f'{get_time()} | [!] - {msg} ({reason})') + else: + print(f'{get_time()} | [!] - {msg}') + +def error_exit(msg): + raise SystemExit(f'{get_time()} | [!] - {msg}') + +def get_time(): + return time.strftime('%I:%M:%S') + +def info(): + clear() + print(''.rjust(56, '#')) + print('#{0}#'.format(''.center(54))) + print('#{0}#'.format('BlackJack IRC Bot'.center(54))) + print('#{0}#'.format('Developed by acidvegas in Python'.center(54))) + print('#{0}#'.format('https://acid.vegas/blackjack'.center(54))) + print('#{0}#'.format(''.center(54))) + print(''.rjust(56, '#')) + +def irc(msg): + print(f'{get_time()} | [~] - {msg}') \ No newline at end of file diff --git a/blackjack/core/irc.py b/blackjack/core/irc.py new file mode 100644 index 0000000..819f91c --- /dev/null +++ b/blackjack/core/irc.py @@ -0,0 +1,398 @@ +#!/usr/bin/env python +# BlackJack IRC Bot - Developed by acidvegas in Python (https://acid.vegas/blackjack) +# irc.py + +import inspect +import os +import random +import socket +import ssl +import threading +import time + +import config +import debug + +# Data Directories & Files (DO NOT EDIT) +data_dir = os.path.join(os.path.dirname(os.path.realpath(inspect.stack()[-1][1])), 'data') +cheat_file = os.path.join(data_dir, 'cheat.txt') +help_file = os.path.join(data_dir, 'help.txt') + +# Card Types +club = ('♣','clubs') +diamond = ('♦','diamonds') +heart = ('♥','hearts') +spade = ('♠','spades') + +# Deck Table (Name, ASCII, Value, Remaining Suits) +deck = { + 'ace' : [None, 11, [club,diamond,heart,spade]], + 'two' : [None, 2, [club,diamond,heart,spade]], + 'three' : [None, 3, [club,diamond,heart,spade]], + 'four' : [None, 4, [club,diamond,heart,spade]], + 'five' : [None, 5, [club,diamond,heart,spade]], + 'six' : [None, 6, [club,diamond,heart,spade]], + 'seven' : [None, 7, [club,diamond,heart,spade]], + 'eight' : [None, 8, [club,diamond,heart,spade]], + 'nine' : [None, 9, [club,diamond,heart,spade]], + 'ten' : [None, 10, [club,diamond,heart,spade]], + 'jack' : [None, 10, [club,diamond,heart,spade]], + 'queen' : [None, 10, [club,diamond,heart,spade]], + 'king' : [None, 10, [club,diamond,heart,spade]] +} + +# Formatting Control Characters / Color Codes +bold = '\x02' +italic = '\x1D' +underline = '\x1F' +reverse = '\x16' +reset = '\x0f' +white = '00' +black = '01' +blue = '02' +green = '03' +red = '04' +brown = '05' +purple = '06' +orange = '07' +yellow = '08' +light_green = '09' +cyan = '10' +light_cyan = '11' +light_blue = '12' +pink = '13' +grey = '14' +light_grey = '15' + +def color(msg, foreground, background=None): + if background: + return '\x03{0},{1}{2}{3}'.format(foreground, background, msg, reset) + else: + return '\x03{0}{1}{2}'.format(foreground, msg, reset) + +class IRC(object): + def __init__(self): + self.ace_minus = False + self.hand = None + self.last_move = 0 + self.last_time = 0 + self.player = None + self.total = 0 + self.mini_deck = False + self.sock = None + + def action(self, chan, msg): + self.sendmsg(chan, '\x01ACTION {0}\x01'.format(msg)) + + def connect(self): + try: + self.create_socket() + self.sock.connect((config.connection.server, config.connection.port)) + if config.login.network: + self.raw('PASS ' + config.login.network) + self.raw('USER {0} 0 * :{1}'.format(config.ident.username, config.ident.realname)) + self.raw('NICK ' + config.ident.nickname) + except socket.error as ex: + debug.error('Failed to connect to IRC server.', ex) + self.event_disconnect() + else: + self.listen() + + def create_socket(self): + family = socket.AF_INET6 if config.connection.ipv6 else socket.AF_INET + self.sock = socket.socket(family, socket.SOCK_STREAM) + if config.connection.vhost: + self.sock.bind((config.connection.vhost, 0)) + if config.connection.ssl: + self.sock = ssl.wrap_socket(self.sock) + + def draw(self): + card_type = random.choice(list(deck.keys())) + remaining = deck[card_type][2] + while not remaining: + card_type = random.choice(list(deck.keys())) + remaining = deck[card_type][2] + card_suit = random.choice(remaining) + if card_suit in (heart,diamond): + card_color = red + else: + card_color = black + card_value = deck[card_type][1] + if self.mini_deck: + card = deck[card_type][0].replace('X', card_suit[0]) + card = color(card, card_color, white) + self.hand.append(card) + else: + for i in range(5): + card = deck[card_type][0][i].replace('X', card_suit[0]) + card = color(card, card_color, white) + self.hand[i].append(card) + deck[card_type][2].remove(card_suit) + self.total += card_value + if card_type == 'ace' and deck['ace'][1] != 1: + deck['ace'][1] = 1 + return (card_type, card_suit) + + def error(self, chan, msg, reason=None): + if reason: + self.sendmsg(chan, '[{0}] {1} {2}'.format(color('ERROR', red), msg, color('({0})'.format(str(reason)), grey))) + else: + self.sendmsg(chan, '[{0}] {1}'.format(color('ERROR', red), msg)) + + def event_connect(self): + self.setup_deck('normal') + if config.login.nickserv: + self.identify(self.username, config.login.nickserv) + if config.login.operator: + self.oper(config.ident.username, config.login.operator) + self.join(config.connection.channel, config.connection.key) + + def event_disconnect(self): + self.sock.close() + self.reset() + time.sleep(10) + self.connect() + + def event_kick(self, nick, chan, kicked): + if kicked == config.ident.nickname and chan == config.connection.channel: + time.sleep(3) + self.join(config.connection.channel, config.connection.key) + + def event_message(self, nick, chan, msg): + if chan == config.connection.channel: + if not msg.startswith('.'): + if msg == '@help': + self.action(chan, 'Sending help in a private message...') + help = [line.strip() for line in open(help_file).readlines() if line] + for line in help: + self.sendmsg(chan, line) + elif msg == '@cheat': + self.action(chan, 'Sending cheat sheet in a private message...') + cheat_sheet = [line.strip() for line in open(cheat_file).readlines() if line] + for line in cheat_sheet: + self.sendmsg(chan, line) + else: + cmd = msg.split()[0][1:] + args = msg[len(cmd)+2:] + if time.time() - self.last_time < 2: + self.sendmsg(chan, color('Slow down nerd!', red)) + elif cmd == 'hit': + if self.player: + if self.player == nick: + card_type, card_suit = self.draw() + if self.mini_deck: + msg_str = '' + for i in self.hand: + msg_str += ' ' + i + self.sendmsg(chan, msg_str) + else: + for i in range(5): + msg_str = '' + for i in self.hand[i]: + msg_str += ' ' + i + self.sendmsg(chan, msg_str) + if self.total > 21: + if deck['ace'][1] == 1 and not self.ace_minus: + self.total = self.total - 10 + self.ace_minus = True + if self.total > 21: + self.sendmsg(chan, '{0} {1}'.format(color('BUST!', red), color('You went over 21 and lost!', grey))) + self.reset() + else: + self.sendmsg(chan, '{0} {1}'.format(color('You drew a {0} of {1}! Your total is now:'.format(card_type, card_suit[1]), yellow), color(str(self.total), light_blue))) + self.last_move = time.time() + else: + self.sendmsg(chan, '{0} {1}'.format(color('BUST!', red), color('You went over 21 and lost!', grey))) + self.reset() + else: + self.sendmsg(chan, '{0} {1}'.format(color('You drew a {0} of {1}! Your total is now:'.format(card_type, card_suit[1]), yellow), color(str(self.total), light_blue))) + self.last_move = time.time() + else: + self.error(chan, 'You are not currently playing!', '{0} is playing still'.format(self.player)) + else: + self.error(chan, 'You are not currently playing!') + elif cmd == 'mini': + if not self.player: + if self.mini_deck: + self.setup_deck('normal') + self.sendmsg(chan, '{0} {1}'.format(color('Mini deck has been', yellow), color('DISABLED', red))) + else: + self.setup_deck('mini') + self.sendmsg(chan, '{0} {1}'.format(color('Mini deck has been', yellow), color('ENABLED', green))) + else: + self.error(chan, 'You can not change the deck in game!') + elif cmd == 'play': + if not self.player: + self.player = nick + self.action(chan, 'Starting a game of blackjack with {0}!'.format(nick)) + for i in range(2): + self.draw() + if self.mini_deck: + msg_str = '' + for i in self.hand: + msg_str += ' ' + i + self.sendmsg(chan, msg_str) + else: + for i in range(5): + msg_str = '' + for i in self.hand[i]: + msg_str += ' ' + i + self.sendmsg(chan, msg_str) + self.sendmsg(chan, '{0} {1}'.format(color('Your total is now:', yellow), color(str(self.total), light_blue))) + self.last_move = time.time() + threading.Thread(target=self.timer).start() + elif self.player == nick: + self.error(chan, 'You have already started a game, please finish or stop the game!'.format(self.player)) + else: + self.error(chan, '{0} is currently playing a game, please wait!'.format(self.player)) + elif cmd == 'stand': + if self.player: + if self.player == nick: + self.sendmsg(chan, 'You have chosen to stand with {0} as your total.'.format(self.total)) + else: + self.error(chan, 'You are not currently playing!', '{0} is playing still'.format(self.player)) + else: + self.error(chan, 'You are not currently playing!') + elif cmd == 'stop': + if self.player: + if self.player == nick: + self.action(chan, 'Ending current game with {0}!'.format(nick)) + self.reset() + else: + self.error(chan, 'You are not currently playing!', '{0} is playing still'.format(self.player)) + else: + self.error(chan, 'You are not currently playing!') + self.last_time = time.time() + + def event_nick_in_use(self): + debug.error_exit('BlackJack is already running.') + + def event_part(self, nick, chan): + if self.player == nick: + self.sendmsg(chan, 'The game with {0} has ended.'.format(color(self.nick, light_blue))) + self.reset() + + def event_quit(self, nick): + if self.player == nick: + self.sendmsg(chan, 'The game with {0} has ended.'.format(color(self.nick, light_blue))) + self.reset() + + def handle_events(self, data): + args = data.split() + if args[0] == 'PING': + self.raw('PONG ' + args[1][1:]) + elif args[1] == '001': # Use 002 or 003 if you run into issues. + self.event_connect() + elif args[1] == '433': + self.event_nick_in_use() + elif args[1] in ('KICK','PART','PRIVMSG','QUIT'): + nick = args[0].split('!')[0][1:] + if nick != config.ident.nickname: + if args[1] == 'KICK': + chan = args[2] + kicked = args[3] + self.event_kick(nick, chan, kicked) + elif args[1] == 'PART': + chan = args[2] + self.event_part(nick, chan) + elif args[1] == 'PRIVMSG': + chan = args[2] + msg = data.split('{0} PRIVMSG {1} :'.format(args[0], chan))[1] + if chan != config.ident.nickname: + self.event_message(nick, chan, msg) + elif args[1] == 'QUIT': + self.event_quit(nick) + + def identify(self, username, password): + self.sendmsg('nickserv', f'identify {username} {password}') + + def join(self, chan, key=None): + self.raw(f'JOIN {chan} {key}') if key else self.raw('JOIN ' + chan) + + def listen(self): + while True: + try: + data = self.sock.recv(1024).decode('utf-8') + if data: + for line in (line for line in data.split('\r\n') if line): + debug.irc(line) + if line.startswith('ERROR :Closing Link:') and config.ident.nickname in data: + raise Exception('Connection has closed.') + elif len(line.split()) >= 2: + self.handle_events(line) + else: + debug.error('No data recieved from server.') + break + except (UnicodeDecodeError,UnicodeEncodeError): + debug.error('Unicode error has occured.') + except Exception as ex: + debug.error('Unexpected error occured.', ex) + break + self.event_disconnect() + + def mode(self, target, mode): + self.raw(f'MODE {target} {mode}') + + def raw(self, msg): + self.sock.send(bytes(msg + '\r\n', 'utf-8')) + + def reset(self): + self.ace = [False,False] + self.last_move = 0 + self.player = None + self.total = 0 + if self.mini_deck: + self.hand = [] + else: + self.hand = {0:[],1:[],2:[],3:[],4:[]} + deck['ace'][1] = 11 + for card in deck: + deck[card][2] = [club,diamond,heart,spade] + + def sendmsg(self, target, msg): + self.raw(f'PRIVMSG {target} :{msg}') + + def setup_deck(self, deck_type): + if deck_type == 'mini': + self.hand = [] + self.mini_deck = True + deck['ace'][0] = 'A X' + deck['two'][0] = '2 X' + deck['three'][0] = '3 X' + deck['four'][0] = '4 X' + deck['five'][0] = '5 X' + deck['six'][0] = '6 X' + deck['seven'][0] = '7 X' + deck['eight'][0] = '8 X' + deck['nine'][0] = '9 X' + deck['ten'][0] = '10X' + deck['jack'][0] = 'J X' + deck['queen'][0] = 'Q X' + deck['king'][0] = 'K X' + elif deck_type == 'normal': + self.hand = {0:[],1:[],2:[],3:[],4:[]} + self.mini_deck = False + deck['ace'][0] = ('A ',' ',' X ',' ',' A') + deck['two'][0] = ('2 ',' X ',' ',' X ',' 2') + deck['three'][0] = ('3 ',' X ',' X ',' X ',' 3') + deck['four'][0] = ('4 ',' X X ',' ',' X X ',' 4') + deck['five'][0] = ('5 ',' X X ',' X ',' X X ',' 5') + deck['six'][0] = ('6 ',' X X ',' X X ',' X X ',' 6') + deck['seven'][0] = ('7 ',' X X ',' XXX ',' X X ',' 7') + deck['eight'][0] = ('8 ',' XXX ',' X X ',' XXX ',' 8') + deck['nine'][0] = ('9 ',' XXX ',' XXX ',' XXX ',' 9') + deck['ten'][0] = ('10 ',' XXX ',' XX XX ',' XXX ',' 10') + deck['jack'][0] = ('J ',' ',' X ',' ',' J') + deck['queen'][0] = ('Q ',' ',' X ',' ',' Q') + deck['king'][0] = ('K ',' ',' X ',' ',' K') + + def timer(self): + while self.player: + if time.time() - self.last_move > self.game_timeout: + self.sendmsg(config.connection.channel, '{0}, you took too long! The game has ended.'.format(self.player)) + self.reset() + break + else: + time.sleep(1) + +BlackJack = IRC() diff --git a/blackjack/data/cheat.txt b/blackjack/data/cheat.txt new file mode 100644 index 0000000..bf2500d --- /dev/null +++ b/blackjack/data/cheat.txt @@ -0,0 +1,32 @@ +0,10 1 BLACKJACK CHEAT SHEET 0 +0,10 1,9 H 0,10HIT 0,4 S 0,10STAND 1,8 D 0,10DOUBLE 0,12 P 0,10SPLIT 1 +0,1 1 0 DEALERS HAND 1 +0,1 1,0 1,15 A 1,14 101,15 9 1,14 8 1,15 7 1,14 6 1,15 5 1,14 4 1,15 3 1,14 2 +0,1 1,5 1,15 A A 0,12 P P P P P P P P P P14 +0,1 1,5 1,1410 100,4 S S S S S S S S S S +0,1 0,5 1,15 9 9 0,4 S S 0,12 P P 0,4 S 0,12 P P P P P +0,1 0,5P1,14 8 8 0,12 P P P P P P P P P P +0,1 0,5A1,15 7 7 1,9 H H H H 0,12 P P P P P P +0,1 0,5I1,14 6 6 1,9 H H H H H H H H H H +0,1 0,5R1,15 5 5 1,9 H H 1,8 D D D D D D D D +0,1P1,5 1,14 4 4 0,9 1H H H H H0 0,12 P P 0,9 1H H H +0,1L1,5 1,15 3 3 0,9 1H0 1H H H0 0,12 P P P P P P +0,1A1,5 1,14 2 2 0,9 1H H H H0 0,12 P P P P P P +0,1Y1,7 1,15 17+ 0,4 S S S S S S S S S S +0,1E1,7 1,14 16 0,9 1H H H H0 1H0 0,4 S S S S S +0,1R1,7 1,15 15 0,9 1H H H H0 1H0 0,4 S S S S S +0,1S1,7H1,14 14 0,9 1H H H H0 1H0 0,4 S S S S S +0,1 1,7A1,15 13 0,9 1H H H H0 1H0 0,4 S S S S S +0,1H1,7R1,14 12 0,9 1H H H H H 0,4 S S S 0,9 1H H +0,1A1,7D1,15 11 0 0,9 1H0 1,8 D D D D D D D D D +0,1N1,7 1,14 10 0,9 1H0 1H0 1,8 D D D D D D D D +0,1D1,7 1,15 9 0,9 1H0 1H H H H0 1,8 D D D D 0,9 1H0 +0,1 1,7 1,14 8- 0,9 1H H H H H H H H H H0 +0,1 0,5 1,15 A-9 0,4 S S S S S 1,8 D D D D D +0,1 0,5 1,14 A-8 0,4 S S S S S 1,8 D D D D D +0,1 0,5S1,15 A-7 1,9 H H H0 0,4 S S 1,8 D D D D D +0,1 0,5O1,14 A-6 1,9 H H 0 1H H H0 1,8 D D D D 1,9 H +0,1 0,5F1,15 A-5 1,9 H H H H H0 1,8 D D D 0,9 1H H +0,1 0,5T1,14 A-4 1,9 H H H H0 1H0 1,8 D D D 0,9 1H0 1 H +0,1 0,5 1,15 A-3 0,9 1H 0 1H0 1 H0 1H0 1H0 1,8 D D 1,9 H H H +0,1 0,5 1,14 A-2 0,9 1H H H H H0 1,8 D D 1,9 H H H0 diff --git a/blackjack/data/help.txt b/blackjack/data/help.txt new file mode 100644 index 0000000..ac3a3f7 --- /dev/null +++ b/blackjack/data/help.txt @@ -0,0 +1,31 @@ + 1,0 1,1 1,0 1,1 1,0 1,1 + 1,1 1,0 1,1 1,0 1,1 1,0 1,1 1,0 1,1 1,0 + 1,1 1,0 1,1 1,0 1,1 1,0 1,1 + 1,1 1,0 1,1 1,0 1,1 1,0 1,1 1,0 1,1 1,0 + 1,0 1,1 1,0 1,1 0 1,0 1,1 1,0 1,1 + +12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ +12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ +12,00▓▓▓00,12B12,00▓▓▓ 04,00▓▓▓00,04L04,00▓▓▓ 12,00▓▓▓00,12A12,00▓▓▓ 04,00▓▓▓00,04C04,00▓▓▓ 12,00▓▓▓00,12K12,00▓▓▓ 04,00▓▓▓00,04J04,00▓▓▓ 12,00▓▓▓00,12A12,00▓▓▓ 04,00▓▓▓00,04C04,00▓▓▓ 12,00▓▓▓00,12K12,00▓▓▓ +12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ +12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ 04,00▓▓▓▓▓▓▓ 12,00▓▓▓▓▓▓▓ + +00┌─────────────────────────────────────────────────────────────────────┐ +00│ 08.: HOW TO PLAY :. 00 │ +00├─────────────────────────────────────────────────────────────────────┤ +00│ │ +00│ Type in the chat @help to see this message displayed.00 │ +00│ │ +00│ Start a game of BlackJack with the .play command. 00 │ +00│ │ +00│ You can end the game at any time with the .stop command. 00 │ +00│ │ +00│ The limit is 1 player at a time, and games will end if the player 00 │ +00│ has not executed a command after 20 seconds since the last command.00 │ +00│ │ +00│ │ +00│ Once in a game, you can use the .hit command to draw another card. 00 │ +00│ │ +00│ You can stop drawing cards with the .stand command. 00 │ +00│ │ +00└─────────────────────────────────────────────────────────────────────┘ diff --git a/screens/banner.png b/screens/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..34a925c74f5ea02504990cc9dddb03980b903518 GIT binary patch literal 9111 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 XeB$<7LX%vZr5bH@s9N^vOaA`{D}M4} literal 0 HcmV?d00001 diff --git a/screens/cheat.png b/screens/cheat.png new file mode 100644 index 0000000000000000000000000000000000000000..14743133b7ea93684cf15dbb9108f6e738aa97c3 GIT binary patch literal 30389 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 literal 0 HcmV?d00001 diff --git a/screens/game.png b/screens/game.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d50fb6f1cd8e584955c4270ba76b1ea95d14d4 GIT binary patch literal 19796 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 ro9OZ%Yg8TE>cj5|Wu=P3T6M0Wdwa;uVc