My recreation of Rizline in Sonolus using Sonolus.py.
Try it now at: https://sonolus-rizline.vercel.app/ ! Currently featuring fully working play and watch mode, plus a simple tutorial.
- Install uv, run
uv syncin the project folder. - To add Rizline levels, copy one of the existing
resources/levels/...folder, modifyitem.jsonwith the new level name (modify the particle and skin too) and changechart.jsonto the corresponding Rizline chart file. - Convert Rizline chart to Sonolus data and generate corresponding skin and particle by running
npx -p pngjs tsx convert/generate_resources.ts, pngjs is used to generate skin textures. - Ensure your venv is activated.
- Run
sonolus-py dev.
Random facts on how I made the engine.
This is the first Sonolus engine requiring per level skin and particle, as Rizline have different colours (background, lines, notes…) in each level and Sonolus doesn't support drawing sprites with arbitrary colours. At first I was considering drawing custom colours by layering transparent red, green, blue sprites to only have one global skin, but the colours would have been inaccurate and it would have a had a non negligible performance impact. Currently each colour has its own sprite, making rendering simple (well, Rizline gradients aren't that simple) and efficient.
Rizline lines 19 easing types are stored as integer in the chart files, figuring out what they correspond to wasn't straightforward and required lots of trials and errors.
I ended up injecting custom code in the game that calls Rizline's internal getEaseWithProgress function and logs the results so that I could plot and compare them to the common easing types, it took a while.
Now that info is freely given in the chart editor. 😔
I've always used judgement windows/hit timings from rizwiki.cn, turns out they were apparently inaccurate and way too strict, they updated the page when the PC version released. 😅
I first started recreating Rizline using sonolus.js (you can check that code in its branch, however back then I didn't really know how Rizline worked and sonolus.js had significant issues such as extremely long compiling time, impacting development. Since the engine wasn't really working and I didn't like how I made some stuff, I decided to start again in sonolus.py which is overall much better and made development significantly easier!
Some sprites have variation for normal and challenge time/riztime, each challenge time can have different colour, the engine and skin support up to 8 colours.
For exemple, Background Theme 0 has the non-challenge time colour, Background Theme 1 has the colour of first challenge time…
| Name |
|---|
Background Theme [0-7] |
Background Circle Theme [0-7] |
Fade Out Theme [0-7] |
Drag Note |
Hold Note |
Tap Note Theme [0-7] |
Hold Head Theme [0-7] |
Hold Head Decorator Theme [0-7] |
Hold Connector Theme [0-7] |
Hold Connector Fade Out Theme [0-7] |
Miss Effect Overlay |
Miss Effect Cross |
Line Color [0-61] |
Judge Ring Color [0-31] |
Judge Ring Background Theme [0-7] |
Unlike with Skin we can change the colours by only modifying the data.
| Name |
|---|
Hit Theme [0-7] |
Hit Extension Theme [0-7] |
Bad |
Default Sonolus effect names are used, however only #PERFECT (for Tap and Hold Start notes) and #GREAT (for Drag notes) are used.
- Rizwiki.cn, for detailed gameplay mechanics descriptions.
- Rhythm Game Wiki: Rizline, useful informations about Rizline files.
- Rizlib, Rust library to interact with the game files.
- Sonolus Website
- This repository is based on Sonolus.py Template
