OneShotOneKill/Assets/Script/Table/Tables/table_RandomPatternConfig.cs

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); }
}