using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("RandomizerTrinket")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RandomizerTrinket")]
[assembly: AssemblyTitle("RandomizerTrinket")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace RandomizerTrinket;
[BepInPlugin("com.yourname.RandomizerTrinket", "Randomizer Trinket", "1.0.0")]
public class RandomizerTrinketPlugin : BaseUnityPlugin
{
public static ConfigEntry<string> PerkIdsConfig;
public static ConfigEntry<int> MinPerks;
public static ConfigEntry<int> MaxPerks;
public static ConfigEntry<bool> AllowDuplicatePerks;
public static ConfigEntry<string> ReplaceTrinketTitle;
public const string TrinketName = "Randomizer";
public static bool trinketReplaced;
private void Awake()
{
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
PerkIdsConfig = ((BaseUnityPlugin)this).Config.Bind<string>("General", "PerkIds", "perk_adrenalinepumps,perk_armoredplating,perk_backstrengtheners,perk_deeppockets,perk_latissimusoptimization,perk_portablebank,perk_regenerativepads,perk_somaticpainkillers,perk_steadiedstance,perk_tissuerestoratives,perk_velocityaugments,perk_heavystrike,perk_ligamentrestructure,perk_metabolicstasis,perk_pheromoneglands,perk_profitmotive,perk_rabbitdna,perk_systemreorganization,perk_elasticlimbs,perk_autotomousskeleton,perk_anomalousbonds,perk_consumptivereflex,perk_musclerelaxants,perk_pulseorgan,perk_adhesiveperspiration,perk_carnalbloodlust,perk_metacarpalrefinement,perk_motherlyinstinct", "English: List of perk IDs separated by commas. Full list available in README.\nРусский: Список ID перков через запятую. Полный список в README.");
MinPerks = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MinPerks", 1, "English: Minimum number of perks to give.\nРусский: Минимальное количество выдаваемых перков.");
MaxPerks = ((BaseUnityPlugin)this).Config.Bind<int>("General", "MaxPerks", 3, "English: Maximum number of perks to give.\nРусский: Максимальное количество выдаваемых перков.");
AllowDuplicatePerks = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AllowDuplicatePerks", false, "English: Allow duplicate perks (if false, all perks will be unique).\nРусский: Разрешать дубликаты (если false, все перки будут уникальны).");
ReplaceTrinketTitle = ((BaseUnityPlugin)this).Config.Bind<string>("General", "ReplaceTrinketTitle", "Head Lamp", "English: Name of the trinket to replace with Randomizer. Must exactly match the displayed name in-game (case-sensitive). See README for list of available names.\nРусский: Название безделушки, которую заменить на Randomizer. Должно точно совпадать с отображаемым названием в игре (с учётом регистра). Список доступных названий см. в README.");
new Harmony("com.yourname.RandomizerTrinket").PatchAll();
Debug.Log((object)"RandomizerTrinket mod loaded.");
}
public static void ApplyRandomPerks()
{
ENT_Player player = ENT_Player.GetPlayer();
if ((Object)(object)player == (Object)null)
{
Debug.LogWarning((object)"Player not found, cannot apply perks.");
return;
}
string[] array = (from s in PerkIdsConfig.Value.Split(',')
select s.Trim()).ToArray();
if (array.Length == 0)
{
Debug.LogWarning((object)"No perk IDs specified in config.");
return;
}
int num = Random.Range(MinPerks.Value, MaxPerks.Value + 1);
List<string> list = new List<string>();
List<string> list2 = new List<string>(array);
for (int num2 = 0; num2 < num; num2++)
{
if (list2.Count == 0)
{
break;
}
int index = Random.Range(0, list2.Count);
string item = list2[index];
list.Add(item);
if (!AllowDuplicatePerks.Value)
{
list2.RemoveAt(index);
}
}
foreach (string item2 in list)
{
Perk perkAsset = CL_AssetManager.GetPerkAsset(item2, "");
if ((Object)(object)perkAsset != (Object)null)
{
player.AddPerk(perkAsset, 1, true);
Debug.Log((object)("Randomizer added perk: " + item2));
}
else
{
Debug.LogWarning((object)("Perk with ID '" + item2 + "' not found."));
}
}
Debug.Log((object)$"Randomizer applied {list.Count} perks.");
}
}
[HarmonyPatch(typeof(UI_TrinketPicker), "Initialize")]
public static class UI_TrinketPicker_Initialize_Patch
{
private static void Postfix(UI_TrinketPicker __instance)
{
if (RandomizerTrinketPlugin.trinketReplaced)
{
return;
}
try
{
FieldInfo field = typeof(UI_TrinketPicker).GetField("currentGamemode", BindingFlags.Instance | BindingFlags.NonPublic);
if (field == null)
{
return;
}
object? value = field.GetValue(__instance);
M_Gamemode val = (M_Gamemode)((value is M_Gamemode) ? value : null);
if ((Object)(object)val == (Object)null)
{
return;
}
FieldInfo field2 = typeof(M_Gamemode).GetField("availableTrinkets", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (field2 == null)
{
return;
}
object value2 = field2.GetValue(val);
if (value2 == null)
{
return;
}
FieldInfo field3 = value2.GetType().GetField("trinkets", BindingFlags.Instance | BindingFlags.Public);
if (field3 == null || !(field3.GetValue(value2) is List<Trinket> { Count: not 0 } list))
{
return;
}
string value3 = RandomizerTrinketPlugin.ReplaceTrinketTitle.Value;
Trinket val2 = null;
foreach (Trinket item in list)
{
if (!item.isBinding && item.title == value3 && item.title != "Randomizer")
{
val2 = item;
break;
}
}
if ((Object)(object)val2 == (Object)null)
{
Debug.LogWarning((object)("Trinket with title '" + value3 + "' not found or is already Randomizer. No replacement performed."));
return;
}
val2.title = "Randomizer";
val2.description = "Gives random perks at the start!";
val2.flavorText = "What will you get?";
val2.isBinding = false;
val2.cost = 1;
val2.itemsToGrant.Clear();
val2.perksToGrant.Clear();
RandomizerTrinketPlugin.trinketReplaced = true;
Debug.Log((object)("Randomizer trinket successfully replaced '" + value3 + "'."));
}
catch (Exception ex)
{
Debug.LogError((object)("Error replacing trinket: " + ex.Message + "\n" + ex.StackTrace));
}
}
}
[HarmonyPatch(typeof(Trinket), "Activate")]
public static class Trinket_Activate_Patch
{
private static bool Prefix(Trinket __instance)
{
if (__instance.title == "Randomizer")
{
Debug.Log((object)"Activating Randomizer trinket.");
RandomizerTrinketPlugin.ApplyRandomPerks();
return false;
}
return true;
}
}