cirnogodot/Scripts/GlobalState.cs

70 lines
2.2 KiB
C#
Raw Normal View History

2025-02-21 11:39:22 +01:00
using Cirno.Scripts.Resources;
2025-02-20 21:26:51 +01:00
using Godot;
public partial class GlobalState : Node
{
public static GlobalState Instance { get; private set; }
public Node CurrentScene { get; set; }
public override void _Ready()
{
Instance = this;
Viewport root = GetTree().Root;
// Using a negative index counts from the end, so this gets the last child node of `root`.
CurrentScene = root.GetChild(-1);
}
public void GotoScene(string path)
{
// This function will usually be called from a signal callback,
// or some other function from the current scene.
// Deleting the current scene at this point is
// a bad idea, because it may still be executing code.
// This will result in a crash or unexpected behavior.
// The solution is to defer the load to a later time, when
// we can be sure that no code from the current scene is running:
CallDeferred(MethodName.DeferredGotoScene, path, new MapStartDataResource());
2025-02-20 21:26:51 +01:00
}
2025-02-21 11:39:22 +01:00
public void GoToScene(string path, MapStartDataResource startData)
{
// TODO: Implement startdata usage
CallDeferred(MethodName.DeferredGotoScene, path, startData);
}
private void DeferredGotoScene(string path, MapStartDataResource startData = null)
2025-02-20 21:26:51 +01:00
{
// It is now safe to remove the current scene.
CurrentScene.Free();
// Load a new scene.
var nextScene = GD.Load<PackedScene>(path);
// Instance the new scene.
CurrentScene = nextScene.Instantiate();
// Add it to the active scene, as child of root.
GetTree().Root.AddChild(CurrentScene);
// Optionally, to make it compatible with the SceneTree.change_scene_to_file() API.
GetTree().CurrentScene = CurrentScene;
2025-02-21 11:39:22 +01:00
// // Update current scene here too
// CurrentScene = GetTree().Root.GetChild(-1);
2025-02-21 11:39:22 +01:00
if (startData is not null)
{
// Call deferred if it gives issues
DeferredAddStartDataToGameManager(startData);
}
2025-02-20 21:26:51 +01:00
}
2025-02-21 11:39:22 +01:00
private void DeferredAddStartDataToGameManager(MapStartDataResource resource)
{
GameManager.Instance.ApplyMapStartData(resource);
}
2025-02-20 21:26:51 +01:00
}