forked from MarseyWorld/MarseyWorld
140 lines
4.4 KiB
Python
140 lines
4.4 KiB
Python
from json.encoder import INFINITY
|
|
import random
|
|
from .comment import *
|
|
from files.helpers.const import *
|
|
|
|
class Slots:
|
|
commandWord = "!slots"
|
|
minimumBet = 5
|
|
maximumBet = INFINITY
|
|
symbols = {"♦️", "♠️", "♥️", "♣️", "⚧", "🔞", "⚛️", "☢️", "✡️", "⚔️", "🐱"}
|
|
|
|
# Common...
|
|
commonRatio = 4
|
|
commonPayout = 2
|
|
|
|
# Uncommon.
|
|
uncommonIndex = 4
|
|
uncommonRatio = 3
|
|
uncommonPayout = 3
|
|
|
|
# Rare~
|
|
rareIndex = 8
|
|
rareRatio = 2
|
|
rarePayout = 5
|
|
|
|
# Jackpot!
|
|
jackpotIndex = 10
|
|
jackpotRatio = 1
|
|
jackpotPayout = 100
|
|
|
|
def __init__(self, g):
|
|
self.db = g.db
|
|
|
|
# Check for !slots<wager>
|
|
def check_for_slots_command(self, in_text, from_user, from_comment):
|
|
if self.commandWord in in_text:
|
|
for word in in_text.split():
|
|
if self.commandWord in word:
|
|
try:
|
|
wager = word[len(self.commandWord):]
|
|
wagerValue = int(wager, base=10)
|
|
|
|
if self.wager_is_valid(from_user, wagerValue):
|
|
result = self.pull_the_arm(from_user, wagerValue, from_comment)
|
|
return { 'pulled': True, 'result': result }
|
|
|
|
except: break
|
|
return { 'pulled': False, 'result': '' }
|
|
|
|
# Ensure user is capable of the wager
|
|
def wager_is_valid(self, from_user, wager):
|
|
if (wager < self.minimumBet):
|
|
return False
|
|
elif (wager > self.maximumBet):
|
|
return False
|
|
elif (wager > from_user.coins):
|
|
return False
|
|
else:
|
|
return True
|
|
|
|
# Generate full set of symbols.
|
|
def count_out_symbols(self):
|
|
countedSymbols = []
|
|
payoutLookup = {}
|
|
index = 0
|
|
|
|
for item in self.symbols:
|
|
count = 0
|
|
|
|
if index == self.jackpotIndex:
|
|
count = self.jackpotRatio
|
|
payoutLookup[item] = self.jackpotPayout
|
|
elif index >= self.rareIndex:
|
|
count = self.rareRatio
|
|
payoutLookup[item] = self.rarePayout
|
|
elif index >= self.uncommonIndex:
|
|
count = self.uncommonRatio
|
|
payoutLookup[item] = self.uncommonPayout
|
|
else:
|
|
count = self.commonRatio
|
|
payoutLookup[item] = self.commonPayout
|
|
|
|
while count > 0:
|
|
countedSymbols.append(item)
|
|
count -= 1
|
|
|
|
index += 1
|
|
|
|
random.shuffle(countedSymbols)
|
|
|
|
return { 'symbols': countedSymbols, 'payout': payoutLookup }
|
|
|
|
# Consolation prizes return the user's wager.
|
|
def check_for_consolation(self, symbols):
|
|
# 1. Any 2 matching.
|
|
if symbols[0] == symbols[1] or symbols[0] == symbols[2] or symbols[1] == symbols[2]:
|
|
return True
|
|
# 2. Any instance of jackpot.
|
|
for symbol in symbols:
|
|
if symbol == "🐱":
|
|
return True
|
|
|
|
return False
|
|
|
|
# Actually make the relevant calls
|
|
def pull_the_arm(self, from_user, amount, from_comment):
|
|
# Charge user for the bet
|
|
self.charge_user(from_user, amount)
|
|
|
|
# Determine the outcome
|
|
result1 = self.count_out_symbols()
|
|
result2 = self.count_out_symbols()
|
|
result3 = self.count_out_symbols()
|
|
symbol1 = result1['symbols'][0]
|
|
symbol2 = result2['symbols'][0]
|
|
symbol3 = result3['symbols'][0]
|
|
payout = result1['payout'][symbol1]
|
|
isMatch = symbol1 == symbol2 and symbol2 == symbol3
|
|
resultSymbols = [symbol1, symbol2, symbol3]
|
|
isConsolation = self.check_for_consolation(resultSymbols)
|
|
|
|
if isMatch:
|
|
# Pay out
|
|
reward = amount * payout
|
|
self.credit_user(from_user, reward)
|
|
elif isConsolation:
|
|
# Refund wager
|
|
self.credit_user(from_user, amount)
|
|
|
|
return "".join(resultSymbols)
|
|
|
|
# Credit the user's account
|
|
def credit_user(self, from_user, amount):
|
|
from_user.coins += amount
|
|
self.db.add(from_user)
|
|
|
|
# Charge the user's account
|
|
def charge_user(self, from_user, amount):
|
|
from_user.coins -= amount
|
|
self.db.add(from_user) |