Skip to content

Instantly share code, notes, and snippets.

@DarkStoorM
Last active November 28, 2024 16:24
Show Gist options
  • Save DarkStoorM/060db882956e249bb029a71e471f73c4 to your computer and use it in GitHub Desktop.
Save DarkStoorM/060db882956e249bb029a71e471f73c4 to your computer and use it in GitHub Desktop.
osu!taiko mod for osu!(lazer)

Full Random - osu!taiko mod for lazer

Table of Contents:

If you came here from the outside of the mod file, it is on this branch: https://github.com/DarkStoorM/osu/tree/mod/taiko-full-random

To skip the yapping, click here for the Features.

Caution

This mod might not work on beatmaps with stupid Effect Control Point spam, misplaced Kiai-Off, off-beat Timing Control Points or BPM changes in general, so some features may be broken, like turning Kiai into streams or 1/6 with Timing Control Points ¯\_(ツ)_/¯ who cares


Introduction

Improvement is the top priority goal, and true, osu! provides tens of thousands of beatmaps to practice, however, with improvement comes a rapid shrinking of the pool of available beatmaps as most of them are below your preferred difficulty level. Besides the Ranked and Loved beatmaps, there is quite a big chunk of Unsubmitted, Graveyarded and Unrankable maps, but just can not be playing the same maps over and over again. While people keep uploading new beatmaps on a daily basis or extending their offline collections, you do not always find the beatmaps to your liking.

The game can become really stale if you just keep playing very similar beatmaps in structure, rhythm, and difficulty. A partial solution was implemented in 2020, Taiko Random.

This mod randomizes the color of all hit objects, retaining the overall structure, and in almost all cases, increasing the perceived difficulty of the beatmap (calculation will be inaccurate). This is a good solution to play something "new" on a beatmap flow you are already familiar with, but we can do better than that.


Rationale

The Random Mod was fine, but it was not really enough for me. My first Random Beatmap Generator written 11 years ago was a big step forward, because I did not have to look for beatmaps to play anymore. I needed a solution for unique beatmaps and all I needed was an already existing beatmap that I could regenerate. This was a massive help, because I could generate "infinitely" many beatmaps from a single .osz - that was the goal.

The whole reason for creating a beatmap generator is that I could customize it to my liking, which was not an option in already existing generators. Some people had stuff like Don-to-Kat ratio and that was it. I needed to practice my weak points, which at the time was 1/6 timing, but that came a bit later. I had very specific requirements from a beatmap generator, so I had to do this myself.

11 years later, just out of the blue, I checked how the Random Mod was implemented. I had never checked the osu! codebase and how things work, so I did not even know if manipulating the beatmap's hit objects was possible. It turned out that you can do that, even delete everything and create a new beatmap, so, I just decided to create a brand new mod for osu!taiko, Full Random. Unlike the traditional .osu file parsing, osu! codebase makes this extremely simple, so there is no stupid file reading, parsing, writing.

In general, I also wanted to be able to generate beatmaps from songs that either were never submitted/do not exist on osu!, so creating a whole new .osz only required the proper timing and placing two notes - at the beginning and the end to define the playable bounds.


Beatmap Generator Specifics

