Skip to content

[Warlock] Modeling Warlock RNGs#11110

Merged
nyterage merged 1 commit intosimulationcraft:midnightfrom
millanzarreta:wl-model-rng
Mar 6, 2026
Merged

[Warlock] Modeling Warlock RNGs#11110
nyterage merged 1 commit intosimulationcraft:midnightfrom
millanzarreta:wl-model-rng

Conversation

@millanzarreta
Copy link
Contributor

Many Warlock RNG events/procs have been tested. Logs and details of the results are provided here in the PR description. All observed in-game behaviors (including bugs) are implemented in SimC to make it behave as similarly to the game as possible.

Agony Soul Shard Energize

Agony shard regeneration for Affliction has been tested in both single-target and multi-target scenarios, and with Creeping Death setting to rank1, rank2, and disabled. A total of over 83 hours of logs were collected, with over 55000+ soul shard energize procs (out of over 650k+ agony ticks). It has been confirmed that the formula used for Agony energizes remains the same, a Dithered/Random-Walk Accumulator Mod 1 with the same kind of scaling per target: active_agonies ^ ( -2.0 / 3.0 ). This large sample size allowed for a more precise adjustment of the initial inc_max value, from the previous 0.368 to 0.370.

A bug has been found in the normalization of shards generated when using Creeping Death (CD). It works correctly without the CD talent selected, and also works correctly with CD rank 1 (-0.1). However, for CD rank 2, either half the normalization is being applied, or the rank 1 normalization is being applied instead (-0.1 instead of -0.2). This behavior has been implemented in SimC. This bug may be fixed in the future, so it should be checked periodically.

Logs:

Nightfall

Periodic ticks of Corruption/Wither can trigger Nightfall, although the percentage and rng model are not specified. Other ways to trigger Nightfall exist: with a 100% chance using Haunt with the Sataiel's Volition hero talent, or with critical ticks from certain DoTs using the Ravenous Afflictions talent, which follows an RPPM model specified in the spell data. Ravenous Afflictions was quickly tested and appears to work as expected. Extensive tests (56h+) were then conducted to check the main Nightfall RNG with Corruption/Wither ticks in both single-target and multi-target scenarios. After analyzing numerous tests, it was confirmed that this proc follows the same Dithered/Random-Walk Accumulator Mod 1 model as Agony (this was already known and implemented in SimC). It has been verified that it also follows the same scaling with targets as Agony (active_corruptions ^ ( -2.0 / 3.0 )). The initial inc_max value for this proc was set to 0.130 in SimC, and after testing, this value has been validated as correct and accurate.

As published by Blizzard, the Creeping Death (CD) and Sataiel's Volition (SV) talents should normalize the proc so that the number of procs is the same as without these talents. This has been tested by trying all possible combinations of these talents and their ranks. The SV talent is always normalizing correctly, and CD rank 1 also always normalizes correctly. However, for CD rank 2, either half the normalization is being applied, or the rank 1 normalization is being applied instead (-0.1 instead of -0.2). This same issue was also occurring with Agony. This behavior has been implemented in SimC. This bug may be fixed in the future, so it should be checked periodically.

Additionally, we've found a bug that only occurs in a specific situation. In ST (only 1 target), if Nightfall is consumed using Seed of Corruption, there seems to be an issue with the accumulator, causing the next proc to occur sooner than normal, resulting in approximately ~71.5% more procs than usual. The reason for this is unknown, but it's likely a bug. In any case, it only happens when fighting vs 1 target, a situation where SoC isn't used, so we won't be implementing this bug for now, at least not in this PR.

Logs:

Succulent Soul (Affliction)

Succulent Soul had already been tested for Demonology in this PR: #11033 . We have now tested it for Affliction. As expected, just like in Demonology, the samples also appear to correspond to an accumulator from a pseudo-random distribution (PRD), but at a different nominal rate. After more than 83 hours of logging, with a total of 54841 events and 12351 procs, its nominal PRD rate was determined to be 22.5% with good precision (we had previously established it at 22% in TWW, after less intensive testing).

Logs:

Histogram for the distance between procs compared to a simulation using PRD nominal 22.5% rate:
SS1_gap_distribution_observed_vs_PRD_pnom_22p50

ECDF distance between procs
SS1_ECDF_gap_comparison_observed_vs_sims_max30

Hazard per attempt (probability of success on attempt n since the last attempt)
SS1_Hazard_by_attempt_comparison_observed_vs_sims_max20

Tail / survival of the distance between procs (log scale):
SS1_Survival_tail_logscale_comparison_observed_vs_sims_max30

Feast of Souls (Demonology)

