acdream/src/AcDream.App/Streaming
Erik 955c618013
All checks were successful
CI / linux-portable (push) Successful in 3m46s
CI / windows-gate (push) Successful in 5m5s
CI / release (push) Successful in 1m56s
fix: make locale-independence real, not assumed — parsing, casing, comparison
Follow-up to the retail-text fix. "Green under sv-SE" is not the same as "runs
on any locale", so this establishes the latter by running the suite under
cultures chosen to break different things, and fixing what they broke.

ar-SA found a genuine defect the Swedish runner cannot see: the resolution
parser read "1920x-1" through the ambient culture, and ar-SA's negative sign is
not ASCII '-', so the parse failed and the height silently became 0 instead of
-1. Both copies of that parser (App settings targets and the UI settings store)
now parse invariantly.

Audited every remaining culture-sensitive operation in src/ rather than fixing
only what a test happened to catch:

- Numeric Parse/TryParse with no IFormatProvider: 11 sites, all reading
  MACHINE-readable input — env vars (ACDREAM_LIGHT_DEBUG, ACDREAM_NET_DROP_*,
  streaming/quality knobs), CLI arguments, "1920x1080" settings keys, a chat
  command's price argument, and the launcher's bake thread count, which is
  handed straight to a child process command line. All pinned to
  InvariantCulture.
- ToUpper()/ToLower() with no culture: none. The Turkish-I class was already
  clean, and tr-TR confirms it.
- StartsWith/EndsWith/IndexOf(string) with no StringComparison: one —
  ChatInputParser's "@" prefix test, which is a culture-sensitive comparison
  for a single ASCII character. Now the ordinal char overload.

Verified: 13,958 tests pass identically under the machine default, sv-SE,
tr-TR, ar-SA, and de-DE. (The two launcher test assemblies are excluded from
this run only because a running acdream-launcher.exe holds its own binary; the
one launcher change here is the thread-count parse.)

Dates remain on the current culture by intent, unchanged from the previous
commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 20:11:32 +02:00
..
DatSpawnClaimHydrationClassifier.cs refactor(app): compose session and player startup 2026-07-22 18:28:32 +02:00
DungeonStreamingGate.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
EntityVanishProbe.cs fix(streaming): #138-B avatar vanishes after teleporting out — don't relocate during PortalSpace 2026-06-24 12:30:20 +02:00
GpuLandblockRetirement.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
GpuWorldState.cs probe: ACDREAM_PROBE_REVEAL_TIMING — wall-clock attribution of the login/portal hold 2026-08-17 19:04:15 +02:00
GraphicalRemotePlacementServiceWindow.cs feat(physics): C4 route 4b-1 — remote placement infrastructure (dormant) 2026-08-04 04:08:19 +02:00
LandblockBuild.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
LandblockBuildFactory.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
LandblockBuildRequest.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
LandblockPhysicsPublisher.cs fix(physics): S2 — static publication emits authored Spheres as Spheres (AP-155 narrowed) 2026-08-07 08:07:02 +02:00
LandblockPresentationPipeline.cs perf #418: publish landblocks under the meter, not one per streaming tick 2026-08-17 20:11:35 +02:00
LandblockPresentationRetirementOwner.cs feat(runtime): atomically replace collision generations 2026-08-01 17:33:34 +02:00
LandblockRenderPublisher.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
LandblockRetirementCoordinator.cs feat(runtime): atomically replace collision generations 2026-08-01 17:33:34 +02:00
LandblockStaticPresentationPublisher.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
LandblockStreamer.cs perf #418: parallelize landblock builds across a striped worker pool 2026-08-17 19:34:20 +02:00
LandblockStreamJob.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
LandblockStreamResultCost.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
LandblockStreamTier.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
LocalPlayerTeleportController.cs feat(session): the in-world logoff — LogOut animation, reverse wormhole, live return to character select 2026-08-17 14:02:40 +02:00
PublicationTimingProbe.cs perf #418: publish landblocks under the meter, not one per streaming tick 2026-08-17 20:11:35 +02:00
RevealTimingProbe.cs perf #418: publish landblocks under the meter, not one per streaming tick 2026-08-17 20:11:35 +02:00
RuntimeTeleportDestinationAdapter.cs refactor(runtime): own teleport destination correlation 2026-07-26 17:52:34 +02:00
SealedDungeonCellClassifier.cs refactor(runtime): extract local teleport and player mode 2026-07-22 02:50:15 +02:00
StreamingCompletionQueue.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
StreamingController.cs test: stabilize load-sensitive release contracts 2026-08-18 11:50:23 +02:00
StreamingDiagnostics.cs fix: make locale-independence real, not assumed — parsing, casing, comparison 2026-08-19 20:11:32 +02:00
StreamingFrameController.cs refactor(runtime): close simulation ownership 2026-07-26 15:53:31 +02:00
StreamingMutationException.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
StreamingOriginRecenterCoordinator.cs fix(streaming): preserve portal destination ownership 2026-07-25 08:35:12 +02:00
StreamingRegion.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
StreamingWorkBudget.cs perf #418: widen the destination-lane budget only while the reveal hold is active 2026-08-17 20:55:43 +02:00
StreamingWorkBudgetOptions.cs perf #418: widen the destination-lane budget only while the reveal hold is active 2026-08-17 20:55:43 +02:00
TeleportLandblockTransition.cs fix(world): remove non-retail portal exit fade 2026-07-15 23:20:52 +02:00
TwoTierDiff.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
WorldGenerationQuiescence.cs Revert "Campaign V slice V4a" - it lost world multisampling 2026-07-27 18:29:28 +02:00
WorldRevealCoordinator.cs probe: ACDREAM_PROBE_REVEAL_TIMING — wall-clock attribution of the login/portal hold 2026-08-17 19:04:15 +02:00
WorldRevealReadinessBarrier.cs fix(streaming): make a demoted landblock render-ready like a published one (#280 D-1) 2026-08-06 07:27:28 +02:00