Generating a completely new beatmap is pretty straightforward, but there are couple things to remember:

  • Pattern length has to be odd - this is mostly true for simple beatmap with no rhythm changes. There are exceptions, though:

    • Assuming 1/4 time scale, two-notes pattern can exist on the beatmap, but it has to be followed by another even-length pattern + spacing with the same beat length, e.g. 🔵🔵⚫🔴🔴🔴🔴. The reason for this is that 6 notes with a spacing in-between technically create a 7-notes pattern, where the empty space is interpreted as a note. There can be an even number of notes in a pattern and the spacing at the end, but it will be unnatural to suddenly have a different beat length (1/4 beat + 1/2 beat as pattern separation). The same applies to 2+2
    • In 1/6 time scale it is a different story, because in reality, you insert two notes in-between another two notes of 1/2 time scale and conveniently enough, the third 1/6 lands on 1/2 and we can repeat this cycle, completely ignoring this rule, because we chain overlapped 1/6s

    i

  • Regular patterns require an odd number length, because if we do not follow the even + 1/4 spacing + even rule, we will make the map absolutely unplayable, destroying the rhythm. In short, patterns start and end on blue ticks, which is off-beat. Patterns should always start or end on white/red ticks.

  • Simple generator rules:

    • Should roll a random length of 1/3/5/7/9 - this defines a pattern, even if we roll 1
    • Iterate over pattern length and roll a random color
      • If still in pattern (index - length - 1), advance in time by 1/4 beat length
    • After the pattern generation, advance in time by 1/2 beat length

Full Random Specification

