using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using Microsoft.CodeAnalysis;
using On.RoR2;
using On.RoR2.UI;
using R2API;
using ReturnsArtifacts.Scripts.Artifacts;
using RiskOfOptions;
using RiskOfOptions.OptionConfigs;
using RiskOfOptions.Options;
using RoR2;
using RoR2.Artifacts;
using RoR2.Skills;
using RoR2.UI;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.Networking;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.0", FrameworkDisplayName = ".NET Standard 2.0")]
[assembly: AssemblyCompany("ReturnsArtifacts")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("My first plugin")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ReturnsArtifacts")]
[assembly: AssemblyTitle("ReturnsArtifacts")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace ReturnsArtifacts
{
public static class PluginInfo
{
public const string PLUGIN_GUID = "ReturnsArtifacts";
public const string PLUGIN_NAME = "ReturnsArtifacts";
public const string PLUGIN_VERSION = "1.0.0";
}
}
namespace ReturnsArtifacts.Scripts
{
internal static class ExtensionMethods
{
public static IEnumerable<Type> GetTypesOfType<T>(this Assembly assembly)
{
return from type in assembly.GetTypes()
where !type.IsAbstract && type.IsSubclassOf(typeof(T))
select type;
}
public static bool IsMountainShrine(this SpawnCard spawnCard)
{
return ((Object)spawnCard).name.ToLower().Contains(InteractableNames.ShrineOftheMountain);
}
public static T[] Shuffled<T>(this T[] collection)
{
for (int i = 0; i < collection.Length - 1; i++)
{
int num = Random.Range(i, collection.Length);
int num2 = num;
int num3 = i;
T val = collection[i];
T val2 = collection[num];
collection[num2] = val;
collection[num3] = val2;
}
return collection;
}
public static bool IndexOfInventory(this List<TemporaryInventory> inventories, Inventory inventory, out int index)
{
index = inventories.FindIndex((TemporaryInventory x) => (Object)(object)x.inventory == (Object)(object)inventory);
return index != -1;
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("ReturnsArtifacts", "Returns Artifacts", "1.0.0")]
public class Plugin : BaseUnityPlugin
{
private static float? previousGameTime;
public static AssetBundle Assets { get; private set; }
public static ManualLogSource Log { get; private set; }
public static ConfigFile ConfigFile { get; private set; }
public static event Action<float> onGameTimeChanged;
private void Awake()
{
Log = ((BaseUnityPlugin)this).Logger;
ConfigFile = ((BaseUnityPlugin)this).Config;
Assembly executingAssembly = Assembly.GetExecutingAssembly();
using (Stream stream = executingAssembly.GetManifestResourceStream("ReturnsArtifacts.Resources.returnsartifactsbundle"))
{
Assets = AssetBundle.LoadFromStream(stream);
}
foreach (Type item in executingAssembly.GetTypesOfType<ArtifactBase>())
{
ArtifactBase artifactBase = (ArtifactBase)Activator.CreateInstance(item);
artifactBase.Init();
}
if (Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"))
{
AddConfigOptions();
}
((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin ReturnsArtifacts is loaded!");
}
private void FixedUpdate()
{
if ((Object)(object)Run.instance != (Object)null)
{
float runStopwatch = Run.instance.GetRunStopwatch();
if (runStopwatch != previousGameTime)
{
Plugin.onGameTimeChanged?.Invoke(runStopwatch);
previousGameTime = runStopwatch;
}
}
}
private void AddConfigOptions()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Expected O, but got Unknown
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Expected O, but got Unknown
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Expected O, but got Unknown
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Expected O, but got Unknown
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Expected O, but got Unknown
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Expected O, but got Unknown
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Expected O, but got Unknown
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Expected O, but got Unknown
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Expected O, but got Unknown
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Expected O, but got Unknown
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Expected O, but got Unknown
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Expected O, but got Unknown
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_0114: Expected O, but got Unknown
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Expected O, but got Unknown
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0124: Unknown result type (might be due to invalid IL or missing references)
//IL_012b: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Expected O, but got Unknown
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Expected O, but got Unknown
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Expected O, but got Unknown
//IL_0155: Unknown result type (might be due to invalid IL or missing references)
//IL_015f: Expected O, but got Unknown
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(ArtifactOfCognation.cloneLifespan, new IntSliderConfig
{
min = 5,
max = 60
}));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(ArtifactOfDistortion.cycleDuration, new IntSliderConfig
{
min = 20,
max = 300
}));
ModSettingsManager.AddOption((BaseOption)new SliderOption(ArtifactOfDistortion.cooldownReduction, new SliderConfig
{
min = 0f,
max = 100f
}));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(ArtifactOfDistortion.skillsToLock, new IntSliderConfig
{
min = 1,
max = 3
}));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(ArtifactOfPrestige.numMountainShrinesToSpawn, new IntSliderConfig
{
min = 0,
max = 5
}));
ModSettingsManager.AddOption((BaseOption)new ColorOption(ArtifactOfPrestige.shrineSymbolColor));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(ArtifactOfTempus.itemLifespan, new IntSliderConfig
{
min = 30,
max = 600
}));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(ArtifactOfTempus.baseNumStacks, new IntSliderConfig
{
min = 1,
max = 10
}));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(ArtifactOfTempus.bonusNumStacks, new IntSliderConfig
{
min = 0,
max = 5
}));
ModSettingsManager.AddOption((BaseOption)new IntSliderOption(ArtifactOfTempus.stagesPerBonusStacks, new IntSliderConfig
{
min = 1,
max = 5
}));
}
public static void LogDebug(object data)
{
Log.LogDebug(data);
}
public static void LogError(object data)
{
Log.LogError(data);
}
}
internal class TemporaryInventory
{
private readonly Dictionary<ItemIndex, float> itemsRemainingTime = new Dictionary<ItemIndex, float>();
private readonly Dictionary<ItemIndex, Image> temporaryItemIndicators = new Dictionary<ItemIndex, Image>();
public Inventory inventory { get; private set; }
public TemporaryInventory(Inventory inventory)
{
this.inventory = inventory;
Plugin.onGameTimeChanged += OnGameTimeChanged;
}
private void OnGameTimeChanged(float time)
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
ItemIndex[] array = itemsRemainingTime.Keys.ToArray();
foreach (ItemIndex val in array)
{
float num = itemsRemainingTime[val] - Time.fixedDeltaTime;
if (num > 0f)
{
SetItemTime(val, num);
continue;
}
inventory.RemoveItem(val, 1);
if (inventory.GetItemCount(val) > 0)
{
SetItemTime(val, ArtifactOfTempus.itemLifespan.Value);
continue;
}
itemsRemainingTime.Remove(val);
temporaryItemIndicators.Remove(val);
}
}
private void SetItemTime(ItemIndex itemIndex, float newRemainingTime)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
itemsRemainingTime[itemIndex] = newRemainingTime;
temporaryItemIndicators.TryGetValue(itemIndex, out var value);
if ((Object)(object)value != (Object)null)
{
value.fillAmount = newRemainingTime / (float)ArtifactOfTempus.itemLifespan.Value;
}
}
public void AddItem(ItemIndex itemIndex)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
if (!itemsRemainingTime.ContainsKey(itemIndex))
{
itemsRemainingTime.Add(itemIndex, ArtifactOfTempus.itemLifespan.Value);
}
}
public void AddTemporaryItemIndicator(ItemIndex itemIndex, Image temporaryItemIndicator)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
if (!temporaryItemIndicators.ContainsKey(itemIndex))
{
temporaryItemIndicators.Add(itemIndex, temporaryItemIndicator);
}
}
public void ResetIndicators()
{
temporaryItemIndicators.Clear();
}
}
internal class UnavailableSkill : SkillDef
{
public string tokenName => "DISTORTION_UNAVAILABLE";
public override bool CanExecute(GenericSkill skillSlot)
{
return false;
}
public override bool IsReady(GenericSkill skillSlot)
{
return false;
}
}
}
namespace ReturnsArtifacts.Scripts.Artifacts
{
public abstract class ArtifactBase
{
public ArtifactDef ArtifactDef;
public abstract string ArtifactName { get; }
public abstract string ArtifactLangTokenName { get; }
public abstract string ArtifactDescription { get; }
public abstract Sprite ArtifactEnabledIcon { get; }
public abstract Sprite ArtifactDisabledIcon { get; }
public bool ArtifactEnabled => RunArtifactManager.instance.IsArtifactEnabled(ArtifactDef);
public virtual void Init(ConfigFile config)
{
Init();
}
public abstract void Init();
protected void CreateLang()
{
LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_NAME", ArtifactName);
LanguageAPI.Add("ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION", ArtifactDescription);
}
protected void CreateArtifact()
{
ArtifactDef = ScriptableObject.CreateInstance<ArtifactDef>();
ArtifactDef.cachedName = "ARTIFACT_" + ArtifactLangTokenName;
ArtifactDef.nameToken = "ARTIFACT_" + ArtifactLangTokenName + "_NAME";
ArtifactDef.descriptionToken = "ARTIFACT_" + ArtifactLangTokenName + "_DESCRIPTION";
ArtifactDef.smallIconSelectedSprite = ArtifactEnabledIcon;
ArtifactDef.smallIconDeselectedSprite = ArtifactDisabledIcon;
ContentAddition.AddArtifactDef(ArtifactDef);
}
public abstract void Hooks();
}
internal class ArtifactOfCognation : ArtifactBase
{
public static readonly ConfigEntry<int> cloneLifespan = Plugin.ConfigFile.Bind<int>("Cognation", "CloneLifespan", 10, "The lifespan of clones spawned by the Artifact of Cognation");
public override string ArtifactName => "Artifact of Cognation";
public override string ArtifactLangTokenName => "ARTIFACT_OF_COGNATION";
public override string ArtifactDescription => "Enemies create a temporary clone on death.";
public override Sprite ArtifactEnabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfCognationEnabled.png");
public override Sprite ArtifactDisabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfCognationDisabled.png");
public override void Init()
{
CreateLang();
CreateArtifact();
Hooks();
}
public override void Hooks()
{
GlobalEventManager.onCharacterDeathGlobal += SpawnMonsterClone;
}
private void SpawnMonsterClone(DamageReport damageReport)
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Invalid comparison between Unknown and I4
if (NetworkClient.active && base.ArtifactEnabled && damageReport != null && Object.op_Implicit((Object)(object)damageReport.victimBody) && (int)damageReport.victimTeamIndex != 1 && damageReport.victimBody.inventory.GetItemCount(Items.Ghost) == 0)
{
CharacterBody val = Util.TryToCreateGhost(damageReport.victimBody, damageReport.victimBody, cloneLifespan.Value);
val.master.onBodyStart += delegate(CharacterBody charBody)
{
charBody.inventory.RemoveItem(Items.BoostDamage, 150);
};
}
}
}
internal class ArtifactOfDistortion : ArtifactBase
{
public static readonly ConfigEntry<int> cycleDuration = Plugin.ConfigFile.Bind<int>("Distortion", "CycleDuration", 60, "How many seconds it takes to change locked skill(s)");
public static readonly ConfigEntry<float> cooldownReduction = Plugin.ConfigFile.Bind<float>("Distortion", "CooldownReduction", 25f, "Percentage of cooldown reduction to apply to non-locked skills");
public static readonly ConfigEntry<int> skillsToLock = Plugin.ConfigFile.Bind<int>("Distortion", "SkillsToLock", 1, "How many skills to lock each cycle");
private static UnavailableSkill unavailableSkill;
private static int[] skillIndexes = new int[4] { 0, 1, 2, 3 };
public override string ArtifactName => "Artifact of Distortion";
public override string ArtifactLangTokenName => "ARTIFACT_OF_DISTORTION";
public override string ArtifactDescription => "Lock a random skill every minute, but skills have decreased cooldowns.";
public override Sprite ArtifactEnabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfDistortionEnabled.png");
public override Sprite ArtifactDisabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfDistortionDisabled.png");
private static event Action onCyclePassed;
public override void Init()
{
CreateLang();
CreateArtifact();
unavailableSkill = InitSkill();
Plugin.onGameTimeChanged += OnGameTimeChanged;
Hooks();
}
private UnavailableSkill InitSkill()
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
UnavailableSkill unavailableSkill = ScriptableObject.CreateInstance<UnavailableSkill>();
((SkillDef)unavailableSkill).icon = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/UI/texGenericSkillIcons.png").WaitForCompletion();
((SkillDef)unavailableSkill).skillName = "SKILL_" + unavailableSkill.tokenName;
((SkillDef)unavailableSkill).skillNameToken = "SKILL_" + unavailableSkill.tokenName + "_NAME";
((SkillDef)unavailableSkill).skillDescriptionToken = "SKILL_" + unavailableSkill.tokenName + "_DESCRIPTION";
LanguageAPI.Add("SKILL_DISTORTION_UNAVAILABLE_NAME", "Unavailable");
LanguageAPI.Add("SKILL_DISTORTION_UNAVAILABLE_DESCRIPTION", "It's unavailable, at least for now...");
return unavailableSkill;
}
public override void Hooks()
{
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
Run.onRunStartGlobal += delegate
{
if (base.ArtifactEnabled)
{
ArtifactOfDistortion.onCyclePassed = null;
skillIndexes = skillIndexes.Shuffled();
onCyclePassed += delegate
{
skillIndexes = skillIndexes.Shuffled();
};
}
};
CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal;
RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(ReduceCooldown);
}
private void OnGameTimeChanged(float time)
{
if (GetTimeCycle(time) != GetTimeCycle(time - Time.fixedDeltaTime))
{
ArtifactOfDistortion.onCyclePassed?.Invoke();
}
}
private int GetTimeCycle(float time)
{
return (int)(time / (float)cycleDuration.Value);
}
private void ReduceCooldown(CharacterBody sender, StatHookEventArgs args)
{
if (base.ArtifactEnabled)
{
args.cooldownMultAdd -= cooldownReduction.Value / 100f;
}
}
private void CharacterBody_onBodyStartGlobal(CharacterBody body)
{
if (base.ArtifactEnabled && body.isPlayerControlled)
{
SetUnavailableSkill(body);
onCyclePassed += action;
}
void action()
{
if ((Object)(object)body == (Object)null)
{
onCyclePassed -= action;
}
else
{
GenericSkill[] allSkills = body.skillLocator.allSkills;
foreach (GenericSkill val in allSkills)
{
val.UnsetSkillOverride((object)this, (SkillDef)(object)unavailableSkill, (SkillOverridePriority)3);
}
SetUnavailableSkill(body);
}
}
}
private void SetUnavailableSkill(CharacterBody body)
{
for (int i = 0; i < skillsToLock.Value; i++)
{
switch (skillIndexes[i])
{
case 0:
SetSkillOverride(body.skillLocator.primary);
break;
case 1:
SetSkillOverride(body.skillLocator.secondary);
break;
case 2:
SetSkillOverride(body.skillLocator.utility);
break;
case 3:
SetSkillOverride(body.skillLocator.special);
break;
}
}
}
private void SetSkillOverride(GenericSkill skill)
{
skill.SetSkillOverride((object)this, (SkillDef)(object)unavailableSkill, (SkillOverridePriority)3);
}
}
internal class ArtifactOfPrestige : ArtifactBase
{
private InteractableSpawnCard[] mountainShrineSpawnCards = (InteractableSpawnCard[])(object)new InteractableSpawnCard[3]
{
Addressables.LoadAssetAsync<InteractableSpawnCard>((object)"RoR2/Base/ShrineBoss/iscShrineBoss.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<InteractableSpawnCard>((object)"RoR2/Base/ShrineBoss/iscShrineBossSandy.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<InteractableSpawnCard>((object)"RoR2/Base/ShrineBoss/iscShrineBossSnowy.asset").WaitForCompletion()
};
public static readonly ConfigEntry<int> numMountainShrinesToSpawn = Plugin.ConfigFile.Bind<int>("Prestige", "MountainShrinesToSpawn", 1, "Number of Shrines of the Mountain to spawn each stage");
public static readonly ConfigEntry<Color> shrineSymbolColor = Plugin.ConfigFile.Bind<Color>("Prestige", "ShrineSymbolColor", new Color(0.8f, 0.2f, 0.8f), "Color of the Shrine of the Mountain symbol");
private static int shrineStacks;
public override string ArtifactName => "Artifact of Prestige";
public override string ArtifactLangTokenName => "ARTIFACT_OF_PRESTIGE";
public override string ArtifactDescription => "At least one Shrine of the Mountain spawns every stage. Shrine of the Mountain effects are permanent.";
public override Sprite ArtifactEnabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfPrestigeEnabled.png");
public override Sprite ArtifactDisabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfPrestigeDisabled.png");
public override void Init()
{
CreateLang();
CreateArtifact();
Hooks();
}
public override void Hooks()
{
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Expected O, but got Unknown
SceneDirector.onGenerateInteractableCardSelection += SpawnMountainShrine;
SpawnCard.onSpawnedServerGlobal += ConvertSpawnedMountainShrines;
Run.onRunStartGlobal += delegate
{
if (!base.ArtifactEnabled || NetworkServer.active)
{
shrineStacks = 0;
}
};
Stage.onServerStageBegin += delegate
{
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
if (base.ArtifactEnabled && !((Object)(object)TeleporterInteraction.instance == (Object)null))
{
for (int i = 0; i < shrineStacks; i++)
{
TeleporterInteraction.instance.AddShrineStack();
}
((Renderer)((Component)((Component)TeleporterInteraction.instance).transform.Find("TeleporterBaseMesh/BossShrineSymbol")).GetComponent<MeshRenderer>()).material.SetColor("_TintColor", shrineSymbolColor.Value);
}
};
ShrineBossBehavior.AddShrineStack += new hook_AddShrineStack(OnAddShrineStack);
}
private void ConvertSpawnedMountainShrines(SpawnResult result)
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
if (base.ArtifactEnabled && result.success && result.spawnRequest.spawnCard.IsMountainShrine())
{
GameObject spawnedInstance = result.spawnedInstance;
((Renderer)((Component)spawnedInstance.transform.Find("Symbol")).GetComponent<MeshRenderer>()).material.SetColor("_TintColor", shrineSymbolColor.Value);
spawnedInstance.GetComponent<PurchaseInteraction>().setUnavailableOnTeleporterActivated = false;
}
}
private void SpawnMountainShrine(SceneDirector director, DirectorCardCategorySelection selection)
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Expected O, but got Unknown
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Expected O, but got Unknown
if (!base.ArtifactEnabled)
{
return;
}
InteractableSpawnCard mountainShrine = GetMountainShrine();
if ((Object)(object)mountainShrine == (Object)null)
{
return;
}
int num = 0;
while (num < numMountainShrinesToSpawn.Value)
{
GameObject val = DirectorCore.instance.TrySpawnObject(new DirectorSpawnRequest((SpawnCard)(object)mountainShrine, new DirectorPlacementRule
{
placementMode = (PlacementMode)4
}, director.rng));
if ((Object)(object)val != (Object)null)
{
num++;
}
}
}
private void OnAddShrineStack(orig_AddShrineStack orig, ShrineBossBehavior self, Interactor interactor)
{
shrineStacks++;
orig.Invoke(self, interactor);
}
private InteractableSpawnCard GetMountainShrine()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Invalid comparison between Unknown and I4
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Invalid comparison between Unknown and I4
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Invalid comparison between Unknown and I4
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Invalid comparison between Unknown and I4
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Invalid comparison between Unknown and I4
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Invalid comparison between Unknown and I4
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Invalid comparison between Unknown and I4
//IL_0085: Unknown result type (might be due to invalid IL or missing references)
//IL_008b: Invalid comparison between Unknown and I4
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Invalid comparison between Unknown and I4
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Invalid comparison between Unknown and I4
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Invalid comparison between Unknown and I4
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0021: Invalid comparison between Unknown and I4
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Invalid comparison between Unknown and I4
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Invalid comparison between Unknown and I4
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0065: Invalid comparison between Unknown and I4
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Invalid comparison between Unknown and I4
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
//IL_0027: Invalid comparison between Unknown and I4
Stage stageEnumFromSceneDef = DirectorAPI.GetStageEnumFromSceneDef(SceneCatalog.GetSceneDefForCurrentScene());
Stage val = stageEnumFromSceneDef;
Stage val2 = val;
if ((int)val2 <= 64)
{
if ((int)val2 <= 8)
{
if ((int)val2 == 2 || (int)val2 == 4 || (int)val2 == 8)
{
goto IL_0099;
}
}
else
{
if ((int)val2 == 16)
{
return mountainShrineSpawnCards[1];
}
if ((int)val2 == 32)
{
goto IL_00af;
}
if ((int)val2 == 64)
{
goto IL_0099;
}
}
}
else if ((int)val2 <= 16384)
{
if ((int)val2 == 128 || (int)val2 == 256 || (int)val2 == 16384)
{
goto IL_0099;
}
}
else if ((int)val2 <= 262144)
{
if ((int)val2 == 131072 || (int)val2 == 262144)
{
goto IL_0099;
}
}
else
{
if ((int)val2 == 67108864)
{
goto IL_00af;
}
if ((int)val2 == 134217728)
{
goto IL_0099;
}
}
return null;
IL_0099:
return mountainShrineSpawnCards[0];
IL_00af:
return mountainShrineSpawnCards[2];
}
}
internal class ArtifactOfSpirit : ArtifactBase
{
private static float minPercentageChange = 0.05f;
private float healthSegments = 1f / minPercentageChange;
public override string ArtifactName => "Artifact of Spirit";
public override string ArtifactLangTokenName => "ARTIFACT_OF_SPIRIT";
public override string ArtifactDescription => "Characters run faster at lower health, including enemies.";
public override Sprite ArtifactEnabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfSpiritEnabled.png");
public override Sprite ArtifactDisabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfSpiritDisabled.png");
public override void Init()
{
CreateLang();
CreateArtifact();
Hooks();
}
private int getSegment(float health)
{
return (int)(health * healthSegments);
}
public override void Hooks()
{
//IL_0008: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
HealthComponent.Heal += new hook_Heal(OnHeal);
HealthComponent.TakeDamage += new hook_TakeDamage(OnDamage);
RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateSpeed);
}
private void OnDamage(orig_TakeDamage orig, HealthComponent self, DamageInfo damageInfo)
{
float combinedHealthFraction = self.combinedHealthFraction;
orig.Invoke(self, damageInfo);
float combinedHealthFraction2 = self.combinedHealthFraction;
CheckHealthChanged(self, combinedHealthFraction, combinedHealthFraction2);
}
private float OnHeal(orig_Heal orig, HealthComponent self, float amount, ProcChainMask procChainMask, bool nonRegen)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
float combinedHealthFraction = self.combinedHealthFraction;
float result = orig.Invoke(self, amount, procChainMask, nonRegen);
float combinedHealthFraction2 = self.combinedHealthFraction;
CheckHealthChanged(self, combinedHealthFraction, combinedHealthFraction2);
return result;
}
private void CheckHealthChanged(HealthComponent health, float oldHealth, float newHealth)
{
if (NetworkClient.active && base.ArtifactEnabled && getSegment(oldHealth) != getSegment(newHealth))
{
health.body.MarkAllStatsDirty();
}
}
private void RecalculateSpeed(CharacterBody sender, StatHookEventArgs args)
{
if (NetworkClient.active && base.ArtifactEnabled && sender.healthComponent.alive && !(sender.healthComponent.fullCombinedHealth < sender.healthComponent.combinedHealth))
{
float num = (float)getSegment(sender.healthComponent.combinedHealthFraction) / healthSegments;
float num2 = (float)Math.Pow(1f - num, 2.0);
args.moveSpeedMultAdd += num2;
}
}
}
internal class ArtifactOfTempus : ArtifactBase
{
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static hook_UpdateDisplay <>9__20_2;
internal void <Hooks>b__20_2(orig_UpdateDisplay orig, ItemInventoryDisplay self)
{
playerInventory?.ResetIndicators();
orig.Invoke(self);
}
}
public static GameObject temporaryItemUI = Plugin.Assets.LoadAsset<GameObject>("TemporaryItemIndicatorUI.prefab");
private static TemporaryInventory playerInventory;
private static bool giveMoreStacks = true;
public static readonly ConfigEntry<int> itemLifespan = Plugin.ConfigFile.Bind<int>("Tempus", "ItemLifespan", 120, "How many seconds a temporary item lasts");
public static readonly ConfigEntry<int> baseNumStacks = Plugin.ConfigFile.Bind<int>("Tempus", "BaseNumStacks", 3, "Base number of stacks to give to the player\n\nThe formula for the total amount of stacks is as follows:\nBaseNumStacks + BonusNumStacks * (StagesCleared / StagesPerBonusStacks)");
public static readonly ConfigEntry<int> bonusNumStacks = Plugin.ConfigFile.Bind<int>("Tempus", "BonusNumStacks", 1, "Bonus number of stacks to give to the player");
public static readonly ConfigEntry<int> stagesPerBonusStacks = Plugin.ConfigFile.Bind<int>("Tempus", "StagesPerBonusStacks", 1, "Number of cleared stages needed for the bonus stacks");
public override string ArtifactName => "Artifact of Tempus";
public override string ArtifactLangTokenName => "ARTIFACT_OF_TEMPUS";
public override string ArtifactDescription => "Items are worth multiple stacks. All items are temporary.";
public override Sprite ArtifactEnabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfTempusEnabled.png");
public override Sprite ArtifactDisabledIcon => Plugin.Assets.LoadAsset<Sprite>("ArtifactOfTempusDisabled.png");
private static int totalStacks => baseNumStacks.Value + bonusNumStacks.Value * (Run.instance.stageClearCount / stagesPerBonusStacks.Value);
public override void Init()
{
CreateLang();
CreateArtifact();
Hooks();
}
public override void Hooks()
{
//IL_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Expected O, but got Unknown
//IL_0050: Unknown result type (might be due to invalid IL or missing references)
//IL_005a: Expected O, but got Unknown
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_0091: Expected O, but got Unknown
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Expected O, but got Unknown
Inventory.onServerItemGiven += Inventory_onServerItemGiven;
CharacterBody.onBodyStartGlobal += CharacterBody_onBodyStartGlobal;
SceneDirector.onGenerateInteractableCardSelection += delegate(SceneDirector sceneDirector, DirectorCardCategorySelection dccs)
{
if (base.ArtifactEnabled)
{
CommandArtifactManager.OnGenerateInteractableCardSelection(sceneDirector, dccs);
}
};
PurchaseInteraction.CanBeAffordedByInteractor += new hook_CanBeAffordedByInteractor(PurchaseInteraction_CanBeAffordedByInteractor);
ItemIcon.Awake += (hook_Awake)delegate(orig_Awake orig, ItemIcon self)
{
orig.Invoke(self);
if (base.ArtifactEnabled)
{
Object.Instantiate<GameObject>(temporaryItemUI, (Transform)(object)self.rectTransform, false);
}
};
object obj = <>c.<>9__20_2;
if (obj == null)
{
hook_UpdateDisplay val = delegate(orig_UpdateDisplay orig, ItemInventoryDisplay self)
{
playerInventory?.ResetIndicators();
orig.Invoke(self);
};
<>c.<>9__20_2 = val;
obj = (object)val;
}
ItemInventoryDisplay.UpdateDisplay += (hook_UpdateDisplay)obj;
ItemIcon.SetItemIndex += (hook_SetItemIndex)delegate(orig_SetItemIndex orig, ItemIcon self, ItemIndex newItemIndex, int newItemCount)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Invalid comparison between Unknown and I4
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
orig.Invoke(self, newItemIndex, newItemCount);
if (base.ArtifactEnabled)
{
Transform val2 = ((Component)self).transform.Find("TemporaryItemIndicatorUI(Clone)");
if ((int)ItemCatalog.GetItemDef(newItemIndex).tier == 5)
{
((Component)val2).gameObject.SetActive(false);
}
else
{
((Component)val2).gameObject.SetActive(true);
playerInventory.AddTemporaryItemIndicator(newItemIndex, ((Component)val2).GetComponent<Image>());
}
}
};
}
private bool PurchaseInteraction_CanBeAffordedByInteractor(orig_CanBeAffordedByInteractor orig, PurchaseInteraction self, Interactor activator)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Invalid comparison between Unknown and I4
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Invalid comparison between Unknown and I4
if (base.ArtifactEnabled)
{
CostTypeIndex costType = self.costType;
CostTypeIndex val = costType;
if (val - 4 <= 2 || (int)val == 10)
{
return false;
}
}
return orig.Invoke(self, activator);
}
private void CharacterBody_onBodyStartGlobal(CharacterBody body)
{
if (base.ArtifactEnabled && body.isPlayerControlled && (Object)(object)body.inventory != (Object)(object)playerInventory?.inventory)
{
playerInventory = new TemporaryInventory(body.inventory);
}
}
private void Inventory_onServerItemGiven(Inventory inventory, ItemIndex index, int count)
{
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Invalid comparison between Unknown and I4
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
if (!base.ArtifactEnabled || (Object)(object)inventory != (Object)(object)playerInventory?.inventory)
{
return;
}
if (giveMoreStacks)
{
giveMoreStacks = false;
ItemDef itemDef = ItemCatalog.GetItemDef(index);
int num = (totalStacks - 1) * count;
if ((int)itemDef.tier != 5)
{
inventory.GiveItem(index, num);
playerInventory.AddItem(index);
}
}
else
{
giveMoreStacks = true;
}
}
}
}