PulseCore

Chapter 10 · Section 14

The Full Decay

If the player continues the universe instead of diving, it runs to its true end (startDecay(), stepDecay()).

  1. The decay runs on its own clock, a tick every 90 ms, each tick longer than the last by 2^(1/6): the far future passes faster and faster.
  2. First the matter falls in. The bodies of matter fall into the wells, binary wells spiral together and radiate gravitational waves (Part 3.13), and clumps that collapse whole become wells.
  3. The census is read again once the matter is in: the wells stand at their greatest, and every child takes the depth its well now holds.
  4. Then the wells evaporate. Each well loses mass to its glow, m³ falling by 3K·Δτ with K = c⁴ / (15360 π G²) (the Hawking power), and its glow goes home to the Null Vacuum (Horizon Feeding, BPT Part 3.13). A well's last instant is a flash.
  5. Then the field fades over 40 ticks.
  6. The state line reads "Dissipated into nothing", and the run summary opens.
  7. A second countdown starts: the universe's Ascendant Alpha, its first-ranked Ascendant child, begins in 15 seconds; with no Ascendant child, the next child that did not fail. When it reaches zero the child plays (Part 10.13), and the line runs on, universe after universe, until one leaves no child to play: "The line ends here: this universe left no child to play." A hand on the card stops the count for that universe.

The code:

// public/game-v8.4/app.js:2637
const DECAY_GROW = Math.pow(2, 1 / 6), DECAY_FADE_TICKS = 40;

// public/game-v8.4/app.js:2660 stepDecay()
const dtau = d.tau * (DECAY_GROW - 1); d.tau *= DECAY_GROW;
…
} else if (d.stage === 'wells') {
    const G = universeG(), c = …, K = G > 0 ? Math.pow(c, 4) / (15360 * Math.PI * G * G) : Infinity;
    …   /* each well's glow goes home to the Null Vacuum (Hawking Power, Horizon Feeding; book Part 3.13) */
    … m3 = Math.pow(Math.max(1, m0), 3) - 3 * K * dtau; if (m3 <= 1) { radiate('hawking', m0, w); … }
} else {
    d.fadeTick++;
    decayFade = Math.min(1, d.fadeTick / DECAY_FADE_TICKS);
}

// public/game-v8.4/app.js:2756 the child that plays next
function nextChildToPlay() {
    const ok = lineage.children.filter(c => !c.failed);
    return ok.find(c => c.ascendant && c.rank === 1) || ok.find(c => c.ascendant) || ok[0] || null;
}

// public/game-v8.4/app.js:2766 armAuto(), the countdown on the summary card
const AUTO_SECONDS = 15;
…
        if (mode === 'decay') startDecay();
        else { const ch = nextChildToPlay(); if (ch) { hideRunSummary(); playChild(ch.index); } }