NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Area/Around/AroundHelper.cs

154 lines
4.9 KiB
C#

using System.Collections.Generic;
using Gameplay.Level;
using UnityEngine;
namespace Gameplay.Area.Around
{
public static class AroundHelper
{
public static bool useMath = true;
private static Map _map;
public static void Init()
{
_map = LevelManager.Instance.CurrentLevel.Map;
}
public static void GetAround(int centerIndex,
int stepCount,
List<int> result)
{
if (useMath)
{
GetAroundMath(centerIndex, stepCount, result);
}
else
{
GetAroundLogic(centerIndex, stepCount, result);
}
}
public static Vector3Int GetMathPosV3FromTable(int cellIndex)
{
var cellList = _map.TerrainGridSystem.cells;
var cell = cellList[cellIndex];
return cell.mathPointV3;
}
public static void GetAroundMath(int centerIndex,
int stepCount,
List<int> result)
{
var centerPos = GetMathPosV3FromTable(centerIndex);
var minX = centerPos.x - stepCount;
var maxX = centerPos.x + stepCount;
var minY = centerPos.y - stepCount;
var maxY = centerPos.y + stepCount;
var minZ = centerPos.z - stepCount;
var maxZ = centerPos.z + stepCount;
var blockDataList = _map.MapData.BlocksData;
for (var x = minX; x <= maxX; ++x)
{
for (var y = minY; y <= maxY; ++y)
{
var z = -x - y;
if (z < minZ || z > maxZ)
{
continue;
}
var pos = new Vector3Int(x, y, z);
var index = GetCellIndexV3(pos);
if (index == centerIndex) continue;
if (index < 0 || index >= blockDataList.Count)
{
continue;
}
result.Add(index);
}
}
}
public static int GetCellIndexV3(Vector3Int pos)
{
var col = pos.x;
var row = pos.z + (pos.x - (pos.x & 1)) / 2;
// DebugUtil.Log("GetCellIndexV3 col:" + col + " row:" + row);
if (col < 0 || col >= _map.MapData.Height)
{
return -1;
}
if (row < 0 || row >= _map.MapData.Width)
{
return -1;
}
return _map.BlockPosition2TGSCellIndex(new Vector2Int(col, row));
}
public static Vector3Int GetMathPosV3(int cellIndex)
{
var gridPosV2 = _map.TGSCellIndex2BlockPosition(cellIndex);
var col = gridPosV2.x;
var row = gridPosV2.y;
var nX = col;
var nZ = row - (col - (col & 1)) / 2;
var nY = -nX - nZ;
return new Vector3Int(nX, nY, nZ);
}
private static List<TGS.Cell> _cacheCellList = new List<TGS.Cell>();
private static List<TGS.Cell> _workCellList = new List<TGS.Cell>();
private static List<TGS.Cell> _cacheWorkList = new List<TGS.Cell>();
public static void GetAroundLogic(int centerIndex, int stepCount, List<int> result)
{
var workStep = 0;
_cacheCellList.Clear();
var mapTgs = _map.TerrainGridSystem;
var allCell = mapTgs.cells;
for (int i = 0; i < allCell.Count; i++)
{
var iCell = allCell[i];
iCell.isVisited = false;
}
_workCellList.Clear();
var centerCell = allCell[centerIndex];
_workCellList.Add(centerCell);
centerCell.isVisited = true;
while (true)
{
_cacheWorkList.Clear();
for (var i = 0; i < _workCellList.Count; ++i)
{
var workCell = _workCellList[i];
var neighbors = workCell.neighbours;
for (int j = 0; j < neighbors.Count; j++)
{
var iCell = neighbors[j];
if (iCell.isVisited)
{
continue;
}
result.Add(iCell.index);
_cacheWorkList.Add(iCell);
iCell.isVisited = true;
}
}
workStep++;
if (workStep >= stepCount)
{
break;
}
_workCellList.Clear();
_workCellList.AddRange(_cacheWorkList);
}
}
}
}