A module containing utilities for osu!droid and osu! in general.

Overview

About

This module is published for my own convenience so that I can use it across multiple projects of mine without having to manually transfer files, namely:

Features

  • Beatmap parser
  • osu! difficulty calculator
    • Two versions of difficulty calculators are available:
      • Live calculator (based on the current state of difficulty algorithm)
      • Local calculator (based on the most recent difficulty algorithm in osu!lazer)
    • Includes a strain graph generator.
  • osu! performance calculator
    • Two versions of performance calculators are available:
      • Live calculator (based on the current state of performance algorithm)
      • Local calculator (based on the most recent performance algorithm in osu!lazer)
  • osu!droid replay analyzer
    • Allows parsing osu!droid replay files (.odr) to get replay information.
    • Three finger/two hand detection
      • Uses cursor movement and beatmap difficulty data to detect.
      • Two hand detection is not practical as it's still a WIP.

An error margin should be expected from difficulty and performance calculator due to differences between C# and TypeScript.

All features that the module offers are interchangeable with two gamemodes where they are applicable (such as difficulty and performance calculator):

  • osu!droid
  • osu!standard

Requirements

You need Node v16 or newer to use this module.

Online features may require the following:

  • For osu!droid online-related features, you need to have an osu!droid API key specified as DROID_API_KEY environment variable.
  • For osu!standard online-related features, you need to have an osu! API key specified as OSU_API_KEY environment variable.

The table below lists all classes along with their methods that require an osu!droid API key or osu! API key.

  • osu!droid API key
    Class Method(s)
    MapInfo fetchDroidLeaderboard()
    Player
    • static getInformation()
    • hasPlayedVerificationMap()
    Score static getFromHash()
  • osu! API key
    Class Method(s)
    MapInfo static getInformation()

Examples

Below are some examples on how to use the features offered by this module.

The beatmap parser is the most important part of the module as it is required to obtain a Beatmap instance, which is required for all features of the module.

While the beatmap parser provides ways to obtain a Beatmap instance with and without osu! API, every examples after the beatmap parser will obtain the Beatmap instance using osu! API.

Beatmap Parser

Parsing with osu! API

import { MapInfo } from "osu-droid";

// MD5 hash is also supported
const beatmapInfo = await MapInfo.getInformation({ beatmapID: 901854 });

if (!beatmapInfo.title) {
    return console.log("Beatmap not found");
}

// Parsed beatmap can be accessed via the `map` field
// Note that the parsed beatmap will be cloned every time this is called. This allows caching of the original instance when needed
console.log(beatmapInfo.map);

Parsing without osu! API

import { readFile } from "fs";
import { Parser } from "osu-droid";

readFile("path/to/file.osu", { encoding: "utf-8" }, (err, data) => {
    if (err) throw err;

    const parser = new Parser().parse(data);

    // Parsed beatmap can be accessed via the `map` field
    console.log(parser.map);
});

Both examples return a Beatmap instance, which is necessary for some features of the module.

osu! difficulty calculator

All examples use live difficulty calculator. For local difficulty calculator, prefix calculation-related classes with Rebalance:

  • DroidStarRatingRebalanceDroidStarRating
  • OsuStarRatingRebalanceOsuStarRating
  • MapStarsRebalanceMapStars

General difficulty calculator usage

import { DroidStarRating, MapInfo, MapStars, OsuStarRating } from "osu-droid";

const beatmapInfo = await MapInfo.getInformation({ beatmapID: 901854 });

if (!beatmapInfo.title) {
    return console.log("Beatmap not found");
}

// Calculate osu!droid difficulty
const droidRating = new DroidStarRating().calculate({
    map: beatmapInfo.map,
});

console.log(droidRating);

// Calculate osu!standard difficulty
const osuRating = new OsuStarRating().calculate({
    map: beatmapInfo.map,
});

console.log(osuRating);

// Calculate both osu!droid and osu!standard difficulty
const rating = new MapStars().calculate({
    map: beatmapInfo.map,
});

// osu!droid difficulty
console.log(rating.droidStars);
// osu!standard difficulty
console.log(rating.pcStars);

Specifying difficulty calculation parameters

Parameters can be applied to alter the result of the calculation:

  • Mods: Modifications that will be considered when calculating the difficulty of a beatmap. Defaults to none.
  • Custom statistics: Used to apply a custom speed multiplier and force AR. Defaults to none.
import { MapInfo, MapStars, MapStats, ModUtil } from "osu-droid";

const beatmapInfo = await MapInfo.getInformation({ beatmapID: 901854 });

if (!beatmapInfo.title) {
    return console.log("Beatmap not found");
}

const mods = ModUtil.pcStringToMods("HDHR");

const stats = new MapStats({
    ar: 9,
    isForceAR: true,
    speedMultiplier: 1.5,
});

// Also available for `DroidStarRating` and `OsuStarRating`
const rating = new MapStars().calculate({
    map: beatmapInfo.map,
    mods: mods,
    stats: stats,
});

// osu!droid difficulty
console.log(rating.droidStars);
// osu!standard difficulty
console.log(rating.pcStars);

Generating a strain graph

The following example generates strain graph for the osu!standard gamemode. For osu!droid, replace OsuStarRating with DroidStarRating.

The strain graph is returned as a Buffer.

import { MapInfo, OsuStarRating } from "osu-droid";

const beatmapInfo = await MapInfo.getInformation({ beatmapID: 901854 });

if (!beatmapInfo.title) {
    return console.log("Beatmap not found");
}

const rating = new OsuStarRating().calculate({
    map: beatmapInfo.map,
});

// Generate a graph without a background and black graph color
console.log(await rating.getStrainChart());

// Generate a graph using the beatmap set's banner and black graph color
// For usage without osu! API, use `<Parser>.beatmapsetId`
console.log(await rating.getStrainChart(beatmapInfo.beatmapsetID));

// Generate a graph using the beatmap set's banner and a specific graph color
console.log(await rating.getStrainChart(beatmapInfo.beatmapsetID, "#fcba03"));

osu! performance calculator

All examples use live performance calculator. For local performance calculator, prefix calculation-related classes with Rebalance:

  • DroidPerformanceCalculatorRebalanceDroidPerformanceCalculator
  • OsuPerformanceCalculatorRebalanceOsuPerformanceCalculator

General performance calculator usage

import {
    DroidPerformanceCalculator,
    MapInfo,
    MapStars,
    OsuPerformanceCalculator,
} from "osu-droid";

const beatmapInfo = await MapInfo.getInformation({ beatmapID: 901854 });

if (!beatmapInfo.title) {
    return console.log("Beatmap not found");
}

const rating = new MapStars().calculate({
    map: beatmapInfo.map,
});

// osu!droid performance
const droidPerformance = new DroidPerformanceCalculator().calculate({
    stars: rating.droidStars,
});
console.log(droidPerformance);

// osu!standard performance
const osuPerformance = new OsuPerformanceCalculator().calculate({
    stars: rating.pcStars,
});
console.log(osuPerformance);

Specifying performance calculation parameters

Parameters can be passed to alter the result of the calculation:

  • Combo: The maximum combo achieved. Defaults to the beatmap's maximum combo.
  • Accuracy: The accuracy achieved. Defaults to 100%.
  • Misses: The amount of misses achieved.
  • Tap penalty: Penalty given from three-finger detection. Only applied for osu!droid gamemode. Defaults to 1.
  • Custom statistics: Used to apply a custom speed multiplier and force AR. Defaults to none.

The following example uses osu! API key to obtain a beatmap and calculates for the osu!standard gamemode. See this section for more methods on obtaining a beatmap. For osu!droid, replace OsuPerformanceCalculator with DroidPerformanceCalculator and OsuStarRating with DroidStarRating.

import {
    Accuracy,
    MapInfo,
    MapStats,
    OsuPerformanceCalculator,
    OsuStarRating,
} from "osu-droid";

const beatmapInfo = await MapInfo.getInformation({ beatmapID: 901854 });

if (!beatmapInfo.title) {
    return console.log("Beatmap not found");
}

const rating = new OsuStarRating().calculate({
    map: beatmapInfo.map,
});

const accuracy = new Accuracy({
    // Specify your misses here
    nmiss: 1,

    // The module provides a convenient way to specify accuracy based on the data that you have
    // Remove the codes below as you see fit

    // If you have hit data (amount of 300s, 100s, and 50s)
    n300: 1000,
    n100: 0,
    n50: 0,

    // If you have accuracy percentage
    // While this method is more convenient to use, the amount of 300s, 100s, and 50s will be estimated
    // This will lead to values being off when calculating for specific accuracies
    percent: 100,
    nobjects: beatmapInfo.objects,
});

const stats = new MapStats({
    ar: 9.5,
    isForceAR: true,
    speedMultiplier: 1.25,
});

