feat: Add metro transit, gadgets, shop, social apps, and traffic models checkpoint

This commit is contained in:
CAtlas0784 committed 2026-10-29 01:55:01 +07:00
1 parent caa42b84ed
commit 74e2963a12
79 files changed
+527962 -496

No files matched your search

@@ -8,6 +8,100 @@ public sealed class TrafficSignalFile
{
[JsonPropertyName("lights")]
public List<TrafficLightEntry> Lights { get; set; } = [];
[JsonPropertyName("intersections")]
public List<TrafficIntersectionEntry> Intersections { get; set; } = [];
}
/// <summary>
/// City zone-graph intersection mapping (InterZones.json): for every signalized city
/// intersection (id from the world TrafficLights dump) the indexes of its zones in the
/// city ZoneGraphStorage zones array. The client's AetherIntersectionManager resolves each
/// SyncAetherAIInitDatas entry by ZoneIndex against its baked StaticIntersectionData blob,
/// so these are the values ClientTrafficIntersectionInitInfo.ZoneIndex must carry.
/// Generated from readable_world_dump 03_ZONEGRAPHS vfc_1286_e108 + 04_WORLD_JSON vfc_1286_e104.
/// </summary>
public sealed class IntersectionZoneFile
{
[JsonPropertyName("source")]
public string Source { get; set; } = string.Empty;
[JsonPropertyName("intersections")]
public List<IntersectionZoneEntry> Intersections { get; set; } = [];
}
public sealed class IntersectionZoneEntry
{
[JsonPropertyName("id")]
public uint Id { get; set; }
[JsonPropertyName("zones")]
public List<int> Zones { get; set; } = [];
}
/// <summary>
/// The client's baked StaticIntersectionData.json (recovered from the L50 VFS, artifact 111):
/// the authoritative intersection zones for the city raid — one entry per signalized
/// intersection, with its real zone-graph ZoneIndex, position, traffic-light bindings and
/// per-period control tables. This is exactly what the client's AetherIntersectionManager
/// resolves against, so the ambient init must use these ZoneIndexes.
/// </summary>
public sealed class StaticIntersectionFile
{
[JsonPropertyName("ZoneInfos")]
public List<StaticZoneInfoEntry> ZoneInfos { get; set; } = [];
}
public sealed class StaticZoneInfoEntry
{
[JsonPropertyName("ZoneIndex")]
public int ZoneIndex { get; set; }
[JsonPropertyName("Position")]
public List<float> Position { get; set; } = [];
[JsonPropertyName("TrafficLights")]
public List<StaticTrafficLightEntry> TrafficLights { get; set; } = [];
[JsonPropertyName("TrafficLightPeriodControls")]
public List<StaticPeriodRowEntry> TrafficLightPeriodControls { get; set; } = [];
}
public sealed class StaticTrafficLightEntry
{
[JsonPropertyName("Index")]
public int Index { get; set; }
[JsonPropertyName("CrosswalkControlIndex")]
public int CrosswalkControlIndex { get; set; }
[JsonPropertyName("VehicleControlIndex")]
public int VehicleControlIndex { get; set; }
}
public sealed class StaticPeriodRowEntry
{
[JsonPropertyName("TrafficLightControls")]
public List<StaticLightControlEntry> TrafficLightControls { get; set; } = [];
[JsonPropertyName("VehicleLanesOpen")]
public List<int> VehicleLanesOpen { get; set; } = [];
}
public sealed class StaticLightControlEntry
{
[JsonPropertyName("TrafficLightStateFlags")]
public int TrafficLightStateFlags { get; set; }
}
/// <summary>One signalized intersection: its id and the zebra (stop-line group) indexes it controls.</summary>
public sealed class TrafficIntersectionEntry
{
[JsonPropertyName("id")]
public uint Id { get; set; }
[JsonPropertyName("zebras")]
public List<uint> Zebras { get; set; } = [];
}
public sealed class TrafficLightEntry