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 |