using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ColdMint.scripts.debug;
using ColdMint.scripts.levelGraphEditor;
using ColdMint.scripts.serialization;
namespace ColdMint.scripts.map.LayoutParsingStrategy;
///
/// Sequential layout diagram parsing strategy
/// 顺序的布局图解析策略
///
///
///Traverse from the start element to the end element according to the ConnectionDataList. This policy considers the first element of the ConnectionDataList to be the fixed starting room information.
///按照ConnectionDataList从起始元素遍历到末项元素。本策略认为ConnectionDataList的首个元素为固定的起始房间信息。
///
/// This policy's Next() method does not return rooms that are not connected except for the start room
/// 本策略Next()方法不会返回除了起始房间外,没有连接的房间
///
public class SequenceLayoutParsingStrategy : ILayoutParsingStrategy
{
private LevelGraphEditorSaveData? _levelGraphEditorSaveData;
//Check whether data Settings are valid
//设置数据时,是否检查合法了
private bool _checkLegality;
//The connection index of the query
//查询的连接索引
private int _index;
private int _maxIndex;
private Dictionary _roomNodeDataDictionary = new Dictionary();
public void SetLevelGraph(LevelGraphEditorSaveData levelGraphEditorSaveData)
{
_checkLegality = false;
_index = -1;
_levelGraphEditorSaveData = levelGraphEditorSaveData;
if (_levelGraphEditorSaveData.RoomNodeDataList == null || _levelGraphEditorSaveData.RoomNodeDataList.Count == 0)
{
//No room data, unable to parse.
//没有房间数据,无法解析。
return;
}
if (_levelGraphEditorSaveData.ConnectionDataList == null ||
_levelGraphEditorSaveData.ConnectionDataList.Count == 0)
{
_maxIndex = 0;
}
else
{
_maxIndex = _levelGraphEditorSaveData.ConnectionDataList.Count;
}
_roomNodeDataDictionary.Clear();
foreach (var roomNodeData in _levelGraphEditorSaveData.RoomNodeDataList)
{
if (roomNodeData.Id == null)
{
continue;
}
_roomNodeDataDictionary.Add(roomNodeData.Id, roomNodeData);
}
_checkLegality = true;
}
public Task GetStartRoomNodeData()
{
if (_levelGraphEditorSaveData == null)
{
return Task.FromResult(null);
}
if (_levelGraphEditorSaveData.RoomNodeDataList == null || _levelGraphEditorSaveData.RoomNodeDataList.Count == 0)
{
//If there is no room data in the level map set.
//如果设置的关卡图内没有房间数据。
return Task.FromResult(null);
}
foreach (var roomNodeData in _levelGraphEditorSaveData.RoomNodeDataList.Where(roomNodeData =>
roomNodeData.HasTag(Config.RoomDataTag.StartingRoom)))
{
return Task.FromResult(roomNodeData);
}
return Task.FromResult(null);
}
public Task Next()
{
var connectionData = GetIndexOfConnectionData(_index);
if (connectionData == null)
{
return Task.FromResult(null);
}
if (connectionData.ToId == null)
{
return Task.FromResult(null);
}
if (_roomNodeDataDictionary.TryGetValue(connectionData.ToId, out var value))
{
return Task.FromResult(value);
}
return Task.FromResult(null);
}
///
/// Gets connection information for the specified location
/// 获取指定位置的连接信息
///
///
///
private ConnectionData? GetIndexOfConnectionData(int index)
{
if (_levelGraphEditorSaveData == null)
{
return null;
}
if (_levelGraphEditorSaveData.ConnectionDataList == null ||
_levelGraphEditorSaveData.ConnectionDataList.Count == 0)
{
return null;
}
return _levelGraphEditorSaveData.ConnectionDataList[index];
}
public Task GetNextParentNodeId()
{
var connectionData = GetIndexOfConnectionData(_index);
if (connectionData == null)
{
return Task.FromResult(null);
}
if (connectionData.FromId == null)
{
return Task.FromResult(null);
}
if (_roomNodeDataDictionary.ContainsKey(connectionData.FromId))
{
return Task.FromResult(connectionData.FromId);
}
return Task.FromResult(null);
}
public Task HasNext()
{
if (!_checkLegality)
{
//If the check is not valid, then simply return false
//如果检查不合法,那么直接返回false
return Task.FromResult(false);
}
_index++;
return Task.FromResult(_index < _maxIndex);
}
}