Analysis of the Feast of Souls samples for Demonology suggests that it uses an accumulator from a pseudo-random distribution (PRD) with a nominal rate of 10%. This corresponds to a PRD constant C = 0.014745844781072676. It also appears to use a hard cap on the 26th attempt, where it would have a 100% chance. This is difficult to detect with this distribution (the hard cap we see could be statistically driven in our sample), but it closely matches what was observed in the same proc for Affliction.

Logs:

Histogram for the distance between procs:
FS_Demo_V1_proc_gap_histogram_events_solid_range1_30

ECDF distance between procs
FS_Demo_V1_ECDF_gaps_observed_vs_PRD10cap26_vs_Flat10cap26

Hazard per attempt (probability of success on attempt n since the last attempt)
FS_Demo_V1_Hazard_observed_vs_PRD10cap26_vs_Flat10cap26

Tail / survival of the distance between procs (log scale):
FS_Demo_V1_Survival_tail_logscale_observed_vs_PRD10cap26_vs_Flat10cap26

Feast of Souls (Affliction)

The behavior of Feast of Souls for Affliction is strange. It seems to have a very low chance, with a hard cap at the 26th attempt, where the proc then 100% occurs if it hadn't already. Here, that hard cap is very clear, which is why, when we also observe that in the Demonology version of proc (although not as clearly in that case), we can infer that they are probably using the same hard cap in both specs. However, the average chance is different in this case, being much lower in Affliction. With the data collected so far, we obtain the following histogram of distances between procs:
FS_T1_gap_histogram_events_range1_30

Although it would be convenient to obtain more samples for this proc, its distribution is very compatible with PRD nominal rate 4% (hard cap at 26, which gives a final average chance close to ~5%), which would also be the most logical knowing that demonology uses the same RNG model (although with a different nominal rate).

Logs:

ECDF distance between procs
FS_T1_ECDF_gaps_observed_vs_PRD4cap26_vs_Flat4cap26

Hazard per attempt (probability of success on attempt n since the last attempt)
FS_T1_Hazard_observed_vs_PRD4cap26_vs_Flat4cap26

Tail / survival of the distance between procs (log scale):
FS_T1_Survival_tail_log_observed_vs_PRD4cap26_vs_Flat4cap26

Bugs have also been detected for Affliction related to Feast of Souls and Succulent Souls. When Nightfall is consumed with Seed of Corruption (thanks to the Nocturnal Yield talent), if the Quietus hero talent is learned, there is a chance of a Feast of Souls proc. When this proc occurs in this way, the same Seed of Corruption that triggered the proc also consumes one stack of Succulent Souls almost instantly. Furthermore, if the Succulent Souls buff is consumed after this (that is, if it only had one stack when it was consumed in this way), the Succulent Soul consumed in this way does not activate its effects (it deals no damage and has no chance to summon a Manifested Avarice). Multiple other scenarios have been tested, such as consuming the proc with different spenders, testing with varying numbers of stacks, and testing to consume Succulent Souls with Seed of Corruptions normally (without Nightfall proc); and this is the only scenario where this issue has been detected. This behavior has been replicated in SimC.

Mayhem

Mayhem havoc proc has been tested. It is known (and is in the spell data) that it has an ICD of 5.1 seconds. But outside of the ICD, we don't know what type of RNG it follows. After the tests, it has been determined that the RNG when not in ICD is Flat 35%. Furthermore, it has been observed that it can proc with the extra hits from Havoc (although it almost never happens due to the ICD), but cannot proc with the extra hits from FnB. The flat 35% chance and this behavior is already modeled this way in SimC, so there's no need to modify it.

Logs:

This is the histogram for the distance between procs:
hist_MH1_attemptdist_1_25

ECDF distance between procs
compare_ecdf_Mayhem_MH1_vs_flat_prd

Hazard per attempt (probability of success on attempt n since the last attempt)
compare_hazard_Mayhem_MH1_vs_flat_prd

Tail / survival of the distance between procs (log scale):
compare_survival_Mayhem_MH1_vs_flat_prd_log

Fiendish Cruelty

Fiendish Cruelty RNG has been tested. Analysis suggests the samples correspond to an accumulator from a pseudo-random distribution (PRD) with a nominal rate of 10%. That corresponds to a PRD constant C = 0.014745844781072676. It has been proven that Incinerate FnB crits can trigger Fiendish Cruelty, and the same for Havoc extra hits (if they crit). Infernal Bolt crits can also trigger Fiendish Cruelty.

Logs:

This is the histogram for the distance between procs:
hist_sampleFC_interproc_1_30

ECDF distance between procs
compare_ecdf_FC_vs_flat_prd_agony

Hazard per attempt (probability of success on attempt n since the last attempt)
compare_hazard_FC_vs_flat_prd_agony

