npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@kionell/osu-pp-calculator

v4.0.0

Published

Reimplementation of original osu-tools written in TypeScript

Downloads

82

Readme

osu-pp-calculator

CodeFactor License Package

This is an advanced performance calculator for the game called osu!

  • Written in TypeScript.
  • Based on the osu!lazer source code.
  • Supports converted beatmaps.
  • Supports unsubmitted beatmaps via custom file URL.
  • Can calculate beatmaps with custom clockrate and stats.
  • Outputs strains for beatmaps and lifebar values for replays.
  • Can be used for score simulation and replay calculation via replay URL.
  • Uses latest difficulty and performance changes (as of October 2022).

Installation

Add a new dependency to your project via npm:

npm install @kionell/osu-pp-calculator

Dependencies

  • osu-classes - Basic package for developing all osu! projects.
  • osu-parsers - Used for beatmap & replay parsing.
  • osu-downloader - Advanced osu! downloader for beatmaps and replays with file validation.
  • osu-standard-stable - Used for difficulty & performance calculation of the osu!standard beatmaps and scores.
  • osu-taiko-stable - Used for difficulty & performance calculation of the osu!taiko beatmaps and scores.
  • osu-catch-stable - Used for difficulty & performance calculation of the osu!catch beatmaps and scores.
  • osu-mania-stable - Used for difficulty & performance calculation of the osu!mania beatmaps and scores.

Beatmap calculation

Beatmaps can be calculated by beatmap ID or custom beatmap file URL. All files are downloaded automatically and cached by default. You can change path to the cache or disable caching at all. The more precalculated data you have the less you need to calculate using this calculator. In case if you pass precalculated difficulty attributes and beatmap information, this calculator will try to skip beatmap parsing and calculate performance attributes immediately. This will not work if you try to output beatmap strains tho. For beatmap strains you need to parse beatmap and calculate its difficulty.

Beatmap calculation options

| Name | Description | Type | Optional | Default value | |:-----------------:|:-----------------------------------------------------------------------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:--------:|:------------------:| | beatmapInfo | Precalculated beatmap information. | IBeatmapInfo | IJsonableBeatmapInfo | Yes | - | | attributes | Missing beatmap attributes that are required to simulate scores. This is used only for osu!catch which requires the number of fruits and droplets. | IBeatmapAttributes | Yes | - | | rulesetId | Ruleset ID | number | Yes | Beatmap ruleset | | ruleset | Custom ruleset instance (for non-supported rulesets) | IRuleset | Yes | Beatmap ruleset | | mods | Mod combination or bitwise. | string | number | Yes | NM | | difficulty | Precalculated difficulty attributes. | IDifficultyAttributes | Yes | - | | totalHits | Total hits for gradual beatmap difficulty calculation. If it differs from the hit object count of a full beatmap then it will force difficulty calculation. | number | Yes | Beatmap total hits | | strains | Whether to output strain peaks or not. | boolean | Yes | false | | accuracy | List of accuracy for all game modes | number[] | Yes | [95, 98, 100] | | beatmapId | ID of the target beatmap. | number | Yes | - | | fileURL | Custom file URL of the target beatmap. | string | Yes | - | | savePath | Path to the beatmap file save location. | string | Yes | "./cache" | | cacheFiles | Should files be cached on a disk after calculation? | boolean | Yes | true | | hash | Hash of the target beatmap. Used to validate beatmap files. If wasn't specified then file will not be validated. | string | Yes | - | | approachRate | Custom approach rate for the target beatmap in range [0-11]. | number | Yes | Beatmap AR | | overallDifficulty | Custom overall difficulty for the target beatmap in range [0-11]. | number | Yes | Beatmap OD | | circleSize | Custom circle size for the target beatmap in range [0-11]. | number | Yes | Beatmap CS | | clockRate | Custom clock rate for the target beatmap in range [0.25-3]. | number | Yes | Beatmap clockrate | | bpm | Custom BPM for the target beatmap in range [60-10000]. Can exceed clockrate limits. | number | Yes | Beatmap BPM | | lockApproachRate | Prevents scaling of approach rate from difficulty adjusting mods. | boolean | Yes | false | | lockOverallDifficulty | Prevents scaling of overall difficulty from difficulty adjusting mods. | boolean | Yes | false | | lockCircleSize | Prevents scaling of circle size from difficulty adjusting mods. | boolean | Yes | false |

How to use beatmap calculator

import { BeatmapCalculator } from '@kionell/osu-pp-calculator'

const beatmapCalculator = new BeatmapCalculator();

