Gacha Odds

Gacha Odds

November 26, 2024

Sometimes it’s hard to remember that Limbus Company is a gacha game, given the ease of crating Identities and E.G.Os via mining in the Mirror Dungeon. However, there are specific events, where the units only come from extracting. (In this article, we will refer to extraction as pulling, which is a more standard gacha nomenclature). Recently, we also have our first collaboration announced, thus we should work out how many pulls we need to save.

Types of Limited Banners

We will focus on acquiring Identities, E.G.Os and Announcers. We will also calculate the expected pull numbers for people who do not care for announcers.

Historically, the only limited banners are the Walpurgis Night (Walpurgisnacht) banners. In this banners, we would have to wait until the next Walpurgis Night to dispense (or extract) the various identities. This could be anywhere from a 3 month to 6 month wait, as the timing of Walpurgis Night is very unpredictable (fact imitating fiction, afterall).

Recently, we have our first collab banner announced. We will also speculate a bit on what is available in the Gacha, and how many pulls one would require to acquire all the limited goodies. First, we will look at what is up for grabs.

Banner 00 IDs 000 IDs E.G.Os Announcers Release Date
1st Walpurgis Night 1 1 1 0 26 October 2023
2nd Walpurgis Night 1 1 0 2 11 January 2024
3rd Walpurgis Night 0 1 2 2* 2 May 2024
4th Walpurgis Night 0 2 1 2 5 Sep 2024
Arknights Collab 0 0 4** 1** Sep - Oct 2025

(*) Angela Announcer was also available, but was not on rate-up and actually given out for free during 1st Anniversary

(**) Likely 1 or more E.G.O or Announcer will be give out as welfare, but this is merely speculation

From the announcement recently that 00 Identities will be fewer, it is not unreasonable to expect the upcoming Walpurgis Night to feature 2 000 Identities and 1 E.G.O or 1 000 Identity and 2 E.G.O, as well as 2 announcers. This is likely the worst case scenario and thus we will focus on this numbers to better plan the number of pulls we need.

Rates

Source: https://steamcommunity.com/games/1973530/announcements/detail/3880478611786270077

To simplify the calculation, we will use the assumption that none of the limited Identities will be 00s. Thus, we can ignore the different rate for ten-pulls as oppose to single pulls. (Fun fact: it has been previously confirmed via email from Project Moon that using 10 single tickets in the 10 pull is merely for convenience and do not guarantee a 00.)

The rates are as such

Type Rates
000 Identity 2.9%
E.G.O 1.3%
Announcers 1.3%

Note that the featured Identities/E.G.Os/Announcers will occupy 50% of that rate. (Thus, assuming only 1 featured 000 Identity, its rate will be 2.9%/2 = 1.45%.) Moreover E.G.Os cannot dupe. On the event of 2 E.G.Os, we believe that after you pull one of the featured E.G.Os, the other one will occupy (at least) 1.3%/2 = 0.65% of each pull.

Since E.G.Os cannot dupe, we will have to split the calculation between newer players and endgame players, with the latter having the additional option of dispensing all the available E.G.Os before pulling, thus guarantee-ing a 100% of the E.G.Os acquired will be the featured ones. If there are no more E.G.Os in the pool, then the 000 Identity rate will increase to 3%.

Finally, we have the ideality exchange, which is that we can also swap 200 ideality (acquired 1 per pull) for one copy of anything that is featured. As an additional note, you should use the ideality exchange as late as possible. Doing so early to remove an E.G.O from the pool is not worth it, and doing so on an Identity or Announcer risks us duplicating it in a later pull.

Due to the assumption that 00 Identities are unimportant, it is strictly optimal to always single pull, as the ten-pull only guarantees the 00 Identites, and thus is just additional thread and E.G.O shards. (Both of which can be obtained via paid Battle Pass Mirror Dungeon runs for a higher lunacy efficiency). In practice, you would likely be ten-pulling until you are missing 1 to 2 featured items, and single pulling the rest of the way.

In this article, we would only be discussing pulls. A single pull is 130 lunacy (or once a day, 13 paid lunacy) and a ten-pull is 1300 lunacy.

ℹ️
We get the numbers by simulating 2 million players, and seeing the distribution of the outcomes. You can see that in some of the cases, the 100% is not just using the ideality pity on everything. This is as the very unlikely cases don’t show up enough.

Non-limited Feature Banners

It is not really advisable to pull on non-limited feature banners, but we include the data for completion and to understand how to use the table.

Type 25% 50% 75% 90% 99% 99.99% 100% Mean Variance
1 000: New Player 20 48 95 158 200 200 200 65 3189
1 000: Endgame 20 46 92 153 200 200 200 63 3078
2 000s: New Player 96 170 200 200 316 400 400 150 4315
2 000s: Endgame 93 164 200 200 306 400 400 147 4293
1 000, 1 E.G.O: New Player 74 135 200 200 217 400 400 131 4128
1 000, 1 E.G.O: Endgame 51 89 145 200 200 328 400 100 3504
1 E.G.O, 1 Announcer: New Player 107 189 200 200 353 400 400 158 4429
1 E.G.O, 1 Announcer: Endgame 78 140 200 200 234 400 400 134 4125
1 E.G.O, 2 Announcers: New Player 200 200 273 400 400 600 600 235 6934
1 E.G.O, 2 Announcers: Endgame 200 200 229 360 400 469 600 219 6174

How to read the table?

Let’s say we are pulling on the upcoming Seasonal banner with 1 000 Identity. Then, we can read under the 50% column to see that 50% of the (new) players who pull on the banner will get her within 48 pulls, while 90% of the endgame players will get her within 153 pulls.

Walpurgis Night

Now, let us get to the limited banners. As previously discussed, we believe that there will be 2 announcers, with 2 E.G.Os and 1 000 Identity or 1 E.G.O and 2 000 Identities. For those players who are not chasing the announcers, use the rows that don’t mention announcers.

Type 25% 50% 75% 90% 99% 99.99% 100% Mean Variance
2 000s, 1 E.G.O: New Player 143 200 200 232 400 434 600 180 4031
2 000s, 1 E.G.O: Endgame 114 183 200 200 326 400 508 160 3658
2 000s, 1 E.G.O, 2 Announcers: New Player 200 229 330 400 437 600 800 263 7253
2 000s, 1 E.G.O, 2 Announcers: Endgame 200 204 300 400 400 600 666 249 6706
1 000, 2 E.G.Os: New Player 160 200 222 355 400 434 600 206 7485
1 000, 2 E.G.Os: Endgame 93 146 200 200 355 400 600 145 4419
1 000, 2 E.G.Os, 2 Announcers: New Player 200 258 380 400 562 706 800 283 9264
1 000, 2 E.G.Os, 2 Announcers: Endgame 200 200 273 387 400 600 718 236 6123

We can see that it is approximately a 20 pull saving per E.G.O on rate-up. It is very worthwhile to dispense all the non-limited E.G.Os before extracting. Moreover, for an average player, it takes around 250 pulls to completely acquire all the limited items.

Arknights Collab

Lastly, we do know there are 4 E.G.Os and 1 Announcer in this collaboration. Here are some of various possibilities.

Type 25% 50% 75% 90% 99% 99.99% 100% Mean Variance
2 E.G.Os: New Player 149 200 213 354 400 400 400 200 8219
2 E.G.Os: Endgame 74 129 200 200 353 400 400 133 5115
2 E.G.Os, 1 Announcer: New Player 191 200 255 382 400 600 600 222 7474
2 E.G.Os, 1 Announcer: Endgame 120 190 200 216 379 461 600 167 4220
3 E.G.Os: New Player 200 258 400 400 600 600 600 286 12807
3 E.G.Os: Endgame 133 200 207 298 400 600 600 188 6733
3 E.G.Os, 1 Announcer: New Player 200 280 400 400 600 698 800 298 12115
3 E.G.Os, 1 Announcer: Endgame 169 200 230 317 400 600 800 208 5865
4 E.G.Os: New Player 266 400 414 597 708 800 800 372 17238
4 E.G.Os: Endgame 196 206 301 400 509 706 800 243 9084
4 E.G.Os, 1 Announcer: New Player 282 400 426 600 713 800 1000 380 16506
4 E.G.Os, 1 Announcer: Endgame 200 223 314 400 517 717 800 255 8437

There is another further possibility, in Arknights, we have that the pity is 120 on collab banners. If Limbus Company decides to follow suit, we would have the following odds.

