Skip to the text

Part II · Artifacts & accessories

Evolution's choice in build 4.2.6.401

A generator of the artifact's own selects an index from the unshuffled list.

2 min read

In this chapter
  1. 9.1One index from the unshuffled list
  2. 9.2The helper and its engine
  3. 9.3What did not change

Build 4.2.6.401, released on 2026-09-30, changes how the Evolution artifact chooses its results. Each choice draws one index from a generator that only the artifact uses and takes that entry of the candidate list in its original order.

One index from the unshuffled list

Evolution chooses a plant in three places: the evolution of a source plant, the rank-4 spawn in an empty cell, and the rank-3 periodic spawn. Up to build 4.2.4.399, each of them shuffled its whole candidate list with the library's std::random_shuffle, on the engine shared by every such shuffle in the process, and took the first element, while the periodic spawn took its column and row from the game's own generator.

In 4.2.6.401, none of the three shuffles its list. Each passes the length of its candidate list to a new helper, receives one index, and takes that entry of the unshuffled list. The periodic spawn chooses its column and row through the same helper, with counts 9 and 5. The executable no longer contains the artifact's std::random_shuffle instance.11The index helper of build 4.2.6.401All addresses are in the 4.2.6.401 executable. The first five are the calls from the evolution selection, the rank-4 spawn, and the rank-3 periodic type, column and row; the others are the helper, its uniform_int_distribution routine, the mt19937 step routine and the engine constructor. The helper compares its count with 2 and returns 0 below it. The column and row calls pass 9 and 5. The constructor seeds the engine from eight random_device words through seed_seq, and only the helper references the engine directly. In the 4.2.4.399 executable the three selections call random_shuffle and the column and row come from the game generator; the 4.2.6.401 executable has no random_shuffle instance for the artifact. PLANTTYPES.json and ARTIFACT.json are identical in both builds.0x100a22dc40x100a20f840x100a220080x100a21a6c0x100a21a780x100a231480x100a58c280x1002278f80x100a5873c

The helper and its engine

For a list of one entry or none, the helper returns 0 without drawing. For a list of n≥2n \ge 2 entries, it draws a uniform index from 0 to n−1n-1 with libc++'s uniform_int_distribution. Each attempt takes one 32-bit output and masks it to the bits the range needs; a value that is too large is drawn again.

The engine is a std::mt19937 that only this helper uses. It is built the first time the helper runs after a launch with at least two candidates: eight 32-bit words from std::random_device, passed through std::seed_seq, seed its state. Nothing else in the executable reads the engine by a direct reference, and nothing reseeds it.1

What did not change

The candidate lists and their order, the order in which sources are processed, and the placement rules are the same as in 4.2.4.399. The declared data is the same as well: PLANTTYPES.json and ARTIFACT.json are identical to those of 4.2.4.399.

Other list shuffles in the game still use the shared engine. They include the Devolution artifact's previews and the gravestone bags a level shuffles as it loads.

Notes

The evidence behind each claim: the code path, and the native addresses where it was traced.

  1. 1

    The index helper of build 4.2.6.401

    All addresses are in the 4.2.6.401 executable. The first five are the calls from the evolution selection, the rank-4 spawn, and the rank-3 periodic type, column and row; the others are the helper, its uniform_int_distribution routine, the mt19937 step routine and the engine constructor. The helper compares its count with 2 and returns 0 below it. The column and row calls pass 9 and 5. The constructor seeds the engine from eight random_device words through seed_seq, and only the helper references the engine directly. In the 4.2.4.399 executable the three selections call random_shuffle and the column and row come from the game generator; the 4.2.6.401 executable has no random_shuffle instance for the artifact. PLANTTYPES.json and ARTIFACT.json are identical in both builds.

    0x100a22dc40x100a20f840x100a220080x100a21a6c0x100a21a780x100a231480x100a58c280x1002278f80x100a5873c