Dungeon player and teleport randomization
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -17,7 +17,6 @@ public partial class Overworld : Node3D, IDungeonFloor
|
||||
|
||||
public void InitializeDungeon()
|
||||
{
|
||||
GameRepo.SetPlayerGlobalPosition(PlayerSpawnPoint.GlobalPosition);
|
||||
}
|
||||
|
||||
public Vector3 GetPlayerSpawnPoint()
|
||||
|
||||
Reference in New Issue
Block a user