r2mods/ilspy_dump/ror2_csproj/RoR2/DoppelgangerDropTable.cs

175 lines
3.8 KiB
C#

using System;
using RoR2.Artifacts;
using UnityEngine;
namespace RoR2;
[CreateAssetMenu(menuName = "RoR2/DropTables/DoppelgangerDropTable")]
public class DoppelgangerDropTable : PickupDropTable
{
public ItemTag[] requiredItemTags = Array.Empty<ItemTag>();
public ItemTag[] bannedItemTags = Array.Empty<ItemTag>();
public float tier1Weight = 0.8f;
public float tier2Weight = 0.2f;
public float tier3Weight = 0.01f;
public float bossWeight;
public float lunarItemWeight;
public float voidTier1Weight;
public float voidTier2Weight;
public float voidTier3Weight;
public float voidBossWeight;
private readonly WeightedSelection<PickupIndex> selector = new WeightedSelection<PickupIndex>();
private Inventory doppelgangerInventory;
protected override void OnEnable()
{
base.OnEnable();
DoppelgangerInvasionManager.onDoppelgangerDeath += OnDoppelgangerDeath;
}
protected override void OnDisable()
{
DoppelgangerInvasionManager.onDoppelgangerDeath -= OnDoppelgangerDeath;
base.OnDisable();
}
protected override void Regenerate(Run run)
{
GenerateWeightedSelection();
}
private bool CanSelectItem(ItemDef itemDef)
{
ItemTag[] array = requiredItemTags;
foreach (ItemTag value in array)
{
if (Array.IndexOf(itemDef.tags, value) == -1)
{
return false;
}
}
array = bannedItemTags;
foreach (ItemTag value2 in array)
{
if (Array.IndexOf(itemDef.tags, value2) != -1)
{
return false;
}
}
return itemDef.canRemove;
}
private void GenerateWeightedSelection()
{
selector.Clear();
if (!doppelgangerInventory)
{
return;
}
foreach (ItemIndex item in doppelgangerInventory.itemAcquisitionOrder)
{
ItemDef itemDef = ItemCatalog.GetItemDef(item);
PickupIndex pickupIndex = PickupCatalog.FindPickupIndex(item);
if (!CanSelectItem(itemDef))
{
continue;
}
float num = 0f;
switch (itemDef.tier)
{
case ItemTier.Tier1:
if (Run.instance.availableTier1DropList.Contains(pickupIndex))
{
num = tier1Weight;
}
break;
case ItemTier.Tier2:
if (Run.instance.availableTier2DropList.Contains(pickupIndex))
{
num = tier2Weight;
}
break;
case ItemTier.Tier3:
if (Run.instance.availableTier3DropList.Contains(pickupIndex))
{
num = tier3Weight;
}
break;
case ItemTier.Boss:
if (Run.instance.availableBossDropList.Contains(pickupIndex))
{
num = bossWeight;
}
break;
case ItemTier.Lunar:
if (Run.instance.availableLunarItemDropList.Contains(pickupIndex))
{
num = lunarItemWeight;
}
break;
case ItemTier.VoidTier1:
if (Run.instance.availableVoidTier1DropList.Contains(pickupIndex))
{
num = voidTier1Weight;
}
break;
case ItemTier.VoidTier2:
if (Run.instance.availableVoidTier2DropList.Contains(pickupIndex))
{
num = voidTier2Weight;
}
break;
case ItemTier.VoidTier3:
if (Run.instance.availableVoidTier3DropList.Contains(pickupIndex))
{
num = voidTier3Weight;
}
break;
case ItemTier.VoidBoss:
if (Run.instance.availableVoidTier3DropList.Contains(pickupIndex))
{
num = voidBossWeight;
}
break;
}
if (num > 0f)
{
selector.AddChoice(pickupIndex, num);
}
}
}
protected override PickupIndex GenerateDropPreReplacement(Xoroshiro128Plus rng)
{
return PickupDropTable.GenerateDropFromWeightedSelection(rng, selector);
}
private void OnDoppelgangerDeath(DamageReport damageReport)
{
doppelgangerInventory = damageReport.victimMaster?.inventory;
GenerateWeightedSelection();
}
public override int GetPickupCount()
{
return selector.Count;
}
protected override PickupIndex[] GenerateUniqueDropsPreReplacement(int maxDrops, Xoroshiro128Plus rng)
{
return PickupDropTable.GenerateUniqueDropsFromWeightedSelection(maxDrops, rng, selector);
}
}