214 lines
No EOL
8.3 KiB
Python
214 lines
No EOL
8.3 KiB
Python
#plugin for sparkytron3000
|
|
import time
|
|
import random
|
|
import json
|
|
import math
|
|
|
|
from discord.ext import commands
|
|
|
|
@commands.command(
|
|
description="Currency",
|
|
help="Server currency. You can run !currency claim to get started!", #This needs an overhaul
|
|
brief="Server currency tools"
|
|
)
|
|
async def currency(ctx, arg1=None, arg2=None, arg3=None, arg4=None): # just use *args
|
|
|
|
def read_db(filepath):
|
|
with open(filepath,"r") as fileobj:
|
|
db_content = json.load(fileobj)
|
|
return db_content
|
|
|
|
def save_to_db(filepath,db_content):
|
|
with open(filepath,"w") as fileobj:
|
|
json.dump(db_content,fileobj,indent=4)
|
|
|
|
def add_currency(filepath,amount):
|
|
player_db = read_db(filepath)
|
|
player_db["currency"] += amount
|
|
save_to_db(filepath,player_db)
|
|
return player_db
|
|
|
|
def calc_level_from_xp(xp):
|
|
level = min(100,math.floor(0.262615*xp**0.3220627))
|
|
return level
|
|
|
|
def add_xp(filepath,player_db,time_spent):
|
|
activity = player_db["status"]["current_activity"]
|
|
starting_xp = player_db["skills"][activity]["xp"]
|
|
starting_level = player_db["skills"][activity]["level"]
|
|
|
|
|
|
if activity == "mining":
|
|
equipment_level = player_db["equipment"]["pickaxe"]["level"]
|
|
xp_gained = (time_spent) * equipment_level # SKILL LEVEL of XP / SEC
|
|
player_db["skills"][activity]["xp"] += xp_gained
|
|
new_xp = starting_xp + xp_gained
|
|
new_level = calc_level_from_xp(new_xp) #calculate with curve here
|
|
player_db["skills"][activity]["level"] = new_level
|
|
levels_gained = new_level - starting_level
|
|
|
|
summary = "" #summary should include xp gained, levels gained (only if any were gained), current level (or new level)
|
|
summary += "You gained {} {} xp!".format(xp_gained, activity)
|
|
if levels_gained > 0: #if levels gained > 0, then include levels gained in summary
|
|
summary += "\nYou gained {} {} level(s)! You are now level {}.".format(levels_gained, activity, new_level)
|
|
|
|
save_to_db(filepath, player_db)
|
|
return player_db,summary
|
|
|
|
def add_resources(filepath,player_db,time_spent):
|
|
|
|
mining_resources = {
|
|
"sapphire": {
|
|
"value": 100,
|
|
"amount": 0
|
|
},
|
|
"emerald": {
|
|
"value": 250,
|
|
"amount": 0
|
|
},
|
|
"ruby": {
|
|
"value": 1000,
|
|
"amount": 0
|
|
},
|
|
"diamond": {
|
|
"value": 3000,
|
|
"amount": 0
|
|
}
|
|
}
|
|
|
|
if player_db["status"]["current_activity"] == "mining":
|
|
pick_power = player_db["equipment"]["pickaxe"]["power"]
|
|
pick_level = player_db["equipment"]["pickaxe"]["level"]
|
|
mining_level = player_db["skills"]["mining"]["level"]
|
|
numerator = pick_power + pick_level + mining_level
|
|
denominator = 1000
|
|
items_gained = []
|
|
time_summary = time.strftime("%H:%M:%S", time.gmtime(time_spent))
|
|
|
|
for second in range(0,time_spent):
|
|
roll = random.randint(0,denominator)
|
|
if roll <= numerator: #get a resource
|
|
roll2 = random.randint(0,100)
|
|
if roll2 <= 50:
|
|
mining_resources["sapphire"]["amount"] += 1
|
|
elif roll2 <=80:
|
|
mining_resources["emerald"]["amount"] += 1
|
|
elif roll2 <= 95:
|
|
mining_resources["ruby"]["amount"] += 1
|
|
else:
|
|
mining_resources["diamond"]["amount"] += 1
|
|
for item in mining_resources:
|
|
mined_amount = mining_resources[item]["amount"]
|
|
if item in player_db["items"]:
|
|
player_db["items"][item]["amount"] += mined_amount
|
|
items_gained.append(item.title())
|
|
items_gained.append(mined_amount)
|
|
else:
|
|
player_db["items"][item] = mining_resources[item]
|
|
items_gained.append(item.title())
|
|
items_gained.append(mined_amount)
|
|
|
|
save_to_db(filepath, player_db)
|
|
|
|
summary = "You spent {} mining. You mined {} x{}, {} x{}, {} x{}, and {} x{}.".format(time_summary, *items_gained)
|
|
|
|
return player_db,summary
|
|
|
|
async def transfer_currency(filepath, player_db, player_id, amount):
|
|
try:
|
|
amount = int(amount)
|
|
player2_filepath = "data/currency/players/" + str(player_id) + ".json"
|
|
player2_db = read_db(player2_filepath)
|
|
if player_db["currency"] >= amount:
|
|
add_currency(filepath, -amount)
|
|
add_currency(player2_filepath,amount)
|
|
await ctx.send("Sent " + str(amount) + " sparks to " + str(player_id))
|
|
except FileNotFoundError:
|
|
await ctx.send("They don't seem to be playing the game.")
|
|
|
|
|
|
async def show_levels(player_db):
|
|
output = ''
|
|
for skill in player_db["skills"]:
|
|
output += skill + ': ' + str(player_db["skills"][skill]["level"]) + '\n'
|
|
await ctx.send(output)
|
|
|
|
async def show_currency(player_db):
|
|
output = 'Sparks: ' + str(player_db["currency"])
|
|
await ctx.send(output)
|
|
|
|
async def show_items(player_db):
|
|
output = ''
|
|
for item in player_db["items"]:
|
|
output += item + ': ' + str(player_db["items"][item]["amount"]) + '\n'
|
|
await ctx.send(output)
|
|
|
|
|
|
async def stop_activity(filepath,player_db):
|
|
if player_db["status"]["current_activity"] == "idle":
|
|
await ctx.send("You are currently idle. There is no activity to stop.")
|
|
else:
|
|
time_spent = int(time.time() - player_db["status"]["start_time"]) #integer in seconds
|
|
player_db, xp_summary = add_xp(filepath,player_db,time_spent)
|
|
player_db, resources_summary = add_resources(filepath,player_db,time_spent)
|
|
await ctx.send(xp_summary)
|
|
await ctx.send(resources_summary)
|
|
player_db["status"]["current_activity"] = "idle"
|
|
save_to_db(filepath,player_db)
|
|
|
|
async def claim(filepath, player_db):
|
|
if time.time() - player_db["status"]["last_claimed"] >= 86400:
|
|
player_db = add_currency(filepath, 100)
|
|
player_db["status"]["last_claimed"] = time.time()
|
|
save_to_db(filepath,player_db)
|
|
await ctx.send("You claimed 100 sparks!")
|
|
else:
|
|
await ctx.send("Sorry, you already claimed your sparks today.")
|
|
|
|
async def mine(filepath, player_db):
|
|
if player_db["status"]["current_activity"] == "idle":
|
|
player_db["status"]["current_activity"] = "mining"
|
|
player_db["status"]["start_time"] = time.time()
|
|
save_to_db(filepath, player_db)
|
|
await ctx.send("You start mining.")
|
|
elif player_db["status"]["current_activity"] == "mining":
|
|
await ctx.send("You are already mining!")
|
|
else:
|
|
await ctx.send("You must stop " + player_db["status"]["current_activity"] + " before you start mining!")
|
|
|
|
async def gamble(filepath, player_db):
|
|
pass
|
|
|
|
working_dir = "data/currency/"
|
|
players_dir = "players/"
|
|
sender_id = str(ctx.author.id)
|
|
default_db = read_db("{0}{1}default.json".format(working_dir, players_dir))
|
|
filepath = '{0}{1}{2}.json'.format(working_dir, players_dir, sender_id)
|
|
|
|
try:
|
|
player_db = read_db(filepath)
|
|
except FileNotFoundError:
|
|
save_to_db(filepath,default_db)
|
|
player_db = read_db(filepath)
|
|
|
|
if arg1 == "claim":
|
|
await claim(filepath, player_db)
|
|
player_db = read_db(filepath)
|
|
elif arg1 == "stop":
|
|
await stop_activity(filepath, player_db)
|
|
player_db = read_db(filepath)
|
|
elif arg1 == "mine":
|
|
await mine(filepath, player_db)
|
|
player_db = read_db(filepath)
|
|
elif arg1 == "levels":
|
|
await show_levels(player_db)
|
|
elif arg1 == "items":
|
|
await show_items(player_db)
|
|
elif (arg1 == "send" or arg1 == "give") and arg2 and arg3:
|
|
await transfer_currency(filepath, player_db, arg2, arg3)
|
|
player_db = read_db(filepath)
|
|
else:
|
|
await show_currency(player_db)
|
|
|
|
async def setup(bot):
|
|
bot.add_command(currency) |