using LitJson; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; [System.Serializable] public class Tile { public int x; public int y; public MapTile.Type type; public string obstacle = string.Empty; public int angle; static public Tile Create(Vector2 idx, MapTile.Type type, string obstacle, int angle) { Tile data = new Tile(); data.x = (int)idx.x; data.y = (int)idx.y; data.type = type; data.obstacle = obstacle; data.angle = angle; return data; } static public string JsonCreate(List tiles) { return JsonMapper.ToJson(tiles); } static public List JsonLoad(string json) { return JsonMapper.ToObject>(json); } } [System.Serializable] public class TileData { public List typeApply; public List typeDoors; public List tileDatas; } [System.Serializable] public class FloorData { public float rateMax = 0.3f; [Space(10)] public GameObject blkNameEmpty; [Space(10)] public int cntDefault; public int cntMonster; public List blkNameDefault = new List(); public List mobAppear = new List(); public AppearList MonsterAppearGet() { return DataManager.Instance.dataMonsterAppear.AppearListGet(mobAppear[Random.Range(0, mobAppear.Count)]); } /// /// 생성 되어야 할 블럭의 타입 리스트를 넘깁니다. /// 빈블럭 (cntDefault - cntMonster - 1)개, 몬스터블럭 (cntMonster)개, 보스블럭 1개 /// /// public List DefaultTypeGet() { List types = new List(); types.AddRange(Enumerable.Repeat(MapBlock.Type.None, cntDefault - cntMonster).ToList()); types.AddRange(Enumerable.Repeat(MapBlock.Type.Monster, cntMonster).ToList()); types = Util.ListShuffle.Shuffle(types); //types.Add(MapBlock.Type.Boss); return types; } //public int cntWave; [Space(10)] public int cntWaveMin; public int cntWaveMax; public int WaveCountGet() { return Random.Range(cntWaveMin, cntWaveMax); } public List blkNameWave = new List(); public List waveAppear = new List(); public void WaveAppearGet(List waveAppsers) { waveAppsers.Clear(); for (int i = 0; i < waveAppear.Count; i++) waveAppsers.Add(DataManager.Instance.dataMonsterAppear.AppearListGet(waveAppear[i])); } [Space(10)] public int cntBoss; public List blkNameBoss = new List(); public string bossAppear; public AppearList BossAppearGet() { return DataManager.Instance.dataMonsterAppear.AppearListGet(bossAppear); } public List bossInferior = new List(); public AppearList BossInferiorGet() { return DataManager.Instance.dataMonsterAppear.AppearListGet(bossInferior[Random.Range(0, bossInferior.Count)]); } //public int cntBossMini; [Space(10)] public int cntMiniMin; public int cntMiniMax; public int MiniCountGet() { return Random.Range(cntMiniMin, cntMiniMax); } public List blkNameBossMini = new List(); public string miniAppear; public AppearList MiniAppearGet() { return DataManager.Instance.dataMonsterAppear.AppearListGet(miniAppear); } public List miniInferior = new List(); public AppearList MiniInferiorGet() { return DataManager.Instance.dataMonsterAppear.AppearListGet(miniInferior[Random.Range(0, miniInferior.Count)]); } [Space(10)] public int cntShopMin; public int cntShopMax; public int ShopCountGet() { return Random.Range(cntShopMin, cntShopMax); } public List blkNameShop = new List(); public int productCnt = 3; public int productTierMin = 0; public int productTierMax = 999; [Space(10)] public int cntHidden; public List blkNameHidden = new List(); public FloorData() { } public FloorData(string[] spl) { int i = 1; cntDefault = int.Parse(spl[i++]); cntMonster = int.Parse(spl[i++]); string[] value = spl[i++].Split('|'); for (int j = 0; j < value.Length; j++) mobAppear.Add(value[j]); cntWaveMin = int.Parse(spl[i++]); cntWaveMax = int.Parse(spl[i++]); value = spl[i++].Split('|'); for (int j = 0; j < value.Length; j++) waveAppear.Add(value[j]); cntBoss = int.Parse(spl[i++]); bossAppear = spl[i++]; value = spl[i++].Split('|'); for (int j = 0; j < value.Length; j++) bossInferior.Add(value[j]); cntMiniMin = int.Parse(spl[i++]); cntMiniMax = int.Parse(spl[i++]); miniAppear = spl[i++]; value = spl[i++].Split('|'); for (int j = 0; j < value.Length; j++) miniInferior.Add(value[j]); cntShopMin = int.Parse(spl[i++]); cntShopMax = int.Parse(spl[i++]); value = spl[i++].Split(':'); string[] value2 = value[0].Split('~'); productCnt = int.Parse(value[1]); productTierMin = int.Parse(value2[0]); productTierMax = int.Parse(value2[1]); cntHidden = int.Parse(spl[i++]); } /// /// 생성 되어야 할 특수블럭의 타입 리스트를 넘깁니다. /// /// /// public List SpecialTypeGet() { List types = new List(); types.AddRange(Enumerable.Repeat(MapBlock.Type.Hidden, cntHidden).ToList()); types.AddRange(Enumerable.Repeat(MapBlock.Type.Mini, MiniCountGet()).ToList()); types.AddRange(Enumerable.Repeat(MapBlock.Type.Shop, ShopCountGet()).ToList()); types.AddRange(Enumerable.Repeat(MapBlock.Type.Wave, WaveCountGet()).ToList()); types = Util.ListShuffle.Shuffle(types); return types; } /// /// 생성 되는 블럭의 프리팹을 넘깁니다. /// blkName{?} 리스트에 이름 목록 중 1개의 프리팹, 없을 경우는 어쩔? /// /// /// public GameObject PrefabGet(MapBlock.Type type) { return blkNameEmpty; List names = null; switch (type) { case MapBlock.Type.Empty: return blkNameEmpty; case MapBlock.Type.None: case MapBlock.Type.Monster: names = blkNameDefault; break; case MapBlock.Type.Boss: names = blkNameBoss; break; case MapBlock.Type.Hidden: names = blkNameHidden; break; case MapBlock.Type.Mini: names = blkNameBossMini; break; case MapBlock.Type.Shop: names = blkNameShop; break; case MapBlock.Type.Wave: names = blkNameWave; break; } return names[Random.Range(0, names.Count)]; } public void LoadAll(string thema) { blkNameDefault.Clear(); blkNameBoss.Clear(); blkNameBossMini.Clear(); blkNameHidden.Clear(); blkNameShop.Clear(); blkNameWave.Clear(); GameObject[] all = Resources.LoadAll($"Prefab/Map/{thema}"); for (int i = 0; i < all.Length; i++) { string[] spl = all[i].name.Split(' '); try { MapBlock.Type type = Util.EnumUtil.Parse(spl[1]); switch (type) { case MapBlock.Type.Empty: blkNameEmpty = all[i]; break; case MapBlock.Type.Monster: blkNameDefault.Add(all[i]); break; case MapBlock.Type.Boss: blkNameBoss.Add(all[i]); break; case MapBlock.Type.Mini: blkNameBossMini.Add(all[i]); break; case MapBlock.Type.Hidden: blkNameHidden.Add(all[i]); break; case MapBlock.Type.Shop: blkNameShop.Add(all[i]); break; case MapBlock.Type.Wave: blkNameWave.Add(all[i]); break; } } catch { Debug.LogError($"Dungeon Undefined Type -> {all[i].name}"); } } } } [System.Serializable] public class DataDungeon : IData { public string dungeon; public List floors = new List(); public List tiles = new List(); public override void TableLoad() { floors.Clear(); Debug.LogWarning($"{path} Floor"); string[] strLine = FileLoadWithLineSplit($"{path} Floor"); string[] spl; for (int i = 1; i < strLine.Length; i++) { if (1 < strLine[i].Length) { spl = strLine[i].Split(','); floors.Add(new FloorData(spl)); } } tiles.Clear(); strLine = FileLoadWithLineSplit($"{path} Tile"); for (int i = 0; i < strLine.Length; i++) { if (1 < strLine[i].Length) { TileData data = JsonMapper.ToObject(strLine[i]); tiles.Add(data); } } } public override void LoadedCheck() { ; } public DataDungeon Load(string dungeon) { this.dungeon = dungeon; path = $"Prefab/Map/{dungeon}/{dungeon}"; TableLoad(); return this; } public List TileGet(MapBlock.Type type, List doors) { List datas = tiles.FindAll((a) => { if (!a.typeApply[(int)type]) return false; for (int i = 0; i < a.typeDoors.Count; i++) { if (!a.typeDoors[i] && doors[i] != null) return false; } return true; }); return datas; } }