using Newtonsoft.Json; using System.Collections.Generic; public class RandomPatternConfigTableData : TableDataBase { public int n_RandomPatternID; public string s_RandomPatternID; public int n_PatternRate; public int n_NothingRate; public int n_MonsterRate; public int n_MonsterLimitCount; public int n_BuffDebuffRate; public int n_BuffDebuffLimitCount; public int n_MerchantRate; public int n_MerchantLimitCount; public int n_TreasureRate; public int n_TreasureLimitCount; public int n_NPCRate; public int n_NPCLimitCount; public int n_MineRate; public int f_MineLimitCount; public int f_TwoWayRate; public int f_TwoWayLimitCount; public List list_Weight = new List(); public List list_MaxCount = new List(); public eStageNodeType Get_RandomNode(Dictionary makecount) { // 후보 리스트 List<(eStageNodeType type, int rate)> candidates = new List<(eStageNodeType type, int rate)>(); // 유틸 함수: Limit 체크 후 후보 추가 void AddCandidate(int rate, int limit, eStageNodeType type) { if (rate <= 0) return; // 가중치 0이면 제외 if (makecount.TryGetValue(type, out int made) && made >= limit) return; // 한도 초과 → 제외 candidates.Add((type, rate)); } // 후보 추가 AddCandidate(n_NothingRate, int.MaxValue, eStageNodeType.Nothing); AddCandidate(n_MonsterRate, n_MonsterLimitCount, eStageNodeType.Mob); AddCandidate(n_BuffDebuffRate, n_BuffDebuffLimitCount, eStageNodeType.BuffDebuff); AddCandidate(n_MerchantRate, n_MerchantLimitCount, eStageNodeType.Merchant); AddCandidate(n_TreasureRate, n_TreasureLimitCount, eStageNodeType.Treasure); AddCandidate(n_NPCRate, n_NPCLimitCount, eStageNodeType.NPC); AddCandidate(n_MineRate, f_MineLimitCount, eStageNodeType.Sanctuary); AddCandidate(f_TwoWayRate, f_TwoWayLimitCount, eStageNodeType.TwoWay); // 후보 없으면 Nothing if (candidates.Count == 0) return eStageNodeType.Nothing; // 가중치 총합 int total = 0; foreach (var c in candidates) total += c.rate; if (total <= 0) return eStageNodeType.Nothing; // 랜덤 선택 int rand = UnityEngine.Random.Range(0, total); int cumulative = 0; foreach (var c in candidates) { cumulative += c.rate; if (rand < cumulative) return c.type; } return eStageNodeType.Nothing; } } public class table_RandomPatternConfig : table_base { public static table_RandomPatternConfig Ins; List tableDatas; protected override void Awake() { Ins = this; base.Awake(); } protected override void Start() { tableDatas = JsonConvert.DeserializeObject>(json_last); for (int i = 0; i < tableDatas.Count; i++) { tableDatas[i].list_Weight.Add(tableDatas[i].n_NothingRate); tableDatas[i].list_Weight.Add(tableDatas[i].n_MonsterRate); tableDatas[i].list_Weight.Add(tableDatas[i].n_BuffDebuffRate); tableDatas[i].list_Weight.Add(tableDatas[i].n_MerchantRate); tableDatas[i].list_Weight.Add(tableDatas[i].n_TreasureRate); tableDatas[i].list_Weight.Add(tableDatas[i].n_NPCRate); tableDatas[i].list_Weight.Add(tableDatas[i].n_MineRate); tableDatas[i].list_Weight.Add(tableDatas[i].f_TwoWayRate); tableDatas[i].list_MaxCount.Add(999); tableDatas[i].list_MaxCount.Add(tableDatas[i].n_MonsterLimitCount); tableDatas[i].list_MaxCount.Add(tableDatas[i].n_BuffDebuffLimitCount); tableDatas[i].list_MaxCount.Add(tableDatas[i].n_MerchantLimitCount); tableDatas[i].list_MaxCount.Add(tableDatas[i].n_TreasureLimitCount); tableDatas[i].list_MaxCount.Add(tableDatas[i].n_NPCLimitCount); tableDatas[i].list_MaxCount.Add(tableDatas[i].f_MineLimitCount); tableDatas[i].list_MaxCount.Add(tableDatas[i].f_TwoWayLimitCount); } base.Start(); } public List Get_DataList() { return tableDatas; } public RandomPatternConfigTableData Get_Data(int id) { return tableDatas.Find(f=>f.n_RandomPatternID == id); } public RandomPatternConfigTableData Get_RandomData() { return DSUtil.WeightedPick(tableDatas, x => x.n_PatternRate); } }