#nullable enable using System; using Demo2.Domain; using UnityEngine; namespace Demo2.Runtime { public sealed class Demo2HeadlessBootstrap : MonoBehaviour { private Demo2GameService? _service; private Demo2LanRuntime? _lan; private void Awake() { var args = Environment.GetCommandLineArgs(); if (!Application.isBatchMode && Array.IndexOf(args, "-demo2-headless") < 0) { enabled = false; return; } var port = ReadInt(args, "-demo2-port", 27320); var mode = ReadString(args, "-demo2-transport", "tcp").Equals("kcp", StringComparison.OrdinalIgnoreCase) ? Demo2TransportMode.Kcp : Demo2TransportMode.Tcp; var seed = (ulong)ReadInt(args, "-demo2-seed", 20260817); _service = Demo2GameService.Current ?? new Demo2GameService(); _service.StartNewGame(seed); _lan = new Demo2LanRuntime(_service); _lan.Host(port, mode, "headless"); Debug.Log($"[Demo2] Headless server ready. transport={mode} port={port} seed={seed}"); } private void Update() { _lan?.Pump(); _service?.AdvanceFrame(Time.unscaledDeltaTime); } private void OnDestroy() => _lan?.Dispose(); private static int ReadInt(string[] args, string key, int fallback) { var index = Array.IndexOf(args, key); return index >= 0 && index + 1 < args.Length && int.TryParse(args[index + 1], out var value) ? value : fallback; } private static string ReadString(string[] args, string key, string fallback) { var index = Array.IndexOf(args, key); return index >= 0 && index + 1 < args.Length ? args[index + 1] : fallback; } } }