acdream/tests/AcDream.Core.Tests/Conformance
Erik b7d655bce7 fix(lighting): A7 Fix D round 2 — outdoor objects get NO torches (retail useSunlight gate) (#140)
The Holtburg meeting-hall facade washed out warm/bright vs retail. The round-1
checkpoint blamed torch REACH (acdream Falloff 6×1.3=7.8m vs a supposed retail
Falloff 4). That theory is WRONG, and this commit fixes the real cause.

Empirical (HoltburgTorchFalloffProbeTests, headless dat dump via the production
LightInfoLoader): the orange entrance torch (setup 0x020005D8) is raw dat
Falloff 6 and acdream reads it FAITHFULLY — there is no Falloff-4 torch anywhere
in Holtburg. Both clients read the same dat float, so reach was never inflated.

Decomp (read verbatim + corroborated by an independent adversarial workflow):
retail's per-object torch binder minimize_object_lighting (0x0054d480) is gated
in RenderDeviceD3D::DrawMeshInternal (0x0059f398) by `if (Render::useSunlight == 0)`.
The outdoor landscape stage runs useSunlightSet(1) (PView::DrawCells 0x005a485a,
before LScape::draw), so the building EXTERIOR shell — drawn via
DrawBlock→DrawSortCell→DrawBuilding→CPhysicsPart::Draw→DrawMeshInternal — is lit
by SUN + ambient ONLY; torches are SKIPPED. The static bake
(SetStaticLightingVertexColors 0x0059cfe0) is EnvCell-only. So retail NEVER
torch-lights outdoor objects. This exactly explains the isolation test (object
point lights OFF → building matches retail).

Fix: WbDrawDispatcher.ComputeEntityLightSet gates per-object torch selection on
the object being INDOOR (ParentCellId is an EnvCell, (id&0xFFFF)>=0x0100) via the
pure predicate IndoorObjectReceivesTorches. Outdoor objects (building shells with
null ParentCellId, outdoor scenery, outdoor creatures) keep the all-(-1) light
set ⇒ sun + ambient only = retail. The indoor "no sun" half is already handled by
the global sun-kill when the player is inside a cell (UpdateSunFromSky). No
dungeon regression: EnvCell statics get ParentCellId set (keep torches).

Divergence register: AP-37 (residual: acdream keys sun/torch on the object's own
cell + a per-frame player-inside sun-kill, vs retail's per-draw-stage useSunlight;
only matters for through-doorway look-ins). The round-1 CHECKPOINT got a RESOLVED
banner correcting the reach theory.

Tests: WbDrawDispatcherTorchGateTests (7), HoltburgTorchFalloffProbeTests (dat
dump). App 280/1skip, Core 1486/2skip green. Held at the visual gate — not merged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 23:56:49 +02:00
..
Fixtures fix(p1): membership already matches retail — the 0/11 was a cdb capture artifact 2026-06-03 18:54:27 +02:00
ConformanceDats.cs test(p0): threshold-trace golden wiring + PVS scaffold + P1-entry checklist 2026-06-03 14:29:30 +02:00
CottageDoorwayCharacterizationTests.cs test(p0): dat-backed conformance loader + characterized cottage-doorway topology 2026-06-03 14:20:17 +02:00
DatConcurrencyStressTests.cs test(conformance): dat-reader concurrency hammer — concurrent READS exonerated 2026-06-09 21:28:32 +02:00
DungeonLandblockDatProbeTests.cs handoff: M1.5 dungeon support (G.3) grounded — design research + the terrain-less-premise refutation 2026-06-13 14:53:27 +02:00
FindCellListConformanceTests.cs fix(p1): membership already matches retail — the 0/11 was a cdb capture artifact 2026-06-03 18:54:27 +02:00
HoltburgTorchFalloffProbeTests.cs fix(lighting): A7 Fix D round 2 — outdoor objects get NO torches (retail useSunlight gate) (#140) 2026-06-19 23:56:49 +02:00
Issue107SpawnDiagnosticTests.cs fix(phys): #112 - remove the non-retail escape-hatch demote from the pick; lateral stab-graph recovery + retail keep-curr 2026-06-10 15:03:49 +02:00
Issue112MembershipTests.cs #112 ROOT CAUSE: outdoor-seed pick lacked retail's growing-array walk - threshold tick-skip became absorbing 2026-06-12 11:35:52 +02:00
Issue113DoorVanishDiagnosticTests.cs BR-1: RESOLVED as already-equivalent - premise falsified by pre-check, equivalence pinned, #113 attribution corrected 2026-06-11 06:25:31 +02:00
Issue113PhantomStairsDumpTests.cs fix(render): #113 root cause #2 - GfxObj meshes draw only DrawingBSP-referenced polys (the REAL phantom staircase) 2026-06-10 20:52:52 +02:00
Issue119TowerDumpTests.cs #119: tower decoded - the "missing stairs" are Setup 0x020003F2 (43-part spiral staircase); the "barrel" is a legit dat static orphaned by it 2026-06-11 17:59:52 +02:00
Issue119UpNullGfxObjDumpTests.cs #119: the [up-null] lead is EXONERATED (dat-proven) - both GfxObjs are legitimately no-draw models 2026-06-11 16:55:45 +02:00
PvsConformanceTests.cs test(p0): threshold-trace golden wiring + PVS scaffold + P1-entry checklist 2026-06-03 14:29:30 +02:00
RetailTrace.cs test(p0): retail find_cell_list trace parser + cdb value-capture tooling 2026-06-03 14:26:24 +02:00
RetailTraceTests.cs test(p0): retail find_cell_list trace parser + cdb value-capture tooling 2026-06-03 14:26:24 +02:00
StipplingSurfaceEquivalenceTests.cs BR-1: RESOLVED as already-equivalent - premise falsified by pre-check, equivalence pinned, #113 attribution corrected 2026-06-11 06:25:31 +02:00
ThresholdDivergenceDiagnosticTests.cs test(p0): retail-trace golden captured — membership criterion divergence pinned (P0 GATE MET) 2026-06-03 15:04:51 +02:00
ThresholdPortalCrossingReplayTests.cs fix(p1): membership already matches retail — the 0/11 was a cdb capture artifact 2026-06-03 18:54:27 +02:00