import random import re import string import json import os from . import swchar from funcs import logThis with open("resources/swskills.json", "r") as f: skillData = json.load(f) def roll(abi : int = 1, prof : int = 0, dif : int = 3, cha : int = 0, boo : int = 0, setb : int = 0, force : int = 0): result = "" for x in range(abi): result += random.choice(["","S","S","SS","A","A","SA","AA"]) for x in range(prof): result += random.choice(["","S","S","SS","SS","A","SA","SA","SA","AA","AA","R"]) for x in range(dif): result += random.choice(["","F","FF","H","H","H","HH","FH"]) for x in range(cha): result += random.choice(["","F","F","FF","FF","H","H","FH","FH","HH","HH","D"]) for x in range(boo): result += random.choice(["","","S","SA","AA","A"]) for x in range(setb): result += random.choice(["","","F","F","H","H"]) for x in range (force): result += random.choice(["B","B","B","B","B","B","BB","L","L","Ll","LL","LL"]) return result def simplify(result : str): logThis("Simplifying "+result) simp = "" success = (result.count('S') + result.count('R')) - (result.count('F') + result.count('D')) advantage = result.count('A') - result.count('H') result = re.sub("S|A|F|H","",result) if success > 0: for x in range(success): simp += "S" elif success < 0: for x in range(abs(success)): simp += "F" if advantage > 0: for x in range(advantage): simp += "A" elif advantage < 0: for x in range(abs(advantage)): simp += "H" simp += result return simp def resultToEmoji(result : str): emoji = "" for char in result: if char == 'S': emoji += "<:success:690971244971163718> " if char == 'A': emoji += "<:advantage:690970761611051079> " if char == 'R': emoji += "<:swtriumph:690971267486187643> " if char == 'F': emoji += "<:failure:690970957786906664> " if char == 'H': emoji += "<:threat:690971009469382656> " if char == 'D': emoji += "<:despair:690971200163414238> " if char == 'L': emoji += "<:light:691010089905029171>" if char == 'B': emoji += "<:dark:691010101901000852>" return emoji def emojiToResult(emoji : str): result = "" for char in emoji: if char == "<:light:691010089905029171>": emoji += 'L' if char == "<:dark:691010101901000852>": emoji += 'B' return result def diceToEmoji(dice : list): emoji = "" for x in range(dice[0]): emoji += "<:ability:690974213397282826> " for x in range(dice[1]): emoji += "<:proficiency:690973435354153071> " for x in range(dice[2]): emoji += "<:difficulty:690973992470708296> " for x in range(dice[3]): emoji += "<:challenge:690973419906400306> " for x in range(dice[4]): emoji += "<:boost:690972178216386561> " for x in range(dice[5]): emoji += "<:setback:690972157890658415> " for x in range(dice[6]): emoji += "<:force:690973451883774013> " return emoji def obligationRoll(): logThis("Rolling for obligation") with open("resources/swcharacters.json", "r") as f: data = json.load(f) table = [] for character in data: for obligation in data[character]["Obligations"]: for x in range(data[character]["Obligations"][obligation]): table.append(data[character]["Name"]+", "+obligation) while len(table) < 100: table.append("Nothing") return random.choice(table) def parseRoll(user : str,cmd : str = ""): cmd = re.sub(' +',' ',cmd.upper()) + " " if cmd[0] == " ": cmd = cmd[1:] cmd = swchar.replaceSpaces(cmd.capitalize()) commands = cmd.split(" ") if commands[0] == "": rollParameters = [1,0,3,0,0,0,0] else: rollParameters = [0,0,0,0,0,0,0] if string.capwords(commands[0]) == "Obligations": return obligationRoll() elif string.capwords(commands[0]) in skillData: logThis("Oh look! This guy has skills!") if swchar.userHasChar: logThis("They have a character. That much we know") skillLevel = swchar.charData(user,"Skills " + string.capwords(commands[0])) if string.capwords(commands[0]) == "Lightsaber": logThis("The skill is lightsaber") charLevel = swchar.charData(user,"Characteristics " + swchar.lightsaberChar(user)) else: charLevel = swchar.charData(user,"Characteristics " + skillData[string.capwords(commands[0])]) abilityDice = abs(charLevel-skillLevel) proficiencyDice = min(skillLevel,charLevel) commands = [str(abilityDice)] + [str(proficiencyDice)] + commands[1:] logThis("Converted skill to dice") else: logThis("Okay, no they don't i guess") return "You don't have a user. You can make one with !swchar" elif string.capwords(commands[0]) in ["Ranged","Piloting"]: logThis("They fucked up writing the name of a ranged or piloting skill") if string.capwords(commands[0]) == "Ranged": return "Did you mean \"Ranged - Heavy\" or \"Ranged - Light\"" else: return "Did you mean \"Piloting - Planetary\" or \"Piloting - Space\"" try: logThis("Converting commands to dice") for x in range(len(commands)): if commands[x-1] != "": if commands[x-1][0] == "A": rollParameters[0] = int(commands[x-1].replace("A","")) elif commands[x-1][0] == "P": rollParameters[1] = int(commands[x-1].replace("P","")) elif commands[x-1][0] == "D": rollParameters[2] = int(commands[x-1].replace("D","")) elif commands[x-1][0] == "C": rollParameters[3] = int(commands[x-1].replace("C","")) elif commands[x-1][0] == "B": rollParameters[4] = int(commands[x-1].replace("B","")) elif commands[x-1][0] == "S": rollParameters[5] = int(commands[x-1].replace("S","")) elif commands[x-1][0] == "F": rollParameters[6] = int(commands[x-1].replace("F","")) else: rollParameters[x-1] = int(commands[x-1]) except: logThis("Someone fucked u-up! (it was them)") return "Invalid input!" logThis("Rolling "+str(rollParameters)) rollResults = roll(rollParameters[0],rollParameters[1],rollParameters[2],rollParameters[3],rollParameters[4],rollParameters[5],rollParameters[6]) simplified = simplify(rollResults) name = swchar.getName(user) if simplified != rollResults: logThis("Returns results and simplified results") return name + " rolls " + diceToEmoji(rollParameters) + "\nResult: " + resultToEmoji(rollResults) + "\nSimplified: " + resultToEmoji(simplify(rollResults)) else: logThis("Returns results") return name + " rolls " + diceToEmoji(rollParameters) + "\nResult: " + resultToEmoji(rollResults)