Tail / survival of the distance between procs (log scale):
compare_survival_FC_vs_flat_prd_agony_log

Chaotic Inferno

Chaotic Inferno RNG has been tested. Analysis suggests the samples correspond to an accumulator from a pseudo-random distribution (PRD) with a nominal rate of 25%. That corresponds to a PRD constant C = 0.084744091852316990.

Logs:

This is the histogram for the distance between procs:
hist_sampleCI_interproc_1_20

ECDF distance between procs
compare_ecdf_CI_vs_flat_prd_agony

Hazard per attempt (probability of success on attempt n since the last attempt)
compare_hazard_CI_vs_flat_prd_agony

Tail / survival of the distance between procs (log scale):
compare_survival_CI_vs_flat_prd_agony_log

Rain of Chaos

The Rain of Chaos RNG had been determined in the past to most likely be a 3-out-of-20 Deck of Cards. We've conducted several tests to confirm this, and it has indeed been verified that this RNG follows a 3-out-of-20 Deck of Cards RNG model. Additionally, we confirm each shard spent (during Infernal) is an individual event (therefore, spells that consume multiple shards, such as RoF, roll several consecutive events). Spells that normally cost shards, if they are free due to a talent/buff and therefore they not consume shards, do not count as an event (only the explicit spending of a shard counts as an event). We can also confirm that the Deck of Cards only advances with shard spends within the Infernal window (those shards spent outside do not count and do not advance the deck). This is already modeled exactly this way in SimC, so no changes are necessary.

Logs:

Dimensional Rift & Avatar of Destruction

Dimensional Rift has been tested, both as a only-talent and in conjunction with Avatar of Destruction. Two different RNG are involved here. The first is the 10% chance of CB and SB to open a Dimensional Rift, as is indicated in the talent description. The second RNG determines the type of portal that will open (or whether an Overfiend will be summoned instead, if Avatar of Destruction is used).

The first RNG, after analysis of the tests, corresponds to a nominal PRD of 10%. This corresponds to a PRD constant C = 0.014745844781072676.

The second RNG is different. The portal summoned by Dimensional Rift is chosen from a 2/2/2 Deck of Cards out of 6 (SHADOWY_TEAR, SHADOWY_TEAR, UNSTABLE_TEAR, UNSTABLE_TEAR, CHAOS_TEAR, CHAOS_TEAR); this is without Avatar of Destruction talent. Here, we're not talking about a typical Deck of Cards RNG with non-proc cards; we're talking about a deck with summon types, and the chosen one determines which pet is summoned. With the Avatar of Destruction talent, this is modified to a 2/2/2/1 Deck of Cards out of 7 (SHADOWY_TEAR, SHADOWY_TEAR, UNSTABLE_TEAR, UNSTABLE_TEAR, CHAOS_TEAR, CHAOS_TEAR, OVERFIEND). This way, if we take blocks of 6 procs (7 with Avatar of Destruction), the same 6/7 procs will always occur (what varies is their order within its block). The average chance of Overfiend with Avatar of Destruction is then 14.2857% (1 out of 7). This RNG has been implemented in SimC so that it works as observed.

Logs:

Alythesss Ire

After extensive testing, we observed that Alythess's Ire procs at a fixed interval of attempts (1 proc every 5 RoF casts, following the 0-0-0-0-1 pattern), matching the 20% average rate indicated in the description. However, there is a small detail: rarely, the cycle shifts and advances the next proc a random offset; testing suggests this happens randomly in roughly ~1% of procs. It has been observed to happen in a very short period after other, and on other occasions it takes a long time to occur, so it seems somewhat random. We model this behavior by giving every proc a 1% flat chance to shift the next proc a random offset (this will always advance the next proc, never delay it, just as it happens in-game).

Logs:

Embers of Nihilam I (Echo of Sargeras)

The proc from Embers of Nihilam (rank 1), which is triggered by Incinerate, has been tested. This proc does not have an ICD (not to be confused with Embers of Nihilam rank 3, which has 0.5s ICD), and it has been verified that both Incinerate and Infernal Bolt can trigger it. Furthermore, it has been verified that both the extra hits from Incinerate FnB and Havoc can also trigger the proc. After analysis, it has been determined that this chance is 10% (which was already set in SimC), but following an accumulator PRD model with a nominal rate of 10%, which corresponds to a C = 0.014745844781072676.

Logs:

This is the histogram for the distance between procs:
ECHO1_observed_gap_histogram_range1_30

ECDF distance between procs
ECHO1_ECDF_gap_comparison_observed_vs_sims_max30

Hazard per attempt (probability of success on attempt n since the last attempt)
ECHO1_Hazard_by_attempt_comparison_observed_vs_sims_max20

