diff --git a/src/system/xnet_transport.cpp b/src/system/xnet_transport.cpp index 1bb3ffa..1c8486a 100644 --- a/src/system/xnet_transport.cpp +++ b/src/system/xnet_transport.cpp @@ -198,6 +198,16 @@ void XNetTransport::ForceLiveFlag() { }; force_byte(0x8308396C, "0x8308396C (live user exists)"); force_byte(0x83084690, "0x83084690 (online access)"); + // The party state machine (sub_82A1B310) can't leave state 1 unless the + // game's EA-Nation flag (party+417) is 1 - it is set at party-create from + // a config-string comparison that never matches in the recomp. The party + // struct is a static object at 0x82FD9750, so force its gate bytes: + // +417 = EA-Nation enabled (state 1 gate) + // +421 = online flag (set by the EA resolver alongside the online IP) + // +423 = 'EA connected' marker (state 6 target, unlocks advertise/join) + force_byte(0x82FD98F1, "party+417 (EA-Nation flag)"); + force_byte(0x82FD98F5, "party+421 (online flag)"); + force_byte(0x82FD98F7, "party+423 (EA connected)"); // Broadcast the Live signin-changed event a few times at startup so the // game's sign-in manager runs and designates the profile as the live user // (it only does this when it processes a real signin notification, which