PulseCore

Chapter 8 · Section 10

Picking and the Pointer

The BPT law

BPT Part 3.9 (Fractal Progeny) makes every well the seed of a child universe, and BPT Part 3.10 states the step as the Return to Bifurcation (G): "∅L → (0 ⥂ 1)(g+1), once per well. The null left by a dissipated universe is the Pre-Pulse Field of its children: each well bifurcates as a new UniSphere one generation on." Each child "inherits its parent's well: its null mass, its spin a_f through the Inherited Spin Parameter, and its heritage f", and BPT Part 3.14 gives its depth: "every child takes the level its well then holds. A child plays at that level, one generation on (Level and Generation)." "A child of a well below the Ascendant Mass is smaller than its parent"; an Ascendant Well can raise the next by up to log₂ 8.1 ≈ 3 levels. The same Part's Game's Reading says how a well is chosen: "a tap anywhere in a galaxy selects its well."

The genesis the player sets is Chapter 1's. Spin, in BPT, is born of orbit (Part 3.12; Part 6.9, Spin Inheritance and the Progenitor Axis): a universe inherits a_f from the merger of the wells that made it, with one genesis axis, n̂_genesis = J_total/|J_total| (the game's tooltip). Choosing a well to dive into is the game's way of following a lineage; painting the Pulsecore and setting its spin with the cue are its way of setting the genesis.

The established physics

The cue sets the angular momentum J = r × v: the drag along the surface at a point gives the axis and, by its length, the spin. The spin is held at 0.998, the Thorne limit for an accreting black hole (Thorne 1974).

The game's math

Picking a well (pickWell(x, y) scene3d.js:1417). For each drawn well a ray from the camera to it is tested against the torus; a well behind the torus is skipped. The rest are projected to the screen, and the nearest by a weighted distance wins:

score = d / (1 + 0.12·log₂(1 + mass)) · (1.6 if stellar)        within 90 px of the tap
dark wells (no mesh): the same, × 1.25 so a drawn well wins a near tie,  within 60 px
Proto Wells: the same without the stellar factor, within 90 px

so a tap anywhere in a galaxy finds its heaviest well. hoverWell() scene3d.js:1411 runs the same test at most every 80 ms to set a pointing-finger cursor. A press that finds no well and is let go within 8 px of where it began calls onPickNone, which brings back the "Tap a well to dive in" prompt (app.js:2605). On the flat field, diveAt() app.js:2887 takes the nearest well within max(3, min(rows, cols)/10) cells.

The cue (bindPointer() scene3d.js:1795). Before Start the gold spin arrow and the cyan axis arrow can be grabbed within 32 px of a head or 24 px of a shaft. Pulling the spin arrow: v is the drag's component along the surface at the anchor r, J = r̂ × v, tilt = min(80°, acos J_z), and a_f = clamp((|v| − 0.2)/1.0, 0, 0.998). Pulling the axis arrow: the point dragged is J, and a_f = clamp((|J| − CORE − 0.15)/1.4, 0, 0.998).

Painting. A press on the sphere or torus finds its cell from the hit's texture coordinate, c = floor(u·cols), r = floor(v·rows) (cellAt). On touch a stroke waits 110 ms for a second finger, which makes the gesture a pinch instead. The cursor is a magnifier over the skin, a hand elsewhere, closed while the view turns.

In the game

Before Start the player sets the genesis by hand. The "Tool" control (index.php:235) offers "Brush", "Pulse Injector" and "Pattern Stamper", with a "Color" picker and saved patterns; a press on the sphere paints the cell under it, and the cursor is a magnifying glass there. The gold spin arrow on the Pulsecore can be grabbed and swung like a pool cue, and the cyan axis arrow pulled out or in; the "Axis tilt" tooltip says so: "Before Start you can also grab the arrow on the Pulsecore and swing it like a pool cue" (index.php:176). The "Spin:" readout follows, and the panel's spin and axis sliders move with it. Start locks the genesis (lockGenesis() app.js:2153).

At the end of a life the choice is a well. When the data has returned the banner asks for it: kicker … wells held · returned to the Source, title "Tap a well to dive in", and a button "⌛ Continue the universe" to go on into the full decay (promptDive() app.js:2880). A tap near a well, in 3D or on the flat field, selects it and the banner names its child: Next Universe – Level … · generation …, marked "· Ascendant" for an Ascendant Well, "· light and wells only" or "· no stars" for a child too shallow for them (diveWell() app.js:3122). A second tap on the same well dives in, and its child begins as the next universe. A well too small to seed says "Too small to seed"; a failed child "This child failed", "it seeded nothing; its data returned to the Source". A tap on empty sky brings the prompt back.

The scale model

Exact: no scale model. A pick returns the well itself (its id), not a drawn stand-in, so a dive always opens the well chosen.

Where the game and the theory differ

  • The dive prompt's line reads "each seeds a next universe one level deeper" (app.js:2884). By BPT Part 3.14 a child takes the level its well holds: below its parent's for a well under the Ascendant Mass, and up to about three levels above it from an Ascendant Well. The selection banner shows that level, not one level deeper.
  • The cue's tilt stops at 80°, with no reason stated in the code.

Fixed numbers

Number Where What it is Kind
0.03 scene3d.js:1426, 1440, 1455 depth tolerance for "behind the torus" METHOD (the mark's lift)
90 px, 60 px scene3d.js:1433, 1445, 1452 tap reach for drawn and dark wells METHOD (a fingertip)
0.12, 1.6, 1.25 scene3d.js:1432, 1444 weight by mass, stellar wells, drawn over dark METHOD (galaxy hearts win)
80 ms scene3d.js:1413 hover test interval METHOD (it raycasts each well)
8 px scene3d.js:1876 a tap, not a drag METHOD (input tolerance)
max(3, min(rows, cols)/10) app.js:2894 flat-field dive reach in cells METHOD (input tolerance)
32 px, 24 px scene3d.js:1828, 1831 cue grab reach METHOD (input tolerance)
80° scene3d.js:1851, 1866 most tilt the cue sets METHOD (no reason stated in the code; past it the axis lies near the equator)
0.998 scene3d.js:1851, 1866 top spin PHYSICS (Thorne 1974)
0.2, 1.0, 0.15, 1.4, 0.05, 0.02 scene3d.js:1850–1866 drag to spin, matching the arrows' lengths DISPLAY
110 ms scene3d.js:1888 wait for a second finger METHOD (input tolerance)
magnifier SVG (26 px, hot spot 10, 10) scene3d.js:20 the cursor DISPLAY