diff --git a/CS2 rating.py b/CS2 rating.py new file mode 100644 index 0000000..f5f6ba2 --- /dev/null +++ b/CS2 rating.py @@ -0,0 +1,568 @@ +from datetime import datetime +import time +import sys +import json +import os +os.system("title " + "Xameren's CS2 evaluation script") + +Kills = 0 +Deaths = 0 +Assists = 0 +HS = 0 +WR = 0 +Damage = 0 + +TotalTotalRating = 0 +TotalKillRating = 0 +TotalAssistRating = 0 +TotalHSrating = 0 +TotalDamageRating = 0 + +Rounds = 0 +Matches = 0 +Wins = 0 +Draws = 0 +Losses = 0 + +SaveFile = "Savefile.json" +GameList = [] + +GREEN = '\033[92m' +YELLOW = '\033[93m' +RED = '\033[91m' +BOLD = '\033[1m' +END = '\033[0m' + +def rating(Newkills, NewDeaths, NewAssists, NewHS, NewDamage, NewRounds, NewWin, AddMatchTotal, MatchDate = "N/A"): + global TotalRating, Rounds, Kills, Deaths, Assists, HS, Damage, Matches, TotalAssistRating, TotalDamageRating, TotalHSrating,TotalKillRating, GameList, TotalTotalRating, Wins, Draws, Losses + KillRating = round((Newkills/NewDeaths)/2, 3) + AssistRating = round(NewAssists/8, 3) + HSrating = round(NewHS/100, 3) + DamageRating = NewDamage/(135*NewRounds) + + KillRating = min(Newkills/(NewRounds*1.25), 1)*0.4+min((Newkills/NewDeaths)/1.25, 1)*0.4-min(NewDeaths/NewRounds, 1)*0.2 + AssistRating= min(NewAssists/(NewRounds*0.5), 1)*0.6+min(NewAssists/(NewAssists+Newkills), 1)*0.4 + HSrating = NewHS/100*0.6+min(NewHS/100*Newkills/Newkills, 1)*0.4 + DamageRating = min(NewDamage/(NewRounds*125), 1)*0.5+min(Newkills/(NewRounds*1.25), 1)*0.3+min(NewDamage/Newkills/125, 1)*0.2 + + if AddMatchTotal: + MatchDate = datetime.now().strftime("%d/%m/%Y") + + if NewWin == "y": + Wins += 1 + elif NewWin == "draw": + Draws += 1 + elif NewWin == "n": + Losses += 1 + + if KillRating > 1: + KillRating = 1 + if AssistRating > 1: + AssistRating = 1 + if HSrating > 1: + HSrating = 1 + if DamageRating > 1: + DamageRating = 1 + + TotalRating = KillRating*0.3+DamageRating*0.3+HSrating*0.2+AssistRating*0.2 + + + if AddMatchTotal: + Kills += Newkills + Deaths += NewDeaths + Assists += NewAssists + HS += NewHS + Damage += NewDamage + Rounds += NewRounds + TotalAssistRating += AssistRating + TotalDamageRating += DamageRating + TotalHSrating += HSrating + TotalKillRating += KillRating + TotalTotalRating += 0.4*KillRating+0.3*DamageRating+0.2*HSrating+0.1*AssistRating + + Matches += 1 + + TotalTotalRating = 0.4*TotalKillRating+0.3*TotalDamageRating+0.2*TotalHSrating+0.1*TotalAssistRating + + + GameList.insert(0, f"K: {Newkills}, D: {NewDeaths}, A: {NewAssists}, HS: {NewHS}, DMG: {NewDamage}, Rounds: {NewRounds}, Win: {NewWin}, Date: {MatchDate}") + matchstats(Newkills, NewDeaths, NewAssists, NewHS, NewDamage, NewRounds, NewWin, AssistRating, HSrating, KillRating, DamageRating, TotalRating, MatchDate) + +def register(): + global Username, Kills, Deaths, Assists, HS, Damage, Matches, WR + reset = True + while reset: + print("Welcome to xameren's CS2 evaluation tool") + print("What's your Username?") + Username = input("Your Username:") + print("Do you want to import your stats?") + print("You will be prompted to fill your KD, kills, assists, deaths, HS% and damage from your last round") + while True: + fillornot = input("(y/n) ") + if fillornot.lower() == "y": + while True: + try: + Ki = int(input("Kills: ")) + De = int(input("Deaths: ")) + As = int(input("Assists: ")) + Hs = int(input("HS%: ")) + Da = int(input("Damage: ")) + Ro = int(input("Rounds: ")) + while True: + Wi = input("Did you win? (y/draw/n)").lower() + if Wi == "y" or Wi == "n" or Wi == "draw": + break + break + except ValueError: + print("Please enter valid numbers") + correctregister = input("Is this all correct? (y/N) ").lower() + if correctregister == "y": + reset = False + rating(Ki, De, As, Hs, Da, Ro, Wi, AddMatchTotal = True) + break + elif fillornot.lower() == "n": + print("Alright, no problem") + reset = False + time.sleep(1) + break + +def WRcalc(): + if Losses == 0: + return 100 + else: + return round((Wins/Matches)*100, 2) + + +def Coloring(numbah): + if numbah < 33: + return RED + elif numbah < 66: + return YELLOW + else: + return GREEN +def ColoringLow(numbah): + if numbah < 33: + return GREEN + elif numbah < 66: + return YELLOW + else: + return RED + +def matchstats(Newkills, NewDeaths, NewAssists, NewHS, NewDamage, NewRounds, NewWin, AssistRating, HSrating, KillRating, DamageRating, TotalRating, MatchDate = "N/A"): + Newkills = int(Newkills) + NewDeaths = int(NewDeaths) + NewAssists = int(NewAssists) + NewHS = int(NewHS) + NewDamage = int(NewDamage) + NewRounds = int(NewRounds) + + print("\033[H\033[J", end="") + print("Match rating") + print(f" Name: {Username}") + print(f" Date: {MatchDate}") + print(f" Match {f"{GREEN}Won" if NewWin == "y" else f"{RED}Lost" if NewWin == "n" else "Drawn"}{END}") + print(f" Rounds: {NewRounds}") + spaces = " " + print() + print(f"{Coloring(TotalRating*100)}XMRating: {round(TotalRating*100, 3)}{END}") + print(f"{Coloring(HSrating*100)}{spaces}HS rating: {round(HSrating*100, 3)}{END}") + print(f"{Coloring(AssistRating*100)}{spaces}Assist rating {round(AssistRating*100, 3)}{END}") + print() + + print(f"{spaces}Headshots:") + print(f"{Coloring((NewHS/100*Newkills)/12*100)}{spaces}Total: {round(NewHS/100*Newkills, 3)}{END}") + print(f"{Coloring((NewHS/100*Newkills/NewRounds)/1*100)}{spaces}Headshots/Round: {round(NewHS/100*Newkills/NewRounds, 3)}{END}") + print(f"{Coloring(NewHS)}{spaces}Headshot%: {NewHS}{END}") + print() + print(f"{spaces}Damage:") + print(f"{Coloring(NewDamage/(NewRounds*130)*100)}{spaces}Total: {NewDamage}{END}") + print(f"{Coloring(NewDamage/(NewRounds*130)*100)}{spaces}Average/Round: {round(NewDamage/NewRounds, 3)}{END}") + print(f"{Coloring((NewDamage/Newkills)/125*100)}{spaces}Average/Kill: {round(NewDamage/Newkills, 3)}") + print() + print("\033[H", end="") + print("\n\n\n\n\n") + print() + print(f"{Coloring(round(KillRating*100, 3))} Kill rating: {round(KillRating*100, 3)}{END}") + print(f"{Coloring(round(DamageRating*100, 3))} Damage rating: {round(DamageRating*100, 3)}{END}") + print() + print(f"Kills:") + print(f"{Coloring(Newkills/NewRounds*100)}Total: {Newkills}{END}") + print(f"{Coloring(Newkills/NewRounds*100)}Average/Round: {round(Newkills/NewRounds, 3)}{END}") + print(f"{Coloring((Newkills/NewDeaths)/1.2*100)}K/D: {round(Newkills/NewDeaths, 3)}{END}") + print() + print("Deaths:") + print(f"{ColoringLow(NewDeaths/NewRounds*100)}Total: {NewDeaths}{END}") + print(f"{ColoringLow(NewDeaths/NewRounds*100)}Deats/Round: {round(NewDeaths/NewRounds, 3)}{END}") + print() + print("Assists:") + print(f"{Coloring(NewAssists/NewRounds/1*100)}Total: {NewAssists}{END}") + print(f"{Coloring(NewAssists/NewRounds/1*100)}Assists/Round {round(NewAssists/NewRounds, 3)}{END}") + input("\nPress enter to exit") + + +def profile(): + global Username, Matches, Kills, HS, Rounds, Damage, Deaths, Assists + while True: + + """ + TotalAssistRating += AssistRating + TotalDamageRating += DamageRating + TotalHSrating += HSrating + TotalKillRating += KillRating + """ + + print("\033[H\033[J", end="") + print(f"Name: {Username}") + print() + try: + TotalTotalRating = round(0.4*(round(TotalKillRating/Matches*100, 3))+0.3*(round(TotalDamageRating/Matches*100, 3))+0.2*(round(TotalHSrating/Matches*100, 3))+0.1*(round(TotalAssistRating/Matches*100, 3)), 3) + print("\033[H\033[J", end="") + print(f"Name: {Username}") + print() + print(f"{Coloring(TotalTotalRating)}XMRating: {TotalTotalRating}{END}") + print(f"\n\n\n\n\n\n\n\n\n\n Draws: {Draws} \n Matches: {Matches}") + spaces = " " + print("\033[H", end="") + print(f"Name: {Username}") + print() + print(f"{Coloring(TotalTotalRating)}XMRating: {TotalTotalRating}{END}") + print(f"{Coloring(round(TotalHSrating/Matches*100, 3))} HS rating: {round(TotalHSrating/Matches*100, 3)}{END}") + print(f"{Coloring(round(TotalAssistRating/Matches*100, 3))} Assist rating: {round(TotalAssistRating/Matches*100, 3)}{END}") + print("") + print(f"{spaces}Headshots:") + print(f"{spaces} Total: {round(Kills*((HS/Matches)/100), 0)}") + print(f"{Coloring(round(Kills*(HS/Matches/100)/Matches, 2)/20*100)}{spaces} Average/Match: {round(Kills*(HS/Matches/100)/Matches, 2)}{END}") + print(f"{Coloring(round(Kills*(HS/Matches/100)/Rounds, 2)/1*100)}{spaces} Average/Round: {round(Kills*(HS/Matches/100)/Rounds, 2)}{END}") + print(f"{Coloring(round(HS/Matches))}{spaces} Average%: {round(HS/Matches)}%{END}") + print() + print(f"{spaces}Games:") + print(f"{spaces} Wins: {Wins}") + print(f"{Coloring(WRcalc()/75*100)}{spaces} WR%: {WRcalc()}%{END}") + print(f"{spaces} Rounds: {Rounds}") + print("\n") + print(f"{spaces}Damage:") + print(f"{spaces} Total: {Damage}") + print(f"{Coloring(round(Damage/Matches, 2)/(130*(Rounds/Matches))*100)}{spaces} Average/Match: {round(Damage/Matches, 2)}{END}") + print(f"{Coloring(round(Damage/Rounds, 2)/130*100)}{spaces} Average/Round: {round(Damage/Rounds, 2)}{END}") + print(f"{Coloring(round((Damage/(Kills*125)*100), 2))}{spaces} Average/Kill: {round(Damage/Kills, 2)}{END}") + + print("\033[H", end="") + print(f"Name: {Username}") + print() + print(f"{Coloring(TotalTotalRating)}XMRating: {TotalTotalRating}{END}") + print(f"{Coloring(round(TotalKillRating/Matches*100, 3))} Kill rating: {round(TotalKillRating/Matches*100, 3)}{END}") + print(f"{Coloring(round(TotalDamageRating/Matches*100, 3))} Damage rating: {round(TotalDamageRating/Matches*100, 3)}{END}") + print("") + print(f"Kills:") + print(f" Total: {Kills}") + print(f" {Coloring(round(Kills/Matches, 2)/25*100)}Average/Match: {round(Kills/Matches, 2)}{END}") + print(f" {Coloring(round(round(Kills/Rounds, 2))/1.5*100)}Average/Round: {round(Kills/Rounds, 2)}{END}") + print(f" {Coloring(round(Kills/Deaths, 2)/1.5*100)}K/D: {round(Kills/Deaths, 2)}{END}") + print() + print(f"Deaths:") + print(f" Total: {Deaths}") + print(f" {ColoringLow(round(Deaths/Matches, 2)/22*100)}Average/Match: {round(Deaths/Matches, 2)}{END}") + print(f" {ColoringLow(round(Deaths/Rounds, 2)/1*100)}Average/Round: {round(Deaths/Rounds, 2)}{END}") + print("\n") + print(f"Assists:") + print(f" Total: {Assists}") + print(f" {Coloring(round(Assists/Matches, 2)/8*100)}Average/Match: {round(Assists/Matches, 2)}{END}") + print(f" {Coloring(round(Assists/Rounds, 2)/0.4*100)}Average/Round: {round(Assists/Rounds, 2)}{END}") + print("\n") + except Exception as e: + print("error ", e) + print("There are no stats to judge you... yet.") + print("c) Change username") + print("r) Recent matches") + print("q) Back to the main menu") + inputprofile = input().lower() + if inputprofile == "c": + newuser = input("Your new Username will be: ") + Username = newuser + elif inputprofile == "xamseccod": + print("eGFtZXJlbiBtYWRlIHRoaXM=") + elif inputprofile == "r": + page = 0 + while True: + print("\033[H\033[J", end="") + print("Recent matches\n") + for i, item in enumerate(GameList[0+(page*15):15+(page*15)]): + Colormatches = GameList[i] + values = dict(stritem.split(": ") for stritem in Colormatches.split(", ")) + if values["Win"] == "y": + print(f" {GREEN}Match {int(i)+(page*15)+1} - {item}{END}") + elif values["Win"] == "n": + print(f" {RED}Match {int(i)+(page*15)+1} - {item}{END}") + else: + print(f" Match {int(i)+(page*15)+1} - {item}") + + + print(f"\n1 - {len(GameList)}) to view a match") + if len(GameList) > 15: + if page*15+15 < len(GameList): + print(f"\nShowing {page*15+1} - {page*15+15} out of {len(GameList)} matches\n") + else: + print(f"\nShowing {page*15+1} - {len(GameList)} out of {len(GameList)} matches\n") + print("b) Previous page\nn) Next page") + + + print("h) Help") + print("q) Back to menu") + + + leaveinput = input() +# Newkills, NewDeaths, NewAssists, NewHS, NewDamage, NewRounds, NewWin, AddMatchTotal + + try: + Getstats = int(leaveinput) + if 1 <= Getstats <= len(GameList): + Getstats -= 1 + DeletedMatch = GameList[Getstats] + values = dict(stritem.split(": ") for stritem in DeletedMatch.split(", ")) + try: + rating(int(values["K"]), int(values["D"]), int(values["A"]), int(values["HS"]), int(values["DMG"]), int(values["Rounds"]), values["Win"], False, values["Date"]) + except Exception: + rating(int(values["K"]), int(values["D"]), int(values["A"]), int(values["HS"]), int(values["DMG"]), int(values["Rounds"]), values["Win"], False) + + except Exception: + if leaveinput == "q": + break + elif leaveinput == "n": + if len(GameList) > page*15+15: + page += 1 + else: + print("This is the last page.") + elif leaveinput == "b": + if 0+(page*15) > 0: + page -= 1 + else: + print("This is the first page.") + if leaveinput == "h": + print("\033[H\033[J", end="") + print("Help") + print(" K - Kills") + print(" D - Deaths") + print(" A - Assists") + print(" HS - Headshot percentage") + print(" DMG - Damage dealt") + print(" Win - If you won (y), lost (n), or tied (draw)") + print("Enter anything to exit") + input() + elif inputprofile == "q": + break + +def addmatch(): + Quit = False + while True: + print("\033[H\033[J", end="") + print("Adding a match") + print("Please put in your statistics of the match") + try: + Newkills = int(input("Kills: ")) + NewDeaths = int(input("Deaths: ")) + NewAssists = int(input("Assists: ")) + NewHS = int(input("HS%: ")) + NewDamage = int(input("Damage: ")) + NewRounds = int(input("Rounds: ")) + while True: + WINyn = input("Did you win? (y/draw/n) ").lower() + if WINyn == "n" or WINyn == "y" or WINyn == "draw": + NewWin = WINyn + break + + matchsure = input("Is this all correct? (y/n) ").lower() + if matchsure == "y": + break + elif matchsure == "n": + Quit = True + break + except ValueError: + print("Please only provide a number") + if not Quit: + rating(Newkills, NewDeaths, NewAssists, NewHS, NewDamage, NewRounds, NewWin, True) + +def removematch(): + global Kills, Deaths, Assists, HS, Damage, Rounds, Wins, Losses, Draws, Matches, TotalKillRating, TotalAssistRating, TotalHSrating, TotalDamageRating + print("\033[H\033[J", end="") + page = 0 + while True: + print("\033[H\033[J", end="") + print("Which match would you like to remove?\n") + for i, item in enumerate(GameList[0+(page*15):15+(page*15)]): + + Colormatches = GameList[i] + values = dict(stritem.split(": ") for stritem in Colormatches.split(", ")) + if values["Win"] == "y": + print(f" {GREEN}Match {int(i)+(page*15)+1} - {item}{END}") + elif values["Win"] == "n": + print(f" {RED}Match {int(i)+(page*15)+1} - {item}{END}") + else: + print(f" Match {int(i)+(page*15)+1} - {item}") + if page*15+15 < len(GameList): + print(f"\nShowing {page*15+1} - {page*15+15} out of {len(GameList)} matches\n") + else: + print(f"\nShowing {page*15+1} - {len(GameList)} out of {len(GameList)} matches\n") + print(f"1 - {len(GameList)}) to remove a match") + print("b) Previous page") + print("n) Next page") + print("q) Exit to the main menu") + Chosen1 = input() + try: + a = 5 + Chosen = int(Chosen1) + if 1 <= Chosen <= len(GameList): + Chosen -= 1 + DeletedMatch = GameList[Chosen] + values = dict(stritem.split(": ") for stritem in DeletedMatch.split(", ")) + Kills -= int(values["K"]) + Deaths -= int(values["D"]) + Assists -= int(values["A"]) + HS -= int(values["HS"]) + Damage -= int(values["DMG"]) + Rounds -= int(values["Rounds"]) + Matches -= 1 + + if values["Win"] == "y": + Wins -= 1 + elif values["Win"] == "n": + Losses -= 1 + elif values["Win"] == "draw": + Draws -= 1 + + """ + + + KillRating = min(Newkills/(NewRounds*1.25), 1)*0.4+min((Newkills/NewDeaths)/1.25, 1)*0.4-min(NewDeaths/NewRounds, 1)*0.2 + AssistRating= min(NewAssists/(NewRounds*0.5), 1)*0.6+min(NewAssists/(NewAssists+Newkills), 1)*0.4 + HSrating = NewHS/100*0.6+min(NewHS/100*Newkills/Newkills, 1)*0.4 + DamageRating = min(NewDamage/(NewRounds*125), 1)*0.5+min(Newkills/(NewRounds*1.25), 1)*0.3+min(NewDamage/Newkills/125, 1)*0.2 + + + """ + Newkills = int(values["K"]) + NewDeaths = int(values["D"]) + NewAssists = int(values["A"]) + NewRounds = int(values["Rounds"]) + NewHS = int(values["HS"]) + NewDamage = int(values["DMG"]) + + + + if round(round(min(Newkills/(NewRounds*1.25), 1)*0.4+min((Newkills/NewDeaths)/1.25, 1)*0.4-min(NewDeaths/NewRounds, 1)*0.2, 3)/2, 3) < 1: + TotalKillRating -= round(min(Newkills/(NewRounds*1.25), 1)*0.4+min((Newkills/NewDeaths)/1.25, 1)*0.4-min(NewDeaths/NewRounds, 1)*0.2, 3) + else: + TotalKillRating -= 1 + + if round(min(NewAssists/(NewRounds*0.5), 1)*0.6+min(NewAssists/(NewAssists+Newkills), 1)*0.4, 3) < 1: + TotalAssistRating -= round(min(NewAssists/(NewRounds*0.5), 1)*0.6+min(NewAssists/(NewAssists+Newkills), 1)*0.4, 3) + else: + TotalAssistRating -= 1 + if round(int(a)/20*1407, 3) == 0: + UnassignedString = "eGFtZXJlbg==" + if round(NewHS/100*0.6+min(NewHS/100*Newkills/Newkills, 1)*0.4, 3) < 1: + TotalHSrating -= round(NewHS/100*0.6+min(NewHS/100*Newkills/Newkills, 1)*0.4, 3) + else: + TotalHSrating -= 1 + + if round(min(NewDamage/(NewRounds*125), 1)*0.5+min(Newkills/(NewRounds*1.25), 1)*0.3+min(NewDamage/Newkills/125, 1)*0.2, 3) < 1: + TotalDamageRating -= round(min(NewDamage/(NewRounds*125), 1)*0.5+min(Newkills/(NewRounds*1.25), 1)*0.3+min(NewDamage/Newkills/125, 1)*0.2, 3) + else: + TotalDamageRating -= 1 + + GameList.pop(Chosen) + print("\033[H\033[J", end="") + except Exception as e: + if Chosen1 == "q": + break + elif Chosen1 == "n": + if len(GameList) > page*15+15: + page += 1 + elif Chosen1 == "b": + if 0+(page*15) > 0: + page -= 1 +def mainmenu(): + while True: + save() + print("\033[H\033[J", end="") + print(f"Welcome, {BOLD}{Username}{END}") + print("What would you like to do?") + print("s) Show my profile") + print("a) Add a match") + print("r) Remove a match") + print("q) Quit") + inputmenu = input("Your choise: ").lower() + if inputmenu == "s": + profile() + if inputmenu == "a": + addmatch() + if inputmenu == "r": + removematch() + elif inputmenu == "q": + sys.exit() + +def load(): + global Username, GameList, Kills, Deaths, Assists, HS, WR, Damage, TotalTotalRating, TotalKillRating, TotalAssistRating, TotalHSrating, TotalDamageRating, Rounds, Matches, Wins, Draws, Losses + if os.path.exists(SaveFile): + try: + print("Saving..") + with open(SaveFile, 'r') as file: + GameState = json.load(file) + Username = GameState["Username"] + Kills = GameState["Kills"] + Deaths = GameState["Deaths"] + Assists = GameState["Assists"] + HS = GameState["HS"] + WR = GameState["WR"] + Damage = GameState["Damage"] + TotalTotalRating = GameState["TotalTotalRating"] + TotalKillRating = GameState["TotalKillRating"] + TotalAssistRating = GameState["TotalAssistRating"] + TotalHSrating = GameState["TotalHSrating"] + TotalDamageRating = GameState["TotalDamageRating"] + Rounds = GameState["Rounds"] + Matches = GameState["Matches"] + Wins = GameState["Wins"] + Draws = GameState["Draws"] + Losses = GameState["Losses"] + GameList = GameState["GameList"] + print("Saved!") + except Exception as e: + print(f"Error - {e}") + time.sleep(0.25) + +def save(): + global Username, GameList, Kills, Deaths, Assists, HS, WR, Damage, TotalTotalRating, TotalKillRating, TotalAssistRating, TotalHSrating, TotalDamageRating, Rounds, Matches, Wins, Draws, Losses + + GameState = { + "Username": Username, + "Kills": Kills, + "Deaths": Deaths, + "Assists": Assists, + "HS": HS, + "WR": WR, + "Damage": Damage, + "TotalTotalRating": TotalTotalRating, + "TotalKillRating": TotalKillRating, + "TotalAssistRating": TotalAssistRating, + "TotalHSrating": TotalHSrating, + "TotalDamageRating": TotalDamageRating, + "Rounds": Rounds, + "Matches": Matches, + "Wins": Wins, + "Draws": Draws, + "Losses": Losses, + "GameList": GameList + } + + with open(SaveFile, 'w') as file: + json.dump(GameState, file) + +def start(): + if os.path.exists(SaveFile): + load() + mainmenu() + else: + register() + mainmenu() + +start() \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..046f5db Binary files /dev/null and b/screenshot.png differ