1
Fork 0
mirror of https://github.com/wlinator/luminara.git synced 2024-10-02 20:23:12 +00:00

Economy balancing

This commit is contained in:
wlinator 2023-07-14 12:32:48 -04:00
parent 9ca758dfbe
commit ca991f81f7
5 changed files with 259 additions and 239 deletions

View file

@ -7,7 +7,7 @@
"hit": "<:hit:1119262723285467156>",
"stand": "<:stand:1118923298298929154>"
},
"reward_multiplier": 1.5,
"reward_multiplier": 1.2,
"deck_suits": [
"♠",
"♡",
@ -62,10 +62,10 @@
"lost": 1119288454212243607
},
"reward_multipliers": {
"pair": 1,
"three_of_a_kind": 3,
"three_diamonds": 4,
"jackpot": 5
"pair": 1.5,
"three_of_a_kind": 4,
"three_diamonds": 6,
"jackpot": 15
}
},
"duel": {

View file

@ -1,4 +1,3 @@
import asyncio
import os
import random
@ -8,7 +7,6 @@ from dotenv import load_dotenv
from data.BlackJackStats import BlackJackStats
from data.Currency import Currency
from data.SlotsStats import SlotsStats
from handlers.ItemHandler import ItemHandler
from main import economy_config
from sb_tools import economy_embeds, economy_functions, universal, interaction, embeds
@ -53,6 +51,7 @@ class GamblingCog(commands.Cog):
player_hand = []
dealer_hand = []
deck = economy_functions.blackjack_get_new_deck()
multiplier = float(economy_config["blackjack"]["reward_multiplier"])
# deal initial cards (player draws two & dealer one)
player_hand.append(economy_functions.blackjack_deal_card(deck))
@ -133,7 +132,7 @@ class GamblingCog(commands.Cog):
else:
# bet multiplier
payout = bet * float(economy_config["blackjack"]["reward_multiplier"])
payout = bet * multiplier if not status == "player_blackjack" else bet * 2
ctx_currency.add_cash(payout)
ctx_currency.push()
@ -160,72 +159,6 @@ class GamblingCog(commands.Cog):
# remove player from active games list
del active_blackjack_games[ctx.author.id]
@commands.slash_command(
name="slots",
descriptions="Spin the slots for a chance to win the jackpot!",
guild_only=True
)
@commands.check(universal.channel_check)
async def slots(self, ctx, *, bet: discord.Option(int)):
# Currency handler
ctx_currency = Currency(ctx.author.id)
# check if the user has enough cash
player_cash_balance = ctx_currency.cash
if bet > player_cash_balance or bet <= 0:
await ctx.respond(embed=economy_embeds.not_enough_cash())
return
# calculate the results before the command is shown
results = [random.randint(0, 6) for i in range(3)]
calculated_results = economy_functions.calculate_slots_results(bet, results)
type = calculated_results[0]
payout = calculated_results[1]
multiplier = calculated_results[2]
is_won = True
if type == "lost":
is_won = False
# start with default "spinning" embed
await ctx.respond(embed=economy_embeds.slots_spinning(ctx, 3, bet, results, self.bot))
await asyncio.sleep(1)
await ctx.edit(embed=economy_embeds.slots_spinning(ctx, 2, bet, results, self.bot),
allowed_mentions=discord.AllowedMentions.none())
await asyncio.sleep(1)
await ctx.edit(embed=economy_embeds.slots_spinning(ctx, 1, bet, results, self.bot),
allowed_mentions=discord.AllowedMentions.none())
await asyncio.sleep(1)
await ctx.edit(embed=economy_embeds.slots_finished(ctx, type, multiplier, bet, results, self.bot),
allowed_mentions=discord.AllowedMentions.none())
# user payout
if payout >= 0:
ctx_currency.add_cash(payout)
else:
ctx_currency.take_cash(payout)
# push stats (low priority)
if payout <= 0:
payout = 0
item_reward = ItemHandler(ctx)
await item_reward.rave_coin(is_won=is_won, bet=bet)
stats = SlotsStats(
user_id=ctx.author.id,
is_won=is_won,
bet=bet,
payout=payout,
spin_type=type,
icons=results
)
ctx_currency.push()
stats.push()
@commands.slash_command(
name="duel",
description="Challenge another player to a fight.",

251
modules/slots.py Normal file
View file

@ -0,0 +1,251 @@
import asyncio
import datetime
import random
from collections import Counter
import discord
import pytz
from discord.ext import commands
from data.Currency import Currency
from data.SlotsStats import SlotsStats
from handlers.ItemHandler import ItemHandler
from main import economy_config
from sb_tools import economy_embeds, universal
est = pytz.timezone('US/Eastern')
def calculate_slots_results(bet, results):
type = None
multiplier = None
rewards = economy_config["slots"]["reward_multipliers"]
# count occurrences of each item in the list
counts = Counter(results)
# no icons match
if len(counts) == 3:
type = "lost"
multiplier = 0
# pairs
elif len(counts) == 2:
type = "pair"
multiplier = rewards[type]
# 3 of a kind
elif len(counts) == 1:
if results[0] == 5:
type = "three_diamonds"
multiplier = rewards[type]
elif results[0] == 6:
type = "jackpot"
multiplier = rewards[type]
else:
type = "three_of_a_kind"
multiplier = rewards[type]
payout = bet * multiplier
return type, int(payout), multiplier
def slots_spinning(ctx, spinning_icons_amount, bet, results, sbbot):
first_slots_emote = sbbot.get_emoji(economy_config["slots"]["emotes"][f"slots_{results[0]}_id"])
second_slots_emote = sbbot.get_emoji(economy_config["slots"]["emotes"][f"slots_{results[1]}_id"])
slots_animated_emote = sbbot.get_emoji(economy_config["slots"]["emotes"][f"slots_animated_id"])
decoration = economy_config["slots"]["emotes"]
S_Wide = sbbot.get_emoji(decoration["S_Wide"])
L_Wide = sbbot.get_emoji(decoration["L_Wide"])
O_Wide = sbbot.get_emoji(decoration["O_Wide"])
T_Wide = sbbot.get_emoji(decoration["T_Wide"])
CBorderBLeft = sbbot.get_emoji(decoration["CBorderBLeft"])
CBorderBRight = sbbot.get_emoji(decoration["CBorderBRight"])
CBorderTLeft = sbbot.get_emoji(decoration["CBorderTLeft"])
CBorderTRight = sbbot.get_emoji(decoration["CBorderTRight"])
HBorderB = sbbot.get_emoji(decoration["HBorderB"])
HBorderT = sbbot.get_emoji(decoration["HBorderT"])
VBorder = sbbot.get_emoji(decoration["VBorder"])
Blank = sbbot.get_emoji(decoration["Blank"])
current_time = datetime.datetime.now(est).strftime("%I:%M %p")
one = slots_animated_emote
two = slots_animated_emote
three = slots_animated_emote
if spinning_icons_amount == 3:
pass
elif spinning_icons_amount == 2:
one = first_slots_emote
elif spinning_icons_amount == 1:
one = first_slots_emote
two = second_slots_emote
description = f"🎰{S_Wide}{L_Wide}{O_Wide}{T_Wide}{S_Wide}🎰\n" \
f"{CBorderTLeft}{HBorderT}{HBorderT}{HBorderT}{HBorderT}{HBorderT}{CBorderTRight}\n" \
f"{VBorder}{one}{VBorder}{two}{VBorder}{three}{VBorder}\n" \
f"{CBorderBLeft}{HBorderB}{HBorderB}{HBorderB}{HBorderB}{HBorderB}{CBorderBRight}\n" \
f"{Blank}{Blank}❓❓❓{Blank}{Blank}{Blank}"
embed = discord.Embed(
description=description
)
embed.set_author(name=ctx.author.name, icon_url=ctx.author.avatar.url)
embed.set_footer(text=f"Bet ${bet} • jackpot = x15 • {current_time}",
icon_url="https://i.imgur.com/wFsgSnr.png")
return embed
def slots_finished(ctx, payout_type, multiplier, bet, results, sbbot):
first_slots_emote = sbbot.get_emoji(economy_config["slots"]["emotes"][f"slots_{results[0]}_id"])
second_slots_emote = sbbot.get_emoji(economy_config["slots"]["emotes"][f"slots_{results[1]}_id"])
third_slots_emote = sbbot.get_emoji(economy_config["slots"]["emotes"][f"slots_{results[2]}_id"])
current_time = datetime.datetime.now(est).strftime("%I:%M %p")
decoration = economy_config["slots"]["emotes"]
S_Wide = sbbot.get_emoji(decoration["S_Wide"])
L_Wide = sbbot.get_emoji(decoration["L_Wide"])
O_Wide = sbbot.get_emoji(decoration["O_Wide"])
T_Wide = sbbot.get_emoji(decoration["T_Wide"])
CBorderBLeft = sbbot.get_emoji(decoration["CBorderBLeft"])
CBorderBRight = sbbot.get_emoji(decoration["CBorderBRight"])
CBorderTLeft = sbbot.get_emoji(decoration["CBorderTLeft"])
CBorderTRight = sbbot.get_emoji(decoration["CBorderTRight"])
HBorderB = sbbot.get_emoji(decoration["HBorderB"])
HBorderT = sbbot.get_emoji(decoration["HBorderT"])
VBorder = sbbot.get_emoji(decoration["VBorder"])
WSmall = sbbot.get_emoji(decoration["WSmall"])
ISmall = sbbot.get_emoji(decoration["ISmall"])
NSmall = sbbot.get_emoji(decoration["NSmall"])
LCentered = sbbot.get_emoji(decoration["LCentered"])
OCentered = sbbot.get_emoji(decoration["OCentered"])
SCentered = sbbot.get_emoji(decoration["SCentered"])
ECentered = sbbot.get_emoji(decoration["ECentered"])
Blank = sbbot.get_emoji(decoration["Blank"])
lost_emoji = sbbot.get_emoji(decoration["lost"])
field_name = "You lost."
field_value = f"You lost **${bet}**."
color = discord.Color.red()
is_lost = True
if payout_type == "pair":
field_name = "Pair"
field_value = f"You won **${bet * multiplier}**."
is_lost = False
discord.Color.dark_green()
elif payout_type == "three_of_a_kind":
field_name = "3 of a kind"
field_value = f"You won **${bet * multiplier}**."
is_lost = False
discord.Color.dark_green()
elif payout_type == "three_diamonds":
field_name = "Triple Diamonds!"
field_value = f"You won **${bet * multiplier}**."
is_lost = False
discord.Color.green()
elif payout_type == "jackpot":
field_name = "JACKPOT!!"
field_value = f"You won **${bet * multiplier}**."
is_lost = False
discord.Color.green()
description = f"🎰{S_Wide}{L_Wide}{O_Wide}{T_Wide}{S_Wide}🎰\n" \
f"{CBorderTLeft}{HBorderT}{HBorderT}{HBorderT}{HBorderT}{HBorderT}{CBorderTRight}\n" \
f"{VBorder}{first_slots_emote}{VBorder}{second_slots_emote}{VBorder}{third_slots_emote}{VBorder}\n" \
f"{CBorderBLeft}{HBorderB}{HBorderB}{HBorderB}{HBorderB}{HBorderB}{CBorderBRight}"
if is_lost:
description += f"\n{Blank}{LCentered}{OCentered}{SCentered}{ECentered}{lost_emoji}{Blank}"
else:
description += f"\n{Blank}🎉{WSmall}{ISmall}{NSmall}🎉{Blank}"
embed = discord.Embed(
color=color,
description=description
)
embed.add_field(name=field_name, value=field_value)
embed.set_author(name=ctx.author.name, icon_url=ctx.author.avatar.url)
embed.set_footer(text=f"Bet ${bet} • jackpot = x15 • {current_time}",
icon_url="https://i.imgur.com/wFsgSnr.png")
return embed
class SlotsCog(commands.Cog):
def __init__(self, sbbot):
self.bot = sbbot
@commands.slash_command(
name="slots",
descriptions="Spin the slots for a chance to win the jackpot!",
guild_only=True
)
@commands.check(universal.channel_check)
async def slots(self, ctx, *, bet: discord.Option(int)):
# Currency handler
ctx_currency = Currency(ctx.author.id)
# check if the user has enough cash
player_cash_balance = ctx_currency.cash
if bet > player_cash_balance or bet <= 0:
await ctx.respond(embed=economy_embeds.not_enough_cash())
return
# calculate the results before the command is shown
results = [random.randint(0, 6) for _ in range(3)]
calculated_results = calculate_slots_results(bet, results)
(type, payout, multiplier) = calculated_results
is_won = True
if type == "lost":
is_won = False
# start with default "spinning" embed
await ctx.respond(embed=slots_spinning(ctx, 3, bet, results, self.bot))
await asyncio.sleep(1)
for i in range(2, 0, -1):
await ctx.edit(embed=slots_spinning(ctx, i, bet, results, self.bot))
await asyncio.sleep(1)
# output final result
await ctx.edit(embed=slots_finished(ctx, type, multiplier, bet, results, self.bot))
# user payout
if payout > 0:
ctx_currency.add_cash(payout)
else:
ctx_currency.take_cash(bet)
item_reward = ItemHandler(ctx)
await item_reward.rave_coin(is_won=is_won, bet=bet)
stats = SlotsStats(
user_id=ctx.author.id,
is_won=is_won,
bet=bet,
payout=payout,
spin_type=type,
icons=results
)
ctx_currency.push()
stats.push()
def setup(sbbot):
sbbot.add_cog(SlotsCog(sbbot))

View file

@ -164,7 +164,7 @@ def blackjack_show(ctx, bet, player_hand, dealer_hand, player_hand_value, dealer
title_text = "YOU LOST!"
thumbnail_url = "https://i.imgur.com/rc68c43.png"
color = discord.Color.red()
elif status == "player_won_21":
title_text = "YOU WON!"
thumbnail_url = "https://i.imgur.com/dvIIr2G.png"
@ -200,136 +200,6 @@ def blackjack_show(ctx, bet, player_hand, dealer_hand, player_hand_value, dealer
return embed
def slots_spinning(ctx, spinning_icons_amount, bet, results, sbbot):
first_slots_emote = sbbot.get_emoji(json_data["slots"]["emotes"][f"slots_{results[0]}_id"])
second_slots_emote = sbbot.get_emoji(json_data["slots"]["emotes"][f"slots_{results[1]}_id"])
slots_animated_emote = sbbot.get_emoji(json_data["slots"]["emotes"][f"slots_animated_id"])
decoration = json_data["slots"]["emotes"]
S_Wide = sbbot.get_emoji(decoration["S_Wide"])
L_Wide = sbbot.get_emoji(decoration["L_Wide"])
O_Wide = sbbot.get_emoji(decoration["O_Wide"])
T_Wide = sbbot.get_emoji(decoration["T_Wide"])
CBorderBLeft = sbbot.get_emoji(decoration["CBorderBLeft"])
CBorderBRight = sbbot.get_emoji(decoration["CBorderBRight"])
CBorderTLeft = sbbot.get_emoji(decoration["CBorderTLeft"])
CBorderTRight = sbbot.get_emoji(decoration["CBorderTRight"])
HBorderB = sbbot.get_emoji(decoration["HBorderB"])
HBorderT = sbbot.get_emoji(decoration["HBorderT"])
VBorder = sbbot.get_emoji(decoration["VBorder"])
Blank = sbbot.get_emoji(decoration["Blank"])
current_time = datetime.datetime.now(est).strftime("%I:%M %p")
one = slots_animated_emote
two = slots_animated_emote
three = slots_animated_emote
if spinning_icons_amount == 3:
pass
elif spinning_icons_amount == 2:
one = first_slots_emote
elif spinning_icons_amount == 1:
one = first_slots_emote
two = second_slots_emote
description = f"🎰{S_Wide}{L_Wide}{O_Wide}{T_Wide}{S_Wide}🎰\n" \
f"{CBorderTLeft}{HBorderT}{HBorderT}{HBorderT}{HBorderT}{HBorderT}{CBorderTRight}\n" \
f"{VBorder}{one}{VBorder}{two}{VBorder}{three}{VBorder}\n" \
f"{CBorderBLeft}{HBorderB}{HBorderB}{HBorderB}{HBorderB}{HBorderB}{CBorderBRight}\n" \
f"{Blank}{Blank}❓❓❓{Blank}{Blank}{Blank}"
embed = discord.Embed(
description=description
)
embed.set_author(name=ctx.author.name, icon_url=ctx.author.avatar.url)
embed.set_footer(text=f"Bet {cash_balance_name}{bet} • jackpot = x5 • {current_time}",
icon_url="https://i.imgur.com/wFsgSnr.png")
return embed
def slots_finished(ctx, payout_type, multiplier, bet, results, sbbot):
first_slots_emote = sbbot.get_emoji(json_data["slots"]["emotes"][f"slots_{results[0]}_id"])
second_slots_emote = sbbot.get_emoji(json_data["slots"]["emotes"][f"slots_{results[1]}_id"])
third_slots_emote = sbbot.get_emoji(json_data["slots"]["emotes"][f"slots_{results[2]}_id"])
current_time = datetime.datetime.now(est).strftime("%I:%M %p")
decoration = json_data["slots"]["emotes"]
S_Wide = sbbot.get_emoji(decoration["S_Wide"])
L_Wide = sbbot.get_emoji(decoration["L_Wide"])
O_Wide = sbbot.get_emoji(decoration["O_Wide"])
T_Wide = sbbot.get_emoji(decoration["T_Wide"])
CBorderBLeft = sbbot.get_emoji(decoration["CBorderBLeft"])
CBorderBRight = sbbot.get_emoji(decoration["CBorderBRight"])
CBorderTLeft = sbbot.get_emoji(decoration["CBorderTLeft"])
CBorderTRight = sbbot.get_emoji(decoration["CBorderTRight"])
HBorderB = sbbot.get_emoji(decoration["HBorderB"])
HBorderT = sbbot.get_emoji(decoration["HBorderT"])
VBorder = sbbot.get_emoji(decoration["VBorder"])
WSmall = sbbot.get_emoji(decoration["WSmall"])
ISmall = sbbot.get_emoji(decoration["ISmall"])
NSmall = sbbot.get_emoji(decoration["NSmall"])
LCentered = sbbot.get_emoji(decoration["LCentered"])
OCentered = sbbot.get_emoji(decoration["OCentered"])
SCentered = sbbot.get_emoji(decoration["SCentered"])
ECentered = sbbot.get_emoji(decoration["ECentered"])
Blank = sbbot.get_emoji(decoration["Blank"])
lost_emoji = sbbot.get_emoji(decoration["lost"])
field_name = "You lost."
field_value = f"You lost **{cash_balance_name}{bet}**."
color = discord.Color.red()
is_lost = True
if payout_type == "pair":
field_name = "Pair"
field_value = f"You won **{cash_balance_name}{bet * multiplier}**."
is_lost = False
discord.Color.dark_green()
elif payout_type == "three_of_a_kind":
field_name = "3 of a kind"
field_value = f"You won **{cash_balance_name}{bet * multiplier}**."
is_lost = False
discord.Color.dark_green()
elif payout_type == "three_diamonds":
field_name = "Triple Diamonds!"
field_value = f"You won **{cash_balance_name}{bet * multiplier}**."
is_lost = False
discord.Color.green()
elif payout_type == "jackpot":
field_name = "JACKPOT!!"
field_value = f"You won **{cash_balance_name}{bet * multiplier}**."
is_lost = False
discord.Color.green()
description = f"🎰{S_Wide}{L_Wide}{O_Wide}{T_Wide}{S_Wide}🎰\n" \
f"{CBorderTLeft}{HBorderT}{HBorderT}{HBorderT}{HBorderT}{HBorderT}{CBorderTRight}\n" \
f"{VBorder}{first_slots_emote}{VBorder}{second_slots_emote}{VBorder}{third_slots_emote}{VBorder}\n" \
f"{CBorderBLeft}{HBorderB}{HBorderB}{HBorderB}{HBorderB}{HBorderB}{CBorderBRight}"
if is_lost:
description += f"\n{Blank}{LCentered}{OCentered}{SCentered}{ECentered}{lost_emoji}{Blank}"
else:
description += f"\n{Blank}🎉{WSmall}{ISmall}{NSmall}🎉{Blank}"
embed = discord.Embed(
color=color,
description=description
)
embed.add_field(name=field_name, value=field_value)
embed.set_author(name=ctx.author.name, icon_url=ctx.author.avatar.url)
embed.set_footer(text=f"Bet {cash_balance_name}{bet} • jackpot = x5 • {current_time}",
icon_url="https://i.imgur.com/wFsgSnr.png")
return embed
def daily_claim(amount, streak):
embed = discord.Embed(
color=discord.Color.green(),

View file

@ -1,5 +1,4 @@
import random
from collections import Counter
from main import economy_config
@ -49,36 +48,3 @@ def blackjack_calculate_hand_value(hand):
value -= 10 * aces_count
return value
def calculate_slots_results(bet, results):
type = None
multiplier = None
# count occurrences of each item in the list
counts = Counter(results)
# no icons match
if len(counts) == 3:
type = "lost"
multiplier = -1
# pairs
elif len(counts) == 2:
type = "pair"
multiplier = 1
# 3 of a kind
elif len(counts) == 1:
if results[0] == 5:
type = "three_diamonds"
multiplier = 4
elif results[0] == 6:
type = "jackpot"
multiplier = 5
else:
type = "three_of_a_kind"
multiplier = 3
payout = bet * multiplier
return type, payout, multiplier