const performance = new OsuPerformanceCalculator().calculate({
    stars: rating,
    combo: 1250,
    accPercent: accuracy,
    // The tap penalty can be properly obtained by checking a replay for three finger usage
    // However, a custom value can also be provided
    tapPenalty: 1.5,
    stats: stats,
});

console.log(performance);

osu!droid replay analyzer

To use the replay analyzer, you need a replay file (.odr).

Using replay analyzer with osu!droid API key

If you have an osu!droid API key, you can get a score's replay from a beatmap:

import { DroidStarRating, MapInfo, MapStats, Score } from "osu-droid";

const beatmapInfo = await MapInfo.getInformation({ beatmapID: 901854 });

if (!beatmapInfo.title) {
    return console.log("Beatmap not found");
}

const score = await Score.getFromHash({
    uid: 51076,
    hash: beatmapInfo.hash,
});

if (!score.title) {
    return console.log("Score not found");
}

await score.downloadReplay();

// A `ReplayAnalyzer` instance that contains the replay
const { replay } = score;
// The data of the replay
const { data } = replay;

if (!data) {
    return console.log("Replay not found");
}

const stats = new MapStats({
    ar: data.forcedAR,
    speedMultiplier: data.speedModification,
    isForceAR: !isNaN(data.forcedAR),
    // In droid version 1.6.7 and below, there exists a bug where NC is slower than DT in a few beatmaps
    // This option checks for said condition
    oldStatistics: data.replayVersion <= 3,
});

replay.map = new DroidStarRating().calculate({
    map: beatmapInfo.map,
    mods: data.convertedMods,
    stats: stats,
});

// More data can be obtained after specifying beatmap. We can call this method again to do so
await replay.analyze();

// Check for three-finger usage
replay.checkFor3Finger();

// Check for two-hand usage
replay.checkFor2Hand();

Using replay analyzer with a score ID

If you know a score's ID, you can use it to directly retrieve a replay:

import { DroidStarRating, MapInfo, MapStats, ReplayAnalyzer } from "osu-droid";

const beatmapInfo = await MapInfo.getInformation({ beatmapID: 901854 });

if (!beatmapInfo.title) {
    return console.log("Beatmap not found");
}

// A `ReplayAnalyzer` instance that contains the replay
const replay = await new ReplayAnalyzer({ scoreID: 12948732 }).analyze();
// The data of the replay
const { data } = replay;

if (!data) {
    return console.log("Replay not found");
}

const stats = new MapStats({
    ar: data.forcedAR,
    speedMultiplier: data.speedModification,
    isForceAR: !isNaN(data.forcedAR),
    // In droid version 1.6.7 and below, there exists a bug where NC is slower than DT in a few beatmaps
    // This option checks for said condition
    oldStatistics: data.replayVersion <= 3,
});

replay.map = new DroidStarRating().calculate({
    map: beatmapInfo.map,
    mods: data.convertedMods,
    stats: stats,
});

// More data can be obtained after specifying beatmap. We can call this method again to do so
await replay.analyze();

// Check for three-finger usage
replay.checkFor3Finger();

// Check for two-hand usage
replay.checkFor2Hand();

Using replay analyzer with a local replay file

import { readFile } from "fs";
import { DroidStarRating, MapInfo, MapStats, ReplayAnalyzer } from "osu-droid";

readFile("path/to/file.odr", async (err, replayData) => {
    if (err) throw err;

    const beatmapInfo = await MapInfo.getInformation({ beatmapID: 901854 });

    if (!beatmapInfo.title) {
        return console.log("Beatmap not found");
    }

    // A `ReplayAnalyzer` instance that contains the replay
    const replay = new ReplayAnalyzer({ scoreID: 0 });

    replay.originalODR = replayData;

    await replay.analyze();

    // The data of the replay
    const { data } = replay;

    const stats = new MapStats({
        ar: data.forcedAR,
        speedMultiplier: data.speedModification,
        isForceAR: !isNaN(data.forcedAR),
        // In droid version 1.6.7 and below, there exists a bug where NC is slower than DT in a few beatmaps
        // This option checks for said condition
        oldStatistics: data.replayVersion <= 3,
    });

    replay.map = new DroidStarRating().calculate({
        map: beatmapInfo.map,
        mods: data.convertedMods,
        stats: stats,
    });

    // More data can be obtained after specifying beatmap. We can call this method again to do so
    await replay.analyze();

    // Check for three-finger usage
    replay.checkFor3Finger();

    // Check for two-hand usage
    replay.checkFor2Hand();
});
You might also like...

