if __name__ != "handlers.skillfc": import math from secret.achievements import common from common.ripple import scoreUtils from objects import glob, beatmap else: import common VERSION = 3 ORDER = 3 # Loads the achievement length on load LENGTH = 0 ACHIEVEMENT_BASE = { "name": "{name}", "description": "{description}", "icon": "{mode}-skill-fc-{index}" } ACHIEVEMENT_KEYS = { "index": [1, 2, 3, 4, 5, 6, 7, 8], "mode": ["osu", "taiko", "fruits", "mania"], "name": [ "Totality", "Keeping Time", "Sweet And Sour", "Keystruck", "Business As Usual", "To Your Own Beat", "Reaching The Core", "Keying In", "Building Steam", "Big Drums", "Clean Platter", "Hyperflow", "Moving Forward", "Adversity Overcome", "Between The Rain", "Breakthrough", "Paradigm Shift", "Demonslayer", "Addicted", "Everything Extra", "Anguish Quelled", "Rhythm's Call", "Quickening", "Level Breaker", "Never Give Up", "Time Everlasting", "Supersonic", "Step Up", "Aberration", "The Drummer's Throne", "Dashing Scarlet", "Behind The Veil" ], "description": [ "All the notes. Every single one.", "Two to go, please.", "Hey, this isn't so bad.", "Bet you feel good about that.", "Surprisingly difficult.", "Don't choke.", "Excellence is its own reward.", "They said it couldn't be done. They were wrong." ] } # For every itteration index gets increased, while mode and mode_2 gets increased every 4 itterations ACHIEVEMENT_STRUCT = { "name": 1, "mode": 1, "index": 4, "description": 4 } ACHIEVEMENTS = [] def load(): global ACHIEVEMENTS, LENGTH ACHIEVEMENTS, LENGTH = common.load_achievement_data(ACHIEVEMENT_BASE, ACHIEVEMENT_KEYS, ACHIEVEMENT_STRUCT) def handle(mode, score, beatmap, user_data): if not score.fullCombo: # No need to check if the score were not a fullcombo return [] return check(mode, beatmap) def check(mode, beatmap): achievement_ids = [] mode_str = scoreUtils.readableGameMode(mode) mode_2 = mode_str.replace("osu", "std") stars = getattr(beatmap, "stars" + mode_2.title()) indexies = [x - 1 for x in ACHIEVEMENT_KEYS["index"] if x == math.floor(stars)] for index in indexies: achievement_ids.append(mode + index * 4) return achievement_ids def update(userID): achievement_ids = [] entries = glob.db.fetchAll("SELECT beatmap_md5, play_mode FROM scores WHERE full_combo = 1 AND completed >= 2 AND userid = %s GROUP BY beatmap_md5, play_mode", [userID]) for entry in entries: current_beatmap = beatmap.beatmap() current_beatmap.setDataFromDB(entry["beatmap_md5"]) achievement_ids += check(entry["play_mode"], current_beatmap) return achievement_ids