Reasoning for implementing all the features:

  • The generator is now a Lazer mod
    • Reasoning:
      • Standalone application/website just for this is not really necessary (and a waste of time/resources), because I do not really care about preserving the generated beatmaps
      • Writing .osu reader/parser/writer is already supplied by osu!(lazer) codebase and you have direct access to other game features (Difficulty and Performance Calculators, not accurate with random, though)
      • I can immediately play a "converted" beatmap
  • Pattern Length generation is limited to 1-11 Hits
    • Reasoning:
      • The first version had no limit on user input. This made no sense as providing length of something like 49 can potentially turn the beatmap into mini-stream beatmap with occasional short pattern. This is only good for carefully structured stream maps
      • The length in the range of 1/3/5/7/9/11/unlimited has "the best" chance of creating a somewhat more playable beatmap with reasonable rhythmical structure. 11 is kind of pushing it and unlimited is an option for Full Stream, just 1/4, no breaks (just for fun)
  • Seeding
    • Reasoning:
      • Just for the sake of completeness and if I ever stumble upon a set of seeds that created a really nice map. The seeds are stored in the result score, so all the values can be reused by the "Use these mods" option upon right-clicking the score. This applies to all the seeds: color, pattern length, 1/6 insertion chance. Despite me not caring about preserving the beatmaps, there might be some 0.0001% to get something nice
      • This is effectively an artificial BPM change, allowing to use Double Time on top of it (80BPM -> 160BPM -> 240BPM`)
  • Maximum Count Of Consecutive Monocolours
    • Reasoning:
      • This was a problem in the first version, where the beatmap could potentially generate a long stream of the same color, which in most cases was either just bland or unplayable (for some people)
      • This is a DDKK/KKDD-friendly option that prevents "deathstreams", making speed maps way more enjoyable to play, although, I still wanted to have mono bursts inside 1/6 (when 1/6 is enabled), because bursts are nice and they are always 7 notes at most
      • This option is not limited to a single pattern (within the generated pattern), because this can still create monocolor pattern chains, like ddd ddd ddddd ddd (would be super rare, though). This is just more for convenience
  • Turn KIAI Into Streams (EXPERIMENTAL)
    • Reasoning:
      • This is mostly an experimental feature, which temporarily ignores the Pattern Length and sets it to 1 until the KIAI is over
      • Introduces some extra variety to the beatmap and works perfectly with correctly placed Effect timing Points
    • Problems:
      • This may not really work if the beatmap is just a huge spam of Effect Control Points (the greens for SV/KIAI) or if the KIAI ends prematurely off-beat, because people like placing unsnapped Effect Control Points in places you just can not predict 🤔
  • Generating at double BPM
    • Reasoning:
      • This is just a personal preference, because some nice songs were mapped to lower BPM, like 80-120, so this option allows to generate a more suitable beatmaps of 180-240 BPM range
    • Problems:
      • This option alone might require Constant Speed and Difficulty Adjustment mods to be enabled and adjusted, because most of the lower BPM songs have Effect Control Points for multiple SV changes and can be at a slow scroll in general
  • 1/6 Insertion
    • Reasoning:
      • This is also a personal preference, because I just fell in love with 1/4+1/6, which was very hard for me a long time ago, so it became an integral part of my generators
      • More Rhythm and Timing practice value
      • Lower BPM songs are more challenging
    • Problems:
      • On higher BPM beatmaps and even with lower chance, the patterns can appear in unexpected spots, unlike the lower BPM beatmaps, where you typically use high insertion chance, so they are more predictable
      • This option might disrupt the expected flow of the beatmap, so it will become almost unplayable to the players who are not familiar with beatmap generators - the meaning of this is that most of the patterns will contain rhythm changes outside of the actual song rhythm, making the overall structure even more confusing
  • 1/6 Insertion Chance
    • Reasoning:
      • In the past I used a static value, but it just made more sense for me to have this customizable
      • Once the BPM increases, the higher 1/6 chance can make faster beatmaps unplayable, slower beatmaps will become too boring
  • 1/6 Insertion Seeding
    • Reasoning:
      • This was not really necessary, but I decided to add an option to control when 1/6 are inserted. With seeded 1/6 generator, there will always be the same amount ot Hits between the 1/6 triplets. This is especially useful on Unlimited pattern beatmaps, because the 1/6 triplets will just always be inserted at the same spot
  • 1/6 Colour Seed
    • Reasoning:
      • The same reason as for the 1/6 Insertion Seed, but for the color. Custom seed ensures that the same sequence of triplets will be generated whenever a 1/6 is rolled. This is just an extra option to control the color of the triplets to help with grinding the muscle memory
  • Invert Starting Rhythm Change Colour and Invert Colour After Rhythm Change
    • Reasoning:
      • Another personal preference. But I added these options as customizable Controls. I would normally just invert the colors, but since I am sharing this, I just added the toggles for them, but they are always enabled by default.
      • It was more natural to me that a rhythm change starts with a different color, which was most likely not a correct thinking, but it just felt right to me. Small note: it is actually the first Hit in a 4-notes 1/6 pattern that gets inverted, not to confuse this with the first Hit in the inserted triplet (I treat the entire 4-notes pattern as 1/6).
      • The color inversion after the rhythm change actually occurs after the triplet, so the next generated Hit in a 1/4 pattern will be inverted. Also note: 1/6 will never be chained, they will always be separated by at least one Hit, because I feel like it is more rhythmically correct - the separation just feels right, chained 1/6s are still correct e.g. 🔵🔴🔴🔵⚫⚫🔴⚫⚫🔵🔴🔴🔵 (the don in the middle is on 1/4, separated by 1/4)
      • Changing the 1/4 Hit after the triplet in my opinion was a better choice rather than inverting the last Hit in the triplet (seek forward and check the color, then invert if necessary)
  • Longer 1/6
    • Reasoning:
      • No real reasoning here except for the extra difficulty and I still find it somewhat fitting

Features

This is basically the same as Specification, but it is just the explanation of what the Controls do, because the hover tooltips are too big in-game. Note: the code follows British English spelling as I just took out the mini-specs from the tooltips.

Some decisions on how this mod works in some options may be questionable to you (mostly the colour inversion), because they are just my personal preferences. Nonetheless, I am clarifying this, because this mod is shared publicly, otherwise, I would not even care.

  • Longest Pattern Length

    • Maximum hit object count per pattern (excluding inserted 1/6 patterns).
    • This value will always be adjusted up to an odd number later to keep the rhythm
    • There is an extra Unlimited option, which just creates a 1/4 stream with no extra spacing, perfect for stream practice or stamina grinding
    • Most optimal pattern length for playable maps is 7 (sometimes 9)
  • Colour Seed

    • Custom seed for object colour
    • Setting this to any number will freeze the colour generation, so the colour sequence will stay the same every time. This is useful for shuffling the Pattern Lengths, keeping the same colours. Notice the colour sequence (Pattern Length is random): image
  • Pattern Length Seed

    • Custom seed the Pattern Length generation
    • Setting this to any number will freeze the Pattern Length generation, so the pattern length sequence will stay the same every time. This is useful for just shuffling the colours. Notice the pattern length sequence (Colour is random): image
  • Maximum Count Of Consecutive Monocolours

    • Allows to set the maximum count of consecutive monocolours
    • This also counts hit objects outside the current pattern to avoid monocolour chains
    • Monocolour counter is interrupted by 1/6 triplets, if inserted
    • Does not apply to 1/6, mono bursts are still allowed
  • Turn KIAI Into Streams (EXPERIMENTAL)

    • Every Effect Control Point that enables KIAI will temporarily ignore the Pattern Length and set it to 1 until the KIAI is over
  • Generate At Double BPM

    • Use if the Timing Control Points were set to twice as low BPM as you would expect.
    • Example: BPM = 90 is then treated as if it was set to 180
    • Use only if there is just one Timing Control Point of such low BPM!
    • This setting requires Difficulty Adjustment mod (higher scroll speed), because it does not change the actual BPM, just how frequently the hit objects are generated
    • Example beatmap: toby fox - Ruins (sasakure.UK Remix) - BPM = 110, generates at 220 BPM
  • Insert 1/6

    • Appends 3 random hit objects in a 1/6 time scale to the currently generated hit object inside a pattern
    • Uses Insertion Chance
    • Results a 4-notes 1/6 pattern mixed with 1/4

    img

    • Note: added triplets do not count towards the Pattern Length!
  • 1/6 Insertion Chance

    • Chance for the 1/6 triplet to be inserted after the current hit object
    • Ranges from 0 to 0.5. 0.05 by default
    • The playable value quickly drops off to 5% at around 210BPM for regular players
    • Use 0.5 on lower BPM beatmaps (160-190) if you like grinding 1/6
  • 1/6 Insertion Seed

    • Custom seed for 1/6 triplet insertion
    • Setting this to any number will freeze the 1/6 triplet insertion, so the 1/6 triplet sequence will stay the same every time. This is useful for controlling when the 1/6 triplets are inserted. Notice the 1/6 triplet sequence (all other seeds are random), when they are generated:

    img

    • Note to the above:
      • (row 1) Hit -> Hit + 1/6 rolled -> Hit -> Hit + 1/6 rolled
      • (row 2) the same sequence
      • (row 3) the same sequence
  • 1/6 Colour Seed

    • Separate RNG used only for seeding colours inside 1/6 triplets
    • Setting this to any number will freeze the colour generation inside 1/6 triplets, so the colour sequence will stay the same every time. Notice the colour sequence inside 1/6 triplets (all other seeds are random):

    img

  • Invert Starting Rhythm Change Colour

    • Forces 1/6 patterns to start with an opposite colour to the previous note
    • Disabling this can create some uncomfortable patterns if you are not used to 1/6 (kinda debatable)

    img

  • Invert Colour After Rhythm Change

    • After the 1/6 triplets, the colour of the next hit object will be inverted

    img

  • Longer 1/6

    • The same as Insert 1/6, but the 1/6 pattern is 6 notes long (+ main hit object)
    • The insertion chance of this pattern is always half of Insertion Chance

    img


Will This Ever Be PR'd?

Big question, but the answer is: 100% no. Some reasons why:

  • This mod, very me-specific
    • I added some controls that tweaked to my liking
    • This is just my practice program
    • I made this only for myself, but sharing this anyway, because why not
  • No one asked for this
  • This mod would require lots of changes that in result would make it unusable to me
    • The tweaks are very specific and changing the controls or how the patterns are generated would go against my design, even if the result beatmap makes no sense to the player
  • This mod is not playable to everyone
    • Even if you can technically use it on lower BPMs, to the most of lower skill level players the patterns will be just confusing and too uncomfortable to play
    • You most likely will not find it fun to play
  • The code will not pass any quality checks
  • This mod does not work with all beatmaps
  • There are too many Controls to look at, creating confusion - which options to use, how, in which combination, etc.
  • There are no unit tests
  • I do not plan on maintaining this (not accepting changes)
  • I am too lazy to fix stuff that is unoptimized and probably wrong

If you think this could be a part of osu!(lazer), be my guest, PR this, but I will not take any responsibility for time wasted by the code reviewers.


Things To Fix

Stuff that I will not fix, because I do not care (besides bad code), just pointing things out:

  • Multiple Timing Control Points can mess up with the pattern generation - in most cases it is fine, but it will end up generating broken patterns before those points
  • Kiai sometimes starts one beat later - it is not that bad, though
  • The workaround to stop generating 1/6 before the Kiai starts/stops could be changed to calculate a "safe" pattern length, but meh
  • Last hit object is omitted - most likely because it is a Swell or a Drumroll, so I guess we can ignore this one 👀
  • I do not know how to remove breaks and beatmap.Breaks.Clear() seems to do nothing
  • I probably forgot to document or explain something, so there might be missing documentation 🤔

Also, beatmaps with Timing Control Points that set the bpm 10 times higher (or 9999) for blinding Kiai and ninja notes are stupid.


Some thoughts

  • What is the point of seeding if the patterns are the same between the beatmaps?

Using a custom seed in any field will make the mod generate the same patterns every time from that section, on every beatmap and using a custom seed in all fields will generate basically the same beatmap no matter what you play. My point is that it might feel different with different songs/BPM (and Kiai, if you use the conversion). You would not really freeze all seeds anyway, the point is to randomize everything and sightread.


  • How do I even use this mod? There are too many controls!

I did not really want to separate the two main options, which is basic patterning and 1/6, because I did not really care, but the logic would probably the same, so it will be a bit overwhelming, comparing to other customizable mods.

Anyway, here is a quick breakdown:

  • Remove SV changes - every beatmap is made with some concrete structure in mind, that means that the SV changes are placed in a way that it does not really impact reading (ignoring stupid SV waves). Combine this mod with Constant Speed and Difficulty Adjustment for the best experience
  • Basic randomization: you can just select the mod and play, no need to touch anything. The default settings will generate from 1-7 notes patterns with random colors
  • Basic randomization + Streams: you can enable the Turn KIAI Into Streams option, which will generate streams during the Kiai time
  • Streaming practice: you can select Unlimited pattern length, which will generate a stream with no breaks (just 1/4 until the end of the map)
  • Color change grinding: you can set the Maximum Count Of Consecutive Monocolours to a lower number for way more color variety - I recommend 3 and 4, leaving this empty can create long monos. This is not limited to a single pattern (separated by 1/2), so consecutive monocolors like ddd d ddd are allowed if the number was set to 7. Note: the counter is reset after each 1/6 and does not apply to 1/6s
  • 1/6 practice: you can enable the Insert 1/6 option, which will insert 1/6 triplets with a chance of 0.05 (default). I can not really recommend a good value here, because everyone has his own preferences, but for anything up to 180bpm (or 190) I just 0.5. On higher BPMs, something like 0.05 is always nice for extra variety. Color inversion is on by default with 1/6 just to make it easier to play on higher roll chance values
  • Personal Settings:
    • My most used combination for 1/6: enabled 1/6 + longer 1/6 (sometimes off), 0.5 chance, unlimited pattern length and both color inversions enabled
    • For regular beatmaps: 7 pattern length (sometimes 9), 4 max consecutive monocolours, Kiai streams, Double Time with rate changed to 240BPM minimum
    • Applied to both above: Constant Speed + Difficulty Adjustment mods, adjusted to 8.0 OD with Double Time applied. Scroll speed depends on the BPM.

  • Is this a middle finger to the mappers?

No, I just want to have more stuff to play 🤔


  • Will you be updating the code in case there are any bugs found? Can you make the code more readable?

Nah

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment