Overhaul game state logic to support gameplay loop

This commit is contained in:
2025-04-30 00:43:55 -07:00
parent 78cdda97b9
commit 68c91d8f13
60 changed files with 2503 additions and 1116 deletions

View File

@@ -1,5 +1,4 @@
using Chickensoft.AutoInject;
using Chickensoft.GodotNodeInterfaces;
using Chickensoft.Introspection;
using Chickensoft.SaveFileBuilder;
using Godot;
@@ -9,24 +8,6 @@ using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
public interface IMap : INode3D, IProvide<ISaveChunk<MapData>>
{
void LoadMap();
List<string> FloorScenes { get; }
IDungeonFloor CurrentFloor { get; }
void SpawnNextFloor();
Transform3D GetPlayerSpawnPosition();
IDungeonRoom GetPlayersCurrentRoom();
public int CurrentFloorNumber { get; }
}
[Meta(typeof(IAutoNode))]
public partial class Map : Node3D, IMap
{
@@ -50,7 +31,7 @@ public partial class Map : Node3D, IMap
[Export]
private Godot.Collections.Array<PackedScene> _floors { get; set; } = default!;
public List<string> FloorScenes { get; private set; }
public List<string> FloorScenes { get; private set; } = [];
public IDungeonFloor CurrentFloor { get; private set; }
@@ -58,66 +39,77 @@ public partial class Map : Node3D, IMap
public void OnResolved()
{
FloorScenes = [];
MapChunk = new SaveChunk<MapData>(
onSave: (chunk) => new MapData()
{
FloorScenes = FloorScenes,
},
onLoad: (chunk, data) =>
{
FloorScenes = data.FloorScenes;
}
);
MapChunk = new SaveChunk<MapData>(
onSave: (chunk) => new MapData()
{
FloorScenes = FloorScenes,
},
onLoad: (chunk, data) =>
{
FloorScenes = data.FloorScenes;
}
);
GameChunk.AddChunk(MapChunk);
GameChunk.AddChunk(MapChunk);
this.Provide();
this.Provide();
InitializeMapData();
}
public void InitializeMapData()
{
ClearMap();
FloorScenes = [];
foreach (var floor in _floors)
FloorScenes.Add(floor.ResourcePath);
CurrentFloorNumber = 0;
}
public void LoadMap()
{
foreach (var floor in _floors)
FloorScenes.Add(floor.ResourcePath);
LoadFloor();
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
Player.TeleportPlayer(transform);
CurrentFloor.FloorIsLoaded = true;
}
LoadFloor();
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
Player.TeleportPlayer(transform);
CurrentFloor.FloorIsLoaded = true;
Game.NextFloorLoaded();
private void ClearMap()
{
CurrentFloor?.CallDeferred(MethodName.QueueFree, []);
}
public void SpawnNextFloor()
{
var oldFloor = CurrentFloor;
oldFloor.CallDeferred(MethodName.QueueFree, []);
LoadFloor();
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
Player.TeleportPlayer(transform);
CurrentFloor.FloorIsLoaded = true;
Game.NextFloorLoaded();
CurrentFloorNumber += 1;
ClearMap();
LoadFloor();
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
Player.TeleportPlayer(transform);
CurrentFloor.FloorIsLoaded = true;
CurrentFloorNumber += 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 Transform3D GetPlayerSpawnPosition() => CurrentFloor.GetPlayerSpawnPoint();
private void LoadFloor()
public void LoadFloor()
{
var currentFloorScene = FloorScenes.First();
var instantiator = new Instantiator(GetTree());
var loadedScene = instantiator.LoadAndInstantiate<Node3D>(currentFloorScene);
AddChild(loadedScene);
CurrentFloor = (IDungeonFloor)loadedScene;
FloorScenes.Remove(currentFloorScene);
ClearMap();
var currentFloorScene = FloorScenes.First();
var instantiator = new Instantiator(GetTree());
var loadedScene = instantiator.LoadAndInstantiate<Node3D>(currentFloorScene);
AddChild(loadedScene);
CurrentFloor = (IDungeonFloor)loadedScene;
FloorScenes.Remove(currentFloorScene);
var transform = GetPlayerSpawnPosition();
Player.TeleportPlayer(transform);
}
}