refactor(runtime): own world environment state
This commit is contained in:
parent
b972f539f7
commit
902076c0a4
27 changed files with 886 additions and 295 deletions
|
|
@ -221,48 +221,22 @@ public sealed class LoadedSkyDesc
|
|||
/// </summary>
|
||||
public int SelectDayGroupIndex(int year, int secondsPerDay, int dayOfYear)
|
||||
{
|
||||
if (DayGroups.Count == 0) return 0;
|
||||
|
||||
// Env-var override has absolute priority.
|
||||
var env = System.Environment.GetEnvironmentVariable("ACDREAM_DAY_GROUP");
|
||||
int? forcedIndex = null;
|
||||
if (int.TryParse(env, System.Globalization.NumberStyles.Integer,
|
||||
System.Globalization.CultureInfo.InvariantCulture, out var forced)
|
||||
&& forced >= 0 && forced < DayGroups.Count)
|
||||
{
|
||||
return forced;
|
||||
forcedIndex = forced;
|
||||
}
|
||||
|
||||
if (DayGroups.Count == 1) return 0;
|
||||
|
||||
// --- Retail SkyDesc::CalcPresentDayGroup @ 0x00500E10 ---
|
||||
|
||||
// Step 1: deterministic per-day seed.
|
||||
int seed = unchecked(year * secondsPerDay + dayOfYear);
|
||||
|
||||
// Step 2: 32-bit signed LCG (retail uses x86 silent wrap; force
|
||||
// unchecked in C#). `0x8ABE1652` is stored as `-0x7541E9AE` in the
|
||||
// decompile — same bit pattern.
|
||||
int mixed = unchecked(seed * 0x6A42FDB2 + unchecked((int)0x8ABE1652));
|
||||
|
||||
// Step 3: signed-int → float with +2^32 fixup for negative values
|
||||
// (retail x87 converts `int` to `float` and then adds
|
||||
// `_DAT_0079920c` ≈ 4294967296.0f when `iVar4 < 0`).
|
||||
float hashF = (float)mixed;
|
||||
if (mixed < 0) hashF += 4294967296.0f;
|
||||
|
||||
// Step 4: scale to [0, dayGroupCount). `_DAT_007c6f10` is
|
||||
// `1.0f / 2^32` per reuse pattern (see research doc §2.4).
|
||||
const float kInv2Pow32 = 1.0f / 4294967296.0f;
|
||||
float countF = (float)DayGroups.Count;
|
||||
int index = (int)System.MathF.Floor(countF * hashF * kInv2Pow32);
|
||||
|
||||
// Step 5: safety clamp for float rounding at the upper edge.
|
||||
// Retail does `if (count <= index) index = 0;`. Using the same
|
||||
// "snap to 0 on overflow" instead of clamping to count-1.
|
||||
if (index >= DayGroups.Count) index = 0;
|
||||
if (index < 0) index = 0;
|
||||
|
||||
return index;
|
||||
return SkyDayGroupSelector.SelectIndex(
|
||||
DayGroups.Count,
|
||||
year,
|
||||
secondsPerDay,
|
||||
dayOfYear,
|
||||
forcedIndex);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue