using System.Collections.Generic;
using System.Threading.Tasks;
using ColdMint.scripts.debug;
using ColdMint.scripts.map.interfaces;
namespace ColdMint.scripts.map;
///
/// Map generator
/// 地图生成器
///
///
///Responsible for the overall map generation process control
///负责地图的整体生成流程控制
///
public static class MapGenerator
{
///
/// Layout map selection strategy
/// 布局图选择策略
///
private static ILayoutStrategy? _layoutStrategy;
///
/// Room placement strategy
/// 房间的放置策略
///
private static IRoomPlacementStrategy? _roomPlacementStrategy;
///
/// Layout diagram parsing policy
/// 布局图解析策略
///
private static ILayoutParsingStrategy? _layoutParsingStrategy;
public static ILayoutParsingStrategy? LayoutParsingStrategy
{
get => _layoutParsingStrategy;
set => _layoutParsingStrategy = value;
}
public static IRoomPlacementStrategy? RoomPlacementStrategy
{
get => _roomPlacementStrategy;
set => _roomPlacementStrategy = value;
}
public static ILayoutStrategy? LayoutStrategy
{
get => _layoutStrategy;
set => _layoutStrategy = value;
}
///
/// Generating a map
/// 生成地图
///
public static async Task GenerateMap()
{
if (_layoutStrategy == null || _roomPlacementStrategy == null || _layoutParsingStrategy == null)
{
LogCat.LogError("map_generator_missing_parameters");
return;
}
//Get the layout data
//拿到布局图数据
var levelGraphEditorSaveData = await _layoutStrategy.GetLayout();
if (levelGraphEditorSaveData.RoomNodeDataList == null || levelGraphEditorSaveData.RoomNodeDataList.Count == 0)
{
LogCat.LogError("map_generator_attempts_to_parse_empty_layout_diagrams");
return;
}
_layoutParsingStrategy.SetLevelGraph(levelGraphEditorSaveData);
//Save the dictionary, put the ID in the room data, corresponding to the successful placement of the room.
//保存字典,将房间数据内的ID,对应放置成功的房间。
var roomDictionary = new Dictionary();
while (await _layoutParsingStrategy.HasNext())
{
//When a new room needs to be placed
//当有新的房间需要放置时
var roomNodeData = await _layoutParsingStrategy.Next();
if (roomNodeData == null)
{
continue;
}
var nextParentNodeId = await _layoutParsingStrategy.GetNextParentNodeId();
IRoom? parentRoomNode = null;
if (nextParentNodeId != null)
{
//If the new room has the parent's ID, then we pass the parent's room into the compute function.
//如果新房间有父节点的ID,那么我们将父节点的房间传入到计算函数内。
parentRoomNode = roomDictionary[nextParentNodeId];
}
var roomPlacementData =
await _roomPlacementStrategy.CalculateNewRoomPlacementData(parentRoomNode, roomNodeData);
if (roomPlacementData == null)
{
continue;
}
if (!await _roomPlacementStrategy.PlaceRoom(roomPlacementData))
{
continue;
}
if (!string.IsNullOrEmpty(roomNodeData.Id) && roomPlacementData.Room != null)
{
roomDictionary.Add(roomNodeData.Id, roomPlacementData.Room);
}
}
//All rooms have been placed.
//所有房间已放置完毕。
}
}