Вроде ок, осталось проверить на практике нормально, когда комнаты будут готовы

This commit is contained in:
Pe4enega committed 2025-11-15 21:31:40 +03:00
1 parent c6b097a879
commit 52edef92e3
10 files changed
+333 -27

No files matched your search

@@ -11,7 +11,7 @@ namespace Code.Generator
private RoomGeneratorFactory _factory;
private float _timer;
private List<int> _roomIndexesStack;
private List<int> _roomIndexesStack;
private List<Room> _spawnedRooms;
private async void Awake()
@@ -25,20 +25,37 @@ namespace Code.Generator
await _factory.PreloadRooms();
CreateRoomsStack();
await GenerateRoomsAsync();
CreateRoomsStack();
await GenerateRoomsAsync();
}
private void CreateRoomsStack()
{
_roomIndexesStack.Clear();
var remainingTime = _timer;
var ladderTimer = 0f;
float ladderTimer = 0f;
int totalRooms = generatorConfig.roomAssetReferences.Length;
List<int> availableIndexes = new List<int>();
for (int i = 0; i < totalRooms; i++)
availableIndexes.Add(i);
int saveIndex = FindRoomIndexByType(RoomType.Save);
if (saveIndex != -1)
{
var prefab = _factory.GetCachedPrefab(saveIndex);
if (prefab != null)
{
Room saveRoom = prefab.GetComponent<Room>();
if (saveRoom != null)
{
_roomIndexesStack.Add(saveIndex);
availableIndexes.Remove(saveIndex);
Debug.Log($"Первая комната: {saveRoom.name}");
}
}
}
while (remainingTime > 0 && availableIndexes.Count > 0)
{
int randomIndex = Random.Range(0, availableIndexes.Count);
@@ -47,33 +64,48 @@ namespace Code.Generator
var prefab = _factory.GetCachedPrefab(chosenOne);
if (prefab == null)
continue;
Room room = prefab.GetComponent<Room>();
if (room == null)
continue;
if (room.RoomType == RoomType.Basic)
switch (room.RoomType)
{
float currentRoomTime = room.RoomTimer;
if (remainingTime >= currentRoomTime && ladderTimer < 30f)
{
_roomIndexesStack.Add(chosenOne);
remainingTime -= currentRoomTime;
ladderTimer += currentRoomTime;
Debug.Log($"комната {room.name} время {currentRoomTime} осталось: {remainingTime}");
}
case RoomType.Save or RoomType.PickUp:
availableIndexes.RemoveAt(randomIndex);
continue;
case RoomType.Basic:
float currentRoomTime = room.RoomTimer;
if (remainingTime >= currentRoomTime && ladderTimer < 30f)
{
_roomIndexesStack.Add(chosenOne);
remainingTime -= currentRoomTime;
ladderTimer += currentRoomTime;
Debug.Log($"комната {room.name} время {currentRoomTime} осталось: {remainingTime}");
}
availableIndexes.RemoveAt(randomIndex);
break;
case RoomType.Ladder:
if (ladderTimer >= 30f)
{
_roomIndexesStack.Add(chosenOne);
ladderTimer = 0f;
availableIndexes.RemoveAt(randomIndex);
Debug.Log($"Лестница ура {room.name}");
}
break;
default:
Debug.Log($"тип комнаты {room.RoomType}");
availableIndexes.RemoveAt(randomIndex);
break;
}
else if (room.RoomType == RoomType.Ladder && ladderTimer >= 30f)
{
_roomIndexesStack.Add(chosenOne);
ladderTimer = 0f;
}
else
{
continue;
}
availableIndexes.RemoveAt(randomIndex);
}
AddPickupRoom();
Debug.Log($"стек комнат: {_roomIndexesStack.Count}");
}
@@ -98,12 +130,57 @@ namespace Code.Generator
_spawnedRooms.Add(room);
}
}
private void AddSaveZone(List<int> roomIndexes)
private int FindRoomIndexByType(RoomType neededType)
{
int totalRooms = generatorConfig.roomAssetReferences.Length;
for (int i = 0; i < totalRooms; i++)
{
var prefab = _factory.GetCachedPrefab(i);
if (prefab == null)
continue;
Room room = prefab.GetComponent<Room>();
if (room == null)
continue;
if (room.RoomType == neededType)
return i;
}
return -1;
}
private void AddPickupRoom()
{
int pickupIndex = FindRoomIndexByType(RoomType.PickUp);
if (pickupIndex == -1)
{
Debug.Log("PickUp комнат не найдено але");
return;
}
var prefab = _factory.GetCachedPrefab(pickupIndex);
if (prefab == null)
return;
Room pickupRoom = prefab.GetComponent<Room>();
if (pickupRoom == null)
return;
if (_roomIndexesStack.Count == 0)
{
Debug.LogWarning("стек пуст, нет позиции после первой");
return;
}
int insertPos = Random.Range(1, _roomIndexesStack.Count + 1);
_roomIndexesStack.Insert(insertPos, pickupIndex);
Debug.Log($"PickUp комната '{pickupRoom.name}' позиция {insertPos}");
}
private void PlaceRoom(Room current, Room previous)
{
if (current.EnterMarker == null || previous.ExitMarker == null)