Tail / survival of the distance between procs (log scale):
ECHO1_Survival_tail_logscale_comparison_observed_vs_sims_max30

Demonic Knowledge

After extensive testing, we've observed that the 8% (rank 1) and 15% (rank 2) chances stated in the description and spell data are not being met. The average is 12.5% ​​(rank 1) and 22.5% (rank 2). We've discovered that internally, a Deck of Cards with 10 out of 80 cards is being used for rank 1 and a deck of cards with 18 out of 80 cards for rank 2, which explains the observed percentages.

Logs:

There are exactly 18 procs for every 80 HoG casts (for DK r2), and 10 procs for every 80 HoG casts (for DK r1). This holds true for over 60+ blocks of 80 HoG casts for each log. This has allowed us to confirm that the Deck of Cards model is being used. Internally, within each block, the distribution of procs appears completely random (the card shuffling seems uniform), as can be seen in the following heatmap:
DK_R1_1_heatmap_proc_positions_inside_80_cast_blocks

Carnivorous Stalkers

After some testing, it was found that the type of RNG used by this proc is Flat %, and that the observed average chance matches its description and the spell data. This is already correctly implemented in SimC and no changes are needed.

Logs:

This is the histogram for the distance between procs:
FS_Dreadbite_observed_gap_hist_1to30

ECDF distance between procs
FS_Dreadbite_ECDF_gaps_observed_vs_simulations_max30

Hazard per attempt (probability of success on attempt n since the last attempt)
FS_Dreadbite_Hazard_by_attempt_observed_vs_simulations_max30

Tail / survival of the distance between procs (log scale):
FS_Dreadbite_Survival_tail_logscale_observed_vs_simulations_max30

Infernal Rapidity

Although the description and spell data state that the chance of Infernal Rapidity is 10%, our tests yield a consistent average chance of approximately ~4.8%-5.1%, so we assume the actual chance is 5%, half of what is stated. The RNG model for this proc is Flat %.

Logs:

This is the histogram for the distance between procs:
FBLT_observed_gap_hist_1to100

ECDF distance between procs
FBLT_ECDF_gaps_observed_vs_simulations_max100

Hazard per attempt (probability of success on attempt n since the last attempt)
FBLT_Hazard_by_attempt_observed_vs_simulations_max100

Tail / survival of the distance between procs (log scale):
FBLT_Survival_tail_logscale_observed_vs_simulations_max100

Spiteful Reconstitution

Analysis of the Spiteful Reconstitution proc suggests that it uses an accumulator from a pseudo-random distribution (PRD) with a nominal rate of 10%. This corresponds to a PRD constant C = 0.014745844781072676. Furthermore, it appears to have a hard cap on the 21st attempt, which has a 100% chance. We implemented this behavior in SimC, where, in addition to using Flat %, the chance of this proc was set to 30%.

Logs:

This is the histogram for the distance between procs:
SRT1SRT2_observed_gap_hist_1to30

ECDF distance between procs
SRT1SRT2_ECDF_gaps_observed_vs_simulations_max30

Hazard per attempt (probability of success on attempt n since the last attempt)
SRT1SRT2_Hazard_by_attempt_observed_vs_simulations_max30

Demoniac (Wild Imps)

According to the Demoniac description, Wild Imps have a 10% chance each to grant a Demonic Core when they die or go away. We have tested this, and it holds true when they implode. We have also tested imploding them using the Sataiel's Volition hero talent, which should raise the chance to 15%, and this is indeed working correctly in our tests. Furthermore, we have tested that the RNG type used in these cases is Flat %.

However, Wild Imps that vanish normally (either over time or after casting their six bolts) seem to have a much lower chance of granting a Demonic Core. We assume this is a bug, but currently, Wild Imps demised in this way (not imploded) only have about a ~2% chance per imp to provide a Demonic Core (following a Flat % RNG model). Since it's a proc with such a low chance, obtaining more samples would be advisable to achieve more accurate results; but for now we're setting it at 2%, which seems close to what we've observed. As this is one of the main passives of Demonology, we recommend periodically checking if this bug has been fixed.

Logs:

This is the histogram for the distance between procs:
DEMWI1_histogram_distance_between_procs_1_300

ECDF distance between procs
DEMWI1_vs_sims_ECDF_distance_between_procs

Hazard per attempt (probability of success on attempt n since the last attempt)
DEMWI1_vs_sims_HAZARD_per_attempt

Tail / survival of the distance between procs (log scale):
DEMWI1_vs_sims_SURVIVAL_log_distance_between_procs

@nyterage nyterage merged commit 59c57f3 into simulationcraft:midnight Mar 6, 2026
55 of 56 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants