oss!idle sim cache
Plays the oss!idle sim API already made, shared by skillset. Fetch what is known for your character first, then simulate only what nobody asked for yet.
Sim version kept: …
How to use it
Send your skills' play levels as you play right now, fatigue and warm-up included, and your generation. You get every kept play of that skillset, optionally narrowed to some maps, rates or mods.
POST https://cache.oss.idle.rhythmgamers.net/lookup
{
"generation": 1,
"levels": {
"accuracy": 57.3, "speed": 61.8, "stamina": 48.2, "jackspeed": 40,
"coordination": 52.6, "release": 35, "reading": 44.1, "consistency": 50,
"concentration": 47.5, "speedjam": 38, "memory": 30
},
"beatmap_ids": [4519, 9921], // optional
"rates": [1, 1.25], // optional
"mods": [], // optional: exactly these mods
"learned": false // optional: maps memory has learned, or not
}
The answer
Columns once, then a row per kept play, so a whole skillset stays small (gzip when you accept it).
{
"sim_version": "0.4.1",
"levels": { "accuracy": 57, "speed": 61, … },
"columns": ["beatmap_id", "rate", "mods", "learned", "score", "accuracy", "max_combo", "rank",
"pp", "perfect", "passed", "statistics", "unstable_rate", "fail_progress",
"fail_seconds", "xp"],
"rows": [
[4519, 1.25, [], false, 812345, 0.9612, 1204, "A", 143.2, false, true,
{ "divine": 0, "marvelous": 880, … }, 81.3, null, null, { "accuracy": 312.4, … }]
]
}
XP
Each skill's xp is what a play earns at x1. Multiply it by that skill's own XP multiplier (upgrades, overdrive, prestige) and, for physical skills, by your fatigue's XP factor. Mods are already in. A fail or unranked mods earn none.
From an add-on
// what the cache knows, then the sim API for the rest
const res = await fetch('https://cache.oss.idle.rhythmgamers.net/lookup', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ generation, levels, beatmap_ids: maps, rates, learned: false }),
});
const { rows } = await res.json();
const known = new Set(rows.map(r => `${r[0]}@${r[1]}`));
const missing = pairs.filter(({ id, rate }) => !known.has(`${id}@${rate}`));
// … POST /api/v2/simulate for each of `missing`: those plays come here too
How it works
- Every play the official sim workers make for
POST /api/v2/simulateis sent here as well. Nothing else writes to the cache. - Each play is kept under its skillset: the 11 skills' play levels as the character played, fatigue and warm-up applied, rounded to steps of 1 below level 100 and of 0.5 from 100, and its generation. Then by map, rate, mods, and whether memory had learned the map.
- One random play per key: the first one stays. It approximates what the sim would do, it does not replace it.
- XP is kept at x1, the player's own multipliers and fatigue taken out, so any character with these levels can use it.
- A new sim version starts empty. A map whose chart changed is not served until a play of its new version comes in.
What a skillset is
| Part | Kept as |
|---|---|
| Play level of each skill | as you play right now (lifetime + prestige, fatigue and warm-up applied), rounded: steps of 1 below 100, 0.5 from 100 |
| Generation | your generation number (what it unlocks changes plays) |
| Map, rate, mods | the play itself; rates in steps of 0.05 |
| Learned | whether memory has learned the map: never played, or played 68 times or more (sim API plays in between are not kept) |
Upgrades, overdrive and prestige's XP bonus don't change how a play goes, only its XP: they are not part of the skillset, and you apply your own to the xp column.