Files
GameJamDungeon/Zennysoft.Game.Ma/src/map/Map.cs
Pal 09abd588c2 -World Environment Mess Arounds
-Player Height Change
-Altar Sky Video Import Test
-Manually Changed Shading On for a few materials on Altar that weren't switched over
2025-09-09 03:33:10 -07:00

118 lines
2.8 KiB
C#

using Chickensoft.AutoInject;
using Chickensoft.Collections;
using Chickensoft.Introspection;
using Chickensoft.LogicBlocks;
using Chickensoft.SaveFileBuilder;
using Godot;
using System.Collections.Generic;
using System.Linq;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
public partial class Map : Node3D, IMap
{
public override void _Notification(int what) => this.Notify(what);
[Dependency]
public IGame Game => this.DependOn<IGame>();
[Dependency]
public IPlayer Player => this.DependOn<IPlayer>();
#region Save
public ISaveChunk<MapData> MapChunk { get; set; } = default!;
ISaveChunk<MapData> IProvide<ISaveChunk<MapData>>.Value() => MapChunk;
[Dependency]
public ISaveChunk<GameData> GameChunk => this.DependOn<ISaveChunk<GameData>>();
#endregion
[Export]
private Godot.Collections.Array<PackedScene> _floors { get; set; } = default!;
public List<string> FloorScenes { get; private set; } = [];
public IDungeonFloor CurrentFloor { get; private set; }
public AutoProp<int> CurrentFloorNumber { get; private set; } = new AutoProp<int>(0);
public void OnResolved()
{
MapChunk = new SaveChunk<MapData>(
onSave: (chunk) => new MapData()
{
FloorScenes = FloorScenes,
},
onLoad: (chunk, data) =>
{
FloorScenes = data.FloorScenes;
}
);
GameChunk.AddChunk(MapChunk);
this.Provide();
InitializeMapData();
}
public void InitializeMapData()
{
ClearMap();
FloorScenes = [];
foreach (var floor in _floors)
FloorScenes.Add(floor.ResourcePath);
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;
var playersRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
return playersRoom;
}
public Transform3D GetPlayerSpawnPosition() => CurrentFloor.GetPlayerSpawnPoint();
public void LoadFloor()
{
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);
}
}