Skip to content

Commit 194295f

Browse files
authored
Merge pull request #140 from wormeyman/cliffs-crater-add-only
docs(cliffs): the CRATER PLACER is ADD-ONLY - the last untouched idea (#84)
2 parents 3e58a24 + 83583e4 commit 194295f

2 files changed

Lines changed: 79 additions & 4 deletions

File tree

docs/noise/cliffs-NOTES.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,41 @@ That is a real border-only channel, because the largest cliff half-extent is
10511051
reaching for it: an absent chunk makes the game KEEP a cliff, so its signature
10521052
is a false rejection, not a missed destruction.
10531053

1054+
### `CliffCraterPlacer::tryToPlaceCliffAsCrater` is ADD-ONLY - closed 2026-08-04 (#84)
1055+
1056+
The third and last of the untouched ideas in `vulcanus-cliffs-NOTES.md`, listed
1057+
there as "ruled out for the residual by position but never ruled out as a
1058+
mechanism". It is the one thing in the entity stage that touches cliffs at all,
1059+
so it deserved a direct read rather than another position argument.
1060+
1061+
**It only ever adds.** Both overloads reach the same two calls and nothing else:
1062+
1063+
| | |
1064+
| --- | --- |
1065+
| `tryToPlaceCliffAsCrater(Surface&, MapPosition const&, CliffPrototype const&, unsigned int)` | `0x10160bc34` - a thin wrapper, single `bl` to the overload below |
1066+
| `tryToPlaceCliffAsCrater(..., CraterPlacementDefinition const&, RandomGenerator&)` | `0x10160bcac` - calls `calculateCliffSegments`, then `Surface::addEntity` (`0x1001b3f8c`) per accepted segment |
1067+
| `CliffCraterPlacer::calculateCliffSegments` | `0x10160be6c` - calls `Surface::wouldCollide` (`0x10160c088`) and emplaces the segments that pass into a `SmallVector<Pair<MapPosition, CliffOrientation>, 16>` |
1068+
1069+
Across the whole `0x10160bc34..0x10160c088` range there is **no `destroy`,
1070+
`remove` or `erase` path of any kind** - the only other `bl`s are three
1071+
`dyld_stub_binder` PLT entries (`operator delete` / `memmove` shape) and the
1072+
stack-check epilogue. Its callers are `EntityMapGenerationTask::applyEntities`
1073+
and `CliffEditor::buildCliffs`.
1074+
1075+
**Why that closes it, and why the closing argument is DIRECTION rather than
1076+
position.** The ore effect is *fewer* cliffs when ore is present - 885 against
1077+
916 in `[1500,1500]`, so 31 cliffs must be destroyed or prevented. A function
1078+
that can only add, and only where `wouldCollide` reports the space free, cannot
1079+
produce that sign. The crater counts corroborate it instead of merely permitting
1080+
it: **0 craters with resources on, 8 with them off**, so both populations move
1081+
the *same* way under the lever, which is not what displacement looks like.
1082+
1083+
The position argument (`[0,0]` and `[1500,1500]` have zero crater-cliffs; all 8
1084+
are in `[-1200,800]`, the region with none of the worst crossing error) was
1085+
already on record and had left the candidate alive for weeks, because it only
1086+
says these objects are not the residual - not that this code cannot cause it.
1087+
One call-list read settles what the position never could.
1088+
10541089
### `crater-cliff` is not on the cliff lattice - confirmed, not assumed
10551090

10561091
**FFF #386 explains why it exists and corroborates both readings**

docs/noise/vulcanus-cliffs-NOTES.md

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,36 @@
11
# Vulcanus cliffs - port notes
22

3+
> ## UPDATE 15, 2026-08-04: the CRATER PLACER is ADD-ONLY - the third and last untouched idea is closed
4+
>
5+
> `CliffCraterPlacer::tryToPlaceCliffAsCrater` was the last of UPDATE 9's three
6+
> untouched ideas, carried there as "ruled out for the residual by position but
7+
> never ruled out as a mechanism". **It is add-only, so it cannot be the
8+
> mechanism.** Addresses and the full call lists are in `cliffs-NOTES.md`.
9+
>
10+
> Both overloads reach exactly `calculateCliffSegments` (which calls
11+
> `Surface::wouldCollide` and emplaces the segments that pass) and then
12+
> `Surface::addEntity`. Across the whole `0x10160bc34..0x10160c088` range there
13+
> is **no destroy, remove or erase path of any kind**.
14+
>
15+
> **The argument that settles it is DIRECTION - which is exactly what that
16+
> bullet's own framing was missing.** The ore effect is *fewer* cliffs when ore
17+
> is present, 885 against 916, so something has to destroy or prevent 31 of them.
18+
> A function that can only add, and only where `wouldCollide` reports the space
19+
> free, cannot produce that sign. The crater counts corroborate rather than
20+
> merely permit: **0 craters with resources on, 8 with them off**, so both
21+
> populations move the *same* way under the lever - not what displacement looks
22+
> like.
23+
>
24+
> Position arguments kept this candidate alive for weeks, because they only say
25+
> these objects are not the residual, never that this code cannot cause it. One
26+
> call-list read closed it.
27+
>
28+
> **All three of UPDATE 9's ideas are now closed** - chunk order (UPDATE 12), the
29+
> compute -> apply queue (UPDATE 13), and this one - **and the ore effect is
30+
> untouched by every one of them.** It still reproduces at precision 1.000 with
31+
> no surviving mechanism. Whatever comes next should not be another candidate off
32+
> a list that is now empty.
33+
>
334
> ## UPDATE 14, 2026-08-04: the RUNTIME DESTROY PROBE is BUILT, and the port's cascade reproduces the game EXACTLY
435
>
536
> #127 asked for a runtime probe that destroys a cliff outside map generation,
@@ -97,7 +128,8 @@
97128
> **One of the three ideas is left:** `CliffCraterPlacer::tryToPlaceCliffAsCrater`
98129
> as a *mechanism* (ruled out for the residual by position, never as a
99130
> mechanism). The ore effect is untouched by this and still reproduces at
100-
> precision 1.000.
131+
> precision 1.000. (That one was closed the same day too - see UPDATE 15 above,
132+
> which leaves the list empty.)
101133
>
102134
> ## UPDATE 12, 2026-08-04: CHUNK-GENERATION ORDER is closed - both links, and the ore effect survives
103135
>
@@ -3683,10 +3715,18 @@ Ideas that are still untouched, for whoever picks this up:
36833715
this bullet used to say, kept because it is the reasoning that made the idea
36843716
worth trying: the queue is filled in the compute phase and drained in the
36853717
apply phase, and no measurement covered what happened to it in between.
3686-
- `CliffCraterPlacer::tryToPlaceCliffAsCrater`, which runs at the head of
3718+
- ~~`CliffCraterPlacer::tryToPlaceCliffAsCrater`, which runs at the head of
36873719
`applyEntities` and is the one thing in the entity stage that touches cliffs at
3688-
all. Ruled out for the residual by position (#84's crater-cliff note) but never
3689-
ruled out as a mechanism.
3720+
all.~~ **CLOSED 2026-08-04 - see UPDATE 15 and `cliffs-NOTES.md`.** It is
3721+
ADD-ONLY: no destroy, remove or erase path exists anywhere in it, so it cannot
3722+
produce an effect whose direction is FEWER cliffs. The bullet's own framing is
3723+
why this took so long - it was "ruled out for the residual by position but
3724+
never ruled out as a mechanism", and position is not the argument that
3725+
settles it. Direction is.
3726+
3727+
**All three ideas on this list are now closed, and the ore effect is unchanged.**
3728+
That is the honest state: 885 against 916 at precision 1.000, with no surviving
3729+
mechanism. The next move is not another candidate off a list that is empty.
36903730

36913731
## `crater-cliff` moves under the lever too - a SECOND effect, and an RNG lead (2026-08-03, #84)
36923732

0 commit comments

Comments
 (0)