A jQuery-free general purpose library for building credit card forms, validating inputs and formatting numbers.

A jQuery-free general purpose library for building credit card forms, validating inputs and formatting numbers.

Dec 30, 2022

The AKE-less General Purpose Build System with JavaScript DSL for Node.js platform.

The AKE-less General Purpose Build System with JavaScript DSL for Node.js platform.

The AKE-less General Purpose Build System with JavaScript DSL for Node.js platform. Inspired by NUKE. This project is reaching a mature stage, althoug

Oct 16, 2022

A monorepo containing both the $CODE token contract & the claim web app.

A monorepo containing both the $CODE token contract & the claim web app.

DeveloperDAO $CODE contract & claim site A monorepo containing both the $CODE token contract & the claim web app. Contents Related Development Prerequ

Jul 12, 2022

⚡️ Monorepository containing all the source code for the Foxxie Project

⚡️ Monorepository containing all the source code for the Foxxie Project

⚡️ Monorepository containing all the source code for the Foxxie Project

Jun 30, 2022

Master Collection NFT. Mints NFTs on Ethereum containing unique combination of titles for fun.

Master Collection NFT. Mints NFTs on Ethereum containing unique combination of titles for fun.

Master NFT Collection Master NFT Collection is an NFT minting platform that mints NFTs that contain a unique combination of snazzy titles just for fun

Mar 22, 2022

Unified-myst is a monorepo containing packages for using MyST

Unified-myst is a monorepo containing packages for using MyST

unified-myst (IN-DEVELOPMENT) unified-myst is a monorepo containing packages for using MyST (Markedly Structured Text), within the unified ecosystem.

Apr 14, 2022

🧩 TypeScript utility type in order to ensure to return only properties (not methods) containing values in primitive types such as number or boolean (not Value Objects)

🧩 TypeScript utility type in order to ensure to return only properties (not methods) containing values in primitive types such as number or boolean (not Value Objects)

🧩 TypeScript Primitives type TypeScript utility type in order to ensure to return only properties (not methods) containing values in primitive types

Dec 7, 2022

A general purpose, real-time visualization library.

Epoch By Ryan Sandor Richards Epoch is a general purpose charting library for application developers and visualization designers. It focuses on two di

Dec 30, 2022

🦠🔬 Forta agent that detect deployment of smart contracts containing an exploit function

Attack Simulation Bot Description The agent detects deployment of smart contracts containing an exploit function. Using a simulation-based approach, t

Dec 26, 2022
Comments
  • Updated README's "beatmap"">

    Updated README's "map" -> "beatmap"

    Description

    When I tried to use the package for difficulty calculation, I followed the example code in the README. It seems like the object "map" has been renamed to "beatmap". I'm currently using osu! API v1

    Old

    const beatmapInfo = await MapInfo.getInformation(901854);
    
    if (!beatmapInfo.title) {
        return console.log("Beatmap not found");
    }
    
    const rating = new MapStars(beatmapInfo.map);
    

    New

    const beatmapInfo = await MapInfo.getInformation(901854);
    
    if (!beatmapInfo.title) {
        return console.log("Beatmap not found");
    }
    
    const rating = new MapStars(beatmapInfo.beatmap);
    

    I'm hoping this change can help new users not encounter the same error I had. Overall, this package has been amazing to use. Thank you Rian ✨

    documentation size/M 
    opened by iantelli 1
  • feat(osu-base): Add ability for beatmap parser to obtain more information

    feat(osu-base): Add ability for beatmap parser to obtain more information

    Adds the ability for the beatmap parser to parse an entire .osu file.

    The Beatmap class has been refactored to group these changes nicely.

    TODO:

    • [x] Add object-specific hit samples to each hit object
    package:osu-base semver:major size/XXL 
    opened by Rian8337 0
  • feat: rename slider objects

    feat: rename slider objects

    This renames a few confusing slider-related classes:

    • HeadCircleSliderHead
    • RepeatPointSliderRepeat
    • TailCircleSliderTail

    Slider head, repeat, and tail props in Slider have also been renamed to match the classes' new name.

    package:osu-base semver:major size/L 
    opened by Rian8337 0
Releases(v3.0.0-beta.29)
  • v3.0.0-beta.29(Dec 28, 2022)

  • v3.0.0-beta.28(Dec 28, 2022)

  • v3.0.0-beta.27(Dec 28, 2022)

  • v3.0.0-beta.26(Dec 20, 2022)

    osu-rebalance-difficulty-calculator

    • Remove rhythm multiplier from droid visual skill
    • Give more bonus for Hidden in droid visual skill
    • Global aim buff for droid
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.25(Dec 1, 2022)

    osu-difficulty-calculator

    • Moved droid pp state in rebalance to live

    osu-rebalance-difficulty-calculator

    • Fixed incorrect flashlight difficulty being assigned to difficulty attributes
    Source code(tar.gz)
    Source code(zip)
  • v2.4.0(Dec 1, 2022)

  • v3.0.0-beta.24(Nov 29, 2022)

  • v3.0.0-beta.23(Nov 27, 2022)

    osu-rebalance-difficulty-calculator

    • Preemptively set objects' scale when creating difficulty hit objects

    All packages

    • Updated README's "map" -> "beatmap" by @iantelli (#12)
    Source code(tar.gz)
    Source code(zip)
  • v2.3.0(Nov 27, 2022)

    osu-difficulty-calculator

    • Update calculations to be on-par with master

    osu-rebalance-difficulty-calculator

    • Update calculations to be on-par with master

    All packages

    • Updated README's "map" --> "beatmap" (port of #12)
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.22(Nov 25, 2022)

    osu-difficulty-calculator

    • Store total star rating into attributes

    osu-rebalance-difficulty-calculator

    • Store total star rating into attributes
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.21(Nov 25, 2022)

    osu-difficulty-calculator

    • Export DifficultyAttributes interfaces

    osu-rebalance-difficulty-calculator

    • Export DifficultyAttributes interfaces
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.20(Nov 25, 2022)

    osu-difficulty-calculator

    • Use DifficultyAttributes for performance calculation

    osu-rebalance-difficulty-calculator

    • Use DifficultyAttributes for performance calculation
    • Consider gamemode for Hidden opacity

    osu-droid-replay-analyzer

    • Reduce run time for UR calculation
    • Improve <ReplayObjectData>.accuracy JSDoc
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.19(Nov 9, 2022)

    osu-base

    • Added getAngle to Vector2
    • Improved runtime of path finding in SliderPath

    osu-droid-replay-analyzer

    • Improved description of <ReplayObjectData>.accuracy
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.18(Oct 28, 2022)

    osu-base

    • Added a type for Circle | Slider | Spinner called PlaceableHitObject
    • Improved type safety of <Slider>.nestedHitObjects
    • Fixed error function estimation for 1.25 <= z < 2.25

    osu-droid-replay-analyzer

    • Exclude sliderbreaks from being counted to hit error calculation
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.17(Oct 23, 2022)

    osu-base

    • Renamed enums to caps

    osu-droid-replay-analyzer

    • Renamed enums to caps

    osu-droid-utilities

    • Use built-in crypto API instead of third-party package
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.16(Oct 12, 2022)

    osu-rebalance-difficulty-calculator

    • Nerfed doubletappable doubles in tap and rhythm droid skill
    • Fixed object distance not being calculated properly in overlapping factor
    • Used tap accuracy scaling in aim in droid pp calculator
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.15(Oct 11, 2022)

  • v3.0.0-beta.14(Oct 2, 2022)

    osu-rebalance-difficulty-calculator

    • Consider previous visible objects in overlapping factor
    • Nerfed doubletappable doubles in droid visual skill
    • Removed rhythm application in droid visual skill
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.13(Sep 30, 2022)

    osu-difficulty-calculator

    • Ported osu-rebalance-difficulty-calculator PC changes

    osu-rebalance-difficulty-calculator

    • Fixed TD star rating calculation in PC
    • Ported FL end position fix
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.12(Sep 26, 2022)

  • v3.0.0-beta.11(Sep 24, 2022)

    osu-base

    • Added clear method to ControlPointManager and BeatmapControlPoints

    osu-droid-replay-analyzer

    • Renamed hitResult to HitResult along with its members:
      • RESULT_0 --> miss
      • RESULT_50 --> meh
      • RESULT_100 --> good
      • RESULT_300 --> great
    • Renamed movementType to MovementType along with its members:
      • DOWN --> down
      • MOVE --> move
      • UP --> up
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.10(Sep 23, 2022)

    osu-base

    • Replace index findings in BeatmapHitObjects and ControlPointManager with binary search instead of linear search for better performance
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.9(Sep 21, 2022)

    osu-difficulty-calculator

    • Fixed a typo in <DroidPerformanceCalculator>.applyTapPenalty JSDoc
    • Fixed recursive tapPenalty getter

    osu-rebalance-difficulty-calculator

    • Fixed recursive tapPenalty getter
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.8(Sep 21, 2022)

    osu-rebalance-difficulty-calculator

    • Ported TD star rating

    osu-droid-utilities

    • Added <Score>.oldStatistics to denote whether a score was set on version 1.6.7 or lower.
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.7(Sep 20, 2022)

    osu-base

    • Added Brent root-finding algorithm
    • Added complementary error function (erfc) to ErrorFunction

    osu-difficulty-calculator

    • Added a method in DroidPerformanceCalculator to manually apply tap penalty

    osu-rebalance-difficulty-calculator

    • Added a method in DroidPerformanceCalculator to manually apply tap penalty
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.6(Sep 15, 2022)

  • v3.0.0-beta.5(Sep 15, 2022)

  • v3.0.0-beta.4(Sep 15, 2022)

    osu-base

    • Added a new Playfield class

    osu-droid-replay-analyzer

    • Reworked how cursor occurrences are stored in CursorData (they are now stored in CursorOccurrenceGroups with each group representing a player's action on the screen)
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.3(Sep 12, 2022)

    osu-base

    • Fixed storyboard animation start time incorrectness

    osu-difficulty-calculator

    • Reapply scale when generating difficulty hit objects

    osu-rebalance-difficulty-calculator

    • Reapply scale when generating difficulty hit objects
    Source code(tar.gz)
    Source code(zip)
  • v3.0.0-beta.2(Sep 12, 2022)

    osu-base

    • Combined MapInfo.getInformation overloads
    • <RGBColor>.toString now outputs the alpha component if it's not equal to 1
    • Fixed storyboard elements displaying too late
    • Fixed <RGBColor>.equals not comparing alpha component
    • Removed non-existent droid API endpoints
    • Replaced <HitObject>.radius with <HitObject>.getRadius
    • Replaced <HitObject>.stackOffset with <HitObject>.getStackOffset
    • Replaced <HitObject>.stackedPosition with <HitObject>.getStackedPosition
    • Replaced <HitObject>.stackedEndPosition with <HitObject>.getStackedEndPosition

    osu-droid-replay-analyzer

    • Changed <ReplayData>.convertedMods type to (Mod & IModApplicableToDroid)[]
    • Fixed the Precise mod being accounted twice in three finger and two hand detection

    osu-droid-utilities

    • Combined Player.getInformation overloads
    Source code(tar.gz)
    Source code(zip)
Owner
Rian
who dis
Rian
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
An npm package for demonstration purposes using TypeScript to build for both the ECMAScript Module format (i.e. ESM or ES Module) and CommonJS Module format. It can be used in Node.js and browser applications.

An npm package for demonstration purposes using TypeScript to build for both the ECMAScript Module format (i.e. ESM or ES Module) and CommonJS Module format. It can be used in Node.js and browser applications.

Snyk Labs 57 Dec 28, 2022
⌨️ Visualize keyboard history for osu! in bar form

bar-overlay-for-osu Visualize keyboard history for osu! Example Vertical Horizontal Features Customizable: keys, colors, speed, spacing, etc. Receives

solstice23 6 Oct 27, 2022
This work is an overnight with 84436, an overlay code forked from Osu! community but for ``flag of Vietnam`` in r/place 2022

flag-of-vietnam-rplace2022 This work is a overnight with 84436, an overlay code forked from Osu! community but for flag of Vietnam Installation Xài Ta

Đoàn Đình Toàn 10 Nov 2, 2022
An easy way to mass download osu! beatmaps

Batch Beatmap Downloader (Beta) Download Latest Release Table of Contents About Screenshots Getting Started Prerequisites Usage Build instructions Con

James 65 Jan 3, 2023
Pim 4 Jun 21, 2022
NewsStation is a news app which can be used to grab daily news bites. If you are interested in news whether politics, business, entertainment, general, health, science, sports and technology news NewsStation is for you!

This is a NewsStation WebApp Project Using News API NewsStation is a news app which can be used to grab daily news bites. If you are interested in new

Ravi Chauhan 2 Feb 7, 2022
Script to fetch all NFT owners using moralis API. This script output is a data.txt file containing all owner addresses of a given NFT and their balances.

?? Moralis NFT Snapshot Moralis NFT API will only return 500 itens at a time when its is called. For that reason, a simple logic is needed to fetch al

Phill Menezes 6 Jun 23, 2022