const result = await beatmapCalculator.calculate({
  beatmapId: 1695382,     // Calculate beatmap with ID 1695382
  mods: 'HDDT',           // Calculate beatmap with HDDT mods.
  rulesetId: 3,           // Convert this beatmap to the osu!mania ruleset.
  accuracy: [90, 92, 99], // Calculate performance for 90%, 92% and 99% accuracy.
  strains: true,          // Output strain values (can be used for building strain graph).
  approachRate: 5,        // Set initial approach rate of the beatmap to 5 (not working for rulesets without AR).
  overallDifficulty: 6,   // Set initial overall difficulty of the beatmap to 6 (not working for rulesets without OD).
  clockRate: 2.2,         // Set clock rate of the beatmap to 2.2
  totalHits: 200,         // Calculate only first 200 objects of the beatmap. 
});

Stringified beatmap calculation output

{
  "beatmapInfo": {
    "id": 1695382,
    "beatmapsetId": 807850,
    "creatorId": 0,
    "creator": "Nevo",
    "favourites": 0,
    "passcount": 0,
    "playcount": 0,
    "status": -2,
    "title": "Mou Ii kai?",
    "artist": "THE ORAL CIGARETTES",
    "version": "Rain",
    "hittable": 822,
    "slidable": 0,
    "spinnable": 0,
    "holdable": 187,
    "length": 38.1390909090909,
    "bpmMin": 422.40000000000003,
    "bpmMax": 422.40000000000003,
    "bpmMode": 422.40000000000003,
    "circleSize": 7,
    "approachRate": 9.600000381469727,
    "overallDifficulty": 9.600000381469727,
    "drainRate": 6,
    "starRating": 0,
    "maxCombo": 1239,
    "isConvert": true,
    "deletedAt": null,
    "updatedAt": null,
    "md5": "a9e199c11e6e980a5b8e7fab577a61ca",
    "mods": "HDDT",
    "rulesetId": 3,
    "totalHits": 1009
  },
  "attributes": {
    "beatmapId": 1695382,
    "rulesetId": 3,
    "mods": "HDDT",
    "maxCombo": 1239,
    "clockRate": 2.2,
    "totalHits": 200,
    "maxFruits": 822,
    "maxDroplets": 0,
    "maxTinyDroplets": 0
  },
  "skills": [
    {
      "title": "Strain",
      "strainPeaks": [
        11.923872846058632,
        20.094559378244572,
        23.24491065116399,
        28.359139012121112,
        28.49445324083708,
        28.48941376652405,
        29.623584184490362,
        31.29989996954709,
        29.776584828405223,
        26.18698395475034,
        29.60093228910057,
        29.551000264044337,
        26.733776644631135,
        22.653368641459263,
        23.047484620797093,
        28.256876431500995,
        27.85502827688512,
        26.90389416382286,
        30.654131532118168,
        30.502875550841555,
        30.582869639525093
      ]
    }
  ],
  "difficulty": {
    "maxCombo": 0,
    "mods": "HDDT",
    "starRating": 4.622018505963288,
    "greatHitWindow": 34
  },
  "performance": [
    {
      "mods": "HDDT",
      "totalPerformance": 108.00834887422428,
      "difficultyPerformance": 13.501043609278035
    },
    {
      "mods": "HDDT",
      "totalPerformance": 131.07975251033213,
      "difficultyPerformance": 16.384969063791516
    },
    {
      "mods": "HDDT",
      "totalPerformance": 209.52252487309954,
      "difficultyPerformance": 26.190315609137443
    }
  ]
}

Score calculation

You can use almost all options from beatmap calculator for score calculator as well. Score calculator can accept custom IScoreInfo objects and replay file URLs. It is also possible to simulate FC scores by using "fix" option.

Score calculation options

