Port seeded sky colors and Normal Time celestial controls to 26.3
Build / build (push) Canceled after 0s

This commit is contained in:
dnorberg committed 2026-11-03 16:56:07 -05:00
1 parent a7a73d3c17
commit 38e40ddba3
27 files changed
+1516 -35

No files matched your search

+238
View File
@@ -1065,6 +1065,244 @@ the temporary server/world was deleted. Client animation, travel between sky
styles, and restart appearance still require manual validation. No user world
was modified, and nothing was committed, pushed or published.
## Seeded sky completion slice
`1.0.1.72-beta.1` completes missing sky controllers using the first seeded
selection from 1.21.1 `AgeSkyProfile.random` (`0x534B5950524F464C` salt).
Inherited and Overworld currently map to the same native Overworld style;
the effective Overworld/Nether/End/Static weights are 2:1:1:1. This deliberately
ports only style selection, not random colors or celestial-body lists.
The player book path and `create_random` fixture now share one environment
record containing weather, lighting and sky. Explicit pages win. Separate
seed streams keep controllers independent, including when one is supplied
explicitly, and Cave weather remains Off. Existing Age index values/defaults
remain authoritative; this does not reroll old Ages or reseeded Age skies.
The one-purpose controlled fixtures keep their explicit Overworld defaults.
The environment probe checks repeatability and every explicit sky override
with and without explicit lighting/weather. Manual seeds 0–11 and -1 covered
all four sky choices, Cave and Void, without changing established weather/
lighting results; signed-long boundary seeds also passed. Disposable-server
fixtures created all four random styles plus Bright Static and an explicit
Overworld override. Static survived unload/reload; Nether retained its saved
style after reseeding to an End-selecting seed. All six choices survived a
server restart. The server stopped cleanly and its temporary world was deleted.
The port build passed (no unit-test sources are configured). Player rendering
still needs validation of new book creation and travel. No user save is changed
and nothing is committed or published.
## Shared colors and ambient-light target slice
`1.0.1.73-beta.1` adapts the 1.21.1 `AgeSkyProfile.ColorAccumulator` rules:
Number 0–24 followed by Red/Green/Blue adds ten times that amount to one
channel, White adds to all, Black subtracts from all, and final channels are
clamped. Unnumbered colors use the same seeded index-salt approach. Color
groups preceding Sky pages, or trailing the book, tint the sky. No colors
means native rendering; omitted channels within an authored group are zero.
The new port-only `lighting/ambient_color` target consumes the preceding group
as ambient color instead. It appears in the existing Lighting creative tab
and uses the shared procedural glyph/item compositor, not generated artwork.
Profiles are frozen in the Age index with native defaults, retained on reload/
reseed/retirement rollback, and included in the full catalog. The catalog
protocol is now 2; both peers need the matching beta. The client replaces its
profile map before catalog acknowledgment, invalidates the current attribute
cache and clears the map on disconnect. Age-only default-layer hooks apply
the native sky/fog/ambient RGB attributes dynamically; vanilla dimensions are
not changed. No runtime dimension registry mutation or RGB variant explosion
is involved. Client sky state carries tint separately from the live world:
Static cells use that tint, and the native End texture uses a color modulator.
Native celestial rendering is otherwise unchanged; authorable bodies remain
pending. Explicit ambient tints do not alter the effective Bright floor or
fabricate block/sky light; native lightmap tinting controls their appearance.
Numbers are supported only before shared colors in this slice. Celestial
numeric modifiers and variable Static resolution (#109) remain unsupported.
Random sky color completion and deprecated legacy fixed-color aliases remain
pending; this is not a claim of full celestial/color parity. Rendering needs
manual checks of authored groups, all sky types, ambient color, no leakage on
travel/reconnect, and persistence. Dedicated-server fixtures exercise known
RGB results, zero/upper amounts, clamping, seeded repeatability, rejection of
dangling numbers, and a catalog encode/decode round trip. All four colored
styles and an uncolored native fixture restored correctly after restart with
the expected sampled RGB attributes. The server stopped cleanly and its
temporary world was deleted. Port build/static checks passed; there are no
unit-test sources configured. Client rendering and live multiplayer sync
remain manual checks. No commit, push, or publication was requested.
## Authored native day-cycle slice
`1.0.1.74-beta.1` ports Normal Time with Full/Half/Double/Zero Length modifiers,
using the fixed values from the 1.21.1 symbol definitions. Number pages before
Length apply the existing `CelestialPageValues` rule (`number × 0.08` days).
Zero chooses a seeded time once and saves it. Missing Normal Time retains the
native cycle. The strict interim grammar requires at most one Length preceding
one Normal Time; broader ordered recovery and multiple celestial bodies remain
separate work. Number targets other than colors and lengths are still unported.
The Age index persists a native-default day-cycle profile. Lifecycle load,
reseed, retirement/rollback and catalog sync include it. Catalog protocol 3
carries the new profile map; clients replace it before acknowledgment, clear it
on logout and invalidate current attributes/sky brightness. Both peers need
the same beta build. A small Age-only Builder mixin preserves native dynamic
timeline ordering and weather layers, but supplies a read-only wrapped clock
manager for this Age's timeline samples. Its clock instances are cached per
definition, read profiles lazily (including during level construction), and
delegate non-Overworld clocks untouched. No global clock mutation occurs.
Native day shading, sun/moon tracks, moon phase, and gameplay attributes in
those timelines share the scaled sample. Zero has a constant integer sample,
rate zero, and partial tick zero, preventing the prior stopped-time bounce.
This does not accelerate blocks/entities, change the native `/time query`
result, make a Nether/End/Static sky show bodies, or port custom bodies. Global
time commands still affect moving samples. Authored RGB overrides and existing
Bright/Dark behavior remain independent. Separate Sun/Moon, angle/phase/size/
direction, eclipses, and randomized celestial completion are still pending.
Fixtures validate parser eligibility, known half/double/zero clock values,
Number overrides, deterministic stopped time, and the shared catalog codec.
At shared native time 18022 the sampled Full time was 18022 (sky light 4),
Half 36044 (sky light ~13.92), Double 9011 (sky light 15), and Zero stayed at
11611 with its unchanged sun angle. An unmodified Age matched Full exactly.
Zero survived unload/reload and reseeding without rerolling; the color fixture
retained its RGB values. All authored profiles, numeric endpoints 1/24, zero
override, native fallback, and the color fixture restored after server restart.
The final port build passed (no unit-test sources configured). Test servers
stopped cleanly; their temporary world was deleted. Visual/client reconnect
checks remain manual. No commit/push/publication is performed without an
explicit request.
## Native cycle phase and direction slice
`1.0.1.75-beta.1` extends the existing day-cycle profile with a saved native
clock origin, phase offset and direction. Phase conversion is adapted directly
from 1.21.1 `AgeDimensionService.applyInitialCelestialPhase`: the symbolic
angle is measured from Nadir, then shifted 18000 native ticks. Rising/Zenith/
Setting/Nadir give 0/6000/12000/18000, and preceding Number pages override a
Phase using the `CelestialPageValues` 15-degree rule (24 wraps to 0). Length
and phase remain independent. Explicit phase starts at Age creation, not at
the current Overworld position divided by Length.
Moving samples are `direction * (nativeTicks - origin) / period + phase`;
Counterclockwise reverses the native day timelines, including moon-phase and
gameplay tracks. Stopped samples remain constant and prefer written phase,
otherwise the previous saved seeded stopping time. Existing profiles without
the new optional fields retain their former behavior. Saved/profile lifecycle
and catalog synchronization already carry the extended codec. Catalog protocol
4 requires matching client/server beta versions. No registry types, textures,
or global clock mutations are added. Angle/size/per-body color and multiple
celestial rendering remain pending, as do eclipses and random celestial
completion. #110's Time/Normal Length naming changes remain separate work.
The interim grammar accepts at most one Length, Phase and Direction preceding
one Normal Time; numbers currently target Color/Length/Phase only. Fixtures
check all phase mappings at a shared origin, forward/reverse deltas, stopped
behavior, parsing of the earlier three-field profile, and full catalog codec
round trips. At native tick 1518, profiles sharing origin 496 and noon offset
sampled 7022 forward and 4978 backward, with sun angles ~10.756° and ~349.244°.
Zero Zenith stayed at 6000 / 0° / sky light 15; Zero Nadir stayed at 18000 /
180° / sky light 4. Number 6 yielded sunrise; Number 24 yielded midnight.
The reverse profile survived unload/reload; reseeding retained frozen midnight.
All sampled profiles restored after a server restart, retaining their origins,
direction and fixed phases; the old-style seeded Zero fixture also retained
its saved stopping time. Build checks passed (no unit-test sources configured).
The test server stopped cleanly and its temporary world was deleted. Rendered
motion and reconnect behavior remain manual. No commit/push/publication is
performed without explicit direction.
## Native orbital bearing slice
`1.0.1.76-beta.1` ports the four Angle pages and the existing 1.21.1
`CelestialPageValues` number rule (15° per number, modulo 360). North/East/
South/West map to 0/90/180/270. The interim grammar accepts one Angle before
Normal Time, independent of Length, Phase and Direction. Missing Angle keeps
the native orientation rather than enabling random-bearing completion.
The cycle codec adds an optional bearing defaulting to -1 (native). Existing
origin/phase/direction defaults and lifecycle persistence remain unchanged.
Catalog protocol 5 carries the extended profile; older peers must update.
Extracted sky state carries/resets bearing. Native SkyRenderer's Y rotation
for the shared sun/moon/star path uses the explicit value; the sunrise/sunset
pose receives the corresponding delta from the native -90° body bearing, with
balanced pose-stack restoration. No live-world lookup occurs during drawing.
Colors, native geometry/textures, phase timing, illumination, and direction
are retained. Angle changes only horizontal orientation, not altitude. Body
counts/sizes/colors and eclipses remain pending; no extra rendering backend,
asset or registry variant is introduced. #110 is deliberately not implemented
as part of this port slice.
The port build passes (no unit-test sources configured), and the targeted
PoseStack invocation signature was checked against the patched native class.
Disposable-server fixtures exercise cardinal values, all 0–24 Number values,
six-field profile fallback, and the complete catalog stream codec. All four
frozen-sunrise fixtures sampled the same time 0 and sky light ~14.19; only
their saved bearings differ. Number 3 gave 45°, Number 24 gave 0°. Unwritten
bearing retained -1. East survived unload/reload; the 45° profile retained its
bearing after reseed. Client rendering/glow alignment and travel isolation
still require manual validation; server probes cannot prove the drawn result.
All six explicit bearings and the native fallback restored correctly after
restart. The test server stopped cleanly and its temporary world was deleted.
No commit/push/publication is performed without an explicit request.
## Celestial-compatible missing-Sky fallback
`1.0.1.77-beta.1` restricts the missing-Sky fallback for celestial writing to
the current renderer's compatible style, Overworld. Normal Time no longer
inherits an unsuitable seeded Nether/End/Static background. The resolver
also recognizes Sun/Moon intentions for future support without enabling
those pages prematurely. Explicit Sky pages always win; no-celestial random
selection, terrain, and independent weather/lighting streams are unchanged.
No packet or saved-profile format changes are needed. Existing Ages retain
their saved style; tests of the fix must create new Ages.
1.21.1 comparison: `AgeSkyProfile.compile` starts with inherited sky style;
the bundled Age profiles all use the Overworld dimension type. Authored Sun/
Moon selects `AgeEnvironmentCompiler.CUSTOM_SKY_EFFECTS`, whose renderer draws
the body list after its background without a sky-style exclusion. Thus the
bundled 1.21.1 paths already avoid this visibility regression, and no follow-up
issue or root-code change is needed for them. This is not a claim about every
possible third-party datapack profile.
The environment diagnostic checks missing/explicit Sky for Normal Time, Sun,
and Moon, including both explicit-page orders, and verifies other environment
choices are unchanged. The day-cycle fixture now supplies no Sky page and
uses the same environment resolver as player books. Client creation/travel
checks remain manual. Build and disposable-server creation checks passed:
Normal Time without Sky selected native Overworld for seeds 0, 6 and 8,
while the same seeds without celestials retained Nether, Static and End.
Explicit-Sky precedence and independent environment choices passed the
diagnostic checks, including Cave terrain. The server stopped cleanly and
its temporary world was deleted. No commit/push/publication is performed
without an explicit request.
## Normal Time sun size
`1.0.1.78-beta.1` ports Small/Normal/Large Celestial Size modifiers to the
native Normal Time sun. Presets are 0.5×/1×/2×. An immediately preceding Number
uses the root compiler's `0.25 + number * (2.75 / 24)` rule, covering 0.25×
through 3×. Root Normal Time creates a size-modified sun and a 1× moon; this
slice preserves that distinction rather than resizing both. Standalone Sun/
Moon controllers, multiple bodies, per-body colors and eclipses remain pending.
No random size completion is added yet.
`PortDayCycle` persists optional `sun_size`, defaults old profiles to 1×,
validates the supported range and transmits it in catalog protocol 6. Size
is extracted into the sky render state and multiplies only the native sun
transform. Native texture/glow and rendering pipeline remain; no new assets
or buffers are allocated. State resets/defaults prevent size leaking to other
dimensions. Clock sampling, illumination and orbit bearing are unaffected.
The `create_size` op fixture freezes the sun at Zenith with Zero Length and
omits Sky to exercise compatible completion. Diagnostic checks cover all
25 numeric sizes, presets, older profile defaults, unchanged timing and
catalog round trips. Disposable dedicated-server checks produced sizes
0.5/1/2/0.25/1.625/3 with the same noon angle and sky light; reload, reseed
and full restart retained them. Build passed. Visual size/glow alignment,
unchanged moon, and travel isolation still require the user's client check.
The server stopped cleanly and its temporary world was deleted. Nothing is
committed, pushed or published without an explicit request.
## Verification of this first slice
The 1.21.1 `compileJava` and `build` tasks passed offline after the backend