|
1 | 1 | # Vulcanus cliffs - port notes |
2 | 2 |
|
| 3 | +> ## STATUS, 2026-08-01: issue #18 is CLOSED; remainder tracked in #84 |
| 4 | +> |
| 5 | +> Recall **1.000 / 0.973 / 0.965** across the three regions, **37 / 1531 = 2.4%** |
| 6 | +> wrong orientations (was 0.806 / 0.938 / 0.853 and 12.5%). Precision 0.872, |
| 7 | +> measured **without** the lava-collision rejection the shipping renderer applies. |
| 8 | +> |
| 9 | +> **Root cause: `multisample`'s offsets are in the calling noise program's GRID |
| 10 | +> UNITS, not tiles**, so `vulcanus_basalt_lakes_multisample`'s `min` is a 4-tile |
| 11 | +> min-filter for the cliff generator and a 1-tile one for every per-tile consumer. |
| 12 | +> The port used the 1-tile field for both, making cliff elevation too rough. Full |
| 13 | +> write-up at `## ROOT CAUSE, 2026-08-01` in `cliffs-NOTES.md`; the measurement is |
| 14 | +> `test/multisampleGrid.spec.ts`. |
| 15 | +> |
| 16 | +> **Every accuracy table below this banner is the PRE-FIX state**, kept because the |
| 17 | +> reasoning is the useful part. Do not quote one as current. |
| 18 | +
|
3 | 19 | Factorio 2.1.12 (build 87038, mac-arm64). Ported 2026-07-26. Companion to |
4 | 20 | `cliffs-NOTES.md`, which holds the reverse-engineering of the placement rule |
5 | 21 | itself - none of that had to be redone, because the placement geometry is engine |
@@ -523,10 +539,14 @@ the `all` path the Vulcanus DAG is evaluated four times per pixel region. |
523 | 539 | > because the reasoning that got from one to the other is the useful part. The |
524 | 540 | > current figures are in "ROOT CAUSE: `cliff_smoothing`". |
525 | 541 | > |
526 | | -> **And read "The residual is in the RULE, not the fields" at the end of this |
527 | | -> file before spending any time on field accuracy.** Substituting the game's own |
528 | | -> `elevation` and `cliffiness` for ours does not move a single placed cell, so |
529 | | -> the residual this section chases is not in the fields. |
| 542 | +> ~~**And read "The residual is in the RULE, not the fields"...**~~ **FALSIFIED |
| 543 | +> 2026-08-01.** The residual WAS in the field. The substitution test that |
| 544 | +> "does not move a single placed cell" was comparing against a fixture sampled |
| 545 | +> through `calculate_tile_properties` - a 1-tile-grid noise program - while the |
| 546 | +> cliff generator reads the same expression on a 4-tile grid, where `multisample` |
| 547 | +> returns different values. The fixture and the port shared the same mistake and |
| 548 | +> so agreed with each other. That substitution now correctly MOVES cells; see |
| 549 | +> `test/vulcanusCliffCornerFields.spec.ts`. |
530 | 550 |
|
531 | 551 | **Superseded the "Not validated" section below.** `test/vulcanusCliffEntities.spec.ts` |
532 | 552 | now compares the port against every real `cliff-vulcanus` the game places, captured |
@@ -710,12 +730,24 @@ That capture is the obvious next step and is the same shape as |
710 | 730 | `captureCliffEntities` in `test/oracle/capture.ts`, pointed at a Vulcanus |
711 | 731 | surface. |
712 | 732 |
|
713 | | -## The residual is in the RULE, not the fields - measured 2026-07-29 |
| 733 | +## ~~The residual is in the RULE, not the fields~~ - FALSIFIED 2026-08-01 |
| 734 | + |
| 735 | +> **This section's conclusion is wrong, and the way it was wrong is the most |
| 736 | +> useful thing in this file.** The residual WAS in the field. The substitution |
| 737 | +> below is sound as an experiment and its numbers are real - but the fixture it |
| 738 | +> substitutes was captured through `LuaSurface.calculate_tile_properties`, whose |
| 739 | +> noise program has a **1-tile grid**, while the cliff generator reads the same |
| 740 | +> expression on a **4-tile** grid. `multisample`'s offsets are in grid units, so |
| 741 | +> the two channels return different values for `vulcanus_elevation`. The fixture |
| 742 | +> and the port were making the same mistake, so substituting one into the other |
| 743 | +> could never move a cell. See `## ROOT CAUSE, 2026-08-01` in `cliffs-NOTES.md`. |
| 744 | +> |
| 745 | +> Read on for the method, not the verdict. |
714 | 746 |
|
715 | 747 | Everything above, and all of #18, treats the Vulcanus cliff gap as a **field |
716 | 748 | accuracy** problem: the noise field matches to 5e-6, the constants are read from |
717 | 749 | the game, so the ~1.15-1.19x over-placement must be residual field error |
718 | | -somewhere. **That is wrong, and it is now measured rather than argued.** |
| 750 | +somewhere. **That was believed to be wrong; it was in fact right.** |
719 | 751 |
|
720 | 752 | `test/oracle/capture.ts vulcanus-cliff-corner-fields` dumps the game's own |
721 | 753 | `vulcanus_elevation` and `cliffiness_basic` at every corner of the placement |
|
0 commit comments