Files
sbox-public/engine/Sandbox.AppSystem/StandaloneAppSystem.cs
2025-11-24 23:39:25 +01:00

77 lines
1.7 KiB
C#

using Sandbox.Engine;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
namespace Sandbox;
public class StandaloneAppSystem : AppSystem
{
private StandaloneManifest LoadManifest()
{
// Load game info from file
var manifestPath = Path.Combine( Standalone.GamePath, Standalone.ManifestName );
var manifestContents = File.ReadAllText( manifestPath );
var properties = JsonSerializer.Deserialize<StandaloneManifest>( manifestContents );
return properties;
}
public override void Init()
{
LoadSteamDll();
base.Init();
// Standalone setup
Standalone.SetupFromManifest( LoadManifest() );
Application.IsStandalone = true;
Application.AppId = Standalone.Manifest.AppId;
CreateGame();
var createInfo = new AppSystemCreateInfo()
{
WindowTitle = Standalone.Manifest.Name,
Flags = AppSystemFlags.IsGameApp | AppSystemFlags.IsStandaloneGame
};
if ( Utility.CommandLine.HasSwitch( "-headless" ) )
createInfo.Flags |= AppSystemFlags.IsConsoleApp;
InitGame( createInfo );
LoadStandaloneGame();
}
private Task _standaloneLoadTask;
private void LoadStandaloneGame()
{
_standaloneLoadTask = IGameInstanceDll.Current.LoadGamePackageAsync( Standalone.Manifest.Ident, GameLoadingFlags.Host, default );
}
protected override bool RunFrame()
{
EngineLoop.RunFrame( _appSystem, out bool wantsToQuit );
// Still loading
if ( _standaloneLoadTask is not null )
{
if ( _standaloneLoadTask.IsCompleted )
{
_standaloneLoadTask.GetAwaiter().GetResult();
_standaloneLoadTask = null;
}
}
// Quit next loop after load, if we are testing
else if ( Utility.CommandLine.HasSwitch( "-test-standalone" ) )
{
Application.Exit();
}
return !wantsToQuit;
}
}