Add debug foundation
This commit is contained in:
110
godot/scripts/debug/DebugCommandNode.cs
Normal file
110
godot/scripts/debug/DebugCommandNode.cs
Normal file
@@ -0,0 +1,110 @@
|
||||
#nullable enable
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Godot;
|
||||
using SideScrollerGame.Content.Samples;
|
||||
using SideScrollerGame.Debug.Commands;
|
||||
|
||||
namespace SideScrollerGame.Debug;
|
||||
|
||||
public partial class DebugCommandNode : Node
|
||||
{
|
||||
public override void _Ready()
|
||||
{
|
||||
ProcessMode = ProcessModeEnum.Always;
|
||||
_ = Service;
|
||||
ApplyEngineState();
|
||||
}
|
||||
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
if (m_PendingFrameStep)
|
||||
{
|
||||
GetTree().Paused = State.IsPaused;
|
||||
m_PendingFrameStep = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (State.FrameStepRequestCount <= m_AppliedFrameStepCount)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_AppliedFrameStepCount = State.FrameStepRequestCount;
|
||||
GetTree().Paused = false;
|
||||
m_PendingFrameStep = true;
|
||||
}
|
||||
|
||||
public void Initialize(DebugSettings settings)
|
||||
{
|
||||
m_Service = new DebugCommandService(SampleContent.CreateRegistry(), settings.Seed);
|
||||
m_Service.StateChanged += _ => ApplyEngineState();
|
||||
GD.Seed((ulong)settings.Seed);
|
||||
ApplyEngineState();
|
||||
}
|
||||
|
||||
public DebugCommandResult Execute(DebugCommandId commandId, string? argument = null)
|
||||
{
|
||||
DebugCommandResult result = Service.Execute(commandId, argument);
|
||||
if (!result.Succeeded)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
if (commandId == DebugCommandId.SetSeed && int.TryParse(argument, out int seed))
|
||||
{
|
||||
GD.Seed((ulong)seed);
|
||||
}
|
||||
else if (commandId == DebugCommandId.ReloadScene)
|
||||
{
|
||||
ReloadScene();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public DebugCommandService Service
|
||||
{
|
||||
get
|
||||
{
|
||||
if (m_Service is null)
|
||||
{
|
||||
m_Service = new DebugCommandService(SampleContent.CreateRegistry(), 1);
|
||||
m_Service.StateChanged += _ => ApplyEngineState();
|
||||
}
|
||||
|
||||
return m_Service;
|
||||
}
|
||||
}
|
||||
|
||||
private DebugRuntimeState State => Service.State;
|
||||
|
||||
private void ApplyEngineState()
|
||||
{
|
||||
Engine.TimeScale = State.TimeScale;
|
||||
if (!m_PendingFrameStep)
|
||||
{
|
||||
GetTree().Paused = State.IsPaused;
|
||||
}
|
||||
}
|
||||
|
||||
private void ReloadScene()
|
||||
{
|
||||
if (IsHeadlessSmokeScript())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
GetTree().ReloadCurrentScene();
|
||||
}
|
||||
|
||||
private static bool IsHeadlessSmokeScript()
|
||||
{
|
||||
return DisplayServer.GetName().Equals("headless", StringComparison.OrdinalIgnoreCase) && OS.GetCmdlineUserArgs().Any(argument => argument.Equals("--debug-script=foundation-smoke", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
private DebugCommandService? m_Service;
|
||||
private int m_AppliedFrameStepCount;
|
||||
private bool m_PendingFrameStep;
|
||||
}
|
||||
Reference in New Issue
Block a user