119 lines
4.6 KiB
C#
119 lines
4.6 KiB
C#
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<int> list_Weight = new List<int>();
|
|
public List<int> list_MaxCount = new List<int>();
|
|
|
|
public eStageNodeType Get_RandomNode(Dictionary<eStageNodeType, int> 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<RandomPatternConfigTableData> tableDatas;
|
|
|
|
protected override void Awake()
|
|
{
|
|
Ins = this;
|
|
base.Awake();
|
|
}
|
|
|
|
protected override void Start()
|
|
{
|
|
tableDatas = JsonConvert.DeserializeObject<List<RandomPatternConfigTableData>>(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<RandomPatternConfigTableData> 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); }
|
|
} |