Small tweak to floor number display, increased chinthe speed, fix Return To Overworld option on floor clear menu

This commit is contained in:
2026-06-06 17:19:48 -07:00
parent 947d311f27
commit 72f8b5c050
11 changed files with 134 additions and 72 deletions
+47 -44
View File
@@ -27,6 +27,8 @@ public partial class Map : Node3D, IMap
public AutoProp<int> CurrentFloorNumber { get; private set; } = new AutoProp<int>(0);
public AutoProp<string> CurrentFloorDisplayString { get; private set; } = new AutoProp<string>(string.Empty);
private readonly string _floorFilePath = @"res://src/map/dungeon/floors/";
public event Action<(Vector3 Rotation, Vector3 Position)> SpawnPointCreated;
@@ -37,29 +39,30 @@ public partial class Map : Node3D, IMap
public void OnResolved()
{
AnimationPlayer.AnimationFinished += AnimationPlayer_AnimationFinished;
this.Provide();
AnimationPlayer.AnimationFinished += AnimationPlayer_AnimationFinished;
this.Provide();
}
private async void AnimationPlayer_AnimationFinished(StringName animName)
{
if (animName == "fade_out")
{
await LoadNewFloor();
FloorLoaded?.Invoke();
}
if (animName == "fade_out")
{
await LoadNewFloor();
FloorLoaded?.Invoke();
}
}
private async Task LoadNewFloor()
{
SpawnPointCreated?.Invoke((Vector3.Forward, new Vector3(-999, -999, -999)));
var newFloor = await LoadNewFloor(_sceneName);
ClearFloor();
AddChild(newFloor);
InitializeFloor(newFloor);
var floor = MapOrder.GetChildren().OfType<FloorNode>().ElementAt(CurrentFloorNumber.Value);
if (CurrentFloor is DungeonFloor dungeonFloor && floor is DungeonFloorNode dungeonFloorNode)
dungeonFloor.SpawnEnemies(dungeonFloorNode);
SpawnPointCreated?.Invoke((Vector3.Forward, new Vector3(-999, -999, -999)));
var newFloor = await LoadNewFloor(_sceneName);
ClearFloor();
AddChild(newFloor);
InitializeFloor(newFloor);
var floor = MapOrder.GetChildren().OfType<FloorNode>().ElementAt(CurrentFloorNumber.Value);
if (CurrentFloor is DungeonFloor dungeonFloor && floor is DungeonFloorNode dungeonFloorNode)
dungeonFloor.SpawnEnemies(dungeonFloorNode);
CurrentFloorDisplayString.OnNext(floor.DisplayedFloorNumber);
}
public void FadeIn() => AnimationPlayer.Play("fade_in");
@@ -67,49 +70,49 @@ public partial class Map : Node3D, IMap
public void InitializeMapData()
{
CurrentFloorNumber.OnNext(-1);
CurrentFloorNumber.OnNext(-1);
}
public IDungeonRoom GetPlayersCurrentRoom()
{
var rooms = CurrentFloor.Rooms;
var playersRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
return playersRoom;
var rooms = CurrentFloor.Rooms;
var playersRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
return playersRoom;
}
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPosition()
{
var spawnPoint = CurrentFloor.GetPlayerSpawnPoint();
return (spawnPoint.Rotation, spawnPoint.Position);
var spawnPoint = CurrentFloor.GetPlayerSpawnPoint();
return (spawnPoint.Rotation, spawnPoint.Position);
}
public void ClearFloor()
{
CurrentFloor?.CallDeferred(MethodName.QueueFree, []);
CurrentFloor?.CallDeferred(MethodName.QueueFree, []);
}
public async Task LoadFloor()
{
var floor = MapOrder.GetChildren().OfType<FloorNode>().ElementAt(CurrentFloorNumber.Value + 1);
var sceneToLoad = LayoutToScenePathConverter.Convert(floor);
await LoadFloor(sceneToLoad);
var floor = MapOrder.GetChildren().OfType<FloorNode>().ElementAt(CurrentFloorNumber.Value + 1);
var sceneToLoad = LayoutToScenePathConverter.Convert(floor);
await LoadFloor(sceneToLoad);
}
public async Task LoadFloor(string sceneName)
{
CallDeferred(MethodName.FadeOut);
_sceneName = sceneName;
var dimmableAudio = GetTree().GetNodesInGroup("DimmableAudio").OfType<IDimmableAudioStreamPlayer>();
foreach (var node in dimmableAudio)
node.FadeOut();
CallDeferred(MethodName.FadeOut);
_sceneName = sceneName;
var dimmableAudio = GetTree().GetNodesInGroup("DimmableAudio").OfType<IDimmableAudioStreamPlayer>();
foreach (var node in dimmableAudio)
node.FadeOut();
}
private void InitializeFloor(Node newFloor)
{
CurrentFloor = (IDungeonFloor)newFloor;
SetupDungeonFloor();
CurrentFloor.FloorIsLoaded = true;
CurrentFloorNumber.OnNext(CurrentFloorNumber.Value + 1);
CurrentFloor = (IDungeonFloor)newFloor;
SetupDungeonFloor();
CurrentFloor.FloorIsLoaded = true;
CurrentFloorNumber.OnNext(CurrentFloorNumber.Value + 1);
if (CurrentFloor is SpecialFloor)
Game.ShowMinimap(false);
else
@@ -118,19 +121,19 @@ public partial class Map : Node3D, IMap
private async Task<Node> LoadNewFloor(string sceneName)
{
var sceneLoader = new SceneLoader();
AddChild(sceneLoader);
sceneLoader.LoadSceneRequest(sceneName);
await ToSignal(sceneLoader, SceneLoader.SignalName.SceneLoaded);
var result = sceneLoader.LoadedScene;
sceneLoader.QueueFree();
return result;
var sceneLoader = new SceneLoader();
AddChild(sceneLoader);
sceneLoader.LoadSceneRequest(sceneName);
await ToSignal(sceneLoader, SceneLoader.SignalName.SceneLoaded);
var result = sceneLoader.LoadedScene;
sceneLoader.QueueFree();
return result;
}
private void SetupDungeonFloor()
{
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
SpawnPointCreated?.Invoke(transform);
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
SpawnPointCreated?.Invoke(transform);
}
}