Dungeon player and teleport randomization

This commit is contained in:
2024-09-12 12:41:52 -07:00
parent 043d7f1ba8
commit 875fa026df
11 changed files with 86 additions and 63 deletions

View File

@@ -21,23 +21,56 @@ public partial class DungeonFloor : Node3D, IDungeonFloor
[Node] public GodotObject DungeonGenerator { get; set; } = default!;
private Vector3 _playerSpawnPoint;
private Vector3 _teleportSpawnPoint;
internal List<IDungeonRoom> Rooms { get; private set; }
public void InitializeDungeon()
{
Rooms = new List<IDungeonRoom>();
DungeonGenerator.Call("generate");
Rooms = FindAllDungeonRooms(GetChildren().ToList(), Rooms);
Rooms = FindAllDungeonRooms([.. GetChildren()], Rooms);
_playerSpawnPoint = RandomizePlayerSpawnPoint();
_teleportSpawnPoint = RandomizeTeleportSpawnPointAwayFromPosition(_playerSpawnPoint);
}
public Vector3 GetPlayerSpawnPoint()
public Vector3 GetPlayerSpawnPoint() => _playerSpawnPoint;
public Vector3 GetTeleportSpawnPoint() => _teleportSpawnPoint;
private Vector3 RandomizePlayerSpawnPoint()
{
return Rooms.First().PlayerSpawn.GlobalPosition;
var rng = new RandomNumberGenerator();
rng.Randomize();
var rngDistribution = new List<float>();
var randomSpawnLocations = Rooms
.Select(x => x.PlayerSpawn);
var godotCollection = new Godot.Collections.Array<Marker3D>(randomSpawnLocations);
var result = godotCollection.PickRandom();
return result.GlobalPosition;
}
public Vector3 GetTeleportSpawnPoint()
private Vector3 RandomizeTeleportSpawnPointAwayFromPosition(Vector3 target)
{
return Rooms.First().TeleportSpawn.GlobalPosition;
var rng = new RandomNumberGenerator();
rng.Randomize();
var rngDistribution = new List<float>();
var roomsSortedByDistance = Rooms
.Select(x => x.TeleportSpawn.GlobalPosition)
.OrderByDescending(x => x.DistanceTo(target))
.ToArray();
var rngIndex = 1.0;
var rngSteps = rngIndex / roomsSortedByDistance.Count();
foreach (var room in roomsSortedByDistance)
{
rngIndex -= rngSteps;
rngDistribution.Add((float)rngIndex);
}
var result = roomsSortedByDistance[rng.RandWeighted([.. rngDistribution])];
return result;
}
private List<IDungeonRoom> FindAllDungeonRooms(List<Node> nodesToSearch, List<IDungeonRoom> roomsFound)

View File

@@ -17,7 +17,6 @@ public partial class Overworld : Node3D, IDungeonFloor
public void InitializeDungeon()
{
GameRepo.SetPlayerGlobalPosition(PlayerSpawnPoint.GlobalPosition);
}
public Vector3 GetPlayerSpawnPoint()