Rework loading maps to be asynchronous, change debug menu so that its not completely pausing the game

This commit is contained in:
2025-09-26 14:05:05 -07:00
parent 578cde65cc
commit 9107b8c570
10 changed files with 164 additions and 95 deletions

View File

@@ -1,12 +1,13 @@
using Chickensoft.AutoInject;
using Chickensoft.Collections;
using Chickensoft.Introspection;
using Chickensoft.LogicBlocks;
using Chickensoft.SaveFileBuilder;
using Godot;
using System.Collections.Generic;
using Godot.Collections;
using System.Collections.Immutable;
using System.Linq;
using System.Threading.Tasks;
using Zennysoft.Game.Implementation;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
@@ -27,12 +28,15 @@ public partial class Map : Node3D, IMap
ISaveChunk<MapData> IProvide<ISaveChunk<MapData>>.Value() => MapChunk;
[Node]
public AnimationPlayer AnimationPlayer { get; set; } = default!;
[Dependency]
public ISaveChunk<GameData> GameChunk => this.DependOn<ISaveChunk<GameData>>();
#endregion
[Export]
private Godot.Collections.Array<Floor> Floors { get; set; } = default!;
private Array<Floor> Floors { get; set; } = default!;
public ImmutableDictionary<Floor, string> FloorScenes { get; private set; }
@@ -51,7 +55,6 @@ public partial class Map : Node3D, IMap
public void InitializeMapData()
{
ClearMap();
FloorScenes = ImmutableDictionary<Floor, string>.Empty
.Add(Floor.Overworld, $"res://src/map/overworld/Overworld.tscn")
.Add(Floor.Altar, $"res://src/map/dungeon/floors/Floor00.tscn")
@@ -68,31 +71,6 @@ public partial class Map : Node3D, IMap
CurrentFloorNumber.OnNext(0);
}
public void LoadMap()
{
LoadFloor();
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
Player.TeleportPlayer(transform);
CurrentFloor.FloorIsLoaded = true;
}
private void ClearMap()
{
CurrentFloor?.CallDeferred(MethodName.QueueFree, []);
}
public void SpawnNextFloor()
{
ClearMap();
LoadFloor();
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
Player.TeleportPlayer(transform);
CurrentFloor.FloorIsLoaded = true;
CurrentFloorNumber.OnNext(CurrentFloorNumber.Value + 1);
}
public IDungeonRoom GetPlayersCurrentRoom()
{
var rooms = CurrentFloor.Rooms;
@@ -102,15 +80,33 @@ public partial class Map : Node3D, IMap
public Transform3D GetPlayerSpawnPosition() => CurrentFloor.GetPlayerSpawnPoint();
public void LoadFloor()
public async Task LoadFloor()
{
ClearMap();
FloorScenes.TryGetValue(Floors.First(), out var currentFloorScene);
var instantiator = new Instantiator(GetTree());
var loadedScene = instantiator.LoadAndInstantiate<Node3D>(currentFloorScene);
AddChild(loadedScene);
CurrentFloor = (IDungeonFloor)loadedScene;
AnimationPlayer.CallDeferred(AnimationPlayer.MethodName.Play, "fade_out");
FloorScenes.TryGetValue(Floors.First(), out var sceneToLoad);
ClearCurrentMap();
var sceneLoader = new SceneLoader();
AddChild(sceneLoader);
sceneLoader.LoadSceneRequest(sceneToLoad);
await ToSignal(sceneLoader, SceneLoader.SignalName.SceneLoaded);
AddChild(sceneLoader.LoadedScene);
CurrentFloor = (IDungeonFloor)sceneLoader.LoadedScene;
SetupDungeonFloor();
CurrentFloor.FloorIsLoaded = true;
CurrentFloorNumber.OnNext(CurrentFloorNumber.Value + 1);
sceneLoader.QueueFree();
AnimationPlayer.CallDeferred(AnimationPlayer.MethodName.Play, ("fade_in"));
}
private void ClearCurrentMap()
{
CurrentFloor?.CallDeferred(MethodName.QueueFree, []);
Floors.Remove(Floors.First());
}
private void SetupDungeonFloor()
{
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
Player.TeleportPlayer(transform);
}