acdream/src/AcDream.Runtime/Session/LiveSessionContracts.cs

54 lines
1.9 KiB
C#

using AcDream.Core.Net;
namespace AcDream.Runtime.Session;
public sealed record LiveSessionCharacterSelector(
int? ActiveIndex = null,
uint? CharacterId = null,
string? CharacterName = null);
public sealed record LiveSessionConnectOptions(
bool Enabled,
string Host,
int Port,
string User,
string Password,
LiveSessionCharacterSelector? Character = null,
/// <summary>
/// Campaign LA slice LA2: short-circuits
/// <see cref="LiveSessionController"/>'s connect transaction right after
/// the roster report (before <c>TrySelectCharacter</c>/
/// <c>ApplySelectedCharacter</c>/<c>EnterWorld</c>) — connect, receive
/// <c>CharacterList</c>, report the roster, gracefully disconnect via the
/// same <c>StopCore</c> teardown the <see cref="LiveSessionStartStatus.NoCharacters"/>
/// path already uses, and return
/// <see cref="LiveSessionStartStatus.ProbeComplete"/>. The pinned launch
/// contract (<c>docs/plans/2026-08-14-launcher-campaign.md</c> LA1's
/// <c>mode</c> field) requires a probe session to omit both
/// <see cref="Character"/> and its policy entirely, but the controller
/// itself does not enforce that pairing — the headless config loader
/// does, before a <see cref="LiveSessionConnectOptions"/> is ever built.
/// </summary>
bool Probe = false,
/// <summary>
/// Keep the connected transport in Runtime's pre-world selection state
/// instead of applying the legacy first-available fallback. Graphical
/// composition enables this only when no explicit selector was supplied;
/// direct/headless callers retain the existing default behavior.
/// </summary>
bool AwaitCharacterSelection = false);
public interface IRuntimeLiveSessionFramePhase
{
void Tick();
}
public interface ILiveSessionEventRouting : IDisposable
{
void Attach();
}
public interface ILiveSessionCommandRouting : IDisposable
{
void Activate();
}