Type 25% 50% 75% 90% 99% 99.99% 100% Mean Variance
2 E.G.Os: New Player 120 120 213 240 240 240 240 150 3623
2 E.G.Os: Endgame 74 120 120 177 240 240 240 109 2634
2 E.G.Os, 1 Announcer: New Player 120 155 240 240 352 360 360 171 3842
2 E.G.Os, 1 Announcer: Endgame 120 120 149 216 240 360 360 133 2467
3 E.G.Os: New Player 148 240 240 354 360 360 360 217 5723
3 E.G.Os: Endgame 120 129 207 240 353 360 360 155 4013
3 E.G.Os, 1 Announcer: New Player 176 240 255 360 360 480 480 231 5637
3 E.G.Os, 1 Announcer: Endgame 120 155 230 240 360 474 480 171 3908
4 E.G.Os: New Player 240 258 360 360 480 480 480 285 7683
4 E.G.Os: Endgame 133 206 240 298 360 480 480 202 5446
4 E.G.Os, 1 Announcer: New Player 240 280 360 382 480 600 600 294 7453
4 E.G.Os, 1 Announcer: Endgame 152 223 240 316 378 480 600 213 5256

Happy saving!

Appendix

The following code was used to generate the data.

using Statistics

function simulatePulls(IDs, EGOs, Announcers; isNew = true)
    Pulls = 0
    CurrentIDs = CurrentEGOs = CurrentAnnouncers = 0 
    
    function CheckDone(N)
        Left = max(0, IDs - CurrentIDs) + max(0, EGOs - CurrentEGOs) + max(0, Announcers - CurrentAnnouncers)
        Left  N
    end
    
    function NewRateUp(Rate, Featured, Acquired, CurrProb)
        newRate = Rate * 0.5 * (Featured - Acquired)/Featured
        CurrProb < newRate
    end
    
    while !CheckDone(Pulls ÷ 200) # Change 200 to the pity number.
        Pulls += 1
        p = rand()
        if isNew || (EGOs > CurrentEGOs) # E.G.O Left in the pool
            if p < 0.029 # Got an 000
                IDs == CurrentIDs && continue
                CurrentIDs += NewRateUp(0.029, IDs, CurrentIDs, p)
            elseif 0.029  p < 0.029 + 0.013 # Got an E.G.O
                EGOs == CurrentEGOs && continue
                p2 = p - 0.029
                if isNew # If you're new, theres only a 50% chance of featured
                    (p2 < 0.013/2) && (CurrentEGOs += 1)
                else # If not, every E.G.O will be a featured
                    CurrentEGOs += 1
                end
            elseif 0.029 + 0.013  p < 0.029 + 0.013 + 0.013 # Got an announcer
                Announcers == CurrentAnnouncers && continue
                CurrentAnnouncers += NewRateUp(0.013, Announcers, CurrentAnnouncers, p - 0.029 - 0.013)
            end
        else # No E.G.O left in pool
            if p < 0.03 # Got an 000
                IDs == CurrentIDs && continue
                CurrentIDs += NewRateUp(0.03, IDs, CurrentIDs, p)
            elseif 0.03  p < 0.03 + 0.013 # Got an announcer
                Announcers == CurrentAnnouncers && continue
                CurrentAnnouncers += NewRateUp(0.013, Announcers, CurrentAnnouncers, p - 0.03)
            end
        end
    end 
    
    Pulls
end

function outputStats(IDs, EGOs, Announcers, isNew)
    N = 2_000_000
    Data = [simulatePulls(IDs, EGOs, Announcers; isNew = isNew) for _ in 1:N]
    sort!(Data)
    io = IOBuffer()
    print(io, "| $IDs 000$(IDs == 1 ? "" : "s"), ")
    print(io, "$EGOs E.G.O$(EGOs == 1 ? "" : "s"), ")
    print(io, "$Announcers Announcer$(Announcers == 1 ? "" : "s"): ")
    print(io, "$(isNew ? "**New Player**" : "**Endgame**")| ")
    for percent in [0.25, 0.5, 0.75, 0.90, 0.99, 0.9999, 1]
        print(io, round(Int, Data[floor(Int, end * percent)]), " | ")
    end

    meanData = round(Int, mean(Data))
    varData  = round(Int, var(Data)*(N-1)/N)
    print(io, "$(meanData) | $(varData) |")

    String(take!(io))
end