using System; using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; using Newtonsoft.Json; [Serializable] public class MapData { public enum EnvironmentType { [LabelText("平原")] Plain = 0, [LabelText("山地")] Mountain, [LabelText("草原")] Grassland, [LabelText("林地")] Forest, [LabelText("雪地")] Snow, [LabelText("泥地")] MuddyLand, [LabelText("戈壁")] Gobi, [LabelText("沙漠")] Desert, [LabelText("高原")] Plateau } [Serializable] public class Region { public List positions = new List(16); } [ReadOnly] public int id; public string name; [MinValue(1)] public int width; [MinValue(1)] public int height; public EnvironmentType environmentType; public List BlocksData = null; [JsonProperty] private Dictionary _regions = new Dictionary(8); [HideInInspector] public Vector2Int initialCameraPosition; public MapData(int id, string name, int width, int height, EnvironmentType envType = EnvironmentType.Plain) { this.id = id; this.name = name; this.width = width; this.height = height; environmentType = envType; ResetBlocks(); } public void ResetBlocks() { var count = width * height; BlocksData = new List(count); for (var i = 0; i < count; i++) { BlocksData.Add(new MapBlockData()); } } public void SetBlockData(Vector2Int position, MapBlockData blockData) { if (CheckPosition(position)) { BlocksData[position.x * width + position.y] = blockData; } } public MapBlockData GetBlockData(Vector2Int position) { return CheckPosition(position) ? BlocksData[Position2BlockIndex(position)] : null; } public bool CheckPosition(Vector2Int position) { return position.x >= 0 && position.y >= 0; } public int Position2BlockIndex(Vector2Int position) { return position.x * width + position.y; } public Vector2Int BlockIndex2Position(int blockIndex) { return new Vector2Int(blockIndex / width, blockIndex % width); } public void SetBlockTerrainType(int blockIndex, int terrainTypeIndex) { if (blockIndex >= 0 && blockIndex < BlocksData.Count) { BlocksData[blockIndex].TerrainTypeIndex = terrainTypeIndex; } } public void AddRegion(Region area, int newRegionId = -1) { if (!CheckRegion(area)) { DebugUtil.LogError("{0} AddPreparingArea failed, area:{1} is invalid!", GetType().Name, area); } var regionId = GenerateRegionId(); if (_regions.ContainsKey(newRegionId) && newRegionId >= 0) { _regions[newRegionId] = area; } else { _regions.Add(regionId, area); } } public Region GetRegion(int regionId) { if (_regions.TryGetValue(regionId, out var region)) { return region; } else { DebugUtil.LogError("{0} GetPreparingArea failed, id:{1} not exists!", GetType().Name, regionId); return null; } } public Dictionary GetAllRegions() { return _regions; } public void RemoveRegion(int regionId) { if (_regions.ContainsKey(regionId)) { _regions.Remove(regionId); } else { DebugUtil.LogError("{0} RemovePreparingArea failed, id:{1} not exists!",GetType().Name, regionId); } } public void RemoveAllRegion() { _regions.Clear(); } private int GenerateRegionId() { var max = _regions.Count; for (var i = 0; i < max; i++) { if (!_regions.ContainsKey(i)) { return i; } } return max; } private bool CheckRegion(Region area) { for (var i = 0; i < area.positions.Count; i++) { if (!CheckPosition(area.positions[i])) { return false; } } return true; } }