Revamp map route stuff

This commit is contained in:
2026-06-11 20:53:16 -07:00
parent fc598ab48f
commit 403b136c5c
34 changed files with 731 additions and 559 deletions
+100 -78
View File
@@ -18,30 +18,34 @@ public partial class Map : Node3D, IMap
[Dependency]
public IGame Game => this.DependOn<IGame>();
[Node]
public Node MapOrder { get; set; } = default!;
[Node]
public AnimationPlayer AnimationPlayer { get; set; } = default!;
public IDungeonFloor CurrentFloor { get; private set; }
public AutoProp<int> CurrentFloorNumber { get; private set; } = new AutoProp<int>(0);
public AutoProp<string> CurrentFloorDisplayString { get; private set; } = new AutoProp<string>(string.Empty);
public string NextFloorDisplayString => MapOrder.GetChildren().OfType<FloorNode>().ElementAt(CurrentFloorNumber.Value + 1).DisplayedFloorNumber;
private readonly string _floorFilePath = @"res://src/map/dungeon/floors/";
public event Action<(Vector3 Rotation, Vector3 Position)> SpawnPointCreated;
[Export]
public Array<FloorResourceType> FloorOrder { get; set; } = [];
public Array<FloorScene> FloorRoute { get; private set; }
[Export] public Array<FloorScene> BaseRoute { get; set; }
[Export] public Array<FloorScene> NormalEndRoute { get; set; }
[Export] public Array<FloorScene> TrueEndRoute { get; set; }
[Export] public Array<FloorScene> BadEndRoute { get; set; }
public AutoProp<FloorScene> CurrentSelectedFloor { get; set; }
public event Action FloorLoaded;
private string _sceneName;
private string _floorToLoad;
public override void _EnterTree()
{
FloorRoute = [.. BaseRoute];
CurrentSelectedFloor = new AutoProp<FloorScene>(FloorRoute.First());
}
public void OnResolved()
{
@@ -52,47 +56,93 @@ public partial class Map : Node3D, IMap
private async void AnimationPlayer_AnimationFinished(StringName animName)
{
if (animName == "fade_out")
{
await LoadNewFloor();
FloorLoaded?.Invoke();
}
await ContinueLoadingFloor(_floorToLoad);
}
private async Task LoadNewFloor()
public void ShowMap() => FadeIn();
private void FadeIn() => AnimationPlayer.Play("fade_in");
private void FadeOut() => AnimationPlayer.Play("fade_out");
public void EndCurrentGame()
{
CleanupCurrentFloor();
ClearFloor();
FloorRoute = [.. BaseRoute];
}
public async Task LoadFloor(FloorScene floorToLoad)
{
Game.Pause();
// Clean up current floor
CleanupCurrentFloor();
// Start loading new floor
var filePath = FloorScenePathConverter.Convert(floorToLoad);
_floorToLoad = filePath;
FadeOut();
}
public async Task LoadFloorByPath(string filePath)
{
Game.Pause();
// Clean up current floor
CleanupCurrentFloor();
// Start loading new floor
_floorToLoad = filePath;
FadeOut();
}
public void AddNormalRoute()
{
FloorRoute.AddRange(NormalEndRoute);
}
public void AddTrueRoute()
{
FloorRoute.AddRange(TrueEndRoute);
}
public void AddBadEndRoute()
{
FloorRoute.AddRange(BadEndRoute);
}
public void ResetToBaseRoute()
{
FloorRoute = [.. BaseRoute];
CurrentSelectedFloor = new AutoProp<FloorScene>(FloorRoute.First());
}
private async Task ContinueLoadingFloor(string filePath)
{
SpawnPointCreated?.Invoke((Vector3.Forward, new Vector3(-999, -999, -999)));
var newFloor = await LoadNewFloor(_sceneName);
var newFloor = await LoadSceneFile(filePath);
// New floor created, remove old floor
ClearFloor();
// Setup new floor
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);
CurrentFloor = newFloor as IDungeonFloor;
CurrentFloor.InitializeDungeon();
SpawnPointCreated?.Invoke(CurrentFloor.GetPlayerSpawnPoint());
if (CurrentFloor is SpecialFloor)
Game.ShowMinimap(false);
else
Game.ShowMinimap(true);
SpawnEnemies();
CurrentFloor.FloorIsLoaded = true;
FloorLoaded?.Invoke();
}
public void FadeIn() => AnimationPlayer.Play("fade_in");
public void FadeOut() => AnimationPlayer.Play("fade_out");
public void InitializeMapData()
private void CleanupCurrentFloor()
{
CurrentFloorNumber.OnNext(-1);
var dimmableAudio = GetTree().GetNodesInGroup("DimmableAudio").OfType<IDimmableAudioStreamPlayer>();
foreach (var node in dimmableAudio)
node.FadeOut();
}
public IDungeonRoom GetPlayersCurrentRoom()
{
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);
}
public void ClearFloor()
private void ClearFloor()
{
try
{
@@ -105,35 +155,7 @@ public partial class Map : Node3D, IMap
}
}
public async Task LoadFloor()
{
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();
}
private void InitializeFloor(Node newFloor)
{
CurrentFloor = (IDungeonFloor)newFloor;
SetupDungeonFloor();
CurrentFloor.FloorIsLoaded = true;
CurrentFloorNumber.OnNext(CurrentFloorNumber.Value + 1);
if (CurrentFloor is SpecialFloor)
Game.ShowMinimap(false);
else
Game.ShowMinimap(true);
}
private async Task<Node> LoadNewFloor(string sceneName)
private async Task<Node> LoadSceneFile(string sceneName)
{
var sceneLoader = new SceneLoader();
AddChild(sceneLoader);
@@ -144,10 +166,10 @@ public partial class Map : Node3D, IMap
return result;
}
private void SetupDungeonFloor()
private void SpawnEnemies()
{
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
SpawnPointCreated?.Invoke(transform);
var monsterRooms = CurrentFloor.Rooms.OfType<MonsterRoom>();
foreach (var room in monsterRooms)
room.SpawnEnemies(CurrentSelectedFloor.Value.EnemySpawnTable);
}
}
}