Recreating Mudae’s Database (and how I optimised disable lists) (2024)

Mudae is a bot within Discord which mainly focuses on games and anime. The biggest feature of Mudae is its waifuroulette game, where users can claim characters from a range of anime, manga, comics or games. To say that Mudae is popular is an understatement, over 2.3 million servers have the bot as of September 2021 and it routinely places strain on Discord’s API services.

When a player claims a character, they become part of the player’s harem and cannot be claimed by anyone else in the server. Naturally, this leads to some stiff competition for the more popular characters. The gacha game also comes with its own currency system, where players can earn virtual currency to use for power ups or trading. There exists dozens of other commands which cover leaderboards, lookups and customisation.

When a user looks up a specific character, they can find several fields of information about the character, including the series, gender, roulette, kakera value, claim rank, likes rank and possible aliases. This is true for every character, but there is no easy way to search up every character or every series. Mudae’s database is not public, so there is no way to get all of the information available. Or is there?

Recreating Mudae’s Database (and how I optimised disable lists) (2)

That’s where I come in. Long story short, I attempted to recreate Mudae’s database. I have information on characters, series, bundles and the relationships between them. Back in 2020, I initially started this with the top 1000 characters using $top and then storing the results. I made gradual improvements and methods over the past year, so now I have information on almost every facet of Mudae’s database.

The database consists of several tables. The character table contains the information of all 80,789 characters in the bot. Each character comes with its own character ID, along with other fields like their name, series, gender, roll type, claim and like ranks, and their kakera value.

Recreating Mudae’s Database (and how I optimised disable lists) (3)

The list of series is covered in a separate table. Each series also comes with its own ID, and covers their character counts in all roulettes. There are over 13,000 series in this table. There is also a separate table for bundles, also with their own IDs. All the counts for each roulette are also shown as well. A separate table covers the connections between bundles and series in a many-to-many relationship. Over 50,000 records exist in this table.

Recreating Mudae’s Database (and how I optimised disable lists) (4)
Recreating Mudae’s Database (and how I optimised disable lists) (5)
Recreating Mudae’s Database (and how I optimised disable lists) (6)

I’ve implemented some extra features in this database, one of which is server tracking. It’s possible to track the status of every character in a particular server, such as their claim status, whether they belong to you and how many keys (or soulkeys) they have. I can also track all of my current soulmates in the same table. This makes it possible to track unclaimed and unsouled characters, and keep track of all characters across any server I’d like.

Recreating Mudae’s Database (and how I optimised disable lists) (7)

Another feature is the search function. You can search for any character and have their information displayed instantly as well as display any close matches. You can also search for series and bundles, which will contain the information of every character in the series or bundle. I can also search for multiple series and characters at once, allowing for fast viewing and editing.

Recreating Mudae’s Database (and how I optimised disable lists) (8)
Recreating Mudae’s Database (and how I optimised disable lists) (9)

But the most powerful use of this database is for disable lists. By using all three tables and some queries, I’m able to disable any bundle and series that I want, and display the updated roulette numbers of all series and bundles without the disabled series. This makes it possible to disable lists to be optimised.

Now this table shows all bundles and how much $wa’s are in them. Let’s say I want to disable the Western and IRL bundles. After inputting them in the exclusion list, all Western and IRL series have been disabled, and the $wa’s have been updated for all the bundles. This enables me to select the best bundles while accounting for overlap, and as a result of this process I ended up making better disable lists than anyone else. For a while I wondered whether this process could be automated so I could find the optimal disable list.

Recreating Mudae’s Database (and how I optimised disable lists) (10)

Earlier this year I came across a GitHub repository by Stephen Huan, where he dives into the statistical models behind Mudae. It’s a fantastic write-up if you’re not daunted by the maths behind it, but my focus was on his section about producing optimal disable lists.

The disable list problem is analogous to the 0/1 knapsack problem encountered in optimisation. By reducing the disable list problem into a integer linear programming (ILP) one, Huan was able to utilise ILP solvers that could solve the corresponding knapsack problem and therefore produce an optimised disable list. He also provided his own Python code to demonstrate this concept with a version of Mudae’s database (albeit a very old version).

Recreating Mudae’s Database (and how I optimised disable lists) (11)

So all I had to do was to repurpose the code so that it could work for my own database. It took a while to accomplish; I had to both change my database into a form that the code could recognise and change the code itself to also compensate for the new data and constraints.

The results were startling. Now I’m able to create optimal disable lists for any roulette, with any overlap size and any amount of slots. What used to take hours to learn and craft disable lists now only takes a few minutes. It only works as long as my database remains updated, however. So new updates and bundles could shake things up.

In the below example I made the program output an optimal 25k disable list for $wa, with 50 slots and with Western and IRL completely disabled via toggles.

Recreating Mudae’s Database (and how I optimised disable lists) (12)
Recreating Mudae’s Database (and how I optimised disable lists) (13)

Firstly, this database (along with the Python program) will NOT be made public. The bot developer Saya has allowed this project to stay up as long as it’s for a personal purpose. This article is just a demo to show that this database exists. A big thanks to Saya for advising me and for the continued development of the bot.

The data used in the database does not automatically update, it must be manually updated by me every time. I usually do this once a month because it’s a tedious process that can last over a day.

There may be some instances where I cannot show all of my findings due to the potential of sharing information that Saya doesn’t want to be public. Exceptions can be made on a case-by-case basis, however sharing general statistics and calculations are allowed.

Are there any features I could add to this database? Are there any stats or information that you’d like to see? You can reach me in Discord in the MudaScience server. Any interesting updates may be covered in a follow-up post, or in the MudaScience server. You can also support Mudae by subscribing to their premium service via Patreon.

Recreating Mudae’s Database (and how I optimised disable lists) (2024)

References

Top Articles
Latest Posts
Article information

Author: Pres. Lawanda Wiegand

Last Updated:

Views: 5487

Rating: 4 / 5 (51 voted)

Reviews: 82% of readers found this page helpful

Author information

Name: Pres. Lawanda Wiegand

Birthday: 1993-01-10

Address: Suite 391 6963 Ullrich Shore, Bellefort, WI 01350-7893

Phone: +6806610432415

Job: Dynamic Manufacturing Assistant

Hobby: amateur radio, Taekwondo, Wood carving, Parkour, Skateboarding, Running, Rafting

Introduction: My name is Pres. Lawanda Wiegand, I am a inquisitive, helpful, glamorous, cheerful, open, clever, innocent person who loves writing and wants to share my knowledge and understanding with you.