| Name | Description | Type | Optional | Default value | |:-----------------:|:----------------------------------------------------------------------------------------------------------------:|:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:|:--------:|:-----------------:| | beatmapId | ID of the target beatmap. | number | Yes | - | | fileURL | Custom file URL of the target beatmap. | string | Yes | - | | rulesetId | Ruleset ID | number | Yes | Beatmap ruleset | | ruleset | Custom ruleset instance (for non-supported rulesets) | IRuleset | Yes | Beatmap ruleset | | beatmapInfo | Precalculated beatmap information. | IBeatmapInfo | IJsonableBeatmapInfo | Yes | - | | mods | Mod combination or bitwise. | string | number | Yes | NM | | difficulty | Precalculated difficulty attributes. | IDifficultyAttributes | Yes | - | | scoreInfo | Target score. | IScoreInfo | IJsonableScoreInfo | Yes | - | | fix | Should this score be unchoked or not? | boolean | Yes | false | | replayURL | Custom replay file URL. | string | Yes | - | | lifeBar | Output replay life bar if replay file is present? | boolean | Yes | false | | savePath | Path to the replay file save location. | string | Yes | "./cache" | | hash | Hash of the target beatmap. Used to validate beatmap files. If wasn't specified then file will not be validated. | string | Yes | - | | attributes | Missing beatmap attributes for score simulation. | IBeatmapAttributes | Yes | - | | countMiss | Target score misses. | number | Yes | 0 | | count50 | Target score 50's. | number | Yes | Simulated by acc | | count100 | Target score 100's. | number | Yes | Simulated by acc | | count300 | Target score 300's. | number | Yes | Simulated by acc | | countKatu | Target score katu hits. | number | Yes | Simulated by acc | | countGeki | Target score geki hits (not used right now). | number | Yes | Simulated by acc | | accuracy | Target score accuracy. | number | Yes | 100 | | totalScore | Target total score. | number | Yes | 0 | | maxCombo | Target max combo of a score. | number | Yes | Beatmap max combo | | percentCombo | Target percent of max combo of a score. | number | Yes | 100 | | approachRate | Custom approach rate for the target beatmap. | number | Yes | Beatmap AR | | overallDifficulty | Custom overall difficulty for the target beatmap. | number | Yes | Beatmap OD | | circleSize | Custom circle size for the target beatmap. | number | Yes | Beatmap CS | | clockRate | Custom clock rate for the target beatmap. | number | Yes | Beatmap clockrate | | bpm | Custom BPM for the target beatmap in range [60-10000]. | number | Yes | Beatmap BPM | | lockApproachRate | Prevents scaling of approach rate from difficulty adjusting mods. | boolean | Yes | false | | lockOverallDifficulty | Prevents scaling of overall difficulty from difficulty adjusting mods. | boolean | Yes | false | | lockCircleSize | Prevents scaling of circle size from difficulty adjusting mods. | boolean | Yes | false |

Example of score calculation

import { ScoreCalculator } from '@kionell/osu-pp-calculator'

const scoreCalculator = new ScoreCalculator();

const result = await scoreCalculator.calculate({
  beatmapId: 1695382,     // Calculate beatmap with ID 1695382
  mods: 'HDDT',           // Calculate beatmap with HDDT mods.
  rulesetId: 1,           // Convert this beatmap to the osu!taiko ruleset.
  accuracy: 85,           // Simulate score with 85% accuracy. Score simulator will try to approximate accuracy even with specified counts. 
  count100: 10,           // Simulate score with 10 goods.
  lifeBar: true,          // Output life bar of the replay (if present).
  approachRate: 5,        // Set initial approach rate of the beatmap to 5.
  overallDifficulty: 6,   // Set initial overall difficulty of the beatmap to 6.
  clockRate: 2.2,         // Set clock rate of the beatmap to 2.2
});

Example of replay calculation

import { ScoreCalculator } from 'osu-pp-calculator'

const scoreCalculator = new ScoreCalculator();

const result = await scoreCalculator.calculate({
  beatmapId: 1695382,     // Calculate beatmap with ID 1695382
  replayURL: "...",       // URL to the replay file (.osr). It will compare beatmap and replay by MD5.
  fix: true,              // Fix chokes on the target score.
});

Stringified score calculation output

{
  "scoreInfo": {
    "totalScore": 0,
    "maxCombo": 672,
    "passed": true,
    "perfect": true,
    "rank": "SH",
    "accuracy": 0.9925595238095238,
    "username": "osu!",
    "beatmapId": 1695382,
    "statistics": {
      "perfect": 0,
      "great": 662,
      "good": 0,
      "ok": 10,
      "meh": 0,
      "largeTickHit": 0,
      "smallTickMiss": 0,
      "smallTickHit": 0,
      "miss": 0,
      "largeBonus": 0,
      "largeTickMiss": 0,
      "smallBonus": 0,
      "ignoreHit": 0,
      "ignoreMiss": 0,
      "none": 0
    },
    "beatmapHashMD5": "a9e199c11e6e980a5b8e7fab577a61ca",
    "beatmap": null,
    "mods": "HDDT",
    "rulesetId": 1,
    "countGeki": 0,
    "count300": 662,
    "countKatu": 0,
    "count100": 10,
    "count50": 0,
    "countMiss": 0,
    "totalHits": 672
  },
  "difficulty": {
    "maxCombo": 672,
    "mods": "HDDT",
    "starRating": 8.790758863373132,
    "staminaDifficulty": 8.040083944297882,
    "rhythmDifficulty": 1.3278814870393163,
    "colourDifficulty": 3.211051542494555,
    "peakDifficulty": 8.498489486433925,
    "greatHitWindow": 14.545454545454545
  },
  "performance": {
    "mods": "HDDT",
    "totalPerformance": 927.6127529824629,
    "difficultyPerformance": 578.7134642344957,
    "accuracyPerformance": 226.66086943645078,
    "effectiveMissCount": 0
  }
}

Documentation

Auto-generated documentation is available here.

Contributing

This project is being developed personally by me on pure enthusiasm. If you want to help with development or fix a problem, then feel free to create a new pull request. For major changes, please open an issue first to discuss what you would like to change.

License

This project is licensed under the MIT License - see the LICENSE for details.