3fd58110f4
2 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
3fd58110f4 |
VSEPR geometry and a solvent: molecules become things
"It needs more detail" was not a pixel problem. A molecule was a set of atoms at whatever angles the storm left them — three circles near each other, never a thing — and the room was a vacuum with objects in it. VSEPR. Bond springs only ever fixed bond LENGTH. Angular springs now splay the bonds around each atom as far apart as they can go, which is what produces the famous silhouettes: water bent at 104.5, CO2 a straight bar, methane a caltrop, a closed carbon ring a hexagon. Two bonds is where lone pairs matter, so O/N/S carry an explicit `bend`; three or more is just even angular spacing, which lands trigonal at 120 and the caltrop at 90 for free. The springs are deliberately weak (ANGLE_SPRING is ~15% of BOND_SPRING) so geometry loses to the storm, to a blast and to Molly's hands. A rigid molecule that ignores being hit reads as fake instantly. They also needed DAMPING, which was the real bug. Undamped, the mean angle measured correct while water actually swung through a 61 degree range — a broken hinge, not a molecule. Damping the tangential relative velocity (as bondSprings already does radially) cuts the spread from sd 16.5 to 1.3. Two measurement traps worth recording, since both nearly sent me the wrong way: a single-frame angle reading is meaningless in a Brownian storm and showed water at 58 degrees when its mean was 105; and starting a two-arm molecule at exactly 180 degrees is a degenerate equilibrium where the cross product vanishes and it cannot pick a side to fold toward, which looked exactly like a systematic bias. THE SOLVENT. 600 motes advected by the Coulomb field the sim already computes. Deliberately NOT particles: no charge, no valence, no collisions, nothing can touch them, so 600 cost 0.16ms where 116 real atoms cost ~5ms. They carry what the atoms cannot — you see the field move before anything charged does. Drawn under everything and never additive, because 600 additive motes would stack into a wash that eats the element hues and the radicals' white. 13 new tests in test/geometry.test.mjs; 81 passing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
6263672134 |
Molly Cool: arcade science-action vertical slice
A nanoscale arcade game. Shoot charge across the room, wrestle atoms together until they snap, and contain a chain reaction before it eats the field. Vanilla JS + Canvas 2D, no dependencies, no build step. Core systems: - Charge: give/take as the only two verbs. Opposites attract, likes repel. - Laserhands: ranged proton/vacuum bolts with real travel time. Bolts are charged bodies, so they curve through the field — bank shots are real. Give spends from an 8-proton ring, take earns them back. - The wrestle: bonds can't form on their own. Every pair has an activation barrier that parks them at arm's length; Molly's hands are the only way over it. Hold, squeeze, release -> SNAP. - Radicals: the enemy, with no mind. Every 0.32s one grabs its nearest neighbour, completes itself, and hands the wound on. Can't be shot dead — terminated by wrestling two together (barrierless, so 0.38s vs 1.56s). Two that drift into contact self-quench, which gives outbreaks a natural equilibrium instead of unbounded growth. - Overload: keep feeding one atom and it goes critical. The blast tips its neighbours, so density decides whether you get one pop (34 atoms) or 84 detonations from a single seed (116 atoms). - CASCADE: eight arenas of escalating density with finite ignition waves. Clear the field to advance; sustained neglect melts it down. - Membrane, sour/soapy zones, and the seven wordless tutorial rooms. Non-obvious constraints, documented at each constant: - BARRIER_FORCE must exceed MAX_CHARGE_FORCE, or atoms bond themselves and the wrestle (the whole game) gets skipped. - Bond lock distance scales with atom radius. A flat value meant two carbons could never bond at all, since collision held them further apart than the lock — invisible because hydrogen worked fine. - RAD_SPLIT_R must exceed the field's natural packing distance (set by the barrier), or outbreaks can only crawl and never bloom. Testing: 39 headless sim tests run the real physics in Node — no browser, no canvas. The sim draws all randomness from a seeded RNG so runs are reproducible. Perf is 0.32ms/sim-step at 116 atoms. Dev server strips a /v<timestamp>/ path prefix that index.html adds to its entry import, because browsers cache the *parsed* ES module by URL and no-cache headers alone don't touch it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> |